Ok. Props to Square for this game.
The basic working is as follows.
There's a gameworld. It is 256 positions wide, about 100 positions high and x positions deep. It's a scrolling game, you can't stop (but you can slow down and speed up).
You only see half of the width of the game at one time. You only see 128 positions in front of you (after that is the horizon). Enemies come to you in four steps. These steps are synchronus to the tiles on the ground. One tile is 32 positions width and deep.
Now the game works in lines. There are 8 basic lines (0x00, 0x20 ... 0xC0, 0xD0) and enemies and objects are usually stationed on them (not all of them). There are horizontal lines, every 32 steps there is a horizontal line. A lot of enemies are restricted to these lines (tougher enemies in later worlds have some more freedom, but all enemies are restricted to a 64x64 bound or 2by2 tiles!).
To get the position of enemies and other objects is very tricky. There is a lookup tabel of 16 objects (0x0500-0x05FF). Each object has a horizontal and vertical starting position as well as a z-position relative to yourself. In the lookup table are two fields that denote a cycle. One is for the position, one is for the tile of the object. It runs in cycles. To calculate the position of an object, one has to know the starting position of the object, know it's pattern (most enemies have patterns of 0x3F 0x7F or 0xFF steps) and compute the position in that pattern, then add that position to the start position and the offset. If you manage to do all that, you should have the position of the object.
It's also possible I'm overlooking some other table that holds the actual positions :p But for now, I'm done with this game.
PS. If you want to debug, I suggest you freeze the memory locations for time, countdown timer for invincibility, turn on invincibility and make use of controlling the forward position (0x0052 and 3). Also note that the game does not scrollback. Once you move too far forward, anything in the past is forgotten (adjusting your forward position is possible, just doesn't lead to anything usefull).
|Internal Data for 3-D WorldRunner|