0x006A is the Animate Sim primitive. Any time a sim moves, it uses this function.
Animate Sim uses at least 12 of the 16 operands, and can use 4 (known) variables from the calling BHAV as well. It must call an ANIM file, and can call another BHAV file as well. Animate sim is a fairly complex primitive, and this article (as of now) doesn't explain it all.
Information on this page was collected using SimPE, as were the screenshots.
Like all BHAVs, Animate sim is called in it's own line, and is passed certain info from the operand list. Just for clarity, this is how I numbered the operands:
Animate Sim essentially works like this: When called, it finds the necessary animation (stored in an ANIM resource) by looking in a STR# (text list) file for the name of the animation, and finds the animation with the right name. Then it applies any changes made in the relevant operands to the animation, and plays it.
I am not going to cover the Operands in order, because it's too much of a pain (they all interrelate so much).
Operand 7 contains the last two digits of the instance number of the default STR# file. (the one it finds the ANIM name in)
Instance number 0x00000081 is the most commonly-used STR#. It contains all the names of the ANIMs that adults can perform relative to the object. At runtime, sims 2 looks for this STR# in the same group as the calling object; if not found there, it "fallsback" and looks in the object's semi-globals.
STR# instances 0x82 (ChildAnims), 0x89 (ToddlerAnims), 0x8A (TeenAnims), 0x8B (ElderAnims) and 0x91 (Baby) all work exactly the same way, and one needs to exist for every age group that can use the object. Instance number 0x84 accesses the Locomotion Anims file. Selecting either adult anims (0x82) or global anims (0x80) will cause the game to select the animation from the text list necessary for the age group of the performing sim.
Note: There doesn't need to be a seperate call to Animate Sim for every age group. Animate Sim will find the appropriate STR# file for the age of the sim it applies to. If a STR# file does not exist for teens, young adults or elders, the adult animation may be played in its place.
Any other instance number (including 00), if not found in the group, falls back to the semiglobals, and looks in the ObjectAnims STR# 86. Obviously, object animations cannot apply to sims unless they share a common bone structure, and Animate Sim will throw an error and immediately stop whatever the sim was doing.
Operands 2 & 1
Why 2 and 1? Why not 1 and 2? Because, like anything else in BHAVs, all 4 digit numbers are stored with the 16s and 1s first, then the 65536s and 256s (these are hexadecimal). Example: the hex number 1234 would be stored in two BHAVs as 34 12.
Operands 2 & 1 can be two things. Either they define the line in the STR# file (defined in opcode 7) that has the desired animation's name, or they define the parameter that has the number that defines the line in the STR# file. (try saying that three times fast!)
Whether these numbers refer to the actual text line, or the parameter, depends on the next operand.
This is THE operand. It defines so much stuff it's easier if I make a graphic.
Basically, anything highlighted in red is decided by this opcode.
Going through them one by one....
- Flipped If flipped is false, the animation plays as normal. If flipped is true, the animation is, well, flipped, along a plane dividing the sim into left and right. The best example is the bed. If a sim gets in on one side, the animation plays normally. If the sim gets in on the other, the animation is flipped.
- Anim Speed in temp 2 Normally, the animation speed is contained in Operand 4 (more on this later). When this is true, however, the animation speed is called from temporary 0x0002. This is usually not useful if you're modding the original Maxis stuff, since temp 2 is often used for something else.
- [parameters 0x0000] As mentioned in opcodes 2 & 1, this defines whether 2&1 refer to the literal number of the needed text line, or to the parameter that contains the text line.
- Interruptible When true, the animation can be interrupted, and the BHAV continues on to the next line. I haven't seen this used much, probably because it only interrupts this one animation. If you cancel an action in the middle, and this is true, the animation will be stopped, but nothing else in the calling BHAV will be.
- Start at tag in temp 0 This forces some animations to play from a starting point mid-way through the animation. If selected, the animation will begin at the event tag refered to by the value in temp 0. Event tags are defined in the original anim file, and so this option may not work on all animations.
- Trans to idle Same as above, I have no idea. I think it means the animation finishes by blending the end of the animation into the idle pose, but this is only a hopeful guess.
- No Blend Out First, my conjectures on blending: when an animation is blended with the one before or after, Animate Sim treats them as one long animation, and meshes them together, producing a smoother overall movement. This seems to be supported by what I saw in the game, but keep in mind, I found out all this stuff by changing a file, then watching it in-game, so it could just be my eyes. But I think it is blending the animations.
- No Blend In Same as above. Another note: I have seen a few animations (somewhere, I lost them) that looked like blending animations. For all I know, maybe these tags refer to them.
So that's what they do. How they're all contained is in flags, which use the binary number. In short, when this number is translated into binary, a 1 means true, a 0 means false. Using the above list, a 1 in the ones place means flipped is true. a 1 in the tens (or is it twos?) place means anim speed in temp 2 is true. And so on, throughout the list. Since that can be a bit confusing, here's a table of a few of the first values.
And so on, and so forth, throughout all the possible values from 00 to FF. And I know, the table is confusing too. Sorry.
This operand controls the speed of the animation. The default value is 20, but it can be set to anything between 01 and FF (00 results in an error). Values from 01 to 7F make the animation play forward, with the higher the number, the faster the animation. HOWEVER: Values above 7F (or from 80 to FF) make the animation run Backwards, with larger numbers making the animation slower. So 7F would make a fast, forward animation, and 80 would make a fast, backward animation. For the technically minded, this value is stored in a fixed point format (1 sign bit, 3 integer bits, 4 fractional bits). Consequently, 0x20 represents a speed multiplier of 1 (the normal rate), and 0xE0 represents a speed multiplier of -1 (normal rate played backwards).
Operands 6 & 5
Another 4-digit hex number, this one specifies the event tree to run while the animation is playing. Anything you could run in a BHAV line, you can run here. If set to 0000, no event tree is run.
This operand deals with the "scope" of event tree specified in operands 6&5, and has no effect when there isn't an event tree. Possible values are 00 (private), 01 (semiglobal), and 02 (global).
Operand 9 is like operand 3: it's several flags in one.
- Flip flag in temp 3 This states that the flip flag can be found in temp 3 (and not in operand 3). It should be noted that the global function 0x0151 loads the sim's handedness into temp 3, so that animations with a handedness preference (ie - writing left or right handed) can use this flag to play the correctly flipped version of this animation.
- Synch to last anim I presume this means to synchronize this animation with the previous one. Since most in-game objects that involve object-sim interactions have the object animation right before the sim animation, this makes sense.
- Use controlling object as anim source Don't know, to be honest.
- Not hurryable Also don't know.
Unfortunately, these flags aren't as simple as operand 3. Flip in temp 3 and Synch are in the expected places in the binary (bits one and two respectively), but Anim resource is bit 16, and Not hurryable is bit 32! This leaves two flags in the middle that don't seem to do anything. I don't know if this is just an oversight in SimPE, or an unusual anomaly in the program itself. More testing would be appreciated.
Plain and simple, it defines the IK (inverse kinematic) object. IK objects, as far as I understand, deal with aligning sim animations to objects. For example: when a sim opens a fridge, an IK object deals with making the sims hand grab the handle. And that's about all I know.
Operands 12 & 11
Yes, yet another 4-digit hexadecimal number, dealing with the IK object identifier. Since I know almost nothing about IK objects, I know nothing about the identifiers.
Priority. 00 is low, 01 is medium, 02 is high. I have seen priority 03, but SimPE doesn't know what to do with it. Exactly what the priorities do...?
Operands 14, 15 & 16
As far as I can tell, these are all unused. Opcode 14 seems to be set to FF most of the time, but I don't see any difference when it's changed.