SimAntics & World Development (archive)

Discussion in 'Development News' started by RHY3756547, Feb 16, 2014.

Thread Status:
Not open for further replies.
  1. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    It's not a theory, it's pretty much confirmed.
    aidancheddar likes this.
  2. Afr0

    Afr0 Well-Known Member

    Rhys, dunno if it would help you, but you can always look at the TS3 code by decompiling it. There are other ways, but one way of doing it is described here.
  3. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    That stuff isn't really relevant at all to SimAntics, it's just a small point of interest that they only changed it starting with TS3.
  4. Afr0

    Afr0 Well-Known Member

    ... so they didn't implement SimAntics in C#, basically?
  5. francot514

    francot514 Well-Known Member

  6. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    SimAntics is a bytecode language that's kind of its own thing, the programming language that it's coded in isn't relevant. SimAntics is executed through a VM like interpreter that could really be coded in any language. TS3 doesn't use simantics though, it instead uses c# code.
    aidancheddar likes this.
  7. Afr0

    Afr0 Well-Known Member

    Hm, I always thought SimAntics referred to the language and the VM!
  8. aidancheddar

    aidancheddar Active Member

    No wonder it was so easy to make expansions! And why it felt like I was an running operating system at some points.
  9. francot514

    francot514 Well-Known Member

    What do you mean with VM? Virtual Machine??? Also if sims antics is bytecode language why the sims engine need c++ core to interpretate the objects and other elements.
  10. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    It needs c++ code to interpret the bytecode, computers can't run it directly as it's not x86! It's like emulating a console, you need a form of intermediate software to interpret the instructions and simulate the functionality of the "machine".
  11. aidancheddar

    aidancheddar Active Member

    Think of Oracle's Java.
  12. francot514

    francot514 Well-Known Member

    The sims antincs can be implemented into c++, csharp or v.net??? because i only know vb.net, and can be interesting test with that...
  13. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    Yes, you can code a SimAntics emulator for just about anything. It requires mass loading of all of the objects in the game though, as well as an understanding of how SimAntics functions.
  14. Afr0

    Afr0 Well-Known Member

    Technically, what Rhys is doing isn't an emulator though, he's rebuilding the VM.
  15. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    Hmm, with the current version the Stack Object seems to be being treated as the "Callee", which is definitely not the case. This is causing changes of the stack object to attempt to load BHAVs from other objects (or null)...
  16. ddfczm

    ddfczm Administrator Staff Member Moderator

    Yea I was coming up against this before I stopped. An interesting thing I noticed was a lot of objects in their init bhav set Stack Object ID to My object id. However, in the OBJD the same objects have 0 as their init tree ID. Was not clear if this was deprecated or maybe the init only runs on the server VM so the client copy has 0 for the tree ids?

    So this was a hack to get stuff working until I fully understood the relationship between the my & stack objects. Although it may be as simple as swapping the my & stack objects current meaning and getting init functions to work for object threads.
    Last edited: Feb 26, 2014
  17. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    I think it's most likely just a utility variable that you can use to reference an object. Stack object seems to always be implicitly set to the callee on queuing an interaction, though it can be changed to another object or null without altering the execution flow.

    I'm still not sure of its relation to stack frames. It seems that the stack object carries onto any subroutines, but any changes to it remain in that subroutines stack frame (would explain the naming, "stack object".) In the module inspector, it's roped in with the parameters and locals.
  18. ddfczm

    ddfczm Administrator Staff Member Moderator

    Agree, the stack object seems to be the object being invoked against. So a bhav to change a sprite frame would act on the stack object. That is logical I guess. Take the aquarium. It has a main loop, this runs in a thread owned by the object so My = the aquarium. That thread starts up. The init function changes stack object to be my id and then subsequent bhavs can be shared by both user invoked routines and the objects own thread because the stack object for both point to the aquarium. So a utility to set the sprite based on object state can be used by both contexts.

    However, that would suggest changing the stack object is persistent which it may not be given the name like you pointed out. If it was per stack frame the init function setting the stack object would only effect primitives and sub-calls within init. The aquarium does this variable set just before it calls a private "set graphic by state".

    May be worth tweaking a TS1 object to perform a primitive if stack object ID == my object ID in init / main and after a change and pop of the stack.
  19. ddfczm

    ddfczm Administrator Staff Member Moderator

    Actually, all of the bhavs that run against the object thread do this. init, load and main. So if the assumption is these bhavs all run in the same thread then it seems like it probably is set per stack frame.
  20. RHY3756547

    RHY3756547 FreeSO Developer Staff Member Moderator

    Did some testing and found this:
    [​IMG]
    Stack objects behave as I expected when calling subroutines. The stack object in the new stack frame is set to the current one, but changes to it do not persist back.

    [​IMG]
    First shot is from Dialog alerting "I am $Me" in init (don't do this btw, you get stuck in a perpetual loop of dialogs), and second one is alerting "Object is $Object" from directly at the start of a test interaction. This shows that at the start of the function the stack object is automatically the object - and another interesting thing is that BHAVs have a property called "Default Stack Object" which is usually set to "Normal" but can be set to any object type in the game... This is especially weird because there is no space for a whole GUID in the BHAV header.

    The stack object set in init does not affect the stack object when the interaction is called (it will still be the callee, the aquarium), I set it to the Object with ID 1 and it still used the Aquarium for the interaction. Also, if you set the Stack Object ID to something that doesn't exist the game will freak out (simulation froze for me when doing it in init routine)!
Thread Status:
Not open for further replies.

Share This Page