ref: d6507e38827ffbda10ef947d7ddcd8b60899fdf5
parent: 731311cb151ec43330a08c0a45e8278f848954af
author: xCrystal <rgr.crystal@gmail.com>
date: Thu Dec 28 14:38:15 EST 2017
More constants and documentation in slot machines
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -6371,13 +6371,13 @@
jr c, .GenerateDVs ; try again
.Magikarp:
-; These filters are untranslated
+; These filters are untranslated.
; They expect at wMagikarpLength a 2-byte value in mm,
-; but the value is at ft and in (one byte each)
+; but the value is in feet and inches (one byte each).
; The first filter is supposed to make very large Magikarp even rarer,
; by targeting those 1600 mm or larger.
-; After the conversion to feet, they are unable to target any,
+; After the conversion to feet, it is unable to target any,
; as the largest possible Magikarp is 5'3'', which reads as 1283.
ld a, [TempEnemyMonSpecies]
cp MAGIKARP
--- a/engine/slot_machine.asm
+++ b/engine/slot_machine.asm
@@ -1,3 +1,4 @@
+SLOTS_NOBIAS EQU -1
SLOTS_NOMATCH EQU -1
SLOTS_SEVEN EQU $00
SLOTS_POKEBALL EQU $04
@@ -7,6 +8,57 @@
SLOTS_STARYU EQU $14
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_OF_QUIT
+ const SLOTS_QUIT
+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_UNUSED
+ 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
+
_SlotMachine:
ld hl, Options
set NO_TEXT_SCROLL, [hl]
@@ -23,7 +75,7 @@
farcall TrainerRankings_EndSlotsWinStreak
ld hl, Options
res NO_TEXT_SCROLL, [hl]
- ld hl, rLCDC ; $ff40
+ ld hl, rLCDC
res 2, [hl]
ret
@@ -68,11 +120,11 @@
ld bc, SCREEN_WIDTH * 12
call CopyBytes
- ld hl, rLCDC ; $ff40
+ ld hl, rLCDC
set 2, [hl]
call EnableLCD
- ld hl, wSlots ; Alias: wTrademons
- ld bc, wSlotsEnd - wSlots ; Alias: wTrademonsEnd
+ ld hl, wSlots
+ ld bc, wSlotsEnd - wSlots
xor a
call ByteFill
call InitReelTiles
@@ -81,19 +133,19 @@
ld hl, wSpriteAnimDict
ld [hli], a
ld [hl], $40
- xor a
+ xor a ; SLOTS_INIT
ld [wJumptableIndex], a
- ld a, SLOTS_NOMATCH
+ ld a, SLOTS_NOBIAS
ld [wSlotBias], a
ld de, MUSIC_GAME_CORNER
call PlayMusic
xor a
- ld [wd002], a
+ ld [wKeepSevenBiasChance], a ; 87.5% chance
call Random
and %00101010
ret nz
- ld a, $1
- ld [wd002], a
+ ld a, 1
+ ld [wKeepSevenBiasChance], a ; 12.5% chance
ret
Slots_GetPals: ; 9279b (24:679b)
@@ -110,7 +162,7 @@
SlotsLoop: ; 927af (24:67af)
ld a, [wJumptableIndex]
- bit 7, a
+ bit SLOTS_END_LOOP_F, a
jr nz, .stop
call SlotsJumptable
call Slots_SpinReels
@@ -214,25 +266,25 @@
jumptable .Jumptable, wJumptableIndex
.Jumptable:
- dw Slots_Init ; 00
- dw Slots_BetAndStart ; 01
- dw Slots_WaitStart ; 02
- dw Slots_WaitReel1 ; 03
+ dw Slots_Init ; 00
+ dw Slots_BetAndStart ; 01
+ dw Slots_WaitStart ; 02
+ dw Slots_WaitReel1 ; 03
dw Slots_WaitStopReel1 ; 04
- dw Slots_WaitReel2 ; 05
+ dw Slots_WaitReel2 ; 05
dw Slots_WaitStopReel2 ; 06
- dw Slots_WaitReel3 ; 07
+ dw Slots_WaitReel3 ; 07
dw Slots_WaitStopReel3 ; 08
- dw Slots_Next ; 09
- dw Slots_Next ; 0a
- dw Slots_Next ; 0b
- dw Slots_FlashIfWin ; 0c
- dw Slots_FlashScreen ; 0d
- dw Slots_GiveEarnedCoins ; 0e
- dw Slots_PayoutTextAndAnim ; 0f
- dw Slots_PayoutAnim ; 10
+ dw Slots_Next ; 09
+ dw Slots_Next ; 0a
+ dw Slots_Next ; 0b
+ dw Slots_FlashIfWin ; 0c
+ dw Slots_FlashScreen ; 0d
+ dw Slots_GiveEarnedCoins ; 0e
+ dw Slots_PayoutTextAndAnim ; 0f
+ dw Slots_PayoutAnim ; 10
dw Slots_RestartOrQuit ; 11
- dw Slots_Quit ; 12
+ dw Slots_Quit ; 12
Slots_Next: ; 92879 (24:6879)
ld hl, wJumptableIndex
@@ -244,7 +296,7 @@
xor a
ld [wFirstTwoReelsMatching], a
ld [wFirstTwoReelsMatchingSevens], a
- ld a, -1
+ ld a, SLOTS_NOMATCH
ld [wSlotMatched], a
ret
@@ -251,7 +303,7 @@
Slots_BetAndStart: ; 9288e (24:688e)
call Slots_AskBet
jr nc, .proceed
- ld a, 18
+ ld a, SLOTS_QUIT
ld [wJumptableIndex], a
ret
@@ -260,15 +312,15 @@
call Slots_IlluminateBetLights
call Slots_InitBias
ld a, 32
- ld [wcf64], a
- ld a, 4
+ ld [wSlotsDelay], a
+ ld a, REEL_ACTION_NORMAL_RATE
ld [wReel1ReelAction], a
ld [wReel2ReelAction], a
ld [wReel3ReelAction], a
- ld a, $4
- ld [wReel1Slot09], a
- ld [wReel2Slot09], a
- ld [wReel3Slot09], a
+ ld a, 4
+ ld [wReel1ManipCounter], a
+ ld [wReel2ManipCounter], a
+ ld [wReel3ManipCounter], a
call WaitSFX
ld a, SFX_SLOT_MACHINE_START
call Slots_PlaySFX
@@ -275,7 +327,7 @@
ret
Slots_WaitStart: ; 928c6 (24:68c6)
- ld hl, wcf64
+ ld hl, wSlotsDelay
ld a, [hl]
and a
jr z, .proceed
@@ -289,7 +341,7 @@
ret
Slots_WaitReel1: ; 928d6 (24:68d6)
- ld hl, hJoypadSum ; $ffa5
+ ld hl, hJoypadSum
ld a, [hl]
and A_BUTTON
ret z
@@ -298,7 +350,7 @@
ld [wReel1ReelAction], a
Slots_WaitStopReel1: ; 928e6 (24:68e6)
ld a, [wReel1ReelAction]
- cp $0
+ cp REEL_ACTION_DO_NOTHING
ret nz
ld a, SFX_STOP_SLOT
call Slots_PlaySFX
@@ -309,7 +361,7 @@
xor a
ld [hJoypadSum], a
Slots_WaitReel2: ; 92900 (24:6900)
- ld hl, hJoypadSum ; $ffa5
+ ld hl, hJoypadSum
ld a, [hl]
and A_BUTTON
ret z
@@ -318,7 +370,7 @@
ld [wReel2ReelAction], a
Slots_WaitStopReel2: ; 92910 (24:6910)
ld a, [wReel2ReelAction]
- cp $0
+ cp REEL_ACTION_DO_NOTHING
ret nz
ld a, SFX_STOP_SLOT
call Slots_PlaySFX
@@ -329,7 +381,7 @@
xor a
ld [hJoypadSum], a
Slots_WaitReel3: ; 9292a (24:692a)
- ld hl, hJoypadSum ; $ffa5
+ ld hl, hJoypadSum
ld a, [hl]
and A_BUTTON
ret z
@@ -338,7 +390,7 @@
ld [wReel3ReelAction], a
Slots_WaitStopReel3: ; 9293a (24:693a)
ld a, [wReel3ReelAction]
- cp $0
+ cp REEL_ACTION_DO_NOTHING
ret nz
ld a, SFX_STOP_SLOT
call Slots_PlaySFX
@@ -352,7 +404,7 @@
Slots_FlashIfWin: ; 92955 (24:6955)
ld a, [wSlotMatched]
- cp -1
+ cp SLOTS_NOMATCH
jr nz, .GotIt
call Slots_Next
call Slots_Next
@@ -361,9 +413,9 @@
.GotIt:
call Slots_Next
ld a, 16
- ld [wcf64], a
+ ld [wSlotsDelay], a
Slots_FlashScreen: ; 9296b (24:696b)
- ld hl, wcf64
+ ld hl, wSlotsDelay
ld a, [hl]
and a
jr z, .done
@@ -391,7 +443,7 @@
call DmgToCgbBGPals
call SlotGetPayout
xor a
- ld [wcf64], a
+ ld [wSlotsDelay], a
call Slots_Next
ret
@@ -399,7 +451,7 @@
call SlotPayoutText
call Slots_Next
Slots_PayoutAnim: ; 929a4 (24:69a4)
- ld hl, wcf64
+ ld hl, wSlotsDelay
ld a, [hl]
inc [hl]
and $1
@@ -425,7 +477,7 @@
ld [hl], e
dec hl
ld [hl], d
- ld a, [wcf64]
+ ld a, [wSlotsDelay]
and $7
ret z ; ret nz would be more appropriate
ld de, SFX_GET_COIN_FROM_SLOTS
@@ -441,18 +493,18 @@
call WaitPressAorB_BlinkCursor
call Slots_AskPlayAgain
jr c, .exit_slots
- ld a, 0
+ ld a, SLOTS_INIT
ld [wJumptableIndex], a
ret
.exit_slots
- ld a, 18
+ ld a, SLOTS_QUIT
ld [wJumptableIndex], a
ret
Slots_Quit: ; 929f0 (24:69f0)
ld hl, wJumptableIndex
- set 7, [hl]
+ set SLOTS_END_LOOP_F, [hl]
ret
Slots_LoadReelState: ; 929f6 (24:69f6)
@@ -504,10 +556,18 @@
ret
Slots_StopReel1: ; 92a2b (24:6a2b)
- ld a, $7
+; Always set the REEL_ACTION_STOP_REEL1 action.
+ ld a, REEL_ACTION_STOP_REEL1
ret
Slots_StopReel2: ; 92a2e (24:6a2e)
+; As long as, the following three meet, there's a 31.25% chance
+; to set action REEL_ACTION_SET_UP_REEL2_SKIP_TO_7:
+; - Bet is >= 2 coins
+; - There's a 7 symbol visible in reel #1
+; - Current spin isn't biased or is biased towards SEVEN
+; In any other case, REEL_ACTION_STOP_REEL2 is set.
+
ld a, [wSlotBet]
cp $2
jr c, .dont_jump
@@ -514,7 +574,7 @@
ld a, [wSlotBias]
and a
jr z, .skip
- cp SLOTS_NOMATCH
+ cp SLOTS_NOBIAS
jr nz, .dont_jump
.skip
call .CheckReel1ForASeven
@@ -522,11 +582,11 @@
call Random
cp $50 ; 32%
jr nc, .dont_jump
- ld a, $a
+ ld a, REEL_ACTION_SET_UP_REEL2_SKIP_TO_7
ret
.dont_jump
- ld a, $8
+ ld a, REEL_ACTION_STOP_REEL2
ret
.CheckReel1ForASeven: ; 92a51 (24:6a51)
@@ -541,6 +601,21 @@
ret
Slots_StopReel3: ; 92a60 (24:6a60)
+; If no matching SEVEN symbols in reels #1 and #2:
+; - REEL_ACTION_STOP_REEL3, 100%
+
+; If matching SEVEN symbols and NO bias to SEVEN:
+; - REEL_ACTION_STOP_REEL3, 37.5%
+; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 31.3%
+; - REEL_ACTION_INIT_GOLEM, 31.3%
+; - REEL_ACTION_INIT_CHANSEY, 0%
+
+; If matching SEVEN symbols and bias to SEVEN:
+; - REEL_ACTION_STOP_REEL3, 29.7%
+; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 23.4%
+; - REEL_ACTION_INIT_GOLEM, 23.4%
+; - REEL_ACTION_INIT_CHANSEY, 23.4%
+
ld a, [wFirstTwoReelsMatching]
and a
jr z, .stop
@@ -557,7 +632,7 @@
jr nc, .slow_advance
cp 60
jr nc, .golem
- ld a, $15
+ ld a, REEL_ACTION_INIT_CHANSEY
ret
.biased
@@ -567,15 +642,15 @@
cp 80
jr nc, .slow_advance
.golem
- ld a, $12
+ ld a, REEL_ACTION_INIT_GOLEM
ret
.slow_advance
- ld a, $10
+ ld a, REEL_ACTION_START_SLOW_ADVANCE_REEL3
ret
.stop
- ld a, $9
+ ld a, REEL_ACTION_STOP_REEL3
ret
InitReelTiles: ; 92a98 (24:6a98)
@@ -637,13 +712,13 @@
.OAM: ; 92af9 (24:6af9)
ld hl, wReel1ReelAction - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], REEL_ACTION_DO_NOTHING
ld hl, wReel1Position - wReel1
add hl, bc
ld [hl], REEL_SIZE - 1
ld hl, wReel1SpinDistance - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], REEL_ACTION_DO_NOTHING
call UpdateReelPositionAndOAM
ret
@@ -662,7 +737,7 @@
ld a, [hl]
and $f
jr nz, .skip
- call Function92bd4
+ call ReelActionJumptable
.skip
ld hl, wReel1SpinRate - wReel1
add hl, bc
@@ -786,12 +861,12 @@
db 0, 1, 2, 3, 4, 5
; 92bd4
-Function92bd4: ; 92bd4 (24:6bd4)
+ReelActionJumptable: ; 92bd4 (24:6bd4)
ld hl, wReel1ReelAction - wReel1
add hl, bc
ld e, [hl]
ld d, 0
- ld hl, .dw
+ ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
@@ -801,10 +876,9 @@
; 92be4 (24:6be4)
-.dw ; 92be4
-
+.Jumptable: ; 92be4
dw ReelAction_DoNothing ; 00
- dw Slots_StopReelIgnoreJoypad ; 01
+ dw ReelAction_StopReelIgnoreJoypad ; 01
dw ReelAction_QuadrupleRate ; 02
dw ReelAction_DoubleRate ; 03
dw ReelAction_NormalRate ; 04
@@ -816,7 +890,7 @@
dw ReelAction_SetUpReel2SkipTo7 ; 0a
dw ReelAction_WaitReel2SkipTo7 ; 0b
dw ReelAction_FastSpinReel2UntilLinedUp7s ; 0c
- dw ReelAction_BoringReelDrops ; 0d
+ dw ReelAction_Unused ; 0d
dw ReelAction_CheckDropReel ; 0e
dw ReelAction_WaitDropReel ; 0f
dw ReelAction_StartSlowAdvanceReel3 ; 10
@@ -824,7 +898,7 @@
dw ReelAction_InitGolem ; 12
dw ReelAction_WaitGolem ; 13
dw ReelAction_EndGolem ; 14
- dw Slots_InitChansey ; 15
+ dw ReelAction_InitChansey ; 15
dw ReelAction_WaitChansey ; 16
dw ReelAction_WaitEgg ; 17
dw ReelAction_DropReel ; 18
@@ -838,7 +912,7 @@
ReelAction_QuadrupleRate: ; 92c17
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $10
+ ld [hl], 16
ret
; 92c1e
@@ -846,7 +920,7 @@
ReelAction_DoubleRate: ; 92c1e
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $8
+ ld [hl], 8
ret
; 92c25
@@ -854,7 +928,7 @@
ReelAction_NormalRate: ; 92c25
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $4
+ ld [hl], 4
ret
; 92c2c
@@ -862,7 +936,7 @@
ReelAction_HalfRate: ; 92c2c
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $2
+ ld [hl], 2
ret
; 92c33
@@ -870,7 +944,7 @@
ReelAction_QuarterRate: ; 92c33
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $1
+ ld [hl], 1
ret
; 92c3a
@@ -878,15 +952,15 @@
Slots_StopReel: ; 92c3a
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
ld hl, wReel1ReelAction - wReel1
add hl, bc
- ld [hl], $1
- ld hl, wReel1Slot0f - wReel1
+ ld [hl], REEL_ACTION_STOP_REEL_IGNORE_JOYPAD
+ ld hl, wReel1StopDelay - wReel1
add hl, bc
- ld [hl], $3
-Slots_StopReelIgnoreJoypad: ; 92c4c
- ld hl, wReel1Slot0f - wReel1
+ ld [hl], 3
+ReelAction_StopReelIgnoreJoypad: ; 92c4c
+ ld hl, wReel1StopDelay - wReel1
add hl, bc
ld a, [hl]
and a
@@ -897,7 +971,7 @@
.EndReel:
ld hl, wReel1ReelAction - wReel1
add hl, bc
- ld a, $0
+ ld a, REEL_ACTION_DO_NOTHING
ld [hl], a
ret
@@ -904,10 +978,15 @@
; 92c5e
ReelAction_StopReel1: ; 92c5e
+; If no bias: don't manipulate reel.
+; If bias: manipulate reel up to wReel1ManipCounter (i.e. 4) times,
+; stoping early if the biased symbol shows up anywhere in reel #1,
+; even if the current bet won't allow lining it up.
+
ld a, [wSlotBias]
- cp SLOTS_NOMATCH
+ cp SLOTS_NOBIAS
jr z, .NoBias
- ld hl, wReel1Slot09 - wReel1
+ ld hl, wReel1ManipCounter - wReel1
add hl, bc
ld a, [hl]
and a
@@ -938,6 +1017,11 @@
; 92c86
ReelAction_StopReel2: ; 92c86
+; If no bias: don't manipulate reel.
+; If bias: manipulate reel up to wReel2ManipCounter (i.e. 4) times,
+; stoping early if the biased symbol is lined up in the first two
+; reels, according to the lines that the current bet allows.
+
call Slots_CheckMatchedFirstTwoReels
jr nc, .nope
ld a, [wSlotBuildingMatch]
@@ -946,9 +1030,9 @@
jr z, .NoBias
.nope
ld a, [wSlotBias]
- cp SLOTS_NOMATCH
+ cp SLOTS_NOBIAS
jr z, .NoBias
- ld hl, wReel1Slot09 - wReel1
+ ld hl, wReel1ManipCounter - wReel1
add hl, bc
ld a, [hl]
and a
@@ -963,12 +1047,16 @@
; 92ca9
ReelAction_StopReel3: ; 92ca9
+; Manipulate the reel up to wReel3ManipCounter (i.e. 4) times,
+; stopping early if the bias symbol is lined up for a win.
+; If not biased to any symbols, stop as soon as nothing is lined up.
+
call Slots_CheckMatchedAllThreeReels
jr nc, .NoMatch
ld hl, wSlotBias
cp [hl]
jr z, .NoBias
- ld hl, wReel1Slot09 - wReel1
+ ld hl, wReel1ManipCounter - wReel1
add hl, bc
ld a, [hl]
and a
@@ -978,9 +1066,9 @@
.NoMatch:
ld a, [wSlotBias]
- cp SLOTS_NOMATCH
+ cp SLOTS_NOBIAS
jr z, .NoBias
- ld hl, wReel1Slot09 - wReel1
+ ld hl, wReel1ManipCounter - wReel1
add hl, bc
ld a, [hl]
and a
@@ -995,6 +1083,11 @@
; 92cd2
ReelAction_SetUpReel2SkipTo7: ; 92cd2
+; Unique reel 2 action (see Slots_StopReel2)
+; Ensures that 7 symbols become lined up in the first two reels,
+; but more often than not, this is only a way to get our hopes up, as
+; it makes exciting reel #3 modes with no success hope more common.
+
call Slots_CheckMatchedFirstTwoReels
jr nc, .no_match
ld a, [wFirstTwoReelsMatchingSevens]
@@ -1008,19 +1101,19 @@
call Slots_PlaySFX
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
- ld hl, wReel1Slot0a - wReel1
+ inc [hl] ; REEL_ACTION_WAIT_REEL2_SKIP_TO_7
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
- ld [hl], $20
+ ld [hl], 32
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
ret
; 92cf8
ReelAction_WaitReel2SkipTo7: ; 92cf8
- ld hl, wReel1Slot0a - wReel1
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
ld a, [hl]
and a
@@ -1033,10 +1126,10 @@
call Slots_PlaySFX
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $8
+ ld [hl], 8
ret
; 92d13
@@ -1053,6 +1146,14 @@
; 92d20
ReelAction_InitGolem: ; 92d20
+; Ensures SEVENs are lined up if there's bias to SEVEN.
+; Ensures nothing is lined up if there's no bias symbols.
+; No other bias symbols are compatible with this mode.
+
+; This is achieved by throwing Golem until the desired result
+; is produced. The amount of Golem thrown can be anywhere from
+; 1 to 14 for SEVEN bias, and 4-8 for no bias.
+
call Slots_CheckMatchedAllThreeReels
ret c
ld a, SFX_STOP_SLOT
@@ -1060,10 +1161,10 @@
call Slots_WaitSFX
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_WAIT_GOLEM
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
call Function92fc0
push bc
push af
@@ -1076,9 +1177,9 @@
ld [hl], a
pop bc
xor a
- ld [wcf64], a
+ ld [wSlotsDelay], a
ReelAction_WaitGolem: ; 92d4f
- ld a, [wcf64]
+ ld a, [wSlotsDelay]
cp 2
jr z, .two
cp 1
@@ -1093,10 +1194,10 @@
.one
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_END_GOLEM
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $8
+ ld [hl], 8
ret
; 92d6e
@@ -1103,18 +1204,23 @@
ReelAction_EndGolem: ; 92d6e
xor a
- ld [wcf64], a
+ ld [wSlotsDelay], a
ld hl, wReel1ReelAction - wReel1
add hl, bc
- dec [hl]
+ dec [hl] ; REEL_ACTION_WAIT_GOLEM
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
ret
; 92d7e
-Slots_InitChansey: ; 92d7e
+ReelAction_InitChansey: ; 92d7e
+; Ensures the lining up of SEVEN symbols, but this mode is only possible
+; when there is bias to SEVEN symbols (and even then, it's still rare).
+; Chansey releases and egg and reel #3 is made to advance 17 slots very
+; quickly as many times as necessary for the match to SEVENs to show up.
+
call Slots_CheckMatchedAllThreeReels
ret c
ld a, SFX_STOP_SLOT
@@ -1122,10 +1228,10 @@
call Slots_WaitSFX
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_WAIT_CHANSEY
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
push bc
depixel 12, 0
ld a, SPRITE_ANIM_INDEX_SLOTS_CHANSEY
@@ -1132,35 +1238,35 @@
call _InitSpriteAnimStruct
pop bc
xor a
- ld [wcf64], a
+ ld [wSlotsDelay], a
ret
; 92da4
ReelAction_WaitChansey: ; 92da4
- ld a, [wcf64]
+ ld a, [wSlotsDelay]
and a
ret z
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
- ld a, $2
- ld [wcf64], a
+ inc [hl] ; REEL_ACTION_WAIT_EGG
+ ld a, 2
+ ld [wSlotsDelay], a
ReelAction_WaitEgg: ; 92db3
- ld a, [wcf64]
+ ld a, [wSlotsDelay]
cp $4
ret c
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_DROP_REEL
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $10
- ld hl, wReel1Slot0a - wReel1
+ ld [hl], 16
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
- ld [hl], $11
+ ld [hl], 17
ReelAction_DropReel: ; 92dca
- ld hl, wReel1Slot0a - wReel1
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
ld a, [hl]
and a
@@ -1173,8 +1279,8 @@
jr nc, .EggAgain
and a
jr nz, .EggAgain
- ld a, $5
- ld [wcf64], a
+ ld a, 5
+ ld [wSlotsDelay], a
call Slots_StopReel
ret
@@ -1181,18 +1287,18 @@
.EggAgain:
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
ld hl, wReel1ReelAction - wReel1
add hl, bc
dec [hl]
- dec [hl]
- ld a, $1
- ld [wcf64], a
+ dec [hl] ; REEL_ACTION_WAIT_CHANSEY
+ ld a, 1
+ ld [wSlotsDelay], a
ret
; 92df7
-ReelAction_BoringReelDrops: ; 92df7
+ReelAction_Unused: ; 92df7
call Slots_CheckMatchedAllThreeReels
ret c
ld a, SFX_STOP_SLOT
@@ -1200,13 +1306,13 @@
call Slots_WaitSFX
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_CHECK_DROP_REEL
call Function92fc0
- ld hl, wReel1Slot0a - wReel1
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
ld [hl], a
ReelAction_CheckDropReel: ; 92e10
- ld hl, wReel1Slot0a - wReel1
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
ld a, [hl]
and a
@@ -1219,13 +1325,13 @@
dec [hl]
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
+ inc [hl] ; REEL_ACTION_WAIT_DROP_REEL
ld hl, wReel1Slot0b - wReel1
add hl, bc
- ld [hl], $20
+ ld [hl], 32
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $0
+ ld [hl], 0
ReelAction_WaitDropReel: ; 92e31
ld hl, wReel1Slot0b - wReel1
add hl, bc
@@ -1241,12 +1347,19 @@
dec [hl]
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $8 ; 2x
+ ld [hl], 8
ret
; 92e47
ReelAction_StartSlowAdvanceReel3: ; 92e47
+; Ensures SEVENs are lined up if there's bias to SEVEN.
+; Ensures nothing is lined up if there's no bias symbols.
+; No other bias symbols are compatible with this mode.
+
+; This is achieved by slowly advancing the reel a full round,
+; plus any necessary slot until the desired result is produced.
+
call Slots_CheckMatchedAllThreeReels
ret c
ld a, SFX_STOP_SLOT
@@ -1254,15 +1367,15 @@
call Slots_WaitSFX
ld hl, wReel1SpinRate - wReel1
add hl, bc
- ld [hl], $1
+ ld [hl], 1
ld hl, wReel1ReelAction - wReel1
add hl, bc
- inc [hl]
- ld hl, wReel1Slot0a - wReel1
+ inc [hl] ; REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
- ld [hl], $10
+ ld [hl], 16
ReelAction_WaitSlowAdvanceReel3: ; 92e64
- ld hl, wReel1Slot0a - wReel1
+ ld hl, wReel1ManipDelay - wReel1
add hl, bc
ld a, [hl]
and a
@@ -1396,11 +1509,11 @@
ld [wSlotBuildingMatch], a
and a
jr nz, .matching_sevens
- ld a, $1
+ ld a, 1
ld [wFirstTwoReelsMatchingSevens], a
.matching_sevens
- ld a, $1
+ ld a, 1
ld [wFirstTwoReelsMatching], a
ret
@@ -1407,7 +1520,7 @@
; 92f1d
Slots_CheckMatchedAllThreeReels: ; 92f1d
- ld a, $ff
+ ld a, SLOTS_NOMATCH
ld [wSlotMatched], a
call Slots_GetCurrentReelState
call Slots_CopyReelState
@@ -1427,7 +1540,7 @@
.return
ld a, [wSlotMatched]
- cp $ff
+ cp SLOTS_NOMATCH
jr nz, .matched_nontrivial
and a
ret
@@ -1629,7 +1742,7 @@
db $14, SLOTS_SQUIRTLE ; 5/128
db $28, SLOTS_PIKACHU ; 5/64
db $30, SLOTS_CHERRY ; 1/32
- db $ff, SLOTS_NOMATCH ; everything else
+ db $ff, SLOTS_NOBIAS ; everything else
; 93031
.Lucky: ; 93031
@@ -1639,7 +1752,7 @@
db $10, SLOTS_SQUIRTLE ; 1/32
db $1e, SLOTS_PIKACHU ; 7/128
db $50, SLOTS_CHERRY ; 25/128
- db $ff, SLOTS_NOMATCH ; everything else
+ db $ff, SLOTS_NOBIAS ; everything else
; 9303f
Slots_IlluminateBetLights: ; 9303f (24:703f)
@@ -1800,7 +1913,7 @@
SlotGetPayout: ; 93124 (24:7124)
ld a, [wSlotMatched]
- cp -1
+ cp SLOTS_NOMATCH
jr z, .no_win
srl a
ld e, a
@@ -1833,7 +1946,7 @@
SlotPayoutText: ; 93158 (24:7158)
ld a, [wSlotMatched]
- cp -1
+ cp SLOTS_NOMATCH
jr nz, .MatchedSomething
ld hl, .Text_Darn
call PrintText
@@ -1912,21 +2025,26 @@
ld a, SFX_2ND_PLACE
call Slots_PlaySFX
call WaitSFX
- ld a, [wd002]
+
+; Oddly, the rarest mode (wKeepSevenBiasChance = 1) is the one with
+; the worse odds to favor seven symbol streaks (12.5% vs 25%).
+; it's possible that either the wKeepSevenBiasChance initialization
+; or this code was intended to lead to flipped percentages.
+ ld a, [wKeepSevenBiasChance]
and a
- jr nz, .asm_931ff
+ jr nz, .lowerSevenStreakOdds
call Random
- and $14
- ret z
- ld a, $ff
+ and %0010100
+ ret z ; 25% chance to stick with seven symbol bias
+ ld a, SLOTS_NOBIAS
ld [wSlotBias], a
ret
-.asm_931ff
+.lowerSevenStreakOdds
call Random
- and $1c
- ret z
- ld a, $ff
+ and %0011100
+ ret z ; 12.5% chance to stick with seven symbol bias
+ ld a, SLOTS_NOBIAS
ld [wSlotBias], a
ret
@@ -1974,8 +2092,8 @@
ld a, [hl]
and a
jr nz, .retain
- ld a, $2
- ld [wcf64], a
+ ld a, 2
+ ld [wSlotsDelay], a
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
ld [hl], $0
@@ -2016,8 +2134,8 @@
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld [hl], $2
- ld a, $1
- ld [wcf64], a
+ ld a, 1
+ ld [wSlotsDelay], a
ld a, SFX_PLACE_PUZZLE_PIECE_DOWN
call Slots_PlaySFX
ret
@@ -2086,11 +2204,11 @@
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
- ld a, $1
- ld [wcf64], a
+ ld a, 1
+ ld [wSlotsDelay], a
.one ; 932e0 (24:72e0)
- ld a, [wcf64]
+ ld a, [wSlotsDelay]
cp $2
jr z, .retain
cp $5
--- a/macros/wram.asm
+++ b/macros/wram.asm
@@ -275,13 +275,13 @@
\1SpinRate:: db
\1OAMAddr:: dw
\1XCoord:: db
-\1Slot09:: ds 1
-\1Slot0a:: ds 1
+\1ManipCounter:: db
+\1ManipDelay:: db
\1Slot0b:: ds 1
\1Slot0c:: ds 1
\1Slot0d:: ds 1
\1Slot0e:: ds 1
-\1Slot0f:: ds 1
+\1StopDelay:: db
endm
object_struct: MACRO
--- a/wram.asm
+++ b/wram.asm
@@ -1320,6 +1320,7 @@
; miscellaneous
wNrOfBeatenBattleTowerTrainers::
wMomBankDigitCursorPosition::
+wSlotsDelay::
db
wCurrPocket::
wPrinterQueueLength::
@@ -1637,6 +1638,9 @@
EndFlypoint:: db
NEXTU ; d002
+wKeepSevenBiasChance::
+; used in the slots to handle the favoring of 7 symbol streaks
+
; unidentified
wd002:: db
wd003:: db