View Page Source

Back to Page
Revision 12 (current)
Edited by Nach on 7/20/2021 11:38 PM
!!!Player speed

* The speed of your ship actually depends on your altitude. The lower you are to the ground, the faster you go.

* Your speed at maximum throttle is approximately 4 times higher than your speed at minimum throttle.

* Afterburner triples your speed. Each afterburner pickup gives you 120 units, and you use 6 units per second, so each pickup gives you 20 seconds of boost. It would take you 60 seconds to travel the same distance without afterburner, so each afterburner pickup saves 40 seconds!

!!!Weapons

Weapons can be fired rapidly if the fire button is held down, however, you can mash the fire button every other frame to fire much faster!

||Weapon||Damage||Notes||
|PAC|4096|Can be enhanced to fire 2 or 4 at a time|
|ION|8192|Shoots one at a time in a + sequence|
|RTL|4096|Can be enhanced to fire 2 or 4 at a time. Projectiles move faster than PAC|
|MAM|16384| |
|SAD|32768| |
|SWT|65536| |
|DAM|65536|Damages everything within a certain radius|

!!!Enemies

These values are for Easy and Normal difficulty. The health is multiplied by 1.5 for Hard, and by 2 for Terminal.

||Enemy/target||Health||
|Storage bunker|65536|
|Shield generator|65536|

Ymir:

||Enemy/target||Health||
|Radar|99999|
|Power station|99999|
|Boss|500000|

Crythania:

||Enemy/target||Health||
|Floating radar|256000|
|Boss|200000|

Moon Dagger:

||Enemy/target||Health||
|Radar, small|16384|
|Radar, large|100000|
|Boss, phase 1|128000|
|Boss, phase 2|256000|

Tei Tenga:

||Enemy/target||Health||
|Helicopter (grounded)|16384|
|Dinosaur skull|131072|
|Boss|900000|

Ositsho:

||Enemy/target||Health||
|Control tower|99999|
|Sentinel tower|65535|
|Heat miner|65535|
|Boss|400000|

Erigone:

||Enemy/target||Health||
|Boss, phase 1|600000|
|Boss, phase 2|1200000|

Centauri III:

||Enemy/target||Health||
|C-Nome|5002|
|Pyramid (solid)|90002|
|Pyramid (slotted)|90003|
|Tower|90003|
|Boss|800000|

Ceres:

||Enemy/target||Health||
|Tower|120000|
|Boss|500000|

Proxima Seven:

||Enemy/target||Health||
|Arch|40960|
|Double tower|81920|
|Boss|512000|

!!Item drops

Certain enemies and buildings have a random chance of dropping a useful item.

||World||Enemy/target||Item||Drop chance (%)||
|Ymir|Tank|RTL|4|
|Moon Dagger|Rocket|MAM|5|
|Tei Tenga|Helicopter (grounded)|RTL|5|
|Ositsho|Phoenix fighter|FLY|2|
|Ositsho|Quadram|RTL|2|
|Erigone|Shriek fighter|FLY|5|
|Erigone|Laser turret|RTL|1|
|Centauri III|Pyramid (solid)|DAM|2|
|Proxima Seven|Transport ship|Random|10|
|Proxima Seven|Unknown[#1]|MAM|10|

[1] Only in the data for 9-1. The object doesn't appear anywhere on the map but may spawn in tunnels. It's some kind of flying enemy.

!!!Objective skipping

If a tunnel is part of the list of objectives, you can go straight to it to skip any previous objectives.

!!!Ymir 2 bonus tunnel

There is an optional tunnel in 1-2 that contains 9 afterburner bonuses and regenerates each time you enter it. It's worth traveling through this several times to gather enough afterburner for the entire run.

!!!RNG

!!Formula

Terminal Velocity uses Watcom C compiler's rand() function. Which is a [http://en.wikipedia.org/wiki/Linear_congruential_generator|linear congruential pseudo-random number generator (LCG PRNG)], which works as follows:
 uint32_t seed; //Seed is 32 bits
 int rand()
 {
   seed = seed*1103515245 + 12345; //Seed multiplies and adds, and possibly overflows
   return (seed >> 16) & 32767; //Use bits 16-30 for requested random value
 }

The random number, for example, can be bounded between 0 and 99 using the common algorithm which contains bias:

 random_value = rand() % 100; //Numbers 0-67 are more likely than 68-99 

Or, the general formula which will produce a number between 0 and n - 1:

 random_value = rand() % n; //Note: If n is not a power of 2, random_value is biased

In Lua, this can be represented as:

 result = (0x41C64E6D * seed + 0x00003039) mod 2^32
 random(n) = math.floor(____(bit32.band(bit32.rshift(result,16),0x7FFF)*n)/0x7FFF)

!!Item drops

When an object is destroyed, the item drop roll is a variable number of rolls from the current seed. To calculate how far it is from the current seed, do the following.

The first roll calculates the number of debris chunks that fly off the object. It calculates this with the following formula:

 debris = random(8)+2

This will result in a number between 2 and 9. The RNG will then roll 6 times for each piece of debris. This is used to determine the type of debris, direction of travel, rotation, etc.

An additional roll is used after this, the purpose is unknown but all projectile hits in general have one seemingly useless roll.

The next roll is the one that determines if an item drops. The RNG will generate a value with {{random(100)}}. Some objects have a percent chance of dropping an item, this can be viewed in the map editor. If the random roll is between 0 and this percentage, the item will drop; e.g. Ymir tanks have a 4% of dropping an RTL pickup, if the roll is between 0 and 4 then it will drop (yes, this does mean the chance is actually 5%!)

If multiple shots hit the object and destroy it on the same frame, things get a little more complicated. Let's say for example that an enemy has 4 hits left, and you fire an RTL volley of 4 lasers. The first 3 hits that the game processes are treated like normal object hits; they use 2 RNG rolls each unless debris is spawned, in which case an extra 6 rolls are used. The game determines if debris flies off with the second RNG roll, not the first. It takes bits 16 through 30 of the new RNG seed, or in Lua:

 bit32.band(bit32.rshift(result,16),0x7FFF)

If this value is between 0x0000 and 0x1FFF, a chunk of debris will spawn. It's possible that anywhere between 6 and 24 RNG rolls will be used for the first 3 shots, then the 4th shot destroys it through the process at the beginning of the section.

!!Manipulation

The following actions advance the RNG:

* An enemy firing a projectile advances it by 1.

* A projectile hitting terrain advances it by 1.

* Shooting an object advances it by 2, plus another 6 if a chunk of debris flies off.

* Destroying an object advances it by 3, plus another 6 for each chunk of debris that flies off.

* A projectile hitting the player advances it by 4.

* Flying into terrain advances it by 4.

* Flying through an object continuously advances the RNG.

* Loading the game advances it 1492 times.

!!!Level maps

Here is a collection of maps with the intended order of events and relevant powerups marked. (Done, may add more items of interest if needed)

https://docs.google.com/spreadsheets/d/e/2PACX-1vRHGiDUyVDBOyM-983irhm3bAEZzi57Je9uU3PxHimJrcRZGvhDH1Pmh_EEiYnXxsk6AFkptNPwncWJ/pubhtml

There is a level editor available. You need an older version of Windows to open it, Windows 3.1 in DOSBox works fine. Get it on this page: https://legacy.3drealms.com/tv/index.html Open DISK.POD or CDROM.POD with it.