pokepinball/engine/pinball_game/score.asm
2017-07-08 17:48:39 -07:00

247 lines
3.3 KiB
NASM

Func_8524: ; 0x8524
ld hl, wScore + $5
lb bc, $0c, $01
.loop
ld a, [hl]
swap a
and $f
call .GetDigit
inc de
dec b
ld a, [hld]
and $f
call .GetDigit
inc de
dec b
jr nz, .loop
ld a, $86
ld [de], a
inc de
ret
.GetDigit: ; 0x8543
jr nz, .okay
ld a, b
dec a
jr z, .okay
ld a, c
and a
ret nz
.okay
add $86 ; 0
ld [de], a
ld c, $0
ld a, b
cp $c
jr z, .load_tile_82
cp $9
jr z, .load_tile_82
cp $6
jr z, .load_tile_82
cp $3
ret nz
.load_tile_82
set 7, e
ld a, $82 ; ,
ld [de], a
res 7, e
ret
Func_8569:
xor a
ld hl, wAddScoreQueue
ld b, $31
.asm_856f
ld [hli], a
ld [hli], a
dec b
jr nz, .asm_856f
ld [hli], a
ret
AddBigBCD6FromQueueWithBallMultiplier: ; 0x8576
ld h, b
ld l, c
ld a, [wAddScoreQueueOffset]
ld e, a
ld d, wAddScoreQueue / $100
ld a, [wBallType]
and a
jr nz, .asm_8585
inc a
.asm_8585
ld b, a
jr asm_8592
AddBigBCD6FromQueue: ; 0x8588
; bc - Points to BCD buffer
ld h, b
ld l, c
ld a, [wAddScoreQueueOffset]
ld e, a
ld d, wAddScoreQueue / $100
ld b, $1
asm_8592:
push hl
x = 0
rept 6
ld a, [de]
if x == 0
add [hl]
else
adc [hl]
endc
daa
ld [de], a
inc de
inc hl
x = x + 1
endr
ld a, e
cp wAddScoreQueueEnd % $100
jr nz, .okay
ld e, wAddScoreQueue % $100
.okay
pop hl
dec b
jr nz, asm_8592
ld a, e
ld [wAddScoreQueueOffset], a
ret
Func_85c7: ; 0x85c7
ld a, [hNumFramesDropped]
and $3
ret nz
ld a, [wd478]
ld l, a
ld h, wAddScoreQueue / $100
ld de, wScore
ld a, [wAddScoreQueueOffset]
cp l
jr nz, .asm_85de
ld [wd479], a
.asm_85de
push hl
ld a, [hli]
or [hl]
inc hl
or [hl]
inc hl
or [hl]
inc hl
or [hl]
inc hl
or [hl]
pop hl
jr nz, .value_is_nonzero
ld a, [wd479]
ld [wd478], a
ret
.value_is_nonzero
ld a, [de]
add [hl]
daa
ld [de], a
ld [hl], $0
inc de
inc hl
ld a, [de]
adc [hl]
daa
ld [de], a
ld [hl], $0
inc de
inc hl
ld a, [de]
adc [hl]
daa
ld [de], a
ld [hl], $0
inc de
inc hl
ld a, [de]
adc [hl]
daa
ld [de], a
ld [hl], $0
inc de
inc hl
ld a, [de]
adc [hl]
daa
ld [de], a
ld [hl], $0
inc de
inc hl
ld a, [de]
adc [hl]
daa
ld [de], a
ld [hl], $0
call c, SetMaxScore
inc de
inc hl
ld a, l
cp $60
jr nz, .asm_862d
ld l, $0
.asm_862d
ld a, l
ld [wd478], a
ld a, $1
ld [wd49f], a
ret
SetMaxScore: ; 0x8637
push hl
ld hl, wScore
ld a, $99
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
pop hl
ret
Func_8645: ; 0x8645
xor a
ld [wd49f], a
ld de, wBottomMessageBuffer + $47
call Func_8524
ret
HideScoreIfBallLow: ; 0x8650
ld a, [wCurrentStage]
bit 0, a
jr nz, .bottomStage ;if on upper stage, score is up
ld a, $86
ld [hWY], a
ret
.bottomStage
ld a, [wBallYPos + 1]
cp $84
jr nc, .BallLow ;if ballY pos less than or equal to 132, raise score, else lower score
ld a, [hWY]
sub $3
cp $86
jr nc, .DontClampHigh ;if result is less than 132, clamp to 132, else just load it in
ld a, $86
.DontClampHigh
ld [hWY], a
ret
.BallLow
ld a, [hWY]
add $3
cp $90
jr c, .DontClampLow ;if result is more than 144, clamp to 144, else just load it in
ld a, $90
.DontClampLow
ld [hWY], a
ret