First, the impatient can find a quick YouTube encode here. Everyone else may keep reading and watch the encode at the end.
Rampage is a game in which George the Ape, Lizzie the Lizard, or both of them go on a rampage throughout the United States. At least, that's what the fake news propagandists would have you believe. The truth is that Elizabeth and George are pacifists who were kidnapped by an evil organization. After suffering through experiments that turned them into giant creatures, they managed to escape. Now they're on the run. They're not quite used to their giant forms, however, so they're somewhat slow and clumsy. They're still pacifists, though. Unfortunately, the United States has descended into panic and violence--including a mad bomber strolling around everywhere--and giants make for easy targets.
Run info
- Emulator: BizHawk 2.3.2
- Core: NesHawk
- All other settings should be default
- Goals and categories
- Survive for five days in California while taking no damage
- Playaround
- Pacifist
- One player in multiplayer game
This run was inspired by alden's "One Button" run (so was this, apparently). It attempts to provide more entertainment than that run by moving the player character around. It attempts to make the challenge more difficult by taking no damage. Consequently, it is important to know that player 1's health is at RAM address
0x012B
and player 2's at 0x0157
. The accompanying encode uses a Lua script to display the HP, partly because it seems like the HP bar on screen sometimes does not update even when you take a lot of damage. These are some of the things that you will not see in this run because they cause damage:
- Getting hit by projectiles, lightning, and certain vehicles
- Falling off the top of a building
- Being on a building when it crumbles
- Being underwater
Movement
The player characters can walk, jump, and climb. The horizontal and vertical distances of jumps can be modified by pressing a direction on the D-pad. Climbing requires the PC to be in the correct position near the side of a building. The PC can also grab onto a building while jumping toward it. The game's manual seems to suggest that George and Lizzie have different speeds, but my (admittedly brief) testing did not find differences. Must be more propaganda. These RAM addresses are relevant:
Player 1 X position | 0x0102 |
Player 1 Y position | 0x0103 |
Player 2 X position | 0x012E |
Player 2 Y position | 0x012F |
Buildings
AFAICT, each day/level has a predetermined, rather than RNG-dependent, number of buildings. I've seen up to six buildings per day. The day is over when all of its buildings have crumbled to the ground. Each building can sustain a certain amount of damage before it crumbles; the damage threshold usually is in the range
0x20
to 0x30
. Buildings take damage from the player character and from the mad bomber. When the damage threshold is reached, the damage value jumps to somewhere above 0xF0
, and the building crumbles to the ground. But only one building can be crumbling at a time; any other buildings that surpass the damage threshold just stand there waiting for their turn. The following RAM addresses are relevant:
Current day/level | 0x00B4 |
Number of buildings | 0x0471 |
Building 1 damage | 0x0473 |
Building 2 damage | 0x047A |
Building 3 damage | 0x0481 |
Building 4 damage | 0x0488 |
Building 5 damage | 0x048F |
Building 6 damage | 0x0496 |
As you can see, the damage addresses are seven bytes apart. The other addresses in that range likely contain other properties of the buildings, but I did not investigate them in detail. It does not appear that the order of the buildings in RAM follows some clear pattern (e.g., ordered from left to right on the screen), but I also did not look into that very much.
The encode displays the damage values for the buildings in order to verify that the PCs did not cause any of it.
The mad bomber
This guy (or is it a gal? hard to tell) goes around bombing the buildings. First, some relevant RAM addresses:
General timer | 0x00A3 |
Bomber timer | 0x024A |
Bomber sub-timer | 0x024B |
Target building | 0x024C |
Bomber status | 0x024D |
Bomber X position | 0x024E |
Target X position | 0x0252 |
The bomber timer appears to be set based on the day number rather than RNG. The sub-timer starts at zero. The initial bomber status is
0xFF
, which I call inactive/dead. This is how the bomber timing works:
- The general timer increases by 1 every frame during the day. It is paused between days.
- While the bomber is inactive/dead, its sub-timer increases by 1 whenever only bit 1 (counting the least significant bit as 0) is set of the general timer's three least significant bits. In other words, every 8 frames.
- When the sub-timer reaches 8, it resets to 0, and the value of the bomber timer decreases by 1. Thus, the bomber time decreases by 1 every 64 frames.
- When the bomber timer reaches 0, the bomber becomes active.
When the bomber is active, he strolls across the screen to place the bomb at the bottom of the target building, then keeps strolling. He alternates his starting point between the left and right sides of the screen. He appears to be impervious to damage from anything other than the PCs. After it has been placed, the bomb explodes when the bomber status changes back to inactive/dead; this usually occurs when the bomber moves off the screen but also when a PC kills the bomber. The target building is the one with the lowest number that is still standing. For example, if the day has five buildings, they are numbered 0 through 4. If buildings 0, 1, and 4 have already crumbled, the next target will be building 2.
The encode displays the bomber timer for your hexadecimal counting pleasure.
Anticipated FAQs
This game is about destroying things. Why do a pacifist run?
A pacifist run seems like the perfect type of playaround for such a game.
Why only one player?
To increase the difficulty by making all of the enemies concentrate their attacks on one target.
It's because you couldn't figure out how to add the second player, isn't it?
Why George instead of Lizzie?
The only difference between them seems to be the graphics, and selecting Lizzie would lose some time.
Why stop after California?
It's a logical stopping point.
Why not start somewhere else?
The location order is fixed.
Is this a serious submission?
Sure. It's up to the judges and community to decide if this type of playaround of Rampage is entertaining enough to publish, though. Please vote yes. I haven't had a run published in years. I could use some more player points.
Why are your answers to these questions so brief?
If you prefer long answers, try to find the error in the Lua script used to display the stats:
gui.defaultPixelFont("fceux") gui.defaultTextBackground(0x00000000)
local addr_p1_hp = 0x012B local addr_bomb_timer = 0x024A local addr_num_buildings = 0x0471 local addr_damage_start = 0x0473 local addr_day_timer_started = 0xF3D2 local addr_day_timer_ended = 0xF44F local num_buildings_loaded = false local day_timer_started = false local day_timer_ended = false
local function start_day_timer() num_buildings_loaded = false day_timer_started = true day_timer_ended = false end
local function end_day_timer() num_buildings_loaded = false day_timer_started = false day_timer_ended = true end
local function update_num_buildings() if day_timer_ended then num_buildings_loaded = true day_timer_started = false day_timer_ended = false end end
event.onmemoryexecute(start_day_timer, addr_day_timer_started) event.onmemoryexecute(end_day_timer, addr_day_timer_ended) event.onmemorywrite(update_num_buildings, addr_num_buildings)
local function display_p1_hp(addr) p1_hp = memory.readbyte(addr) gui.pixelText(23, 15, "HP:" .. string.format("%02X", p1_hp)) end
local function display_damage(addr_dmg, addr_bld) max_buildings = memory.readbyte(addr_bld) - 1 for i = 0, max_buildings do x_text = 0x60 + 0x34 * (i % 3) y_text = 0x0F + 0x08 * math.floor(i / 3) damage = memory.readbyte(addr_dmg + i * 7) display_text = "Dmg" .. i+1 .. ":" .. string.format("%02X", damage) gui.pixelText(x_text, y_text, display_text) end end
local function display_bomb_timer(addr) x_text = 0x60 + 0x34 * 2 y_text = 0x0F + 0x08 bomb_timer = memory.readbyte(addr) display_text = "Bomb:" .. string.format("%02X", bomb_timer) gui.pixelText(x_text, y_text, display_text) end
while true do if num_buildings_loaded and emu.framecount() < 48351 then display_p1_hp(addr_p1_hp) display_damage(addr_damage_start, addr_num_buildings) display_bomb_timer(addr_bomb_timer) end emu.frameadvance() end
Aren't you forgetting something?
Right. Possible screenshot frames: 1337, 13582, 20751, 25467, 31337, 41027.
Something else?
Indeed. Possible publication description:
... Something that you mentioned at the beginning?
It has been a pleasure to work with the TASVideos staff. I have learned a lot from you all. Thank you for your patience with all of my questions.
Oh, maybe you meant
The encode at the end
Noxxa: A quite interesting idea for a goal given the game in question. However, there are a few issues with it:
- It's plain boring and uneventful. Hardly anything changes to the overall action in all 13 minutes.
- It is simply waiting for in-game timers to run out; therefore, there is nothing to speedrun.
- This movie does not beat the game. California is an arbitrary stopping point - the game has 128 days in total, and only 5 are run here.
Due to these reasons, rejecting.