Difference between revisions of "Ikari Warriors/Game Mechanics"
From SDA Knowledge Base
m (→Enemy AI) |
m (→Movement speed) |
||
Line 37: | Line 37: | ||
The speeds below refer to the change in y-position per update cycle (every 4 frames). For the relevant addresses, see the memory address section on this page.<br /> | The speeds below refer to the change in y-position per update cycle (every 4 frames). For the relevant addresses, see the memory address section on this page.<br /> | ||
Foot (SS) - 3<br /> | Foot (SS) - 3<br /> | ||
− | Foot (SS) diagonal - first frame of diagonal movement: 2 and 196 sub (y) and 1 and 32 sub (x), subsequent diagonal movements: 2 and 28 sub (both x and y)<br /> | + | Foot (SS) diagonal - first and last frame of diagonal movement: 2 and 196 sub (y) and 1 and 32 sub (x), subsequent diagonal movements: 2 and 28 sub (both x and y)<br /> |
Foot water (SS) - 2 and 64 sub<br /> | Foot water (SS) - 2 and 64 sub<br /> | ||
− | Foot water diagonal (SS) - first frame of diagonal movement: 2 and 19 sub (y) and 216 sub (x), subsequent diagonal movements: 1 and 107 sub (both x and y)<br /> | + | Foot water diagonal (SS) - first and last frame of diagonal movement: 2 and 19 sub (y) and 216 sub (x), subsequent diagonal movements: 1 and 107 sub (both x and y)<br /> |
Foot (SS) uphill - 2<br /> | Foot (SS) uphill - 2<br /> | ||
Foot - 1 slower than with SS in all vertical scenarios. The y-speed during diagonal movement is however better preserved than with SS.<br /> | Foot - 1 slower than with SS in all vertical scenarios. The y-speed during diagonal movement is however better preserved than with SS.<br /> | ||
Tank - 2 and 128 sub<br /> | Tank - 2 and 128 sub<br /> | ||
− | Tank diagonal - first frame of diagonal movement: 2 and 78 sub (y) and 240 sub (x), subsequent diagonal movements: 1 and 194 sub (both x and y)<br /> | + | Tank diagonal - first and last frame of diagonal movement: 2 and 78 sub (y) and 240 sub (x), subsequent diagonal movements: 1 and 194 sub (both x and y)<br /> |
Heli - speed same as foot (SS)<br /> | Heli - speed same as foot (SS)<br /> | ||
Heli diagonal - 2 and 28 sub (both x and y), there is no difference between the first and subsequent diagonal movements<br /><br /> | Heli diagonal - 2 and 28 sub (both x and y), there is no difference between the first and subsequent diagonal movements<br /><br /> | ||
Line 52: | Line 52: | ||
* In the water areas, it's slightly faster to walk uphill and then on flat ground instead of staying in the water the whole time. This is very marginal though, but still useful in areas 3 and 4. | * In the water areas, it's slightly faster to walk uphill and then on flat ground instead of staying in the water the whole time. This is very marginal though, but still useful in areas 3 and 4. | ||
* Again in the water areas, you can sometimes walk over corners of slopes. It's slightly faster to walk over the corner (uphill and then downhill) instead of staying in the water. | * Again in the water areas, you can sometimes walk over corners of slopes. It's slightly faster to walk over the corner (uphill and then downhill) instead of staying in the water. | ||
− | * As a rule of thumb, moving diagonally "one block" (so the width of a bush or an item token) at SS speed costs | + | * As a rule of thumb, moving diagonally "one block" (so the width of a bush or an item token) at SS speed costs roughly 2 movement frames of vertical movement.<br /><br /> |
==Glitches== | ==Glitches== |
Revision as of 02:26, 4 March 2019
Contents
Items
Pink soldier drops
- F - Your bullets will be able to pass through walls and multiple enemies. The bullets can now destroy buildings (but not tanks).
- L - Longer bullet range.
- S - Shots will travel faster (bullets and projectiles when in tank or helicopter). Grenades are not affected.
- B - Grenades will finish with a huge blast upon impact.
These drops are always fixed. There are a few fake pink soldiers throughout the game that don't drop anything.
Green soldier drops
Green soldiers always drop K.
Tank drops
Tanks can drop gas cans, a tank or nothing. The type of drop is determined by the RAM-address the tank is allocated to. If the tank gets the first object address, $500, it will drop a tank. If it's in the third object address, $502, it will drop a fuel. For more information about the address allocation of objects and some special cases of drop manipulation, see fuel drop manipulation.
Destroyable environment (gates, parked trucks, ...) drops
The drops from the destroyable environment are always predictable (with the exception of the garbage sprites around the helicopter in area 4).
Hidden items
- SS - Your speed on foot is increased.
- H - Bullets and grenades are restored to 99 and gas is restored to 199.
- Knife - Touching an enemy inflicts damage corresponding to a bullet. Enemies that are immune to bullets will either be rendered harmless (for example the "big men") or will still kill you (helicopters and tanks). The knife also allows you to run through gates and destroyable environment.
- Heart - Allows you to keep all collected items if you die or clear the area. Without a heart, you'll start from scratch. Once used, you need to collect another heart.
- Golden heart - Same as the heart, but gives you all upgrades and replenishes your inventory to the max.
- Triple shot - Replaces L, S and F with a triple shot (similar to the helicopter gun). If you pick up L, S or F again, you'll lose the triple shot and go back to the normal gun with only the power-up you just collected. This power-up must be avoided at absolutely all cost.
- Various other items (girl, clock, gold box etc) - Point items that have no use in a speedrun.
These items are always in the same spot and can only be revealed with the gun or a tank shot.
Collecting several upgrades of the same kind does nothing more than add points to the total.
Movement speed
The speeds below refer to the change in y-position per update cycle (every 4 frames). For the relevant addresses, see the memory address section on this page.
Foot (SS) - 3
Foot (SS) diagonal - first and last frame of diagonal movement: 2 and 196 sub (y) and 1 and 32 sub (x), subsequent diagonal movements: 2 and 28 sub (both x and y)
Foot water (SS) - 2 and 64 sub
Foot water diagonal (SS) - first and last frame of diagonal movement: 2 and 19 sub (y) and 216 sub (x), subsequent diagonal movements: 1 and 107 sub (both x and y)
Foot (SS) uphill - 2
Foot - 1 slower than with SS in all vertical scenarios. The y-speed during diagonal movement is however better preserved than with SS.
Tank - 2 and 128 sub
Tank diagonal - first and last frame of diagonal movement: 2 and 78 sub (y) and 240 sub (x), subsequent diagonal movements: 1 and 194 sub (both x and y)
Heli - speed same as foot (SS)
Heli diagonal - 2 and 28 sub (both x and y), there is no difference between the first and subsequent diagonal movements
Some additional comments:
- It's faster to save the diagonal movement for when the diagonal speed is higher. For example, it's better to wait until you get out of the water before starting to move diagonally.
- In terms of traveled distance, the first cycle of diagonal movement is extremely close to subsequent ones in all scenarios. For all practicable purposes, the difference can be neglected. However, the first diagonal movement is still considerably more efficient since it allows you to travel in a straighter line between two points (obviously assuming there are no obstacles impacting the trajectory). As a rule of thumb, one movement frame (so 4 actual frames) is saved by dividing one continuous diagonal movement into 5 segments of diagonal movements. Each such segment will contain two cycles of the more efficient diagonal movement (one at the start and one at the end). Assuming it's in an area without obstacles or enemies that have to be dealt with, there is no downside in dividing the diagonal movement in this way as opposed to a continuous diagonal movement.
- In the water areas, it's slightly faster to walk uphill and then on flat ground instead of staying in the water the whole time. This is very marginal though, but still useful in areas 3 and 4.
- Again in the water areas, you can sometimes walk over corners of slopes. It's slightly faster to walk over the corner (uphill and then downhill) instead of staying in the water.
- As a rule of thumb, moving diagonally "one block" (so the width of a bush or an item token) at SS speed costs roughly 2 movement frames of vertical movement.
Glitches
Flying glitch
https://www.youtube.com/watch?v=kQF-OpUh99o
If you hold A, B and up at the same time while in the helicopter (they don't need to start to be pressed down simultaneously, you just need to hold them down at the same time), the character will exit the helicopter and continue traveling vertically at helicopter speed as long as A and/or B is kept held down (the glitch doesn't work with the tank). In this state, you're invincible and can't interact with items on the screen.
If you let go of A and B, you will be teleported to the (small) y-position you left the helicopter on. Your movement speed will be back to walking speed. You'll still be in the invincible state and you're still unable to interact with the environment. The only way to revert back to normal is to exit the area or if the helicopter was destroyed after the flying state was initiated, but still on screen (either by an enemy or by self-destruction).
Visual glitches
The game often gets confused when trying to represent the sprites for the item drops if there are several possible drops on the screen available. For example, if you kill a pink guy when there is an item hidden nearby, the pink guy's drop will look like the hidden drop. However, if you pick it up, you will still only get the normal drop from the pink guy and not the hidden drop. You can even have item drops appear as parts of enemies in certain situations. Again, it's only a visual glitch.
Garbage sprites in area 4
Even when playing normally, the game will create garbage sprites in the area where you find the helicopter in area 4. These sprites can be destroyed and the items they leave behind can be collected (including the much wanted fuel drop that allows you to cruise to the end of the area in the helicopter). They are spawned just like other random enemy soldiers. A plausible, but unconfirmed, explanation is that the game was intended to spawn a different type of enemy (different memory values) in this section. Instead, the corresponding calculation was set up incorrectly and now produces the values for these sprites. Why the memory values correspond to these sprites has not been looked into.
Cheats
Area select cheat
When the game starts, Paul and Vince will walk into the screen from below. Press start (or just wait) and you will see the title screen with the selection of 1 or 2 players. During this screen, press Up, Down, A, A, B, Left, Right, A, B, Up, A, Down, Right, Right, Left, B, Up, Left, A, Right, B, Left, Right, A, Left, Up, A, Down, A, Right, Left, B, and finally press Start. This has to be done before the demo starts playing. Getting the code to work is a small feat in itself. If done correctly, after the cutscene with the crash landing, you will get a black screen with the text "Area 1" (instead of the few seconds of normal black screen before the game starts). By pressing A and B, you can select the area to start at (A increases, B decreases, but it loops so it doesn't matter). Needless to say, you'll start without any upgrades.
Continue code
One of the most well known continue codes throughout the NES library, A B B A. Just press the button combination after having lost the last life and before the game reverts back to the title screen.
For unknown reasons, the code doesn't work when you've scrolled until the very end of a level.
Sometimes, the game continues to scroll the screen after a game over (unknown reasons), which also prevents you from continuing. This is quite uncommon though.
Some comments about various aspects of the game mechanics
Airstrike target plates
Not dangerous themselves, they will trigger an airstrike when you get close to them. The incoming angle and the vertical position from where it arrives differ from time to time. The best way to understand this is to think of a steady stream of (invisible) bombers passing by from left to right. Their position when the target plate is activated determines the angle of attack. Once they have passed by to the right, they will reappear from the left and so on (one cycle is roughly 1000 frames). Cycling through from left to right will also change their vertical position on the screen. Roughly speaking, the bomb planes appear to run on a sort of global timer that is set when the game starts. The result of testing seems to indicate that the global timer starts from the same value. This appears to be true for a given route, but it seems like player input can also have an impact.
There are two important special cases to be aware of:
- The airstrike can come so quickly that it's impossible to avoid it.
- The airstrike comes from such a far off position that it won't reach the target plate before it has scrolled off screen. The airstrike will then lock on to a different position on screen, while keeping the horizontal value. This can be dealt with by moving to the side out of the way, but obviously at the cost of lost time.
Everything written in this section has been concluded from observations during gameplay, but the actual mechanics that determine the air strikes are unknown.
Arrow-shooting rocks
These shoot arrows horizontally through a small hole in the side. The interval between arrows is not understood, but arriving at different time windows (very roughly 100 frames) will result in different arrow patterns. There is lots of randomness with these enemies, but also some individual behavior that can be taken advantage of.
Vehicles
- - Entering a vehicle creates an immobility of around 1 second.
- - Leaving a vehicle creates an immobility of only a few frames (seems to vary a bit, but less than 10).
- - If you approach a vehicle while holding down the A-button (the grenade button), you will enter the vehicle on the first possible frame.
- - Changing direction of the tank cannon costs a minimum of 4 frames (because of the game running at 15 fps), but in practice costs more like 8 frames.
Sprite limit
The game has a sprite limit that frequently comes into play. Enemies that are supposed to spawn in a certain area, but are prevented from doing so because of the sprite limit, will appear out of nowhere when one of the other sprites has disappeared off-screen. This can readily be studied for a section by looking how the object address values are attributed (see memory address $0500 and onwards). The sprite limit (and the generally slow speed of the game - 15 fps!) means that lag is not an issue in the game.
'Half-diagonal' shots
Other than the 8 standard directions (4 straight and 4 diagonal), the game allows you, when on foot, to shoot in the 8 directions in-between, here called 'half-diagonals'. Getting these additional directions allows for time savers in several areas. To get a 'half-diagonal' shot, you need to shoot (press B) and change movement direction between straight and diagonal between two consecutive frame updates in the game. Since the game runs at 15 fps, this is therefore a 1-4 frame trick (depending on which of the "in-between" frames you initiate the trick).
Enemy AI
The game appears to use a fairly simple RNG-algorithm. Some enemy types appearances seem to be fixed (although they can sometimes be missing) and some appear to spawn more randomly (but still restricted to certain areas). One of the random enemy types, the blue soldiers equipped with normal guns, move about in what at first seems to be a random pattern. However, even if it hasn't been investigated exactly how it works, it's quite evident by observations that some enemy movements repeat themselves too often for it to be random. The following clip demonstrates this effect: https://www.youtube.com/watch?v=gIFoTTkVTRM
The movement direction of the enemies are stored in addresses 63E and onwards. A study of how the code changes the values of these addresses has not been done.
Memory addresses
The below analysis of the memory addresses was made by TaoTao in http://tasvideos.org/forum/posting.php?mode=quote&p=450038.
RAM
$3D U8 $2000 mirror
$3E U8 $2001 mirror
$3F U8 $2005 x mirror
$40 U8 $2005 y mirror
$41 U8 tmp variable for input reading
$42 U8 tmp variable for input reading
$43 U8 P1 input # ABSTUDLR
$44 U8 P1 input modified # suppress continuous A
$45 U8 P2 input
$46 U8 P2 input modified
$6A U8 current sprite buffer page # 2..3
$E4 U8 P1 life
$E5 U8 P2 life
$0200-$02FF Sprite[64] sprite buffer 1
$0300-$03FF Sprite[64] sprite buffer 2
- In object list, index 0 means player1, index 1 means player2.
- Object position seems to be signed 24-bit (lower 8-bit is subpixel).
- Calculation of y-position is weird a bit (see $DD02).
$04FE- U8[] object type etc? # 0:not-exist
$0576- U8[] object position x mid
$0594- U8[] object position y lo # subpx
$05B0- U8[] object position y mid
$05CC- U8[] object position y hi
$05E8- U8[] object position x lo # subpx
$0604- U8[] object position x hi
$063C- U8[] object direction # 0..15
$0674- U8[] object drop-related value
$067F U8 P1 ammo of gun
$0680 U8 P2 ammo of gun
$0681 U8 P1 ammo of grenade
$0682 U8 P2 ammo of grenade
ROM
$C271 code read inputs
$D97E code check if object list is full?
$DC9E code calculate object velocity?
$DD02 code move object
$DDF9 code multiplication (S24 * U8 -> S24)