View Page Source

Revision (current)
Last Updated by admin@tasvideos.org on 1/1/2022 6:13 PM
Back to Page

!!!"Locked" jumps:
If some tile is adjacent to either burning block or empty space, then jumps can "lock" onto that edge. This can be good or bad, depending on what edge is "locked".

If left or right edge are locked, then the jump will be horizontally either shorter or longer, depending on where the edge is relative to ship.

If the far edge is locked onto then you will slow down (this is bad, but sometimes unavoidable). But if the near edge is locked onto, you will speed up (good thing, but only possible if your speed is below the maximum).

Note that your height at the time of jump is taken correctly into account, but the height of the block at target isn't. So trying to lock onto the near edge of block is almost suicidal and the far edges of blocks tend to lock when you don't want it (especially with tall blocks)

Finding the optimum places for locked jumps is tricky because earlier suboptimal locked jump may yield better position for the next locked jump, yielding net improvement in time. Also sometimes delaying the jump for 1 frame can yield a faster time.

Locked jumps are known to be possible up to 700 units gravity and as far as it is known, are not possible with 900 units gravity. No standard level has the only possible intermediate gravity (800 units), so behavior with 800 gravity has not been tested.

!!Racing against the lock:

"Racing against the lock" is variant of locked jump, useful when jumping onto block locking either to the near or far edge. In this variant, brake momentarily before "Jump-O-Master: idle" changes to "Jump-O-Master: in use", then start to accelerate again. The game calculates the jump as you were decelerating, but executes it with you actually accelerating.

This is useful for reducing time loss due to spurious lock onto the far edge of block and also useful for getting the near edge lock without blowing up (do this from jump bounce, since even short blocks are too tall otherwise).

!!!When one can jump:

The game maintains a flag telling if there is jump in progress. This flag gets set if you start a jump and is cleared on any hit to ground, even if ship is above void at time of landing (one of the engines hits adjacent block). So for purposes of jump, post-jump bounces count as being on the ground.

Additionally (from the requirement that the game must not consider jump to be in progress) when jumping, there must be some kind of ground below. It can be any type of ground, even burning. Note that 1700 gravity disables jumping completely.

Certain invalid values for gravity cause any attempt at jumping to end in death (by overflowing the height value).

!!!Steering in air

If you could jump and are not in bounce from slippery floor, you can steer the ship. This is sometimes useful.

!!!Riding kill floors:

