TASVideos

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

Submission #7074: ThunderAxe31's GB Game Boy Camera "Ball, maximum score" in 2:22:19.11

Console: Game Boy
Game name: Game Boy Camera
Game version: USA/Europe
ROM filename: Gameboy Camera (UE) [S][!].gb
Branch: Ball, maximum score
Emulator: BizHawk 2.6.1
Movie length: 2:22:19.11
FrameCount: 510020
Re-record count: 494
Author's real name:
Author's nickname: ThunderAxe31
Submitter: ThunderAxe31
Submitted at: 2021-04-01 10:43:22
Text last edited at: 2021-04-12 18:16:44
Text last edited by: feos
Download: Download (38473 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:
“There's a game on this cart where you need to juggle balls, but it doesn't look like you can speed them up by moving differently. Might be worth a shot for a max score run maybe?” ~ feos

Maybe. I don't know if it was worth a shot or not, so I did it anyway :^)


(Link to video)

Movie Goal

  • Testing the judges!

About the run

At about 2600 points I got bored to TAS it manually and decided to fill the rest with mashing inputs. This decision breaks an important entertainment Guideline, which in itself doesn't make it rejectable...
After reaching the maximum score, I let intentionally lose the game and go to the hi-score screen to display the final score.

Game mechanics

You have to avoid letting the balls fall, by touching each ball for at least 1 frame, when they descend to the same height of the character's hands. You can use either the direction pad or the A and B buttons.
Even though the game displays 3 digits for the score counter while playing, it's actually keeping track of 4 digits. The score display will roll back to 000 each time you surpass 999. However, after reaching 9999 actual points, the game will no longer roll back to displaying 000.
The score is stored at address D9E6 (System Bus), as a 2-bytes binary coded decimal, so in the RAM viewer you gotta set it as hexadecimal value.
Samsara:


feos: Okay... you had it coming...

First and foremost, this movie is painful to watch, because there's constand flickering for almost two whole hours, along with incredibly unpleasant sound that won't ever let you go.

Quoting Movie Rules:
The movie should not be painful to watch
If a movie has entertainment significance which is deemed negatively, such as sickening camera angles, seizure inducing activity, and other rectifiable presentation decisions within it, the movie is not eligible for any tier.

Rejecting for being unwatchable.

...wait, there's more!

This movie aims for maximum score, but it doesn't meet our Moons standards, because it's freaking unwatchable, because I said so, so it has to be eligible for the Vault tier. As such, it should meet the full completion requirements with its maximum score goal.

Well, it breaks not one but two full completion requirements for max score.

Quoting Movie Rules:
Maximum points
  • Saturation (maxing out the counter) and overflow (dropping from high value to zero or negative) do not count as "max score". Scoring indefinitely should be impossible due to limitations of gameplay.
  • A "max score" movie must complete the game. Playing beyond the defined completion point is not allowed.

This movie reaches the score that (supposedly) can't go any higher due to digital limitations of how it's represented, it basically saturates the score counter, which doesn't count as "max score".

Also it plays way way way way past the proper completion point for a game without a clear ending, which is not allowed.

Quoting Movie Rules:
Games without clear ending
  • All unique content and the hardest difficulty loop have been completed. This option has the same value as playing regular games on the higher difficulty, according to our guideline on difficulty choice.

Difficulty is increasing in this mode until the movement intervals for the balls become the shortest, which means their movement has gotten the fastest it gets. In this game, difficulty is tied to score, and the score of 0400 is the point after which difficulty is no linger increasing, as you can clearly and obviously see from this code listing I made for you:

  7AA7:  AF        XOR  A                  A:05 F:00 B:88 C:08 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343386983 LY:5 znhciE
  7AA8:  EA EC D9  LD   (#D9ECh),A         A:00 F:80 B:88 C:08 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343386987 LY:5 ZnhciE
  7AAB:  0E 28     LD   C,#28h             A:00 F:80 B:88 C:08 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387003 LY:5 ZnhciE
  ; load high byte of score
  7AAD:  FA E7 D9  LD   A,(#D9E7h)         A:00 F:80 B:88 C:28 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387011 LY:5 ZnhciE
  ; if => 4, skip ahead, because THAT'S THE CAP
  7AB0:  FE 04     CP   #04h               A:03 F:80 B:88 C:28 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387027 LY:5 ZnhciE
  7AB2:  30 09     JR   NC,7ABDh           A:03 F:70 B:88 C:28 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387035 LY:5 zNHCiE
  7AB4:  CB 27     SLA  A                  A:03 F:70 B:88 C:28 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387043 LY:5 zNHCiE
  7AB6:  4F        LD   C,A                A:06 F:00 B:88 C:28 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387051 LY:5 znhciE
  7AB7:  CB 27     SLA  A                  A:06 F:00 B:88 C:06 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387055 LY:5 znhciE
  7AB9:  CB 27     SLA  A                  A:0C F:00 B:88 C:06 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387063 LY:5 znhciE
  7ABB:  81        ADD  A,C                A:18 F:00 B:88 C:06 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387071 LY:5 znhciE
  7ABC:  4F        LD   C,A                A:1E F:00 B:88 C:06 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387075 LY:5 znhciE
  ; load low byte of score
  7ABD:  FA E6 D9  LD   A,(#D9E6h)         A:1E F:00 B:88 C:1E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387079 LY:5 znhciE
  7AC0:  E6 F0     AND  #F0h               A:91 F:00 B:88 C:1E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387095 LY:5 znhciE
  7AC2:  CB 37     SWAP A                  A:90 F:20 B:88 C:1E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387103 LY:5 znHciE
  7AC4:  81        ADD  A,C                A:09 F:00 B:88 C:1E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387111 LY:5 znhciE
  7AC5:  4F        LD   C,A                A:27 F:20 B:88 C:1E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387115 LY:5 znHciE
  7AC6:  A7        AND  A                  A:27 F:20 B:88 C:27 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387119 LY:5 znHciE
  7AC7:  20 0C     JR   NZ,7AD5h           A:27 F:20 B:88 C:27 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387123 LY:5 znHciE
  7AD5:  06 00     LD   B,#00h             A:27 F:20 B:88 C:27 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387135 LY:5 znHciE
  7AD7:  CB 21     SLA  C                  A:27 F:20 B:00 C:27 D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387143 LY:5 znHciE
  7AD9:  CB 10     RL   B                  A:27 F:00 B:00 C:4E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387151 LY:5 znhciE
  ; some look-up table magic? don't have time to figure this out. maybe a task for the next AFD
  7ADB:  21 57 7B  LD   HL,#7B57h          A:27 F:80 B:00 C:4E D:03 E:A6 H:77 L:F6 SP:DFF5 Cy:2343387159 LY:5 ZnhciE
  7ADE:  09        ADD  HL,BC              A:27 F:80 B:00 C:4E D:03 E:A6 H:7B L:57 SP:DFF5 Cy:2343387171 LY:5 ZnhciE
  7ADF:  FA E3 D9  LD   A,(#D9E3h)         A:27 F:80 B:00 C:4E D:03 E:A6 H:7B L:A5 SP:DFF5 Cy:2343387179 LY:5 ZnhciE
  7AE2:  86        ADD  A,(HL)             A:1C F:80 B:00 C:4E D:03 E:A6 H:7B L:A5 SP:DFF5 Cy:2343387195 LY:5 ZnhciE
  7AE3:  EA E3 D9  LD   (#D9E3h),A         A:71 F:20 B:00 C:4E D:03 E:A6 H:7B L:A5 SP:DFF5 Cy:2343387203 LY:5 znHciE
  7AE6:  23        INC  HL                 A:71 F:20 B:00 C:4E D:03 E:A6 H:7B L:A5 SP:DFF5 Cy:2343387219 LY:6 znHciE
  7AE7:  FA E4 D9  LD   A,(#D9E4h)         A:71 F:20 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387227 LY:6 znHciE
  7AEA:  8E        ADC  A,(HL)             A:EA F:20 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387243 LY:6 znHciE
  7AEB:  EA E4 D9  LD   (#D9E4h),A         A:1F F:10 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387251 LY:6 znhCiE
  ; if it's too early, return
  7AEE:  D0        RET  NC                 A:1F F:10 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387267 LY:6 znhCiE
  ; PROCEED TO MOVE THE BALL
  7AEF:  3E 01     LD   A,#01h             A:1F F:10 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387275 LY:6 znhCiE
  7AF1:  EA EC D9  LD   (#D9ECh),A         A:01 F:10 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387283 LY:6 znhCiE
  ; load current ball index
  7AF4:  FA E5 D9  LD   A,(#D9E5h)         A:01 F:10 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387299 LY:6 znhCiE
  7AF7:  C6 20     ADD  A,#20h             A:00 F:10 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387315 LY:6 znhCiE
  7AF9:  CD 7E 2B  CALL #2B7Eh             A:20 F:00 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387323 LY:6 znhciE
  2B7E:  EA 60 DD  LD   (#DD60h),A         A:20 F:00 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF3 Cy:2343387347 LY:6 znhciE
  2B81:  C9        RET                     A:20 F:00 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF3 Cy:2343387363 LY:6 znhciE
  7AFC:  FA E5 D9  LD   A,(#D9E5h)         A:20 F:00 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387379 LY:6 znhciE
  7AFF:  4F        LD   C,A                A:00 F:00 B:00 C:4E D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387395 LY:6 znhciE
  7B00:  06 00     LD   B,#00h             A:00 F:00 B:00 C:00 D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387399 LY:6 znhciE
  ; load ball base position address
  7B02:  21 DB D9  LD   HL,#D9DBh          A:00 F:00 B:00 C:00 D:03 E:A6 H:7B L:A6 SP:DFF5 Cy:2343387407 LY:6 znhciE
  ; ball index 0
  7B05:  09        ADD  HL,BC              A:00 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387419 LY:6 znhciE
  ; load first ball position value
  7B06:  7E        LD   A,(HL)             A:00 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387427 LY:6 znhciE
  7B07:  CB 7F     BIT  7,A                A:01 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387435 LY:6 znhciE
  7B09:  C0        RET  NZ                 A:01 F:A0 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387443 LY:6 ZnHciE
  7B0A:  21 BB 7B  LD   HL,#7BBBh          A:01 F:A0 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387451 LY:6 ZnHciE
  7B0D:  09        ADD  HL,BC              A:01 F:A0 B:00 C:00 D:03 E:A6 H:7B L:BB SP:DFF5 Cy:2343387463 LY:6 ZnHciE
  7B0E:  BE        CP   (HL)               A:01 F:80 B:00 C:00 D:03 E:A6 H:7B L:BB SP:DFF5 Cy:2343387471 LY:6 ZnhciE
  7B0F:  C8        RET  Z                  A:01 F:70 B:00 C:00 D:03 E:A6 H:7B L:BB SP:DFF5 Cy:2343387479 LY:6 zNHCiE
  ; load ball base speed address
  7B10:  21 DE D9  LD   HL,#D9DEh          A:01 F:70 B:00 C:00 D:03 E:A6 H:7B L:BB SP:DFF5 Cy:2343387487 LY:6 zNHCiE
  ; ball index 0
  7B13:  09        ADD  HL,BC              A:01 F:70 B:00 C:00 D:03 E:A6 H:D9 L:DE SP:DFF5 Cy:2343387499 LY:6 zNHCiE
  ; add speed value to first ball position
  7B14:  86        ADD  A,(HL)             A:01 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DE SP:DFF5 Cy:2343387507 LY:6 znhciE
  ; load ball base position address again
  7B15:  21 DB D9  LD   HL,#D9DBh          A:02 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DE SP:DFF5 Cy:2343387515 LY:6 znhciE
  ; ball index 0
  7B18:  09        ADD  HL,BC              A:02 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387527 LY:6 znhciE
  ; write #2 to first ball position
  7B19:  77        LD   (HL),A             A:02 F:00 B:00 C:00 D:03 E:A6 H:D9 L:DB SP:DFF5 Cy:2343387535 LY:6 znhciE
If it's somehow still not clear and obvious enough to you, I also made a lua script that tells you with absolute precision when exactly the fastest ball movement occurs, in terms of score:

  memory.usememorydomain("System Bus")
  addr = 0xd9db
  local best_timer = 100000
  local best_score = -1
  local cur   = { 0, 0, 0 }
  local prev  = { -1, -1, -1 }
  local timer = { 0, 0, 0 }

  while true do
      local score = memory.read_u16_le(0xd9e6)

      for i = 1,3 do
          cur[i] = memory.readbyte(addr+i-1)

          if cur[i] == prev[i] then
              timer[i] = timer[i]+1
          else
              if timer[i] < best_timer and score > 0 then
                  best_timer = timer[i]
                  best_score = score
              end
              timer[i] = 0
          end

          gui.text(0,50+50*i,string.format(
              "cur:   %d\nprev:  %d\ntimer: %d",
              cur[i],prev[i],timer[i]

          prev[i] = cur[i]
      end

      gui.text(0,50,string.format("time:  %d\nscore: %X",best_timer,best_score

      emu.frameadvance()
  end
If you're brave enough to run it on your movie, you'll see that difficulty maxes out when the score counter reaches 391. After that point, balls move at the intervals of 13 and sometimes 14 frames. They don't get any faster, ever.

Since by the score of 400 difficulty has already maxed out, all you need to complete is whatever we consider a loop after the score of 391. For completeness, and also to match the internal difficulty cap as it's coded, I think stopping the movie as soon as you reach the score of 400 is ideal solution.

But you don't do it here, so I'm rejecting your run.

Oh and obviously you're violating the guideline about difficulty choice mentioned above, because it doesn't make any sense to play this game PERIOD after all its unique content has been completed. Because it doesn't ever get any more challenging to TAS, so there's nothing impressive in moving left or right once or twice every few frames.

...wait, there's more!

Quoting Movie Rules:
The movie's technical quality must be acceptable
Don't be lazy. We will try and beat your movie. We should hopefully not succeed. See the Guidelines on how to make a movie that meets the site's standards.

If we count the score of 400 as a proper ending for this game, because I said so, then guess what...



































...you're too slow.

You can clearly and obviously see how I beat your times by 13 frames in this movie I made in a couple minutes yesterday after dinner. You see the rerecord count? It's higher than in your entire 2.5-hour long TAS. Do you know why? It's because it's not a TAS! You've most likely just recorded your inputs up to score 400 while casually playing this game in real time, so it obviously took no rerecords. I can see it by how long you have to hold your buttons every time you hit them. And I'm not even mentioning the part where you just copypaste a tiny 4-frame-long input sequence onto almost 2 hours of gameplay. Which means that you're still hitting balls sub-optimally, just like in the RTA part of your run.

Rejecting for not even being a TAS.

...wait... there's more!

The very fact that you can beat the game just by copy-pasting a 4-frame input sequence, as well as the fact that there's no potential for any further improvement after the movie I've made, because I said so, it decidedly means that this game mode is way too trivial. And we don't accept trivial games to the Vault tier.

Quoting Movie Rules:
Must be clearly definable as a game, which has achievable goals
The game-play needs to standout from non-assisted play, and must not be seen as trivial. Note that a game is considered trivial until proven otherwise. If getting perfect times everywhere is not challenging, such a game is considered trivial. If later a technique is found that makes TASing it challenging, that game becomes acceptable.

Yeah, gameplay didn't stand out from unassisted play either because it was unassisted play, because I said so. That one fact is worth rejecting a few more times just for that.

By manipulating the balls very precisely you could theoretically make them fall to death sooner, allowing you to reach the ending sooner too. Well, you can also exit the ball mode just from Pause, but that doesn't preserve the score... But why should we care about the in-game stats?!

Rejecting because you didn't ask a judge for an advice in the Ask a Judge thread over here. This one bit probably deserves you a site ban... hmm...

Also rejecting because you're "Testing the judges!". Okay no, actually it was cool, because that was finally a technical challenge for me, and it was interesting to get back to overkilling. So yeah, obvioulsly rejecting!

Since this game ties score to difficulty, it doesn't make any sense to aim for maximum score as a side goal. Rejecting for having a confusing branch label. It confised me.

It was made in BizHawk 2.6.1, which is infamous for killing the branches if you're not careful, so I tried TASing it in the intended BizHawk version and I lost all my branches. Look:

Rejecting like crazy! No mercy!

...oh almost forgot. You see these balls?

They died so you could stress-test my theories I make up while judging April Fools submissions. Great job! Rejecting. &Rejecting.


Samsara:

Similar submissions (by title and categories where applicable):