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?
I can neither confirm nor deny The propaganda is getting to you. Resist!
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:
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
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.