14
« on: 2019-02-23 06:39:47 »
Ok, now that I had a chance to sit down and unfold everything DLPB noted; I figured this out. That was my initial thought, that these coordinates were defined and executed using WM scripts, however, I think there was some comment somewhere that led me away from searching WM scripts so I eliminated that from my search.
But here it is:
Apparently, and I don't know how THIS part is managed, but there are certain variables that the game maintains for various functionality throughout the WM, called Special Variables. There are 20 possible variables that can be referenced, most of which are unknown, per the Wiki. One of these variables stores the field ID that jumped to the WM; this is the "wm" field map, not the field map that jumps to the "wm" field. This variable was previously unknown on the Wiki, but I have found it to be ID 6, this will be explained later. There, then, is an opcode that loads up that value and uses it to determine IF and WHERE any coordinate changes should occur. This check happens every time the WM is loaded. That's half of what's needed, but important to note.
The other half deals with the actual coordinates that it should move your active entity to. As DLPB alluded to earlier, it handles this in a rather funky way, but there is a method to it's madness, it actually relates to that world map coordinate image I posted earlier. DLPB referred to 2 values which are in the EV file (which is where the WM scripts are located), 0x18 and 0x13D6. 0x18 first needs to be multiplied by 0x2000 to get 0x30000 and then added to 0x13D6, coming out to be 0x313D6 or 201686, which is the final destination X coordinate. DLPB is correct in that they AREN'T stored in 3 or 4-byte chunks, that is because they can't. In the WM scripts, it is stack-based and the entire WM script file is stored and referenced in increments of 2-bytes, no more and no less. So, the game designers could've just dealt with status quo and have the WM utilize either a smaller dimension space, or drastically reduce the image quality of the WM imaging. The workaround was to split the WM into smaller chunks (which we know as meshes) which are previously known as our X and Z coordinate system described in my earlier post with the WM coordinate image. The 0x18 value, or 24 in decimal, is actually the mesh X coordinate, and it is to be multiplied by 0x2000 because there are 0x2000 pixels per each mesh. If the entire WM would be restricted to 2-byte coordinates, the entire map would have to fit within an 8x8 section (about the size of the eastern continent). The WM could theoretically be much much larger (aka better quality), however, there are likely limitations outside stuff that can be referenced inside WM scripts, but definitely something that could be looked into to create a WM HD Mod. Getting back to DLPB's coordinates, the second number is the number of pixels within that mesh that the active entity should move to. Putting them together, the 0x18 number will tell the game which mesh it should load (along with some of the surrounding meshes), then the 0x13D6 number tells which pixel location to put the character.
Here's the section of the WM script that pertains the part that transports to world coordinates:
00 01 'CLEARs the Stack
1B 01 06 00 'Loads SPECIAL Variable 6 value to the Stack
10 01 02 00 'Adds CONSTANT value of 2 to the Stack (this is Field ID of 2, aka wm1/Kalm)
70 00 'Consumes the 2 previous Stack values, adds boolean value (0 or 1) to the Stack if the 2 values are EQUAL
01 02 00 02 'JUMPs ahead to the next Field ID check (ID 3 @ 0x200 in the WM script) if the previous operation was false (if not equal)
00 01 'CLEARs the Stack
10 01 18 00 'Adds CONSTANT value of 24 to the Stack (this is the mesh X coordinate)
10 01 0D 00 'Adds CONSTANT value of 13 to the Stack (this is the mesh Z coordinate)
08 03 'Consumes the 2 previous Stack values, then SETs the ACTIVE ENTITY's MESH (loads the mesh, and surrounding meshes)
00 01 'CLEARs the Stack
10 01 D6 13 'Adds CONSTANT value of 5078 to the Stack (this is the X coordinate within the mesh)
10 01 20 19 'Adds CONSTANT value of 6432 to the Stack (this is the Z coordinate within the mesh)
09 03 'Consumes the 2 previous Stack values, then SETs the ACTIVE ENTITY's COORDINATES (puts character at coordinates within the current mesh)
00 01 'CLEARs the Stack
10 01 00 00 'Adds CONSTANT value of 0 to the Stack (value 0-255: this is the direction the character is facing, 0 is south)
04 03 'Consumes the previous Stack value, then SETs the ACTIVE ENTITY's DIRECTION (sets the character's direction that it's facing)
00 02 3D 08 'JUMPs ahead to section of the script that is after all the Special Variable Field ID checks (@0x83D)
So, to modify any of these is as simple as tweaking those specific values within the WM scripts, System call On WM Load (This is function type 0, function ID 0, usually the first "valid" entry in the call table). The actual part of the script that pertains to world coordinate jumping is at 0x364 byte offset relative to the start of the function (0x398 from the start of the entire script section, 0x798 from the start of the entire EV file)
The Kalm example is the most simple example, sometimes some of these are conditional and can do to different coordinates. Here is a copy of some pseudocode of the WM script as it pertains to transitioning from field map to world map, I got this from DynamixDJ, who got it from someone else. Some of this I know and can fill in the blanks for, but there's just too much to do, but it should be easy to see the parts requiring modifying, it will take someone a little work to map the below logic to the binary EV file:
01d2 IF ((GetSpecial(0006) == #0001)) {
01d9 ActiveEntity.SetMeshCoordsXZ(#0016, #000f)
01df ActiveEntity.SetCoordsInMeshXZ(#1524, #01bd)
01e3 ActiveEntity.SetDirectionAndFacing(#0000)
01e4 GOTO 083d
}
01ec IF ((GetSpecial(0006) == #0002)) {
01f3 ActiveEntity.SetMeshCoordsXZ(#0018, #000d)
01f9 ActiveEntity.SetCoordsInMeshXZ(#13d6, #1920)
01fd ActiveEntity.SetDirectionAndFacing(#0000)
01fe GOTO 083d
}
0206 IF ((GetSpecial(0006) == #0003)) {
020b IF (Bank0[007e].Bit(1)) {
0210 IF (Bank0[007e].Bit(0)) {
0215 LoadAndInitModel(#0004)
0216 EnterVehicle()
}
021a IF (Bank0[007e].Bit(2)) {
021f LoadAndInitModel(#0013)
0220 EnterVehicle()
}
0224 IF (Bank0[007e].Bit(3)) {
0229 LoadAndInitModel(#0013)
022a EnterVehicle()
}
022e IF (Bank0[007e].Bit(4)) {
0233 LoadAndInitModel(#0013)
0234 EnterVehicle()
}
0238 IF (Bank0[007e].Bit(5)) {
023d LoadAndInitModel(#0013)
023e EnterVehicle()
}
0242 IF (Bank0[007e].Bit(6)) {
0247 LoadAndInitModel(#0013)
0248 EnterVehicle()
}
}
024e ActiveEntity.SetMeshCoordsXZ(#001d, #0010)
0254 ActiveEntity.SetCoordsInMeshXZ(#0712, #1d23)
0258 ActiveEntity.SetDirectionAndFacing(#0000)
0259 GOTO 083d
}
0261 IF ((GetSpecial(0006) == #0004)) {
0268 ActiveEntity.SetMeshCoordsXZ(#001a, #0012)
026e ActiveEntity.SetCoordsInMeshXZ(#073d, #15ba)
0272 ActiveEntity.SetDirectionAndFacing(#0060)
0273 GOTO 083d
}
027b IF ((GetSpecial(0006) == #0005)) {
0282 ActiveEntity.SetMeshCoordsXZ(#0019, #0013)
0288 ActiveEntity.SetCoordsInMeshXZ(#0fdd, #095c)
028c ActiveEntity.SetDirectionAndFacing(#00e4)
028d GOTO 083d
}
0295 IF ((GetSpecial(0006) == #0006)) {
029c ActiveEntity.SetMeshCoordsXZ(#0018, #0014)
02a2 ActiveEntity.SetCoordsInMeshXZ(#1a1d, #19ff)
02a6 ActiveEntity.SetDirectionAndFacing(#0000)
02a7 GOTO 083d
}
02af IF ((GetSpecial(0006) == #0007)) {
02b4 IF (Bank0[007f].Bit(0)) {
02b9 IF (Bank0[007f].Bit(1)) {
02be LoadAndInitModel(#0006)
02bf EnterVehicle()
}
}
02c5 ActiveEntity.SetMeshCoordsXZ(#0014, #0011)
02cb ActiveEntity.SetCoordsInMeshXZ(#175d, #1e0e)
02cf ActiveEntity.SetDirectionAndFacing(#0000)
02d0 GOTO 083d
}
02d8 IF ((GetSpecial(0006) == #0008)) {
02df ActiveEntity.SetMeshCoordsXZ(#0014, #0016)
02e5 ActiveEntity.SetCoordsInMeshXZ(#1814, #0d4d)
02e9 ActiveEntity.SetDirectionAndFacing(#0000)
02ea GOTO 083d
}
02f2 IF ((GetSpecial(0006) == #0009)) {
02f9 ActiveEntity.SetMeshCoordsXZ(#0018, #0010)
02ff ActiveEntity.SetCoordsInMeshXZ(#0a8b, #09d1)
0303 ActiveEntity.SetDirectionAndFacing(#0038)
0304 GOTO 083d
}
030c IF ((GetSpecial(0006) == #000a)) {
0313 ActiveEntity.SetMeshCoordsXZ(#000f, #0015)
0319 ActiveEntity.SetCoordsInMeshXZ(#1908, #07f1)
031d ActiveEntity.SetDirectionAndFacing(#0000)
031e GOTO 083d
}
0326 IF ((GetSpecial(0006) == #000b)) {
032d ActiveEntity.SetMeshCoordsXZ(#001a, #0018)
0334 IF ((Bank0_16bit[0000] >= #04ad)) {
033b ActiveEntity.SetCoordsInMeshXZ(#1a25, #18d8)
033c GOTO 0344
}
0343 ActiveEntity.SetCoordsInMeshXZ(#1bd7, #153b)
0347 ActiveEntity.SetDirectionAndFacing(#0000)
0348 GOTO 083d
}
0350 IF ((GetSpecial(0006) == #000c)) {
0357 ActiveEntity.SetMeshCoordsXZ(#0021, #0011)
035d ActiveEntity.SetCoordsInMeshXZ(#0f64, #05e8)
0361 ActiveEntity.SetDirectionAndFacing(#0000)
0362 GOTO 083d
}
036a IF ((GetSpecial(0006) == #000d)) {
036f IF (Bank0[007f].Bit(0)) {
0374 IF (Bank0[007f].Bit(1)) {
0379 LoadAndInitModel(#0006)
037a EnterVehicle()
}
}
0380 ActiveEntity.SetMeshCoordsXZ(#0011, #000f)
0386 ActiveEntity.SetCoordsInMeshXZ(#0607, #0cb2)
038a ActiveEntity.SetDirectionAndFacing(#0000)
038b GOTO 083d
}
0393 IF ((GetSpecial(0006) == #000e)) {
039a ActiveEntity.SetMeshCoordsXZ(#000d, #000e)
03a0 ActiveEntity.SetCoordsInMeshXZ(#1f1d, #1aa5)
03a4 ActiveEntity.SetDirectionAndFacing(#0044)
03a5 GOTO 083d
}
03ad IF ((GetSpecial(0006) == #000f)) {
03b4 ActiveEntity.SetMeshCoordsXZ(#000d, #000f)
03ba ActiveEntity.SetCoordsInMeshXZ(#0a98, #0c93)
03be ActiveEntity.SetDirectionAndFacing(#00fa)
03bf GOTO 083d
}
03c7 IF ((GetSpecial(0006) == #0010)) {
03cc IF (Bank0[007f].Bit(0)) {
03d1 IF (Bank0[007f].Bit(1)) {
03d6 LoadAndInitModel(#0006)
03d7 EnterVehicle()
}
}
03dd ActiveEntity.SetMeshCoordsXZ(#000e, #0012)
03e3 ActiveEntity.SetCoordsInMeshXZ(#1615, #1e6e)
03e7 ActiveEntity.SetDirectionAndFacing(#0000)
03e8 GOTO 083d
}
03f0 IF ((GetSpecial(0006) == #0011)) {
03f7 ActiveEntity.SetMeshCoordsXZ(#000d, #0016)
03fd ActiveEntity.SetCoordsInMeshXZ(#18dc, #117a)
0401 ActiveEntity.SetDirectionAndFacing(#0000)
0402 GOTO 083d
}
040a IF ((GetSpecial(0006) == #0012)) {
0411 ActiveEntity.SetMeshCoordsXZ(#000a, #0014)
0417 ActiveEntity.SetCoordsInMeshXZ(#14d9, #1c20)
041b ActiveEntity.SetDirectionAndFacing(#0000)
041c GOTO 083d
}
0424 IF ((GetSpecial(0006) == #0013)) {
042b ActiveEntity.SetMeshCoordsXZ(#000b, #0010)
0431 ActiveEntity.SetCoordsInMeshXZ(#09f1, #17f0)
0435 ActiveEntity.SetDirectionAndFacing(#0000)
0436 GOTO 083d
}
043e IF ((GetSpecial(0006) == #0014)) {
0445 ActiveEntity.SetMeshCoordsXZ(#000a, #000e)
044b ActiveEntity.SetCoordsInMeshXZ(#0741, #1a88)
044f ActiveEntity.SetDirectionAndFacing(#0000)
0450 GOTO 083d
}
0458 IF ((GetSpecial(0006) == #0015)) {
045f ActiveEntity.SetMeshCoordsXZ(#000c, #0011)
0465 ActiveEntity.SetCoordsInMeshXZ(#0e5d, #094a)
0469 ActiveEntity.SetDirectionAndFacing(#0000)
046a GOTO 083d
}
0472 IF ((GetSpecial(0006) == #0016)) {
0479 ActiveEntity.SetMeshCoordsXZ(#000e, #000d)
047f ActiveEntity.SetCoordsInMeshXZ(#061c, #0ce0)
0483 ActiveEntity.SetDirectionAndFacing(#0000)
0484 GOTO 083d
}
048c IF ((GetSpecial(0006) == #0017)) {
0493 ActiveEntity.SetMeshCoordsXZ(#0004, #000a)
0499 ActiveEntity.SetCoordsInMeshXZ(#141b, #1c3f)
049d ActiveEntity.SetDirectionAndFacing(#0000)
049e GOTO 083d
}
04a6 IF ((GetSpecial(0006) == #0018)) {
04ad ActiveEntity.SetMeshCoordsXZ(#0006, #000f)
04b3 ActiveEntity.SetCoordsInMeshXZ(#0f9f, #14e9)
04b7 ActiveEntity.SetDirectionAndFacing(#00bc)
04b8 GOTO 083d
}
04c0 IF ((GetSpecial(0006) == #0019)) {
04c7 ActiveEntity.SetMeshCoordsXZ(#0013, #000a)
04cd ActiveEntity.SetCoordsInMeshXZ(#03c0, #1f72)
04d1 ActiveEntity.SetDirectionAndFacing(#0000)
04d2 GOTO 083d
}
04da IF ((GetSpecial(0006) == #001a)) {
04e1 ActiveEntity.SetMeshCoordsXZ(#0013, #0008)
04e7 ActiveEntity.SetCoordsInMeshXZ(#0720, #171b)
04eb ActiveEntity.SetDirectionAndFacing(#00c0)
04ec GOTO 083d
}
04f4 IF ((GetSpecial(0006) == #001b)) {
04fb ActiveEntity.SetMeshCoordsXZ(#000f, #0008)
0501 ActiveEntity.SetCoordsInMeshXZ(#1817, #1d0b)
0505 ActiveEntity.SetDirectionAndFacing(#0000)
0506 GOTO 083d
}
050e IF ((GetSpecial(0006) == #001c)) {
0515 ActiveEntity.SetMeshCoordsXZ(#0011, #0008)
051b ActiveEntity.SetCoordsInMeshXZ(#1cf4, #10a9)
051f ActiveEntity.SetDirectionAndFacing(#0060)
0520 GOTO 083d
}
0528 IF ((GetSpecial(0006) == #001d)) {
052f ActiveEntity.SetMeshCoordsXZ(#0020, #0001)
0535 ActiveEntity.SetCoordsInMeshXZ(#0477, #16ad)
0539 ActiveEntity.SetDirectionAndFacing(#00e7)
053a GOTO 083d
}
0542 IF ((GetSpecial(0006) == #0020)) {
0547 IF (Bank0[007e].Bit(1)) {
054c IF (Bank0[007e].Bit(0)) {
0551 LoadAndInitModel(#0004)
0552 EnterVehicle()
}
0556 IF (Bank0[007e].Bit(2)) {
055b LoadAndInitModel(#0013)
055c EnterVehicle()
}
0560 IF (Bank0[007e].Bit(3)) {
0565 LoadAndInitModel(#0013)
0566 EnterVehicle()
}
056a IF (Bank0[007e].Bit(4)) {
056f LoadAndInitModel(#0013)
0570 EnterVehicle()
}
0574 IF (Bank0[007e].Bit(5)) {
0579 LoadAndInitModel(#0013)
057a EnterVehicle()
}
057e IF (Bank0[007e].Bit(6)) {
0583 LoadAndInitModel(#0013)
0584 EnterVehicle()
}
}
058a ActiveEntity.SetMeshCoordsXZ(GetSpecial(0000), GetSpecial(0001))
0590 ActiveEntity.SetCoordsInMeshXZ(GetSpecial(0002), GetSpecial(0003))
0594 ActiveEntity.SetDirectionAndFacing(GetSpecial(0004))
0595 GOTO 083d
}
059d IF ((GetSpecial(0006) == #0021)) {
05a2 IF (Bank0[007f].Bit(0)) {
05a7 IF (Bank0[007f].Bit(1)) {
05ac LoadAndInitModel(#0006)
05ad EnterVehicle()
}
}
05b3 ActiveEntity.SetMeshCoordsXZ(GetSpecial(0000), GetSpecial(0001))
05b9 ActiveEntity.SetCoordsInMeshXZ(GetSpecial(0002), GetSpecial(0003))
05bd ActiveEntity.SetDirectionAndFacing(GetSpecial(0004))
05be GOTO 083d
}
05c6 IF ((GetSpecial(0006) == #0022)) {
05cb IF (Bank0[007e].Bit(1)) {
05d0 IF (Bank0[007e].Bit(0)) {
05d5 LoadAndInitModel(#0004)
05d6 EnterVehicle()
}
05da IF (Bank0[007e].Bit(2)) {
05df LoadAndInitModel(#0013)
05e0 EnterVehicle()
}
05e4 IF (Bank0[007e].Bit(3)) {
05e9 LoadAndInitModel(#0013)
05ea EnterVehicle()
}
05ee IF (Bank0[007e].Bit(4)) {
05f3 LoadAndInitModel(#0013)
05f4 EnterVehicle()
}
05f8 IF (Bank0[007e].Bit(5)) {
05fd LoadAndInitModel(#0013)
05fe EnterVehicle()
}
0602 IF (Bank0[007e].Bit(6)) {
0607 LoadAndInitModel(#0013)
0608 EnterVehicle()
}
}
060e ActiveEntity.SetMeshCoordsXZ(GetSpecial(0000), GetSpecial(0001))
0614 ActiveEntity.SetCoordsInMeshXZ(GetSpecial(0002), GetSpecial(0003))
0618 ActiveEntity.SetDirectionAndFacing(GetSpecial(0004))
0619 GOTO 083d
}
0621 IF ((GetSpecial(0006) == #0024)) {
0626 LoadAndInitModel(#0008)
0627 SetCurrentEntityAsPlayerEntity()
0628 GOTO 083d
}
0630 IF ((GetSpecial(0006) == #0025)) {
0635 LoadAndInitModel(#0008)
0636 SetCurrentEntityAsPlayerEntity()
0637 GOTO 083d
}
063f IF ((GetSpecial(0006) == #0026)) {
0644 LoadAndInitModel(#0008)
0645 SetCurrentEntityAsPlayerEntity()
0646 GOTO 083d
}
064e IF ((GetSpecial(0006) == #0027)) {
0653 LoadAndInitModel(#0008)
0654 SetCurrentEntityAsPlayerEntity()
0655 GOTO 083d
}
065d IF ((GetSpecial(0006) == #0028)) {
0662 IF (Bank0[007f].Bit(2)) {
0667 LoadAndInitModel(#0005)
0668 EnterVehicle()
}
066e ActiveEntity.SetMeshCoordsXZ(#0006, #0013)
0674 ActiveEntity.SetCoordsInMeshXZ(#1c3b, #0268)
0678 ActiveEntity.SetDirectionAndFacing(#0000)
0679 GOTO 083d
}
0681 IF ((GetSpecial(0006) == #0029)) {
0686 IF (Bank0[007f].Bit(4)) {
068b LoadAndInitModel(#0003)
068c EnterVehicle()
}
0692 ActiveEntity.SetMeshCoordsXZ(#0014, #0011)
0698 ActiveEntity.SetCoordsInMeshXZ(#11d1, #18c9)
0699 GOTO 083d
}
06a1 IF ((GetSpecial(0006) == #002b)) {
06a8 ActiveEntity.SetMeshCoordsXZ(#000b, #0010)
06ae ActiveEntity.SetCoordsInMeshXZ(#095a, #1074)
06b2 ActiveEntity.SetDirectionAndFacing(#0080)
06b3 GOTO 083d
}
06bb IF ((GetSpecial(0006) == #002c)) {
06c2 ActiveEntity.SetMeshCoordsXZ(#000b, #000f)
06c8 ActiveEntity.SetCoordsInMeshXZ(#0f70, #0e98)
06cc ActiveEntity.SetDirectionAndFacing(#0000)
06cd GOTO 083d
}
06d5 IF ((GetSpecial(0006) == #002d)) {
06da IF (Bank0[007f].Bit(4)) {
06df IF (Bank0[007f].Bit(5)) {
06e4 IF (Bank0[0385].Bit(7)) {
06e9 LoadAndInitModel(#0013)
06ea EnterVehicle()
}
06ee LoadAndInitModel(#0003)
06ef EnterVehicle()
06f3 IF (Bank0[0385].Bit(6)) {
06fa ActiveEntity.SetMeshCoordsXZ(#0010, #0004)
0700 ActiveEntity.SetCoordsInMeshXZ(#0033, #0f8b)
0706 WRITE Bank0[0385].Bit(6) = #0000
}
}
}
0707 GOTO 083d
}
070f IF ((GetSpecial(0006) == #002e)) {
0716 ActiveEntity.SetMeshCoordsXZ(#000a, #0010)
071c ActiveEntity.SetCoordsInMeshXZ(#1707, #07e3)
0720 ActiveEntity.SetDirectionAndFacing(#00e8)
0721 GOTO 083d
}
0729 IF ((GetSpecial(0006) == #002f)) {
0730 ActiveEntity.SetMeshCoordsXZ(#000f, #0008)
0736 ActiveEntity.SetCoordsInMeshXZ(#182b, #161f)
073a ActiveEntity.SetDirectionAndFacing(#0080)
073b GOTO 083d
}
0743 IF ((GetSpecial(0006) == #0030)) {
074a ActiveEntity.SetMeshCoordsXZ(#0010, #0006)
0750 ActiveEntity.SetCoordsInMeshXZ(#13d9, #1420)
0754 ActiveEntity.SetDirectionAndFacing(#00e3)
0755 GOTO 083d
}
075d IF ((GetSpecial(0006) == #0031)) {
0768 Op319(((GetSpecial(0007) & #00fc) | #0002))
076e ActiveEntity.SetMeshCoordsXZ(#000a, #000e)
0774 ActiveEntity.SetCoordsInMeshXZ(#0a37, #0fc1)
0778 ActiveEntity.SetDirectionAndFacing(#0080)
0779 GOTO 083d
}
0781 IF ((GetSpecial(0006) == #0033)) {
0786 IF (Bank0[007f].Bit(4)) {
078b LoadAndInitModel(#0003)
078c EnterVehicle()
0790 LoadAndInitModel(#000a)
}
0791 GOTO 083d
}
0799 IF ((GetSpecial(0006) == #0035)) {
07a0 ActiveEntity.SetMeshCoordsXZ(GetSpecial(0000), GetSpecial(0001))
07a6 ActiveEntity.SetCoordsInMeshXZ(GetSpecial(0002), GetSpecial(0003))
07aa ActiveEntity.SetDirectionAndFacing(GetSpecial(0004))
07ab GOTO 083d
}
07b3 IF ((GetSpecial(0006) == #0036)) {
07b8 IF (Bank0[0352].Bit(2)) {
07bd LoadAndInitModel(#000d)
07be EnterVehicle()
}
07c4 ActiveEntity.SetMeshCoordsXZ(#0014, #0011)
07ca ActiveEntity.SetCoordsInMeshXZ(#0fe1, #1880)
07ce ActiveEntity.SetDirectionAndFacing(#00c0)
07cf GOTO 083d
}
07d7 IF ((GetSpecial(0006) == #0037)) {
07de ActiveEntity.SetMeshCoordsXZ(#000b, #0016)
07e4 ActiveEntity.SetCoordsInMeshXZ(#0b50, #0247)
07e8 ActiveEntity.SetDirectionAndFacing(#0000)
07e9 GOTO 083d
}
07f1 IF ((GetSpecial(0006) == #0039)) {
07f8 ActiveEntity.SetMeshCoordsXZ(#0013, #000a)
07fe ActiveEntity.SetCoordsInMeshXZ(#1d13, #0f0c)
0802 ActiveEntity.SetDirectionAndFacing(#0080)
0803 GOTO 083d
}
080b IF ((GetSpecial(0006) == #003a)) {
0812 ActiveEntity.SetMeshCoordsXZ(#0013, #000a)
0818 ActiveEntity.SetCoordsInMeshXZ(#19f2, #00f9)
081c ActiveEntity.SetDirectionAndFacing(#0019)
081d GOTO 083d
}
0825 IF ((GetSpecial(0006) == #003b)) {
082a IF (Bank0[007f].Bit(4)) {
082f LoadAndInitModel(#0003)
0830 EnterVehicle()
0836 ActiveEntity.SetMeshCoordsXZ(#0010, #0004)
083c ActiveEntity.SetCoordsInMeshXZ(#0033, #0f8b)
}