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

(Link to video)
Game Boy
Ball, maximum score
BizHawk 2.6.1
510020
59.7275005696058
494
Unknown
Gameboy Camera (UE) [S][!].gb
Submitted by ThunderAxe31 on 4/1/2021 10:43:22 AM
Submission Comments
“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 :^)

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.


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
  • 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
  • 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.

Last Edited by adelikat on 11/6/2023 1:43 AM
Page History Latest diff List referrers