Back to Page
Revision 183 (current)
Edited by adelikat on 1/17/2022 12:25 AM
[https://files.tasvideos.org/gameresources/dos/jetpack/logo.png|right]
%%TOC%%
!!! About Editing This Page
It might be a good idea to join [IRCChannel|the TASVideos IRC channel], which lets you see changes being made in real time and coordinate your work with others. Also check the ToDo section for ideas for what needs to be done, marking the item off if you're going to do it.
!!! Game Info
* [http://www.adeptsoftware.com/jetpack/|Official site] - Download game for free, manual, hint book.
** Only use this freeware version from Adept Software (Adam Pedersen) v1.5 - ''jetpak15.zip''.
* [Forum/Topics/9497|Discussion thread]
* [https://files.tasvideos.org/gameresources/dos/jetpack/jetpack_levels.zip|Level pack] to play with in level editor.
** Using this pack, you can jump directly to any level, view false blocks, play it, or even edit it.
* Game speed is not emulated properly in JPC-RR at current. All speeds (except the highest, which is far too fast) are speed 8.
!! Debugging Codes
* Extra Life: ''TAB + 2 + L''
* Fuel Refill: ''TAB + 2 + F''
* Invincibility: ''TAB + 2 + I'' ((For the entire duration of the current level.))
* Skip Level: ''TAB + 2 + S''
!! JPC-RR Image
+IMAGEMD5 e4287f2e7f9d079de869be13eeb18642
+COMMENT(Entry: N/A N/A 20 /)
+COMMENT(Vname: 19900101000000 N/A 0 jetpack)
+COMMENT(Entry: 19900101000000 ec918833fd1032a59cda01d8d5eac55f 2306 /JETDEMO.DAT)
+COMMENT(Entry: 19900101000000 2fb5d8421b228975b622162be33a6b4d 50602 /JETLEV.DAT)
+COMMENT(Entry: 19900101000000 351d5f7893180e2925901c10b29dc1b6 141152 /JETPACK.EXE)
+COMMENT(Entry: 19900101000000 1d1d658ed7e42225be4af6ad69afca7c 43559 /JETPACK0.DAT)
+COMMENT(Entry: 19900101000000 a8f4cc17364adf2c51de655508d59eb8 30487 /JETPACK1.DAT)
+COMMENT(Entry: 19900101000000 8f0b6d6797346fffd3a3c49782787508 33739 /JETPACK2.DAT)
+COMMENT(Entry: 19900101000000 1d9472cea0da9bb049f40a27d71d9c25 38840 /JETPACK3.DAT)
+COMMENT(Entry: 19900101000000 5944201eb8e997db20f57d7c3137710b 21048 /JETPACK4.DAT)
+COMMENT(Entry: 19900101000000 70d1ab65d2807e59f76ba4cbcedd3447 17686 /JETPACK5.DAT)
+COMMENT(Entry: 19900101000000 a958ca5da57a325119d3cbac70b116e5 785 /JETPAL.DAT)
+COMMENT(Entry: 19900101000000 8a70bb766a132bed263ebb7df53ccaf0 72273 /JETSOUND.DAT)
+COMMENT(Entry: 19900101000000 4b753c31504703a90bf1bfc737f1a4fb 11182 /JSWITCH.EXE)
+COMMENT(Entry: 19900101000000 eee0c3907ac09624f7546ddd1464b266 40235 /SCLM.DAT)
+COMMENT(Entry: 19900101000000 93b885adfe0da089cdf634904fd59f71 1 /_JETP_.DAT)
+COMMENT(Entry: 19900101000000 3effbc43f424e28b2df650830ef05f9a 15 /_JETP_A.DAT)
+COMMENT(Entry: 19900101000000 1d1d658ed7e42225be4af6ad69afca7c 43559 /_JETP_A0.DAT)
+COMMENT(Entry: 19900101000000 50ae15f8c01a635f9de9e8c2a0a1c8fe 17 /_JETP_B.DAT)
+COMMENT(Entry: 19900101000000 2f17ff3db151a0bae81b0902491ca5e7 43704 /_JETP_B0.DAT)
+COMMENT(Entry: 19900101000000 0bf84430538b172a7d32530361209e4d 15 /_JETP_C.DAT)
+COMMENT(Entry: 19900101000000 4c310670bdab05b99b77de2a9b8331fd 42811 /_JETP_C0.DAT)
!!! Naming Conventions
You're not expected to adhere to these terms 100% of the time. They're meant more as just the default option. It's always okay to spell things out fully as well.
Officially the tiles are called just that, tiles, but I think when talking about solid tiles, you can also say "block".
*The coordinate system: (1,1) is the top left tile, (26,16) the bottom right, but negative numbers may be used for shorthand, i.e. the bottom right can be denoted (-1,-1) also.
*Levels should be called "[[Level]] 0-99" as is done in-game, or by their names of course, to avoid confusion.
*the RP - This (Game Resources) Page.
*the Discussion Thread [[DT]] - linked under "Game Info"
*Enemies - also "monsters" (see Enemies section)
*phasing - phasing out blocks
*phase in/phase out - what blocks do when phased
*flying - using the jetpack to move
*running/walking - these are both ok
*trapping - you can trap enemies inside phasing-in blocks
*bonus item - the single tanks, shields and stunners randomly appearing in levels
*tricks: (see tricks section for details on how they work)
**"delay-phasing"
***This is when you phase out a block in more than one go.
**"pre-phasing"
***This is to phase out a block that you will only pass through later. (see 01 "The Teleporter")
**"phase-climbing"
***Using a phasing-in block or barrier as a "stepping stone" for climbing higher or to enable a jump.
**"alt-dropping"
***Leaving down the alt key for a higher horizontal speed or lower falling speed when walking off ledges.
**"wiggling"
***Changing directions rapidly in order to preserve horizontal speed in a narrow shaft or otherwise.
**"instant drop-off"
***Briefly phasing horizontally to be able to drop off a ladder without jumping upward.
|[https://files.tasvideos.org/gameresources/dos/jetpack/guy.png]|Jetman| |The name is mentioned once in the hintbook.|
||Items||Manual/Official Name||Recommended Alias||Information||
|[https://files.tasvideos.org/gameresources/dos/jetpack/emerald_gem.png]|Emerald Gem|Gem| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/tank_of_fuel.png]|Single Tank of Fuel|[[single]] tank| 5000 units of fuel |
|[https://files.tasvideos.org/gameresources/dos/jetpack/double_tank.png]|Double Tank of Fuel|d[[ouble]] tank| 10000 units of fuel |
|[https://files.tasvideos.org/gameresources/dos/jetpack/stunner.png]|Monster Stunner|Stunner| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/shield.png]|Shield| | Only appears randomly |
|[https://files.tasvideos.org/gameresources/dos/jetpack/gold_coin.png]|Gold Coin| | 10 points |
|[https://files.tasvideos.org/gameresources/dos/jetpack/pile_of_gold.png]|Pile of Gold| | 25 points |
|[https://files.tasvideos.org/gameresources/dos/jetpack/golden_vase.png]|Golden Vase| | 50 points |
|[https://files.tasvideos.org/gameresources/dos/jetpack/extra_life.png]|Extra Life| | 100 points in addition to the extra life|
||Other Features|| || || ||
|[https://files.tasvideos.org/gameresources/dos/jetpack/charger.png]|Energy Charger|Charger| adds 30 units of fuel per frame |
|[https://files.tasvideos.org/gameresources/dos/jetpack/drain.png]|Energy Drain|Drain| drains 20 units of fuel per frame |
|[https://files.tasvideos.org/gameresources/dos/jetpack/spear.png]|Hidden Spear|Spear| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/spikes_down.png] [https://files.tasvideos.org/gameresources/dos/jetpack/spikes_left.png] [https://files.tasvideos.org/gameresources/dos/jetpack/spikes_up.png] [https://files.tasvideos.org/gameresources/dos/jetpack/spikes_right.png]|Stationary Spikes|Spikes| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/yellow_tele.png] [https://files.tasvideos.org/gameresources/dos/jetpack/purple_tele.png] [https://files.tasvideos.org/gameresources/dos/jetpack/green_tele.png]|Teleporter (Yellow, Purple, Green)|Y-,P-,G-tele[[porter]]| 20 frames |
|[https://files.tasvideos.org/gameresources/dos/jetpack/red_button.png][https://files.tasvideos.org/gameresources/dos/jetpack/red_button_depressed.png] [https://files.tasvideos.org/gameresources/dos/jetpack/blue_button.png][https://files.tasvideos.org/gameresources/dos/jetpack/blue_button_depressed.png] [https://files.tasvideos.org/gameresources/dos/jetpack/green_button.png][https://files.tasvideos.org/gameresources/dos/jetpack/green_button_depressed.png]|Button (Red, Blue, Cyan)|R-,B-,G-button|you can call it green instead of cyan.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/red_switch.png][https://files.tasvideos.org/gameresources/dos/jetpack/blue_switch.png][https://files.tasvideos.org/gameresources/dos/jetpack/green_switch.png]|Floor Switch (Red, Blue, Cyan)|R-,B-,G-switch|You can call it green instead of cyan. Both enemies and Jetman toggle when they touch the switch.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/red_barrier.png][https://files.tasvideos.org/gameresources/dos/jetpack/blue_barrier.png][https://files.tasvideos.org/gameresources/dos/jetpack/green_barrier.png]|Barrier (Red, Blue, Cyan)|R-,B-,G-barrier|You can call it green instead of cyan.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/ladder.png]|Ladder| | |
|[https://files.tasvideos.org/gameresources/dos/jetpack/uladder.png] [https://files.tasvideos.org/gameresources/dos/jetpack/dladder.png]|Moving Ladder|Up/Down Ladder|These look the same with the animation running in opposite directions. This makes them difficult to tell apart in screenshots. In the big .png's on the levels subpages, the end with the grey pixels indicates the direction the ladder is scrolling. In the smaller, in-editor shots it's the end that has the white pixels.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/door.png] [https://files.tasvideos.org/gameresources/dos/jetpack/door_open.png]|Door/Exit| |Has to open fully for exiting the level. This takes a little while, which may affect routing.|
||Blocks|| || ||Phase time/Reset time||
|[https://files.tasvideos.org/gameresources/dos/jetpack/crate.png]| |Box/Crate| 5 frames / N/A |
|[https://files.tasvideos.org/gameresources/dos/jetpack/steel_barrier.png]|Steel Barrier|Purple| 5 frames / 20 frames |
|[https://files.tasvideos.org/gameresources/dos/jetpack/lred.png]|Light Red Bricks|l-red| 26 frames / 94 frames |
|[https://files.tasvideos.org/gameresources/dos/jetpack/dred.png]|Dark Red Bricks|d-red| 56 frames / 226 frames
|[https://files.tasvideos.org/gameresources/dos/jetpack/stone.png]|Stone| | N/A / N/A |
|[https://files.tasvideos.org/gameresources/dos/jetpack/golden.png]| |Gold[[en Block]]| N/A / N/A |
|[https://files.tasvideos.org/gameresources/dos/jetpack/panel.png]|?|Panel| N/A / N/A |
||Special Blocks|| || ||Information||
|[https://files.tasvideos.org/gameresources/dos/jetpack/left_conv_lred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/left_conv_dred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/left_conv_stone.png]|Moving Platform (Left)|Conveyor|The direction the stripes are leaning indicates which direction the conveyor moves.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/right_conv_lred1.png] [https://files.tasvideos.org/gameresources/dos/jetpack/right_conv_dred1.png] [https://files.tasvideos.org/gameresources/dos/jetpack/right_conv_stone.png]|Moving Platform (Right)|Conveyor| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/mossy_lred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/mossy_dred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/mossy_stone.png]|Sludgy Tiles|Moss/Mossy l-red, d-red or stone| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/icy_lred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/icy_dred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/icy_stone.png]|Icy Tiles|Ice/Icy l-red, d-red or stone| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/secret_lred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/secret_dred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/secret_stone.png] [https://files.tasvideos.org/gameresources/dos/jetpack/secret_panel.png]|Mirage Bricks/Stone, Secret/Hidden Passage|e.g. Mirage l-red, Mirage Panel or Hidden Passage| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/rounded_lred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/rounded_dred.png] [https://files.tasvideos.org/gameresources/dos/jetpack/rounded_stone.png]| |Rounded L-red/D-Red/Stone|Actually has the same hitbox as non-rounded blocks.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/reinforced_lred_horiz.png] [https://files.tasvideos.org/gameresources/dos/jetpack/reinforced_lred_vert.png] [https://files.tasvideos.org/gameresources/dos/jetpack/reinforced_dred_horiz.png] [https://files.tasvideos.org/gameresources/dos/jetpack/reinforced_dred_vert.png]| |Reinforced L-Red/D-Red| |
||Background/Foreground|| || || ||
|[https://files.tasvideos.org/gameresources/dos/jetpack/background.png]| |Background| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/black.png]| |Space/Black| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/column.png]|Column| | |
|[https://files.tasvideos.org/gameresources/dos/jetpack/vine.png]|Jungle/Vines/Ivy|Vines| |
|[https://files.tasvideos.org/gameresources/dos/jetpack/fence.png]| |Fence| |
Technical:
* sp/f - subpixels per frame.
* sp/f^2 - subpixels per frame squared.
* hspeed - Horizontal speed.
* vspeed - Vertical speed.
!!! Open Game-Related Questions
_(remove once answered and add answer to relevant section)_
* How do trackbots "track" you exactly, what rules do they follow?
* How do the random powerups work?
**Found to have something to do with "busyness", also the higher the level number the more of them?
* How long does a stunner last? Do they stack?
* How long does a shield last?
* How does the game decide what barriers are enabled initially? I.I.R.C. it checks the provided buttons, if any. But how exactly does that go?
* What are the enemy speeds on conveyor belts?
* How long does the victory dance take? It should be checked that there's no variance here.
!!! Game Data
!! Measurements
* Levels are 26 blocks wide.
* Levels are 16 blocks high.
* 1 block is 24 pixels.
* 1 pixel is 16 subpixels.
* 1 block is therefore 384 subpixels.
* Height of Jump is 565 subpixels.
* Distance of Jump is 1117 subpixels if it lasts 32 frames which is the longest possible jump on flat ground. Sometimes the Y-subpixels make the jump shorter.
!! Speeds
* Jetpack up terminal speed: 64 sp/f.
* Fall down terminal vspeed: 64 sp/f.
* Fall down terminal hspeed: 20 sp/f.
* Jetpack terminal hspeed: 64 sp/f.
* Walking speed: 55 sp/f.
* Walking speed with conveyor: 60 sp/f.
* Walking speed against conveyor: 25 sp/f.
* Walking on moss: 32 sp/f.
* Jump initial speed up: 68 sp/f.
* Jump initial hspeed: 62 sp/f.
* Climbing ladders: 45 sp/f (normal)
* Climbing ladders: 20 sp/f (against)
* Climbing ladders: 64 sp/f (with motion)
* Phasing alignment (movement to center of nearest block): 32 sp/f
!! Acceleration:
* Jump horizontal deceleration: 2 sp/f^2
* In-air horizontal acceleration: 3 sp/f^2 (hspeed >20 sp/f, can undershoot)
* In-air horizontal acceleration: 5 sp/f^2 (hspeed <=20 sp/f).
* Acceleration of gravity: 5 sp/f^2 (jumping)
* Acceleration of gravity: 6 sp/f^2 (jetpack cutoff)
* Jetpack vertical acceleration: 4 sp/f^2.
* Jetpack horizontal acceleration: 6 sp/f^2.
[http://i.imgur.com/V1Y9QrR.png]
[http://i.imgur.com/rPddg3a.png]
[https://dl.dropboxusercontent.com/u/30177754/jetpackdata.xls|Excel file available here.]
!! Border cases:
* 1st frame of running jump: 55,-68 sp/f (yes, 55, not existing hspeed).
* 2nd frame of running jump: 62,-68 sp/f
* 1st frame of jetpacking adds hspeed iff already moving horizontally.
* 1st frame of cliff runoff: 5,-64 sp/f (if holding jump, normal jump acceleration on this frame).
!! Phasing
* Phasing a pink block: 5 frames.
* Phasing a light red brick: 26 frames.
* Phasing a dark red brick: 56 frames.
* Phasing a crate: 5 frames.
* Return of a pink block: 20 frames.
* Return of a light red brick: 94 frames.
* Return of a dark red brick: 226 frames.
!! Fuel
* Full tank: 10000 units.
* Half tank: 5000 units.
* Fuel usage: 10 units/frame.
* Charger recharge rate: 30 units/frame.
* Fuel drain drain rate: 20 units/frame.
!! Jetman hitbox relative to his coordinates
* Left edge: X-384
* Right edge: X-32
* Top edge: Y-416
* Bottom edge: Y
!! Misc
* Teleporting: 20 frames in and out.
* Exit door opening: 38 frames. (after collecting final gem)
!!! Randomness
Uses Borland C / Turbo C++'s rand() function. Which is a [http://en.wikipedia.org/wiki/Linear_congruential_generator|LCG PRNG], which works as follows:
uint32_t seed; //Seed is 32 bits
int rand()
{
seed = seed*22695477 + 1; //Seed multiplies and adds, and possibly overflows
return (seed >> 16) & 32767; //Use bits 16-30 for requested random value
}
Using the phaser (even if not trying to phase anything) uses RNG throws. This can be used for luck manipulation. Due to the rarity of the bonus items, it is difficult to manipulate those. However, manipulating random enemy AIs is feasible. This includes trackbots and flitzers.
!!! Enemies
*Any enemy affected by gravity (Trackbots and Steel Balls) has a falling speed of 64 sp/f with no acceleration (speed is achieved immediately). Any monster apart from bats and homers can activate switches that they happen upon.
|| ||Name||Speed||Behavior||
|[https://files.tasvideos.org/gameresources/dos/jetpack/trackbot.png]|Trackbot|Horizontal: 43 sp/f, Vertical (ladder): 33 sp/f |Affected by gravity. Generally heads in your direction. It can change direction after teleporting. Makes somewhat random decisions at ladder/floor intersections - these can be manipulated through phaser usage, although some decisions cannot be changed. Being on the left/right of the bot makes it go that way at a left/right fork.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/ball.png]|Steel Ball / Marble|Horizontal: 59 sp/f |Affected by gravity. Reverses horizontal direction when it hits a wall. Does not fall through ladders. More about their movement in the section titled "Marble Movement". |
|[https://files.tasvideos.org/gameresources/dos/jetpack/spring.png]|Spring|Vertical: 50 sp/f |Reverses vertical direction when it hits a surface. Takes 5 frames to reverse direction. |
|[https://files.tasvideos.org/gameresources/dos/jetpack/missile.png]|Missile|Horizontal and vertical: 64 sp/f |Does a 90 degree clockwise turn when it hits a wall.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/spinner.png]|Spikes / Spinner|Horizontal and vertical: 20 sp/f |Moves diagonally at all times. Bounces at a 90 degree angle when it hits a surface, and will reverse direction completely if it hits a corner perfectly. The initial direction is random and must be manipulated before the previous level's exit.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/flitzer.png]|Flitzer|Horizontal and vertical: 11 sp/f |Randomly moves in one of eight directions. Changes direction when it hits a wall, otherwise changes direction every 8 frames.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/bat.png]|Batbot|Horizontal: 10 sp/f, Vertical: 17 sp/f |Will head in your direction once it hits a surface, the movement is not random. Capable of moving diagonally. Cannot activate switches.|
|[https://files.tasvideos.org/gameresources/dos/jetpack/homer.png]|Homer|Horizontal and vertical: 4 sp/f |Moves diagonally until it matches your x or y coordinate, then travels in a straight line at you. Can move through all blocks. Cannot activate switches.|
!! Marble Movement
*Follows strange rules that are only partially understood. The oddity is how some marbles seem to move faster than others. The difference is created when they collide with walls. There is no known speed running application to this knowledge, but here it is anyway:
*Each marble is either "fast-type" or "slow-type".
*Entering a teleporter can change a marble's type. If the exit teleporter is mid-air the marble becomes fast-type.
*Marbles move across a stretch of squares at the same speed. The type is only revealed when they collide with walls. The fast-type seems to lose less time on the turn.
**This is because they travel across a lesser distance before turning around due to the way the game handles subpixels and collisions. So for some marble, covering 2 squares may take 6 frames, for another, 7 frames.
! Left-Right motion in a "basin".
*A "basin" is a horizontal stretch in which marbles move left and right with no teleporters. The basin's width governs how marbles behave inside it.
*A basin is therefore denoted by it's width, e.g. a 3-basin is three squares wide. A marble is denoted by its basin and its position inside it, e.g. 3-2 means a marble in the second (middle) position of a 3-basin.
*A basin can be "odd" or "even" simply based on the number of squares inside it, i.e. the 4-, 6- and 8-basins are all even. Marbles are also classified in this way, i.e. the 4-1 is odd and the 4-2 is even.
*The following are fast-type.
**2-2
**3-2 and 3-3
**4-4
*After this, in the 5-basin and wider, the following rules are observed:
**In odd basins, the 2nd, 4th and last marble are fast-type.
**In even basins, the first 5 marbles, the last one and all the odd marbles are fast-type.
*A marble that falls into the basin from higher up conforms to the rules of that basin, assuming its type based on the square it fell in.
*Here are pictures for reference. The arrows point to the fast-type marbles.
**2-basin
[https://files.tasvideos.org/gameresources/dos/jetpack/2basin.png]
**3-basin etc...
[https://files.tasvideos.org/gameresources/dos/jetpack/3basin.png]
[https://files.tasvideos.org/gameresources/dos/jetpack/4basin.png]
[https://files.tasvideos.org/gameresources/dos/jetpack/5basin.png]
**6-basin: first 5 and the last one.
[https://files.tasvideos.org/gameresources/dos/jetpack/6basin.png]
[https://files.tasvideos.org/gameresources/dos/jetpack/7basin.png]
**The 10-basin displays all the even-basin rules.
[https://files.tasvideos.org/gameresources/dos/jetpack/10basin.png]
*Note that each marble is independent of each other with regards to their type. Only the position within the basin in the initial situation, not their position within a "marble worm" determines the type.
* slamo: Here's my theory based on how I understand the game engine works...it's a small unintended consequence of the game's collision system. First a little explanation of how the game handles collisions. When an object is approaching a wall at a certain speed, the game checks whether the next frame would result in the object being inside the wall. If this is true, the direction is reversed and the new location is applied on the next frame. The game does NOT try to get the object as close to the wall as it can - if it did, the marbles would all line up perfectly forever as they would be aligned to each other and share the same subposition on the frame in which they hit a given wall. The marbles have a strange, uneven speed of 59 sp/f, yet each block is 384 subpixels, which is not a multiple of 59 (~6.51 frames to travel 1 block). This means that given two marbles that spawn next to each other and begin traveling to the left, the rightmost marble will move and not share the same subposition that the leftmost marble did when it spawned (assuming both marbles spawned in the center of their blocks). This kind of difference in subposition could result in an early or late collision with a wall - in the prior example with a wall two blocks away from the leftmost marble, the leftmost marble will trigger a collision with the wall in 6 frames (rounding down 6.51, the frames/block of marbles), yet the rightmost marble will not collide until the 13th frame! More marbles to the right would result in the 3rd one hitting at the 19th frame, 4th hitting at the 26th, 5th hitting at the 32nd, etc. We see that collisions are not happening on an even cycle - some are happening every 6th frame, and some every 7th frame, the result being some appearing out of sync with the others. I believe this is where the appearance of a speed difference is coming from, the marbles are constantly staying at a speed of 59 sp/f and the drifting is coming from slight subposition alignments as a result of the collision detection. I also want to point out that this behavior has been observed in springs as well (see level 26, Whiplash, left-hand springs).
** Nach: I agree with your general assessment. The speed appears constant, yet they are not in sync because they turn around differently. At 6.51, it explains why the distance to travel to be considered ''fast'' or ''slow'' is every other block. However it does not match the data presented by Svimmer above. "Every fifth marble and the last one" cannot be explain like that. So either Svimmer's data is not precise, or there is a bit more going on. According to the working theory of how 6.51 is rounded, it would also dictate that ''slow'' and ''fast'' marbles would in fact alternate as they travel between ''left'' and ''right'' barriers. Do we have data that supports that? From my experience, I see some Marbles starting to noticeably lag behind the rest of the worm, or lose its place, while the others appear to be in alignment with their relative position. Also in levels like Mission Possible, you can see on spring consistently moving faster or slower than another paired with it. 6.51 as the only basis for the speed changes does not fully explain the above occurrences. I believe there is another crucial bit of data we're missing (or at the very least, I am missing).
***slamo: The data certainly isn't consistent with the example I gave. Perhaps the assumption that the marbles start out in the middle of their blocks is wrong, or maybe it's something else that's more chaotic going on. The main point that I was trying to make is that it's entirely possible for this to happen within the game's engine. With springs it's important to note that they are at a completely different speed and the "6.51" example does not apply to them.
****[user:Ilari]: I found the memory addresses for position and velocity vectors of enemies. As far as I can tell, marbles are aligned to bottom right(!) of the block. I.e. marble starting from extreme top-left edge has xpos=384 ypos=384. I haven't checked what happens if marble teleports. And indeed, Marbles don't push against walls.
****[user:Svimmer]: Does anyone have any further insight into this?
!! Spring movement
Spring movement also has variable speed, caused by similar factors as in case of marbles, but simpler due to fact that springs always bounce between walls and don't feel conveyors.
* When spring reverses direction, it pauses for 5 frames.
* Springs move up or down at 50sp/f.
The exact subpixel ranges for direction transition are not known, but from pixel collision assumption together with empirical data, one gets:
* up-to-down transition is on subpixel -18...31 (TODO: Verify this).
* down-to-up transition is on subpixel 128...177 (TODO: Verify this).
Let the spring bounce between blocks at y1 and y2, and initial position be y0.
Upper turning position is: p1 = 384 * y1 + a1 (366<=a1<=415)
Lower turning position is: p2 = 384 * y2 + a2 (128<=a2<=177)
Initial position is: p0 = 384 * y0 + 384
We need to solve a1 and a2 such that p0 = p1 = p2 (mod 50).
For a1: (34*y1+a1)=(34*y0+34) (mod 50)
-> a1=(34*y0-34*y1+34) (mod 50)
-> a1=366+(34*y0-34*y1+18)%50
For a2: (34*y2+a2)=(34*y0+34) (mod 50)
-> a2=(34*y0-34*y2+34) (mod 50)
-> a2=128+(34*y0-34*y2+6)%50
The distance between turning points is:
p2-p1=(384*y2-384*y1)-238+(''''(34*y0-34*y2+6)%50-(34*y0-34*y1+18)%50)
Writing W=y2-y1, Y=y0-y1:
p2-p1=384*W-238+(''''(34*Y-34*W+6)%50-(34*Y+18)%50)
The last term is -49...49. Thus the spring is fast if last term is <=0, so that:
(34Y+16W+6)%50<=(34Y+18)%50
Y is the initial position of the spring in "basin" (0 is topmost) and W is height of "basin".
!!! Known tricks
!! Movement Without Fuel
*There's two kinds of jumping: a short jump is when you just jump without having pressed an arrow key beforehand (hitting it the frame after you've jumped is enough to make the jump long).
*You can directly clamber into a narrow corridor (1-block high) from a position above an empty square when you first enter a level.
**Also works if there's a teleporter exit on such a square, provided you jump before landing on the exit.
*Phasing up/down shifts your position to directly adjacent to the block.
*Pressing up/down while attached to ladders also causes you to align to the grid.
**Pressing left/right on ladders has the same effect if there is a block in the direction.
*"Phase-Climbing": You can get caught a little way inside a phasing-in block or activating barrier without it killing you. This allows you to jump off that position (either towards the side or directly upwards).
**May be used to climb directly upwards by phasing out a block above and jumping up a little ways inside it. There needs to be a space on the side you want to get caught on (may be created by phasing another block). Also may enable to jump further than usual by taking a mid-block position which may allow a higher and therefore longer jump than is otherwise afforded by the level architecture.
**Doesn't work if there's another block above the phasing-in one.
**Conveyor blocks may push you away if the direction they're running has an empty square.
*You can stand still on a conveyor belt or on ice by phasing up or down.
*"alt-dropping": By keeping Alt held after jumping, you can gain significant horizontal distance when falling off edges at the cost of no height and no instant vertical terminal velocity.
**There's two kinds of alt-dropping: it depends on whether you did an short or long jump for the pre-alting.
**If you land on a conveyer while keeping this activated, you'll have a normal walking speed of 55 sp/f regardless of belt direction. This is an improvement if walking against the conveyer but a slight downgrade if walking with it.
*It is possible to jump out of a hole in the wall and still gain height (see upper left corner of level 28). The jump is subpixel dependent; use phasing up or down to do slight repositioning.
*"wiggling": Your horizontal direction while jumping can be instantly reversed. Doing this follows the same velocity curve and the direction can be reversed multiple times. This can be used to "wiggle" up or down one-block shafts to maintain horizontal velocity.
*It is always possible to jump even if you have fuel
** [user:Svimmer]I asked henke37 (who added the above trick here) what he meant and how to do this, but he couldn't provide any evidence so this might well be a troll. I tried every single key on my keyboard, and unless it's a matter of having the right kind of keyboard as well (?), no jump key behaves any different from the others in this respect.
If it's a troll, it's not even added on April the 1st, and is in pretty bad tastes.
!! Phasing
*You can phase a block while jumping off it. Works with any phasable block so long as you were close enough to phasing them through.
*You can "delay-phase" blocks. You do this by starting to phase a block, moving away from it and returning back to phase it through all the while never letting go of the phase button.
**You may also never start phasing any other block or the timer is reset.
**You can hit buttons and activate switches.
**You can jump, climb ladders and fly.
**You CANNOT teleport.
**Allows phasing blocks with no "scaffold" block underneath by repeatedly jump-phasing them.
*You can phase a block you're caught inside, either horizontally, or downwards if you're near the top edge.
*You can just horizontally phase in one jump a lred block that you can't reach without jumping.
*"pre-phasing": It can be useful to phase out a block before actually meaning to pass through it (for monster manipulation or whatever reason).
!! Flying
*Holding down while flying decelerates your vertical speed down to zero.
*Phasing left/right while flying aligns you to the grid at a speed of 32 sp/f even if there is no block. You can use this to mitigate horizontal velocity loss if you need to lose height.
**Holding up or down while phasing and flying left or right cancels this effect. Left and right take priority in terms of the phasing direction.
**If you're falling at terminal velocity and need to go back up, this alignment can be used for rapid upward acceleration. Start flying and phase for 1 frame after passing a block's midpoint (hold left or right to ensure vertical alignment) - this will instantly reverse your velocity and allow you to reach upward terminal velocity much quicker.
*Phasing up/down shifts aligns you to the grid and stops your horizontal movement.
*You can climb a ladder for a frame to get to full vertical speed faster.
!! Ladders
*Optimum pattern for jumping up ladders without fuel: climb for 1 frame, jump for 3 frames, repeat (compensate for lag frames). This results in an average vertical speed of 61 sp/f.
*You can keep holding alt after jumping to be able to fall down ladder chutes as if there was no ladder there. Effect only stops when alt is released.
**By pressing alt down directly underneath a block, you avoid having to actually jump.
*"instant drop-off": If you're already on a ladder, you can phase briefly towards the side (if there's a block there) and press the jump button to fall down directly.
*You can phase left or right to stay still when on autoladders.
*Climbing up a uladder has the same terminal velocity as flying; use this to conserve fuel.
*Due to the first few frames of jumping having a higher velocity than walking, it is slightly faster to use a jumping pattern through columns of adjacent ladders. While holding left or right, hold Alt for 4 frames (do not ignore lag frames, compensate), release Alt for 1 frame, repeat. This allows you to maintain an average velocity of 58 sp/f, an improvement over the walking speed of 55 sp/f.
*When climbing down uladders, phase to the left or right when above the midpoint of an adjacent block as the correction speed is higher than the climbing speed.
*You cannot jump off the top of a dladder like you could off a uladder or regular one.
!! Extreme Jumps (incomplete)
The following jumps are extreme cases of what is possible to perform. Some of them are easier if you get a running start, i.e. there is more than one block for acceleration (even though there is no acceleration for running). The format (X,Y) has distance covered horizontally and vertically in blocks (positive values are rising onto higher ground).
Onto a ladder means being able to grab a ladder in the square indicated. Onto a platform means being able to land on a platform in the square indicated.
*with no free space above
**onto a ladder
***
**onto a platform
***
*with one block of free space above
**onto a ladder
***3,1 (quite precise)
***4,-1
***
**onto a platform
***4,0 (requires first to clip into the corner of the first block, which requires some speed)
***
*with two or more blocks of free space above
**onto a ladder
***
**onto a platform
***4,0
!! Enemies
*Enemies always teleport when hitting a TP except during their tele-exit cooldown. The cooldown stops them from entering a TP directly next to one they just arrived at.
*You can turn a monster around (90 degrees with missiles, 180 with marbles and springs(?)) by catching them inside barriers. Which side of the barrier it was caught determines which way it's left facing.
*There is a flying height at which a gem can be collected on the same block as an enemy without dying. (Confirmed for trackbots and marbles)
*You are able to pick up items underneath monsters in some cases (e.g. in the same square as a spring) but this requires subpixels to align.
!! Miscellaneous
*After dying you can still finish the level by landing at/lifting to the door.
**If you land on ice after dying, or just die on ice, you will continue to move at full walking speed in whatever direction your body was traveling. This can be used to cover very large distances post-mortem and get seemingly impossible death exits.
*You are invulnerable during teleportation. There is however a period of vulnerability in-between two teleports even if you never let go of "down".
*Items may be collected during teleporting and buttons and switches are also operable.
*You can teleport while still around half-a-block in the air. This prevents you from dying to monsters such as marbles on the teleporter square.
*Teleporters may teleport to the wrong color if the level has too many of them. Unfortunately, there doesn't seem to be enough teleporters in any of the levels for this to happen.
*Passing through a teleporter resets your velocity. You still keep your "jumping" status, that is whether you fall as if from jumping or from just falling off a ledge.
*Teleport destinations are randomly chosen if there is more than one possibility. This applies to both you and enemies and it can be luck manipulated by phasing.
*A convex corner of spikes with no solid block underneath can be clipped through at a precise position (See level 33 - Donkey Pack, bottom left).
*Picking up a fuel tank while falling resets your vertical speed to zero.
*It is more fuel efficient to fly through fuel drainers than it is to walk through them.
*Jumping when 2 blocks under floor spikes ([https://files.tasvideos.org/gameresources/dos/jetpack/spikes_up.png]) is survivable, despite the obvious appearance of a collision.
*Floor spears can still kill you while you are teleporting. (unknown if this is an exception for invincibility powerups as well)
!!! ToDo
This section is useful to have so multiple people don't end up doing the same work. Just add it here and it will get done, as if by magic! :)
Add your name below if you want to express you're going to do one of these to avoid overlapping work.
* Levels
** Describe what is important in each level
** Different route strategies. Add .png's (and videos?) for each.
*** currently only missing the links to the spot in the ready TAS where each of the levels without separate WIP uploads are played.
* Naming Tables
** Adding more information to some of the entries: still lots of things missing that could be mentioned there, i.e. stunner and shield last for how long, what is the hitbox of various objects like...
* Enemies
** Fill in new data as it is collected. Can we find out more about trackbots for instance?
* Adding more information about running the game in JPC-RR. Possibly even the hd image itself, what DOS was used (where it's found), a link to a subpage containing all the WIPs and possible lua scripts, memory locations etc.
* Filling out the jumping table/getting rid of it completely.
* Adding in technical details in the tricks section, i.e. how long do you have to hold ctrl for the instant drop-off trick to work.
!!! Discussion About This Page
!!! Additional tools used by Jetpack team
!! slamo
* [http://office.microsoft.com/en-us/excel/| Excel] - Movement graphs
* [http://en.wikipedia.org/wiki/Notepad_%28software%29|Notepad] - Level notes
* [http://en.wikipedia.org/wiki/Paint_%28software%29|Paint] - Drawing on images
* [http://en.wikipedia.org/wiki/Calculator_%28Windows%29|Calculator]
* [=userfiles/info/7034198589978919|Jetpack Lua Script] by Ilari
* [=userfiles/info/7607996750340582|Modified Jetpack Script] - Ilari's script modified to show a placeholder character for levels with hidden passages.
!! Nach
* [http://www.dosbox.com/|DOSBox] - Testing game ideas
* [https://files.tasvideos.org/gameresources/dos/jetpack/jetpack_levels.zip|Level pack] - Jump directly to any level
* [http://www.kde.org/applications/graphics/ksnapshot/|KSnapshot] - Taking images
* [http://www.kde.org/applications/graphics/kolourpaint/|KolourPaint] - Drawing on images
* PNG Tools - Compression
** [http://advancemame.sourceforge.net/comp-readme.html|advdef]
** [http://advancemame.sourceforge.net/comp-readme.html|advpng]
** [http://www.walbeehm.com/download/|deflopt]
** [http://optipng.sourceforge.net/|optipng]
** [http://psydk.org/PngOptimizer.php|pngoptimizer]
** [http://advsys.net/ken/utils.htm|pngout]
** [http://entropymine.com/jason/pngrewrite/|pngrewrite]
* [user:Nach|imgur] - Custom utility for uploading files to image host
* KHexEdit - Viewing raw hex data
* [http://www.kde.org/applications/utilities/kcalc/|KCalc] - Calculator
!!Svimmer
* [http://www.dosbox.com/|DOSBox]
* The [https://files.tasvideos.org/gameresources/dos/jetpack/jetpack_levels.zip|level pack]
* PNG Tools - Compression
** [http://www.walbeehm.com/download/|deflopt]
** [http://advsys.net/ken/utils.htm|pngoutWIN]
** [http://optipng.sourceforge.net/|optipng]
** pngcompress (though not really needed if you use all the others)
* [http://office.microsoft.com/en-us/excel/| Excel]
* [http://en.wikipedia.org/wiki/Notepad_%28software%29|Notepad]
* [http://www.gimp.org/|GIMP] - Picture Editing.
** [http://registry.gimp.org/node/12003|Grid of Guides] - was useful for "extracting" images of single tiles.
** [http://registry.gimp.org/node/20269|Draw arrow] - not a standard feature of GIMP as of yet.
* [http://www.hydrairc.com/|HydraIRC] - for communications (see IRC channel in links section)