This page documents information about Contra. Many of the tricks demonstrated here are near impossible in real time and documented for the purposes of creating Tool-assisted Speedruns.
The purpose of this page is to document all of the known tricks
of the NES Contra game so far.
Because of the nature of this site, we concentrate here on tricks
that are extremely difficult to execute in real play, but are useful
in the making of tool-assisted speedruns. For most of the tricks,
a frame advance feature in an emulator is a definite must-have.
In Stage 3 it is possible to jump to ledges normally impossible by taking advantage of vertical scrolling. To perform it you jump, then press left, then hold right. It seems random, but if you press right at the right frame, you will stay in air for longer than usual and can land on ledges that would normally take 2 jumps.
Conversely, this can also be used to jump shorter than normal. This should be used on all other jumps in order to shave a frame from each one. (In reality many of them can not be shaved this way).
Spread Gun Optimization - Horizontal levels
Spread Gun optimization - 3D levels
Gradual Spread Gun pattern substitution
Boss HP can only drop 1 HP per frame. This means the strategy isn't as much about unloading bullets as fast as possible, but instead trying to make sure damage is registered every frame.
Gromaides (Level 3 Boss)
The arms of Gromaides occupy 10 enemy slots,
one for each segment.
The following enemy variable arrays have special meanings for this boss:
0x00 = segment belongs to the left arm, 0x01 = segment belongs to the right arm (relative to the screen).
Frame counter for each segment. Counts up to 16; then spawns the next arm segment and becomes 0xFF.
Enemy slot index of the next arm segment, moving inward. 0xFF if this is the innermost segment (the "shoulder").
Enemy slot index of the next arm segment, moving outward. 0xFF if this is the outermost segment (the "hand").
The enemy variable arrays at 05D8 and 05E8
form doubly linked lists of arm segments,
one list for each arm.
Some subroutine addresses:
Update function for initial arm extension. Has delay counters for spawning in each arm segment successively. Calls 9BDA to update the position of each spawned segment.
Arm segment position update function during initial extension. Adds ±0x0.B5 pixels to the x-coordinate (depending on whether left or right arm) and −0x0.B5 pixels to the y-coordinate of each spawned arm segment.
Stores the sprite code to use for an arm segment in the corresponding slot in the 030A enemy variable array: 0x7A for an "arm" segment or 0x7B for a "hand" segment.
The RNG variable at address 0034
is updated by repeatedly adding to it the current frame counter (and carry flag),
in an infinite loop
until an NMI (vblank) occurs.