TASVideos

Tool-assisted game movies
When human skills are just not enough

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

Console: Nintendo Entertainment System
Game name: Rampage
Game version: USA
ROM filename: Rampage (U) [!].nes
Branch: Pacifist George in California
Emulator: BizHawk 2.3.2
Movie length: 13:16.69
FrameCount: 47880
Re-record count: 944
Author's real name:
Author's nickname: Dacicus
Submitter: Dacicus
Submitted at: 2020-04-01 00:18:17
Text last edited at: 2020-04-05 11:17:13
Text last edited by: Mothrayas
Download: Download (16627 bytes)
Status: decision: rejected
Submission instructions
Discuss this submission (also rating / voting)
List all submissions by this submitter
List pages on this site that refer to this submission
View submission text history
Back to the submission list
Author's comments and explanations:
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:

  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


(Link to video)


Mothrayas: 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.


Similar submissions (by title and categories where applicable):