Floor effects of the special tile types are only in effect to ship if ship touches the ground[#1] and if X and Y coordinates are within the special tile. Thus one can bounce above kill floor and not be destroyed and also ride on edge of a kill floor (with ship supported by one engine) and not be destroyed.

It is possible to push the ship on top of a burning block and jump from it even if horizontally adjacent block is void. But that sort of jump drifts a bit, so one has to have enough height to push the bounce far enough.

!!!Taking "damage":

If ship hits tunnel edge or block in suitable manner, it will be quickly ejected horizontally and not destroyed. This slows you down (causing loss of about one frame), but some places you would have to slow much more to avoid the impact. Note that vertical ejections do not happen, if one would be required, you either stop or be destroyed.

Each hit is independent. There is no hit counter and no hitpoints. So each hit either kills you or not, independently of others.

!!!Jumping from and to tunnels:

It is possible to both jump into and out of tunnels without requiring an extra block. Both require frame-precise timing. For jumping out of tunnel, simply do the jump on the last frame the ship is in the tunnel.

Note that jumps into tunnel that have horizontal momentum are much harder and will likely scratch the ship a bit (giving you bit of slowdown).

!!!Keeping as much speed in pipes with slowdown floors as possible:

Best way to keep speed in pipes that have slowdown floors is to hold space (jump). The ship jumps a lot, cutting the contact to slowdown floor. This won't prevent slowdown but reduces it.

!!!Fuel use:
The only thing that determines fuel use is speed. Jumping and steering do not use fuel. The more speed you have, the more fuel per frame ship uses (fuel use also varies between levels).

When looking at fuel needed for covering some distance, the result is sawtooth pattern with different sized peaks since fuel consumption is discretized to integer decrements (the only standard level this matters in a TAS is Druidia Road 1 of the original game).

!!!Numeric parameters
||Parameter||Value||
|Normal Acceleration or Deceleration|75 units/(frame)^2|
|Slowdown due to glancing blow|151 units/frame|
|Maximum possible speed|10922 units/frame|
|Tile subdivisions (longitudinal)|65536 units/block|
|Tile subdivisions (horizontal)|5888 units/block|
|Tile subdivisions (height)|2560 units/block|
|Base height|10240 units|
|Center horizontal|32768 units|
|Frame rate|59659/1657 fps = 36.00422450211225105... fps|
|Horizontal step (normal)|(29*<speed>+45240)/512 units [#2]|
|Horizontal step (on sticky floor)|(29*<speed>)/512 units [#2]|
|Oxygen usage|30000/(36*<per-level-constant>) units/frame[#2][#3]|
|Fuel usage|floor(30000/<per-level-constant>)*<speed>/65536 units/frame[#2][#3]|
|Horizontal ejection|928 units|


!!!Memory addresses
These all are relative to Data segment base, which can vary in memory.

Value 0x0BE70 has been seen in Skyroads and 0x0BE80 in Skyroads Xmas Special.

||Address||Size||Description||
|0BA2|Byte|Bit 7 set if Up pressed (set by IRQ1)|
|0BA3|Byte|Bit 7 set if Down pressed (set by IRQ1)|
|0BA4|Byte|Bit 7 set if Left pressed (set by IRQ1)|
|0BA5|Byte|Bit 7 set if Right pressed (set by IRQ1)|
|0BA6|Byte|Bit 7 set if Up-Left pressed (set by IRQ1)|
|0BA7|Byte|Bit 7 set if Up-Right pressed (set by IRQ1)|
|0BA8|Byte|Bit 7 set if Down-Left pressed (set by IRQ1)|
|0BA9|Byte|Bit 7 set if Down-Right pressed (set by IRQ1)|
|0BAA|Byte|Bit 7 set if Space pressed (set by IRQ1)|
|0BAB|Byte|Bit 7 set if Escape pressed (set by IRQ1)|
|0BAC|Byte|Bit 7 set if P pressed (set by IRQ1)|
|160C|Word|Frame tick counter (incremented by IRQ0)|
|41CE|Word|Track length|
|4566|Word|Number of frames after death (0 if alive or just died)|
|4568|Word|1 if locked jump is active, 0 otherwise|
|456E|Word|Gravity|
|4574|Word|Amount of oxygen|
|4576|Word|Horizontal speed (signed)|
|4578|Word|0 if ship hasn't blown up, otherwise number of frames after blowup + 1|
|457C|Word|Cause of death (0: Still alive, 1: Collided, 2: Touched burning, 3: Drifting in space, 4:Out of fuel, 5:Out of oxygen)|
|5488|Word|Active controls (nonzero: try to jump, zero: don't jump)|
|54A0|Word|Fuel left (30000 is full load)|
|54A2|Word|Horizontal drift speed (signed)|
|54AE|Word|Amount of fuel|
|54B8|Dword|Longitudinal speed|
|54B6|Word|Acceleration of gravity (signed, always negative)|
|933C|Word|Active controls (1: Try to accelerate, 0: Neutral, -1: Try to decelerate)|
|9342|Word|Vertical speed (signed)|
|9600|Word|Active controls (1: Steer right, 0: Go straight, -1: Steer left)|
|9602|Word|Controller (0: Keyboard, 1: Joystick, 2: Mouse, 3: Demo)|
|9628|Dword|Longitudinal position|
|AF2C|Word|Horizontal position|
|AF3C|Word|Vertical position (signed)|
|AF3E|Dword|Temporary extra jump speed (not shown in speed gauge, lost after jump ends)|
|B14C|Word|Oxygen left (30000 is full load)|
|B8EE[#4]|Word|Direction ship is partially unsupported (-1: left, 0: none, 1: right)
|B8F0[#4]|Dword|Projected longitudinal position|
|B8F4[#4]|Word|Projected vertical position (signed)|
|B8F6[#4]|Word|Projected horizontal position|
|B8F8[#4]|Word|How much the ship is on top of nothing?
|B8FE[#4]|Word|1 if ship is on top of nothing, 0 otherwise|
|B900[#4]|Word|1 if ship is on sticky floor, 0 otherwise.
|B902[#4]|Word|1 if slippery floor effect is active, 0 otherwise.|
|B904[#4]|Word|1 if ship is on ground, 0 otherwise
|B906[#4]|Word|Jump base height|
|B908[#4]|Word|Set to 1 when ship is in jump|
|B90A[#4]|Word|Normally 0, but set to 1 after jump has tried to lock|
|B90E[#4]|Word|Frames done counter|



----
[1] Slippery is special. Its effect lasts until you hit ground on non-slippery block. 

[2] If accelerating or slowing down, uses the speed post-change. Truncated to an integer.

[3] Oxygen and fuel start from 30000. The constants come from level data.

[4] BP-relative. BP=B910 assumed here.