mirror of
https://github.com/simtactics/SimAINet.git
synced 2025-03-22 11:42:19 +00:00
Ported over more code from FSO
- Renamed VMInstruction.cs to VMThread.cs - Created README.md - Added Github CI
This commit is contained in:
parent
5620d11d95
commit
6c0d63d4bb
25 changed files with 1180 additions and 50 deletions
23
.github/workflows/build.yml
vendored
Normal file
23
.github/workflows/build.yml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
name: build
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
dotnet: [ '3.1.200', '3.1.201' ]
|
||||||
|
build_mode: [ 'Release', 'Debug' ]
|
||||||
|
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Setup .NET Core
|
||||||
|
uses: actions/setup-dotnet@v1
|
||||||
|
with:
|
||||||
|
dotnet-version: ${{ matrix.dotnet }}
|
||||||
|
- name: Build
|
||||||
|
run: dotnet build src -c ${{ matrix.build_mode }}
|
||||||
|
- name: Run tests
|
||||||
|
run: dotnet test src -c ${{ matrix.build_mode }}
|
17
.gitignore
vendored
17
.gitignore
vendored
|
@ -1,15 +1,5 @@
|
||||||
# Created by https://www.gitignore.io/api/linux,macos,windows,dotnetcore,intellij+iml,visualstudio,visualstudiocode
|
# Created by https://www.gitignore.io/api/linux,macos,windows,intellij+iml,visualstudio,visualstudiocode
|
||||||
# Edit at https://www.gitignore.io/?templates=linux,macos,windows,dotnetcore,intellij+iml,visualstudio,visualstudiocode
|
# Edit at https://www.gitignore.io/?templates=linux,macos,windows,intellij+iml,visualstudio,visualstudiocode
|
||||||
|
|
||||||
### DotnetCore ###
|
|
||||||
# .NET Core build folders
|
|
||||||
/bin
|
|
||||||
/obj
|
|
||||||
|
|
||||||
# Common node modules locations
|
|
||||||
/node_modules
|
|
||||||
/wwwroot/node_modules
|
|
||||||
|
|
||||||
|
|
||||||
### Intellij+iml ###
|
### Intellij+iml ###
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
@ -17,6 +7,7 @@
|
||||||
|
|
||||||
# User-specific stuff
|
# User-specific stuff
|
||||||
.idea/**
|
.idea/**
|
||||||
|
**/.idea/**
|
||||||
|
|
||||||
# Gradle and Maven with auto-import
|
# Gradle and Maven with auto-import
|
||||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
@ -498,4 +489,4 @@ healthchecksdb
|
||||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
MigrationBackup/
|
MigrationBackup/
|
||||||
|
|
||||||
# End of https://www.gitignore.io/api/linux,macos,windows,dotnetcore,intellij+iml,visualstudio,visualstudiocode
|
# End of https://www.gitignore.io/api/linux,macos,windows,intellij+iml,visualstudio,visualstudiocode
|
312
LICENSE
Normal file
312
LICENSE
Normal file
|
@ -0,0 +1,312 @@
|
||||||
|
Mozilla Public License Version 2.0
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
|
||||||
|
1.1. "Contributor" means each individual or legal entity that creates, contributes
|
||||||
|
to the creation of, or owns Covered Software.
|
||||||
|
|
||||||
|
1.2. "Contributor Version" means the combination of the Contributions of others
|
||||||
|
(if any) used by a Contributor and that particular Contributor's Contribution.
|
||||||
|
|
||||||
|
1.3. "Contribution" means Covered Software of a particular Contributor.
|
||||||
|
|
||||||
|
1.4. "Covered Software" means Source Code Form to which the initial Contributor
|
||||||
|
has attached the notice in Exhibit A, the Executable Form of such Source Code
|
||||||
|
Form, and Modifications of such Source Code Form, in each case including portions
|
||||||
|
thereof.
|
||||||
|
|
||||||
|
1.5. "Incompatible With Secondary Licenses" means
|
||||||
|
|
||||||
|
(a) that the initial Contributor has attached the notice described in Exhibit
|
||||||
|
B to the Covered Software; or
|
||||||
|
|
||||||
|
(b) that the Covered Software was made available under the terms of version
|
||||||
|
1.1 or earlier of the License, but not also under the terms of a Secondary
|
||||||
|
License.
|
||||||
|
|
||||||
|
1.6. "Executable Form" means any form of the work other than Source Code Form.
|
||||||
|
|
||||||
|
1.7. "Larger Work" means a work that combines Covered Software with other
|
||||||
|
material, in a separate file or files, that is not Covered Software.
|
||||||
|
|
||||||
|
1.8. "License" means this document.
|
||||||
|
|
||||||
|
1.9. "Licensable" means having the right to grant, to the maximum extent possible,
|
||||||
|
whether at the time of the initial grant or subsequently, any and all of the
|
||||||
|
rights conveyed by this License.
|
||||||
|
|
||||||
|
1.10. "Modifications" means any of the following:
|
||||||
|
|
||||||
|
(a) any file in Source Code Form that results from an addition to, deletion
|
||||||
|
from, or modification of the contents of Covered Software; or
|
||||||
|
|
||||||
|
(b) any new file in Source Code Form that contains any Covered Software.
|
||||||
|
|
||||||
|
1.11. "Patent Claims" of a Contributor means any patent claim(s), including
|
||||||
|
without limitation, method, process, and apparatus claims, in any patent Licensable
|
||||||
|
by such Contributor that would be infringed, but for the grant of the License,
|
||||||
|
by the making, using, selling, offering for sale, having made, import, or
|
||||||
|
transfer of either its Contributions or its Contributor Version.
|
||||||
|
|
||||||
|
1.12. "Secondary License" means either the GNU General Public License, Version
|
||||||
|
2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General
|
||||||
|
Public License, Version 3.0, or any later versions of those licenses.
|
||||||
|
|
||||||
|
1.13. "Source Code Form" means the form of the work preferred for making modifications.
|
||||||
|
|
||||||
|
1.14. "You" (or "Your") means an individual or a legal entity exercising rights
|
||||||
|
under this License. For legal entities, "You" includes any entity that controls,
|
||||||
|
is controlled by, or is under common control with You. For purposes of this
|
||||||
|
definition, "control" means (a) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or otherwise,
|
||||||
|
or (b) ownership of more than fifty percent (50%) of the outstanding shares
|
||||||
|
or beneficial ownership of such entity.
|
||||||
|
|
||||||
|
2. License Grants and Conditions
|
||||||
|
|
||||||
|
2.1. Grants
|
||||||
|
|
||||||
|
Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive
|
||||||
|
license:
|
||||||
|
|
||||||
|
(a) under intellectual property rights (other than patent or trademark) Licensable
|
||||||
|
by such Contributor to use, reproduce, make available, modify, display, perform,
|
||||||
|
distribute, and otherwise exploit its Contributions, either on an unmodified
|
||||||
|
basis, with Modifications, or as part of a Larger Work; and
|
||||||
|
|
||||||
|
(b) under Patent Claims of such Contributor to make, use, sell, offer for
|
||||||
|
sale, have made, import, and otherwise transfer either its Contributions or
|
||||||
|
its Contributor Version.
|
||||||
|
|
||||||
|
2.2. Effective Date
|
||||||
|
|
||||||
|
The licenses granted in Section 2.1 with respect to any Contribution become
|
||||||
|
effective for each Contribution on the date the Contributor first distributes
|
||||||
|
such Contribution.
|
||||||
|
|
||||||
|
2.3. Limitations on Grant Scope
|
||||||
|
|
||||||
|
The licenses granted in this Section 2 are the only rights granted under this
|
||||||
|
License. No additional rights or licenses will be implied from the distribution
|
||||||
|
or licensing of Covered Software under this License. Notwithstanding Section
|
||||||
|
2.1(b) above, no patent license is granted by a Contributor:
|
||||||
|
|
||||||
|
(a) for any code that a Contributor has removed from Covered Software; or
|
||||||
|
|
||||||
|
(b) for infringements caused by: (i) Your and any other third party's modifications
|
||||||
|
of Covered Software, or (ii) the combination of its Contributions with other
|
||||||
|
software (except as part of its Contributor Version); or
|
||||||
|
|
||||||
|
(c) under Patent Claims infringed by Covered Software in the absence of its
|
||||||
|
Contributions.
|
||||||
|
|
||||||
|
This License does not grant any rights in the trademarks, service marks, or
|
||||||
|
logos of any Contributor (except as may be necessary to comply with the notice
|
||||||
|
requirements in Section 3.4).
|
||||||
|
|
||||||
|
2.4. Subsequent Licenses
|
||||||
|
|
||||||
|
No Contributor makes additional grants as a result of Your choice to distribute
|
||||||
|
the Covered Software under a subsequent version of this License (see Section
|
||||||
|
10.2) or under the terms of a Secondary License (if permitted under the terms
|
||||||
|
of Section 3.3).
|
||||||
|
|
||||||
|
2.5. Representation
|
||||||
|
|
||||||
|
Each Contributor represents that the Contributor believes its Contributions
|
||||||
|
are its original creation(s) or it has sufficient rights to grant the rights
|
||||||
|
to its Contributions conveyed by this License.
|
||||||
|
|
||||||
|
2.6. Fair Use
|
||||||
|
|
||||||
|
This License is not intended to limit any rights You have under applicable
|
||||||
|
copyright doctrines of fair use, fair dealing, or other equivalents.
|
||||||
|
|
||||||
|
2.7. Conditions
|
||||||
|
|
||||||
|
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
|
||||||
|
Section 2.1.
|
||||||
|
|
||||||
|
3. Responsibilities
|
||||||
|
|
||||||
|
3.1. Distribution of Source Form
|
||||||
|
|
||||||
|
All distribution of Covered Software in Source Code Form, including any Modifications
|
||||||
|
that You create or to which You contribute, must be under the terms of this
|
||||||
|
License. You must inform recipients that the Source Code Form of the Covered
|
||||||
|
Software is governed by the terms of this License, and how they can obtain
|
||||||
|
a copy of this License. You may not attempt to alter or restrict the recipients'
|
||||||
|
rights in the Source Code Form.
|
||||||
|
|
||||||
|
3.2. Distribution of Executable Form
|
||||||
|
|
||||||
|
If You distribute Covered Software in Executable Form then:
|
||||||
|
|
||||||
|
(a) such Covered Software must also be made available in Source Code Form,
|
||||||
|
as described in Section 3.1, and You must inform recipients of the Executable
|
||||||
|
Form how they can obtain a copy of such Source Code Form by reasonable means
|
||||||
|
in a timely manner, at a charge no more than the cost of distribution to the
|
||||||
|
recipient; and
|
||||||
|
|
||||||
|
(b) You may distribute such Executable Form under the terms of this License,
|
||||||
|
or sublicense it under different terms, provided that the license for the
|
||||||
|
Executable Form does not attempt to limit or alter the recipients' rights
|
||||||
|
in the Source Code Form under this License.
|
||||||
|
|
||||||
|
3.3. Distribution of a Larger Work
|
||||||
|
|
||||||
|
You may create and distribute a Larger Work under terms of Your choice, provided
|
||||||
|
that You also comply with the requirements of this License for the Covered
|
||||||
|
Software. If the Larger Work is a combination of Covered Software with a work
|
||||||
|
governed by one or more Secondary Licenses, and the Covered Software is not
|
||||||
|
Incompatible With Secondary Licenses, this License permits You to additionally
|
||||||
|
distribute such Covered Software under the terms of such Secondary License(s),
|
||||||
|
so that the recipient of the Larger Work may, at their option, further distribute
|
||||||
|
the Covered Software under the terms of either this License or such Secondary
|
||||||
|
License(s).
|
||||||
|
|
||||||
|
3.4. Notices
|
||||||
|
|
||||||
|
You may not remove or alter the substance of any license notices (including
|
||||||
|
copyright notices, patent notices, disclaimers of warranty, or limitations
|
||||||
|
of liability) contained within the Source Code Form of the Covered Software,
|
||||||
|
except that You may alter any license notices to the extent required to remedy
|
||||||
|
known factual inaccuracies.
|
||||||
|
|
||||||
|
3.5. Application of Additional Terms
|
||||||
|
|
||||||
|
You may choose to offer, and to charge a fee for, warranty, support, indemnity
|
||||||
|
or liability obligations to one or more recipients of Covered Software. However,
|
||||||
|
You may do so only on Your own behalf, and not on behalf of any Contributor.
|
||||||
|
You must make it absolutely clear that any such warranty, support, indemnity,
|
||||||
|
or liability obligation is offered by You alone, and You hereby agree to indemnify
|
||||||
|
every Contributor for any liability incurred by such Contributor as a result
|
||||||
|
of warranty, support, indemnity or liability terms You offer. You may include
|
||||||
|
additional disclaimers of warranty and limitations of liability specific to
|
||||||
|
any jurisdiction.
|
||||||
|
|
||||||
|
4. Inability to Comply Due to Statute or Regulation
|
||||||
|
|
||||||
|
If it is impossible for You to comply with any of the terms of this License
|
||||||
|
with respect to some or all of the Covered Software due to statute, judicial
|
||||||
|
order, or regulation then You must: (a) comply with the terms of this License
|
||||||
|
to the maximum extent possible; and (b) describe the limitations and the code
|
||||||
|
they affect. Such description must be placed in a text file included with
|
||||||
|
all distributions of the Covered Software under this License. Except to the
|
||||||
|
extent prohibited by statute or regulation, such description must be sufficiently
|
||||||
|
detailed for a recipient of ordinary skill to be able to understand it.
|
||||||
|
|
||||||
|
5. Termination
|
||||||
|
|
||||||
|
5.1. The rights granted under this License will terminate automatically if
|
||||||
|
You fail to comply with any of its terms. However, if You become compliant,
|
||||||
|
then the rights granted under this License from a particular Contributor are
|
||||||
|
reinstated (a) provisionally, unless and until such Contributor explicitly
|
||||||
|
and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor
|
||||||
|
fails to notify You of the non-compliance by some reasonable means prior to
|
||||||
|
60 days after You have come back into compliance. Moreover, Your grants from
|
||||||
|
a particular Contributor are reinstated on an ongoing basis if such Contributor
|
||||||
|
notifies You of the non-compliance by some reasonable means, this is the first
|
||||||
|
time You have received notice of non-compliance with this License from such
|
||||||
|
Contributor, and You become compliant prior to 30 days after Your receipt
|
||||||
|
of the notice.
|
||||||
|
|
||||||
|
5.2. If You initiate litigation against any entity by asserting a patent infringement
|
||||||
|
claim (excluding declaratory judgment actions, counter-claims, and cross-claims)
|
||||||
|
alleging that a Contributor Version directly or indirectly infringes any patent,
|
||||||
|
then the rights granted to You by any and all Contributors for the Covered
|
||||||
|
Software under Section 2.1 of this License shall terminate.
|
||||||
|
|
||||||
|
5.3. In the event of termination under Sections 5.1 or 5.2 above, all end
|
||||||
|
user license agreements (excluding distributors and resellers) which have
|
||||||
|
been validly granted by You or Your distributors under this License prior
|
||||||
|
to termination shall survive termination.
|
||||||
|
|
||||||
|
6. Disclaimer of Warranty
|
||||||
|
|
||||||
|
Covered Software is provided under this License on an "as is" basis, without
|
||||||
|
warranty of any kind, either expressed, implied, or statutory, including,
|
||||||
|
without limitation, warranties that the Covered Software is free of defects,
|
||||||
|
merchantable, fit for a particular purpose or non-infringing. The entire risk
|
||||||
|
as to the quality and performance of the Covered Software is with You. Should
|
||||||
|
any Covered Software prove defective in any respect, You (not any Contributor)
|
||||||
|
assume the cost of any necessary servicing, repair, or correction. This disclaimer
|
||||||
|
of warranty constitutes an essential part of this License. No use of any Covered
|
||||||
|
Software is authorized under this License except under this disclaimer.
|
||||||
|
|
||||||
|
7. Limitation of Liability
|
||||||
|
|
||||||
|
Under no circumstances and under no legal theory, whether tort (including
|
||||||
|
negligence), contract, or otherwise, shall any Contributor, or anyone who
|
||||||
|
distributes Covered Software as permitted above, be liable to You for any
|
||||||
|
direct, indirect, special, incidental, or consequential damages of any character
|
||||||
|
including, without limitation, damages for lost profits, loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all other commercial
|
||||||
|
damages or losses, even if such party shall have been informed of the possibility
|
||||||
|
of such damages. This limitation of liability shall not apply to liability
|
||||||
|
for death or personal injury resulting from such party's negligence to the
|
||||||
|
extent applicable law prohibits such limitation. Some jurisdictions do not
|
||||||
|
allow the exclusion or limitation of incidental or consequential damages,
|
||||||
|
so this exclusion and limitation may not apply to You.
|
||||||
|
|
||||||
|
8. Litigation
|
||||||
|
|
||||||
|
Any litigation relating to this License may be brought only in the courts
|
||||||
|
of a jurisdiction where the defendant maintains its principal place of business
|
||||||
|
and such litigation shall be governed by laws of that jurisdiction, without
|
||||||
|
reference to its conflict-of-law provisions. Nothing in this Section shall
|
||||||
|
prevent a party's ability to bring cross-claims or counter-claims.
|
||||||
|
|
||||||
|
9. Miscellaneous
|
||||||
|
|
||||||
|
This License represents the complete agreement concerning the subject matter
|
||||||
|
hereof. If any provision of this License is held to be unenforceable, such
|
||||||
|
provision shall be reformed only to the extent necessary to make it enforceable.
|
||||||
|
Any law or regulation which provides that the language of a contract shall
|
||||||
|
be construed against the drafter shall not be used to construe this License
|
||||||
|
against a Contributor.
|
||||||
|
|
||||||
|
10. Versions of the License
|
||||||
|
|
||||||
|
10.1. New Versions
|
||||||
|
|
||||||
|
Mozilla Foundation is the license steward. Except as provided in Section 10.3,
|
||||||
|
no one other than the license steward has the right to modify or publish new
|
||||||
|
versions of this License. Each version will be given a distinguishing version
|
||||||
|
number.
|
||||||
|
|
||||||
|
10.2. Effect of New Versions
|
||||||
|
|
||||||
|
You may distribute the Covered Software under the terms of the version of
|
||||||
|
the License under which You originally received the Covered Software, or under
|
||||||
|
the terms of any subsequent version published by the license steward.
|
||||||
|
|
||||||
|
10.3. Modified Versions
|
||||||
|
|
||||||
|
If you create software not governed by this License, and you want to create
|
||||||
|
a new license for such software, you may create and use a modified version
|
||||||
|
of this License if you rename the license and remove any references to the
|
||||||
|
name of the license steward (except to note that such modified license differs
|
||||||
|
from this License).
|
||||||
|
|
||||||
|
10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
|
||||||
|
|
||||||
|
If You choose to distribute Source Code Form that is Incompatible With Secondary
|
||||||
|
Licenses under the terms of this version of the License, the notice described
|
||||||
|
in Exhibit B of this License must be attached. Exhibit A - Source Code Form
|
||||||
|
License Notice
|
||||||
|
|
||||||
|
This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
|
||||||
|
one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
If it is not possible or desirable to put the notice in a particular file,
|
||||||
|
then You may include the notice in a location (such as a LICENSE file in a
|
||||||
|
relevant directory) where a recipient would be likely to look for such a notice.
|
||||||
|
|
||||||
|
You may add additional accurate notices of copyright ownership.
|
||||||
|
|
||||||
|
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||||
|
|
||||||
|
This Source Code Form is "Incompatible With Secondary Licenses", as defined
|
||||||
|
by the Mozilla Public License, v. 2.0.
|
24
README.md
Normal file
24
README.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# SimAntics
|
||||||
|
|
||||||
|
SimAntics is a port of FreeSO's reimplementation to .NET Standard.
|
||||||
|
|
||||||
|
## Build Status
|
||||||
|
|
||||||
|
| Service | Status |
|
||||||
|
| ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| Github | [](https://github.com/simtactics/SimAntics/actions) |
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
- **Anthony Foxclaw** - _Maintainer_ - [tonytins](https://github.com/tonytins)
|
||||||
|
- **Rhys Simpson** - _Original work_ - [riperiperi](https://github.com/riperiperi)
|
||||||
|
|
||||||
|
See also the list of [contributors](https://github.com/simtactics/SimAntics/contributors) who participated in this project.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the MPL 2.0 or later license - see the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
|
This project is not affiliated with or endorsed by Electronic Arts or Maxis.
|
|
@ -8,9 +8,13 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
||||||
<PackageReference Include="xunit" Version="2.4.0" />
|
<PackageReference Include="xunit" Version="2.4.1" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
<PackageReference Include="coverlet.collector" Version="1.2.0" />
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="coverlet.collector" Version="1.2.1"><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace SimAntics.Tests
|
namespace SimAntics.Tests
|
||||||
|
@ -8,6 +9,10 @@ namespace SimAntics.Tests
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Test1()
|
public void Test1()
|
||||||
{
|
{
|
||||||
|
var clock = new VMClock();
|
||||||
|
Console.WriteLine(clock.Ticks);
|
||||||
|
clock.Tick();
|
||||||
|
Console.WriteLine(clock.Ticks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
12
src/SimAntics.Tests/VMTest.cs
Normal file
12
src/SimAntics.Tests/VMTest.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
namespace SimAntics.Tests
|
||||||
|
{
|
||||||
|
public class VMTest
|
||||||
|
{
|
||||||
|
public VMTest()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimAntics", "SimAntics\SimAntics.csproj", "{6B758449-9D5A-456A-A733-31B7841E538A}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimAntics", "SimAntics\SimAntics.csproj", "{6B758449-9D5A-456A-A733-31B7841E538A}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimAntics.Tests", "SimAntics.Tests\SimAntics.Tests.csproj", "{4B7461A4-982A-4D89-92E3-E4D4A3EC85FB}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimAntics.Tests", "SimAntics.Tests\SimAntics.Tests.csproj", "{4B7461A4-982A-4D89-92E3-E4D4A3EC85FB}"
|
||||||
|
@ -19,4 +20,9 @@ Global
|
||||||
{4B7461A4-982A-4D89-92E3-E4D4A3EC85FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4B7461A4-982A-4D89-92E3-E4D4A3EC85FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4B7461A4-982A-4D89-92E3-E4D4A3EC85FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4B7461A4-982A-4D89-92E3-E4D4A3EC85FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(MonoDevelopProperties) = preSolution
|
||||||
|
Policies = $0
|
||||||
|
$0.StandardHeader = $1
|
||||||
|
$1.Text = @This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.\nIf a copy of the MPL was not distributed with this file, You can obtain one at\nhttp://mozilla.org/MPL/2.0/.
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
18
src/SimAntics/Direction.cs
Normal file
18
src/SimAntics/Direction.cs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
namespace SimAntics
|
||||||
|
{
|
||||||
|
public enum Direction
|
||||||
|
{
|
||||||
|
NORTH,
|
||||||
|
NORTHEAST,
|
||||||
|
EAST,
|
||||||
|
SOUTHEAST,
|
||||||
|
SOUTH,
|
||||||
|
SOUTHWEST,
|
||||||
|
WEST,
|
||||||
|
NORTHWEST
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +0,0 @@
|
||||||
namespace SimAntics.Engine
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Compatibility class
|
|
||||||
/// </summary>
|
|
||||||
public class VMThread : VMInstruction { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles instruction sets
|
|
||||||
/// </summary>
|
|
||||||
public class VMInstruction
|
|
||||||
{
|
|
||||||
public static int MAX_USER_ACTIONS = 20;
|
|
||||||
|
|
||||||
public VMContext Context;
|
|
||||||
|
|
||||||
public bool IsCheck;
|
|
||||||
}
|
|
||||||
}
|
|
12
src/SimAntics/Engine/VMMemory.cs
Normal file
12
src/SimAntics/Engine/VMMemory.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
namespace SimAntics.Engine
|
||||||
|
{
|
||||||
|
public class VMMemory
|
||||||
|
{
|
||||||
|
public VMMemory()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
src/SimAntics/Engine/VMScheduler.cs
Normal file
32
src/SimAntics/Engine/VMScheduler.cs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using SimAntics.Engine.Entities;
|
||||||
|
|
||||||
|
namespace SimAntics.Engine
|
||||||
|
{
|
||||||
|
public class VMScheduler
|
||||||
|
{
|
||||||
|
VM VM { get; set; }
|
||||||
|
|
||||||
|
Dictionary<uint, List<VMEntity>> _tickScheduler = new Dictionary<uint, List<VMEntity>>();
|
||||||
|
List<VMEntity> _tickThisFrame;
|
||||||
|
|
||||||
|
public HashSet<VMEntity> PendingDeletion { get; set; } = new HashSet<VMEntity>();
|
||||||
|
public uint CurrentTickID { get; set; }
|
||||||
|
public short CurrentObjectID { get; set; }
|
||||||
|
public bool RunningNow { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public VMScheduler(VM vm)
|
||||||
|
{
|
||||||
|
VM = vm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ScheduleTickIn(VMEntity _ent, uint delay)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
178
src/SimAntics/Engine/VMStackFrame.cs
Normal file
178
src/SimAntics/Engine/VMStackFrame.cs
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using SimAntics.Engine.Entities;
|
||||||
|
using SimAntics.Marshals;
|
||||||
|
|
||||||
|
namespace SimAntics.Engine
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Holds information about the execution of a routine
|
||||||
|
/// </summary>
|
||||||
|
public class VMStackFrame
|
||||||
|
{
|
||||||
|
public VMStackFrame() { }
|
||||||
|
|
||||||
|
/** Thread executing this routine **/
|
||||||
|
public VMThread Thread;
|
||||||
|
|
||||||
|
/** Routine that this context relates to **/
|
||||||
|
// public VMRoutine Routine;
|
||||||
|
|
||||||
|
/** Current instruction **/
|
||||||
|
public ushort InstructionPointer;
|
||||||
|
|
||||||
|
/** The object who executed this behavior **/
|
||||||
|
public VMEntity Caller;
|
||||||
|
|
||||||
|
/** The object the code is running on **/
|
||||||
|
public VMEntity Callee;
|
||||||
|
|
||||||
|
/** An object selected by the code to perform operations on. **/
|
||||||
|
public VMEntity StackObject
|
||||||
|
{
|
||||||
|
get { return _StackObject; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_StackObject = value;
|
||||||
|
_StackObjectID = value?.ObjectID ?? 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public short StackObjectID
|
||||||
|
{
|
||||||
|
get { return _StackObjectID; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_StackObjectID = value;
|
||||||
|
_StackObject = VM.GetObjectById(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VMEntity _StackObject;
|
||||||
|
public short _StackObjectID;
|
||||||
|
|
||||||
|
/** If true, this stack frame is not a subroutine. Return with a continue. **/
|
||||||
|
public bool DiscardResult;
|
||||||
|
|
||||||
|
/** Indicates that the current stack frame is part of an action tree.
|
||||||
|
** Set by "idle for input, allow push", when an interaction is selected.
|
||||||
|
** Used to stop recursive interactions, is only false when within "main".
|
||||||
|
**/
|
||||||
|
public bool ActionTree;
|
||||||
|
|
||||||
|
/** Used to get strings and other resources (for primitives) from the code owner, as it may not be the callee but instead a semiglobal or global. **/
|
||||||
|
//public GameIffResource ScopeResource
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return CodeOwner.Resource;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public GameObject CodeOwner;
|
||||||
|
/**
|
||||||
|
* Routine locals
|
||||||
|
*/
|
||||||
|
public short[] Locals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arguments
|
||||||
|
*/
|
||||||
|
public short[] Args;
|
||||||
|
|
||||||
|
//public GameObjectResource CallerPrivate
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return Caller.Object.Resource;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public GameObjectResource CalleePrivate
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return Callee.Object.Resource;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public GameObjectResource StackObjPrivate
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return StackObject.Object.Resource;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public GameGlobal Global
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return Thread.Context.Globals;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
public VM VM
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Thread.Context.VM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Utilities **/
|
||||||
|
//public VMInstruction GetCurrentInstruction()
|
||||||
|
//{
|
||||||
|
// return Routine.Instructions[InstructionPointer];
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public T GetCurrentOperand<T>()
|
||||||
|
//{
|
||||||
|
// return (T)GetCurrentInstruction().Operand;
|
||||||
|
//}
|
||||||
|
|
||||||
|
#region VM Marshalling Functions
|
||||||
|
//public virtual VMStackFrameMarshal Save()
|
||||||
|
//{
|
||||||
|
// return new VMStackFrameMarshal
|
||||||
|
// {
|
||||||
|
// RoutineID = Routine?.ID ?? 0,
|
||||||
|
// InstructionPointer = InstructionPointer,
|
||||||
|
// Caller = (Caller == null) ? (short)0 : Caller.ObjectID,
|
||||||
|
// Callee = (Callee == null) ? (short)0 : Callee.ObjectID,
|
||||||
|
// StackObject = StackObjectID,
|
||||||
|
// CodeOwnerGUID = CodeOwner.OBJ.GUID,
|
||||||
|
// Locals = (short[])Locals?.Clone(),
|
||||||
|
// Args = (short[])Args?.Clone(),
|
||||||
|
// DiscardResult = DiscardResult,
|
||||||
|
// ActionTree = ActionTree,
|
||||||
|
// };
|
||||||
|
//}
|
||||||
|
|
||||||
|
public virtual void Load(VMStackFrameMarshal input, VMContext context)
|
||||||
|
{
|
||||||
|
// CodeOwner = GameContent.Get.WorldObjects.Get(input.CodeOwnerGUID);
|
||||||
|
|
||||||
|
// Routine = null;
|
||||||
|
//if (input.RoutineID >= 8192) Routine = (VMRoutine)ScopeResource.SemiGlobal.GetRoutine(input.RoutineID);
|
||||||
|
//else if (input.RoutineID >= 4096) Routine = (VMRoutine)ScopeResource.GetRoutine(input.RoutineID);
|
||||||
|
//else Routine = (VMRoutine)Global.Resource.GetRoutine(input.RoutineID);
|
||||||
|
|
||||||
|
InstructionPointer = input.InstructionPointer;
|
||||||
|
Caller = context.VM.GetObjectById(input.Caller);
|
||||||
|
Callee = context.VM.GetObjectById(input.Callee);
|
||||||
|
StackObjectID = input.StackObject;
|
||||||
|
Locals = input.Locals;
|
||||||
|
Args = input.Args;
|
||||||
|
DiscardResult = input.DiscardResult;
|
||||||
|
ActionTree = input.ActionTree;
|
||||||
|
}
|
||||||
|
|
||||||
|
public VMStackFrame(VMStackFrameMarshal input, VMContext context, VMThread thread)
|
||||||
|
{
|
||||||
|
Thread = thread;
|
||||||
|
// Load(input, context);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
56
src/SimAntics/Engine/VMThread.cs
Normal file
56
src/SimAntics/Engine/VMThread.cs
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
#if !Server
|
||||||
|
#define IDE_COMPAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using SimAntics.Engine.Entities;
|
||||||
|
|
||||||
|
namespace SimAntics.Engine
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Compatibility class
|
||||||
|
/// </summary>
|
||||||
|
public class VMThread : VMInstruction { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles instruction sets
|
||||||
|
/// </summary>
|
||||||
|
public class VMInstruction
|
||||||
|
{
|
||||||
|
public static int MAX_USER_ACTIONS = 20;
|
||||||
|
|
||||||
|
public VMContext Context;
|
||||||
|
|
||||||
|
//check tree only vars
|
||||||
|
public bool IsCheck;
|
||||||
|
|
||||||
|
VMEntity Entity;
|
||||||
|
|
||||||
|
public List<VMStackFrame> Stack;
|
||||||
|
bool ContinueExecution;
|
||||||
|
|
||||||
|
public string ThreadBreakString;
|
||||||
|
public int BreakFrame; //frame the last breakpoint was performed on
|
||||||
|
public bool RoutineDirty;
|
||||||
|
|
||||||
|
public bool Interrupt;
|
||||||
|
|
||||||
|
ushort ActionUID;
|
||||||
|
|
||||||
|
// Exception handling variables
|
||||||
|
// Don't need to be serialized.
|
||||||
|
public int DialogCooldown = 0;
|
||||||
|
// the number of ticks that have executed so far this frame. If this exceeds the allowed max,
|
||||||
|
// the thread resets, and a SimAntics Error pops up.
|
||||||
|
public int TicksThisFrame = 0;
|
||||||
|
// the maximum number of primitives a thread can execute in one frame. Tweak appropriately.
|
||||||
|
|
||||||
|
// variables for internal scheduler
|
||||||
|
public uint ScheduleIdleStart; // keep track of tick when we started idling for an object. must be synced!
|
||||||
|
public uint ScheduleIdleEnd;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
158
src/SimAntics/Entities/VMEntity.cs
Normal file
158
src/SimAntics/Entities/VMEntity.cs
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace SimAntics.Engine.Entities
|
||||||
|
{
|
||||||
|
public class VMEntityRTTI
|
||||||
|
{
|
||||||
|
public string[] AttributeLabels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class VMEntity
|
||||||
|
{
|
||||||
|
public static bool UseWorld = true;
|
||||||
|
public VMEntityRTTI RTTI;
|
||||||
|
public bool GhostImage;
|
||||||
|
|
||||||
|
public short ObjectID;
|
||||||
|
public uint PersistID;
|
||||||
|
|
||||||
|
public short[] ObjectData;
|
||||||
|
public LinkedList<short> MyList = new LinkedList<short>();
|
||||||
|
// public List<VMSoundEntry> SoundThreads;
|
||||||
|
|
||||||
|
// public VMRuntimeHeadline Headline;
|
||||||
|
/// <summary>
|
||||||
|
/// IS NOT serialized, but rather regenerated on deserialize.
|
||||||
|
/// </summary>
|
||||||
|
// public VMHeadlineRenderer HeadlineRenderer;
|
||||||
|
|
||||||
|
// public GameObject Object;
|
||||||
|
public VMThread Thread;
|
||||||
|
// public VMMultitileGroup MultitileGroup;
|
||||||
|
|
||||||
|
public short MainParam; //parameters passed to main on creation.
|
||||||
|
public short MainStackOBJ;
|
||||||
|
|
||||||
|
public VMEntity[] Contained = new VMEntity[0];
|
||||||
|
public VMEntity Container;
|
||||||
|
public short ContainerSlot;
|
||||||
|
/// <summary>
|
||||||
|
/// set when the entity is removed, threads owned by this object or with this object as callee will be cancelled/have their stack emptied
|
||||||
|
/// </summary>
|
||||||
|
public bool Dead;
|
||||||
|
|
||||||
|
/** Relationship variables **/
|
||||||
|
public Dictionary<ushort, List<short>> MeToObject;
|
||||||
|
public Dictionary<uint, List<short>> MeToPersist;
|
||||||
|
//a runtime cache for objects that have relationships to us. Used to get a quick reference to objects
|
||||||
|
//that may need to delete a relationship to us.
|
||||||
|
//note this can point to false positives, but the worst case is a slow deletion if somehow every object is added.
|
||||||
|
public HashSet<ushort> MayHaveRelToMe = new HashSet<ushort>();
|
||||||
|
|
||||||
|
//signals which relationships have changed since the last time this was reset
|
||||||
|
//used to partial update relationships when doing an avatar save to db
|
||||||
|
public HashSet<uint> ChangedRels = new HashSet<uint>();
|
||||||
|
|
||||||
|
public ulong DynamicSpriteFlags; /** Used to show/hide dynamic sprites **/
|
||||||
|
public ulong DynamicSpriteFlags2;
|
||||||
|
//public VMObstacle Footprint;
|
||||||
|
|
||||||
|
//LotTilePos _Position = new LotTilePos(LotTilePos.OUT_OF_WORLD);
|
||||||
|
//public EntityComponent WorldUI;
|
||||||
|
|
||||||
|
public uint TimestampLockoutCount = 0;
|
||||||
|
//public Color LightColor = Color.White;
|
||||||
|
|
||||||
|
//inferred properties (from object resource)
|
||||||
|
//public GameGlobalResource SemiGlobal;
|
||||||
|
//public TTAB TreeTable;
|
||||||
|
//public TTAs TreeTableStrings;
|
||||||
|
//public Dictionary<string, VMTreeByNameTableEntry> TreeByName;
|
||||||
|
//public SLOT Slots;
|
||||||
|
//public OBJD MasterDefinition; //if this object is multitile, its master definition will be stored here.
|
||||||
|
//public OBJfFunctionEntry[] EntryPoints; /** Entry points for specific events, eg. init, main, clean... **/
|
||||||
|
//public virtual bool MovesOften
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// if (Container != null) return true;
|
||||||
|
// if (Slots == null) return false;
|
||||||
|
// if (!Slots.Slots.ContainsKey(3)) return false;
|
||||||
|
// var slots = Slots.Slots[3];
|
||||||
|
// return (slots.Count > 7);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public string Name
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// if (MultitileGroup.Name != "") return MultitileGroup.Name;
|
||||||
|
// else return this.ToString();
|
||||||
|
// }
|
||||||
|
// set
|
||||||
|
// {
|
||||||
|
// MultitileGroup.Name = value;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//bool DynamicMultitile
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return EntryPoints[8].ActionFunction >= 256;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public override string ToString()
|
||||||
|
//{
|
||||||
|
// if (MultitileGroup.Name != "") return MultitileGroup.Name;
|
||||||
|
// var strings = Object.Resource.Get<CTSS>(Object.OBJ.CatalogStringsID);
|
||||||
|
// if (strings != null)
|
||||||
|
// {
|
||||||
|
// return strings.GetString(0);
|
||||||
|
// }
|
||||||
|
// var label = Object.OBJ.ChunkLabel;
|
||||||
|
// if (label != null && label.Length > 0)
|
||||||
|
// {
|
||||||
|
// return label;
|
||||||
|
// }
|
||||||
|
// return Object.OBJ.GUID.ToString("X");
|
||||||
|
//}
|
||||||
|
|
||||||
|
//positioning properties
|
||||||
|
|
||||||
|
protected static Direction[] DirectionNotches = new Direction[]
|
||||||
|
{
|
||||||
|
Direction.NORTH,
|
||||||
|
Direction.NORTHEAST,
|
||||||
|
Direction.EAST,
|
||||||
|
Direction.SOUTHEAST,
|
||||||
|
Direction.SOUTH,
|
||||||
|
Direction.SOUTHWEST,
|
||||||
|
Direction.WEST,
|
||||||
|
Direction.NORTHWEST
|
||||||
|
};
|
||||||
|
|
||||||
|
//public LotTilePos Position
|
||||||
|
//{
|
||||||
|
// get { return _Position; }
|
||||||
|
// set
|
||||||
|
// {
|
||||||
|
// _Position = value;
|
||||||
|
// if (UseWorld) WorldUI.Level = Position.Level;
|
||||||
|
// if (this is VMAvatar) ((VMAvatar)this).VisualPositionStart = null;
|
||||||
|
// VisualPosition = new Vector3(_Position.x / 16.0f, _Position.y / 16.0f, (_Position.Level - 1) * 2.95f);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public abstract Vector3 VisualPosition { get; set; }
|
||||||
|
public abstract Direction Direction { get; set; }
|
||||||
|
public abstract float RadianDirection { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,8 @@
|
||||||
namespace SimAntics
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
namespace SimAntics
|
||||||
{
|
{
|
||||||
public interface IVM
|
public interface IVM
|
||||||
{
|
{
|
||||||
|
|
10
src/SimAntics/Interfaces/VMIMotiveDecay.cs
Normal file
10
src/SimAntics/Interfaces/VMIMotiveDecay.cs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
namespace SimAntics.Interfaces
|
||||||
|
{
|
||||||
|
public interface VMIMotiveDecay : VMSerializable
|
||||||
|
{
|
||||||
|
// void Tick(VMAvatar avatar, VMContext context);
|
||||||
|
}
|
||||||
|
}
|
9
src/SimAntics/Interfaces/VMSerializable.cs
Normal file
9
src/SimAntics/Interfaces/VMSerializable.cs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
namespace SimAntics.Interfaces
|
||||||
|
{
|
||||||
|
public interface VMSerializable
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
13
src/SimAntics/Marshals/VMMarshal.cs
Normal file
13
src/SimAntics/Marshals/VMMarshal.cs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using System;
|
||||||
|
namespace SimAntics.Marshals
|
||||||
|
{
|
||||||
|
public class VMMarshal
|
||||||
|
{
|
||||||
|
public VMMarshal()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
70
src/SimAntics/Marshals/VMStackFrameMarshal.cs
Normal file
70
src/SimAntics/Marshals/VMStackFrameMarshal.cs
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace SimAntics.Marshals
|
||||||
|
{
|
||||||
|
public class VMStackFrameMarshal
|
||||||
|
{
|
||||||
|
public ushort RoutineID { get; set; }
|
||||||
|
public ushort InstructionPointer { get; set; }
|
||||||
|
public short Caller { get; set; }
|
||||||
|
public short Callee { get; set; }
|
||||||
|
public short StackObject { get; set; }
|
||||||
|
public uint CodeOwnerGUID { get; set; }
|
||||||
|
public short[] Locals { get; set; }
|
||||||
|
public short[] Args { get; set; }
|
||||||
|
public bool DiscardResult { get; set; }
|
||||||
|
public bool ActionTree { get; set; }
|
||||||
|
|
||||||
|
public int Version { get; set; }
|
||||||
|
|
||||||
|
public VMStackFrameMarshal() { }
|
||||||
|
public VMStackFrameMarshal(int version) { Version = version; }
|
||||||
|
|
||||||
|
public virtual void Deserialize(BinaryReader reader)
|
||||||
|
{
|
||||||
|
RoutineID = reader.ReadUInt16();
|
||||||
|
InstructionPointer = reader.ReadUInt16();
|
||||||
|
Caller = reader.ReadInt16();
|
||||||
|
Callee = reader.ReadInt16();
|
||||||
|
StackObject = reader.ReadInt16();
|
||||||
|
CodeOwnerGUID = reader.ReadUInt32();
|
||||||
|
|
||||||
|
var localN = reader.ReadInt32();
|
||||||
|
if (localN > -1)
|
||||||
|
{
|
||||||
|
Locals = new short[localN];
|
||||||
|
for (var i = 0; i < localN; i++) Locals[i] = reader.ReadInt16();
|
||||||
|
}
|
||||||
|
|
||||||
|
var argsN = reader.ReadInt32();
|
||||||
|
if (argsN > -1)
|
||||||
|
{
|
||||||
|
Args = new short[argsN];
|
||||||
|
for (var i = 0; i < argsN; i++) Args[i] = reader.ReadInt16();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Version > 3) DiscardResult = reader.ReadBoolean();
|
||||||
|
ActionTree = reader.ReadBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void SerializeInto(BinaryWriter writer)
|
||||||
|
{
|
||||||
|
writer.Write(RoutineID);
|
||||||
|
writer.Write(InstructionPointer);
|
||||||
|
writer.Write(Caller);
|
||||||
|
writer.Write(Callee);
|
||||||
|
writer.Write(StackObject);
|
||||||
|
writer.Write(CodeOwnerGUID);
|
||||||
|
writer.Write((Locals == null) ? -1 : Locals.Length);
|
||||||
|
//if (Locals != null) writer.Write(VMSerializableUtils.ToByteArray(Locals));
|
||||||
|
//writer.Write((Args == null) ? -1 : Args.Length);
|
||||||
|
//if (Args != null) writer.Write(VMSerializableUtils.ToByteArray(Args));
|
||||||
|
writer.Write(DiscardResult);
|
||||||
|
writer.Write(ActionTree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,4 +4,9 @@
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Entities\" />
|
||||||
|
<Folder Include="Interfaces\" />
|
||||||
|
<Folder Include="Marshals\" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
using System;
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using SimAntics.Engine;
|
||||||
|
using SimAntics.Engine.Entities;
|
||||||
|
|
||||||
namespace SimAntics
|
namespace SimAntics
|
||||||
{
|
{
|
||||||
|
@ -10,32 +16,129 @@ namespace SimAntics
|
||||||
public bool IsTS1 { get; set; }
|
public bool IsTS1 { get; set; }
|
||||||
public bool Ready { get; set; }
|
public bool Ready { get; set; }
|
||||||
public bool BHAVDirty { get; set; }
|
public bool BHAVDirty { get; set; }
|
||||||
|
public VMContext Context { get; internal set; }
|
||||||
|
public VMScheduler Scheduler { set; get; }
|
||||||
|
|
||||||
public delegate void VMRefreshHandler();
|
public delegate void VMRefreshHandler();
|
||||||
public delegate void VMLotSwitchHandler(uint lotId);
|
public delegate void VMLotSwitchHandler(uint lotId);
|
||||||
|
|
||||||
public void Init()
|
Dictionary<short, VMEntity> ObjectsById = new Dictionary<short, VMEntity>();
|
||||||
|
short ObjectId = 1;
|
||||||
|
|
||||||
|
public List<VMEntity> Entities = new List<VMEntity>();
|
||||||
|
public HashSet<VMEntity> SoundEntities = new HashSet<VMEntity>();
|
||||||
|
public short[] GlobalState;
|
||||||
|
|
||||||
|
int GameTickRate = 60;
|
||||||
|
int GameTickNum = 0;
|
||||||
|
public int SpeedMultiplier = 1;
|
||||||
|
public int LastSpeedMultiplier;
|
||||||
|
int LastFrameSpeed = 1;
|
||||||
|
float Fraction;
|
||||||
|
public VMEntity GlobalBlockingDialog;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets an entity from this VM.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The entity's ID.</param>
|
||||||
|
/// <returns>A VMEntity instance associated with the ID.</returns>
|
||||||
|
public VMEntity GetObjectById(short id)
|
||||||
|
{
|
||||||
|
return ObjectsById.ContainsKey(id) ? ObjectsById[id] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructs a new Virtual Machine instance.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">The VMContext instance to use.</param>
|
||||||
|
public VM(VMContext context)
|
||||||
|
{
|
||||||
|
context.VM = this;
|
||||||
|
Context = context;
|
||||||
|
Scheduler = new VMScheduler(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VMEntity GetObjectByPersist(uint id)
|
||||||
|
{
|
||||||
|
// return Entities.FirstOrDefault(x => x.PersistID == id);
|
||||||
|
throw new VMSimanticsException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Init()
|
||||||
|
{
|
||||||
|
// PlatformState = (TS1)?(VMAbstractLotState)new VMTS1LotState():new VMTSOLotState();
|
||||||
|
GlobalState = new short[38];
|
||||||
|
GlobalState[20] = 255; //Game Edition. Basically, what "expansion packs" are running. Let's just say all of them.
|
||||||
|
GlobalState[25] = 4; //as seen in EA-Land edith's simulator globals, this needs to be set for people to do their idle interactions.
|
||||||
|
GlobalState[17] = 4; //Runtime Code Version, is this in EA-Land.
|
||||||
|
// if (Driver is VMServerDriver) EODHost = new VMEODHost();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Reset()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
public virtual void Update()
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reset()
|
public virtual void Tick()
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
public void Update()
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick()
|
public virtual void InternalTick(uint tickId)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InternalTick(uint tickId)
|
/// <summary>
|
||||||
|
/// Adds an entity to this Virtual Machine.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entity">The entity to add.</param>
|
||||||
|
public void AddEntity(VMEntity entity)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
entity.ObjectID = ObjectId;
|
||||||
|
ObjectsById.Add(entity.ObjectID, entity);
|
||||||
|
// AddToObjList(this.Entities, entity);
|
||||||
|
// if (!entity.GhostImage) Context.ObjectQueries.NewObject(entity);
|
||||||
|
// ObjectId = NextObjID();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddToObjList(List<VMEntity> list, VMEntity entity)
|
||||||
|
{
|
||||||
|
if (list.Count == 0) { list.Add(entity); return; }
|
||||||
|
int id = entity.ObjectID;
|
||||||
|
var max = list.Count;
|
||||||
|
var min = 0;
|
||||||
|
while (max>min)
|
||||||
|
{
|
||||||
|
var mid = (max+min) / 2;
|
||||||
|
int nid = list[mid].ObjectID;
|
||||||
|
if (id < nid) max = mid;
|
||||||
|
else if (id == nid) return; //do not add dupes
|
||||||
|
else min = mid+1;
|
||||||
|
}
|
||||||
|
list.Insert(min, entity);
|
||||||
|
// list.Insert((list[min].ObjectID>id)?min:((list[max].ObjectID > id)?max:max+1), entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes an entity from this Virtual Machine.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entity">The entity to remove.</param>
|
||||||
|
public void RemoveEntity(VMEntity entity)
|
||||||
|
{
|
||||||
|
if (Entities.Contains(entity))
|
||||||
|
{
|
||||||
|
// Context.ObjectQueries.RemoveObject(entity);
|
||||||
|
this.Entities.Remove(entity);
|
||||||
|
ObjectsById.Remove(entity.ObjectID);
|
||||||
|
// Scheduler.DescheduleTick(entity);
|
||||||
|
if (entity.ObjectID < ObjectId) ObjectId = entity.ObjectID; //this id is now the smallest free object id.
|
||||||
|
}
|
||||||
|
entity.Dead = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace SimAntics
|
namespace SimAntics
|
||||||
|
@ -20,7 +23,7 @@ namespace SimAntics
|
||||||
public int TimeOfDay => (Hours >= 6 && Hours < 18) ? 0 : 1;
|
public int TimeOfDay => (Hours >= 6 && Hours < 18) ? 0 : 1;
|
||||||
public int Seconds => MinuteFractions * 60 / TicksPerMinute;
|
public int Seconds => MinuteFractions * 60 / TicksPerMinute;
|
||||||
|
|
||||||
public DateTime UTCNow => (new DateTime(UTCStart)).AddSeconds(Ticks / 30.0);
|
public DateTime UTCNow => new DateTime(UTCStart).AddSeconds(Ticks / 30.0);
|
||||||
|
|
||||||
public VMClock() {}
|
public VMClock() {}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
namespace SimAntics
|
namespace SimAntics
|
||||||
{
|
{
|
||||||
public class VMContext
|
public class VMContext
|
||||||
{
|
{
|
||||||
public static bool useWorld = true;
|
public static bool useWorld = true;
|
||||||
public VM Vm;
|
public VM VM { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
98
src/SimAntics/VMSimanticsException.cs
Normal file
98
src/SimAntics/VMSimanticsException.cs
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// http://mozilla.org/MPL/2.0/.
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using SimAntics.Engine;
|
||||||
|
|
||||||
|
namespace SimAntics
|
||||||
|
{
|
||||||
|
public class VMSimanticsException : Exception
|
||||||
|
{
|
||||||
|
readonly string _message;
|
||||||
|
VMStackFrame _context;
|
||||||
|
|
||||||
|
public VMSimanticsException() { }
|
||||||
|
|
||||||
|
public VMSimanticsException(string message, VMStackFrame context) : base(message)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
_message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
var output = new StringBuilder();
|
||||||
|
output.Append(_message);
|
||||||
|
output.AppendLine();
|
||||||
|
output.AppendLine();
|
||||||
|
output.Append(GetStackTrace());
|
||||||
|
return output.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetStackTrace()
|
||||||
|
{
|
||||||
|
if (_context == null) return "No Stack Info.";
|
||||||
|
|
||||||
|
var stack = _context.Thread.Stack;
|
||||||
|
return GetStackTrace(stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetStackTrace(List<VMStackFrame> stack)
|
||||||
|
{
|
||||||
|
var output = new StringBuilder();
|
||||||
|
var prevEE = "";
|
||||||
|
var prevER = "";
|
||||||
|
|
||||||
|
for (var i = stack.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (i == 9 && i <= stack.Count - 8)
|
||||||
|
{
|
||||||
|
output.Append("...");
|
||||||
|
output.AppendLine();
|
||||||
|
}
|
||||||
|
if (i > 8 && i <= stack.Count - 8) continue;
|
||||||
|
var frame = stack[i];
|
||||||
|
//run in tree:76
|
||||||
|
|
||||||
|
var callerStr = frame.Caller.ToString();
|
||||||
|
var calleeStr = frame.Callee?.ToString();
|
||||||
|
|
||||||
|
if (callerStr != prevER || calleeStr != prevEE)
|
||||||
|
{
|
||||||
|
output.Append('(');
|
||||||
|
output.Append(callerStr);
|
||||||
|
output.Append(':');
|
||||||
|
output.Append(calleeStr);
|
||||||
|
output.Append(") ");
|
||||||
|
output.AppendLine();
|
||||||
|
prevEE = calleeStr;
|
||||||
|
prevER = callerStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
output.Append(" > ");
|
||||||
|
|
||||||
|
/*if (frame is VMRoutingFrame)
|
||||||
|
{
|
||||||
|
output.Append("VMRoutingFrame with state: ");
|
||||||
|
output.Append(((VMRoutingFrame)frame).State.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
output.Append(frame.Routine.Rti.Name.TrimEnd('\0'));
|
||||||
|
output.Append(':');
|
||||||
|
output.Append(frame.InstructionPointer);
|
||||||
|
output.Append(" (");
|
||||||
|
var opcode = frame.GetCurrentInstruction().Opcode;
|
||||||
|
var primitive = (opcode > 255) ? null : VMContext.Primitives[opcode];
|
||||||
|
output.Append((primitive == null) ? opcode.ToString() : primitive.Name);
|
||||||
|
output.Append(")");
|
||||||
|
}*/
|
||||||
|
output.AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
return output.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue