Submission #6682: Dacicus's NES Rampage "Pacifist George in California" in 13:16.69

Nintendo Entertainment System
Pacifist George in California
(Submitted: Pacifist George in California)
(Submitted: Rampage (U) [!].nes USA)
BizHawk 2.3.2
47880
60.0988138974405
944
Unknown
Submitted by Dacicus on 4/1/2020 12:18 AM
Submission Comments
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 position0x0102
Player 1 Y position0x0103
Player 2 X position0x012E
Player 2 Y position0x012F

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/level0x00B4
Number of buildings0x0471
Building 1 damage0x0473
Building 2 damage0x047A
Building 3 damage0x0481
Building 4 damage0x0488
Building 5 damage0x048F
Building 6 damage0x0496
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 timer0x00A3
Bomber timer0x024A
Bomber sub-timer0x024B
Target building0x024C
Bomber status0x024D
Bomber X position0x024E
Target X position0x0252
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:
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:
Rampage is a game in which one or two monsters go on a violent journey through the United States. The goal is to tear down buildings, eat people, and destroy vehicles while surviving the attacks of law enforcement.
In this run, however, Dacicus takes a pacifist approach, choosing to keep only the survival goal while causing no damage. Instead, he allows the people of California to destroy their own homes... eventually.
... 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.
Last Edited by ThunderAxe31 on 12/24/2021 10:27 PM
Page History Latest diff List referrers