pokered/engine/slot_machine.asm

870 lines
13 KiB
NASM
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PromptUserToPlaySlots: ; 3730e (d:730e)
call SaveScreenTilesToBuffer2
ld a, BANK(DisplayTextIDInit)
ld [wcf0c], a
ld b, a
ld hl, DisplayTextIDInit
call Bankswitch
ld hl, PlaySlotMachineText
call PrintText
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jr nz, .skip
dec a
ld [wcfcb], a
ld hl, wcd4f
xor a
ld [hli], a
ld [hl], $2
predef EmotionBubble
call GBPalWhiteOutWithDelay3
call LoadSlotMachineTiles
call LoadFontTilePatterns
ld b, $5
call GoPAL_SET
call GBPalNormal
ld a, $e4
ld [$ff48], a
ld hl, wd730
set 6, [hl]
xor a
ld [W_SUBANIMSUBENTRYADDR], a
ld hl, wTrainerSpriteOffset
ld bc, $0014
call FillMemory
call MainSlotMachineLoop
ld hl, wd730
res 6, [hl]
xor a
ld [W_SUBANIMSUBENTRYADDR], a
call GBPalWhiteOutWithDelay3
ld a, $1
ld [wcfcb], a
call GoPAL_SET_CF1C
call Func_3e08
call ReloadTilesetTilePatterns
.skip
call LoadScreenTilesFromBuffer2
call Delay3
call GBPalNormal
ld a, [wcc5e]
push af
jp CloseTextDisplay
PlaySlotMachineText: ; 37390 (d:7390)
TX_FAR _PlaySlotMachineText
db "@"
MainSlotMachineLoop: ; 37395 (d:7395)
call SlotMachine_37754
xor a
ld hl, wcd4a
ld [hli], a
ld [hl], a
call SlotMachine_3775f
ld hl, BetHowManySlotMachineText
call PrintText
call SaveScreenTilesToBuffer1
.loop
ld a, $3
ld [wMenuWatchedKeys], a
ld a, $2
ld [wMaxMenuItem], a
ld a, $c
ld [wTopMenuItemY], a
ld a, $f
ld [wTopMenuItemX], a
xor a
ld [wCurrentMenuItem], a
ld [wLastMenuItem], a
ld [wcc37], a
ld hl, wTileMap + $ea
ld b, $5
ld c, $4
call TextBoxBorder
ld hl, wTileMap + $100
ld de, CoinMultiplierSlotMachineText
call PlaceString
call HandleMenuInput
and $2
jp nz, LoadScreenTilesFromBuffer1
ld a, [wCurrentMenuItem]
ld b, a
ld a, $3
sub b
ld [wcd50], a
ld hl, wPlayerCoins
ld c, a
ld a, [hli]
and a
jr nz, .skip1
ld a, [hl]
cp c
jr nc, .skip1
ld hl, NotEnoughCoinsSlotMachineText
call PrintText
jr .loop
.skip1
call LoadScreenTilesFromBuffer1
call SlotMachine_37741
call SlotMachine_377d5
call SlotMachine_37480
ld a, $4
ld hl, wcd4d
ld [hli], a
ld [hli], a
ld [hl], a
call WaitForSoundToFinish
ld a, (SFX_1f_66 - SFX_Headers_1f) / 3
call PlaySound
ld hl, StartSlotMachineText
call PrintText
call SlotMachine_374ad
call SlotMachine_37588
ld hl, wPlayerCoins
ld a, [hli]
or [hl]
jr nz, .skip2
ld hl, OutOfCoinsSlotMachineText
call PrintText
ld c, $3c
jp DelayFrames
.skip2
ld hl, OneMoreGoSlotMachineText
call PrintText
ld hl, wTileMap + $fe
ld bc, $0d0f
xor a
ld [wd12c], a
ld a, $14
ld [wd125], a
call DisplayTextBoxID
ld a, [wCurrentMenuItem]
and a
ret nz
call SlotMachine_377ce
jp MainSlotMachineLoop
CoinMultiplierSlotMachineText: ; 3745e (d:745e)
db "×3"
next "×2"
next "×1@"
OutOfCoinsSlotMachineText: ; 37467 (d:7467)
TX_FAR _OutOfCoinsSlotMachineText
db "@"
BetHowManySlotMachineText: ; 3746c (d:746c)
TX_FAR _BetHowManySlotMachineText
db "@"
StartSlotMachineText: ; 37471 (d:7471)
TX_FAR _StartSlotMachineText
db "@"
NotEnoughCoinsSlotMachineText: ; 37476 (d:7476)
TX_FAR _NotEnoughCoinsSlotMachineText
db "@"
OneMoreGoSlotMachineText: ; 3747b (d:747b)
TX_FAR _OneMoreGoSlotMachineText
db "@"
SlotMachine_37480: ; 37480 (d:7480)
ld hl, wcd4c
bit 7, [hl]
ret nz
ld a, [W_SUBANIMSUBENTRYADDR]
and a
jr nz, .skip1
call Random
and a
jr z, .skip2
ld b, a
ld a, [wcc5b]
cp b
jr c, .skip3
ld a, $d2
cp b
jr c, .skip1
ld [hl], $0
ret
.skip1
set 6, [hl]
ret
.skip2
ld a, $3c
ld [W_SUBANIMSUBENTRYADDR], a
ret
.skip3
set 7, [hl]
ret
SlotMachine_374ad: ; 374ad (d:74ad)
ld c, $14
.loop1
push bc
call SlotMachine_37813
call SlotMachine_37823
call SlotMachine_37833
ld c, $2
call DelayFrames
pop bc
dec c
jr nz, .loop1
xor a
ld [wTrainerSpriteOffset], a
.loop2
call SlotMachine_37882
call SlotMachine_374df
call SlotMachine_374fb
call SlotMachine_37517
ret c
ld a, [wcf1b]
xor $1
inc a
ld c, a
call DelayFrames
jr .loop2
SlotMachine_374df: ; 374df (d:74df)
ld a, [wTrainerSpriteOffset]
cp $1
jr c, .skip
ld de, wTrainerEngageDistance
ld a, [de]
rra
jr nc, .skip
ld hl, wcd4d
ld a, [hl]
and a
ret z
dec [hl]
call SlotMachine_3752c
ret nz
.skip
jp SlotMachine_37813
SlotMachine_374fb: ; 374fb (d:74fb)
ld a, [wTrainerSpriteOffset]
cp $2
jr c, .skip
ld de, wTrainerFacingDirection
ld a, [de]
rra
jr nc, .skip
ld hl, wcd4e
ld a, [hl]
and a
ret z
dec [hl]
call SlotMachine_37552
ret z
.skip
jp SlotMachine_37823
SlotMachine_37517: ; 37517 (d:7517)
ld a, [wTrainerSpriteOffset]
cp $3
jr c, .skip
ld de, wTrainerScreenY
ld a, [de]
rra
jr nc, .skip
scf
ret
.skip
call SlotMachine_37833
and a
ret
SlotMachine_3752c: ; 3752c (d:752c)
call SlotMachine_GetWheelOneTile
ld hl, wTrainerScreenX
ld a, [wcd4c]
and $80
jr nz, .skip1
inc hl
ld a, [hl]
cp $a
jr nz, .skip2
ret
.skip1
ld c, $3
.loop
ld a, [hli]
cp $2
jr c, .skip2
dec c
jr nz, .loop
ret
.skip2
inc a
ld hl, wcd4d
ld [hl], $0
ret
SlotMachine_37552: ; 37552 (d:7552)
call SlotMachine_GetWheelTwoTile
ld a, [wcd4c]
and $80
jr nz, .skip1
call SlotMachine_3756e
ret nz
jr .skip2
.skip1
call SlotMachine_3756e
ld a, [de]
cp $7
ret nc
.skip2
xor a
ld [wcd4e], a
ret
SlotMachine_3756e: ; 3756e (d:756e)
ld hl, wTrainerScreenX
ld de, wcd44
ld a, [de]
cp [hl]
ret z
inc de
ld a, [de]
cp [hl]
ret z
inc hl
cp [hl]
ret z
inc hl
cp [hl]
ret z
inc de
ld a, [de]
cp [hl]
ret z
dec de
dec de
ret
SlotMachine_37588: ; 37588 (d:7588)
call SlotMachine_GetWheelThreeTile
ld a, [wcd50]
cp $2
jr z, .skip1
cp $1
jr z, .skip2
ld hl, wTrainerScreenX
ld de, wcd45
ld bc, wcd49
call SlotMachine_CheckForMatch
jp z, .skip5
ld hl, wcd43
ld de, wcd45
ld bc, wcd47
call SlotMachine_CheckForMatch
jr z, .skip5
.skip1
ld hl, wcd43
ld de, wcd46
ld bc, wcd49
call SlotMachine_CheckForMatch
jr z, .skip5
ld hl, wTrainerScreenX
ld de, wcd44
ld bc, wcd47
call SlotMachine_CheckForMatch
jr z, .skip5
.skip2
ld hl, wcd42
ld de, wcd45
ld bc, wcd48
call SlotMachine_CheckForMatch
jr z, .skip5
ld a, [wcd4c]
and $c0
jr z, .skip3
ld hl, wcd4f
dec [hl]
jr nz, .skip4
.skip3
ld hl, NotThisTimeText
call PrintText
.loop
xor a
ld [wc002], a
ret
.skip4
call SlotMachine_37833
call DelayFrame
call SlotMachine_37833
call DelayFrame
jp SlotMachine_37588
.skip5
ld a, [wcd4c]
and $c0
jr z, .skip4
and $80
jr nz, .skip6
ld a, [hl]
cp $7
jr c, .skip4
.skip6
ld a, [hl]
sub $2
ld [wTrainerScreenX], a
ld hl, SlotRewardPointers
ld c, a
ld b, $0
add hl, bc
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
push de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, wcf4b
ld bc, $0004
call CopyData
pop hl
ld de, .asm_37638
push de
jp [hl]
.asm_37638
ld a, [$ff47]
xor $40
ld [$ff47], a
ld c, $5
call DelayFrames
dec b
jr nz, .asm_37638
ld hl, wcd4a
ld [hl], d
inc hl
ld [hl], e
call SlotMachine_3775f
ld hl, SlotsMachineText_37665
call PrintText
call WaitForTextScrollButtonPress
call SlotMachine_3776b
call SlotMachine_3775f
ld a, $e4
ld [$ff48], a
jp .loop
SlotsMachineText_37665: ; 37665 (d:7665)
db $08 ; asm
push bc
call SlotMachine_37728
ld hl, LinedUpText
pop bc
inc bc
inc bc
inc bc
inc bc
ret
LinedUpText: ; 37673 (d:7673)
TX_FAR _LinedUpText
db "@"
SlotRewardPointers: ; 37678 (d:7678)
dw SlotReward300Func
dw SlotReward300Text
dw SlotReward100Func
dw SlotReward100Text
dw SlotReward8Func
dw SlotReward8Text
dw SlotReward15Func
dw SlotReward15Text
dw SlotReward15Func
dw SlotReward15Text
dw SlotReward15Func
dw SlotReward15Text
SlotReward300Text: ; 37690 (d:7690)
db "300@"
SlotReward100Text: ; 37694 (d:7694)
db "100@"
SlotReward8Text: ; 37698 (d:7698)
db "8@"
SlotReward15Text: ; 3769a (d:769a)
db "15@"
NotThisTimeText: ; 3769d (d:769d)
TX_FAR _NotThisTimeText
db "@"
; compares the slot machine tiles at bc, de, and hl
SlotMachine_CheckForMatch: ; 376a2 (d:76a2)
ld a, [de]
cp [hl]
ret nz
ld a, [bc]
cp [hl]
ret
SlotMachine_GetWheelThreeTile: ; 376a8 (d:76a8)
ld de, wcd47
ld hl, SlotMachineWheel3
ld a, [wTrainerScreenY]
call SlotMachine_GetWheelTile
SlotMachine_GetWheelTwoTile: ; 376b4 (d:76b4)
ld de, wcd44
ld hl, SlotMachineWheel2
ld a, [wTrainerFacingDirection]
call SlotMachine_GetWheelTile
SlotMachine_GetWheelOneTile: ; 376c0 (d:76c0)
ld de, wTrainerScreenX
ld hl, SlotMachineWheel1
ld a, [wTrainerEngageDistance]
SlotMachine_GetWheelTile: ; 376c9 (d:76c9)
ld c, a
ld b, $0
add hl, bc
ld c, $3
.loop
ld a, [hli]
ld [de], a
inc de
inc hl
dec c
jr nz, .loop
ret
SlotReward8Func: ; 376d7 (d:76d7)
ld hl, W_SUBANIMSUBENTRYADDR
ld a, [hl]
and a
jr z, .skip
dec [hl]
.skip
ld b, $2
ld de, 8
ret
SlotReward15Func: ; 376e5 (d:76e5)
ld hl, W_SUBANIMSUBENTRYADDR
ld a, [hl]
and a
jr z, .skip
dec [hl]
.skip
ld b, $4
ld de, 15
ret
SlotReward100Func: ; 376f3 (d:76f3)
ld a, (SFX_1f_42 - SFX_Headers_1f) / 3
call PlaySound
xor a
ld [wcd4c], a
ld b, $8
ld de, 100
ret
SlotReward300Func: ; 37702 (d:7702)
ld hl, YeahText
call PrintText
ld a, (SFX_1f_3b - SFX_Headers_1f) / 3
call PlaySound
call Random
cp $80
ld a, $0
jr c, .skip
ld [wcd4c], a
.skip
ld [W_SUBANIMSUBENTRYADDR], a
ld b, $14
ld de, 300
ret
YeahText: ; 37722 (d:7722)
TX_FAR _YeahText
db $0a, "@"
SlotMachine_37728: ; 37728 (d:7728)
ld hl, wTileMap + $11a
ld a, [wTrainerScreenX]
add $25
ld [hli], a
inc a
ld [hld], a
inc a
ld de, $ffec
add hl, de
ld [hli], a
inc a
ld [hl], a
ld hl, wTileMap + $152
ld [hl], $ee
ret
SlotMachine_37741: ; 37741 (d:7741)
ld hl, wcd4b
ld a, [wcd50]
ld [hld], a
xor a
ld [hli], a
ld de, wPlayerCoins + 1
ld c, $2
predef SubBCDPredef
SlotMachine_37754: ; 37754 (d:7754)
ld hl, wTileMap + $19
ld de, wPlayerCoins
ld c, $2
jp PrintBCDNumber
SlotMachine_3775f: ; 3775f (d:775f)
ld hl, wTileMap + $1f
ld de, wcd4a
ld bc, $8204
jp PrintNumber
SlotMachine_3776b: ; 3776b (d:776b)
ld a, $1
ld [wc002], a
call WaitForSoundToFinish
ld hl, wcd46
xor a
ld [hli], a
inc a
ld [hl], a
ld a, $5
ld [W_SUBANIMTRANSFORM], a
.loop
ld a, [wcd4b]
ld l, a
ld a, [wcd4a]
ld h, a
or l
ret z
ld de, $ffff
add hl, de
ld a, l
ld [wcd4b], a
ld a, h
ld [wcd4a], a
ld hl, wcd47
ld de, wPlayerCoins + 1
ld c, $2
predef AddBCDPredef
call SlotMachine_37754
call SlotMachine_3775f
ld a, (SFX_1f_65 - SFX_Headers_1f) / 3
call PlaySound
ld a, [W_SUBANIMTRANSFORM]
dec a
jr nz, .skip1
ld a, [$ff48]
xor $40
ld [$ff48], a
ld a, $5
.skip1
ld [W_SUBANIMTRANSFORM], a
ld a, [wTrainerScreenX]
cp $7
ld c, $8
jr nc, .skip2
srl c
.skip2
call DelayFrames
jr .loop
SlotMachine_377ce: ; 377ce (d:77ce)
ld a, $23
ld [wd08a], a
jr SlotMachine_377e3
SlotMachine_377d5: ; 377d5 (d:77d5)
ld a, $14
ld [wd08a], a
ld a, [wcd50]
dec a
jr z, SlotMachine_377fb
dec a
jr z, SlotMachine_377ef
SlotMachine_377e3: ; 377e3 (d:77e3)
ld hl, wTileMap + $2b
call SlotMachine_377fe
ld hl, wTileMap + $cb
call SlotMachine_377fe
SlotMachine_377ef: ; 377ef (d:77ef)
ld hl, wTileMap + $53
call SlotMachine_377fe
ld hl, wTileMap + $a3
call SlotMachine_377fe
SlotMachine_377fb: ; 377fb (d:77fb)
ld hl, wTileMap + $7b
SlotMachine_377fe: ; 377fe (d:77fe)
ld a, [wd08a]
ld [hl], a
ld bc, $000d
add hl, bc
ld [hl], a
ld bc, $0007
add hl, bc
inc a
ld [hl], a
ld bc, $000d
add hl, bc
ld [hl], a
ret
SlotMachine_37813: ; 37813 (d:7813)
ld bc, SlotMachineWheel1
ld de, wTrainerEngageDistance
ld hl, wOAMBuffer
ld a, $30
ld [W_BASECOORDX], a
jr SlotMachine_37841
SlotMachine_37823: ; 37823 (d:7823)
ld bc, SlotMachineWheel2
ld de, wTrainerFacingDirection
ld hl, wOAMBuffer + $30
ld a, $50
ld [W_BASECOORDX], a
jr SlotMachine_37841
SlotMachine_37833: ; 37833 (d:7833)
ld bc, SlotMachineWheel3
ld de, wTrainerScreenY
ld hl, wOAMBuffer + $60
ld a, $70
ld [W_BASECOORDX], a
SlotMachine_37841: ; 37841 (d:7841)
ld a, $58
ld [W_BASECOORDY], a
push de
ld a, [de]
ld d, b
add c
ld e, a
jr nc, SlotMachine_3784e
inc d
SlotMachine_3784e: ; 3784e (d:784e)
ld a, [W_BASECOORDY]
ld [hli], a
ld a, [W_BASECOORDX]
ld [hli], a
ld a, [de]
ld [hli], a
ld a, $80
ld [hli], a
ld a, [W_BASECOORDY]
ld [hli], a
ld a, [W_BASECOORDX]
add $8
ld [hli], a
ld a, [de]
inc a
ld [hli], a
ld a, $80
ld [hli], a
inc de
ld a, [W_BASECOORDY]
sub $8
ld [W_BASECOORDY], a
cp $28
jr nz, SlotMachine_3784e
pop de
ld a, [de]
inc a
cp $1e
jr nz, .skip
xor a
.skip
ld [de], a
ret
SlotMachine_37882: ; 37882 (d:7882)
call DelayFrame
call JoypadLowSensitivity
ld a, [$ffb5]
and $1
ret z
ld hl, wTrainerSpriteOffset
ld a, [hl]
dec a
ld de, wcd4d
jr z, .skip
dec a
ld de, wcd4e
jr z, .skip
.loop
inc [hl]
ld a, (SFX_1f_64 - SFX_Headers_1f) / 3
jp PlaySound
.skip
ld a, [de]
and a
ret nz
jr .loop
LoadSlotMachineTiles: ; 378a8 (d:78a8)
call DisableLCD
ld hl, SlotMachineTiles2
ld de, vChars0
ld bc, $1c0
ld a, BANK(SlotMachineTiles2)
call FarCopyData2
ld hl, SlotMachineTiles1
ld de, vChars2
ld bc, $250
ld a, BANK(SlotMachineTiles1)
call FarCopyData2
ld hl, SlotMachineTiles2
ld de, vChars2 + $250
ld bc, $1c0
ld a, BANK(SlotMachineTiles2)
call FarCopyData2
ld hl, SlotMachineMap
ld de, wTileMap
ld bc, $00f0
call CopyData
call EnableLCD
ld hl, wTrainerEngageDistance
ld a, $1c
ld [hli], a
ld [hli], a
ld [hl], a
call SlotMachine_37813
call SlotMachine_37823
jp SlotMachine_37833
SlotMachineMap: ; 378f5 (d:78f5)
INCBIN "gfx/tilemaps/slotmachine.map"
SLOTS7 EQU $0200
SLOTSBAR EQU $0604
SLOTSCHERRY EQU $0A08
SLOTSFISH EQU $0E0C
SLOTSBIRD EQU $1210
SLOTSMOUSE EQU $1614
INCLUDE "data/slot_machine_wheels.asm"
SlotMachineTiles1: ; 37a51 (d:7a51)
IF _RED
INCBIN "gfx/red/slotmachine1.2bpp"
ENDC
IF _BLUE
INCBIN "gfx/blue/slotmachine1.2bpp"
ENDC