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.