“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.
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.
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.
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.
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.
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!
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'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.
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.