pokegold-spaceworld/engine/games/slot_machine_game.asm
Rangi 26a44bf940
Some checks failed
CI / build (push) Has been cancelled
Use features of RGBDS 1.0.0 (#123)
* All programs (rgbasm, rgblink, rgbfix, rgbgfx) support `-W` warnings

* Use `rgbgfx -c dmg` for grayscale 1bpp/2bpp

* Use new string functions and operators

* Use `?` to silence nodes in warning/error location backtraces

* Use single-quoted character literals for numeric values

* Do not warn about overwriting bytes in the corrected header
2025-11-13 15:28:12 -05:00

2215 lines
33 KiB
NASM
Raw Permalink 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.

INCLUDE "constants.asm"
SECTION "engine/games/slot_machine_game.asm", ROMX
DEF SLOTS_NO_BIAS EQU -1
DEF SLOTS_NO_MATCH EQU -1
DEF SLOTS_STARTING_COINS EQU 256
DEF SLOTS_GFX_BLANK_TILE EQU $17
DEF SLOTS_GFX_ILLUMINATED_LIGHT EQU $14
DEF SLOTS_GFX_DEILLUMINATED_LIGHT EQU $23
DEF SLOTS_GFX_SEVEN_TILE_1 EQU $25
DEF SLOTS_GFX_SEVEN_TILE_2 EQU $41
DEF SLOTS_SEVEN EQU $00
DEF SLOTS_POKEBALL EQU $04
DEF SLOTS_CHERRY EQU $08
DEF SLOTS_PIKACHU EQU $0c
DEF SLOTS_SQUIRTLE EQU $10
DEF SLOTS_STARYU EQU $14
DEF REEL_SIZE EQU 15
; SlotsJumptable constants
const_def
const SLOTS_INIT
const SLOTS_BET_AND_START
const SLOTS_WAIT_START
const SLOTS_WAIT_REEL1
const SLOTS_WAIT_STOP_REEL1
const SLOTS_WAIT_REEL2
const SLOTS_WAIT_STOP_REEL2
const SLOTS_WAIT_REEL3
const SLOTS_WAIT_STOP_REEL3
const SLOTS_NEXT_09
const SLOTS_NEXT_0A
const SLOTS_NEXT_0B
const SLOTS_FLASH_IF_WIN
const SLOTS_FLASH_SCREEN
const SLOTS_GIVE_EARNED_COINS
const SLOTS_PAYOUT_TEXT_AND_ANIM
const SLOTS_PAYOUT_ANIM
const SLOTS_RESTART_OR_QUIT
const SLOTS_QUIT
DEF SLOTS_END_LOOP_F EQU 7
; ReelActionJumptable constants
const_def
const REEL_ACTION_DO_NOTHING
const REEL_ACTION_STOP_REEL_IGNORE_JOYPAD
const REEL_ACTION_QUADRUPLE_RATE
const REEL_ACTION_DOUBLE_RATE
const REEL_ACTION_NORMAL_RATE
const REEL_ACTION_HALF_RATE
const REEL_ACTION_QUARTER_RATE
const REEL_ACTION_STOP_REEL1
const REEL_ACTION_STOP_REEL2
const REEL_ACTION_STOP_REEL3
const REEL_ACTION_SET_UP_REEL2_SKIP_TO_7
const REEL_ACTION_WAIT_REEL2_SKIP_TO_7
const REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S
const REEL_ACTION_0D
const REEL_ACTION_CHECK_DROP_REEL
const REEL_ACTION_WAIT_DROP_REEL
const REEL_ACTION_START_SLOW_ADVANCE_REEL3
const REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3
const REEL_ACTION_INIT_GOLEM
const REEL_ACTION_WAIT_GOLEM
const REEL_ACTION_END_GOLEM
const REEL_ACTION_INIT_CHANSEY
const REEL_ACTION_WAIT_CHANSEY
const REEL_ACTION_WAIT_EGG
const REEL_ACTION_DROP_REEL
; Constants for slot_reel offsets (see macros/wram.asm)
DEF REEL_ACTION EQUS "(wReel1ReelAction - wReel1)"
DEF REEL_TILEMAP_ADDR EQUS "(wReel1TilemapAddr - wReel1)"
DEF REEL_POSITION EQUS "(wReel1Position - wReel1)"
DEF REEL_SPIN_DISTANCE EQUS "(wReel1SpinDistance - wReel1)"
DEF REEL_SPIN_RATE EQUS "(wReel1SpinRate - wReel1)"
DEF REEL_OAM_ADDR EQUS "(wReel1OAMAddr - wReel1)"
DEF REEL_X_COORD EQUS "(wReel1XCoord - wReel1)"
DEF REEL_MANIP_COUNTER EQUS "(wReel1ManipCounter - wReel1)"
DEF REEL_MANIP_DELAY EQUS "(wReel1ManipDelay - wReel1)"
DEF REEL_FIELD_0B EQUS "(wReel1Field0b - wReel1)"
DEF REEL_STOP_DELAY EQUS "(wReel1StopDelay - wReel1)"
SlotMachineGame:
; Always start off with 256 coins
ld hl, wCoins
ld [hl], HIGH(SLOTS_STARTING_COINS)
inc hl
ld [hl], LOW(SLOTS_STARTING_COINS)
ld hl, wOptions
set NO_TEXT_SCROLL_F, [hl]
call SlotMachineGame_Init
call DelayFrame
.loop
call SlotsLoop
jr nc, .loop
ld hl, wOptions
res NO_TEXT_SCROLL_F, [hl]
ld hl, rLCDC
res rLCDC_SPRITE_SIZE, [hl]
ret
SlotMachineGame_Init:
call DisableLCD
ld b, SGB_SLOT_MACHINE
call GetSGBLayout
callfar ClearSpriteAnims
ld hl, wSlots
ld bc, wSlotsDataEnd - wSlots
xor a
call ByteFill
ld hl, SlotMachine2GFX
ld de, vSprites
ld bc, $80 tiles
ld a, BANK(SlotMachine2GFX)
call FarCopyData
ld hl, SlotMachineGFX
ld de, vChars2
ld bc, $25 tiles
ld a, BANK(SlotMachineGFX)
call FarCopyData
ld hl, SlotMachine2GFX
ld de, vChars2 tile $25
ld bc, $1c tiles
ld a, BANK(SlotMachine2GFX)
call FarCopyData
ld hl, SlotMachine3GFX
ld de, vChars2 tile $41
ld bc, $1c tiles
ld a, $24
call FarCopyData
ld hl, SlotsTilemap
decoord 0, 0
ld bc, SCREEN_WIDTH * 12
.init_tilemap
ld a, [hli]
ld [de], a
inc de
dec bc
ld a, c
or b
jr nz, .init_tilemap
ld hl, rLCDC
set 2, [hl]
call EnableLCD
xor a
ld hl, wSlots
ld c, wSlotsEnd - wSlots
.clear_ram
ld [hli], a
dec c
jr nz, .clear_ram
call Slots_InitReelTiles
ld a, %11100100
ldh [rBGP], a
ldh [rOBP0], a
ld a, %11000000
ldh [rOBP1], a
ld a, SPRITE_ANIM_DICT_SLOTS
ld hl, wSpriteAnimDict
ld [hli], a
ld [hl], $20
xor a
ld [wJumptableIndex], a
ld a, SLOTS_NO_BIAS
ld [wSlotBias], a
ret
SlotsLoop:
ld a, [wJumptableIndex]
bit SLOTS_END_LOOP_F, a
jr nz, .done
call SlotsJumptable
call Slots_SpinReels
ld a, $60
ld [wCurSpriteOAMAddr], a
callfar DoNextFrameForFirst16Sprites
call Slots_PrintCoinsAndPayout
call Slots_FlashPaletteOnMatchingSevens
call Slots_AnimateReelSpritesAfterSpin
call Slots_DisplayBiasValue
call DelayFrame
and a
ret
.done
scf
ret
Slots_FlashPaletteOnMatchingSevens:
ld a, [wReel1ReelAction]
and a
ret nz
ld a, [wReel2ReelAction]
and a
ret nz
ld a, [wFirstTwoReelsMatchingSevens]
and a
jr nz, .matching_sevens
ld a, %11100100
ldh [rBGP], a
ret
.matching_sevens
ld a, [wVBlankJoyFrameCounter]
and 7
ret nz
ldh a, [rBGP]
xor %1100
ldh [rBGP], a
ret
Slots_PrintCoinsAndPayout:
hlcoord 5, 1
ld de, wCoins
lb bc, PRINTNUM_LEADINGZEROS | 2, 4
call PrintNumber
hlcoord 11, 1
ld de, wPayout
lb bc, PRINTNUM_LEADINGZEROS | 2, 4
call PrintNumber
ret
Slots_DisplayBiasValue:
; debug feature
ld a, [wSlotBias]
add 0
daa
ld e, a
; print second digit
and $f
add ''
hlcoord 1, 0
ld [hl], a
; print first digit
ld a, e
swap a
and $F
add ''
hlcoord 0, 0
ld [hl], a
ret
Slots_AnimateReelSpritesAfterSpin:
ld hl, wSlotReelIconDelay
ld a, [hl]
inc [hl]
and 7
ret nz
hlcoord 5, 4
ld a, [hl]
cp SLOTS_GFX_BLANK_TILE
call nz, .AnimateReelSprite
hlcoord 9, 4
ld a, [hl]
cp SLOTS_GFX_BLANK_TILE
call nz, .AnimateReelSprite
hlcoord 13, 4
ld a, [hl]
cp SLOTS_GFX_BLANK_TILE
call nz, .AnimateReelSprite
ret
.AnimateReelSprite:
cp SLOTS_GFX_SEVEN_TILE_2
jr c, .seven_tile
ld b, %11100100
jr .continue
.seven_tile
ld b, $1C
.continue
ld de, $14
ld c, 6
.loop
ld a, [hl]
add b
ld [hli], a
ld a, [hl]
add b
ld [hld], a
add hl, de
dec c
jr nz, .loop
ret
SlotsJumptable:
jumptable .Jumptable, wJumptableIndex
.Jumptable:
dw SlotsAction_Init
dw SlotsAction_BetAndStart
dw SlotsAction_WaitStart
dw SlotsAction_WaitReel1
dw SlotsAction_WaitStopReel1
dw SlotsAction_WaitReel2
dw SlotsAction_WaitStopReel2
dw SlotsAction_WaitReel3
dw SlotsAction_WaitStopReel3
dw SlotsAction_Next
dw SlotsAction_Next
dw SlotsAction_Next
dw SlotsAction_FlashIfWin
dw SlotsAction_FlashScreen
dw SlotsAction_GiveEarnedCoins
dw SlotsAction_PayoutTextAndAnim
dw SlotsAction_PayoutAnim
dw SlotsAction_RestartOrQuit
dw SlotsAction_Quit
SlotsAction_Next:
ld hl, wJumptableIndex
inc [hl]
ret
SlotsAction_Init:
call SlotsAction_Next
xor a
ld [wFirstTwoReelsMatching], a
ld [wFirstTwoReelsMatchingSevens], a
ld a, SLOTS_NO_MATCH
ld [wSlotMatched], a
ret
SlotsAction_BetAndStart:
call Slots_AskBet
jr nc, .proceed
ld a, SLOTS_QUIT
ld [wJumptableIndex], a
ret
.proceed
call SlotsAction_Next
call Slots_IlluminateBetLights
call Slots_InitBias
ld a, 32
ld [wSlotsDelay], a
ld a, REEL_ACTION_NORMAL_RATE
ld [wReel1ReelAction], a
ld [wReel2ReelAction], a
ld [wReel3ReelAction], a
ld a, 4
ld [wReel1ManipCounter], a
ld [wReel2ManipCounter], a
ld [wReel3ManipCounter], a
ret
SlotsAction_WaitStart:
ld hl, wSlotsDelay
ld a, [hl]
and a
jr z, .proceed
dec [hl]
ret
.proceed
call SlotsAction_Next
xor a
ldh [hJoypadSum], a
ret
SlotsAction_WaitReel1:
ld hl, hJoypadSum
ld a, [hl]
and A_BUTTON
ret z
call SlotsAction_Next
call Slots_StopReel1
ld [wReel1ReelAction], a
SlotsAction_WaitStopReel1:
ld a, [wReel1ReelAction]
cp REEL_ACTION_DO_NOTHING
ret nz
ld bc, wReel1
ld de, wReel1Stopped
call Slots_LoadReelState
call SlotsAction_Next
xor a
ldh [hJoypadSum], a
SlotsAction_WaitReel2:
ld hl, hJoypadSum
ld a, [hl]
and A_BUTTON
ret z
call SlotsAction_Next
call Slots_StopReel2
ld [wReel2ReelAction], a
SlotsAction_WaitStopReel2:
ld a, [wReel2ReelAction]
cp REEL_ACTION_DO_NOTHING
ret nz
ld bc, wReel2
ld de, wReel2Stopped
call Slots_LoadReelState
call SlotsAction_Next
xor a
ldh [hJoypadSum], a
SlotsAction_WaitReel3:
ld hl, hJoypadSum
ld a, [hl]
and A_BUTTON
ret z
call SlotsAction_Next
call Slots_StopReel3
ld [wReel3ReelAction], a
SlotsAction_WaitStopReel3:
ld a, [wReel3ReelAction]
cp REEL_ACTION_DO_NOTHING
ret nz
ld bc, wReel3
ld de, wReel3Stopped
call Slots_LoadReelState
call SlotsAction_Next
xor a
ldh [hJoypadSum], a
call Function90822
call Function90805
ret
SlotsAction_FlashIfWin:
ld a, [wSlotMatched]
cp SLOTS_NO_MATCH
jr nz, .matched
call SlotsAction_Next
call SlotsAction_Next
ret
.matched
call SlotsAction_Next
ld a, 16
ld [wSlotsDelay], a
SlotsAction_FlashScreen:
ld hl, wSlotsDelay
ld a, [hl]
and a
jr z, .done
dec [hl]
srl a
ret z
ldh a, [rOBP0]
xor $ff
ldh [rOBP0], a
ret
.done
ld a, %11100100
ldh [rOBP0], a
call SlotsAction_Next
ret
SlotsAction_GiveEarnedCoins:
xor a
ld [wFirstTwoReelsMatching], a
ld [wFirstTwoReelsMatchingSevens], a
ld a, %11100100
ldh [rBGP], a
call Slots_GetPayout
xor a
ld [wSlotsDelay], a
call SlotsAction_Next
ret
SlotsAction_PayoutTextAndAnim:
call Slots_PayoutText
call SlotsAction_Next
ld bc, wReel1ReelAction
call Function907c8
ld bc, wReel2ReelAction
call Function907c8
ld bc, wReel3ReelAction
call Function907c8
call WaitBGMap
ld hl, wShadowOAM
ld e, $60
xor a
.loop
ld [hli], a
dec e
jr nz, .loop
SlotsAction_PayoutAnim:
ld hl, wSlotsDelay
ld a, [hl]
inc [hl]
and $1
ret z
ld hl, wPayout
ld a, [hli]
ld d, a
or [hl]
jr z, .done
ld e, [hl]
dec de
ld [hl], e
dec hl
ld [hl], d
ld hl, wCoins
ld d, [hl]
inc hl
ld e, [hl]
call Slots_CheckCoinCaseFull
jr c, .okay
inc de
.okay
ld [hl], e
dec hl
ld [hl], d
ld a, [wSlotsDelay]
and 7
ret z
ld de, $2F
call PlaySFX
ret
.done
call SlotsAction_Next
call Function90822
call Function90805
ret
SlotsAction_RestartOrQuit:
call Slots_DeilluminateBetLights
call TextboxWaitPressAorB_BlinkCursor
call Slots_AskPlayAgain
jr c, .exit_slots
ld a, SLOTS_INIT
ld [wJumptableIndex], a
ret
.exit_slots
ld a, SLOTS_QUIT
ld [wJumptableIndex], a
ret
SlotsAction_Quit:
ld hl, wJumptableIndex
set SLOTS_END_LOOP_F, [hl]
ret
Slots_LoadReelState:
push de
call Slots_GetCurrentReelState
pop de
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
ret
Slots_CheckCoinCaseFull:
ld a, d
cp HIGH(MAX_COINS)
jr c, .not_full
ld a, e
cp LOW(MAX_COINS)
jr c, .not_full
scf
ret
.not_full
and a
ret
Slots_GetCurrentReelState:
ld hl, REEL_POSITION
add hl, bc
ld a, [hl]
and a
jr nz, .okay
ld a, $f
.okay
dec a
and $f
ld e, a
ld d, 0
ld hl, REEL_TILEMAP_ADDR
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
add hl, de
ret
Slots_StopReel1:
ld a, REEL_ACTION_STOP_REEL1
ret
Slots_StopReel2:
ld a, [wSlotBias]
and a
jr z, .skip
cp SLOTS_NO_BIAS
jr nz, .dont_jump
.skip
call .CheckReel1ForASeven
jr nz, .dont_jump
call Random
cp 31 percent + 1
jr nc, .dont_jump
ld a, REEL_ACTION_SET_UP_REEL2_SKIP_TO_7
ret
.dont_jump
ld a, REEL_ACTION_STOP_REEL2
ret
.CheckReel1ForASeven:
ld a, [wReel1Stopped]
and a
ret z
ld a, [wReel1Stopped + 1]
and a
ret z
ld a, [wReel1Stopped + 2]
and a
ret
Slots_StopReel3:
ld a, [wFirstTwoReelsMatching]
and a
jr z, .stop
ld a, [wFirstTwoReelsMatchingSevens]
and a
jr z, .stop
ld a, [wSlotBias]
and a
jr nz, .biased
call Random
cp 71 percent - 1
jr nc, .stop
cp 47 percent + 1
jr nc, .slow_advance
cp 24 percent - 1
jr nc, .golem
ld a, REEL_ACTION_INIT_CHANSEY
ret
.biased
call Random
cp 63 percent
jr nc, .stop
cp 31 percent + 1
jr nc, .slow_advance
.golem
ld a, REEL_ACTION_INIT_GOLEM
ret
.slow_advance
ld a, REEL_ACTION_START_SLOW_ADVANCE_REEL3
ret
.stop
ld a, REEL_ACTION_STOP_REEL3
ret
Slots_InitReelTiles:
ld bc, wReel1
ld hl, REEL_OAM_ADDR
add hl, bc
ld de, wShadowOAM
ld [hl], e
inc hl
ld [hl], d
ld hl, REEL_TILEMAP_ADDR
add hl, bc
ld de, Slots_Reel1Tilemap
ld [hl], e
inc hl
ld [hl], d
ld hl, REEL_X_COORD
add hl, bc
ld [hl], 6 * TILE_WIDTH
call .OAM
ld bc, wReel2
ld hl, REEL_OAM_ADDR
add hl, bc
ld de, wShadowOAMSprite08
ld [hl], e
inc hl
ld [hl], d
ld hl, REEL_TILEMAP_ADDR
add hl, bc
ld de, Slots_Reel2Tilemap
ld [hl], e
inc hl
ld [hl], d
ld hl, REEL_X_COORD
add hl, bc
ld [hl], 10 * TILE_WIDTH
call .OAM
ld bc, wReel3
ld hl, REEL_OAM_ADDR
add hl, bc
ld de, wShadowOAMSprite16
ld [hl], e
inc hl
ld [hl], d
ld hl, REEL_TILEMAP_ADDR
add hl, bc
ld de, Slots_Reel3Tilemap
ld [hl], e
inc hl
ld [hl], d
ld hl, REEL_X_COORD
add hl, bc
ld [hl], 14 * TILE_WIDTH
call .OAM
ret
.OAM:
ld hl, REEL_ACTION
add hl, bc
ld [hl], REEL_ACTION_DO_NOTHING
ld hl, REEL_POSITION
add hl, bc
ld [hl], REEL_SIZE - 1
ld hl, REEL_SPIN_DISTANCE
add hl, bc
ld [hl], REEL_ACTION_DO_NOTHING
call Slots_UpdateReelPositionAndOAM
ret
Slots_SpinReels:
ld bc, wReel1
call .SpinReel
ld bc, wReel2
call .SpinReel
ld bc, wReel3
call .SpinReel
ret
.SpinReel:
ld hl, REEL_SPIN_DISTANCE
add hl, bc
ld a, [hl]
and $f
jr nz, .skip
call ReelActionJumptable
.skip
ld hl, REEL_SPIN_RATE
add hl, bc
ld a, [hl]
and a
ret z
ld d, a
ld hl, REEL_SPIN_DISTANCE
add hl, bc
add [hl]
ld [hl], a
and $f
jr z, Slots_UpdateReelPositionAndOAM
ld hl, REEL_OAM_ADDR
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld e, 8
.loop
ld a, [hl]
add d
ld [hli], a
inc hl
inc hl
inc hl
dec e
jr nz, .loop
ret
Slots_UpdateReelPositionAndOAM:
ld hl, REEL_X_COORD
add hl, bc
ld a, [hl]
ld [wCurReelXCoord], a
ld a, 10 * TILE_WIDTH
ld [wCurReelYCoord], a
ld hl, REEL_POSITION
add hl, bc
ld e, [hl]
ld d, 0
ld hl, REEL_TILEMAP_ADDR
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
add hl, de
ld e, l
ld d, h
call Slots_LoadOAM
ld hl, REEL_POSITION
add hl, bc
ld a, [hl]
inc a
and $f
cp REEL_SIZE
jr nz, .load
xor a
.load
ld [hl], a
ret
Slots_LoadOAM:
ld hl, REEL_OAM_ADDR
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
.loop
; set y and x coordinates
ld a, [wCurReelYCoord]
ld [hli], a
ld a, [wCurReelXCoord]
ld [hli], a
; set tile ID
ld a, [de]
ld [hli], a
; set priority behind BG, no attributes beyond it
ld a, (1 << OAM_PRIORITY)
ld [hli], a
; next OAM
ld a, [wCurReelYCoord]
ld [hli], a
ld a, [wCurReelXCoord]
add 8
ld [hli], a
ld a, [de]
inc a
inc a
ld [hli], a
ld a, (1 << OAM_PRIORITY)
ld [hli], a
inc de
ld a, [wCurReelYCoord]
sub 2 * TILE_WIDTH
ld [wCurReelYCoord], a
cp 2 * TILE_WIDTH
jr nz, .loop
ret
ReelActionJumptable:
ld hl, REEL_ACTION
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
dw ReelAction_DoNothing
dw ReelAction_StopReelIgnoreJoypad
dw ReelAction_QuadrupleRate
dw ReelAction_DoubleRate
dw ReelAction_NormalRate
dw ReelAction_HalfRate
dw ReelAction_QuarterRate
dw ReelAction_StopReel1
dw ReelAction_StopReel2
dw ReelAction_StopReel3
dw ReelAction_SetUpReel2SkipTo7
dw ReelAction_WaitReel2SkipTo7
dw ReelAction_FastSpinReel2UntilLinedUp7s
dw ReelAction_0D
dw ReelAction_CheckDropReel
dw ReelAction_WaitDropReel
dw ReelAction_StartSlowAdvanceReel3
dw ReelAction_WaitSlowAdvanceReel3
dw ReelAction_InitGolem
dw ReelAction_WaitGolem
dw ReelAction_EndGolem
dw ReelAction_InitChansey
dw ReelAction_WaitChansey
dw ReelAction_WaitEgg
dw ReelAction_DropReel
ReelAction_DoNothing:
ret
ReelAction_QuadrupleRate:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 16
ret
ReelAction_DoubleRate:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 8
ret
ReelAction_NormalRate:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 4
ret
ReelAction_HalfRate:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 2
ret
ReelAction_QuarterRate:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 1
ret
Slots_StopReel:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
ld hl, REEL_ACTION
add hl, bc
ld [hl], REEL_ACTION_STOP_REEL_IGNORE_JOYPAD
ld hl, REEL_STOP_DELAY
add hl, bc
ld [hl], 3
call Function907c8
ReelAction_StopReelIgnoreJoypad:
ld hl, REEL_STOP_DELAY
add hl, bc
ld a, [hl]
and a
jr z, .EndReel
dec [hl]
ret
.EndReel:
ld hl, REEL_OAM_ADDR
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld e, 32
xor a
.clear_reel_oam
ld [hli], a
dec e
jr nz, .clear_reel_oam
ld hl, REEL_ACTION
add hl, bc
ld a, REEL_ACTION_DO_NOTHING
ld [hl], a
ret
Function907c8:
ld hl, REEL_X_COORD
add hl, bc
ld a, [hl]
sub 6 * TILE_WIDTH
srl a
srl a
srl a
ld e, a
ld d, 0
push bc
hlcoord 5, 4
add hl, de
push hl
call Slots_GetCurrentReelState
ld e, l
ld d, h
inc de
inc de
pop hl
ld bc, $14
call .asm907f6
dec de
call .asm907f6
dec de
call .asm907f6
pop bc
ret
.asm907f6
ld a, [de]
add SLOTS_GFX_SEVEN_TILE_1
ld [hli], a
inc a
inc a
ld [hld], a
add hl, bc
dec a
ld [hli], a
inc a
inc a
ld [hld], a
add hl, bc
ret
Function90805:
hlcoord 5, 4
call .asm90814
hlcoord 9, 4
call .asm90814
hlcoord 13, 4
.asm90814
ld a, SLOTS_GFX_BLANK_TILE
ld de, $14
ld c, 6
.loop
ld [hli], a
ld [hld], a
add hl, de
dec c
jr nz, .loop
ret
Function90822:
ld bc, wReel1
ld hl, REEL_X_COORD
add hl, bc
ld a, [hl]
ld [wCurReelXCoord], a
ld a, 10 * TILE_WIDTH
ld [wCurReelYCoord], a
call Slots_GetCurrentReelState
ld e, l
ld d, h
call Slots_LoadOAM
ld bc, wReel2
ld hl, REEL_X_COORD
add hl, bc
ld a, [hl]
ld [wCurReelXCoord], a
ld a, 10 * TILE_WIDTH
ld [wCurReelYCoord], a
call Slots_GetCurrentReelState
ld e, l
ld d, h
call Slots_LoadOAM
ld bc, wReel3
ld hl, REEL_X_COORD
add hl, bc
ld a, [hl]
ld [wCurReelXCoord], a
ld a, 10 * TILE_WIDTH
ld [wCurReelYCoord], a
call Slots_GetCurrentReelState
ld e, l
ld d, h
call Slots_LoadOAM
ret
ReelAction_StopReel1:
ld a, [wSlotBias]
cp SLOTS_NO_BIAS
jr z, .NoBias
ld hl, REEL_MANIP_COUNTER
add hl, bc
ld a, [hl]
and a
jr z, .NoBias
dec [hl]
call .CheckForBias
ret nz
.NoBias:
call Slots_StopReel
ret
.CheckForBias:
call Slots_GetCurrentReelState
ld a, [wSlotBias]
ld e, a
ld a, [hli]
cp e
ret z
ld a, [hli]
cp e
ret z
ld a, [hl]
cp e
ret
ReelAction_StopReel2:
call Slots_CheckMatchedFirstTwoReels
jr nc, .nope
ld a, [wSlotBuildingMatch]
ld hl, wSlotBias
cp [hl]
jr z, .NoBias
.nope
ld a, [wSlotBias]
cp SLOTS_NO_BIAS
jr z, .NoBias
ld hl, REEL_MANIP_COUNTER
add hl, bc
ld a, [hl]
and a
jr z, .NoBias
dec [hl]
ret
.NoBias:
call Slots_StopReel
ret
ReelAction_StopReel3:
call Slots_CheckMatchedAllThreeReels
jr nc, .NoMatch
ld hl, wSlotBias
cp [hl]
jr z, .NoBias
ld hl, REEL_MANIP_COUNTER
add hl, bc
ld a, [hl]
and a
ret z
dec [hl]
ret
.NoMatch:
ld a, [wSlotBias]
cp SLOTS_NO_BIAS
jr z, .NoBias
ld hl, REEL_MANIP_COUNTER
add hl, bc
ld a, [hl]
and a
jr z, .NoBias
dec [hl]
ret
.NoBias:
call Slots_StopReel
ret
ReelAction_SetUpReel2SkipTo7:
call Slots_CheckMatchedFirstTwoReels
jr nc, .no_match
ld a, [wFirstTwoReelsMatchingSevens]
and a
jr z, .no_match
call Slots_StopReel
ret
.no_match
ld hl, REEL_ACTION
add hl, bc
inc [hl]
ld hl, REEL_MANIP_DELAY
add hl, bc
ld [hl], 32
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
ret
ReelAction_WaitReel2SkipTo7:
ld hl, REEL_MANIP_DELAY
add hl, bc
ld a, [hl]
and a
jr z, .no_delay
dec [hl]
ret
.no_delay
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 8
ret
ReelAction_FastSpinReel2UntilLinedUp7s:
call Slots_CheckMatchedFirstTwoReels
ret nc
ld a, [wFirstTwoReelsMatchingSevens]
and a
ret z
call Slots_StopReel
ret
ReelAction_InitGolem:
call Slots_CheckMatchedAllThreeReels
ret c
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_WAIT_GOLEM
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
call Slots_GetNumberOfGolems
push bc
push af
depixel 12, 13
ld a, SPRITE_ANIM_OBJ_SLOTS_GOLEM
call InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_VAR3
add hl, bc
pop af
ld [hl], a
pop bc
xor a
ld [wSlotsDelay], a
ReelAction_WaitGolem:
ld a, [wSlotsDelay]
cp 2
jr z, .two
cp 1
jr z, .one
ret
.two
call Slots_CheckMatchedAllThreeReels
call Slots_StopReel
ret
.one
ld hl, REEL_ACTION
add hl, bc
inc [hl]
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 8
ret
ReelAction_EndGolem:
xor a
ld [wSlotsDelay], a
ld hl, REEL_ACTION
add hl, bc
dec [hl]
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
ret
ReelAction_InitChansey:
call Slots_CheckMatchedAllThreeReels
ret c
ld hl, REEL_ACTION
add hl, bc
inc [hl]
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
push bc
depixel 12, 0
ld a, SPRITE_ANIM_OBJ_SLOTS_CHANSEY
call InitSpriteAnimStruct
pop bc
xor a
ld [wSlotsDelay], a
ret
ReelAction_WaitChansey:
ld a, [wSlotsDelay]
and a
ret z
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_WAIT_EGG
ld a, 2
ld [wSlotsDelay], a
ReelAction_WaitEgg:
ld a, [wSlotsDelay]
cp 4
ret c
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_DROP_REEL
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 16
ld hl, REEL_MANIP_DELAY
add hl, bc
ld [hl], 17
ReelAction_DropReel:
ld hl, REEL_MANIP_DELAY
add hl, bc
ld a, [hl]
and a
jr z, .check_match
dec [hl]
ret
.check_match
call Slots_CheckMatchedAllThreeReels
jr nc, .EggAgain
and a
jr nz, .EggAgain
ld a, 5
ld [wSlotsDelay], a
call Slots_StopReel
ret
.EggAgain:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
ld hl, REEL_ACTION
add hl, bc
dec [hl]
dec [hl] ; REEL_ACTION_WAIT_CHANSEY
ld a, 1
ld [wSlotsDelay], a
ret
ReelAction_0D:
call Slots_CheckMatchedAllThreeReels
ret c
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_CHECK_DROP_REEL
call Slots_GetNumberOfGolems
ld hl, REEL_MANIP_DELAY
add hl, bc
ld [hl], a
ReelAction_CheckDropReel:
ld hl, REEL_MANIP_DELAY
add hl, bc
ld a, [hl]
and a
jr nz, .spin
call Slots_CheckMatchedAllThreeReels
call Slots_StopReel
ret
.spin
dec [hl]
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_WAIT_DROP_REEL
ld hl, REEL_FIELD_0B
add hl, bc
ld [hl], 32
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 0
ReelAction_WaitDropReel:
ld hl, REEL_FIELD_0B
add hl, bc
ld a, [hl]
and a
jr z, .DropReel
dec [hl]
ret
.DropReel:
ld hl, REEL_ACTION
add hl, bc
dec [hl]
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 8
ret
ReelAction_StartSlowAdvanceReel3:
ld hl, REEL_SPIN_RATE
add hl, bc
ld [hl], 1
ld hl, REEL_ACTION
add hl, bc
inc [hl] ; REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3
ld hl, REEL_MANIP_DELAY
add hl, bc
ld [hl], 16
ReelAction_WaitSlowAdvanceReel3:
ld hl, REEL_MANIP_DELAY
add hl, bc
ld a, [hl]
and a
jr z, .check1
dec [hl]
ret
.check1
ld a, [wSlotBias]
and a
jr nz, .check2
call Slots_CheckMatchedAllThreeReels
ret nc
and a
ret nz
call Slots_StopReel
ret
.check2
call Slots_CheckMatchedAllThreeReels
ret c
call Slots_StopReel
ret
Slots_CheckMatchedFirstTwoReels:
xor a
ld [wFirstTwoReelsMatching], a
ld [wFirstTwoReelsMatchingSevens], a
call Slots_GetCurrentReelState
call Slots_CopyReelState
ld a, [wSlotBet]
and 3
ld e, a
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .return
push de
jp hl
.return
ld a, [wFirstTwoReelsMatching]
and a
ret z
scf
ret
.Jumptable:
dw .zero
dw .one
dw .two
dw .three
.three
call .CheckUpwardsDiag
call .CheckDownwardsDiag
.two
call .CheckBottomRow
call .CheckTopRow
.one
call .CheckMiddleRow
.zero
ret
.CheckBottomRow:
ld hl, wCurReelStopped
ld a, [wReel1Stopped]
cp [hl]
call z, .StoreResult
ret
.CheckUpwardsDiag:
ld hl, wCurReelStopped + 1
ld a, [wReel1Stopped]
cp [hl]
call z, .StoreResult
ret
.CheckMiddleRow:
ld hl, wCurReelStopped + 1
ld a, [wReel1Stopped + 1]
cp [hl]
call z, .StoreResult
ret
.CheckDownwardsDiag:
ld hl, wCurReelStopped + 1
ld a, [wReel1Stopped + 2]
cp [hl]
call z, .StoreResult
ret
.CheckTopRow:
ld hl, wCurReelStopped + 2
ld a, [wReel1Stopped + 2]
cp [hl]
call z, .StoreResult
ret
.StoreResult:
ld [wSlotBuildingMatch], a
and a
jr nz, .matching_sevens
ld a, 1
ld [wFirstTwoReelsMatchingSevens], a
.matching_sevens
ld a, 1
ld [wFirstTwoReelsMatching], a
ret
Slots_CheckMatchedAllThreeReels:
ld a, SLOTS_NO_MATCH
ld [wSlotMatched], a
call Slots_GetCurrentReelState
call Slots_CopyReelState
ld a, [wSlotBet]
and 3
ld e, a
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .return
push de
jp hl
.return
ld a, [wSlotMatched]
cp SLOTS_NO_MATCH
jr nz, .matched_nontrivial
and a
ret
.matched_nontrivial
scf
ret
.Jumptable:
dw .zero
dw .one
dw .two
dw .three
.three
call .CheckUpwardsDiag
call .CheckDownwardsDiag
.two
call .CheckBottomRow
call .CheckTopRow
.one
call .CheckMiddleRow
.zero
ret
.CheckBottomRow:
ld hl, wCurReelStopped
ld a, [wReel1Stopped]
cp [hl]
ret nz
ld hl, wReel2Stopped
cp [hl]
call z, .StoreResult
ret
.CheckUpwardsDiag:
ld hl, wCurReelStopped + 2
ld a, [wReel1Stopped]
cp [hl]
ret nz
ld hl, wReel2Stopped + 1
cp [hl]
call z, .StoreResult
ret
.CheckMiddleRow:
ld hl, wCurReelStopped + 1
ld a, [wReel1Stopped + 1]
cp [hl]
ret nz
ld hl, wReel2Stopped + 1
cp [hl]
call z, .StoreResult
ret
.CheckDownwardsDiag:
ld hl, wCurReelStopped
ld a, [wReel1Stopped + 2]
cp [hl]
ret nz
ld hl, wReel2Stopped + 1
cp [hl]
call z, .StoreResult
ret
.CheckTopRow:
ld hl, wCurReelStopped + 2
ld a, [wReel1Stopped + 2]
cp [hl]
ret nz
ld hl, wReel2Stopped + 2
cp [hl]
call z, .StoreResult
ret
.StoreResult:
ld [wSlotMatched], a
ret
Slots_CopyReelState:
ld de, wCurReelStopped
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
ret
Slots_GetNumberOfGolems:
ld hl, REEL_POSITION
add hl, bc
ld a, [hl]
push af
push hl
call .Check7Bias
pop hl
pop af
ld [hl], a
ld a, e
ret
.Check7Bias:
ld a, [wSlotBias]
and a
jr nz, .not_biased_to_seven
ld e, 0
.loop1
ld hl, REEL_POSITION
add hl, bc
inc [hl]
inc e
push de
call Slots_CheckMatchedAllThreeReels
pop de
jr nc, .loop1
and a
jr nz, .loop1
ret
.not_biased_to_seven
call Random
and 7
cp 8 / 2 ; 50%
jr c, .not_biased_to_seven
ld e, a
.loop2
ld a, e
inc e
ld hl, REEL_POSITION
add hl, bc
add [hl]
ld [hl], a
push de
call Slots_CheckMatchedAllThreeReels
pop de
jr c, .loop2
ret
Slots_InitBias:
ld a, [wSlotBias]
and a
ret z
call Random
ld c, a
ld hl, .Biases
.loop
ld a, [hli]
cp c
jr nc, .done
inc hl
jr .loop
.done
ld a, [hl]
ld [wSlotBias], a
ret
.Biases:
db 1 percent - 1, SLOTS_SEVEN
db 1 percent + 1, SLOTS_POKEBALL
db 4 percent, SLOTS_STARYU
db 8 percent, SLOTS_SQUIRTLE
db 16 percent, SLOTS_PIKACHU
db 31 percent + 1, SLOTS_CHERRY
db 100 percent, SLOTS_NO_BIAS
Slots_IlluminateBetLights:
ld b, SLOTS_GFX_ILLUMINATED_LIGHT
ld a, [wSlotBet]
dec a
jr z, Slot_Lights1OnOff
dec a
jr z, Slots_Lights2OnOff
jr Slots_Lights3OnOff
Slots_DeilluminateBetLights:
ld b, SLOTS_GFX_DEILLUMINATED_LIGHT
Slots_Lights3OnOff:
hlcoord 3, 2
call Slots_TurnLightsOnOrOff
hlcoord 3, 10
call Slots_TurnLightsOnOrOff
Slots_Lights2OnOff:
hlcoord 3, 4
call Slots_TurnLightsOnOrOff
hlcoord 3, 8
call Slots_TurnLightsOnOrOff
Slot_Lights1OnOff:
hlcoord 3, 6
Slots_TurnLightsOnOrOff:
ld a, b
ld [hl], a
ld de, SCREEN_WIDTH / 2 + 3
add hl, de
ld [hl], a
ld de, SCREEN_WIDTH / 2 - 3
add hl, de
inc a
ld [hl], a
ld de, SCREEN_WIDTH / 2 + 3
add hl, de
ld [hl], a
ret
Slots_AskBet:
.loop
ld hl, .BetHowManyCoinsText
call PrintText
ld hl, .MenuHeader
call LoadMenuHeader
call VerticalMenu
call CloseWindow
ret c
ld a, [wMenuCursorY]
ld b, a
ld a, 4
sub b
ld [wSlotBet], a
ld hl, wCoins
ld c, a
ld a, [hli]
and a
jr nz, .Start
ld a, [hl]
cp c
jr nc, .Start
ld hl, .NotEnoughCoinsText
call PrintText
jr .loop
.Start:
ld hl, wCoins + 1
ld a, [hl]
sub c
ld [hld], a
jr nc, .ok
dec [hl]
.ok
ld de, SFX_PAY_DAY
call PlaySFX
ld hl, .SlotsStartText
call PrintText
and a
ret
.BetHowManyCoinsText:
text "コインを"
line "なんまい かけますか?"
done
.SlotsStartText:
text "スタート!"
done
.NotEnoughCoinsText:
text "コインが たりません!"
prompt
.MenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 14, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
dw .MenuData
db 1 ; default option
.MenuData:
db STATICMENU_CURSOR ; flags
db 3 ; items
db "3まい@"
db "2まい@"
db "1まい@"
Slots_AskPlayAgain:
ld hl, wCoins
ld a, [hli]
or [hl]
jr nz, .have_coins
ld hl, .RanOutOfCoinsText
call PrintText
ld c, 60
call DelayFrames
jr .exit_slots
.have_coins
ld hl, .PlayAgainText
call PrintText
call YesNoBox
jr c, .exit_slots
and a
ret
.exit_slots
scf
ret
.RanOutOfCoinsText:
text "コインが"
line "なくなっちゃった<⋯⋯>"
done
.PlayAgainText:
text "もう 1かい"
line "あそびますか?"
done
Slots_GetPayout:
ld a, [wSlotMatched]
cp SLOTS_NO_MATCH
jr z, .no_win
srl a
ld e, a
ld d, 0
ld hl, .PayoutTable
add hl, de
ld a, [hli]
ld [wPayout + 1], a
ld a, [hl]
ld [wPayout], a
ret
.PayoutTable:
dw 300
dw 50
dw 6
dw 8
dw 10
dw 15
.no_win
ld hl, wPayout
xor a
ld [hli], a
ld [hl], a
ret
Slots_PayoutText:
ld a, [wSlotMatched]
cp SLOTS_NO_MATCH
jr nz, .matched
ld hl, .DarnText
call PrintText
ret
.matched
srl a
ld e, a
ld d, 0
ld hl, .PayoutStrings
add hl, de
add hl, de
add hl, de
ld de, wStringBuffer2
ld c, 4
.copy_string
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copy_string
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .return
push de
jp hl
.return
ld hl, .Text_PrintPayout
call PrintText
ret
.PayoutStrings:
dbw "@", .ClearBias
dbw "@@", .Blank
dbw "@@@", .Blank
dbw "@@@", .Blank
dbw "@@", .Blank
dbw "@@", .Blank
.Text_PrintPayout:
start_asm
ld a, [wSlotMatched]
add $25
ldcoord_a 2, 13
inc a
ldcoord_a 2, 14
inc a
ldcoord_a 3, 13
inc a
ldcoord_a 3, 14
hlcoord 18, 16
ld [hl], '▼'
ld hl, .LinedUpText
rept 4
inc bc
endr
ret
.LinedUpText:
text "が そろった!"
line "コイン @"
text_from_ram wStringBuffer2
text "まい いただき!"
done
.DarnText:
text "はずれー"
done
.ClearBias:
ld a, SLOTS_NO_BIAS
ld [wSlotBias], a
ret
.Blank:
ret
Slots_AnimateGolem:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
dw .init
dw .fall
dw .roll
.init
ld hl, SPRITEANIMSTRUCT_VAR3
add hl, bc
ld a, [hl]
and a
jr nz, .retain
ld a, 2
ld [wSlotsDelay], a
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
ld [hl], 0
ret
.retain
dec [hl]
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $30
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], 0
.fall
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $20
jr c, .landed
dec [hl]
ld e, a
ld d, 14 * 8
farcall BattleAnim_Sine_e
ld a, e
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
.landed
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld [hl], 2
ld a, 1
ld [wSlotsDelay], a
ret
.roll
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
cp 9 * 8
jr nc, .restart
and 3
ret nz
ld hl, SPRITEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
xor $ff
inc a
ld [hl], a
ldh [hSCY], a
ret
.restart
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
xor a
ld [hl], a
ldh [hSCY], a
ret
Slots_AnimateChansey:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
dw .walk
dw .one
dw .two
.walk
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
inc [hl]
cp 13 * 8
ret nz
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
ld a, 1
ld [wSlotsDelay], a
.one
ld a, [wSlotsDelay]
cp 2
jr z, .retain
cp 5
ret nz
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
ld [hl], 0
ret
.retain
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld [hl], 8
.two
ld hl, SPRITEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .spawn_egg
dec [hl]
ret
.spawn_egg
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
dec [hl]
push bc
depixel 12, 13, 0, 4
ld a, SPRITE_ANIM_OBJ_SLOTS_EGG
call InitSpriteAnimStruct
pop bc
ret
; The first three positions are repeated to
; avoid needing to check indices when copying.
Slots_Reel1Tilemap:
db SLOTS_SEVEN
db SLOTS_CHERRY
db SLOTS_STARYU
db SLOTS_PIKACHU
db SLOTS_SQUIRTLE
db SLOTS_SEVEN
db SLOTS_CHERRY
db SLOTS_STARYU
db SLOTS_PIKACHU
db SLOTS_SQUIRTLE
db SLOTS_POKEBALL
db SLOTS_CHERRY
db SLOTS_STARYU
db SLOTS_PIKACHU
db SLOTS_SQUIRTLE
; repeated
db SLOTS_SEVEN
db SLOTS_CHERRY
db SLOTS_STARYU
Slots_Reel2Tilemap:
db SLOTS_SEVEN
db SLOTS_PIKACHU
db SLOTS_CHERRY
db SLOTS_SQUIRTLE
db SLOTS_STARYU
db SLOTS_POKEBALL
db SLOTS_PIKACHU
db SLOTS_CHERRY
db SLOTS_SQUIRTLE
db SLOTS_STARYU
db SLOTS_POKEBALL
db SLOTS_PIKACHU
db SLOTS_CHERRY
db SLOTS_SQUIRTLE
db SLOTS_STARYU
; repeated
db SLOTS_SEVEN
db SLOTS_PIKACHU
db SLOTS_CHERRY
Slots_Reel3Tilemap:
db SLOTS_SEVEN
db SLOTS_PIKACHU
db SLOTS_CHERRY
db SLOTS_SQUIRTLE
db SLOTS_STARYU
db SLOTS_PIKACHU
db SLOTS_CHERRY
db SLOTS_SQUIRTLE
db SLOTS_STARYU
db SLOTS_PIKACHU
db SLOTS_POKEBALL
db SLOTS_CHERRY
db SLOTS_SQUIRTLE
db SLOTS_STARYU
db SLOTS_PIKACHU
; repeated
db SLOTS_SEVEN
db SLOTS_PIKACHU
db SLOTS_CHERRY
SlotsTilemap:
INCBIN "gfx/minigames/slots_tilemap.bin"