Game 1 Unit 11 of 16

Combo System

Reward sustained excellence. Build multipliers through consecutive hits and watch your score soar.

69% of SID Symphony

The Value of Consistency

Timing grades reward precision on individual notes. But what about sustained excellence? A player who hits 50 notes in a row deserves more than someone who hits every other note.

Enter the combo system. Consecutive hits build a multiplier. More hits, bigger multiplier, higher scores. One miss resets everything. The pressure builds with every successful hit.

The Multiplier Model

We use a simple progression:

HitsMultiplierColour
0-91xGrey
10-192xYellow
20-293xGreen
30+4xCyan
; Combo constants
COMBO_THRESHOLD = 10            ; Hits needed per multiplier level
MAX_MULTIPLIER  = 4             ; Maximum multiplier (4x)

; Variables
combo_count:        !byte $00   ; Consecutive hits (0-9)
multiplier:         !byte $01   ; Current multiplier (1-4)

Every 10 consecutive hits increases the multiplier. The combo counter resets to zero each time, so you need another 10 hits for the next level.

Building the Combo

Every successful hit — Perfect, Good, or Late — calls the combo update routine:

update_combo:
            inc combo_count
            lda combo_count
            cmp #COMBO_THRESHOLD
            bcc uc_done             ; Haven't reached threshold yet

            ; Reached threshold - increase multiplier if not at max
            lda multiplier
            cmp #MAX_MULTIPLIER
            bcs uc_reset            ; Already at max
            inc multiplier

uc_reset:
            lda #$00
            sta combo_count         ; Reset combo counter

uc_done:
            rts

The logic is straightforward: increment the counter, check if we’ve hit the threshold, increase the multiplier if possible, reset the counter either way.

Breaking the Combo

A miss devastates your progress. Both the combo counter and the multiplier reset to their starting values:

update_crowd_miss:
            jsr play_bum_note       ; Audio feedback

            ; Reset combo and multiplier on miss
            lda #$00
            sta combo_count
            lda #$01
            sta multiplier

            ; Continue with crowd meter decrease...

This creates tension. That 4x multiplier took 30 consecutive hits to build. One mistake and it’s gone. Players naturally become more careful as their multiplier climbs.

Multiplication on the 6502

The 6502 has no multiply instruction. We implement multiplication through shifts and adds:

cg_add_score:
            ; A contains base points, multiply by multiplier (1-4)
            sta cg_base_points      ; Save base points
            lda multiplier
            cmp #$01
            beq cg_mult_done        ; 1x = no change
            cmp #$02
            beq cg_mult_2x
            cmp #$03
            beq cg_mult_3x

            ; 4x = shift left twice
            lda cg_base_points
            asl                     ; x2
            asl                     ; x4
            jmp cg_mult_done

cg_mult_2x:
            lda cg_base_points
            asl                     ; x2
            jmp cg_mult_done

cg_mult_3x:
            lda cg_base_points
            asl                     ; x2
            clc
            adc cg_base_points      ; x2 + x1 = x3

cg_mult_done:
            ; A now contains multiplied points
            clc
            adc score_lo
            sta score_lo
            bcc cg_done
            inc score_hi

The asl (arithmetic shift left) instruction doubles a value. Two shifts give us 4x. For 3x, we shift once (2x) then add the original value (2x + 1x = 3x).

Displaying the Multiplier

The multiplier appears on the score row, colour-coded by level:

MULT_SCREEN_POS = SCREEN + (ROW_SCORE * 40) + 18

draw_multiplier:
            lda multiplier
            clc
            adc #$30                ; Convert to ASCII digit
            sta MULT_SCREEN_POS
            lda #$18                ; 'X' in screen codes
            sta MULT_SCREEN_POS + 1

            ; Colour based on multiplier level
            lda multiplier
            cmp #$04
            bcs dm_max              ; 4x = cyan
            cmp #$03
            bcs dm_high             ; 3x = green
            cmp #$02
            bcs dm_mid              ; 2x = yellow
            lda #COL_GREY           ; 1x = grey
            jmp dm_set_col
dm_mid:
            lda #COL_YELLOW
            jmp dm_set_col
dm_high:
            lda #COL_GREEN
            jmp dm_set_col
dm_max:
            lda #COL_CYAN
dm_set_col:
            sta COLOUR + (ROW_SCORE * 40) + 18
            sta COLOUR + (ROW_SCORE * 40) + 19
            rts

The colour progression provides instant feedback. Grey is baseline. Yellow means you’re building. Green means you’re doing well. Cyan means you’re on fire — and one mistake away from losing it all.

Initialisation

The combo system needs proper reset when starting a new game:

            ; Reset combo system
            lda #$00
            sta combo_count
            lda #$01
            sta multiplier

The Psychology

Watch how players behave with the combo system:

  • At 1x: Relaxed, taking risks
  • At 2x: Starting to focus
  • At 3x: Visibly concentrating
  • At 4x: Holding their breath

The multiplier doesn’t just affect score — it affects how the game feels. That’s the magic of risk/reward systems.

Score Impact

With the multiplier, maximum scores increase dramatically:

GradeBase1x2x3x4x
Perfect1515304560
Good1010203040
Late55101520

A player maintaining 4x throughout scores four times higher than one who keeps missing. Skill is now clearly visible in the final score.

What’s Next

The combo system adds tension, but we can push the “feel” further. In Unit 12, we add visual juice — screen effects that make every hit feel impactful.