Add support for building Probotector rom

This commit adds the ability to build the Probotector rom with build
script parameters.
This commit is contained in:
Michael Miceli 2023-05-17 22:14:29 -04:00
parent 730af486ab
commit ce29ab6711
427 changed files with 2296 additions and 399 deletions

3
.gitignore vendored
View File

@ -3,4 +3,5 @@
*.deb
*.nes
*.prg
*.bin
*.bin
src/assets/asset-game-type.txt

View File

@ -27,6 +27,14 @@ Falcon](https://www.romhacking.net/hacks/2701/) project.
```
# Building
In addition to _Contra_ (US), this repo can also build the _Probotector_ rom.
To keep instructions simple, the section below only contains instructions for
building _Contra_ (US).
If you are interested in building a _Probotector_ rom file, first read this
section to understand what is needed, then follow the instructions in the
section titled _Probotector_.
## Prerequisites
* This repo does not include all assets (graphics data and audio data)
necessary for assembling the ROM. An existing copy of the game is required.
@ -43,11 +51,11 @@ There are 3 build scripts in this repository. All of them do the same thing. To
build the resulting .nes rom file, simply execute the appropriate build script
based on your environment.
```
.\build.ps1 <-- Windows
.\build.bat <-- Windows (no PowerShell)
./build.sh <-- Unix
```
| Environment | Command |
|-------------------------|---------------|
| Windows | `.\build.ps1` |
| Windows (no PowerShell) | `.\build.bat` |
| Mac/Unix/Linux | `./build.sh` |
* `build.ps1` - PowerShell script recommended for building on Windows machines.
Some users have reported needing to run the script as admin to access the
@ -216,6 +224,36 @@ exactly as the _Contra_ (US) ROM. However, this was just the prerequisite to
documenting the codebase. Every label had to be given an appropriate name, and
each line of assembly had to be documented.
# Probotector
This repo can also produce a _Probotector_ rom file. _Probotector_ is the
PAL-specific variation of the _Contra_ (US) game. It is mostly identical except
different sprites. For a full list of differences, see the document
`docs/Probotector.md`.
## Building
First read the section above for building _Contra_ (US) in general. The process
is very similar. Place a _Probotector_ rom in the root folder with the name
`baserom.nes`. It should have a MD5 hash of `7127F616C13B58087481DD9E93AEB2FF`.
Then, depending on your environment, run one of the following commands.
| Environment | Command |
|-------------------------|---------------------------------|
| Windows | `.\build.ps1 -Game Probotector` |
| Windows (no PowerShell) | `.\build.bat Probotector` |
| Mac/Unix/Linux | `./build.sh Probotector` |
Notes of caution, especially for people building both _Contra_ (US) and
_Probotector_.
1. Be sure you have the correct `baserom.nes` for the game you are building.
Otherwise, the generated rom will be incorrect.
2. If you have _Contra_ (US) assets in the `/src/assets/` folder and are
building _Probotector_, or vice versa, the build scripts will delete the graphic
asset data and re-extract it from the `baserom.nes`. This prevents accidentally
using the wrong game's assets in the result rom.
# Build Details
The build scripts accomplish the following tasks:

View File

@ -1,13 +1,27 @@
@echo off
rem Assembles and links the source assemblies into a .nes ROM.
rem Run this script from the windows command prompt.
rem If desired, there is also a build.ps1 powershell script
rem that can be used as well.
rem Run this script from the windows command prompt if you do not have access to
rem PowerShell. This script does not do some hashing validation that PowerShell
rem can.
IF EXIST contra.nes (
echo Deleting contra.nes.
del contra.nes
SET ROM_NAME="contra.nes"
SET DBG_NAME="contra.dbg"
SET ASSETS_NAME=assets.txt
SET ASSET_GAME_TYPE=src\assets\asset-game-type.txt
SET GAME="%1"
IF %GAME% == "Probotector" (
SET ROM_NAME="probotector.nes"
SET DBG_NAME="probotector.dbg"
SET ASSETS_NAME=probotector-assets.txt
) ELSE (
SET GAME="Contra"
)
IF EXIST %ROM_NAME% (
echo Deleting %ROM_NAME%.
del %ROM_NAME%
)
IF NOT EXIST "obj" (
@ -23,26 +37,47 @@ IF NOT EXIST baserom.nes (
echo No baserom.nes file found. If assets are missing, then the build will fail.
)
rem show commands run in output
echo Assembling PRG Rom Banks
rem used to know which assets were last build
SET LAST_BUILD_TYPE="Contra"
IF EXIST %ASSET_GAME_TYPE% (
SET /p LAST_BUILD_TYPE=<%ASSET_GAME_TYPE%
)
rem loop through assets defined in assets.txt and extract bytes from baserom.nes
rem If the assets are from a different game, then delete them
rem For example, if the assets were extracted from Contra and currently building
rem Probotector, then delete the assets and extract them from the Probotector baserom.nes
IF NOT %LAST_BUILD_TYPE% == %Game% (
echo Removing graphic asset files
del src\assets\graphic_data\*.bin
)
rem loop through assets defined in assets.txt (or probotector-assets.txt) and extract bytes from baserom.nes
echo Extracting binary data from baserom.nes
for /f "tokens=1,2,3 delims= " %%i in (assets.txt) do (
for /f "tokens=1,2,3 delims= " %%i in (%ASSETS_NAME%) do (
cscript /nologo set_bytes.vbs %%j %%k %%i
)
rem Store game type that the assets are for
IF EXIST %ASSET_GAME_TYPE% (
del %ASSET_GAME_TYPE%
)
echo %GAME%>%ASSET_GAME_TYPE%
rem show commands run in output
echo Assembling PRG Rom Banks
@echo on
ca65 -g --debug-info -o obj\constants.o src\constants.asm
ca65 -g --debug-info -o obj\ines_header.o src\ines_header.asm
ca65 -g --debug-info -o obj\bank0.o src\bank0.asm
ca65 -g --debug-info -o obj\bank1.o src\bank1.asm
ca65 -g --debug-info -o obj\bank2.o src\bank2.asm
ca65 -g --debug-info -o obj\bank3.o src\bank3.asm
ca65 -g --debug-info -o obj\bank4.o src\bank4.asm
ca65 -g --debug-info -o obj\bank5.o src\bank5.asm
ca65 -g --debug-info -o obj\bank6.o src\bank6.asm
ca65 -g --debug-info -o obj\bank7.o src\bank7.asm
ca65 -D %GAME% --debug-info -o obj\constants.o src\constants.asm
ca65 -D %GAME% --debug-info -o obj\ines_header.o src\ines_header.asm
ca65 -D %GAME% --debug-info -o obj\bank0.o src\bank0.asm
ca65 -D %GAME% --debug-info -o obj\bank1.o src\bank1.asm
ca65 -D %GAME% --debug-info -o obj\bank2.o src\bank2.asm
ca65 -D %GAME% --debug-info -o obj\bank3.o src\bank3.asm
ca65 -D %GAME% --debug-info -o obj\bank4.o src\bank4.asm
ca65 -D %GAME% --debug-info -o obj\bank5.o src\bank5.asm
ca65 -D %GAME% --debug-info -o obj\bank6.o src\bank6.asm
ca65 -D %GAME% --debug-info -o obj\bank7.o src\bank7.asm
@echo off
rem link assemblies together to single .nes ROM
@ -50,5 +85,5 @@ rem link assemblies together to single .nes ROM
echo "Creating .nes ROM"
@echo on
ld65 -C contra.cfg --dbgfile contra.dbg .\obj\constants.o .\obj\ines_header.o .\obj\bank0.o .\obj\bank1.o .\obj\bank2.o .\obj\bank3.o .\obj\bank4.o .\obj\bank5.o .\obj\bank6.o .\obj\bank7.o -o contra.nes
ld65 -C contra.cfg --dbgfile %DBG_NAME% .\obj\constants.o .\obj\ines_header.o .\obj\bank0.o .\obj\bank1.o .\obj\bank2.o .\obj\bank3.o .\obj\bank4.o .\obj\bank5.o .\obj\bank6.o .\obj\bank7.o -o %ROM_NAME%
@echo off

View File

@ -2,8 +2,23 @@
# Run this script from powershell if available, if not available use build.bat
# batch file from the windows command prompt.
# Contra = [Default] US NES version
# Probotector = European NES version
param([String]$Game='Contra')
$global:SOURCE_CONTRA = $null
$US_CONTRA_HASH = "1C747C78C678F14A68D4E5FCAE065298A103F833638775860F0E5C5FFAA061F62D45FD8942148B1507C1FD57FDE950A5D83F9F84A9782EC048A56067740C48E9"
$GAME_HASH = "1C747C78C678F14A68D4E5FCAE065298A103F833638775860F0E5C5FFAA061F62D45FD8942148B1507C1FD57FDE950A5D83F9F84A9782EC048A56067740C48E9"
$ROM_NAME = "contra.nes"
$DBG_NAME = "contra.dbg"
$ASSETS_NAME = "assets.txt"
$ASSET_GAME_TYPE = "src\assets\asset-game-type.txt"
IF ($Game -ceq "Probotector") {
$ROM_NAME = "probotector.nes"
$DBG_NAME = "probotector.dbg"
$GAME_HASH = "A4BDA4572EC8A3F520DEB4BF483510F6E41ED7665505850D22EC07CA1B25ABFF40B3368A27ECE982EA6E9C71A1B698EB2ADD16C26A7AD67DBA3C0A98C4E2BA43"
$ASSETS_NAME = "probotector-assets.txt"
}
<#
.SYNOPSIS
@ -29,7 +44,7 @@ function Set-Bytes {
}
Write-Output " Writing file $Output."
IF ($PSVersionTable.PSVersion.Major -ge 6) {
$global:SOURCE_CONTRA | Select-Object -Skip $Skip -First $Take | Set-Content $Output -AsByteStream
} ELSE {
@ -37,9 +52,9 @@ function Set-Bytes {
}
}
IF (Test-Path -Path "contra.nes") {
Write-Output "Deleting contra.nes."
Remove-Item -Path "contra.nes"
IF (Test-Path -Path $ROM_NAME) {
Write-Output "Deleting $ROM_NAME."
Remove-Item -Path $ROM_NAME
}
IF (-not (Test-Path -Path "obj")) {
@ -55,18 +70,39 @@ IF (-not (Test-Path -Path "baserom.nes")) {
Write-Output "No baserom.nes file found. If assets are missing, then the build will fail."
} ELSE {
$SHA512_HASH = (Get-FileHash baserom.nes -Algorithm SHA512).Hash
IF ($SHA512_HASH -ne $US_CONTRA_HASH) {
IF ($SHA512_HASH -ne $GAME_HASH) {
Write-Warning "baserom.nes file integrity does NOT match expected result."
}
}
# loop through assets defined in assets.txt and extract bytes from baserom.nes
# used to know which assets were last build
$LAST_BUILD_TYPE = "Contra"
IF (Test-Path $ASSET_GAME_TYPE) {
$LAST_BUILD_TYPE = Get-Content $ASSET_GAME_TYPE -Raw
}
# If the assets are from a different game, then delete them
# For example, if the assets were extracted from Contra and currently building
# Probotector, then delete the assets and extract them from the Probotector baserom.nes
IF ($LAST_BUILD_TYPE -ne $Game) {
Write-Output "Removing graphic asset files"
Remove-Item -Path src\assets\graphic_data\* -Include *.bin
}
# loop through assets defined in assets.txt (or probotector-assets.txt) and extract bytes from baserom.nes
Write-Output "Extracting binary data from baserom.nes"
ForEach ($line in Get-Content -Path assets.txt) {
ForEach ($line in Get-Content -Path $ASSETS_NAME) {
$tokens = -split $line
Set-Bytes -Skip $tokens[1] -Take $tokens[2] -Output $tokens[0]
}
# Store game type that the assets are for
IF (Test-Path $ASSET_GAME_TYPE) {
Remove-Item -Path $ASSET_GAME_TYPE
}
$Game | Set-Content -Path $ASSET_GAME_TYPE -NoNewline
# prevent write race condition
Start-Sleep -Milliseconds 100
@ -74,16 +110,16 @@ Write-Output "Assembling PRG Rom Banks"
# show commands run in output
Set-PSDebug -Trace 1
ca65 -g --debug-info -o obj\constants.o src\constants.asm
ca65 -g --debug-info -o obj\ines_header.o src\ines_header.asm
ca65 -g --debug-info -o obj\bank0.o src\bank0.asm
ca65 -g --debug-info -o obj\bank1.o src\bank1.asm
ca65 -g --debug-info -o obj\bank2.o src\bank2.asm
ca65 -g --debug-info -o obj\bank3.o src\bank3.asm
ca65 -g --debug-info -o obj\bank4.o src\bank4.asm
ca65 -g --debug-info -o obj\bank5.o src\bank5.asm
ca65 -g --debug-info -o obj\bank6.o src\bank6.asm
ca65 -g --debug-info -o obj\bank7.o src\bank7.asm
ca65 -D $Game --debug-info -o obj\constants.o src\constants.asm
ca65 -D $Game --debug-info -o obj\ines_header.o src\ines_header.asm
ca65 -D $Game --debug-info -o obj\bank0.o src\bank0.asm
ca65 -D $Game --debug-info -o obj\bank1.o src\bank1.asm
ca65 -D $Game --debug-info -o obj\bank2.o src\bank2.asm
ca65 -D $Game --debug-info -o obj\bank3.o src\bank3.asm
ca65 -D $Game --debug-info -o obj\bank4.o src\bank4.asm
ca65 -D $Game --debug-info -o obj\bank5.o src\bank5.asm
ca65 -D $Game --debug-info -o obj\bank6.o src\bank6.asm
ca65 -D $Game --debug-info -o obj\bank7.o src\bank7.asm
Set-PSDebug -Trace 0
@ -91,16 +127,16 @@ Set-PSDebug -Trace 0
Write-Output "Creating .nes ROM"
Set-PSDebug -Trace 1
ld65 -C contra.cfg --dbgfile contra.dbg .\obj\constants.o .\obj\ines_header.o .\obj\bank0.o .\obj\bank1.o .\obj\bank2.o .\obj\bank3.o .\obj\bank4.o .\obj\bank5.o .\obj\bank6.o .\obj\bank7.o -o contra.nes
ld65 -C contra.cfg --dbgfile $DBG_NAME .\obj\constants.o .\obj\ines_header.o .\obj\bank0.o .\obj\bank1.o .\obj\bank2.o .\obj\bank3.o .\obj\bank4.o .\obj\bank5.o .\obj\bank6.o .\obj\bank7.o -o $ROM_NAME
# compare assembled ROM hash to expected hash if file exists
Set-PSDebug -Trace 0
IF (Test-Path -Path "contra.nes") {
$SHA512_HASH = (Get-FileHash contra.nes -Algorithm SHA512).Hash
IF (Test-Path -Path $ROM_NAME) {
$SHA512_HASH = (Get-FileHash $ROM_NAME -Algorithm SHA512).Hash
IF ($SHA512_HASH -eq $US_CONTRA_HASH) {
IF ($SHA512_HASH -eq $GAME_HASH) {
Write-Output "File integrity matches."
} ELSE {
Write-Warning "File integrity does NOT match."
}
}
}

View File

@ -4,8 +4,33 @@
# Run this script from a bash terminal if on linux or mac.
# If you are on windows, use either build.ps1, or build.bat
GAME="$1"
GAME_HASH="1c747c78c678f14a68d4e5fcae065298a103f833638775860f0e5c5ffaa061f62d45fd8942148b1507c1fd57fde950a5d83f9f84a9782ec048a56067740c48e9"
ROM_NAME="contra.nes"
DBG_NAME="contra.dbg"
ASSETS_NAME="assets.txt"
ASSET_GAME_TYPE="src/assets/asset-game-type.txt"
us_contra_hash=1c747c78c678f14a68d4e5fcae065298a103f833638775860f0e5c5ffaa061f62d45fd8942148b1507c1fd57fde950a5d83f9f84a9782ec048a56067740c48e9
if [[ "$GAME" == "Probotector" ]]
then
ROM_NAME="probotector.nes"
DBG_NAME="probotector.dbg"
GAME_HASH="a4bda4572ec8a3f520deb4bf483510f6e41ed7665505850d22ec07ca1b25abff40b3368a27ece982ea6e9c71a1b698eb2add16c26a7ad67dba3c0a98c4e2ba43"
ASSETS_NAME="probotector-assets.txt"
else
GAME="Contra"
fi
# function to check between different available hash functions
# mac doesn't come with sha512sum by default, but includes shasum
romHasher() {
if command -v sha512sum &> /dev/null
then
sha512sum $1
else
shasum -a 512 $1
fi
}
setBytes(){
if test -f $3
@ -25,10 +50,10 @@ fi
mkdir -p obj
if test -f "contra.nes"
if test -f ROM_NAME
then
echo "Deleting contra.nes."
rm contra.nes
echo "Deleting ${ROM_NAME}."
rm ROM_NAME
fi
if test -f "obj/*.o"
@ -41,14 +66,30 @@ if ! test -f "baserom.nes"
then
echo "No baserom.nes file found. If assets are missing, then the build will fail."
else
ROM_HASH=$(sha512sum baserom.nes | awk '{print $1}')
if [[ "$ROM_HASH" != $us_contra_hash ]]
ROM_HASH=$(romHasher baserom.nes | awk '{print $1}')
if [[ "$ROM_HASH" != "$GAME_HASH" ]]
then
echo "baserom.nes file integrity does NOT match expected result."
fi
fi
# loop through assets defined in assets.txt and extract bytes from baserom.nes
# used to know which assets were last build
LAST_BUILD_TYPE="Contra"
if test -f $ASSET_GAME_TYPE
then
LAST_BUILD_TYPE=`cat $ASSET_GAME_TYPE`
fi
# If the assets are from a different game, then delete them
# For example, if the assets were extracted from Contra and currently building
# Probotector, then delete the assets and extract them from the Probotector baserom.nes
if [[ "$LAST_BUILD_TYPE" != "$GAME" ]]
then
echo "Removing graphic asset files"
rm src/assets/graphic_data/*.bin
fi
# loop through assets defined in assets.txt (or probotector-assets.txt) and extract bytes from baserom.nes
echo "Extracting binary data from baserom.nes"
while read -r line || [ -n "$p" ]
do
@ -61,26 +102,28 @@ do
setBytes $start $length $file
done < assets.txt
echo "$GAME" > $ASSET_GAME_TYPE
echo "Assembling PRG Rom Banks"
ca65 -g --debug-info -o obj/constants.o src/constants.asm
ca65 -g --debug-info -o obj/ines_header.o src/ines_header.asm
ca65 -g --debug-info -o obj/bank0.o src/bank0.asm
ca65 -g --debug-info -o obj/bank1.o src/bank1.asm
ca65 -g --debug-info -o obj/bank2.o src/bank2.asm
ca65 -g --debug-info -o obj/bank3.o src/bank3.asm
ca65 -g --debug-info -o obj/bank4.o src/bank4.asm
ca65 -g --debug-info -o obj/bank5.o src/bank5.asm
ca65 -g --debug-info -o obj/bank6.o src/bank6.asm
ca65 -g --debug-info -o obj/bank7.o src/bank7.asm
ca65 -D $GAME --debug-info -o obj/constants.o src/constants.asm
ca65 -D $GAME --debug-info -o obj/ines_header.o src/ines_header.asm
ca65 -D $GAME --debug-info -o obj/bank0.o src/bank0.asm
ca65 -D $GAME --debug-info -o obj/bank1.o src/bank1.asm
ca65 -D $GAME --debug-info -o obj/bank2.o src/bank2.asm
ca65 -D $GAME --debug-info -o obj/bank3.o src/bank3.asm
ca65 -D $GAME --debug-info -o obj/bank4.o src/bank4.asm
ca65 -D $GAME --debug-info -o obj/bank5.o src/bank5.asm
ca65 -D $GAME --debug-info -o obj/bank6.o src/bank6.asm
ca65 -D $GAME --debug-info -o obj/bank7.o src/bank7.asm
echo "Creating .nes ROM"
ld65 -C contra.cfg --dbgfile contra.dbg ./obj/constants.o ./obj/ines_header.o ./obj/bank0.o ./obj/bank1.o ./obj/bank2.o ./obj/bank3.o ./obj/bank4.o ./obj/bank5.o ./obj/bank6.o ./obj/bank7.o -o contra.nes
ld65 -C contra.cfg --dbgfile $DBG_NAME ./obj/constants.o ./obj/ines_header.o ./obj/bank0.o ./obj/bank1.o ./obj/bank2.o ./obj/bank3.o ./obj/bank4.o ./obj/bank5.o ./obj/bank6.o ./obj/bank7.o -o $ROM_NAME
if test -f "contra.nes"
if test -f $ROM_NAME
then
# compare assembled ROM hash to expected hash
ROM_HASH=$(sha512sum contra.nes | awk '{print $1}')
if [[ "$ROM_HASH" == $us_contra_hash ]]
ROM_HASH=$(romHasher $ROM_NAME | awk '{print $1}')
if [[ "$ROM_HASH" == "$GAME_HASH" ]]
then
echo "File integrity matches."
else

View File

@ -854,7 +854,8 @@ These 4 enemy types are very similar. They differ in the direction they fire
### 13 - Giant Boss Soldier
* Other Names: Gordea, Giant Boss Robot, Giant Armored Soldier, Boss Giant
* Other Names: Gordea, JJ, Jumping Joey, Giant Boss Robot, Giant Armored
Soldier, Boss Giant
No attributes exist for this enemy.

View File

@ -117,35 +117,37 @@ The PPU Address ranges are specified in interval notation.
* The parentheses () represent 'open interval' and are not included in the
range
| Label Name | Bank | Label In-Memory Address | PRG ROM Address | Graphics Data | PPU Addresses | Comments |
|-------------------|------|-------------------------|-----------------|-----------------------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
| `graphic_data_00` | 7 | $cb36 | $1cb36 | Both nametables + Both Attribute tables | [$2000-$2800) | Sets all Nametable + Attribute table data to #$00 |
| `graphic_data_01` | 4 | $aa2d | $12a2d | Left and Right Pattern tables | [$0ce0-$1f80) | Used for intro screen, level title screens, and game over screens |
| `graphic_data_02` | 2 | $9097 | $9097 | Nametable 0 + Attribute table 0 | [$2000-$2400) | Used for intro screen |
| `graphic_data_03` | 4 | $8001 | $10001 | Left Pattern table | [$0000-$0680) | Used in every level. Contains Bill and Lance blocks, game over letters, lives medals, power-ups (SBFLRM), and explosions |
| `graphic_data_04` | 4 | $85ae | $105ae | Left Pattern table | [$0680-$08c0) | |
| `graphic_data_05` | 5 | $8001 | $14001 | Left and Right Pattern tables | [$09a0-$0a80), [$0dc0-$1200), [$1320-$1600), [$1bd0-$2000) | Character when immobile, and prone. Also has weapon zeppelin. writes to same PPU addresses as `graphic_data_07` and `graphic_data_0b` |
| `graphic_data_06` | 4 | $99fc | $119fc | Left and Right Pattern tables | [$08c0-$1100) | Most Base graphics |
| `graphic_data_07` | 5 | $8a61 | $14a61 | Left and Right Pattern tables | [$09a0-$0a80), [$0dc0-$1200), [$1320-$1600), [$1bd0-$2000) | Writes to same PPU addresses as `graphic_data_05` and `graphic_data_0b` |
| `graphic_data_08` | 4 | $886c | $1086c | Left and Right Pattern tables | [$09a0-$2000) | |
| `graphic_data_09` | 4 | $99cd | $119cd | Left Pattern table | [$0b00-$0b40) | |
| `graphic_data_0a` | 4 | $a005 | $12005 | Right Pattern table | [$1100-$1520) | |
| `graphic_data_0b` | 5 | $93e0 | $153e0 | Left and Right Pattern tables | [$09a0-$0a80), [$0dc0-$1200), [$1320-$1600), [$1bd0-$2000) | Writes to same PPU addresses as `graphic_data_05` and `graphic_data_07` |
| `graphic_data_0c` | 6 | $8001 | $18001 | Left and Right Pattern tables | [$09a0-$0a80), [$0dc0-$0ee0), [$0fc0-$1200), [$1320-$2000) | |
| `graphic_data_0d` | 6 | $8cdc | $18cdc | Left and Right Pattern tables | [$09a0-$0a80), [$0dc0-$0ee0), [$0fc0-$1200), [$1320-$2000) | |
| `graphic_data_0e` | 6 | $9bd6 | $19bd6 | Left and Right Pattern tables | [$09a0-$2000) | |
| `graphic_data_0f` | 4 | $a346 | $12346 | Right Pattern table | [$1520-$1600) | |
| `graphic_data_10` | 4 | $a003 | $12003 | Right Pattern table | [$1a20-$2000) | Same as `graphic_data_11`, but horizontally flipped |
| `graphic_data_11` | 4 | $a3e7 | $123e7 | Right Pattern table | [$1a20-$2000) | |
| `graphic_data_12` | 4 | $a940 | $12940 | Right Pattern table | [$1b90-$1ca0) | |
| `graphic_data_13` | 4 | $87a1 | $107a1 | Left Pattern table | [$08c0-$09a0) | |
| `graphic_data_14` | 5 | $a814 | $16814 | Right Pattern table | [$1600-$1bd0) | |
| `graphic_data_15` | 6 | $b07a | $1b07a | Left Pattern table | [$0ee0-$0fc0) | |
| `graphic_data_16` | 6 | $b15c | $1b15c | Right Pattern table | [$1200-$1320) | |
| `graphic_data_17` | 5 | $addf | $16ddf | Left and Right Pattern tables | [$0a60-$0fe0), [$15b0-$18a0) | |
| `graphic_data_18` | 5 | $b30d | $1730d | Nametable 0 + Attribute table 0 | [$2000-$2400) | Used in ending scene |
| `graphic_data_19` | 5 | $a31b | $1631b | Left Pattern table | [$0680-$08c0) | |
| `graphic_data_1a` | 5 | $a500 | $16500 | Left Pattern table | [$0a80-$0dc0) | |
| Label Name | Bank | Label In-Memory Address | PRG ROM Address | Graphics Data | PPU Addresses | Comments |
|-------------------|------|-------------------------|-----------------|-------------------------------------------|--------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
| `graphic_data_00` | 7 | `$cb36` | `$1cb36` | Both nametables and Both Attribute tables | `[$2000-$2800)` | Sets all Nametable + Attribute table data to #$00. |
| `graphic_data_01` | 4 | `$aa2d` | `$12a2d` | Left and Right Pattern tables | `[$0ce0-$1f80)` | Used for intro screen, level title screens, and game over screens. Contains Contra logo, Bill and Lance sprite tiles, letters, and falcon tiles. |
| `graphic_data_02` | 2 | `$9097` | `$9097` | Nametable 0 and Attribute table 0 | `[$2000-$2400)` | Used for intro screen, contains layout of tiles for intro screen text. |
| `graphic_data_03` | 4 | `$8001` | `$10001` | Left Pattern table | `[$0000-$0680)` | Used in every level. Contains Bill and Lance outdoor sprite tiles, game over letters, lives medals, power-ups (SBFLRM), and explosions. |
| `graphic_data_04` | 4 | `$85ae` | `$105ae` | Left Pattern table | `[$0680-$08c0)` | Used in indoor/base levels. Player sprite pattern tiles. |
| `graphic_data_05` | 5 | `$8001` | `$14001` | Left and Right Pattern tables | `[$09a0-$0a80)`, `[$0dc0-$1200)`, `[$1320-$1600)`, `[$1bd0-$2000)` | Level 1 bridge, mountain, trees, and water tiles. Player prone, and flying capsule tiles. |
| `graphic_data_06` | 4 | `$99fc` | `$119fc` | Left and Right Pattern tables | `[$08c0-$1100)` | Used in indoor/base levels. Indoor player sprites, grenades, and som indoor/base background graphics |
| `graphic_data_07` | 5 | `$8a61` | `$14a61` | Left and Right Pattern tables | `[$09a0-$0a80)`, `[$0dc0-$1200)`, `[$1320-$1600)`, `[$1bd0-$2000)` | Level 3 background and sprite pattern table tiles. Player prone, and flying capsule tiles. |
| `graphic_data_08` | 4 | `$886c` | `$1086c` | Left and Right Pattern tables | `[$09a0-$2000)` | Indoor/base boss screen background and sprite pattern table tiles. |
| `graphic_data_09` | 4 | `$99cd` | `$119cd` | Left Pattern table | `[$0b00-$0b40)` | Level 4 boss screen sprite pattern table tiles. Just 3 tiles. |
| `graphic_data_0a` | 4 | `$a005` | `$12005` | Right Pattern table | `[$1100-$1520)` | Indoor/base pattern table tiles. Same as `graphic_data_0a`, but horizontally flipped. |
| `graphic_data_0b` | 5 | `$93e0` | `$153e0` | Left and Right Pattern tables | `[$09a0-$0a80)`, `[$0dc0-$1200)`, `[$1320-$1600)`, `[$1bd0-$2000)` | Level 5 pattern table tiles. |
| `graphic_data_0c` | 6 | `$8001` | `$18001` | Left and Right Pattern tables | `[$09a0-$0a80)`, `[$0dc0-$0ee0)`, `[$0fc0-$1200)`, `[$1320-$2000)` | Level 6 pattern table tiles. |
| `graphic_data_0d` | 6 | `$8cdc` | `$18cdc` | Left and Right Pattern tables | `[$09a0-$0a80)`, `[$0dc0-$0ee0)`, `[$0fc0-$1200)`, `[$1320-$2000)` | Level 7 pattern table tiles. |
| `graphic_data_0e` | 6 | `$9bd6` | `$19bd6` | Left and Right Pattern tables | `[$09a0-$2000)` | Level 8 pattern table tiles. |
| `graphic_data_0f` | 4 | `$a346` | `$12346` | Right Pattern table | `[$1520-$1600)` | Indoor/base pattern table tiles. #$0e background tiles total. |
| `graphic_data_10` | 4 | `$a003` | `$12003` | Right Pattern table | `[$1a20-$2000)` | Indoor/base pattern table tiles. Same as `graphic_data_0a`, but horizontally flipped. |
| `graphic_data_11` | 4 | `$a3e7` | `$123e7` | Right Pattern table | `[$1a20-$2000)` | Indoor/base background pattern table tiles. |
| `graphic_data_12` | 4 | `$a940` | `$12940` | Right Pattern table | `[$1b90-$1ca0)` | Level 4 background pattern table tiles. |
| `graphic_data_13` | 4 | `$87a1` | `$107a1` | Left Pattern table | `[$08c0-$09a0)` | Player top-half aiming angled up and player aiming straight. Also contains the laser bullet sprites. |
| `graphic_data_14` | 5 | `$a814` | `$16814` | Right Pattern table | `[$1600-$1bd0)` | Rotating gun and red turret pattern table tiles. |
| `graphic_data_15` | 6 | `$b07a` | `$1b07a` | Left Pattern table | `[$0ee0-$0fc0)` | Level 5, 6, and 7 sprite pattern table tiles for turret man (basquez). |
| `graphic_data_16` | 6 | `$b15c` | `$1b15c` | Right Pattern table | `[$1200-$1320)` | Weapon box pattern table tiles. |
| `graphic_data_17` | 5 | `$addf` | `$16ddf` | Left and Right Pattern tables | `[$0a60-$0fe0)`, `[$15b0-$18a0)` | Ending scene pattern table tiles. Includes helicopter sprite tiles and island background tiles. |
| `graphic_data_18` | 5 | `$b30d` | `$1730d` | Nametable 0 and Attribute table 0 | `[$2000-$2400)` | Nametable and attribute table data for ending scene. |
| `graphic_data_19` | 5 | `$a31b` | `$1631b` | Left Pattern table | `[$0680-$08c0)` | Player killed sprite tiles: recoil from hit and lying on ground. |
| `graphic_data_1a` | 5 | `$a500` | `$16500` | Left Pattern table | `[$0a80-$0dc0)` | Enemy soldier sprite pattern table tiles. |
Interestingly, the outdoor player prone and flying capsule sprite tiles are duplicated on all outdoor levels.
## Background Collision Data

116
docs/Probotector.md Normal file
View File

@ -0,0 +1,116 @@
# Overview
This file outlines the differences between _Contra_ (US) and _Probotector_.
_Probotector_ is the PAL-specific variation of the _Contra_ (US) game. Note
that all of the documentation that refers to code or look up table memory
addresses were documented using _Contra_ (US) and may not be identical to the
addresses in _Probotector_. All of the addresses that are used for game logic
are the same. This includes pretty much any address defined in `constants.asm`.
# Differences
There are about 168 differences (#$a8 differences) between _Contra_ (US) and
_Probotector_. Most of these differences are sprites.
## Logic
* When destroying all enemies (cleared screen, defeated boss, or picked up
falcon weapon item), there is an additional check to not update the enemy to the
"enemy destroyed" routine if its HP is 0. This check isn't done in _Contra_
(US). This has no known effective difference in game play.
* There is a useless execution of a function that does nothing but exit in the
`check_for_pause` label.
## Audio
The helicopter sound is not played during the ending animation in _Probotector_.
This is because the helicopter was replaced with a Jet.
## Background
* The introduction screen is completely different in _Probotector_. There is no
scrolling introduction, and Bill and Lance have been replaced with a large
PROBOTECTOR graphic.
* The `level_8_supertile_data` is different between _Probotector_ and _Contra_
(US). 3 super-tiles on the wall in front of the Alien Guardian (enemy type
#$10) in Alien's Lair contain more well-formed shells in _Probotector_. The
shells in _Probotector_ are actually retained from the super-tiles from the
Japanese version.
## Palettes
A few palettes are different, causing the sprites to have been updated to use
a different palette index to maintain the same color as the _Contra_. Some of
the sprites are different colors due to the sprite changes
* Giant boss soldier's (enemy type #$13) spiked projectiles (enemy type #$14)
were changed from blue to gray.
* Enemy bullet color is red rather than white.
* Dragon orbs (enemy type #$15) are red and blue rather than grey and red.
* Ice grenades (enemy type #$11) are gray instead of blue.
* Mining carts (enemy type #$14 and #$15) have black wheels instead of blue.
* Flying capsules (enemy type #$03) on Alien's Lair are pink.
Player invincibility sprite palette pattern for player 2 alternates between red
and gray instead of red and blue like in _Contra_ (US). In _Contra_ (US) both
player 1 and player 2 flash between red and blue when have the B weapon.
## Text
* In the SPECIAL THANKS section of the credits, the to "AC CONTRA TEAM" has been
replaced with "AC TEAM".
* The location of various text on the game over screen and continue screen have
been slightly moved
* GAME OVER
* CONTINUE
* END
* 1 PLAYER
* 2 PLAYERS
* Similarly, the introduction screen cursor locations have been updated to match
the new location of CONTINUE/END.
## Sprites
Many of the sprites were changed to replace humans with robots.
Additionally, some sprite animations were simplified, making many sprites
identical, when they weren't identity in _Contra_ (US)
* `sprite_27`, `sprite_28`, `sprite_3c` are equal
* `sprite_29` and `sprite_42` are equal
* `sprite_3b` and `sprite_3f` are equal
* `sprite_3d`and `sprite_3e` are equal
* `sprite_93` and `sprite_94` are equal
* `sprite_b7` and `sprite_b8` are equal
* `sprite_bd` and `sprite_be` are equal
* `sprite_cc`, `sprite_cd`, `sprite_ce` are unused in _Probotector_. However,
they do exist and point to `sprite_cf` (ending animation islands).
To accommodate the player sprite changes, the initial location relative to the
center of the player where bullets are generated have been adjusted (see
`bullet_initial_pos_00`).
## Graphics
Below is the list of compressed graphics that are different. I haven't
confirmed, but these differences are most likely just sprite pattern table tile
differences (left pattern table).
* `alt_graphic_data_03`
* `graphic_data_01`
* `graphic_data_02`
* `graphic_data_03`
* `graphic_data_04`
* `graphic_data_05`
* `graphic_data_06`
* `graphic_data_07`
* `graphic_data_08`
* `graphic_data_09`
* `graphic_data_0b`
* `graphic_data_0c`
* `graphic_data_0d`
* `graphic_data_0e`
* `graphic_data_13`
* `graphic_data_15`
* `graphic_data_17`
* `graphic_data_18`
* `graphic_data_19`
* `graphic_data_1a`

View File

@ -9,37 +9,77 @@ The player lives medals in the heads up display (HUD) are not in the sprite
tables, but the tiles are written directly to the OAMDMA via the CPU buffer.
# Sprite Table
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|---|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|
| 0 | | | ![sprite_02](sprite_02.png?raw=true "sprite_02") ![sprite_02_p2](sprite_02_p2.png?raw=true "sprite_02_p2") | ![sprite_03](sprite_03.png?raw=true "sprite_03") ![sprite_03_p2](sprite_03_p2.png?raw=true "sprite_03_p2") | ![sprite_04](sprite_04.png?raw=true "sprite_04") ![sprite_04_p2](sprite_04_p2.png?raw=true "sprite_04_p2") | ![sprite_05](sprite_05.png?raw=true "sprite_05") ![sprite_05_p2](sprite_05_p2.png?raw=true "sprite_05_p2") | ![sprite_06](sprite_06.png?raw=true "sprite_06") ![sprite_06_p2](sprite_06_p2.png?raw=true "sprite_06_p2") | ![sprite_07](sprite_07.png?raw=true "sprite_07") | ![sprite_08](sprite_08.png?raw=true "sprite_08") ![sprite_08_p2](sprite_08_p2.png?raw=true "sprite_08_p2") | ![sprite_09](sprite_09.png?raw=true "sprite_09") ![sprite_09_p2](sprite_09_p2.png?raw=true "sprite_09_p2") | ![sprite_0a](sprite_0a.png?raw=true "sprite_0a") ![sprite_0a_p2](sprite_0a_p2.png?raw=true "sprite_0a_p2") | ![sprite_0b](sprite_0b.png?raw=true "sprite_0b") ![sprite_0b_p2](sprite_0b_p2.png?raw=true "sprite_0b_p2") | ![sprite_0c](sprite_0c.png?raw=true "sprite_0c") ![sprite_0c_p2](sprite_0c_p2.png?raw=true "sprite_0c_p2") | ![sprite_0d](sprite_0d.png?raw=true "sprite_0d") ![sprite_0d_p2](sprite_0d_p2.png?raw=true "sprite_0d_p2") | ![sprite_0e](sprite_0e.png?raw=true "sprite_0e") ![sprite_0e_p2](sprite_0e_p2.png?raw=true "sprite_0e_p2") | ![sprite_0f](sprite_0f.png?raw=true "sprite_0f") ![sprite_0f_p2](sprite_0f_p2.png?raw=true "sprite_0f_p2") |
| 1 | ![sprite_10](sprite_10.png?raw=true "sprite_10") ![sprite_10_p2](sprite_10_p2.png?raw=true "sprite_10_p2") | ![sprite_11](sprite_11.png?raw=true "sprite_11") ![sprite_11_p2](sprite_11_p2.png?raw=true "sprite_11_p2") | ![sprite_12](sprite_12.png?raw=true "sprite_12") ![sprite_12_p2](sprite_12_p2.png?raw=true "sprite_12_p2") | ![sprite_13](sprite_13.png?raw=true "sprite_13") ![sprite_13_p2](sprite_13_p2.png?raw=true "sprite_13_p2") | ![sprite_14](sprite_14.png?raw=true "sprite_14") ![sprite_14_p2](sprite_14_p2.png?raw=true "sprite_14_p2") | ![sprite_15](sprite_15.png?raw=true "sprite_15") ![sprite_15_p2](sprite_15_p2.png?raw=true "sprite_15_p2") | ![sprite_16](sprite_16.png?raw=true "sprite_16") ![sprite_16_p2](sprite_16_p2.png?raw=true "sprite_16_p2") | ![sprite_17](sprite_17.png?raw=true "sprite_17") ![sprite_17_p2](sprite_17_p2.png?raw=true "sprite_17_p2") | ![sprite_18](sprite_18.png?raw=true "sprite_18") | ![sprite_19](sprite_19.png?raw=true "sprite_19") | ![sprite_1a](sprite_1a.png?raw=true "sprite_1a") | ![sprite_1b](sprite_1b.png?raw=true "sprite_1b") | ![sprite_1c](sprite_1c.png?raw=true "sprite_1c") | ![sprite_1d](sprite_1d.png?raw=true "sprite_1d") | ![sprite_1e](sprite_1e.png?raw=true "sprite_1e") | ![sprite_1f](sprite_1f.png?raw=true "sprite_1f") |
| 2 | ![sprite_20](sprite_20.png?raw=true "sprite_20") | ![sprite_21](sprite_21.png?raw=true "sprite_21") | ![sprite_22](sprite_22.png?raw=true "sprite_22") | ![sprite_23](sprite_23.png?raw=true "sprite_23") | ![sprite_24](sprite_24.png?raw=true "sprite_24") | ![sprite_25](sprite_25.png?raw=true "sprite_25") | ![sprite_26](sprite_26.png?raw=true "sprite_26") | ![sprite_27](sprite_27.png?raw=true "sprite_27") | ![sprite_28](sprite_28.png?raw=true "sprite_28") | ![sprite_29](sprite_29.png?raw=true "sprite_29") | ![sprite_2a](sprite_2a.png?raw=true "sprite_2a") | ![sprite_2b](sprite_2b.png?raw=true "sprite_2b") | ![sprite_2c](sprite_2c.png?raw=true "sprite_2c") | ![sprite_2d](sprite_2d.png?raw=true "sprite_2d") | | ![sprite_2f](sprite_2f.png?raw=true "sprite_2f") |
| 3 | ![sprite_30](sprite_30.png?raw=true "sprite_30") | ![sprite_31](sprite_31.png?raw=true "sprite_31") | ![sprite_32](sprite_32.png?raw=true "sprite_32") | ![sprite_33](sprite_33.png?raw=true "sprite_33") | ![sprite_34](sprite_34.png?raw=true "sprite_34") | ![sprite_35](sprite_35.png?raw=true "sprite_35") | ![sprite_36](sprite_36.png?raw=true "sprite_36") | ![sprite_37](sprite_37.png?raw=true "sprite_37") | ![sprite_38](sprite_38.png?raw=true "sprite_38") | ![sprite_39](sprite_39.png?raw=true "sprite_39") | ![sprite_3a](sprite_3a.png?raw=true "sprite_3a") | ![sprite_3b](sprite_3b.png?raw=true "sprite_3b") | ![sprite_3c](sprite_3c.png?raw=true "sprite_3c") | ![sprite_3d](sprite_3d.png?raw=true "sprite_3d") | ![sprite_3e](sprite_3e.png?raw=true "sprite_3e") | ![sprite_3f](sprite_3f.png?raw=true "sprite_3f") |
| 4 | ![sprite_40](sprite_40.png?raw=true "sprite_40") | ![sprite_41](sprite_41.png?raw=true "sprite_41") | ![sprite_42](sprite_42.png?raw=true "sprite_42") | ![sprite_43](sprite_43.png?raw=true "sprite_43") | ![sprite_44](sprite_44.png?raw=true "sprite_44") | ![sprite_45](sprite_45.png?raw=true "sprite_45") | ![sprite_46](sprite_46.png?raw=true "sprite_46") | ![sprite_47](sprite_47.png?raw=true "sprite_47") | ![sprite_48](sprite_48.png?raw=true "sprite_48") | ![sprite_49](sprite_49.png?raw=true "sprite_49") | ![sprite_4a](sprite_4a.png?raw=true "sprite_4a") | ![sprite_4b](sprite_4b.png?raw=true "sprite_4b") | ![sprite_4c](sprite_4c.png?raw=true "sprite_4c") | ![sprite_4d](sprite_4d.png?raw=true "sprite_4d") | ![sprite_4e](sprite_4e.gif?raw=true "sprite_4e") | |
| 5 | ![sprite_50](sprite_50.png?raw=true "sprite_50") ![sprite_50_p2](sprite_50_p2.png?raw=true "sprite_50_p2") | ![sprite_51](sprite_51.png?raw=true "sprite_51") ![sprite_51_p2](sprite_51_p2.png?raw=true "sprite_51_p2") | ![sprite_52](sprite_52.png?raw=true "sprite_52") ![sprite_52_p2](sprite_52_p2.png?raw=true "sprite_52_p2") | ![sprite_53](sprite_53.png?raw=true "sprite_53") ![sprite_53_p2](sprite_53_p2.png?raw=true "sprite_53_p2") | ![sprite_54](sprite_54.png?raw=true "sprite_54") ![sprite_54_p2](sprite_54_p2.png?raw=true "sprite_54_p2") | ![sprite_55](sprite_55.png?raw=true "sprite_55") ![sprite_55_p2](sprite_55_p2.png?raw=true "sprite_55_p2") | ![sprite_56](sprite_56.png?raw=true "sprite_56") ![sprite_56_p2](sprite_56_p2.png?raw=true "sprite_56_p2") | ![sprite_57](sprite_57.png?raw=true "sprite_57") ![sprite_57_p2](sprite_57_p2.png?raw=true "sprite_57_p2") | ![sprite_58](sprite_58.png?raw=true "sprite_58") ![sprite_58_p2](sprite_58_p2.png?raw=true "sprite_58_p2") | | | | | ![sprite_5d](sprite_5d.png?raw=true "sprite_5d") | ![sprite_5e](sprite_5e.png?raw=true "sprite_5e") | ![sprite_5f](sprite_5f.png?raw=true "sprite_5f") |
| 6 | ![sprite_60](sprite_60.png?raw=true "sprite_60") | ![sprite_61](sprite_61.png?raw=true "sprite_61") | ![sprite_62](sprite_62.png?raw=true "sprite_62") | ![sprite_63](sprite_63.png?raw=true "sprite_63") | ![sprite_64](sprite_64.png?raw=true "sprite_64") | | | | ![sprite_68](sprite_68.png?raw=true "sprite_68") | ![sprite_69](sprite_69.png?raw=true "sprite_69") | ![sprite_6a](sprite_6a.png?raw=true "sprite_6a") | ![sprite_6b](sprite_6b.png?raw=true "sprite_6b") | ![sprite_6c](sprite_6c.png?raw=true "sprite_6c") | ![sprite_6d](sprite_6d.png?raw=true "sprite_6d") | ![sprite_6e](sprite_6e.png?raw=true "sprite_6e") | ![sprite_6f](sprite_6f.png?raw=true "sprite_6f") |
| 7 | ![sprite_70](sprite_70.png?raw=true "sprite_70") | ![sprite_71](sprite_71.png?raw=true "sprite_71") | ![sprite_72](sprite_72.png?raw=true "sprite_72") | ![sprite_73](sprite_73.png?raw=true "sprite_73") | ![sprite_74](sprite_74.png?raw=true "sprite_74") | ![sprite_75](sprite_75.png?raw=true "sprite_75") | ![sprite_76](sprite_76.png?raw=true "sprite_76") | ![sprite_77](sprite_77.png?raw=true "sprite_77") | ![sprite_78](sprite_78.png?raw=true "sprite_78") | ![sprite_79](sprite_79.png?raw=true "sprite_79") | ![sprite_7a](sprite_7a.png?raw=true "sprite_7a") | ![sprite_7b](sprite_7b.png?raw=true "sprite_7b") | ![sprite_7c](sprite_7c.png?raw=true "sprite_7c") | ![sprite_7d](sprite_7d.png?raw=true "sprite_7d") | ![sprite_7e](sprite_7e.png?raw=true "sprite_7e") | |
| 8 | | | ![sprite_82](sprite_82.png?raw=true "sprite_82") | ![sprite_83](sprite_83.png?raw=true "sprite_83") | ![sprite_84](sprite_84.png?raw=true "sprite_84") | ![sprite_85](sprite_85.png?raw=true "sprite_85") | ![sprite_86](sprite_86.png?raw=true "sprite_86") | ![sprite_87](sprite_87.png?raw=true "sprite_87") | ![sprite_88](sprite_88.png?raw=true "sprite_88") | ![sprite_89](sprite_89.png?raw=true "sprite_89") | ![sprite_8a](sprite_8a.png?raw=true "sprite_8a") | ![sprite_8b](sprite_8b.png?raw=true "sprite_8b") | ![sprite_8c](sprite_8c.png?raw=true "sprite_8c") | ![sprite_8d](sprite_8d.png?raw=true "sprite_8d") | ![sprite_8e](sprite_8e.png?raw=true "sprite_8e") | ![sprite_8f](sprite_8f.png?raw=true "sprite_8f") |
| 9 | ![sprite_90](sprite_90.png?raw=true "sprite_90") | ![sprite_91](sprite_91.png?raw=true "sprite_91") ![sprite_91_p2](sprite_91_p2.png?raw=true "sprite_91_p2") | ![sprite_92](sprite_92.png?raw=true "sprite_92") | ![sprite_93](sprite_93.png?raw=true "sprite_93") | ![sprite_94](sprite_94.png?raw=true "sprite_94") | ![sprite_95](sprite_95.png?raw=true "sprite_95") | ![sprite_96](sprite_96.png?raw=true "sprite_96") | ![sprite_97](sprite_97.png?raw=true "sprite_97") | ![sprite_98](sprite_98.png?raw=true "sprite_98") | ![sprite_99](sprite_99.png?raw=true "sprite_99") | ![sprite_9a](sprite_9a.png?raw=true "sprite_9a") | ![sprite_9b](sprite_9b.png?raw=true "sprite_9b") | ![sprite_9c](sprite_9c.png?raw=true "sprite_9c") | ![sprite_9d](sprite_9d.png?raw=true "sprite_9d") | ![sprite_9e](sprite_9e.png?raw=true "sprite_9e") | ![sprite_9f](sprite_9f.png?raw=true "sprite_9f") |
| a | ![sprite_a0](sprite_a0.png?raw=true "sprite_a0") | ![sprite_a1](sprite_a1.png?raw=true "sprite_a1") | ![sprite_a2](sprite_a2.png?raw=true "sprite_a2") | ![sprite_a3](sprite_a3.png?raw=true "sprite_a3") | ![sprite_a4](sprite_a4.png?raw=true "sprite_a4") | ![sprite_a5](sprite_a5.png?raw=true "sprite_a5") | ![sprite_a6](sprite_a6.png?raw=true "sprite_a6") | ![sprite_a7](sprite_a7.png?raw=true "sprite_a7") | ![sprite_a8](sprite_a8.png?raw=true "sprite_a8") | ![sprite_a9](sprite_a9.png?raw=true "sprite_a9") | ![sprite_aa](sprite_aa.png?raw=true "sprite_aa") | ![sprite_ab](sprite_ab.png?raw=true "sprite_ab") | ![sprite_ac](sprite_ac.png?raw=true "sprite_ac") | ![sprite_ad](sprite_ad.png?raw=true "sprite_ad") | ![sprite_ae](sprite_ae.png?raw=true "sprite_ae") | ![sprite_af](sprite_af.png?raw=true "sprite_af") |
| b | ![sprite_b0](sprite_b0.png?raw=true "sprite_b0") | ![sprite_b1](sprite_b1.png?raw=true "sprite_b1") | ![sprite_b2](sprite_b2.png?raw=true "sprite_b2") | ![sprite_b3](sprite_b3.png?raw=true "sprite_b3") | ![sprite_b4](sprite_b4.png?raw=true "sprite_b4") | ![sprite_b5](sprite_b5.png?raw=true "sprite_b5") | ![sprite_b6](sprite_b6.png?raw=true "sprite_b6") | ![sprite_b7](sprite_b7.png?raw=true "sprite_b7") | ![sprite_b8](sprite_b8.png?raw=true "sprite_b8") | ![sprite_b9](sprite_b9.png?raw=true "sprite_b9") | ![sprite_ba](sprite_ba.png?raw=true "sprite_ba") | ![sprite_bb](sprite_bb.png?raw=true "sprite_bb") | ![sprite_bc](sprite_bc.png?raw=true "sprite_bc") | ![sprite_bd](sprite_bd.png?raw=true "sprite_bd") | ![sprite_be](sprite_be.png?raw=true "sprite_be") | ![sprite_bf](sprite_bf.png?raw=true "sprite_bf") |
| c | ![sprite_c0](sprite_c0.png?raw=true "sprite_c0") | ![sprite_c1](sprite_c1.png?raw=true "sprite_c1") | ![sprite_c2](sprite_c2.png?raw=true "sprite_c2") | ![sprite_c3](sprite_c3.png?raw=true "sprite_c3") | ![sprite_c4](sprite_c4.png?raw=true "sprite_c4") | ![sprite_c5](sprite_c5.png?raw=true "sprite_c5") | ![sprite_c6](sprite_c6.png?raw=true "sprite_c6") | ![sprite_c7](sprite_c7.png?raw=true "sprite_c7") | ![sprite_c8](sprite_c8.png?raw=true "sprite_c8") | ![sprite_c9](sprite_c9.png?raw=true "sprite_c9") | ![sprite_ca](sprite_ca.png?raw=true "sprite_ca") | ![sprite_cb](sprite_cb.png?raw=true "sprite_cb") | ![sprite_cc](sprite_cc.png?raw=true "sprite_cc") | ![sprite_cd](sprite_cd.png?raw=true "sprite_cd") | ![sprite_ce](sprite_ce.png?raw=true "sprite_ce") | ![sprite_cf](sprite_cf.png?raw=true "sprite_cf") |
## Contra (US)
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|---|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|
| 0 | | | ![sprite_02](contra_sprites/sprite_02.png?raw=true "sprite_02") ![sprite_02_p2](contra_sprites/sprite_02_p2.png?raw=true "sprite_02_p2") | ![sprite_03](contra_sprites/sprite_03.png?raw=true "sprite_03") ![sprite_03_p2](contra_sprites/sprite_03_p2.png?raw=true "sprite_03_p2") | ![sprite_04](contra_sprites/sprite_04.png?raw=true "sprite_04") ![sprite_04_p2](contra_sprites/sprite_04_p2.png?raw=true "sprite_04_p2") | ![sprite_05](contra_sprites/sprite_05.png?raw=true "sprite_05") ![sprite_05_p2](contra_sprites/sprite_05_p2.png?raw=true "sprite_05_p2") | ![sprite_06](contra_sprites/sprite_06.png?raw=true "sprite_06") ![sprite_06_p2](contra_sprites/sprite_06_p2.png?raw=true "sprite_06_p2") | ![sprite_07](contra_sprites/sprite_07.png?raw=true "sprite_07") | ![sprite_08](contra_sprites/sprite_08.png?raw=true "sprite_08") ![sprite_08_p2](contra_sprites/sprite_08_p2.png?raw=true "sprite_08_p2") | ![sprite_09](contra_sprites/sprite_09.png?raw=true "sprite_09") ![sprite_09_p2](contra_sprites/sprite_09_p2.png?raw=true "sprite_09_p2") | ![sprite_0a](contra_sprites/sprite_0a.png?raw=true "sprite_0a") ![sprite_0a_p2](contra_sprites/sprite_0a_p2.png?raw=true "sprite_0a_p2") | ![sprite_0b](contra_sprites/sprite_0b.png?raw=true "sprite_0b") ![sprite_0b_p2](contra_sprites/sprite_0b_p2.png?raw=true "sprite_0b_p2") | ![sprite_0c](contra_sprites/sprite_0c.png?raw=true "sprite_0c") ![sprite_0c_p2](contra_sprites/sprite_0c_p2.png?raw=true "sprite_0c_p2") | ![sprite_0d](contra_sprites/sprite_0d.png?raw=true "sprite_0d") ![sprite_0d_p2](contra_sprites/sprite_0d_p2.png?raw=true "sprite_0d_p2") | ![sprite_0e](contra_sprites/sprite_0e.png?raw=true "sprite_0e") ![sprite_0e_p2](contra_sprites/sprite_0e_p2.png?raw=true "sprite_0e_p2") | ![sprite_0f](contra_sprites/sprite_0f.png?raw=true "sprite_0f") ![sprite_0f_p2](contra_sprites/sprite_0f_p2.png?raw=true "sprite_0f_p2") |
| 1 | ![sprite_10](contra_sprites/sprite_10.png?raw=true "sprite_10") ![sprite_10_p2](contra_sprites/sprite_10_p2.png?raw=true "sprite_10_p2") | ![sprite_11](contra_sprites/sprite_11.png?raw=true "sprite_11") ![sprite_11_p2](contra_sprites/sprite_11_p2.png?raw=true "sprite_11_p2") | ![sprite_12](contra_sprites/sprite_12.png?raw=true "sprite_12") ![sprite_12_p2](contra_sprites/sprite_12_p2.png?raw=true "sprite_12_p2") | ![sprite_13](contra_sprites/sprite_13.png?raw=true "sprite_13") ![sprite_13_p2](contra_sprites/sprite_13_p2.png?raw=true "sprite_13_p2") | ![sprite_14](contra_sprites/sprite_14.png?raw=true "sprite_14") ![sprite_14_p2](contra_sprites/sprite_14_p2.png?raw=true "sprite_14_p2") | ![sprite_15](contra_sprites/sprite_15.png?raw=true "sprite_15") ![sprite_15_p2](contra_sprites/sprite_15_p2.png?raw=true "sprite_15_p2") | ![sprite_16](contra_sprites/sprite_16.png?raw=true "sprite_16") ![sprite_16_p2](contra_sprites/sprite_16_p2.png?raw=true "sprite_16_p2") | ![sprite_17](contra_sprites/sprite_17.png?raw=true "sprite_17") ![sprite_17_p2](contra_sprites/sprite_17_p2.png?raw=true "sprite_17_p2") | ![sprite_18](contra_sprites/sprite_18.png?raw=true "sprite_18") | ![sprite_19](contra_sprites/sprite_19.png?raw=true "sprite_19") | ![sprite_1a](contra_sprites/sprite_1a.png?raw=true "sprite_1a") | ![sprite_1b](contra_sprites/sprite_1b.png?raw=true "sprite_1b") | ![sprite_1c](contra_sprites/sprite_1c.png?raw=true "sprite_1c") | ![sprite_1d](contra_sprites/sprite_1d.png?raw=true "sprite_1d") | ![sprite_1e](contra_sprites/sprite_1e.png?raw=true "sprite_1e") | ![sprite_1f](contra_sprites/sprite_1f.png?raw=true "sprite_1f") |
| 2 | ![sprite_20](contra_sprites/sprite_20.png?raw=true "sprite_20") | ![sprite_21](contra_sprites/sprite_21.png?raw=true "sprite_21") | ![sprite_22](contra_sprites/sprite_22.png?raw=true "sprite_22") | ![sprite_23](contra_sprites/sprite_23.png?raw=true "sprite_23") | ![sprite_24](contra_sprites/sprite_24.png?raw=true "sprite_24") | ![sprite_25](contra_sprites/sprite_25.png?raw=true "sprite_25") | ![sprite_26](contra_sprites/sprite_26.png?raw=true "sprite_26") | ![sprite_27](contra_sprites/sprite_27.png?raw=true "sprite_27") | ![sprite_28](contra_sprites/sprite_28.png?raw=true "sprite_28") | ![sprite_29](contra_sprites/sprite_29.png?raw=true "sprite_29") | ![sprite_2a](contra_sprites/sprite_2a.png?raw=true "sprite_2a") | ![sprite_2b](contra_sprites/sprite_2b.png?raw=true "sprite_2b") | ![sprite_2c](contra_sprites/sprite_2c.png?raw=true "sprite_2c") | ![sprite_2d](contra_sprites/sprite_2d.png?raw=true "sprite_2d") | | ![sprite_2f](contra_sprites/sprite_2f.png?raw=true "sprite_2f") |
| 3 | ![sprite_30](contra_sprites/sprite_30.png?raw=true "sprite_30") | ![sprite_31](contra_sprites/sprite_31.png?raw=true "sprite_31") | ![sprite_32](contra_sprites/sprite_32.png?raw=true "sprite_32") | ![sprite_33](contra_sprites/sprite_33.png?raw=true "sprite_33") | ![sprite_34](contra_sprites/sprite_34.png?raw=true "sprite_34") | ![sprite_35](contra_sprites/sprite_35.png?raw=true "sprite_35") | ![sprite_36](contra_sprites/sprite_36.png?raw=true "sprite_36") | ![sprite_37](contra_sprites/sprite_37.png?raw=true "sprite_37") | ![sprite_38](contra_sprites/sprite_38.png?raw=true "sprite_38") | ![sprite_39](contra_sprites/sprite_39.png?raw=true "sprite_39") | ![sprite_3a](contra_sprites/sprite_3a.png?raw=true "sprite_3a") | ![sprite_3b](contra_sprites/sprite_3b.png?raw=true "sprite_3b") | ![sprite_3c](contra_sprites/sprite_3c.png?raw=true "sprite_3c") | ![sprite_3d](contra_sprites/sprite_3d.png?raw=true "sprite_3d") | ![sprite_3e](contra_sprites/sprite_3e.png?raw=true "sprite_3e") | ![sprite_3f](contra_sprites/sprite_3f.png?raw=true "sprite_3f") |
| 4 | ![sprite_40](contra_sprites/sprite_40.png?raw=true "sprite_40") | ![sprite_41](contra_sprites/sprite_41.png?raw=true "sprite_41") | ![sprite_42](contra_sprites/sprite_42.png?raw=true "sprite_42") | ![sprite_43](contra_sprites/sprite_43.png?raw=true "sprite_43") | ![sprite_44](contra_sprites/sprite_44.png?raw=true "sprite_44") | ![sprite_45](contra_sprites/sprite_45.png?raw=true "sprite_45") | ![sprite_46](contra_sprites/sprite_46.png?raw=true "sprite_46") | ![sprite_47](contra_sprites/sprite_47.png?raw=true "sprite_47") | ![sprite_48](contra_sprites/sprite_48.png?raw=true "sprite_48") | ![sprite_49](contra_sprites/sprite_49.png?raw=true "sprite_49") | ![sprite_4a](contra_sprites/sprite_4a.png?raw=true "sprite_4a") | ![sprite_4b](contra_sprites/sprite_4b.png?raw=true "sprite_4b") | ![sprite_4c](contra_sprites/sprite_4c.png?raw=true "sprite_4c") | ![sprite_4d](contra_sprites/sprite_4d.png?raw=true "sprite_4d") | ![sprite_4e](contra_sprites/sprite_4e.gif?raw=true "sprite_4e") | |
| 5 | ![sprite_50](contra_sprites/sprite_50.png?raw=true "sprite_50") ![sprite_50_p2](contra_sprites/sprite_50_p2.png?raw=true "sprite_50_p2") | ![sprite_51](contra_sprites/sprite_51.png?raw=true "sprite_51") ![sprite_51_p2](contra_sprites/sprite_51_p2.png?raw=true "sprite_51_p2") | ![sprite_52](contra_sprites/sprite_52.png?raw=true "sprite_52") ![sprite_52_p2](contra_sprites/sprite_52_p2.png?raw=true "sprite_52_p2") | ![sprite_53](contra_sprites/sprite_53.png?raw=true "sprite_53") ![sprite_53_p2](contra_sprites/sprite_53_p2.png?raw=true "sprite_53_p2") | ![sprite_54](contra_sprites/sprite_54.png?raw=true "sprite_54") ![sprite_54_p2](contra_sprites/sprite_54_p2.png?raw=true "sprite_54_p2") | ![sprite_55](contra_sprites/sprite_55.png?raw=true "sprite_55") ![sprite_55_p2](contra_sprites/sprite_55_p2.png?raw=true "sprite_55_p2") | ![sprite_56](contra_sprites/sprite_56.png?raw=true "sprite_56") ![sprite_56_p2](contra_sprites/sprite_56_p2.png?raw=true "sprite_56_p2") | ![sprite_57](contra_sprites/sprite_57.png?raw=true "sprite_57") ![sprite_57_p2](contra_sprites/sprite_57_p2.png?raw=true "sprite_57_p2") | ![sprite_58](contra_sprites/sprite_58.png?raw=true "sprite_58") ![sprite_58_p2](contra_sprites/sprite_58_p2.png?raw=true "sprite_58_p2") | | | | | ![sprite_5d](contra_sprites/sprite_5d.png?raw=true "sprite_5d") | ![sprite_5e](contra_sprites/sprite_5e.png?raw=true "sprite_5e") | ![sprite_5f](contra_sprites/sprite_5f.png?raw=true "sprite_5f") |
| 6 | ![sprite_60](contra_sprites/sprite_60.png?raw=true "sprite_60") | ![sprite_61](contra_sprites/sprite_61.png?raw=true "sprite_61") | ![sprite_62](contra_sprites/sprite_62.png?raw=true "sprite_62") | ![sprite_63](contra_sprites/sprite_63.png?raw=true "sprite_63") | ![sprite_64](contra_sprites/sprite_64.png?raw=true "sprite_64") | | | | ![sprite_68](contra_sprites/sprite_68.png?raw=true "sprite_68") | ![sprite_69](contra_sprites/sprite_69.png?raw=true "sprite_69") | ![sprite_6a](contra_sprites/sprite_6a.png?raw=true "sprite_6a") | ![sprite_6b](contra_sprites/sprite_6b.png?raw=true "sprite_6b") | ![sprite_6c](contra_sprites/sprite_6c.png?raw=true "sprite_6c") | ![sprite_6d](contra_sprites/sprite_6d.png?raw=true "sprite_6d") | ![sprite_6e](contra_sprites/sprite_6e.png?raw=true "sprite_6e") | ![sprite_6f](contra_sprites/sprite_6f.png?raw=true "sprite_6f") |
| 7 | ![sprite_70](contra_sprites/sprite_70.png?raw=true "sprite_70") | ![sprite_71](contra_sprites/sprite_71.png?raw=true "sprite_71") | ![sprite_72](contra_sprites/sprite_72.png?raw=true "sprite_72") | ![sprite_73](contra_sprites/sprite_73.png?raw=true "sprite_73") | ![sprite_74](contra_sprites/sprite_74.png?raw=true "sprite_74") | ![sprite_75](contra_sprites/sprite_75.png?raw=true "sprite_75") | ![sprite_76](contra_sprites/sprite_76.png?raw=true "sprite_76") | ![sprite_77](contra_sprites/sprite_77.png?raw=true "sprite_77") | ![sprite_78](contra_sprites/sprite_78.png?raw=true "sprite_78") | ![sprite_79](contra_sprites/sprite_79.png?raw=true "sprite_79") | ![sprite_7a](contra_sprites/sprite_7a.png?raw=true "sprite_7a") | ![sprite_7b](contra_sprites/sprite_7b.png?raw=true "sprite_7b") | ![sprite_7c](contra_sprites/sprite_7c.png?raw=true "sprite_7c") | ![sprite_7d](contra_sprites/sprite_7d.png?raw=true "sprite_7d") | ![sprite_7e](contra_sprites/sprite_7e.png?raw=true "sprite_7e") | |
| 8 | | | ![sprite_82](contra_sprites/sprite_82.png?raw=true "sprite_82") | ![sprite_83](contra_sprites/sprite_83.png?raw=true "sprite_83") | ![sprite_84](contra_sprites/sprite_84.png?raw=true "sprite_84") | ![sprite_85](contra_sprites/sprite_85.png?raw=true "sprite_85") | ![sprite_86](contra_sprites/sprite_86.png?raw=true "sprite_86") | ![sprite_87](contra_sprites/sprite_87.png?raw=true "sprite_87") | ![sprite_88](contra_sprites/sprite_88.png?raw=true "sprite_88") | ![sprite_89](contra_sprites/sprite_89.png?raw=true "sprite_89") | ![sprite_8a](contra_sprites/sprite_8a.png?raw=true "sprite_8a") | ![sprite_8b](contra_sprites/sprite_8b.png?raw=true "sprite_8b") | ![sprite_8c](contra_sprites/sprite_8c.png?raw=true "sprite_8c") | ![sprite_8d](contra_sprites/sprite_8d.png?raw=true "sprite_8d") | ![sprite_8e](contra_sprites/sprite_8e.png?raw=true "sprite_8e") | ![sprite_8f](contra_sprites/sprite_8f.png?raw=true "sprite_8f") |
| 9 | ![sprite_90](contra_sprites/sprite_90.png?raw=true "sprite_90") | ![sprite_91](contra_sprites/sprite_91.png?raw=true "sprite_91") ![sprite_91_p2](contra_sprites/sprite_91_p2.png?raw=true "sprite_91_p2") | ![sprite_92](contra_sprites/sprite_92.png?raw=true "sprite_92") | ![sprite_93](contra_sprites/sprite_93.png?raw=true "sprite_93") | ![sprite_94](contra_sprites/sprite_94.png?raw=true "sprite_94") | ![sprite_95](contra_sprites/sprite_95.png?raw=true "sprite_95") | ![sprite_96](contra_sprites/sprite_96.png?raw=true "sprite_96") | ![sprite_97](contra_sprites/sprite_97.png?raw=true "sprite_97") | ![sprite_98](contra_sprites/sprite_98.png?raw=true "sprite_98") | ![sprite_99](contra_sprites/sprite_99.png?raw=true "sprite_99") | ![sprite_9a](contra_sprites/sprite_9a.png?raw=true "sprite_9a") | ![sprite_9b](contra_sprites/sprite_9b.png?raw=true "sprite_9b") | ![sprite_9c](contra_sprites/sprite_9c.png?raw=true "sprite_9c") | ![sprite_9d](contra_sprites/sprite_9d.png?raw=true "sprite_9d") | ![sprite_9e](contra_sprites/sprite_9e.png?raw=true "sprite_9e") | ![sprite_9f](contra_sprites/sprite_9f.png?raw=true "sprite_9f") |
| a | ![sprite_a0](contra_sprites/sprite_a0.png?raw=true "sprite_a0") | ![sprite_a1](contra_sprites/sprite_a1.png?raw=true "sprite_a1") | ![sprite_a2](contra_sprites/sprite_a2.png?raw=true "sprite_a2") | ![sprite_a3](contra_sprites/sprite_a3.png?raw=true "sprite_a3") | ![sprite_a4](contra_sprites/sprite_a4.png?raw=true "sprite_a4") | ![sprite_a5](contra_sprites/sprite_a5.png?raw=true "sprite_a5") | ![sprite_a6](contra_sprites/sprite_a6.png?raw=true "sprite_a6") | ![sprite_a7](contra_sprites/sprite_a7.png?raw=true "sprite_a7") | ![sprite_a8](contra_sprites/sprite_a8.png?raw=true "sprite_a8") | ![sprite_a9](contra_sprites/sprite_a9.png?raw=true "sprite_a9") | ![sprite_aa](contra_sprites/sprite_aa.png?raw=true "sprite_aa") | ![sprite_ab](contra_sprites/sprite_ab.png?raw=true "sprite_ab") | ![sprite_ac](contra_sprites/sprite_ac.png?raw=true "sprite_ac") | ![sprite_ad](contra_sprites/sprite_ad.png?raw=true "sprite_ad") | ![sprite_ae](contra_sprites/sprite_ae.png?raw=true "sprite_ae") | ![sprite_af](contra_sprites/sprite_af.png?raw=true "sprite_af") |
| b | ![sprite_b0](contra_sprites/sprite_b0.png?raw=true "sprite_b0") | ![sprite_b1](contra_sprites/sprite_b1.png?raw=true "sprite_b1") | ![sprite_b2](contra_sprites/sprite_b2.png?raw=true "sprite_b2") | ![sprite_b3](contra_sprites/sprite_b3.png?raw=true "sprite_b3") | ![sprite_b4](contra_sprites/sprite_b4.png?raw=true "sprite_b4") | ![sprite_b5](contra_sprites/sprite_b5.png?raw=true "sprite_b5") | ![sprite_b6](contra_sprites/sprite_b6.png?raw=true "sprite_b6") | ![sprite_b7](contra_sprites/sprite_b7.png?raw=true "sprite_b7") | ![sprite_b8](contra_sprites/sprite_b8.png?raw=true "sprite_b8") | ![sprite_b9](contra_sprites/sprite_b9.png?raw=true "sprite_b9") | ![sprite_ba](contra_sprites/sprite_ba.png?raw=true "sprite_ba") | ![sprite_bb](contra_sprites/sprite_bb.png?raw=true "sprite_bb") | ![sprite_bc](contra_sprites/sprite_bc.png?raw=true "sprite_bc") | ![sprite_bd](contra_sprites/sprite_bd.png?raw=true "sprite_bd") | ![sprite_be](contra_sprites/sprite_be.png?raw=true "sprite_be") | ![sprite_bf](contra_sprites/sprite_bf.png?raw=true "sprite_bf") |
| c | ![sprite_c0](contra_sprites/sprite_c0.png?raw=true "sprite_c0") | ![sprite_c1](contra_sprites/sprite_c1.png?raw=true "sprite_c1") | ![sprite_c2](contra_sprites/sprite_c2.png?raw=true "sprite_c2") | ![sprite_c3](contra_sprites/sprite_c3.png?raw=true "sprite_c3") | ![sprite_c4](contra_sprites/sprite_c4.png?raw=true "sprite_c4") | ![sprite_c5](contra_sprites/sprite_c5.png?raw=true "sprite_c5") | ![sprite_c6](contra_sprites/sprite_c6.png?raw=true "sprite_c6") | ![sprite_c7](contra_sprites/sprite_c7.png?raw=true "sprite_c7") | ![sprite_c8](contra_sprites/sprite_c8.png?raw=true "sprite_c8") | ![sprite_c9](contra_sprites/sprite_c9.png?raw=true "sprite_c9") | ![sprite_ca](contra_sprites/sprite_ca.png?raw=true "sprite_ca") | ![sprite_cb](contra_sprites/sprite_cb.png?raw=true "sprite_cb") | ![sprite_cc](contra_sprites/sprite_cc.png?raw=true "sprite_cc") | ![sprite_cd](contra_sprites/sprite_cd.png?raw=true "sprite_cd") | ![sprite_ce](contra_sprites/sprite_ce.png?raw=true "sprite_ce") | ![sprite_cf](contra_sprites/sprite_cf.png?raw=true "sprite_cf") |
## Probotector
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|---|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| 0 | | | ![sprite_02](probotector_sprites/sprite_02.png?raw=true "sprite_02") ![sprite_02_p2](probotector_sprites/sprite_02_p2.png?raw=true "sprite_02_p2") | ![sprite_03](probotector_sprites/sprite_03.png?raw=true "sprite_03") ![sprite_03_p2](probotector_sprites/sprite_03_p2.png?raw=true "sprite_03_p2") | ![sprite_04](probotector_sprites/sprite_04.png?raw=true "sprite_04") ![sprite_04_p2](probotector_sprites/sprite_04_p2.png?raw=true "sprite_04_p2") | ![sprite_05](probotector_sprites/sprite_05.png?raw=true "sprite_05") ![sprite_05_p2](probotector_sprites/sprite_05_p2.png?raw=true "sprite_05_p2") | ![sprite_06](probotector_sprites/sprite_06.png?raw=true "sprite_06") ![sprite_06_p2](probotector_sprites/sprite_06_p2.png?raw=true "sprite_06_p2") | ![sprite_07](contra_sprites/sprite_07.png?raw=true "sprite_07") | ![sprite_08](probotector_sprites/sprite_08.png?raw=true "sprite_08") ![sprite_08_p2](probotector_sprites/sprite_08_p2.png?raw=true "sprite_08_p2") | ![sprite_09](probotector_sprites/sprite_09.png?raw=true "sprite_09") ![sprite_09_p2](probotector_sprites/sprite_09_p2.png?raw=true "sprite_09_p2") | ![sprite_0a](probotector_sprites/sprite_0a.png?raw=true "sprite_0a") ![sprite_0a_p2](probotector_sprites/sprite_0a_p2.png?raw=true "sprite_0a_p2") | ![sprite_0b](probotector_sprites/sprite_0b.png?raw=true "sprite_0b") ![sprite_0b_p2](probotector_sprites/sprite_0b_p2.png?raw=true "sprite_0b_p2") | ![sprite_0c](probotector_sprites/sprite_0c.png?raw=true "sprite_0c") ![sprite_0c_p2](probotector_sprites/sprite_0c_p2.png?raw=true "sprite_0c_p2") | ![sprite_0d](probotector_sprites/sprite_0d.png?raw=true "sprite_0d") ![sprite_0d_p2](probotector_sprites/sprite_0d_p2.png?raw=true "sprite_0d_p2") | ![sprite_0e](probotector_sprites/sprite_0e.png?raw=true "sprite_0e") ![sprite_0e_p2](probotector_sprites/sprite_0e_p2.png?raw=true "sprite_0e_p2") | ![sprite_0f](probotector_sprites/sprite_0f.png?raw=true "sprite_0f") ![sprite_0f_p2](probotector_sprites/sprite_0f_p2.png?raw=true "sprite_0f_p2") |
| 1 | ![sprite_10](probotector_sprites/sprite_10.png?raw=true "sprite_10") ![sprite_10_p2](probotector_sprites/sprite_10_p2.png?raw=true "sprite_10_p2") | ![sprite_11](probotector_sprites/sprite_11.png?raw=true "sprite_11") ![sprite_11_p2](probotector_sprites/sprite_11_p2.png?raw=true "sprite_11_p2") | ![sprite_12](probotector_sprites/sprite_12.png?raw=true "sprite_12") ![sprite_12_p2](probotector_sprites/sprite_12_p2.png?raw=true "sprite_12_p2") | ![sprite_13](probotector_sprites/sprite_13.png?raw=true "sprite_13") ![sprite_13_p2](probotector_sprites/sprite_13_p2.png?raw=true "sprite_13_p2") | ![sprite_14](probotector_sprites/sprite_14.png?raw=true "sprite_14") ![sprite_14_p2](probotector_sprites/sprite_14_p2.png?raw=true "sprite_14_p2") | ![sprite_15](probotector_sprites/sprite_15.png?raw=true "sprite_15") ![sprite_15_p2](probotector_sprites/sprite_15_p2.png?raw=true "sprite_15_p2") | ![sprite_16](probotector_sprites/sprite_16.png?raw=true "sprite_16") ![sprite_16_p2](probotector_sprites/sprite_16_p2.png?raw=true "sprite_16_p2") | ![sprite_17](probotector_sprites/sprite_17.png?raw=true "sprite_17") ![sprite_17_p2](probotector_sprites/sprite_17_p2.png?raw=true "sprite_17_p2") | ![sprite_18](probotector_sprites/sprite_18.png?raw=true "sprite_18") ![sprite_18](probotector_sprites/sprite_18_p2.png?raw=true "sprite_18_p2") | ![sprite_19](probotector_sprites/sprite_19.png?raw=true "sprite_19") ![sprite_19](probotector_sprites/sprite_19_p2.png?raw=true "sprite_19_p2") | ![sprite_1a](probotector_sprites/sprite_1a.png?raw=true "sprite_1a") ![sprite_1a](probotector_sprites/sprite_1a_p2.png?raw=true "sprite_1a_p2") | ![sprite_1b](probotector_sprites/sprite_1b.png?raw=true "sprite_1b") ![sprite_1b_p2](probotector_sprites/sprite_1b_p2.png?raw=true "sprite_1b_p2") | ![sprite_1c](probotector_sprites/sprite_1c.png?raw=true "sprite_1c") ![sprite_1c](probotector_sprites/sprite_1c_p2.png?raw=true "sprite_1c_p2") | ![sprite_1d](probotector_sprites/sprite_1d.png?raw=true "sprite_1d") ![sprite_1d](probotector_sprites/sprite_1d_p2.png?raw=true "sprite_1d_p2") | ![sprite_1e](probotector_sprites/sprite_1e.png?raw=true "sprite_1e") | ![sprite_1f](contra_sprites/sprite_1f.png?raw=true "sprite_1f") |
| 2 | ![sprite_20](contra_sprites/sprite_20.png?raw=true "sprite_20") | ![sprite_21](contra_sprites/sprite_21.png?raw=true "sprite_21") | ![sprite_22](contra_sprites/sprite_22.png?raw=true "sprite_22") | ![sprite_23](contra_sprites/sprite_23.png?raw=true "sprite_23") | ![sprite_24](contra_sprites/sprite_24.png?raw=true "sprite_24") | ![sprite_25](contra_sprites/sprite_25.png?raw=true "sprite_25") | ![sprite_26](probotector_sprites/sprite_26.png?raw=true "sprite_26") | ![sprite_27](probotector_sprites/sprite_27.png?raw=true "sprite_27") | ![sprite_28](probotector_sprites/sprite_28.png?raw=true "sprite_28") | ![sprite_29](probotector_sprites/sprite_29.png?raw=true "sprite_29") | ![sprite_2a](probotector_sprites/sprite_2a.png?raw=true "sprite_2a") | ![sprite_2b](probotector_sprites/sprite_2b.png?raw=true "sprite_2b") | ![sprite_2c](probotector_sprites/sprite_2c.png?raw=true "sprite_2c") | ![sprite_2d](probotector_sprites/sprite_2d.png?raw=true "sprite_2d") | | ![sprite_2f](contra_sprites/sprite_2f.png?raw=true "sprite_2f") |
| 3 | ![sprite_30](contra_sprites/sprite_30.png?raw=true "sprite_30") | ![sprite_31](contra_sprites/sprite_31.png?raw=true "sprite_31") | ![sprite_32](contra_sprites/sprite_32.png?raw=true "sprite_32") | ![sprite_33](contra_sprites/sprite_33.png?raw=true "sprite_33") | ![sprite_34](contra_sprites/sprite_34.png?raw=true "sprite_34") | ![sprite_35](contra_sprites/sprite_35.png?raw=true "sprite_35") | ![sprite_36](contra_sprites/sprite_36.png?raw=true "sprite_36") | ![sprite_37](contra_sprites/sprite_37.png?raw=true "sprite_37") | ![sprite_38](contra_sprites/sprite_38.png?raw=true "sprite_38") | ![sprite_39](contra_sprites/sprite_39.png?raw=true "sprite_39") | ![sprite_3a](contra_sprites/sprite_3a.png?raw=true "sprite_3a") | ![sprite_3b](probotector_sprites/sprite_3b.png?raw=true "sprite_3b") | ![sprite_3c](probotector_sprites/sprite_3c.png?raw=true "sprite_3c") | ![sprite_3d](probotector_sprites/sprite_3d.png?raw=true "sprite_3d") | ![sprite_3e](probotector_sprites/sprite_3e.png?raw=true "sprite_3e") | ![sprite_3f](probotector_sprites/sprite_3f.png?raw=true "sprite_3f") |
| 4 | ![sprite_40](probotector_sprites/sprite_40.png?raw=true "sprite_40") | ![sprite_41](probotector_sprites/sprite_41.png?raw=true "sprite_41") | ![sprite_42](probotector_sprites/sprite_42.png?raw=true "sprite_42") | ![sprite_43](probotector_sprites/sprite_43.png?raw=true "sprite_43") | ![sprite_44](probotector_sprites/sprite_44.png?raw=true "sprite_44") | ![sprite_45](probotector_sprites/sprite_45.png?raw=true "sprite_45") | ![sprite_46](probotector_sprites/sprite_46.png?raw=true "sprite_46") | ![sprite_47](contra_sprites/sprite_47.png?raw=true "sprite_47") | ![sprite_48](contra_sprites/sprite_48.png?raw=true "sprite_48") | ![sprite_49](contra_sprites/sprite_49.png?raw=true "sprite_49") | ![sprite_4a](contra_sprites/sprite_4a.png?raw=true "sprite_4a") | ![sprite_4b](probotector_sprites/sprite_4b.png?raw=true "sprite_4b") | ![sprite_4c](probotector_sprites/sprite_4c.png?raw=true "sprite_4c") | ![sprite_4d](probotector_sprites/sprite_4d.png?raw=true "sprite_4d") ![sprite_4d](probotector_sprites/sprite_4d_alt.png?raw=true "sprite_4d_alt") | ![sprite_4e](contra_sprites/sprite_4e.gif?raw=true "sprite_4e") | |
| 5 | ![sprite_50](probotector_sprites/sprite_50.png?raw=true "sprite_50") ![sprite_50_p2](probotector_sprites/sprite_50_p2.png?raw=true "sprite_50_p2") | ![sprite_51](probotector_sprites/sprite_51.png?raw=true "sprite_51") ![sprite_51_p2](probotector_sprites/sprite_51_p2.png?raw=true "sprite_51_p2") | ![sprite_52](probotector_sprites/sprite_52.png?raw=true "sprite_52") ![sprite_52_p2](probotector_sprites/sprite_52_p2.png?raw=true "sprite_52_p2") | ![sprite_53](probotector_sprites/sprite_53.png?raw=true "sprite_53") ![sprite_53_p2](probotector_sprites/sprite_53_p2.png?raw=true "sprite_53_p2") | ![sprite_54](probotector_sprites/sprite_54.png?raw=true "sprite_54") ![sprite_54_p2](probotector_sprites/sprite_54_p2.png?raw=true "sprite_54_p2") | ![sprite_55](probotector_sprites/sprite_55.png?raw=true "sprite_55") ![sprite_55_p2](probotector_sprites/sprite_55_p2.png?raw=true "sprite_55_p2") | ![sprite_56](probotector_sprites/sprite_56.png?raw=true "sprite_56") ![sprite_56_p2](probotector_sprites/sprite_56_p2.png?raw=true "sprite_56_p2") | ![sprite_57](probotector_sprites/sprite_57.png?raw=true "sprite_57") ![sprite_57_p2](probotector_sprites/sprite_57_p2.png?raw=true "sprite_57_p2") | ![sprite_58](probotector_sprites/sprite_58.png?raw=true "sprite_58") ![sprite_58_p2](probotector_sprites/sprite_58_p2.png?raw=true "sprite_58_p2") | | | | | ![sprite_5d](probotector_sprites/sprite_5d.png?raw=true "sprite_5d") | ![sprite_5e](probotector_sprites/sprite_5e.png?raw=true "sprite_5e") | ![sprite_5f](probotector_sprites/sprite_5f.png?raw=true "sprite_5f") |
| 6 | ![sprite_60](probotector_sprites/sprite_60.png?raw=true "sprite_60") | ![sprite_61](probotector_sprites/sprite_61.png?raw=true "sprite_61") | ![sprite_62](probotector_sprites/sprite_62.png?raw=true "sprite_62") | ![sprite_63](probotector_sprites/sprite_63.png?raw=true "sprite_63") | ![sprite_64](probotector_sprites/sprite_64.png?raw=true "sprite_64") | | | | ![sprite_68](probotector_sprites/sprite_68.png?raw=true "sprite_68") | ![sprite_69](probotector_sprites/sprite_69.png?raw=true "sprite_69") | ![sprite_6a](probotector_sprites/sprite_6a.png?raw=true "sprite_6a") | ![sprite_6b](probotector_sprites/sprite_6b.png?raw=true "sprite_6b") | ![sprite_6c](probotector_sprites/sprite_6c.png?raw=true "sprite_6c") | ![sprite_6d](probotector_sprites/sprite_6d.png?raw=true "sprite_6d") | ![sprite_6e](probotector_sprites/sprite_6e.png?raw=true "sprite_6e") | ![sprite_6f](probotector_sprites/sprite_6f.png?raw=true "sprite_6f") |
| 7 | ![sprite_70](probotector_sprites/sprite_70.png?raw=true "sprite_70") | ![sprite_71](probotector_sprites/sprite_71.png?raw=true "sprite_71") | ![sprite_72](contra_sprites/sprite_72.png?raw=true "sprite_72") | ![sprite_73](probotector_sprites/sprite_73.png?raw=true "sprite_73") | ![sprite_74](probotector_sprites/sprite_74.png?raw=true "sprite_74") | ![sprite_75](probotector_sprites/sprite_75.png?raw=true "sprite_75") | ![sprite_76](probotector_sprites/sprite_76.png?raw=true "sprite_76") | ![sprite_77](probotector_sprites/sprite_77.png?raw=true "sprite_77") | ![sprite_78](probotector_sprites/sprite_78.png?raw=true "sprite_78") | ![sprite_79](contra_sprites/sprite_79.png?raw=true "sprite_79") | ![sprite_7a](probotector_sprites/sprite_7a.png?raw=true "sprite_7a") | ![sprite_7b](probotector_sprites/sprite_7b.png?raw=true "sprite_7b") | ![sprite_7c](probotector_sprites/sprite_7c.png?raw=true "sprite_7c") | ![sprite_7d](probotector_sprites/sprite_7d.png?raw=true "sprite_7d") | ![sprite_7e](probotector_sprites/sprite_7e.png?raw=true "sprite_7e") | |
| 8 | | | ![sprite_82](contra_sprites/sprite_82.png?raw=true "sprite_82") | ![sprite_83](contra_sprites/sprite_83.png?raw=true "sprite_83") | ![sprite_84](contra_sprites/sprite_84.png?raw=true "sprite_84") | ![sprite_85](probotector_sprites/sprite_85.png?raw=true "sprite_85") | ![sprite_86](probotector_sprites/sprite_86.png?raw=true "sprite_86") | ![sprite_87](probotector_sprites/sprite_87.png?raw=true "sprite_87") | ![sprite_88](probotector_sprites/sprite_88.png?raw=true "sprite_88") | ![sprite_89](probotector_sprites/sprite_89.png?raw=true "sprite_89") | ![sprite_8a](probotector_sprites/sprite_8a.png?raw=true "sprite_8a") | ![sprite_8b](probotector_sprites/sprite_8b.png?raw=true "sprite_8b") | ![sprite_8c](probotector_sprites/sprite_8c.png?raw=true "sprite_8c") | ![sprite_8d](probotector_sprites/sprite_8d.png?raw=true "sprite_8d") | ![sprite_8e](probotector_sprites/sprite_8e.png?raw=true "sprite_8e") | ![sprite_8f](probotector_sprites/sprite_8f.png?raw=true "sprite_8f") |
| 9 | ![sprite_90](probotector_sprites/sprite_90.png?raw=true "sprite_90") | ![sprite_91](probotector_sprites/sprite_91.png?raw=true "sprite_91") ![sprite_91_p2](probotector_sprites/sprite_91_p2.png?raw=true "sprite_91_p2") | ![sprite_92](contra_sprites/sprite_92.png?raw=true "sprite_92") | ![sprite_93](probotector_sprites/sprite_93.png?raw=true "sprite_93") | ![sprite_94](probotector_sprites/sprite_94.png?raw=true "sprite_94") | ![sprite_95](probotector_sprites/sprite_95.png?raw=true "sprite_95") | ![sprite_96](probotector_sprites/sprite_96.png?raw=true "sprite_96") | ![sprite_97](probotector_sprites/sprite_97.png?raw=true "sprite_97") | ![sprite_98](probotector_sprites/sprite_98.png?raw=true "sprite_98") | ![sprite_99](contra_sprites/sprite_99.png?raw=true "sprite_99") | ![sprite_9a](contra_sprites/sprite_9a.png?raw=true "sprite_9a") | ![sprite_9b](contra_sprites/sprite_9b.png?raw=true "sprite_9b") | ![sprite_9c](contra_sprites/sprite_9c.png?raw=true "sprite_9c") | ![sprite_9d](contra_sprites/sprite_9d.png?raw=true "sprite_9d") | ![sprite_9e](contra_sprites/sprite_9e.png?raw=true "sprite_9e") | ![sprite_9f](contra_sprites/sprite_9f.png?raw=true "sprite_9f") |
| a | ![sprite_a0](contra_sprites/sprite_a0.png?raw=true "sprite_a0") | ![sprite_a1](contra_sprites/sprite_a1.png?raw=true "sprite_a1") | ![sprite_a2](contra_sprites/sprite_a2.png?raw=true "sprite_a2") | ![sprite_a3](contra_sprites/sprite_a3.png?raw=true "sprite_a3") | ![sprite_a4](contra_sprites/sprite_a4.png?raw=true "sprite_a4") | ![sprite_a5](contra_sprites/sprite_a5.png?raw=true "sprite_a5") | ![sprite_a6](contra_sprites/sprite_a6.png?raw=true "sprite_a6") | ![sprite_a7](contra_sprites/sprite_a7.png?raw=true "sprite_a7") | ![sprite_a8](contra_sprites/sprite_a8.png?raw=true "sprite_a8") | ![sprite_a9](contra_sprites/sprite_a9.png?raw=true "sprite_a9") | ![sprite_aa](contra_sprites/sprite_aa.png?raw=true "sprite_aa") | ![sprite_ab](probotector_sprites/sprite_ab.png?raw=true "sprite_ab") | ![sprite_ac](contra_sprites/sprite_ac.png?raw=true "sprite_ac") | ![sprite_ad](contra_sprites/sprite_ad.png?raw=true "sprite_ad") | ![sprite_ae](contra_sprites/sprite_ae.png?raw=true "sprite_ae") | ![sprite_af](contra_sprites/sprite_af.png?raw=true "sprite_af") |
| b | ![sprite_b0](contra_sprites/sprite_b0.png?raw=true "sprite_b0") | ![sprite_b1](contra_sprites/sprite_b1.png?raw=true "sprite_b1") | ![sprite_b2](contra_sprites/sprite_b2.png?raw=true "sprite_b2") | ![sprite_b3](contra_sprites/sprite_b3.png?raw=true "sprite_b3") | ![sprite_b4](contra_sprites/sprite_b4.png?raw=true "sprite_b4") | ![sprite_b5](contra_sprites/sprite_b5.png?raw=true "sprite_b5") | ![sprite_b6](contra_sprites/sprite_b6.png?raw=true "sprite_b6") | ![sprite_b7](probotector_sprites/sprite_b7.png?raw=true "sprite_b7") | ![sprite_b8](probotector_sprites/sprite_b8.png?raw=true "sprite_b8") | ![sprite_b9](probotector_sprites/sprite_b9.png?raw=true "sprite_b9") | ![sprite_ba](probotector_sprites/sprite_ba.png?raw=true "sprite_ba") | ![sprite_bb](probotector_sprites/sprite_bb.png?raw=true "sprite_bb") | ![sprite_bc](probotector_sprites/sprite_bc.png?raw=true "sprite_bc") | ![sprite_bd](probotector_sprites/sprite_bd.png?raw=true "sprite_bd") | ![sprite_be](probotector_sprites/sprite_be.png?raw=true "sprite_be") | ![sprite_bf](contra_sprites/sprite_bf.png?raw=true "sprite_bf") |
| c | ![sprite_c0](contra_sprites/sprite_c0.png?raw=true "sprite_c0") | ![sprite_c1](contra_sprites/sprite_c1.png?raw=true "sprite_c1") | ![sprite_c2](contra_sprites/sprite_c2.png?raw=true "sprite_c2") | ![sprite_c3](probotector_sprites/sprite_c3.png?raw=true "sprite_c3") | ![sprite_c4](probotector_sprites/sprite_c4.png?raw=true "sprite_c4") | ![sprite_c5](probotector_sprites/sprite_c5.png?raw=true "sprite_c5") | ![sprite_c6](probotector_sprites/sprite_c6.png?raw=true "sprite_c6") | ![sprite_c7](probotector_sprites/sprite_c7.png?raw=true "sprite_c7") | ![sprite_c8](probotector_sprites/sprite_c8.png?raw=true "sprite_c8") | ![sprite_c9](probotector_sprites/sprite_c9.png?raw=true "sprite_c9") | ![sprite_ca](probotector_sprites/sprite_ca.png?raw=true "sprite_ca") | ![sprite_cb](probotector_sprites/sprite_cb.png?raw=true "sprite_cb") | | | | ![sprite_cf](contra_sprites/sprite_cf.png?raw=true "sprite_cf") |
For a list of sprites that are different than _Contra_ (US), see the
`probotector_sprites` directory.
# Hud Sprites
# Contra
* Player 1
* ![player_1_lives_medal](player_1_lives_medal.png?raw=true "player_1_lives_medal")
* ![player_1_game_over](player_1_game_over.png?raw=true "player_1_game_over")
* ![player_1_lives_medal](contra_sprites/player_1_lives_medal.png?raw=true "player_1_lives_medal")
* ![player_1_game_over](contra_sprites/player_1_game_over.png?raw=true "player_1_game_over")
* Player 2
* ![player_2_lives_medal](player_2_lives_medal.png?raw=true "player_2_lives_medal")
* ![player_2_game_over](player_2_game_over.png?raw=true "player_2_game_over")
* ![player_2_lives_medal](contra_sprites/player_2_lives_medal.png?raw=true "player_2_lives_medal")
* ![player_2_game_over](contra_sprites/player_2_game_over.png?raw=true "player_2_game_over")
# Probotector
* Player 1
* ![player_1_lives_medal](probotector_sprites/player_1_lives_medal.png?raw=true "player_1_lives_medal")
* ![player_1_game_over](probotector_sprites/player_1_game_over.png?raw=true "player_1_game_over")
* Player 2
* ![player_2_lives_medal](probotector_sprites/player_2_lives_medal.png?raw=true "player_2_lives_medal")
* ![player_2_game_over](probotector_sprites/player_2_game_over.png?raw=true "player_2_game_over")
# Sprites Not Used In Game
* ![sprite_78](sprite_78.png?raw=true "sprite_78") (`sprite_78`) exists in the
* ![sprite_78](contra_sprites/sprite_78.png?raw=true "sprite_78") (`sprite_78`) exists in the
game code, but isn't used. It is identical to `sprite_74` and that is what is
used insead.
* `sprite_59`, `sprite_5a`, `sprite_5b`, `sprite_5c`, `sprite_65`, `sprite_66`,
and `sprite_67` are all empty and not used in the game.
* `sprite_80` and `sprite_81` are defined in the game, but never used so I can't
tell which pattern tiles they are supposed to utilize.
* `sprite_2e`, `sprite_80` and `sprite_81` are defined in the game, but never
used so I can't tell which pattern tiles they are supposed to utilize.
* `sprite_b7` is identical to `sprite_b8`, but never used.
# Equivalent Sprites
* `sprite_82` and `sprite_84` are equal
* `sprite_83` and `sprite_92` are equal
* `sprite_b7` and `sprite_b8` are equal

View File

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 211 B

View File

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 136 B

View File

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 211 B

View File

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 136 B

View File

Before

Width:  |  Height:  |  Size: 272 B

After

Width:  |  Height:  |  Size: 272 B

View File

Before

Width:  |  Height:  |  Size: 263 B

After

Width:  |  Height:  |  Size: 263 B

View File

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 251 B

View File

Before

Width:  |  Height:  |  Size: 237 B

After

Width:  |  Height:  |  Size: 237 B

View File

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 243 B

View File

Before

Width:  |  Height:  |  Size: 235 B

After

Width:  |  Height:  |  Size: 235 B

View File

Before

Width:  |  Height:  |  Size: 254 B

After

Width:  |  Height:  |  Size: 254 B

View File

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 252 B

View File

Before

Width:  |  Height:  |  Size: 253 B

After

Width:  |  Height:  |  Size: 253 B

View File

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

View File

Before

Width:  |  Height:  |  Size: 89 B

After

Width:  |  Height:  |  Size: 89 B

View File

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 209 B

View File

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 196 B

View File

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 211 B

View File

Before

Width:  |  Height:  |  Size: 193 B

After

Width:  |  Height:  |  Size: 193 B

View File

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 218 B

View File

Before

Width:  |  Height:  |  Size: 207 B

After

Width:  |  Height:  |  Size: 207 B

View File

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 218 B

View File

Before

Width:  |  Height:  |  Size: 204 B

After

Width:  |  Height:  |  Size: 204 B

View File

Before

Width:  |  Height:  |  Size: 202 B

After

Width:  |  Height:  |  Size: 202 B

View File

Before

Width:  |  Height:  |  Size: 183 B

After

Width:  |  Height:  |  Size: 183 B

View File

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 267 B

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

View File

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 259 B

View File

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 249 B

View File

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 257 B

View File

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 250 B

View File

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 268 B

View File

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 259 B

View File

Before

Width:  |  Height:  |  Size: 262 B

After

Width:  |  Height:  |  Size: 262 B

View File

Before

Width:  |  Height:  |  Size: 248 B

After

Width:  |  Height:  |  Size: 248 B

View File

Before

Width:  |  Height:  |  Size: 253 B

After

Width:  |  Height:  |  Size: 253 B

View File

Before

Width:  |  Height:  |  Size: 246 B

After

Width:  |  Height:  |  Size: 246 B

View File

Before

Width:  |  Height:  |  Size: 272 B

After

Width:  |  Height:  |  Size: 272 B

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

View File

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 268 B

View File

Before

Width:  |  Height:  |  Size: 256 B

After

Width:  |  Height:  |  Size: 256 B

View File

Before

Width:  |  Height:  |  Size: 266 B

After

Width:  |  Height:  |  Size: 266 B

View File

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 257 B

View File

Before

Width:  |  Height:  |  Size: 256 B

After

Width:  |  Height:  |  Size: 256 B

View File

Before

Width:  |  Height:  |  Size: 258 B

After

Width:  |  Height:  |  Size: 258 B

View File

Before

Width:  |  Height:  |  Size: 248 B

After

Width:  |  Height:  |  Size: 248 B

View File

Before

Width:  |  Height:  |  Size: 227 B

After

Width:  |  Height:  |  Size: 227 B

View File

Before

Width:  |  Height:  |  Size: 137 B

After

Width:  |  Height:  |  Size: 137 B

View File

Before

Width:  |  Height:  |  Size: 168 B

After

Width:  |  Height:  |  Size: 168 B

View File

Before

Width:  |  Height:  |  Size: 178 B

After

Width:  |  Height:  |  Size: 178 B

View File

Before

Width:  |  Height:  |  Size: 213 B

After

Width:  |  Height:  |  Size: 213 B

View File

Before

Width:  |  Height:  |  Size: 206 B

After

Width:  |  Height:  |  Size: 206 B

View File

Before

Width:  |  Height:  |  Size: 191 B

After

Width:  |  Height:  |  Size: 191 B

View File

Before

Width:  |  Height:  |  Size: 89 B

After

Width:  |  Height:  |  Size: 89 B

View File

Before

Width:  |  Height:  |  Size: 115 B

After

Width:  |  Height:  |  Size: 115 B

View File

Before

Width:  |  Height:  |  Size: 119 B

After

Width:  |  Height:  |  Size: 119 B

View File

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 123 B

View File

Before

Width:  |  Height:  |  Size: 126 B

After

Width:  |  Height:  |  Size: 126 B

View File

Before

Width:  |  Height:  |  Size: 143 B

After

Width:  |  Height:  |  Size: 143 B

View File

Before

Width:  |  Height:  |  Size: 129 B

After

Width:  |  Height:  |  Size: 129 B

View File

Before

Width:  |  Height:  |  Size: 139 B

After

Width:  |  Height:  |  Size: 139 B

View File

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 218 B

View File

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 225 B

View File

Before

Width:  |  Height:  |  Size: 224 B

After

Width:  |  Height:  |  Size: 224 B

View File

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 238 B

View File

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

View File

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

View File

Before

Width:  |  Height:  |  Size: 215 B

After

Width:  |  Height:  |  Size: 215 B

View File

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 216 B

View File

Before

Width:  |  Height:  |  Size: 191 B

After

Width:  |  Height:  |  Size: 191 B

View File

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 189 B

View File

Before

Width:  |  Height:  |  Size: 187 B

After

Width:  |  Height:  |  Size: 187 B

View File

Before

Width:  |  Height:  |  Size: 188 B

After

Width:  |  Height:  |  Size: 188 B

View File

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 189 B

View File

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 189 B

View File

Before

Width:  |  Height:  |  Size: 324 B

After

Width:  |  Height:  |  Size: 324 B

View File

Before

Width:  |  Height:  |  Size: 256 B

After

Width:  |  Height:  |  Size: 256 B

View File

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 184 B

View File

Before

Width:  |  Height:  |  Size: 208 B

After

Width:  |  Height:  |  Size: 208 B

View File

Before

Width:  |  Height:  |  Size: 228 B

After

Width:  |  Height:  |  Size: 228 B

View File

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 158 B

View File

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 234 B

View File

Before

Width:  |  Height:  |  Size: 224 B

After

Width:  |  Height:  |  Size: 224 B

View File

Before

Width:  |  Height:  |  Size: 226 B

After

Width:  |  Height:  |  Size: 226 B

View File

Before

Width:  |  Height:  |  Size: 222 B

After

Width:  |  Height:  |  Size: 222 B

View File

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

View File

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

View File

Before

Width:  |  Height:  |  Size: 254 B

After

Width:  |  Height:  |  Size: 254 B

View File

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 255 B

View File

Before

Width:  |  Height:  |  Size: 120 B

After

Width:  |  Height:  |  Size: 120 B

Some files were not shown because too many files have changed in this diff Show More