Gathering from only these 2 threads (
1 and
2), there isn't any way to get up-to-date information on the GBA game, River City Ransom EX.
Gotta start somewhere, I guess...
This will be my thread, containing information, RAM addresses and values, and other stuffs about the game that can be useful to get a speedrun going.
I appreciate if anyone else is interested in doing the run, or share their findings about the game.
-----------------
This is my current submission (00:08:39)
This is the current submission discussion
I don't think it's gaining traction, so I think maybe one has to tackle the high grounds first in order to at least get some publication going...
To start, this is my current findings with RAM values.
Beware that different ROMs will have different RAM addresses.
Please correct me if I got anything wrong, or if you know what other info I missed:
Latest findings
River City Ransom EX [GBA][USA]:
File Name: River City - Ransom EX (Venom) 1.0 USA.gba
MD5 - C098362CA95E73D92BEE95F462724560
Legend:
^ - See above; Is related to above.
Notes - They are only related to the RAM address and value directly above them. Not under.
<newline> - Stopgap for missing information.
[XXXX - YYYY] - RAM Addresses Region from XXXX to YYYY.
| Address | Size | Display | Purpose
-----------------------------------------------------------------------------------------------------------------------------------------
| 0000 | 1 | Unsigned | Transition Screen? (always 0x0 or 0x5)
| 0002 | 2 | Unsigned | Area Zone ID
| 0004 | 1 | Unsigned | Controls
10000000b 128 Down
01000000b 64 Up
00100000b 32 Left
00010000b 16 Right
00001000b 8 Start
00000100b 4 Select
00000010b 2 B
00000001b 1 A
No L and R buttons
| 0008 | 1 | Unsigned | Rendering tick count accumulator (0 to 255). (Low Bits)
| 0009 | 1 | Unsigned | Rendering tick count accumulator (0 to 255). (High Bits)
| 0368 | 2 | Hex | Timing that controls when a player can start to freely move. (Counts down)
| 0370 | 2 | Hex | Sets to 0x0 when values in 0x0368 and 0x0372 are both 0x0 and 1000 equivalently.
| 0372 | 2 | Hex | Timing that controls when a player can start to freely move. (Counts up)
| 06D4 | 1 | Unsigned | Has to do with background scene textures.
| 06D5 | 1 | Unsigned | ^
| 06D6 | 1 | Unsigned | ^
| 06E1 | 1 | Unsigned | Has to do with background scene textures.
| 06E2 | 1 | Unsigned | ^
| 06E3 | 1 | Unsigned | ^
| 06E6 | 2 | Hex | (Foreground) Layer 0 texture X position (Little Endian)
| 06E8 | 2 | Hex | (Foreground) Layer 0 texture Y position (Little Endian)
| 06EA | 2 | Hex | (Foreground) Layer 1 texture X position (Little Endian)
| 06EC | 2 | Hex | (Foreground) Layer 1 texture Y position (Little Endian)
| 0702 | 2 | Hex | (Background) Layer 2 texture X position (Little Endian)
| 0704 | 2 | Hex | (Background) Layer 2 texture Y position (Little Endian)
| 0706 | 2 | Hex | (Background) Layer 3 texture X position (Little Endian)
| 0708 | 2 | Hex | (Background) Layer 3 texture Y position (Little Endian)
| 073E - 074A | 2 x 7 | Hex | Text spritesheet / mapping addresses, top row (assuming)
| 074C - 0760 | 2 x 11 | Hex | Text spritesheet / mapping addresses, bottom row (assuming)
| 076A - 0770 | 2 x 4 | Hex | Text messages pointer data for enemy gang shouts. (assuming)
| 09B5 | 1 | Unsigned | Area Section Name
| 09B9 | 1 | Unsigned | Wrapper string?
| 073E - 09E4 | 2 x 340 | Hex | (Region) Has to do with text messages and pointer data to strings.
| 0AA5 | 1 | Unsigned | Text message cursor position
| 0D18 | 4 | Hex | Something to do with Rendering buffer
| 0D20 | 4 | Hex | ^
| 0D28 | 4 | Hex | ^
| 0D30 | 4 | Hex | ^
| 0D38 | 4 | Hex | ^
| 0D40 | 4 | Hex | ^
| 0D48 | 4 | Hex | ^
| 0D20 | 4 | Hex | Something to do with Player's sprite position or updates
| 0DB8 | 4 | Hex | Something to do with Enemy B's sprite position or updates
| 0DC0 | 4 | Hex | ^
| 0DC8 | 4 | Hex | ^
| 0DD0 | 4 | Hex | ^
| 0AB0 | 1 | Unsigned | Crashes when freezing addresses
| 0AB1 | 1 | Unsigned | ^
| 0AB2 | 1 | Unsigned | ^
| 0AB3 | 1 | Unsigned | ^
| 211C | 1 | Unsigned | Has to do with color masking
| 211E | 1 | Unsigned | Has to do with color masking. Needs to be +0x1 more than 211C value.
| 2127 | 1 | Unsigned | Unknown
| 216A | 1 | Unsigned | Unknown
| 216B | 1 | Unsigned | Unknown
| 216E | 1 | Unsigned | Background Y position (Low Bit)
| 216F | 1 | Unsigned | Background Y position (High Bit)
| 2170 | 4 | Fixed Point 16.16 | Background X position (Little Endian)
| 2172 | 1 | Unsigned | Background X position (Low Bit)
| 2173 | 1 | Unsigned | Background X position (High Bit)
| 217A | 1 | Unsigned | Unknown
| 217B | 1 | Unsigned | Unknown
| 217E | 1 | Unsigned | Unknown
| 2180 | 1 | Unsigned | Something to do with area transitions
| 2181 | 1 | Unsigned | ^
| 2184 | 1 | Unsigned | Enable Rendering Layers Bitmask
0 = Null (no scenery)
1 = Text only
2 = Foreground
4 = Background
8 = Sky
15 = All
| 21B2 | 1 | Unsigned | Unknown
| 21B6 | 1 | Unsigned | Background texture Y position
| 21B7 | 1 | Unsigned | Background texture Y position. Negative number if 255.
| 220C | 1 | Unsigned | Player X position in the game area (Low Mantissa)
| 220D | 1 | Unsigned | Player X position in the game area (High Mantissa)
| 220E | 1 | Unsigned | Player X position in the game area (Low Bit)
| 220F | 1 | Unsigned | Player X position in the game area (High Bit)
When Player's X position is 0x15, will transition to new area.
| 2210 | 1 | Unsigned | Player Y Jump position in the game area (Low Mantissa)
| 2211 | 1 | Unsigned | Player Y Jump position in the game area (High Mantissa)
| 2212 | 1 | Unsigned | Player Y Jump position in the game area (Low Bit)
| 2213 | 1 | Unsigned | Player Y Jump position in the game area (High Bit). 255 is negative.
| 2214 | 1 | Unsigned | Player Y position in the game area (Low Mantissa)
| 2215 | 1 | Unsigned | Player Y position in the game area (High Mantissa)
| 2216 | 1 | Unsigned | Player Y position in the game area (Low Bit)
| 2217 | 1 | Unsigned | Player Y position in the game area (High Bit). 255 is negative.
| 2218 | 1 | Unsigned | Player Jump power facing right (0 or 128).
| 2219 | 1 | Unsigned | Player +X speed (Low Low Bit)
| 221A | 1 | Unsigned | Player +X Speed (Low High Bit)
| 221B | 1 | Unsigned | Player +X speed (High Low Bit)
| 221C | 1 | Unsigned | Player +X Speed (High High Bit)
| 221D | 1 | Unsigned | Player -X speed (Low Low Bit)
| 221E | 1 | Unsigned | Player -X Speed (Low High Bit)
| 221F | 1 | Unsigned | Player -X speed (High Low Bit)
| 2220 | 1 | Unsigned | Player -X Speed (High High Bit)
| 2221 | 1 | Unsigned | Player Y Acceleration (Low Mantissa)
| 2222 | 1 | Unsigned | Player Y Acceleration (High Bit). -Y is positive
| 2258 | 1 | Unsigned | Player Finite State Machine ID
| 22A4 | 1 | Unsigned | Something to do with going from shop (safe areas) to non-safe areas:
255 = Shops
58 = Non-shop areas
| 22DC | 1 | Unsigned | Duration between Player animation frames, counts down to 0. When 0, sets a new animation frame.
| 250C | 1 | Unsigned | Duration between Enemy A animation frames, counts down to 0. When 0, sets a new animation
Frame #:
Running: 4 -> 0, 4 -> 0, 4 -> 0, repeat
Walking: 8 -> 0, 6 -> 0, 8 -> 0, repeat
| 250E | 1 | Unsigned | Flag to jump to next animation frame:
0x5 = Continue playing animation
0xD = Jump to next animation
Loop
Update: 0xD 0x5 0x5 0xD 0x5 0x5 0xD 0x5
Render: Walk 1 -> Walk 1 -> Walk 1 -> Walk 2 -> Walk 2 -> Walk 2 -> Walk 1 -> Walk 1
EndLoop
| 2676 | 1 | Unsigned | Enemy A Y position in the game area (Low Bit)
| 2677 | 1 | Unsigned | Enemy A Y position in the game area (High Bit)
| 273A | 1 | Unsigned | Jump Kick animation ID
| 273C | 1 | Unsigned | NPC Walking Animation loop duration
| 2AB4 | 2 | Unsigned | Current Money
| 24E1 | 1 | Unsigned | Unknown purposes. Value is deallocated when entering new areas. Value is determined to be a type identifier for enemy gangs, as follows:
Stickville - Park Entrance
8 = Generic Dudes
6 = Frat Boys
2 = Entrees
1 = Dragons
0 = Mob
| 243C | 4 | Fixed Point 16.16 | Enemy A X position in the game area (Little Endian)
| 2444 | 4 | Fixed Point 16.16 | Enemy A Y position in the game area (Little Endian)
| 289C | 4 | Fixed Point 16.16 | Enemy B X position in the game area (Little Endian)
| 28A4 | 4 | Fixed Point 16.16 | Enemy B Y position in the game area (Little Endian)
| 28A8 | 4 | Fixed Point 16.16 | Enemy B X speed (Little Endian)
When value is 0 and the enemy is in the Running state, the enemy will respond as if it has hit a wall.
| 28AC | 4 | Fixed Point 16.16 | Enemy B Y speed (Little Endian)
| 2CFC | 4 | Fixed Point 16.16 | Enemy C X position in the game area (Little Endian)
| 2D04 | 4 | Fixed Point 16.16 | Enemy C Y position in the game area (Little Endian)
| 315C | 4 | Fixed Point 16.16 | Enemy D X position in the game area (Little Endian)
| 3164 | 4 | Fixed Point 16.16 | Enemy D Y position in the game area (Little Endian)
Store items and their leveling stats (Part 1):
Numbers - How many points it will add to your stats total, accumulatively.
Green Text - Emphasis on potential leveling shortcuts.
Red Text - Special Techniques (Moves)
I probably will continue to update this when I find more information.
The goal is for me to understand what the game is doing with all these numbers, and see if it's possible to do a Crazy (Hardest difficulty) speedrun.
There are other factors at play, such as:
- Figure out how to control the randomness of the enemy gang type when entering a new area.
- Figure out what optimal stats is preferred to give the most damage.
- Figure out if I need to increase my willpower, which affects how quick you recover after taking a blow that knocks you into the air. Would it make it more interesting?
- Figure out how to quickly nab the best technique to unlock. So far, I have one in mind that I use prominently when playing regularly.
- Find out if playing Solo or having an ally is more interesting.
- Find out if playing a non-protagonist character as Solo or have allies join up over the course of the run is more interesting.
That is all.