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.
Contra is a classic action game. Equipped with heavy artillery and infinite ammo, you must save the world by defeating the organization Red Falcon.
Mars608 and aiqiyou have saved nearly a second over their previous run thanks to tighter movement control and a different strategy for reviving the second player.
Contra is a popular side-scrolling shooter game for the NES, infamous for its fragile protagonists. It's also known as 魂斗羅 (Kontora) in Japan, and Probotector in Europe. GryZor is also used in Europe on some other systems. This run focuses on a specific goal: do not kill enemies directly unless absolutely necessary to complete the game.
This is an improvement of 11 frames over the previous publication by the same authors.
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 Behavior
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:
05A8
0x00 = segment belongs to the left arm, 0x01 = segment belongs to the right arm (relative to the screen).
05C8
Frame counter for each segment. Counts up to 16; then spawns the next arm segment and becomes 0xFF.
05D8
Enemy slot index of the next arm segment, moving inward. 0xFF if this is the innermost segment (the "shoulder").
05E8
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:
9B7E
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.
9BDA
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.
9C11
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.
RNG
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.