Movement
The game does not have any subpixels. All movements are done in whole pixels. For horizontal speed, the game keeps a counter which cycles seven values: 1, 1, 2, 1, 1, 2, 2. This works out as 10 pixels over 7 frames or ~1.43 pixels per frame. (Why the designers didn't just make it alternate between 1 and 2 for a mean speed of 1.5 is anyone's guess, but everyone who participated in the DTC hated them for it.)
The speed counter advances for every frame the player walks, and every frame the player is in the air, regardless if moving horizontally or not. The speed counter also advances when pressing against a wall on the ground, even if no actual horizontal movement is made. The speed counter pauses when standing still or climbing a ladder. The speed counter resets every mission.
Small improvements are easily lost to the whims of the speed cycle god.
Other than this speed cycle the game is very hex edit friendly.
Basically the movement works like this:
Main Counter | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|
Move Flag | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2nd Counter | 7 | 7 | 7 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 |
3rd Counter | 3 | 3 | 3 | 3 | 3 | 2 | 1 | 3 | 2 | 1 | 3 | 3 | 2 | 1 | 3 | 2 | 1 | 3 | 3 | 2 | 1 | 3 | 2 | 1 | 3 | 3 | 2 | 1 | 3 | 2 | 1 | 3 | 3 | 2 | 1 | 3 |
Speed | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 |
Displacement | 0 | 0 | 0 | 0 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 2 |
Tricks
If you pause on the frame you touch the trigger for a scrolling transition, the
game will load the data associated with it (camera bounds, new transitions, etc)
without actually starting the scrolling itself. This is only useful for one-way
transitions, however, as two-way transitions actually consist of two transitions,
and touching the last one will cause the old room exits to be loaded, preventing
you from progressing any further in the game.
Speed cycle advancing
Similar to the scrolling skip, pausing when triggering a black transition has
strange effects. In this case, pausing and immediately unpausing the game does
not delay the next room load. It does, however, allow the game to advance one
more frame before entering the next room. In the TAS, this is used to advance
the speed cycle to a more favourable phase.
Corner boosting
Jumping or falling into a ceiling or floor corner whilst moving away from it
allows you to slightly pass through said corner. If you let go of the direction
key you were holding, the game will push you out of the block, advancing you
a maximum of 4 pixels at a time. For ceiling boosts, a maximum of 8 pixels (over
2 frames) is possible, for floor boosts this is 6.
Ladder zipping
You can grab onto ladders when you're 16 pixels away from their centre. Due to
this, it is often faster to grab onto a ladder and let go immediately, as this
will move you forward ~16 pixels, at the cost of not moving a single frame.
Low ladder grabs
When approaching a ladder going down from the floor you are on, you can grab it a few pixels lower than you would by just walking up to it. To do this, jump before the ladder, and land on the ground on the same frame as you grab the ladder. The downward speed will be applied once before grabbing the ladder. It is better to be as close as possible (1 pixel above) the ground on the frame before grabbing. For this reason, some jump heights are better than others, and 8 and 11 are best when possible.
Jump height | Pixels gained |
---|
no jump | 0 |
1 | 0 |
2 | 0 |
3 | 2 |
4 | 2 |
5 | 1 |
6 | 2 |
7 | 2 |
8 | 3 |
9 | 0 |
10 | 1 |
11 | 3 |
12 | 0 |
13 | 0 |
14 | 0 |
Wall jumps
When passing through a downward corner, instead of releasing forward to corner boost, you can press backward. Under some circumstances, depending on jump height and pixel position, you will enter the standing animation for one frame, and can jump again from this position. The possible applications are very limited.