Faster Instant Score Tally - RetroKoH/S1Fixed GitHub Wiki
(Original guide by Mercury; Additional content by RetroKoH)
Source: ReadySonic, Commits
Commit: 905faf0
This mod can be toggled in S1Fixed by setting SpeedUpScoreTally to 0, 1 or 2.
Do you hate waiting in a Sonic game? Do you feel like it's ridiculous that you have to wait for daring to... GO FAST? Are you a speedrunner that uses In-Game Time (IGT) as opposed to Real Time (RT) because the score tally takes too long? We've got a mod for you!
Speed Up Mod
Straight from ReadySonic is a mod that takes influence from the Game Gear Sonic games by allowing you to hold A, B, or C to speed up the score tally.
End-of-Level Tally
First, we need to open _incObj\3A Got Through Card.asm and go to Got_TimeBonus. We're going to replace the following code:
Got_TimeBonus:
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set time/ring bonus update flag
moveq #0,d0
tst.w (v_timebonus).w ; is time bonus = zero?
beq.s Got_RingBonus ; if yes, branch
addi.w #10,d0 ; add 10 to score
subi.w #10,(v_timebonus).w ; subtract 10 from time bonus
Got_RingBonus:
tst.w (v_ringbonus).w ; is ring bonus = zero?
beq.s Got_ChkBonus ; if yes, branch
addi.w #10,d0 ; add 10 to score
subi.w #10,(v_ringbonus).w ; subtract 10 from ring bonus
Got_ChkBonus:
tst.w d0 ; is there any bonus?
bne.s Got_AddBonus ; if yes, branch
...with this:
Got_TimeBonus:
bsr.w DisplaySprite
move.b #10,d1 ; set score decrement to 10
move.b (v_jpadhold1).w,d0
andi.b #btnABC,d0 ; is A, B or C pressed?
beq.w .dontspeedup ; if not, branch
move.b #100,d1 ; increase score decrement to 100
.dontspeedup:
move.b #1,(f_endactbonus).w ; set time/ring bonus update flag
moveq #0,d0
tst.w (v_timebonus).w ; is time bonus = zero?
beq.s Got_RingBonus ; if yes, branch
cmp.w (v_timebonus).w,d1 ; compare time bonus to score decrement
blt.s .skip ; if it's greater or equal, branch
move.w (v_timebonus).w,d1 ; else, set the decrement to the remaining bonus
.skip:
add.w d1,d0 ; add decrement to score
sub.w d1,(v_timebonus).w ; subtract decrement from time bonus
Got_RingBonus:
tst.w (v_ringbonus).w ; is ring bonus = zero?
beq.s Got_ChkBonus ; if yes, branch
cmp.w (v_ringbonus).w,d1 ; compare ring bonus to score decrement
blt.s .skip ; if it's greater or equal, branch
move.w (v_ringbonus).w,d1 ; else, set the decrement to the remaining bonus
.skip:
add.w d1,d0 ; add decrement to score
sub.w d1,(v_ringbonus).w ; subtract decrement from ring bonus
Got_ChkBonus:
tst.w d0 ; is there any bonus?
bne.s Got_AddBonus ; if yes, branch
Special Stage Tally
A similar thing has to be done for the Special Stage score tally. In _incObj\7E Special Stage Results.asm, go to SSR_RingBonus and replace this code:
SSR_RingBonus: ; Routine 6
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set ring bonus update flag
tst.w (v_ringbonus).w ; is ring bonus = zero?
beq.s loc_C8C4 ; if yes, branch
subi.w #10,(v_ringbonus).w ; subtract 10 from ring bonus
moveq #10,d0 ; add 10 to score
...with this:
SSR_RingBonus: ; Routine 6
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set ring bonus update flag
tst.w (v_ringbonus).w ; is ring bonus = zero?
beq.s loc_C8C4 ; if yes, branch
moveq #10,d1 ; set score decrement to 10
move.b (v_jpadhold1).w,d0
andi.b #btnABC,d0 ; is A, B or C pressed?
beq.w .dontspeedup ; if not, branch
move.b #100,d1 ; increase score decrement to 100
.dontspeedup:
moveq #0,d0
cmp.w (v_ringbonus).w,d1 ; compare ring bonus to score decrement
blt.s .skip ; if it's greater or equal, branch
move.w (v_ringbonus).w,d1 ; else, set the decrement to the remaining bonus
.skip:
add.w d1,d0 ; add decrement to score
sub.w d1,(v_ringbonus).w ; subtract decrement from ring bonus
Instant Tally Mod
Is that still not fast enough for you? You want instant??? Ok... lucky for you, I've got you covered. We are going to cover the same files at the same labels, so buckle up!
End-of-Level Tally
First, we need to open _incObj\3A Got Through Card.asm and go to Got_TimeBonus. We're going to replace the following code:
Got_TimeBonus:
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set time/ring bonus update flag
moveq #0,d0
tst.w (v_timebonus).w ; is time bonus = zero?
beq.s Got_RingBonus ; if yes, branch
addi.w #10,d0 ; add 10 to score
subi.w #10,(v_timebonus).w ; subtract 10 from time bonus
Got_RingBonus:
tst.w (v_ringbonus).w ; is ring bonus = zero?
beq.s Got_ChkBonus ; if yes, branch
addi.w #10,d0 ; add 10 to score
subi.w #10,(v_ringbonus).w ; subtract 10 from ring bonus
Got_ChkBonus:
tst.w d0 ; is there any bonus?
bne.s Got_AddBonus ; if yes, branch
...with this:
Got_TimeBonus: ; Routine 6
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set time/ring bonus update flag
moveq #0,d0
move.w (v_timebonus).w,d0 ; load time bonus to d0
clr.w (v_timebonus).w ; clear time bonus
add.w (v_ringbonus).w,d0 ; load ring bonus to d0
clr.w (v_ringbonus).w ; clear ring bonus
jsr (AddPoints).l ; add to score
We can also remove the block of code at Got_AddBonus:
-Got_AddBonus:
- jsr (AddPoints).l
- move.b (v_vbla_byte).w,d0
- andi.b #3,d0
- bne.s locret_C692
- move.w #sfx_Switch,d0
- jmp (PlaySound_Special).w ; play "blip" sound
Special Stage Tally
A similar thing has to be done for the Special Stage score tally. In _incObj\7E Special Stage Results.asm, go to SSR_RingBonus and replace this code:
SSR_RingBonus: ; Routine 6
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set ring bonus update flag
tst.w (v_ringbonus).w ; is ring bonus = zero?
beq.s loc_C8C4 ; if yes, branch
subi.w #10,(v_ringbonus).w ; subtract 10 from ring bonus
moveq #10,d0 ; add 10 to score
jsr (AddPoints).l
move.b (v_vbla_byte).w,d0
andi.b #3,d0
bne.s locret_C8EA
move.w #sfx_Switch,d0
jmp (PlaySound_Special).w ; play "blip" sound
; ===========================================================================
loc_C8C4:
with this:
SSR_RingBonus: ; Routine 6
bsr.w DisplaySprite
move.b #1,(f_endactbonus).w ; set time/ring bonus update flag
moveq #0,d0
move.w (v_ringbonus).w,d0 ; load ring bonus to d0
clr.w (v_ringbonus).w ; clear ring bonus
jsr (AddPoints).l ; add to score
Boom! Gotta go instantaneously fast.