Add support for building Probotector rom
This commit adds the ability to build the Probotector rom with build script parameters.
|
@ -3,4 +3,5 @@
|
|||
*.deb
|
||||
*.nes
|
||||
*.prg
|
||||
*.bin
|
||||
*.bin
|
||||
src/assets/asset-game-type.txt
|
48
README.md
|
@ -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:
|
||||
|
|
77
build.bat
|
@ -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
|
82
build.ps1
|
@ -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."
|
||||
}
|
||||
}
|
||||
}
|
85
build.sh
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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`
|
|
@ -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 | | |   |   |   |   |   |  |   |   |   |   |   |   |   |   |
|
||||
| 1 |   |   |   |   |   |   |   |   |  |  |  |  |  |  |  |  |
|
||||
| 2 |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |  |
|
||||
| 3 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| 4 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |
|
||||
| 5 |   |   |   |   |   |   |   |   |   | | | | |  |  |  |
|
||||
| 6 |  |  |  |  |  | | | |  |  |  |  |  |  |  |  |
|
||||
| 7 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |
|
||||
| 8 | | |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| 9 |  |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| a |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| b |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| c |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
|
||||
## Contra (US)
|
||||
|
||||
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|
||||
|---|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 0 | | |   |   |   |   |   |  |   |   |   |   |   |   |   |   |
|
||||
| 1 |   |   |   |   |   |   |   |   |  |  |  |  |  |  |  |  |
|
||||
| 2 |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |  |
|
||||
| 3 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| 4 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |
|
||||
| 5 |   |   |   |   |   |   |   |   |   | | | | |  |  |  |
|
||||
| 6 |  |  |  |  |  | | | |  |  |  |  |  |  |  |  |
|
||||
| 7 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |
|
||||
| 8 | | |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| 9 |  |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| a |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| b |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| c |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
|
||||
## Probotector
|
||||
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|
||||
|---|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 0 | | |   |   |   |   |   |  |   |   |   |   |   |   |   |   |
|
||||
| 1 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |  |  |
|
||||
| 2 |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |  |
|
||||
| 3 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| 4 |  |  |  |  |  |  |  |  |  |  |  |  |  |   |  | |
|
||||
| 5 |   |   |   |   |   |   |   |   |   | | | | |  |  |  |
|
||||
| 6 |  |  |  |  |  | | | |  |  |  |  |  |  |  |  |
|
||||
| 7 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | |
|
||||
| 8 | | |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| 9 |  |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| a |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| b |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
|
||||
| c |  |  |  |  |  |  |  |  |  |  |  |  | | | |  |
|
||||
|
||||
For a list of sprites that are different than _Contra_ (US), see the
|
||||
`probotector_sprites` directory.
|
||||
|
||||
# Hud Sprites
|
||||
|
||||
# Contra
|
||||
* Player 1
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* Player 2
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
|
||||
# Probotector
|
||||
|
||||
* Player 1
|
||||
* 
|
||||
* 
|
||||
* Player 2
|
||||
* 
|
||||
* 
|
||||
|
||||
# Sprites Not Used In Game
|
||||
|
||||
*  (`sprite_78`) exists in the
|
||||
*  (`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
|
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 211 B |
Before Width: | Height: | Size: 136 B After Width: | Height: | Size: 136 B |
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 211 B |
Before Width: | Height: | Size: 136 B After Width: | Height: | Size: 136 B |
Before Width: | Height: | Size: 272 B After Width: | Height: | Size: 272 B |
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B |
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 251 B |
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 237 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 235 B |
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 254 B |
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 252 B |
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 89 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 209 B After Width: | Height: | Size: 209 B |
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 211 B |
Before Width: | Height: | Size: 193 B After Width: | Height: | Size: 193 B |
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 218 B |
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 207 B |
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 218 B |
Before Width: | Height: | Size: 204 B After Width: | Height: | Size: 204 B |
Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 183 B After Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 267 B After Width: | Height: | Size: 267 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 259 B |
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 250 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 259 B |
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 262 B |
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 246 B |
Before Width: | Height: | Size: 272 B After Width: | Height: | Size: 272 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 256 B |
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 266 B |
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 256 B |
Before Width: | Height: | Size: 258 B After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 227 B After Width: | Height: | Size: 227 B |
Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 137 B |
Before Width: | Height: | Size: 168 B After Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 178 B After Width: | Height: | Size: 178 B |
Before Width: | Height: | Size: 213 B After Width: | Height: | Size: 213 B |
Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 206 B |
Before Width: | Height: | Size: 191 B After Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 89 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 115 B After Width: | Height: | Size: 115 B |
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 119 B |
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 123 B |
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
Before Width: | Height: | Size: 143 B After Width: | Height: | Size: 143 B |
Before Width: | Height: | Size: 129 B After Width: | Height: | Size: 129 B |
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 218 B |
Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 224 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 238 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 216 B After Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 191 B After Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 187 B After Width: | Height: | Size: 187 B |
Before Width: | Height: | Size: 188 B After Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 324 B After Width: | Height: | Size: 324 B |
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 256 B |
Before Width: | Height: | Size: 184 B After Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 234 B After Width: | Height: | Size: 234 B |
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 224 B |
Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 222 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 236 B |
After Width: | Height: | Size: 238 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 254 B After Width: | Height: | Size: 254 B |
Before Width: | Height: | Size: 255 B After Width: | Height: | Size: 255 B |
Before Width: | Height: | Size: 120 B After Width: | Height: | Size: 120 B |