pokeemerald/src/slot_machine.c

7203 lines
213 KiB
C
Raw Normal View History

2018-08-11 17:57:20 +02:00
#include "global.h"
#include "overworld.h"
#include "field_effect.h"
#include "random.h"
#include "sound.h"
#include "main.h"
#include "slot_machine.h"
#include "string_util.h"
#include "decompress.h"
#include "trig.h"
#include "graphics.h"
#include "palette.h"
#include "util.h"
#include "text.h"
#include "menu.h"
#include "malloc.h"
2018-08-11 17:57:20 +02:00
#include "bg.h"
#include "gpu_regs.h"
#include "coins.h"
2020-07-26 07:17:09 +02:00
#include "strings.h"
2018-08-11 17:57:20 +02:00
#include "tv.h"
#include "text_window.h"
2018-08-11 18:47:56 +02:00
#include "main_menu.h"
2018-09-15 18:01:20 +02:00
#include "bg.h"
#include "window.h"
2020-01-26 10:02:15 +01:00
#include "constants/coins.h"
2020-07-26 07:17:09 +02:00
#include "constants/rgb.h"
2020-05-20 22:36:00 +02:00
#include "constants/slot_machine.h"
2020-07-26 07:17:09 +02:00
#include "constants/songs.h"
2018-09-15 18:01:20 +02:00
2020-07-26 07:17:09 +02:00
#define SLOTMACHINE_GFX_TILES 233
#define MAX_BET 3
2020-07-27 22:31:36 +02:00
#define SYMBOLS_PER_REEL 21
#define REEL_SYMBOL_HEIGHT 24
2020-07-26 07:17:09 +02:00
// Lucky Flags
#define LUCKY_BIAS_REPLAY (1 << 0)
#define LUCKY_BIAS_CHERRY (1 << 1)
#define LUCKY_BIAS_LOTAD (1 << 2)
#define LUCKY_BIAS_AZURILL (1 << 3)
#define LUCKY_BIAS_POWER (1 << 4)
#define LUCKY_BIAS_REELTIME (1 << 5)
#define LUCKY_BIAS_MIXED_777 (1 << 6)
#define LUCKY_BIAS_777 (1 << 7)
2020-07-28 21:28:16 +02:00
enum {
GFXTAG_7_RED,
GFXTAG_7_BLUE,
GFXTAG_AZURILL,
GFXTAG_LOTAD,
GFXTAG_CHERRY,
GFXTAG_POWER,
GFXTAG_REPLAY,
GFXTAG_NUM_0,
GFXTAG_NUM_1,
GFXTAG_NUM_2,
GFXTAG_NUM_3,
GFXTAG_NUM_4,
GFXTAG_NUM_5,
GFXTAG_NUM_6,
GFXTAG_NUM_7,
GFXTAG_NUM_8,
GFXTAG_NUM_9,
GFXTAG_REEL_BG,
GFXTAG_STOP,
GFXTAG_BONUS,
GFXTAG_BIG,
GFXTAG_REG,
};
2020-07-27 22:31:36 +02:00
#define GFXTAG_SYMBOLS_START (GFXTAG_7_RED)
#define GFXTAG_NUMBERS_START (GFXTAG_NUM_0)
2020-07-28 21:28:16 +02:00
enum {
PALTAG_REEL,
PALTAG_REEL_TIME_PIKACHU,
PALTAG_REEL_TIME_MISC,
PALTAG_REEL_TIME_MACHINE,
PALTAG_MISC,
PALTAG_EXPLOSION,
PALTAG_DIG_DISPLAY,
PALTAG_PIKA_AURA,
};
enum {
MATCHED_1CHERRY,
MATCHED_2CHERRY,
MATCHED_REPLAY,
MATCHED_LOTAD,
MATCHED_AZURILL,
MATCHED_POWER,
MATCHED_777_MIXED,
MATCHED_777_RED,
MATCHED_777_BLUE,
MATCHED_NONE,
};
2020-07-26 07:17:09 +02:00
2020-07-27 22:31:36 +02:00
enum {
MATCH_MIDDLE_ROW,
MATCH_TOP_ROW,
MATCH_BOTTOM_ROW,
MATCH_NWSE_DIAG,
MATCH_NESW_DIAG,
NUM_MATCH_LINES,
};
2020-07-28 21:28:16 +02:00
enum {
LEFT_REEL,
MIDDLE_REEL,
RIGHT_REEL,
NUM_REELS,
};
2020-07-26 07:17:09 +02:00
enum {
SLOT_ACTION_UNFADE,
2020-07-28 23:34:44 +02:00
SLOT_ACTION_WAIT_FADE,
SLOT_ACTION_READY_NEW_SPIN,
SLOT_ACTION_READY_NEW_RT_SPIN,
SLOT_ACTION_ASK_INSERT_BET,
2020-07-26 07:17:09 +02:00
SLOT_ACTION_BET_INPUT,
2020-07-28 23:34:44 +02:00
SLOT_ACTION_MSG_NEED_3_COINS,
SLOT_ACTION_WAIT_MSG_NEED_3_COINS,
SLOT_ACTION_WAIT_INFO_BOX,
SLOT_ACTION_START_SPIN,
SLOT_ACTION_START_RT_SPIN,
SLOT_ACTION_SET_LUCKY_SPINS,
SLOT_ACTION_AWAIT_REEL_STOP,
SLOT_ACTION_AWAIT_ALL_REELS_STOP,
SLOT_ACTION_CHECK_MATCHES,
SLOT_ACTION_WAIT_PAYOUT,
SLOT_ACTION_END_PAYOUT,
SLOT_ACTION_MATCHED_POWER,
SLOT_ACTION_WAIT_RT_ANIM,
SLOT_ACTION_RESET_BET_TILES,
SLOT_ACTION_NO_MATCHES,
2020-07-26 07:17:09 +02:00
SLOT_ACTION_ASK_QUIT,
SLOT_ACTION_HANDLE_QUIT_INPUT,
SLOT_ACTION_MSG_MAX_COINS,
SLOT_ACTION_WAIT_MSG_MAX_COINS,
SLOT_ACTION_MSG_NO_MORE_COINS,
SLOT_ACTION_WAIT_MSG_NO_MORE_COINS,
SLOT_ACTION_END,
SLOT_ACTION_FREE,
};
2020-07-28 23:34:44 +02:00
enum {
REEL_ACTION_STILL,
REEL_ACTION_SPIN,
REEL_ACTION_STOP,
REEL_ACTION_STOP_MOVE,
REEL_ACTION_STOP_SHAKE,
};
2020-07-26 07:17:09 +02:00
#define DIG_SPRITE_DUMMY {255, 0, 0}
// Sprite template IDs for the digital display in the right panel
enum {
DIG_SPRITE_REEL,
DIG_SPRITE_TIME,
DIG_SPRITE_INSERT,
DIG_SPRITE_WIN,
DIG_SPRITE_LOSE,
DIG_SPRITE_A_BUTTON,
DIG_SPRITE_SMOKE,
DIG_SPRITE_NUMBER,
DIG_SPRITE_POKE_BALL,
DIG_SPRITE_D_PAD,
DIG_SPRITE_STOP_S,
DIG_SPRITE_STOP_T,
DIG_SPRITE_STOP_O,
DIG_SPRITE_STOP_P,
DIG_SPRITE_BONUS_B,
DIG_SPRITE_BONUS_O,
DIG_SPRITE_BONUS_N,
DIG_SPRITE_BONUS_U,
DIG_SPRITE_BONUS_S,
DIG_SPRITE_BIG_B,
DIG_SPRITE_BIG_I,
DIG_SPRITE_BIG_G,
DIG_SPRITE_REG_R,
DIG_SPRITE_REG_E,
DIG_SPRITE_REG_G,
DIG_SPRITE_EMPTY,
NUM_DIG_DISPLAY_SPRITES
};
2020-07-27 22:31:36 +02:00
// IDs used by the digital display to set coords and callbacks for its sprites
enum {
DIG_DISPINFO_INSERT,
DIG_DISPINFO_STOP_S,
DIG_DISPINFO_STOP_T,
DIG_DISPINFO_STOP_O,
DIG_DISPINFO_STOP_P,
DIG_DISPINFO_A_BUTTON_STOP,
DIG_DISPINFO_POKE_BALL_ROCKING,
DIG_DISPINFO_WIN,
DIG_DISPINFO_LOSE,
DIG_DISPINFO_SMOKE_NW,
DIG_DISPINFO_SMOKE_NE,
DIG_DISPINFO_SMOKE_SW,
DIG_DISPINFO_SMOKE_SE,
DIG_DISPINFO_REEL,
DIG_DISPINFO_TIME,
DIG_DISPINFO_NUMBER,
DIG_DISPINFO_DPAD,
DIG_DISPINFO_POKE_BALL_SHINING,
DIG_DISPINFO_REG_R,
DIG_DISPINFO_REG_E,
DIG_DISPINFO_REG_G,
DIG_DISPINFO_REG_BONUS_B,
DIG_DISPINFO_REG_BONUS_O,
DIG_DISPINFO_REG_BONUS_N,
DIG_DISPINFO_REG_BONUS_U,
DIG_DISPINFO_REG_BONUS_S,
DIG_DISPINFO_BIG_B,
DIG_DISPINFO_BIG_I,
DIG_DISPINFO_BIG_G,
DIG_DISPINFO_BIG_BONUS_B,
DIG_DISPINFO_BIG_BONUS_O,
DIG_DISPINFO_BIG_BONUS_N,
DIG_DISPINFO_BIG_BONUS_U,
DIG_DISPINFO_BIG_BONUS_S,
DIG_DISPINFO_A_BUTTON_START
};
// IDs for digital display "scenes", i.e. each of the screens it can show made up of sprites
2020-07-26 07:17:09 +02:00
enum {
DIG_DISPLAY_INSERT_BET,
DIG_DISPLAY_STOP_REEL,
DIG_DISPLAY_WIN,
DIG_DISPLAY_LOSE,
DIG_DISPLAY_REEL_TIME,
DIG_DISPLAY_BONUS_REG,
DIG_DISPLAY_BONUS_BIG
};
struct SlotMachine
2018-08-11 17:57:20 +02:00
{
/*0x00*/ u8 state;
2019-02-07 17:24:09 +01:00
/*0x01*/ u8 machineId;
2018-08-11 17:57:20 +02:00
/*0x02*/ u8 pikaPower;
2019-02-07 17:24:09 +01:00
/*0x03*/ u8 luckyGame;
/*0x04*/ u8 luckyFlags;
/*0x05*/ u8 reelTimeDraw;
2020-07-28 23:34:44 +02:00
/*0x06*/ u8 isLuckySpin;
2019-02-07 17:24:09 +01:00
/*0x07*/ u8 biasTag;
2018-08-11 17:57:20 +02:00
/*0x08*/ u16 matchedSymbols;
2020-07-26 07:17:09 +02:00
/*0x0A*/ u8 reelTimeSpinsLeft;
/*0x0B*/ u8 reelTimeSpinsUsed;
2018-08-11 17:57:20 +02:00
/*0x0C*/ s16 coins;
/*0x0E*/ s16 payout;
2019-02-07 17:24:09 +01:00
/*0x10*/ s16 netCoinLoss; // coins lost to machine (but never goes below 0)
2018-08-11 17:57:20 +02:00
/*0x12*/ s16 bet;
2019-02-15 00:06:21 +01:00
/*0x14*/ s16 reeltimePixelOffset;
/*0x16*/ s16 reeltimePosition;
2019-02-07 17:24:09 +01:00
/*0x18*/ s16 currReel;
/*0x1A*/ s16 reelIncrement; // speed of reel
2020-07-26 07:17:09 +02:00
/*0x1C*/ s16 reelPixelOffsets[NUM_REELS];
/*0x22*/ u16 reelPixelOffsetsWhileStopping[NUM_REELS];
/*0x28*/ s16 reelPositions[NUM_REELS];
2020-07-28 23:34:44 +02:00
/*0x2E*/ s16 reelExtraTurns[NUM_REELS];
2020-07-27 22:31:36 +02:00
/*0x34*/ s16 winnerRows[NUM_REELS];
/*0x3A*/ u8 slotReelTasks[NUM_REELS];
/*0x3D*/ u8 digDisplayTaskId;
/*0x3E*/ u8 pikaPowerBoltTaskId;
2020-07-26 07:17:09 +02:00
/*0x3F*/ u8 reelTimePikachuSpriteId;
2020-07-27 22:31:36 +02:00
/*0x40*/ u8 reelTimeNumberGapSpriteId;
2020-07-26 07:17:09 +02:00
/*0x41*/ u8 reelTimeExplosionSpriteId;
/*0x42*/ u8 reelTimeBrokenMachineSpriteId;
/*0x43*/ u8 reelTimeSmokeSpriteId;
2020-07-27 22:31:36 +02:00
/*0x44*/ u8 flashMatchLineSpriteIds[NUM_MATCH_LINES];
2020-07-26 07:17:09 +02:00
/*0x49*/ u8 reelTimeMachineSpriteIds[2];
/*0x49*/ u8 reelTimeNumberSpriteIds[3];
/*0x4E*/ u8 reelTimeShadowSpriteIds[2];
/*0x50*/ u8 reelTimeBoltSpriteIds[2];
/*0x52*/ u8 reelTimePikachuAuraSpriteIds[2];
/*0x54*/ u8 reelTimeDuckSpriteIds[4];
2018-08-11 17:57:20 +02:00
/*0x58*/ u16 win0h;
/*0x5a*/ u16 win0v;
/*0x5c*/ u16 winIn;
/*0x5e*/ u16 winOut;
/*0x60*/ u16 backupMapMusic;
/*0x64*/ MainCallback prevMainCb;
};
2020-07-26 07:17:09 +02:00
struct DigitalDisplaySprite
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
/*0x00*/ u8 spriteTemplateId;
2020-07-27 22:31:36 +02:00
/*0x01*/ u8 dispInfoId;
/*0x02*/ s16 spriteId;
2018-08-11 17:57:20 +02:00
};
2019-02-22 22:03:35 +01:00
static void CB2_SlotMachineSetup(void);
2020-07-28 23:34:44 +02:00
static void CB2_SlotMachine(void);
static void PlaySlotMachine_Internal(u8, MainCallback);
static void SlotMachineDummyTask(u8);
static void SlotMachineSetup_InitBgsWindows(void);
static void SlotMachineSetup_InitVRAM(void);
static void SlotMachineSetup_InitOAM(void);
static void SlotMachineSetup_InitGpuRegs(void);
static void SlotMachineSetup_InitSlotMachineStruct(void);
static void SlotMachineSetup_InitPalsSpritesTasks(void);
static void SlotMachineSetup_InitTilemaps(void);
static void SlotMachineSetup_LoadGfxAndTilemaps(void);
static void SlotMachineSetup_InitVBlank(void);
2020-07-27 22:31:36 +02:00
static void AllocDigitalDisplayGfx(void);
static void SetDigitalDisplayImagePtrs(void);
2020-07-28 23:34:44 +02:00
static void CreateSlotMachineSprites(void);
static void CreateGameplayTasks(void);
static void CreateSlotMachineTask(void);
2020-07-27 22:31:36 +02:00
static void DestroyDigitalDisplayScene(void);
2020-07-28 23:34:44 +02:00
static void Task_SlotMachine(u8);
static bool8 SlotAction_UnfadeScreen(struct Task *);
static bool8 SlotAction_WaitForUnfade(struct Task *);
static bool8 SlotAction_ReadyNewSpin(struct Task *);
static bool8 SlotAction_ReadyNewReelTimeSpin(struct Task *);
static bool8 SlotAction_AskInsertBet(struct Task *);
static bool8 SlotAction_HandleBetInput(struct Task *);
static bool8 SlotAction_PrintMsg_Need3Coins(struct Task *);
static bool8 SlotAction_WaitMsg_Need3Coins(struct Task *);
static bool8 SlotAction_WaitForInfoBox(struct Task *);
static bool8 SlotAction_StartSpin(struct Task *);
static bool8 SlotAction_StartReelTimeSpin(struct Task *);
static bool8 SlotAction_SetLuckySpins(struct Task *);
static bool8 SlotAction_AwaitReelStop(struct Task *);
static bool8 SlotAction_WaitForAllReelsToStop(struct Task *);
static bool8 SlotAction_CheckMatches(struct Task *);
static bool8 SlotAction_WaitForPayoutToBeAwarded(struct Task *);
static bool8 SlotAction_EndPayout(struct Task *);
static bool8 SlotAction_MatchedPower(struct Task *);
static bool8 SlotAction_WaitReelTimeAnim(struct Task *);
static bool8 SlotAction_ResetBetTiles(struct Task *);
static bool8 SlotAction_NoMatches(struct Task *);
static bool8 SlotAction_AskQuit(struct Task *);
static bool8 SlotAction_HandleQuitInput(struct Task *);
static bool8 SlotAction_PrintMsg_9999Coins(struct Task *);
static bool8 SlotAction_WaitMsg_9999Coins(struct Task *);
static bool8 SlotAction_PrintMsg_NoMoreCoins(struct Task *);
static bool8 SlotAction_WaitMsg_NoMoreCoins(struct Task *);
static bool8 SlotAction_EndGame(struct Task *);
static bool8 SlotAction_FreeDataStructures(struct Task *);
2019-02-22 22:03:35 +01:00
static void DrawLuckyFlags(void);
static void SetLuckySpins(void);
static bool8 IsThisRoundLucky(void);
2019-03-01 00:56:07 +01:00
static u8 AttemptsAtLuckyFlags_Top3(void);
2019-02-22 22:03:35 +01:00
static u16 SlowReelSpeed(void);
2019-03-01 00:56:07 +01:00
static u8 AttemptsAtLuckyFlags_NotTop3(void);
2019-02-22 22:03:35 +01:00
static void CheckMatch(void);
static void CheckMatch_CenterRow(void);
static void CheckMatch_TopAndBottom(void);
static void CheckMatch_Diagonals(void);
2020-07-28 23:34:44 +02:00
static u8 GetMatchFromSymbols(u8, u8, u8);
2019-02-22 22:03:35 +01:00
static void AwardPayout(void);
2020-07-28 23:34:44 +02:00
static void RunAwardPayoutActions(u8);
2019-02-22 22:03:35 +01:00
static bool8 IsFinalTask_RunAwardPayoutActions(void);
2020-07-28 23:34:44 +02:00
static bool8 AwardPayoutAction0(struct Task *);
static bool8 AwardPayoutAction_GivePayoutToPlayer(struct Task *);
static bool8 AwardPayoutAction_FreeTask(struct Task *);
static u8 GetTagAtRest(u8, s16);
static void CreateSlotReelTasks(void);
static void SpinSlotReel(u8);
static void StopSlotReel(u8);
static bool8 IsSlotReelMoving(u8);
static void Task_RunSlotReelActions(u8);
static bool8 SlotReelAction_StayStill(struct Task *);
static bool8 SlotReelAction_Spin(struct Task *);
static bool8 SlotReelAction_DecideWhereToStop(struct Task *);
static bool8 SlotReelAction_MoveToStop(struct Task *);
static bool8 SlotReelAction_OscillatingStop(struct Task *);
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel1(void);
2020-07-28 23:34:44 +02:00
static bool8 DecideReelTurns_BiasTag_Reel1_Bet1(u8, u8);
static bool8 DecideReelTurns_BiasTag_Reel1_Bet2or3(u8, u8);
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel2(void);
static bool8 DecideReelTurns_BiasTag_Reel2_Bet1or2(void);
static bool8 DecideReelTurns_BiasTag_Reel2_Bet3(void);
static bool8 DecideReelTurns_BiasTag_Reel3(void);
2020-07-28 23:34:44 +02:00
static bool8 DecideReelTurns_BiasTag_Reel3_Bet1or2(u8);
static bool8 DecideReelTurns_BiasTag_Reel3_Bet3(u8);
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel1(void);
static void DecideReelTurns_NoBiasTag_Reel2(void);
static void DecideReelTurns_NoBiasTag_Reel2_Bet1(void);
static void DecideReelTurns_NoBiasTag_Reel2_Bet2(void);
static void DecideReelTurns_NoBiasTag_Reel2_Bet3(void);
static void DecideReelTurns_NoBiasTag_Reel3(void);
static void DecideReelTurns_NoBiasTag_Reel3_Bet1(void);
static void DecideReelTurns_NoBiasTag_Reel3_Bet2(void);
static void DecideReelTurns_NoBiasTag_Reel3_Bet3(void);
2020-07-28 23:34:44 +02:00
static void PressStopReelButton(u8);
static void Task_PressStopReelButton(u8);
2020-07-27 22:31:36 +02:00
static void LightenBetTiles(u8);
2020-07-28 23:34:44 +02:00
static void StopReelButton_Press(struct Task *, u8);
static void StopReelButton_Wait(struct Task *, u8);
static void StopReelButton_Unpress(struct Task *, u8);
2020-07-27 22:31:36 +02:00
static void DarkenBetTiles(u8);
static void CreateInvisibleFlashMatchLineSprites(void);
static void FlashMatchLine(u8);
static bool8 IsMatchLineDoneFlashingBeforePayout(void);
static bool8 TryStopMatchLinesFlashing(void);
static bool8 TryStopMatchLineFlashing(u8);
static void SpriteCB_FlashMatchingLines(struct Sprite *);
static void FlashSlotMachineLights(void);
static bool8 TryStopSlotMachineLights(void);
static void Task_FlashSlotMachineLights(u8);
static void CreatePikaPowerBoltTask(void);
2020-07-28 23:34:44 +02:00
static void AddPikaPowerBolt(u8);
static bool8 IsPikaPowerBoltAnimating(void);
2020-07-27 22:31:36 +02:00
static void Task_CreatePikaPowerBolt(u8);
2020-07-28 23:34:44 +02:00
static void PikaPowerBolt_Idle(struct Task *);
static void PikaPowerBolt_AddBolt(struct Task *);
static void PikaPowerBolt_WaitAnim(struct Task *);
static void PikaPowerBolt_ClearAll(struct Task *);
static void ResetPikaPowerBoltTask(struct Task *);
2020-07-27 22:31:36 +02:00
static void LoadPikaPowerMeter(u8 );
2020-07-28 23:34:44 +02:00
static void BeginReelTime(void);
static bool8 IsReelTimeTaskDone(void);
static void Task_ReelTime(u8 );
static void ReelTime_Init(struct Task *);
static void ReelTime_WindowEnter(struct Task *);
static void ReelTime_WaitStartPikachu(struct Task *);
static void ReelTime_PikachuSpeedUp1(struct Task *);
static void ReelTime_PikachuSpeedUp2(struct Task *);
static void ReelTime_WaitReel(struct Task *);
static void ReelTime_CheckExplode(struct Task *);
static void ReelTime_LandOnOutcome(struct Task *);
static void ReelTime_PikachuReact(struct Task *);
static void ReelTime_WaitClearPikaPower(struct Task *);
static void ReelTime_CloseWindow(struct Task *);
static void ReelTime_DestroySprites(struct Task *);
static void ReelTime_SetReelIncrement(struct Task *);
static void ReelTime_EndSuccess(struct Task *);
static void ReelTime_ExplodeMachine(struct Task *);
static void ReelTime_WaitExplode(struct Task *);
static void ReelTime_WaitSmoke(struct Task *);
static void ReelTime_EndFailure(struct Task *);
2020-07-27 22:31:36 +02:00
static void LoadReelTimeWindowTilemap(s16, s16);
static void ClearReelTimeWindowTilemap(s16);
2020-07-26 07:17:09 +02:00
static void OpenInfoBox(u8);
2019-02-22 22:03:35 +01:00
static bool8 IsInfoBoxClosed(void);
2020-07-28 23:34:44 +02:00
static void RunInfoBoxActions(u8 );
static void InfoBox_FadeIn(struct Task *);
static void InfoBox_WaitForFade(struct Task *);
static void InfoBox_DrawWindow(struct Task *);
static void InfoBox_AwaitPlayerInput(struct Task *);
static void InfoBox_AddText(struct Task *);
static void InfoBox_LoadPikaPowerMeter(struct Task *);
static void InfoBox_LoadSlotMachineTilemap(struct Task *);
static void InfoBox_CreateDigitalDisplay(struct Task *);
static void InfoBox_FreeTask(struct Task *);
2020-07-27 22:31:36 +02:00
static void CreateDigitalDisplayTask(void);
2020-07-28 23:34:44 +02:00
static void CreateDigitalDisplayScene(u8 );
2020-07-27 22:31:36 +02:00
static bool8 IsDigitalDisplayAnimFinished(void);
2020-07-28 23:34:44 +02:00
static void DigitalDisplay_Idle(struct Task *);
static void Task_DigitalDisplay(u8);
2020-07-26 07:17:09 +02:00
static void CreateReelSymbolSprites(void);
static void CreateCreditPayoutNumberSprites(void);
2020-07-28 23:34:44 +02:00
static void CreateCoinNumberSprite(s16, s16, u8, s16);
2020-07-26 07:17:09 +02:00
static void CreateReelBackgroundSprite(void);
static void CreateReelTimePikachuSprite(void);
static void DestroyReelTimePikachuSprite(void);
static void CreateReelTimeMachineSprites(void);
static void CreateBrokenReelTimeMachineSprite(void);
static void CreateReelTimeNumberSprites(void);
static void CreateReelTimeShadowSprites(void);
2020-07-27 22:31:36 +02:00
static void CreateReelTimeNumberGapSprite(void);
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeMachineSprites(void);
static void DestroyReelTimeShadowSprites(void);
static void DestroyBrokenReelTimeMachineSprite(void);
static void CreateReelTimeBoltSprites(void);
2020-07-28 23:34:44 +02:00
static void SetReelTimeBoltDelay(s16);
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeBoltSprites(void);
static void CreateReelTimePikachuAuraSprites(void);
2020-07-28 23:34:44 +02:00
static void SetReelTimePikachuAuraFlashDelay(s16);
2020-07-26 07:17:09 +02:00
static void DestroyReelTimePikachuAuraSprites(void);
static void CreateReelTimeExplosionSprite(void);
static void DestroyReelTimeExplosionSprite(void);
static void CreateReelTimeDuckSprites(void);
static void DestroyReelTimeDuckSprites(void);
static void CreateReelTimeSmokeSprite(void);
2020-07-27 22:31:36 +02:00
static bool8 IsReelTimeSmokeAnimFinished(void);
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeSmokeSprite(void);
2020-07-28 23:34:44 +02:00
static u8 CreatePikaPowerBoltSprite(s16, s16);
static void DestroyPikaPowerBoltSprite(u8);
static u8 CreateDigitalDisplaySprite(u8, void (*callback)(struct Sprite*), s16, s16, s16);
static void LoadSlotMachineGfx(void);
2020-07-27 22:31:36 +02:00
static void LoadReelBackground(void);
static void LoadMenuGfx(void);
2020-07-28 23:34:44 +02:00
static void LoadMenuAndReelOverlayTilemaps(void);
2020-07-27 22:31:36 +02:00
static void SetReelButtonTilemap(s16, u16, u16, u16, u16);
static void LoadInfoBoxTilemap(void);
static void LoadSlotMachineMenuTilemap(void);
static void LoadSlotMachineReelOverlay(void);
2020-07-28 23:34:44 +02:00
static u8 CreateStdDigitalDisplaySprite(u8, u8, s16);
static void SpriteCB_DigitalDisplay_Static(struct Sprite *);
static void SpriteCB_DigitalDisplay_Stop(struct Sprite *);
static void SpriteCB_DigitalDisplay_AButtonStop(struct Sprite *);
static void SpriteCB_DigitalDisplay_PokeballRocking(struct Sprite *);
static void SpriteCB_DigitalDisplay_Smoke(struct Sprite *);
static void SpriteCB_DigitalDisplay_SmokeNE(struct Sprite *);
static void SpriteCB_DigitalDisplay_SmokeSW(struct Sprite *);
static void SpriteCB_DigitalDisplay_SmokeSE(struct Sprite *);
static void SpriteCB_DigitalDisplay_Reel(struct Sprite *);
static void SpriteCB_DigitalDisplay_Time(struct Sprite *);
static void SpriteCB_DigitalDisplay_ReelTimeNumber(struct Sprite *);
static void SpriteCB_DigitalDisplay_PokeballShining(struct Sprite *);
static void SpriteCB_DigitalDisplay_RegBonus(struct Sprite *);
static void SpriteCB_DigitalDisplay_BigBonus(struct Sprite *);
static void SpriteCB_DigitalDisplay_AButtonStart(struct Sprite *);
2020-07-27 22:31:36 +02:00
static void EndDigitalDisplayScene_InsertBet(void);
static void EndDigitalDisplayScene_StopReel(void);
static void EndDigitalDisplayScene_Win(void);
static void EndDigitalDisplayScene_Dummy(void);
2020-07-28 23:34:44 +02:00
static void SpriteCB_ReelSymbol(struct Sprite *);
static void SpriteCB_CoinNumber(struct Sprite *);
static void SpriteCB_ReelTimePikachu(struct Sprite *);
static void SpriteCB_ReelTimeNumbers(struct Sprite *);
static void SpriteCB_ReelTimeBolt(struct Sprite *);
static void SpriteCB_ReelTimePikachuAura(struct Sprite *);
static void SpriteCB_ReelTimeExplosion(struct Sprite *);
static void SpriteCB_ReelTimeDuck(struct Sprite *);
static void SpriteCB_ReelTimeSmoke(struct Sprite *);
static void SpriteCB_PikaPowerBolt(struct Sprite *);
2018-09-15 23:19:37 +02:00
// Ewram variables
2020-07-27 22:31:36 +02:00
static EWRAM_DATA u16 *sMenuGfx = NULL;
2019-03-01 00:56:07 +01:00
static EWRAM_DATA u16 *sSelectedPikaPowerTile = NULL;
2020-07-27 22:31:36 +02:00
static EWRAM_DATA u16 *sReelOverlay_Tilemap = NULL;
2020-07-26 07:17:09 +02:00
static EWRAM_DATA u8 *sDigitalDisplayGfxPtr = NULL;
static EWRAM_DATA u8 *sReelTimeGfxPtr = NULL;
2020-07-27 22:31:36 +02:00
static EWRAM_DATA u16 *sReelButtonPress_Tilemap = NULL;
static EWRAM_DATA u8 *sReelBackground_Gfx = NULL;
2020-07-26 07:17:09 +02:00
static EWRAM_DATA struct SpriteFrameImage *sImageTable_ReelTimePikachu = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_ReelTimeMachineAntennae = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_ReelTimeMachine = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_BrokenReelTimeMachine = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Reel = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Time = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Insert = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Stop = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Win = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Lose = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Bonus = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Big = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Reg = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_AButton = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Smoke = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Number = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_Pokeball = NULL;
static EWRAM_DATA struct SpriteFrameImage *sImageTable_DigitalDisplay_DPad = NULL;
2020-07-27 22:31:36 +02:00
static EWRAM_DATA struct SpriteSheet *sReelBackgroundSpriteSheet = NULL;
static EWRAM_DATA struct SpriteSheet *sSlotMachineSpritesheetsPtr = NULL;
2020-07-26 07:17:09 +02:00
static EWRAM_DATA struct SlotMachine *sSlotMachine = NULL;
2018-09-15 23:19:37 +02:00
// IWRAM bss
2020-07-26 07:17:09 +02:00
static struct SpriteFrameImage *sImageTables_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES];
2018-09-15 18:01:20 +02:00
// Const rom data.
2020-07-26 07:17:09 +02:00
static const struct DigitalDisplaySprite *const sDigitalDisplayScenes[];
2020-07-28 21:28:16 +02:00
static const u16 sUnkPalette[];
static const u8 sLuckyRoundProbabilities[][3];
static const u8 sBiasTags[];
static const u16 sLuckyFlagSettings_Top3[];
static const u16 sLuckyFlagSettings_NotTop3[];
2020-07-27 22:31:36 +02:00
static const s16 sDigitalDisplay_SpriteCoords[][2];
static const SpriteCallback sDigitalDisplay_SpriteCallbacks[];
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate *const sSpriteTemplates_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES];
static const struct SubspriteTable *const sSubspriteTables_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES];
static const struct SpriteTemplate sSpriteTemplate_PikaPowerBolt;
static const struct SpriteTemplate sSpriteTemplate_ReelTimeSmoke;
static const struct SpriteTemplate sSpriteTemplate_ReelTimeDuck;
static const struct SpriteTemplate sSpriteTemplate_ReelTimeExplosion;
static const struct SpriteTemplate sSpriteTemplate_ReelTimePikachuAura;
2020-07-28 23:34:44 +02:00
static const u16 sReelTimeExplodeProbability[];
2020-07-27 22:31:36 +02:00
static const u16 *const sPokeballShiningPalTable[];
2020-07-28 21:28:16 +02:00
static const u16 sReelIncrementTable[][2];
static const u16 sReelTimeBonusIncrementTable[];
static const u16 sSlotMatchFlags[];
static const u16 sSlotPayouts[];
2020-07-27 22:31:36 +02:00
static const u8 *const sReelBackground_Tilemap;
2020-07-26 07:17:09 +02:00
static const u32 sReelTimeGfx[];
2020-07-27 22:31:36 +02:00
static const struct SpriteSheet sSlotMachineSpriteSheets[22];
static const struct SpritePalette sSlotMachineSpritePalettes[];
static const u16 *const sDigitalDisplay_Pal;
2020-07-28 21:28:16 +02:00
static const s16 sInitialReelPositions[NUM_REELS][2];
static const u8 sLuckyFlagProbabilities_Top3[][6];
static const u8 sLuckyFlagProbabilities_NotTop3[][6];
static const u8 sReeltimeProbabilities_UnluckyGame[][17];
static const u8 sReelTimeProbabilities_LuckyGame[][17];
static const u8 sSymToMatch[];
static const u8 sReelTimeTags[];
2020-07-27 22:31:36 +02:00
static const u8 sReelSymbolTileTags[NUM_REELS][SYMBOLS_PER_REEL];
2020-07-28 23:34:44 +02:00
static const u16 *const sLitMatchLinePalTable[NUM_MATCH_LINES];
static const u16 *const sDarkMatchLinePalTable[NUM_MATCH_LINES];
static const u8 sMatchLinePalOffsets[NUM_MATCH_LINES];
static const u8 sBetToMatchLineIds[MAX_BET][2];
static const u8 sMatchLinesPerBet[MAX_BET];
2020-07-27 22:31:36 +02:00
static const u16 *const sFlashingLightsPalTable[];
2020-07-28 21:28:16 +02:00
static const u16 *const sSlotMachineMenu_Pal;
2020-07-27 22:31:36 +02:00
static const u16 sReelTimeWindow_Tilemap[];
static const u16 sEmptyTilemap[];
static void (*const sDigitalDisplaySceneExitCallbacks[])(void);
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeBolt;
2020-07-27 22:31:36 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeNumberGap;
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeShadow;
static const struct SpriteTemplate sSpriteTemplate_ReelTimeNumbers;
static const struct SpriteTemplate sSpriteTemplate_BrokenReelTimeMachine;
static const struct SpriteTemplate sSpriteTemplate_ReelTimeMachineAntennae;
static const struct SpriteTemplate sSpriteTemplate_ReelTimeMachine;
static const struct SpriteTemplate sSpriteTemplate_ReelBackground;
static const struct SpriteTemplate sSpriteTemplate_CoinNumber;
static const struct SpriteTemplate sSpriteTemplate_ReelSymbol;
static const struct SpriteTemplate sSpriteTemplate_ReelTimePikachu;
2020-07-27 22:31:36 +02:00
static const struct SubspriteTable sSubspriteTable_ReelTimeNumberGap[];
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_ReelTimeShadow[];
static const struct SubspriteTable sSubspriteTable_BrokenReelTimeMachine[];
static const struct SubspriteTable sSubspriteTable_ReelTimeMachineAntennae[];
static const struct SubspriteTable sSubspriteTable_ReelTimeMachine[];
static const struct SubspriteTable sSubspriteTable_ReelBackground[];
2020-02-09 20:17:31 +01:00
2020-07-26 07:17:09 +02:00
static const struct BgTemplate sBgTemplates[] =
2018-09-15 18:01:20 +02:00
{
{
.bg = 0,
.charBaseIndex = 2,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 1,
.charBaseIndex = 1,
.mapBaseIndex = 28,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 1,
.mapBaseIndex = 29,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 1,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
};
2020-07-26 07:17:09 +02:00
static const struct WindowTemplate sWindowTemplates[] =
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
{
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 15,
.width = 27,
.height = 4,
.paletteNum = 15,
.baseBlock = 0x194
},
2018-09-15 18:01:20 +02:00
DUMMY_WIN_TEMPLATE
};
2020-07-27 22:31:36 +02:00
static const struct WindowTemplate sWindowTemplate_InfoBox =
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 3,
.width = 20,
.height = 13,
.paletteNum = 13,
.baseBlock = 1
2018-09-15 18:01:20 +02:00
};
2019-12-10 19:48:20 +01:00
static const u8 sColors_ReeltimeHelp[] = {TEXT_COLOR_LIGHT_GREY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY};
2019-02-07 17:24:09 +01:00
2020-07-28 21:28:16 +02:00
static bool8 (*const sSlotActions[])(struct Task *task) =
2019-02-07 17:24:09 +01:00
{
2020-07-28 23:34:44 +02:00
[SLOT_ACTION_UNFADE] = SlotAction_UnfadeScreen,
[SLOT_ACTION_WAIT_FADE] = SlotAction_WaitForUnfade,
[SLOT_ACTION_READY_NEW_SPIN] = SlotAction_ReadyNewSpin,
[SLOT_ACTION_READY_NEW_RT_SPIN] = SlotAction_ReadyNewReelTimeSpin,
[SLOT_ACTION_ASK_INSERT_BET] = SlotAction_AskInsertBet,
[SLOT_ACTION_BET_INPUT] = SlotAction_HandleBetInput,
[SLOT_ACTION_MSG_NEED_3_COINS] = SlotAction_PrintMsg_Need3Coins,
[SLOT_ACTION_WAIT_MSG_NEED_3_COINS] = SlotAction_WaitMsg_Need3Coins,
[SLOT_ACTION_WAIT_INFO_BOX] = SlotAction_WaitForInfoBox,
[SLOT_ACTION_START_SPIN] = SlotAction_StartSpin,
[SLOT_ACTION_START_RT_SPIN] = SlotAction_StartReelTimeSpin,
[SLOT_ACTION_SET_LUCKY_SPINS] = SlotAction_SetLuckySpins,
[SLOT_ACTION_AWAIT_REEL_STOP] = SlotAction_AwaitReelStop,
[SLOT_ACTION_AWAIT_ALL_REELS_STOP] = SlotAction_WaitForAllReelsToStop,
[SLOT_ACTION_CHECK_MATCHES] = SlotAction_CheckMatches,
[SLOT_ACTION_WAIT_PAYOUT] = SlotAction_WaitForPayoutToBeAwarded,
[SLOT_ACTION_END_PAYOUT] = SlotAction_EndPayout,
[SLOT_ACTION_MATCHED_POWER] = SlotAction_MatchedPower,
[SLOT_ACTION_WAIT_RT_ANIM] = SlotAction_WaitReelTimeAnim,
[SLOT_ACTION_RESET_BET_TILES] = SlotAction_ResetBetTiles,
[SLOT_ACTION_NO_MATCHES] = SlotAction_NoMatches,
[SLOT_ACTION_ASK_QUIT] = SlotAction_AskQuit,
[SLOT_ACTION_HANDLE_QUIT_INPUT] = SlotAction_HandleQuitInput,
[SLOT_ACTION_MSG_MAX_COINS] = SlotAction_PrintMsg_9999Coins,
[SLOT_ACTION_WAIT_MSG_MAX_COINS] = SlotAction_WaitMsg_9999Coins,
[SLOT_ACTION_MSG_NO_MORE_COINS] = SlotAction_PrintMsg_NoMoreCoins,
[SLOT_ACTION_WAIT_MSG_NO_MORE_COINS] = SlotAction_WaitMsg_NoMoreCoins,
[SLOT_ACTION_END] = SlotAction_EndGame,
[SLOT_ACTION_FREE] = SlotAction_FreeDataStructures,
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static bool8 (*const sAwardPayoutActions[])(struct Task *task) =
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
AwardPayoutAction0,
2019-02-07 17:24:09 +01:00
AwardPayoutAction_GivePayoutToPlayer,
AwardPayoutAction_FreeTask
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static bool8 (*const sSlotReelActions[])(struct Task *task) =
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
[REEL_ACTION_STILL] = SlotReelAction_StayStill,
[REEL_ACTION_SPIN] = SlotReelAction_Spin,
[REEL_ACTION_STOP] = SlotReelAction_DecideWhereToStop,
[REEL_ACTION_STOP_MOVE] = SlotReelAction_MoveToStop,
[REEL_ACTION_STOP_SHAKE] = SlotReelAction_OscillatingStop
2018-09-15 18:01:20 +02:00
};
2019-02-07 17:24:09 +01:00
// returns True if a match with the biasTag is possible in that reel
// also modifies data in sSlotMachine reel arrays to indicate how to get to the matching state
2020-07-28 21:28:16 +02:00
static bool8 (*const sDecideReelTurns_BiasTag[NUM_REELS])(void) =
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_BiasTag_Reel1,
DecideReelTurns_BiasTag_Reel2,
DecideReelTurns_BiasTag_Reel3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static void (*const sDecideReelTurns_NoBiasTag[NUM_REELS])(void) =
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_NoBiasTag_Reel1,
DecideReelTurns_NoBiasTag_Reel2,
DecideReelTurns_NoBiasTag_Reel3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static const u16 sReelStopShocks[] = {2, 4, 4, 4, 8};
2018-09-15 18:01:20 +02:00
2020-07-28 21:28:16 +02:00
static bool8 (*const sDecideReelTurns_BiasTag_Reel1_Bets[MAX_BET])(u8 tag1, u8 tag2) =
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_BiasTag_Reel1_Bet1,
DecideReelTurns_BiasTag_Reel1_Bet2or3,
DecideReelTurns_BiasTag_Reel1_Bet2or3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static bool8 (*const sDecideReelTurns_BiasTag_Reel2_Bets[MAX_BET])(void) =
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_BiasTag_Reel2_Bet1or2,
DecideReelTurns_BiasTag_Reel2_Bet1or2,
DecideReelTurns_BiasTag_Reel2_Bet3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static bool8 (*const sDecideReelTurns_BiasTag_Reel3_Bets[MAX_BET])(u8 biasTag) =
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_BiasTag_Reel3_Bet1or2,
DecideReelTurns_BiasTag_Reel3_Bet1or2,
DecideReelTurns_BiasTag_Reel3_Bet3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static void (*const sDecideReelTurns_NoBiasTag_Reel2_Bets[MAX_BET])(void) =
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_NoBiasTag_Reel2_Bet1,
DecideReelTurns_NoBiasTag_Reel2_Bet2,
DecideReelTurns_NoBiasTag_Reel2_Bet3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static void (*const sDecideReelTurns_NoBiasTag_Reel3_Bets[MAX_BET])(void) =
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
DecideReelTurns_NoBiasTag_Reel3_Bet1,
DecideReelTurns_NoBiasTag_Reel3_Bet2,
DecideReelTurns_NoBiasTag_Reel3_Bet3
2018-09-15 18:01:20 +02:00
};
2020-07-28 21:28:16 +02:00
static void (*const sReelStopButtonFuncs[])(struct Task *task, u8 taskId) =
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
StopReelButton_Press,
StopReelButton_Wait,
StopReelButton_Unpress
2018-09-15 18:01:20 +02:00
};
2020-07-27 22:31:36 +02:00
static const s16 sReelButtonOffsets[NUM_REELS] = {5, 10, 15};
2018-09-15 18:01:20 +02:00
2020-07-28 21:28:16 +02:00
static void (*const sPikaPowerBoltFuncs[])(struct Task *task) =
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
PikaPowerBolt_Idle,
PikaPowerBolt_AddBolt,
PikaPowerBolt_WaitAnim,
PikaPowerBolt_ClearAll
2018-09-15 18:01:20 +02:00
};
2020-07-27 22:31:36 +02:00
static const u16 sPikaPowerTileTable[][2] =
2018-09-15 18:01:20 +02:00
{
{0x9e, 0x6e},
{0x9f, 0x6f},
{0xaf, 0x7f},
};
2020-07-28 23:34:44 +02:00
static void (*const sReelTimeActions[])(struct Task *task) =
{
ReelTime_Init,
ReelTime_WindowEnter,
ReelTime_WaitStartPikachu,
ReelTime_PikachuSpeedUp1,
ReelTime_PikachuSpeedUp2,
ReelTime_WaitReel,
ReelTime_CheckExplode,
ReelTime_LandOnOutcome,
ReelTime_PikachuReact,
ReelTime_WaitClearPikaPower,
ReelTime_CloseWindow,
ReelTime_DestroySprites,
ReelTime_SetReelIncrement,
ReelTime_EndSuccess,
ReelTime_ExplodeMachine,
ReelTime_WaitExplode,
ReelTime_WaitSmoke,
ReelTime_CloseWindow,
ReelTime_EndFailure
2018-09-15 18:01:20 +02:00
};
2020-07-27 22:31:36 +02:00
static const u8 sReelTimePikachuAnimIds[] = {1, 1, 2, 2};
static const s16 sReelTimeBoltDelays[] = {64, 48, 24, 8};
static const s16 sPikachuAuraFlashDelays[] = {10, 8, 6, 4};
2018-09-15 18:01:20 +02:00
2020-07-27 22:31:36 +02:00
static void (*const sInfoBoxActions[])(struct Task *task) =
2019-02-07 17:24:09 +01:00
{
2020-07-27 22:31:36 +02:00
// Go to Info screen
2019-02-07 17:24:09 +01:00
InfoBox_FadeIn,
InfoBox_WaitForFade,
2020-07-27 22:31:36 +02:00
InfoBox_DrawWindow,
2019-02-07 17:24:09 +01:00
InfoBox_WaitForFade,
InfoBox_AddText,
InfoBox_WaitForFade,
2020-07-27 22:31:36 +02:00
// On Info screen
2019-02-07 17:24:09 +01:00
InfoBox_AwaitPlayerInput,
2020-07-27 22:31:36 +02:00
// Exit Info screen
2019-02-07 17:24:09 +01:00
InfoBox_WaitForFade,
2020-07-27 22:31:36 +02:00
InfoBox_LoadSlotMachineTilemap,
2019-02-07 17:24:09 +01:00
InfoBox_WaitForFade,
2020-07-27 22:31:36 +02:00
InfoBox_CreateDigitalDisplay,
2019-02-07 17:24:09 +01:00
InfoBox_WaitForFade,
2020-07-27 22:31:36 +02:00
InfoBox_LoadPikaPowerMeter,
2019-02-07 17:24:09 +01:00
InfoBox_WaitForFade,
InfoBox_FreeTask,
2018-09-15 18:01:20 +02:00
};
2020-07-27 22:31:36 +02:00
// Just idles, digital display is handled by CreateDigitalDisplayScene and sprite callbacks
2020-07-28 21:28:16 +02:00
static void (*const sDigitalDisplayActions[])(struct Task *task) =
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
DigitalDisplay_Idle,
2018-09-15 18:01:20 +02:00
};
2020-02-09 20:17:31 +01:00
2018-08-11 17:57:20 +02:00
// code
#define tState data[0]
2019-02-22 22:03:35 +01:00
static void Task_FadeToSlotMachine(u8 taskId)
2018-08-11 17:57:20 +02:00
{
switch (gTasks[taskId].tState)
{
case 0:
2019-04-04 23:05:46 +02:00
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
2018-08-11 17:57:20 +02:00
gTasks[taskId].tState++;
break;
case 1:
if (!gPaletteFade.active)
{
SetMainCallback2(CB2_SlotMachineSetup);
DestroyTask(taskId);
}
break;
}
}
2020-07-26 07:17:09 +02:00
void PlaySlotMachine(u8 slotMachineIndex, MainCallback exitCallback)
2018-08-11 17:57:20 +02:00
{
u8 taskId;
sSlotMachine = AllocZeroed(sizeof(*sSlotMachine));
2020-07-26 07:17:09 +02:00
PlaySlotMachine_Internal(slotMachineIndex, exitCallback);
2018-08-11 17:57:20 +02:00
taskId = CreateTask(Task_FadeToSlotMachine, 0);
gTasks[taskId].tState = 0;
}
#undef tState
2019-02-22 22:03:35 +01:00
static void CB2_SlotMachineSetup(void)
2018-08-11 17:57:20 +02:00
{
switch (gMain.state)
{
case 0:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_InitBgsWindows();
SlotMachineSetup_InitSlotMachineStruct();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 1:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_InitVRAM();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 2:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_InitOAM();
SlotMachineSetup_InitGpuRegs();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 3:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_InitPalsSpritesTasks();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 4:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_InitTilemaps();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 5:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_LoadGfxAndTilemaps();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 6:
2020-07-28 23:34:44 +02:00
SlotMachineSetup_InitVBlank();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 7:
2019-04-04 23:05:46 +02:00
BeginNormalPaletteFade(-1, 0, 0x10, 0, RGB_BLACK);
2018-08-11 17:57:20 +02:00
ShowBg(0);
ShowBg(1);
ShowBg(2);
ShowBg(3);
gMain.state++;
break;
case 8:
2020-07-27 22:31:36 +02:00
AllocDigitalDisplayGfx();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 9:
2020-07-27 22:31:36 +02:00
SetDigitalDisplayImagePtrs();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 10:
2020-07-28 23:34:44 +02:00
CreateSlotMachineSprites();
CreateGameplayTasks();
2018-08-11 17:57:20 +02:00
gMain.state++;
break;
case 11:
2020-07-28 23:34:44 +02:00
SetMainCallback2(CB2_SlotMachine);
2018-08-11 17:57:20 +02:00
break;
}
}
2020-07-28 23:34:44 +02:00
static void CB2_SlotMachine(void)
2018-08-11 17:57:20 +02:00
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
2020-07-28 23:34:44 +02:00
static void SlotMachine_VBlankCB(void)
2018-08-11 17:57:20 +02:00
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
SetGpuReg(REG_OFFSET_WIN0H, sSlotMachine->win0h);
SetGpuReg(REG_OFFSET_WIN0V, sSlotMachine->win0v);
SetGpuReg(REG_OFFSET_WININ, sSlotMachine->winIn);
SetGpuReg(REG_OFFSET_WINOUT, sSlotMachine->winOut);
}
2020-07-26 07:17:09 +02:00
static void PlaySlotMachine_Internal(u8 slotMachineIndex, MainCallback exitCallback)
2018-08-11 17:57:20 +02:00
{
2019-02-22 22:03:35 +01:00
struct Task *task = &gTasks[CreateTask(SlotMachineDummyTask, 0xFF)];
2019-02-07 17:24:09 +01:00
task->data[0] = slotMachineIndex;
StoreWordInTwoHalfwords((u16 *)&task->data[1], (intptr_t)exitCallback);
2018-08-11 17:57:20 +02:00
}
2019-02-07 17:24:09 +01:00
2020-07-28 23:34:44 +02:00
static void SlotMachineInitDummyTask(void)
2018-08-11 17:57:20 +02:00
{
2019-02-22 22:03:35 +01:00
struct Task *task = &gTasks[FindTaskIdByFunc(SlotMachineDummyTask)];
2019-02-07 17:24:09 +01:00
sSlotMachine->machineId = task->data[0];
2020-07-28 23:34:44 +02:00
LoadWordFromTwoHalfwords((u16 *)&task->data[1], (u32 *)&sSlotMachine->prevMainCb);
2018-08-11 17:57:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void SlotMachineDummyTask(u8 taskId)
2018-08-11 17:57:20 +02:00
{
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitBgsWindows(void)
2018-08-11 17:57:20 +02:00
{
SetVBlankCallback(NULL);
SetHBlankCallback(NULL);
CpuFill32(0, (void *)VRAM, VRAM_SIZE);
ResetBgsAndClearDma3BusyFlags(0);
2020-07-26 07:17:09 +02:00
InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
InitWindows(sWindowTemplates);
2018-08-11 17:57:20 +02:00
DeactivateAllTextPrinters();
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitVBlank(void)
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
SetVBlankCallback(SlotMachine_VBlankCB);
2018-08-11 17:57:20 +02:00
EnableInterrupts(INTR_FLAG_VBLANK);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitVRAM(void)
2018-08-11 17:57:20 +02:00
{
DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000);
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitOAM(void)
2018-08-11 17:57:20 +02:00
{
DmaClear16(3, (u16 *)OAM, OAM_SIZE);
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitGpuRegs(void)
2018-08-11 17:57:20 +02:00
{
SetGpuReg(REG_OFFSET_BG0CNT, 0);
SetGpuReg(REG_OFFSET_BG1CNT, 0);
SetGpuReg(REG_OFFSET_BG2CNT, 0);
SetGpuReg(REG_OFFSET_BG3CNT, 0);
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
SetGpuReg(REG_OFFSET_BG3HOFS, 0);
SetGpuReg(REG_OFFSET_BG3VOFS, 0);
2020-07-27 22:31:36 +02:00
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
2018-08-11 17:57:20 +02:00
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ);
2018-08-12 11:50:26 +02:00
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 8));
2018-08-11 17:57:20 +02:00
}
2019-02-07 17:24:09 +01:00
// set up initial state of slot machine
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitSlotMachineStruct(void)
2018-08-11 17:57:20 +02:00
{
u8 i;
2020-07-28 23:34:44 +02:00
SlotMachineInitDummyTask(); // assigns sSlotMachine->machineId, etc.
2018-08-11 17:57:20 +02:00
sSlotMachine->state = 0;
sSlotMachine->pikaPower = 0;
2019-02-07 17:24:09 +01:00
sSlotMachine->luckyGame = Random() & 1;
sSlotMachine->luckyFlags = 0;
2018-08-11 17:57:20 +02:00
sSlotMachine->matchedSymbols = 0;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeSpinsLeft = 0;
sSlotMachine->reelTimeSpinsUsed = 0;
2018-08-11 17:57:20 +02:00
sSlotMachine->coins = GetCoins();
sSlotMachine->payout = 0;
2019-02-07 17:24:09 +01:00
sSlotMachine->netCoinLoss = 0;
2018-08-11 17:57:20 +02:00
sSlotMachine->bet = 0;
2019-02-07 17:24:09 +01:00
sSlotMachine->currReel = 0;
sSlotMachine->reelIncrement = 8;
2020-07-27 22:31:36 +02:00
sSlotMachine->win0h = DISPLAY_WIDTH;
sSlotMachine->win0v = DISPLAY_HEIGHT;
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
sSlotMachine->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
2018-08-11 17:57:20 +02:00
sSlotMachine->backupMapMusic = GetCurrentMapMusic();
2019-02-07 17:24:09 +01:00
2019-02-22 22:03:35 +01:00
for (i = 0; i < NUM_REELS; i++)
2018-08-11 17:57:20 +02:00
{
2019-02-08 01:13:23 +01:00
sSlotMachine->reelPixelOffsetsWhileStopping[i] = 0;
2020-07-28 21:28:16 +02:00
sSlotMachine->reelPositions[i] = sInitialReelPositions[i][sSlotMachine->luckyGame] % SYMBOLS_PER_REEL;
2020-07-27 22:31:36 +02:00
sSlotMachine->reelPixelOffsets[i] = SYMBOLS_PER_REEL * REEL_SYMBOL_HEIGHT - sSlotMachine->reelPositions[i] * REEL_SYMBOL_HEIGHT;
sSlotMachine->reelPixelOffsets[i] %= SYMBOLS_PER_REEL * REEL_SYMBOL_HEIGHT;
2018-08-11 17:57:20 +02:00
}
2019-02-22 22:03:35 +01:00
AlertTVThatPlayerPlayedSlotMachine(GetCoins());
2018-08-11 17:57:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitPalsSpritesTasks(void)
2018-08-11 17:57:20 +02:00
{
ResetPaletteFade();
ResetSpriteData();
gOamLimit = 0x80;
FreeAllSpritePalettes();
ResetTasks();
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_InitTilemaps(void)
2018-08-11 17:57:20 +02:00
{
2019-03-01 00:56:07 +01:00
sSelectedPikaPowerTile = Alloc(8);
2020-07-27 22:31:36 +02:00
sReelOverlay_Tilemap = AllocZeroed(14);
sReelButtonPress_Tilemap = AllocZeroed(8);
2018-08-11 17:57:20 +02:00
2019-02-07 17:24:09 +01:00
// several of these are 1 bit off from each other
2020-07-27 22:31:36 +02:00
sReelOverlay_Tilemap[0] = 0x2051;
sReelOverlay_Tilemap[1] = 0x2851;
sReelOverlay_Tilemap[2] = 0x2061;
sReelOverlay_Tilemap[3] = 0x2861;
sReelOverlay_Tilemap[4] = 0x20BE;
sReelOverlay_Tilemap[5] = 0x28BE;
sReelOverlay_Tilemap[6] = 0x20BF;
2018-08-11 17:57:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void SlotMachineSetup_LoadGfxAndTilemaps(void)
2018-08-11 17:57:20 +02:00
{
2020-07-27 22:31:36 +02:00
LoadMenuGfx();
2020-07-28 23:34:44 +02:00
LoadMenuAndReelOverlayTilemaps();
LoadSlotMachineGfx();
2018-08-11 17:57:20 +02:00
LoadMessageBoxGfx(0, 0x200, 0xF0);
LoadUserWindowBorderGfx(0, 0x214, 0xE0);
PutWindowTilemap(0);
}
2020-07-28 23:34:44 +02:00
static void CreateSlotMachineSprites(void)
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
CreateReelSymbolSprites();
CreateCreditPayoutNumberSprites();
2020-07-27 22:31:36 +02:00
CreateInvisibleFlashMatchLineSprites();
2020-07-26 07:17:09 +02:00
CreateReelBackgroundSprite();
2018-08-11 17:57:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void CreateGameplayTasks(void)
2018-08-11 17:57:20 +02:00
{
2020-07-27 22:31:36 +02:00
CreatePikaPowerBoltTask();
2020-07-28 23:34:44 +02:00
CreateSlotReelTasks();
2020-07-27 22:31:36 +02:00
CreateDigitalDisplayTask();
2020-07-28 23:34:44 +02:00
CreateSlotMachineTask();
2018-08-11 17:57:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void CreateSlotMachineTask(void)
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
Task_SlotMachine(CreateTask(Task_SlotMachine, 0));
2018-08-11 17:57:20 +02:00
}
2019-02-07 17:24:09 +01:00
// task->data[0] is a timer
2020-07-28 23:34:44 +02:00
static void Task_SlotMachine(u8 taskId)
2018-08-11 17:57:20 +02:00
{
2020-07-28 21:28:16 +02:00
while (sSlotActions[sSlotMachine->state](&gTasks[taskId]))
2018-08-11 17:57:20 +02:00
;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_UNFADE
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_UnfadeScreen(struct Task *task)
2018-08-11 17:57:20 +02:00
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0));
2020-07-27 22:31:36 +02:00
LoadPikaPowerMeter(sSlotMachine->pikaPower);
2020-07-28 23:34:44 +02:00
sSlotMachine->state++; // SLOT_ACTION_WAIT_FADE
2018-08-11 17:57:20 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_FADE
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_WaitForUnfade(struct Task *task)
2018-08-11 17:57:20 +02:00
{
if (!gPaletteFade.active)
sSlotMachine->state++;
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_READY_NEW_SPIN
static bool8 SlotAction_ReadyNewSpin(struct Task *task)
2018-08-11 17:57:20 +02:00
{
sSlotMachine->payout = 0;
sSlotMachine->bet = 0;
2019-02-07 17:24:09 +01:00
sSlotMachine->currReel = 0;
2019-02-15 05:44:18 +01:00
sSlotMachine->luckyFlags &= (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_ASK_INSERT_BET;
2018-08-11 17:57:20 +02:00
if (sSlotMachine->coins <= 0)
{
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_MSG_NO_MORE_COINS;
2018-08-11 17:57:20 +02:00
}
2020-07-26 07:17:09 +02:00
else if (sSlotMachine->reelTimeSpinsLeft)
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_READY_NEW_RT_SPIN;
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
2018-08-11 17:57:20 +02:00
}
return TRUE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_READY_NEW_RT_SPIN
static bool8 SlotAction_ReadyNewReelTimeSpin(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (IsDigitalDisplayAnimFinished())
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_ASK_INSERT_BET;
2018-08-11 17:57:20 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_ASK_INSERT_BET
static bool8 SlotAction_AskInsertBet(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_INSERT_BET);
sSlotMachine->state = SLOT_ACTION_BET_INPUT;
2020-01-26 10:02:15 +01:00
if (sSlotMachine->coins >= MAX_COINS)
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_MSG_MAX_COINS;
2018-08-11 17:57:20 +02:00
return TRUE;
}
2020-07-26 07:17:09 +02:00
// SLOT_ACTION_BET_INPUT
static bool8 SlotAction_HandleBetInput(struct Task *task)
2018-08-11 17:57:20 +02:00
{
s16 i;
2020-07-26 07:17:09 +02:00
if (JOY_NEW(SELECT_BUTTON))
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
OpenInfoBox(DIG_DISPLAY_INSERT_BET);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_INFO_BOX;
2018-08-11 17:57:20 +02:00
}
2020-07-26 07:17:09 +02:00
else if (JOY_NEW(R_BUTTON)) // bet the max amount
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
if (sSlotMachine->coins - (MAX_BET - sSlotMachine->bet) >= 0)
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
for (i = sSlotMachine->bet; i < MAX_BET; i++)
2020-07-27 22:31:36 +02:00
LightenBetTiles(i);
2020-07-26 07:17:09 +02:00
sSlotMachine->coins -= (MAX_BET - sSlotMachine->bet);
sSlotMachine->bet = MAX_BET;
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_START_SPIN;
2018-08-11 17:57:20 +02:00
PlaySE(SE_REGI);
}
2019-02-07 17:24:09 +01:00
else // you didn't have enough coins to bet the max
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_MSG_NEED_3_COINS;
2018-08-11 17:57:20 +02:00
}
}
else
{
2020-07-26 07:17:09 +02:00
// Increase bet
if (JOY_NEW(DPAD_DOWN) && sSlotMachine->coins != 0)
2018-08-11 17:57:20 +02:00
{
PlaySE(SE_REGI);
2020-07-27 22:31:36 +02:00
LightenBetTiles(sSlotMachine->bet);
2018-08-11 17:57:20 +02:00
sSlotMachine->coins--;
sSlotMachine->bet++;
}
2020-07-26 07:17:09 +02:00
// Maxed bet or finished betting
if (sSlotMachine->bet >= MAX_BET || (sSlotMachine->bet != 0 && JOY_NEW(A_BUTTON)))
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_START_SPIN;
2020-07-26 07:17:09 +02:00
// Quit prompt
if (JOY_NEW(B_BUTTON))
sSlotMachine->state = SLOT_ACTION_ASK_QUIT;
2018-08-11 17:57:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_NEED_3_COINS
static bool8 SlotAction_PrintMsg_Need3Coins(struct Task *task)
2018-08-11 17:57:20 +02:00
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_YouDontHaveThreeCoins, 0, 1, 0, 0);
2018-08-11 17:57:20 +02:00
CopyWindowToVram(0, 3);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_MSG_NEED_3_COINS;
2018-08-11 17:57:20 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_MSG_NEED_3_COINS
static bool8 SlotAction_WaitMsg_Need3Coins(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (JOY_NEW(A_BUTTON | B_BUTTON))
2018-08-11 17:57:20 +02:00
{
ClearDialogWindowAndFrame(0, TRUE);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_BET_INPUT;
2018-08-11 17:57:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_INFO_BOX
static bool8 SlotAction_WaitForInfoBox(struct Task *task)
2018-08-11 17:57:20 +02:00
{
if (IsInfoBoxClosed())
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_BET_INPUT;
2018-08-11 17:57:20 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_START_SPIN
static bool8 SlotAction_StartSpin(struct Task *task)
2018-08-11 17:57:20 +02:00
{
DrawLuckyFlags();
2020-07-27 22:31:36 +02:00
DestroyDigitalDisplayScene();
2020-07-28 23:34:44 +02:00
SpinSlotReel(LEFT_REEL);
SpinSlotReel(MIDDLE_REEL);
SpinSlotReel(RIGHT_REEL);
IncrementDailySlotsUses();
2018-08-11 17:57:20 +02:00
task->data[0] = 0;
2019-02-15 05:44:18 +01:00
if (sSlotMachine->luckyFlags & LUCKY_BIAS_REELTIME)
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
BeginReelTime();
sSlotMachine->state = SLOT_ACTION_START_RT_SPIN;
2018-08-11 17:57:20 +02:00
}
else
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_STOP_REEL);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_SET_LUCKY_SPINS;
2018-08-11 17:57:20 +02:00
}
2019-02-07 17:24:09 +01:00
sSlotMachine->reelIncrement = 8;
2020-07-26 07:17:09 +02:00
if (sSlotMachine->reelTimeSpinsLeft)
2019-02-22 22:03:35 +01:00
sSlotMachine->reelIncrement = SlowReelSpeed();
2018-08-11 17:57:20 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_START_RT_SPIN
static bool8 SlotAction_StartReelTimeSpin(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
if (IsReelTimeTaskDone())
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_STOP_REEL);
2019-02-15 05:44:18 +01:00
sSlotMachine->luckyFlags &= ~LUCKY_BIAS_REELTIME;
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_SET_LUCKY_SPINS;
2018-08-11 17:57:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_SET_LUCKY_SPINS
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_SetLuckySpins(struct Task *task)
2018-08-11 17:57:20 +02:00
{
if (++task->data[0] >= 30)
{
SetLuckySpins();
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_AWAIT_REEL_STOP;
2018-08-11 17:57:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_AWAIT_REEL_STOP
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_AwaitReelStop(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (JOY_NEW(A_BUTTON))
2018-08-11 17:57:20 +02:00
{
PlaySE(SE_JYUNI);
2020-07-28 23:34:44 +02:00
StopSlotReel(sSlotMachine->currReel);
PressStopReelButton(sSlotMachine->currReel);
sSlotMachine->state = SLOT_ACTION_AWAIT_ALL_REELS_STOP;
2018-08-11 17:57:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_AWAIT_ALL_REELS_STOP
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_WaitForAllReelsToStop(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2019-02-08 01:13:23 +01:00
if (!IsSlotReelMoving(sSlotMachine->currReel))
2018-08-11 17:57:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->currReel++;
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_AWAIT_REEL_STOP;
if (sSlotMachine->currReel >= NUM_REELS)
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_CHECK_MATCHES;
2018-08-11 17:57:20 +02:00
}
return TRUE;
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_CHECK_MATCHES
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_CheckMatches(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->luckyFlags &= (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777);
2018-08-11 17:57:20 +02:00
CheckMatch();
2020-07-26 07:17:09 +02:00
if (sSlotMachine->reelTimeSpinsLeft)
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeSpinsLeft--;
sSlotMachine->reelTimeSpinsUsed++;
2018-08-11 17:57:20 +02:00
}
if (sSlotMachine->matchedSymbols)
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_PAYOUT;
2019-02-07 17:24:09 +01:00
AwardPayout();
2020-07-27 22:31:36 +02:00
FlashSlotMachineLights();
2019-02-07 17:24:09 +01:00
if ((sSlotMachine->netCoinLoss -= sSlotMachine->payout) < 0)
2018-08-11 17:57:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->netCoinLoss = 0;
2018-08-11 17:57:20 +02:00
}
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_BLUE) | (1 << MATCHED_777_RED)))
2018-08-11 17:57:20 +02:00
{
PlayFanfare(MUS_ME_B_BIG);
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_BONUS_BIG);
2018-08-11 17:57:20 +02:00
}
2020-07-28 21:28:16 +02:00
else if (sSlotMachine->matchedSymbols & (1 << MATCHED_777_MIXED))
2018-08-11 17:57:20 +02:00
{
PlayFanfare(MUS_ME_B_BIG);
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_BONUS_REG);
2018-08-11 17:57:20 +02:00
}
else
{
PlayFanfare(MUS_ME_B_SMALL);
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_WIN);
2018-08-11 17:57:20 +02:00
}
// if you matched 777...
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_MIXED) | (1 << MATCHED_777_BLUE) | (1 << MATCHED_777_RED)))
2018-08-11 17:57:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->luckyFlags &= ~(LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777);
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_BLUE) | (1 << MATCHED_777_RED)))
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeSpinsLeft = 0;
sSlotMachine->reelTimeSpinsUsed = 0;
2019-03-01 00:56:07 +01:00
sSlotMachine->luckyGame = FALSE;
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & (1 << MATCHED_777_BLUE))
2019-02-22 22:03:35 +01:00
// this may be an error, but if you get blue 777, the game becomes lucky
2019-03-01 00:56:07 +01:00
sSlotMachine->luckyGame = TRUE;
2018-08-11 17:57:20 +02:00
}
}
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & (1 << MATCHED_POWER) && sSlotMachine->pikaPower < 16)
2018-08-11 17:57:20 +02:00
{
sSlotMachine->pikaPower++;
2020-07-28 23:34:44 +02:00
AddPikaPowerBolt(sSlotMachine->pikaPower);
2018-08-11 17:57:20 +02:00
}
}
else
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_LOSE);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_NO_MATCHES;
2020-01-26 10:02:15 +01:00
if ((sSlotMachine->netCoinLoss += sSlotMachine->bet) > MAX_COINS)
sSlotMachine->netCoinLoss = MAX_COINS;
2018-08-11 17:57:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_PAYOUT
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_WaitForPayoutToBeAwarded(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2019-02-07 17:24:09 +01:00
if (IsFinalTask_RunAwardPayoutActions())
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_END_PAYOUT;
2018-08-11 17:57:20 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_END_PAYOUT
static bool8 SlotAction_EndPayout(struct Task *task)
2018-08-11 17:57:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (TryStopSlotMachineLights())
2018-08-11 17:57:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_RED) | (1 << MATCHED_777_BLUE)))
2018-08-11 17:57:20 +02:00
IncrementGameStat(GAME_STAT_SLOT_JACKPOTS);
2020-07-28 23:34:44 +02:00
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
2018-08-11 17:57:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->currReel = 0;
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_START_SPIN;
2018-08-11 17:57:20 +02:00
}
2020-07-28 23:34:44 +02:00
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & (1 << MATCHED_POWER))
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_MATCHED_POWER;
2020-07-28 21:28:16 +02:00
if (sSlotMachine->reelTimeSpinsLeft && sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
2018-08-11 17:57:20 +02:00
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_RT_ANIM;
2018-08-11 17:57:20 +02:00
}
}
return FALSE;
}
2018-08-11 18:47:56 +02:00
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_MATCHED_POWER
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_MatchedPower(struct Task *task)
2018-08-11 18:47:56 +02:00
{
2020-07-28 23:34:44 +02:00
if (!IsPikaPowerBoltAnimating())
2018-08-11 18:47:56 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
2018-08-11 18:47:56 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_START_SPIN;
2020-07-26 07:17:09 +02:00
if (sSlotMachine->reelTimeSpinsLeft)
2018-08-11 18:47:56 +02:00
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_RT_ANIM;
2018-08-11 18:47:56 +02:00
}
}
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_RT_ANIM
static bool8 SlotAction_WaitReelTimeAnim(struct Task *task)
2018-08-11 18:47:56 +02:00
{
2020-07-27 22:31:36 +02:00
if (IsDigitalDisplayAnimFinished())
2018-08-11 18:47:56 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
2020-07-28 21:28:16 +02:00
if (sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
2018-08-11 18:47:56 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_START_SPIN;
2018-08-11 18:47:56 +02:00
}
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_RESET_BET_TILES
static bool8 SlotAction_ResetBetTiles(struct Task *task)
2018-08-11 18:47:56 +02:00
{
2020-07-27 22:31:36 +02:00
DarkenBetTiles(0);
DarkenBetTiles(1);
DarkenBetTiles(2);
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_READY_NEW_SPIN;
2018-08-11 18:47:56 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_NO_MATCHES
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_NoMatches(struct Task *task)
2018-08-11 18:47:56 +02:00
{
if (++task->data[1] > 64)
{
task->data[1] = 0;
2020-07-28 23:34:44 +02:00
sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
2018-08-11 18:47:56 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_ASK_QUIT
static bool8 SlotAction_AskQuit(struct Task *task)
2018-08-11 18:47:56 +02:00
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_QuitTheGame, 0, 1, 0, 0);
2018-08-11 18:47:56 +02:00
CopyWindowToVram(0, 3);
2018-09-14 19:15:46 +02:00
CreateYesNoMenuParameterized(0x15, 7, 0x214, 0x180, 0xE, 0xF);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_HANDLE_QUIT_INPUT;
2018-08-11 18:47:56 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_HANDLE_QUIT_INPUT
static bool8 SlotAction_HandleQuitInput(struct Task *task)
2018-08-11 18:47:56 +02:00
{
2018-11-05 21:45:54 +01:00
s8 input = Menu_ProcessInputNoWrapClearOnChoose();
2019-02-07 17:24:09 +01:00
if (input == 0) // player chooses to quit
2018-08-11 18:47:56 +02:00
{
ClearDialogWindowAndFrame(0, TRUE);
2020-07-27 22:31:36 +02:00
DarkenBetTiles(0);
DarkenBetTiles(1);
DarkenBetTiles(2);
2018-08-11 18:47:56 +02:00
sSlotMachine->coins += sSlotMachine->bet;
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_END;
2018-08-11 18:47:56 +02:00
}
2019-02-07 17:24:09 +01:00
else if (input == 1 || input == -1) // player chooses not to quit
2018-08-11 18:47:56 +02:00
{
ClearDialogWindowAndFrame(0, TRUE);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_BET_INPUT;
2018-08-11 18:47:56 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_MSG_MAX_COINS
static bool8 SlotAction_PrintMsg_9999Coins(struct Task *task)
2018-08-11 18:47:56 +02:00
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_YouveGot9999Coins, 0, 1, 0, 0);
2018-08-11 18:47:56 +02:00
CopyWindowToVram(0, 3);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_MSG_MAX_COINS;
2018-08-11 18:47:56 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_MSG_MAX_COINS
static bool8 SlotAction_WaitMsg_9999Coins(struct Task *task)
2018-08-11 18:47:56 +02:00
{
2020-07-27 22:31:36 +02:00
if (JOY_NEW(A_BUTTON | B_BUTTON))
2018-08-11 18:47:56 +02:00
{
ClearDialogWindowAndFrame(0, TRUE);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_BET_INPUT;
2018-08-11 18:47:56 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_MSG_NO_MORE_COINS
static bool8 SlotAction_PrintMsg_NoMoreCoins(struct Task *task)
2018-08-11 18:47:56 +02:00
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_YouveRunOutOfCoins, 0, 1, 0, 0);
2018-08-11 18:47:56 +02:00
CopyWindowToVram(0, 3);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_WAIT_MSG_NO_MORE_COINS;
2018-08-11 18:47:56 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_WAIT_MSG_NO_MORE_COINS
static bool8 SlotAction_WaitMsg_NoMoreCoins(struct Task *task)
2018-08-11 18:47:56 +02:00
{
2020-07-27 22:31:36 +02:00
if (JOY_NEW(A_BUTTON | B_BUTTON))
2018-08-11 18:47:56 +02:00
{
ClearDialogWindowAndFrame(0, TRUE);
2020-07-26 07:17:09 +02:00
sSlotMachine->state = SLOT_ACTION_END;
2018-08-11 18:47:56 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_END
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_EndGame(struct Task *task)
2018-08-11 18:47:56 +02:00
{
SetCoins(sSlotMachine->coins);
2019-02-22 22:12:37 +01:00
AlertTVOfNewCoinTotal(GetCoins());
2018-08-11 18:47:56 +02:00
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
2020-07-26 07:17:09 +02:00
sSlotMachine->state++; // SLOT_ACTION_FREE
2018-08-11 18:47:56 +02:00
return FALSE;
}
2020-07-28 23:34:44 +02:00
// SLOT_ACTION_FREE
2019-02-22 22:03:35 +01:00
static bool8 SlotAction_FreeDataStructures(struct Task *task)
2018-08-11 18:47:56 +02:00
{
if (!gPaletteFade.active)
{
SetMainCallback2(sSlotMachine->prevMainCb);
2020-07-26 07:17:09 +02:00
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Reel);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Time);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Insert);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Stop);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Win);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Lose);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Bonus);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Big);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Reg);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_AButton);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Smoke);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Number);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_Pokeball);
FREE_AND_SET_NULL(sImageTable_DigitalDisplay_DPad);
if (sImageTable_ReelTimePikachu != NULL)
FREE_AND_SET_NULL(sImageTable_ReelTimePikachu);
if (sImageTable_ReelTimeMachineAntennae != NULL)
FREE_AND_SET_NULL(sImageTable_ReelTimeMachineAntennae);
if (sImageTable_ReelTimeMachine != NULL)
FREE_AND_SET_NULL(sImageTable_ReelTimeMachine);
if (sImageTable_BrokenReelTimeMachine != NULL)
FREE_AND_SET_NULL(sImageTable_BrokenReelTimeMachine);
2020-07-27 22:31:36 +02:00
FREE_AND_SET_NULL(sMenuGfx);
2019-03-01 00:56:07 +01:00
FREE_AND_SET_NULL(sSelectedPikaPowerTile);
2020-07-27 22:31:36 +02:00
FREE_AND_SET_NULL(sReelOverlay_Tilemap);
2020-07-26 07:17:09 +02:00
FREE_AND_SET_NULL(sDigitalDisplayGfxPtr);
FREE_AND_SET_NULL(sReelTimeGfxPtr);
2020-07-27 22:31:36 +02:00
FREE_AND_SET_NULL(sReelButtonPress_Tilemap);
FREE_AND_SET_NULL(sReelBackground_Gfx);
FREE_AND_SET_NULL(sReelBackgroundSpriteSheet);
FREE_AND_SET_NULL(sSlotMachineSpritesheetsPtr);
2018-08-11 18:47:56 +02:00
FREE_AND_SET_NULL(sSlotMachine);
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static void DrawLuckyFlags(void)
2018-08-11 18:47:56 +02:00
{
u8 attempts;
2018-08-11 18:47:56 +02:00
2020-07-26 07:17:09 +02:00
if (sSlotMachine->reelTimeSpinsLeft == 0)
2018-08-11 18:47:56 +02:00
{
2019-02-15 05:44:18 +01:00
if (!(sSlotMachine->luckyFlags & (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777)))
2018-08-11 18:47:56 +02:00
{
if (IsThisRoundLucky())
2018-08-11 18:47:56 +02:00
{
2019-03-01 00:56:07 +01:00
attempts = AttemptsAtLuckyFlags_Top3();
if (attempts != 3) // if you found a lucky number
2018-08-11 18:47:56 +02:00
{
// attempts == 1: reelTime flag set
2020-07-28 21:28:16 +02:00
sSlotMachine->luckyFlags |= sLuckyFlagSettings_Top3[attempts];
if (attempts != 1)
2018-08-11 18:47:56 +02:00
{
return;
}
}
}
2019-03-01 00:56:07 +01:00
// if it's not a lucky round or you got reel time, roll for the lower lucky flags
attempts = AttemptsAtLuckyFlags_NotTop3();
if (attempts != 5) // if you found a lucky number
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
sSlotMachine->luckyFlags |= sLuckyFlagSettings_NotTop3[attempts];
2018-08-11 18:47:56 +02:00
}
}
}
}
2019-02-22 22:03:35 +01:00
static void SetLuckySpins(void)
2018-08-11 18:47:56 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->isLuckySpin = FALSE;
2019-02-07 17:24:09 +01:00
if (sSlotMachine->luckyFlags)
2020-07-28 23:34:44 +02:00
sSlotMachine->isLuckySpin = TRUE;
2018-08-11 18:47:56 +02:00
}
2019-02-22 22:03:35 +01:00
static u8 GetBiasTag(u8 luckyFlags)
2018-08-11 18:47:56 +02:00
{
u8 i;
for (i = 0; i < 8; i++)
{
2019-02-07 17:24:09 +01:00
if (luckyFlags & 1)
2020-07-28 21:28:16 +02:00
return sBiasTags[i];
2019-02-07 17:24:09 +01:00
luckyFlags >>= 1;
2018-08-11 18:47:56 +02:00
}
return 0;
}
2019-03-01 00:56:07 +01:00
// you have way more luck betting 3 coins than anything lower
2019-02-22 22:03:35 +01:00
static bool8 IsThisRoundLucky(void)
2018-08-11 18:47:56 +02:00
{
u8 rval = Random();
2020-07-28 21:28:16 +02:00
if (sLuckyRoundProbabilities[sSlotMachine->machineId][sSlotMachine->bet - 1] > rval)
2018-08-11 18:47:56 +02:00
return TRUE;
return FALSE;
}
2019-03-01 00:56:07 +01:00
static u8 AttemptsAtLuckyFlags_Top3(void)
2018-08-11 18:47:56 +02:00
{
s16 count;
2018-08-11 18:47:56 +02:00
for (count = 0; count < 3; count++)
2018-08-11 18:47:56 +02:00
{
s16 rval = Random() & 0xff;
2020-07-28 21:28:16 +02:00
s16 value = sLuckyFlagProbabilities_Top3[count][sSlotMachine->machineId];
2018-08-11 18:47:56 +02:00
if (value > rval)
break;
}
return count;
2018-08-11 18:47:56 +02:00
}
2019-03-01 00:56:07 +01:00
static u8 AttemptsAtLuckyFlags_NotTop3(void)
2018-08-11 18:47:56 +02:00
{
s16 count;
2018-08-11 18:47:56 +02:00
for (count = 0; count < 5; count++)
2018-08-11 18:47:56 +02:00
{
2019-02-07 17:24:09 +01:00
s16 rval = Random() & 0xff; // random byte
2020-07-28 21:28:16 +02:00
s16 value = sLuckyFlagProbabilities_NotTop3[count][sSlotMachine->machineId];
2019-02-07 17:24:09 +01:00
// make first attempt easier if it's a lucky game
2019-03-01 00:56:07 +01:00
if (count == 0 && sSlotMachine->luckyGame == TRUE)
2018-08-11 18:47:56 +02:00
{
2019-02-07 17:24:09 +01:00
value += 10;
if (value > 0x100)
value = 0x100;
2018-08-11 18:47:56 +02:00
}
2019-02-07 17:24:09 +01:00
// make last attempt harder if it's a lucky game
2019-03-01 00:56:07 +01:00
else if (count == 4 && sSlotMachine->luckyGame == TRUE)
2018-08-11 18:47:56 +02:00
{
2019-02-07 17:24:09 +01:00
value -= 10;
if (value < 0)
value = 0;
2018-08-11 18:47:56 +02:00
}
2019-02-07 17:24:09 +01:00
if (value > rval)
2018-08-11 18:47:56 +02:00
break;
}
return count;
2018-08-11 18:47:56 +02:00
}
2019-02-22 22:03:35 +01:00
static u8 GetReelTimeProbability(u8 reelTimeDraw)
2018-08-11 18:47:56 +02:00
{
2019-03-01 00:56:07 +01:00
if (sSlotMachine->luckyGame == FALSE)
2020-07-28 21:28:16 +02:00
return sReeltimeProbabilities_UnluckyGame[reelTimeDraw][sSlotMachine->pikaPower];
2018-08-11 18:47:56 +02:00
else
2020-07-28 21:28:16 +02:00
return sReelTimeProbabilities_LuckyGame[reelTimeDraw][sSlotMachine->pikaPower];
2018-08-11 18:47:56 +02:00
}
2019-02-22 22:03:35 +01:00
static void GetReeltimeDraw(void)
2018-08-11 18:47:56 +02:00
{
u8 rval;
2019-02-07 17:24:09 +01:00
s16 reelTimeDraw;
2018-08-11 18:47:56 +02:00
2019-02-07 17:24:09 +01:00
sSlotMachine->reelTimeDraw = 0;
2018-08-11 18:47:56 +02:00
rval = Random();
2019-02-07 17:24:09 +01:00
if (rval < GetReelTimeProbability(0))
2018-08-11 18:47:56 +02:00
return;
2019-02-07 17:24:09 +01:00
for (reelTimeDraw = 5; reelTimeDraw > 0; reelTimeDraw--)
2018-08-11 18:47:56 +02:00
{
rval = Random();
2019-02-07 17:24:09 +01:00
if (rval < GetReelTimeProbability(reelTimeDraw))
2018-08-11 18:47:56 +02:00
break;
}
2019-02-07 17:24:09 +01:00
sSlotMachine->reelTimeDraw = reelTimeDraw;
2018-08-11 18:47:56 +02:00
}
2020-07-28 23:34:44 +02:00
static bool8 ShouldReelTimeMachineExplode(u16 i)
2018-08-11 18:47:56 +02:00
{
u16 rval = Random() & 0xff;
2020-07-28 23:34:44 +02:00
if (rval < sReelTimeExplodeProbability[i])
2018-08-11 18:47:56 +02:00
return TRUE;
else
return FALSE;
}
2019-02-22 22:03:35 +01:00
static u16 SlowReelSpeed(void)
2018-08-11 18:47:56 +02:00
{
2019-02-07 17:24:09 +01:00
u8 i = 0;
2018-08-11 18:47:56 +02:00
u8 rval;
u8 value;
2019-02-07 17:24:09 +01:00
if (sSlotMachine->netCoinLoss >= 300)
i = 4;
else if (sSlotMachine->netCoinLoss >= 250)
i = 3;
else if (sSlotMachine->netCoinLoss >= 200)
i = 2;
else if (sSlotMachine->netCoinLoss >= 150)
i = 1;
2018-08-11 18:47:56 +02:00
rval = Random() % 100;
2020-07-28 21:28:16 +02:00
value = sReelIncrementTable[i][0];
2018-08-11 18:47:56 +02:00
if (rval < value)
return 4;
rval = Random() % 100;
2020-07-28 21:28:16 +02:00
value = sReelIncrementTable[i][1] + sReelTimeBonusIncrementTable[sSlotMachine->reelTimeSpinsUsed];
2018-08-11 18:47:56 +02:00
if (rval < value)
return 2;
return 8;
}
2019-02-22 22:03:35 +01:00
static void CheckMatch(void)
2018-08-11 18:47:56 +02:00
{
sSlotMachine->matchedSymbols = 0;
CheckMatch_CenterRow();
if (sSlotMachine->bet > 1)
CheckMatch_TopAndBottom();
if (sSlotMachine->bet > 2)
CheckMatch_Diagonals();
}
2019-02-22 22:03:35 +01:00
static void CheckMatch_CenterRow(void)
2018-08-11 18:47:56 +02:00
{
u8 c1, c2, c3, match;
2020-05-20 22:36:00 +02:00
c1 = GetTagAtRest(LEFT_REEL, 2);
c2 = GetTagAtRest(MIDDLE_REEL, 2);
c3 = GetTagAtRest(RIGHT_REEL, 2);
2020-07-28 23:34:44 +02:00
match = GetMatchFromSymbols(c1, c2, c3);
2020-07-28 21:28:16 +02:00
if (match != MATCHED_NONE)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
sSlotMachine->payout += sSlotPayouts[match];
sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
2020-07-27 22:31:36 +02:00
FlashMatchLine(MATCH_MIDDLE_ROW);
2018-08-11 18:47:56 +02:00
}
}
2019-02-22 22:03:35 +01:00
static void CheckMatch_TopAndBottom(void)
2018-08-11 18:47:56 +02:00
{
u8 c1, c2, c3, match;
2020-05-20 22:36:00 +02:00
c1 = GetTagAtRest(LEFT_REEL, 1);
c2 = GetTagAtRest(MIDDLE_REEL, 1);
c3 = GetTagAtRest(RIGHT_REEL, 1);
2020-07-28 23:34:44 +02:00
match = GetMatchFromSymbols(c1, c2, c3);
2020-07-28 21:28:16 +02:00
if (match != MATCHED_NONE)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
if (match == MATCHED_1CHERRY)
match = MATCHED_2CHERRY;
sSlotMachine->payout += sSlotPayouts[match];
sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
2020-07-27 22:31:36 +02:00
FlashMatchLine(MATCH_TOP_ROW);
2018-08-11 18:47:56 +02:00
}
2020-05-20 22:36:00 +02:00
c1 = GetTagAtRest(LEFT_REEL, 3);
c2 = GetTagAtRest(MIDDLE_REEL, 3);
c3 = GetTagAtRest(RIGHT_REEL, 3);
2020-07-28 23:34:44 +02:00
match = GetMatchFromSymbols(c1, c2, c3);
2020-07-28 21:28:16 +02:00
if (match != MATCHED_NONE)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
if (match == MATCHED_1CHERRY)
match = MATCHED_2CHERRY;
sSlotMachine->payout += sSlotPayouts[match];
sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
2020-07-27 22:31:36 +02:00
FlashMatchLine(MATCH_BOTTOM_ROW);
2018-08-11 18:47:56 +02:00
}
}
2019-02-22 22:03:35 +01:00
static void CheckMatch_Diagonals(void)
2018-08-11 18:47:56 +02:00
{
u8 c1, c2, c3, match;
2020-05-20 22:36:00 +02:00
c1 = GetTagAtRest(LEFT_REEL, 1);
c2 = GetTagAtRest(MIDDLE_REEL, 2);
c3 = GetTagAtRest(RIGHT_REEL, 3);
2020-07-28 23:34:44 +02:00
match = GetMatchFromSymbols(c1, c2, c3);
2020-07-28 21:28:16 +02:00
if (match != MATCHED_NONE)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
if (match != MATCHED_1CHERRY)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
sSlotMachine->payout += sSlotPayouts[match];
sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
2018-08-11 18:47:56 +02:00
}
2020-07-27 22:31:36 +02:00
FlashMatchLine(MATCH_NWSE_DIAG);
2018-08-11 18:47:56 +02:00
}
2020-05-20 22:36:00 +02:00
c1 = GetTagAtRest(LEFT_REEL, 3);
c2 = GetTagAtRest(MIDDLE_REEL, 2);
c3 = GetTagAtRest(RIGHT_REEL, 1);
2020-07-28 23:34:44 +02:00
match = GetMatchFromSymbols(c1, c2, c3);
2020-07-28 21:28:16 +02:00
if (match != MATCHED_NONE)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
if (match != MATCHED_1CHERRY)
2018-08-11 18:47:56 +02:00
{
2020-07-28 21:28:16 +02:00
sSlotMachine->payout += sSlotPayouts[match];
sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
2018-08-11 18:47:56 +02:00
}
2020-07-27 22:31:36 +02:00
FlashMatchLine(MATCH_NESW_DIAG);
2018-08-11 18:47:56 +02:00
}
}
2020-07-28 23:34:44 +02:00
static u8 GetMatchFromSymbols(u8 c1, u8 c2, u8 c3)
2018-08-11 18:47:56 +02:00
{
if (c1 == c2 && c1 == c3)
2020-07-28 21:28:16 +02:00
return sSymToMatch[c1];
2020-07-27 22:31:36 +02:00
if (c1 == GFXTAG_7_RED && c2 == GFXTAG_7_RED && c3 == GFXTAG_7_BLUE)
2020-07-28 21:28:16 +02:00
return MATCHED_777_MIXED;
2020-07-27 22:31:36 +02:00
if (c1 == GFXTAG_7_BLUE && c2 == GFXTAG_7_BLUE && c3 == GFXTAG_7_RED)
2020-07-28 21:28:16 +02:00
return MATCHED_777_MIXED;
2020-07-27 22:31:36 +02:00
if (c1 == GFXTAG_CHERRY)
2020-07-28 21:28:16 +02:00
return MATCHED_1CHERRY;
return MATCHED_NONE;
2018-08-11 18:47:56 +02:00
}
2019-02-22 22:03:35 +01:00
static void AwardPayout(void)
2018-08-11 18:47:56 +02:00
{
2019-02-07 17:24:09 +01:00
RunAwardPayoutActions(CreateTask(RunAwardPayoutActions, 4));
2018-08-11 18:47:56 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 IsFinalTask_RunAwardPayoutActions(void)
2018-08-11 18:47:56 +02:00
{
2019-02-07 17:24:09 +01:00
if (FindTaskIdByFunc(RunAwardPayoutActions) == TAIL_SENTINEL)
2018-08-11 18:47:56 +02:00
return TRUE;
else
return FALSE;
}
2018-09-15 18:01:20 +02:00
2019-02-22 22:03:35 +01:00
static void RunAwardPayoutActions(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
while (sAwardPayoutActions[gTasks[taskId].data[0]](&gTasks[taskId]))
2018-09-15 18:01:20 +02:00
;
}
2019-02-22 22:03:35 +01:00
static bool8 AwardPayoutAction0(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (IsMatchLineDoneFlashingBeforePayout())
2018-09-15 18:01:20 +02:00
{
task->data[0]++;
if (sSlotMachine->payout == 0)
{
task->data[0] = 2;
return TRUE;
}
}
return FALSE;
}
2019-02-07 17:24:09 +01:00
// task->data[1]: timer
2019-02-22 22:03:35 +01:00
static bool8 AwardPayoutAction_GivePayoutToPlayer(struct Task *task)
2018-09-15 18:01:20 +02:00
{
if (!task->data[1]--)
{
if (IsFanfareTaskInactive())
PlaySE(SE_PIN);
sSlotMachine->payout--;
2020-01-26 10:02:15 +01:00
if (sSlotMachine->coins < MAX_COINS)
2018-09-15 18:01:20 +02:00
sSlotMachine->coins++;
task->data[1] = 8;
if (gMain.heldKeys & A_BUTTON)
task->data[1] = 4;
}
2020-07-27 22:31:36 +02:00
if (IsFanfareTaskInactive() && JOY_NEW(START_BUTTON))
2018-09-15 18:01:20 +02:00
{
PlaySE(SE_PIN);
sSlotMachine->coins += sSlotMachine->payout;
2020-01-26 10:02:15 +01:00
if (sSlotMachine->coins > MAX_COINS)
sSlotMachine->coins = MAX_COINS;
2018-09-15 18:01:20 +02:00
sSlotMachine->payout = 0;
}
if (sSlotMachine->payout == 0)
task->data[0]++;
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 AwardPayoutAction_FreeTask(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (TryStopMatchLinesFlashing())
2019-02-07 17:24:09 +01:00
DestroyTask(FindTaskIdByFunc(RunAwardPayoutActions));
2018-09-15 18:01:20 +02:00
return FALSE;
}
2020-05-20 23:57:11 +02:00
// Get the tag at position `offset` below the top of the reel's tape. Note that
// if `offset` is negative, it wraps around to the bottom of the tape.
2020-05-20 22:36:00 +02:00
// .-----------------.
2020-05-20 23:57:11 +02:00
// | [ ] | [ ] | [ ] | <- offset = 0
2020-05-20 22:36:00 +02:00
// /-----|-----|-----\
2020-05-20 23:57:11 +02:00
// screen -> | [ ] | [ ] | [ ] | <- offset = 1
// | [ ] | [ ] | [ ] | <- offset = 2
// | [ ] | [ ] | [ ] | <- offset = 3
2020-05-20 22:36:00 +02:00
// \-----|-----|-----/
2020-05-20 23:57:11 +02:00
// | ... | ... | ... |
// | [ ] | [ ] | [ ] | <- offset = 20
// .-----------------.
2020-05-20 22:36:00 +02:00
static u8 GetTagAtRest(u8 reel, s16 offset)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
s16 pos = (sSlotMachine->reelPositions[reel] + offset) % SYMBOLS_PER_REEL;
2020-05-20 22:36:00 +02:00
if (pos < 0)
2020-07-27 22:31:36 +02:00
pos += SYMBOLS_PER_REEL;
return sReelSymbolTileTags[reel][pos];
2018-09-15 18:01:20 +02:00
}
2020-05-20 22:36:00 +02:00
// Calculates GetTagAtRest as if the reel were snapped downwards into place.
static u8 GetTag(u8 reel, s16 offset)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
s16 inc = 0;
2020-07-27 22:31:36 +02:00
s16 pixelOffset = sSlotMachine->reelPixelOffsets[reel] % REEL_SYMBOL_HEIGHT;
2020-05-20 22:36:00 +02:00
if (pixelOffset != 0)
inc = -1;
return GetTagAtRest(reel, offset + inc);
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static u8 GetNearbyReelTimeTag(s16 n)
2018-09-15 18:01:20 +02:00
{
2019-02-15 00:06:21 +01:00
s16 newPosition = (sSlotMachine->reeltimePosition + n) % 6;
2019-02-07 17:24:09 +01:00
if (newPosition < 0)
newPosition += 6;
2020-07-28 21:28:16 +02:00
return sReelTimeTags[newPosition];
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void AdvanceSlotReel(u8 reelIndex, s16 value)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->reelPixelOffsets[reelIndex] += value;
sSlotMachine->reelPixelOffsets[reelIndex] %= 504;
2020-07-27 22:31:36 +02:00
sSlotMachine->reelPositions[reelIndex] = SYMBOLS_PER_REEL - sSlotMachine->reelPixelOffsets[reelIndex] / REEL_SYMBOL_HEIGHT;
2018-09-15 18:01:20 +02:00
}
2019-02-08 01:13:23 +01:00
s16 AdvanceSlotReelToNextTag(u8 reelIndex, s16 value)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
s16 offset = sSlotMachine->reelPixelOffsets[reelIndex] % REEL_SYMBOL_HEIGHT;
2019-02-08 01:13:23 +01:00
if (offset != 0)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
if (offset < value)
value = offset;
AdvanceSlotReel(reelIndex, value);
2020-07-27 22:31:36 +02:00
offset = sSlotMachine->reelPixelOffsets[reelIndex] % REEL_SYMBOL_HEIGHT;
2018-09-15 18:01:20 +02:00
}
2019-02-08 01:13:23 +01:00
return offset;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void AdvanceReeltimeReel(s16 value)
2018-09-15 18:01:20 +02:00
{
2019-02-15 00:06:21 +01:00
sSlotMachine->reeltimePixelOffset += value;
sSlotMachine->reeltimePixelOffset %= 120;
sSlotMachine->reeltimePosition = 6 - sSlotMachine->reeltimePixelOffset / 20;
2018-09-15 18:01:20 +02:00
}
2019-02-08 01:13:23 +01:00
s16 AdvanceReeltimeReelToNextTag(s16 value)
2018-09-15 18:01:20 +02:00
{
2019-02-15 00:06:21 +01:00
s16 offset = sSlotMachine->reeltimePixelOffset % 20;
2019-02-08 01:13:23 +01:00
if (offset != 0)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
if (offset < value)
value = offset;
AdvanceReeltimeReel(value);
2019-02-15 00:06:21 +01:00
offset = sSlotMachine->reeltimePixelOffset % 20;
2018-09-15 18:01:20 +02:00
}
2019-02-08 01:13:23 +01:00
return offset;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
#define tState data[0]
#define tMoving data[14]
#define tReelId data[15]
static void CreateSlotReelTasks(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
for (i = 0; i < NUM_REELS; i++)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
u8 taskId = CreateTask(Task_RunSlotReelActions, 2);
gTasks[taskId].tReelId = i;
2019-02-08 01:13:23 +01:00
sSlotMachine->slotReelTasks[i] = taskId;
2020-07-28 23:34:44 +02:00
Task_RunSlotReelActions(taskId);
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void SpinSlotReel(u8 reelIndex)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
gTasks[sSlotMachine->slotReelTasks[reelIndex]].tState = REEL_ACTION_SPIN;
gTasks[sSlotMachine->slotReelTasks[reelIndex]].tMoving = TRUE;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void StopSlotReel(u8 reelIndex)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
gTasks[sSlotMachine->slotReelTasks[reelIndex]].tState = REEL_ACTION_STOP;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 IsSlotReelMoving(u8 reelIndex)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
return gTasks[sSlotMachine->slotReelTasks[reelIndex]].tMoving;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void Task_RunSlotReelActions(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
while (sSlotReelActions[gTasks[taskId].tState](&gTasks[taskId]))
2018-09-15 18:01:20 +02:00
;
}
2019-02-07 17:24:09 +01:00
// task->data[1] reel turns
2019-02-22 22:03:35 +01:00
static bool8 SlotReelAction_StayStill(struct Task *task)
2018-09-15 18:01:20 +02:00
{
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 SlotReelAction_Spin(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
AdvanceSlotReel(task->tReelId, sSlotMachine->reelIncrement);
2018-09-15 18:01:20 +02:00
return FALSE;
}
2019-02-08 01:13:23 +01:00
// As in previous generations, the slot machine often doesn't stop exactly when you press stop
2019-02-22 22:03:35 +01:00
static bool8 SlotReelAction_DecideWhereToStop(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
task->tState++;
2020-07-28 21:28:16 +02:00
// initialize data for that reel --> these will be changed if sBiasTags can be lined up
2020-07-28 23:34:44 +02:00
sSlotMachine->winnerRows[task->tReelId] = 0;
sSlotMachine->reelExtraTurns[task->tReelId] = 0;
2019-02-07 17:24:09 +01:00
2020-07-28 23:34:44 +02:00
if (sSlotMachine->reelTimeSpinsLeft == 0 && (sSlotMachine->luckyFlags == 0 || !sSlotMachine->isLuckySpin || !sDecideReelTurns_BiasTag[task->tReelId]()))
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->isLuckySpin = FALSE;
sDecideReelTurns_NoBiasTag[task->tReelId]();
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
task->data[1] = sSlotMachine->reelExtraTurns[task->tReelId];
2018-09-15 18:01:20 +02:00
return TRUE;
}
2019-02-07 17:24:09 +01:00
// go to next tag and then do any additional turns
2019-02-22 22:03:35 +01:00
static bool8 SlotReelAction_MoveToStop(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
u16 reelStopShocks[ARRAY_COUNT(sReelStopShocks)];
2019-02-07 17:24:09 +01:00
s16 reelPixelPos;
2018-09-15 18:01:20 +02:00
2020-07-28 21:28:16 +02:00
memcpy(reelStopShocks, sReelStopShocks, sizeof(sReelStopShocks));
2020-07-28 23:34:44 +02:00
reelPixelPos = sSlotMachine->reelPixelOffsets[task->tReelId] % REEL_SYMBOL_HEIGHT;
2019-02-07 17:24:09 +01:00
if (reelPixelPos != 0)
2020-07-28 23:34:44 +02:00
reelPixelPos = AdvanceSlotReelToNextTag(task->tReelId, sSlotMachine->reelIncrement);
else if (sSlotMachine->reelExtraTurns[task->tReelId])
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->reelExtraTurns[task->tReelId]--;
AdvanceSlotReel(task->tReelId, sSlotMachine->reelIncrement);
reelPixelPos = sSlotMachine->reelPixelOffsets[task->tReelId] % REEL_SYMBOL_HEIGHT;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
if (reelPixelPos == 0 && sSlotMachine->reelExtraTurns[task->tReelId] == 0)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
task->tState++;
2019-02-07 17:24:09 +01:00
task->data[1] = reelStopShocks[task->data[1]];
2018-09-15 18:01:20 +02:00
task->data[2] = 0;
}
return FALSE;
}
2019-02-07 17:24:09 +01:00
// make selected tag oscillate before it becomes still
2019-02-22 22:03:35 +01:00
static bool8 SlotReelAction_OscillatingStop(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
sSlotMachine->reelPixelOffsetsWhileStopping[task->tReelId] = task->data[1];
2018-09-15 18:01:20 +02:00
task->data[1] = -task->data[1];
task->data[2]++;
if ((task->data[2] & 0x3) == 0)
task->data[1] >>= 1;
if (task->data[1] == 0)
{
2020-07-28 23:34:44 +02:00
task->tState = 0;
task->tMoving = FALSE;
sSlotMachine->reelPixelOffsetsWhileStopping[task->tReelId] = 0;
2018-09-15 18:01:20 +02:00
}
return FALSE;
}
2020-07-28 23:34:44 +02:00
#undef tState
#undef tMoving
#undef tReelId
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel1(void)
2018-09-15 18:01:20 +02:00
{
2019-02-22 22:03:35 +01:00
u8 tag2 = GetBiasTag(sSlotMachine->luckyFlags);
2019-02-07 17:24:09 +01:00
u8 tag1 = tag2;
2019-02-15 05:44:18 +01:00
if (sSlotMachine->luckyFlags & (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777))
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
tag1 = GFXTAG_7_RED;
tag2 = GFXTAG_7_BLUE;
2018-09-15 18:01:20 +02:00
}
2020-07-28 21:28:16 +02:00
return sDecideReelTurns_BiasTag_Reel1_Bets[sSlotMachine->bet - 1](tag1, tag2);
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 AreTagsAtPosition_Reel1(s16 pos, u8 tag1, u8 tag2)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
u8 tag = GetTag(LEFT_REEL, pos);
2018-09-15 18:01:20 +02:00
if (tag == tag1 || tag == tag2)
{
2019-02-07 17:24:09 +01:00
sSlotMachine->biasTag = tag;
2018-09-15 18:01:20 +02:00
return TRUE;
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 AreCherriesOnScreen_Reel1(s16 offsetFromCenter)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (GetTag(LEFT_REEL, 1 - offsetFromCenter) == GFXTAG_CHERRY
|| GetTag(LEFT_REEL, 2 - offsetFromCenter) == GFXTAG_CHERRY
|| GetTag(LEFT_REEL, 3 - offsetFromCenter) == GFXTAG_CHERRY)
2018-09-15 18:01:20 +02:00
return TRUE;
else
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 IsBiasTowardsCherryOr7s(void)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
if (sSlotMachine->luckyFlags & (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777 | LUCKY_BIAS_CHERRY))
2018-09-15 18:01:20 +02:00
return TRUE;
else
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel1_Bet1(u8 tag1, u8 tag2)
2018-09-15 18:01:20 +02:00
{
s16 i;
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
// if a lucky tag appears in the center row within 4 turns
if (AreTagsAtPosition_Reel1(2 - i, tag1, tag2))
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
sSlotMachine->winnerRows[LEFT_REEL] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[0] = i;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel1_Bet2or3(u8 tag1, u8 tag2)
2018-09-15 18:01:20 +02:00
{
s16 i;
2019-02-08 01:13:23 +01:00
bool8 biased = IsBiasTowardsCherryOr7s();
2019-02-14 23:46:44 +01:00
// if lucky numbers or no cherries are currently on screen in reel 1...
2019-02-08 01:13:23 +01:00
if (biased || !AreCherriesOnScreen_Reel1(0))
2018-09-15 18:01:20 +02:00
{
for (i = 1; i < 4; i++)
{
2019-02-08 01:13:23 +01:00
// if a bias tag is currently on the screen
if (AreTagsAtPosition_Reel1(i, tag1, tag2))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[0] = i;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[0] = 0;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
}
for (i = 1; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
bool8 biasedCopy = biased; // redundant
// if biased or if in the next 4 turns there is a screen with no cherries...
if (biasedCopy || !AreCherriesOnScreen_Reel1(i))
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
//...and if a bias tag is in top row of that screen
2019-02-08 01:13:23 +01:00
if (AreTagsAtPosition_Reel1(1 - i, tag1, tag2))
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
//...and if it only took 1 turn and the lucky tag could also be the bottom row of a screen with no cherries...
2019-02-08 01:13:23 +01:00
if (i == 1 && (biasedCopy || !AreCherriesOnScreen_Reel1(3)))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[0] = 3;
2019-02-08 01:13:23 +01:00
sSlotMachine->reelExtraTurns[0] = 3;
2018-09-15 18:01:20 +02:00
return TRUE;
}
2019-02-07 17:24:09 +01:00
//...or if it isn't the last turn and the lucky tag could be in the center row of a screen with no cherries...
2019-02-08 01:13:23 +01:00
if (i < 4 && (biasedCopy || !AreCherriesOnScreen_Reel1(i + 1)))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[0] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[0] = i + 1;
2018-09-15 18:01:20 +02:00
return TRUE;
}
2019-02-07 17:24:09 +01:00
//...else
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[0] = 1;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[0] = i;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel2(void)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
return sDecideReelTurns_BiasTag_Reel2_Bets[sSlotMachine->bet - 1]();
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel2_Bet1or2(void)
2018-09-15 18:01:20 +02:00
{
s16 i;
2019-02-15 05:44:18 +01:00
s16 biasTagLocation_Reel1 = sSlotMachine->winnerRows[0];
2018-09-15 18:01:20 +02:00
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
// if biasTag appears in the same row within 4 turns
2020-05-20 22:36:00 +02:00
if (GetTag(MIDDLE_REEL, biasTagLocation_Reel1 - i) == sSlotMachine->biasTag)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = biasTagLocation_Reel1;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = i;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel2_Bet3(void)
2018-09-15 18:01:20 +02:00
{
s16 i;
2019-02-08 01:13:23 +01:00
// if biasTag appears in the same row within 4 turns...
2019-02-07 17:24:09 +01:00
if (DecideReelTurns_BiasTag_Reel2_Bet1or2())
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
//...and if the biasTag is not in middle row of reel 1 and if biasTag appears in middle row of reel 2 in 2 or 3 turns...
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] != 2 && sSlotMachine->reelExtraTurns[1] > 1 && sSlotMachine->reelExtraTurns[1] != 4)
2018-09-15 18:01:20 +02:00
{
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
//...and if the bias tag will appear in the middle row within 4 turns
2020-05-20 22:36:00 +02:00
if (GetTag(MIDDLE_REEL, 2 - i) == sSlotMachine->biasTag)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = i;
2018-09-15 18:01:20 +02:00
break;
}
}
}
return TRUE;
}
2019-02-08 01:13:23 +01:00
// else if the biasTag is not in middle row of reel 1...
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] != 2)
2018-09-15 18:01:20 +02:00
{
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
//...and if the biasTag will appear in the center row of reel 2 within 4 turns
2020-05-20 22:36:00 +02:00
if (GetTag(MIDDLE_REEL, 2 - i) == sSlotMachine->biasTag)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = i;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel3(void)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
u8 biasTag = sSlotMachine->biasTag;
2019-02-15 05:44:18 +01:00
if (sSlotMachine->luckyFlags & LUCKY_BIAS_MIXED_777)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
biasTag = GFXTAG_7_RED;
if (sSlotMachine->biasTag == GFXTAG_7_RED)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
biasTag = GFXTAG_7_BLUE;
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 21:28:16 +02:00
return sDecideReelTurns_BiasTag_Reel3_Bets[sSlotMachine->bet - 1](biasTag);
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel3_Bet1or2(u8 biasTag)
2018-09-15 18:01:20 +02:00
{
s16 i;
2019-02-15 05:44:18 +01:00
s16 biasTagLocation_Reel2 = sSlotMachine->winnerRows[1];
2018-09-15 18:01:20 +02:00
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
// if the biasTag appears in the same row as in reel 2 within 4 turns
2020-05-20 22:36:00 +02:00
if (GetTag(RIGHT_REEL, biasTagLocation_Reel2 - i) == biasTag)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[2] = biasTagLocation_Reel2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2] = i;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 DecideReelTurns_BiasTag_Reel3_Bet3(u8 biasTag)
2018-09-15 18:01:20 +02:00
{
s16 i;
2019-02-07 17:24:09 +01:00
s16 biasTagFinalPos;
// if the final position of the biasTag matches in reel 1 and reel 2...
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] == sSlotMachine->winnerRows[1])
2019-02-07 17:24:09 +01:00
//...then try to line it up in reel 3
return DecideReelTurns_BiasTag_Reel3_Bet1or2(biasTag);
// else place it in the row opposite reel 1's
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] == 1)
2019-02-07 17:24:09 +01:00
biasTagFinalPos = 3;
2018-09-15 18:01:20 +02:00
else
2019-02-07 17:24:09 +01:00
biasTagFinalPos = 1;
2018-09-15 18:01:20 +02:00
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
// if the biasTag lands in that position within 4 turns
2020-05-20 22:36:00 +02:00
if (GetTag(RIGHT_REEL, biasTagFinalPos - i) == biasTag)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2] = i;
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[2] = biasTagFinalPos;
2018-09-15 18:01:20 +02:00
return TRUE;
}
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
// Advance until there are no cherries on screen in reel 1
static void DecideReelTurns_NoBiasTag_Reel1(void)
2018-09-15 18:01:20 +02:00
{
s16 i = 0;
2019-02-07 17:24:09 +01:00
while (AreCherriesOnScreen_Reel1(i) != 0)
2018-09-15 18:01:20 +02:00
i++;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[0] = i;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 IsBiasTag777_SwitchColor(u8 *biasTagPtr)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (*biasTagPtr == GFXTAG_7_RED)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
*biasTagPtr = GFXTAG_7_BLUE;
2018-09-15 18:01:20 +02:00
return TRUE;
}
2020-07-27 22:31:36 +02:00
if (*biasTagPtr == GFXTAG_7_BLUE)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
*biasTagPtr = GFXTAG_7_RED;
2018-09-15 18:01:20 +02:00
return TRUE;
}
return FALSE;
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel2(void)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
sDecideReelTurns_NoBiasTag_Reel2_Bets[sSlotMachine->bet - 1]();
2018-09-15 18:01:20 +02:00
}
2019-02-07 17:24:09 +01:00
// only does stuff if the biasTag is one of the 7's, plus other conditions
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel2_Bet1(void)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
u8 biasTag = GetTag(LEFT_REEL, 2 - sSlotMachine->reelExtraTurns[0]);
2019-02-07 17:24:09 +01:00
//...and if biasTag is one of the 7's...
2019-02-15 05:44:18 +01:00
if (IsBiasTag777_SwitchColor(&biasTag))
2019-02-08 01:13:23 +01:00
//...swap color of biasTag...
2018-09-15 18:01:20 +02:00
{
s16 i;
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
//...and if the biasTag appears within 4 turns
2020-05-20 22:36:00 +02:00
if (biasTag == GetTag(MIDDLE_REEL, 2 - i))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = i;
2018-09-15 18:01:20 +02:00
break;
}
}
}
}
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel2_Bet2(void)
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
u8 biasTag = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
2019-02-07 17:24:09 +01:00
//...and if biasTag is one of the 7's...
2019-02-15 05:44:18 +01:00
if (IsBiasTag777_SwitchColor(&biasTag))
2019-02-08 01:13:23 +01:00
//...swap color of biasTag...
2018-09-15 18:01:20 +02:00
{
s16 i;
for (i = 0; i < 5; i++)
{
2019-02-08 01:13:23 +01:00
//...and if the biasTag appears in same row in reel 2 within 4 turns
2020-05-20 22:36:00 +02:00
if (biasTag == GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[0] - i))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = sSlotMachine->winnerRows[0];
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = i;
2018-09-15 18:01:20 +02:00
break;
}
}
}
}
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel2_Bet3(void)
2018-09-15 18:01:20 +02:00
{
s16 i;
s16 j;
2019-02-07 17:24:09 +01:00
// if reel 1 has a biasTag and bit 7 is set in luckyFlags...
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
//...and if biasTag appeared in the center row of reel 1
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] == 2)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DecideReelTurns_NoBiasTag_Reel2_Bet2();
2018-09-15 18:01:20 +02:00
}
else
{
2020-05-20 22:36:00 +02:00
u8 biasTag = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
2019-02-07 17:24:09 +01:00
//...and if biasTag is one of the 7's...
2019-02-15 05:44:18 +01:00
if (IsBiasTag777_SwitchColor(&biasTag))
2019-02-07 17:24:09 +01:00
//...swap the color of the 7...
2018-09-15 18:01:20 +02:00
{
j = 2;
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] == 3)
2018-09-15 18:01:20 +02:00
j = 3;
for (i = 0; i < 2; i++, j--)
{
2020-05-20 22:36:00 +02:00
if (biasTag == GetTag(MIDDLE_REEL, j))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = j;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = 0;
2018-09-15 18:01:20 +02:00
return;
}
}
for (j = 1; j < 5; j++)
{
2020-05-20 22:36:00 +02:00
if (biasTag == GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[0] - j))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] == 1)
2018-09-15 18:01:20 +02:00
{
if (j < 3)
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = j + 1;
2018-09-15 18:01:20 +02:00
}
else
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 1;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = j;
2018-09-15 18:01:20 +02:00
}
}
else
{
if (j < 3)
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 3;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = j;
2018-09-15 18:01:20 +02:00
}
else
{
2019-02-15 05:44:18 +01:00
sSlotMachine->winnerRows[1] = 2;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[1] = j - 1;
2018-09-15 18:01:20 +02:00
}
}
return;
}
}
}
}
}
}
2019-02-22 22:03:35 +01:00
static bool8 AreTagsMixed77(u8 tag1, u8 tag2)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if ((tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_BLUE) || (tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_RED))
2018-09-15 18:01:20 +02:00
return TRUE;
else
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 AreTagsMixed777(u8 tag1, u8 tag2, u8 tag3)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if ((tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED) ||
(tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE))
2018-09-15 18:01:20 +02:00
return TRUE;
else
return FALSE;
}
2019-02-22 22:03:35 +01:00
static bool8 TagsDontMatchOrHaveAny7s(u8 tag1, u8 tag2, u8 tag3)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if ((tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED) ||
(tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE) ||
(tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE) ||
(tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED) ||
2019-02-14 23:46:44 +01:00
(tag1 == tag2 && tag1 == tag3))
2018-09-15 18:01:20 +02:00
{
return FALSE;
}
return TRUE;
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel3(void)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
sDecideReelTurns_NoBiasTag_Reel3_Bets[sSlotMachine->bet - 1]();
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel3_Bet1(void)
2018-09-15 18:01:20 +02:00
{
s16 i = 0;
2020-05-20 22:36:00 +02:00
u8 tag1 = GetTag(LEFT_REEL, 2 - sSlotMachine->reelExtraTurns[0]);
u8 tag2 = GetTag(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
2019-02-14 23:46:44 +01:00
// if tags match in first 2 reels...
if (tag1 == tag2)
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
//...spin until you get non-matching tag
2018-09-15 18:01:20 +02:00
while (1)
{
2019-02-14 23:46:44 +01:00
u8 tag3;
2020-07-27 22:31:36 +02:00
if (!(tag1 == (tag3 = GetTag(RIGHT_REEL, 2 - i)) || (tag1 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE) || (tag1 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED)))
2018-09-15 18:01:20 +02:00
break;
i++;
}
}
2019-02-15 05:44:18 +01:00
else if (AreTagsMixed77(tag1, tag2))
2018-09-15 18:01:20 +02:00
{
2019-02-15 05:44:18 +01:00
if (sSlotMachine->luckyFlags & LUCKY_BIAS_777)
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
//...see if you can match with reel 1 within 4 turns
2018-09-15 18:01:20 +02:00
for (i = 0; i < 5; i++)
{
2020-05-20 22:36:00 +02:00
if (tag1 == GetTag(RIGHT_REEL, 2 - i))
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2] = i;
2018-09-15 18:01:20 +02:00
return;
}
}
}
2019-02-14 23:46:44 +01:00
// turn until you aren't matching with reel 1
2018-09-15 18:01:20 +02:00
i = 0;
while (1)
{
2020-05-20 22:36:00 +02:00
if (tag1 != GetTag(RIGHT_REEL, 2 - i))
2018-09-15 18:01:20 +02:00
break;
i++;
}
}
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2] = i;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel3_Bet2(void)
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
s16 extraTurns = 0;
2018-09-15 18:01:20 +02:00
s16 i;
2019-02-14 23:46:44 +01:00
u8 tag1;
u8 tag2;
u8 tag3;
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[1] != 0 && sSlotMachine->winnerRows[0] == sSlotMachine->winnerRows[1] && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
tag1 = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
tag2 = GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[1] - sSlotMachine->reelExtraTurns[1]);
2019-02-14 23:46:44 +01:00
//...and if tags are mixed 7s...
2019-02-15 05:44:18 +01:00
if (AreTagsMixed77(tag1, tag2))
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
//...try to match with reel 1 within 4 turns
2018-09-15 18:01:20 +02:00
for (i = 0; i < 5; i++)
{
2020-05-20 22:36:00 +02:00
tag3 = GetTag(RIGHT_REEL, sSlotMachine->winnerRows[1] - i);
2019-02-14 23:46:44 +01:00
if (tag1 == tag3)
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
extraTurns = i;
2018-09-15 18:01:20 +02:00
break;
}
}
}
}
2019-02-14 23:46:44 +01:00
// GUESS: spin until there's no possible match within 4 turns of you stopping
2018-09-15 18:01:20 +02:00
while (1)
{
2019-02-14 23:46:44 +01:00
s16 loopExit;
for (i = 1, loopExit = 0; i < 4; i++)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
tag1 = GetTag(LEFT_REEL, i - sSlotMachine->reelExtraTurns[0]); // why does this update with i
tag2 = GetTag(MIDDLE_REEL, i - sSlotMachine->reelExtraTurns[1]);
tag3 = GetTag(RIGHT_REEL, i - extraTurns);
2019-02-14 23:46:44 +01:00
// if bit 7 of luckyFlags is unset...
//...and if all 3 tags match and they're not mixed 7s
2019-02-15 05:44:18 +01:00
if (!TagsDontMatchOrHaveAny7s(tag1, tag2, tag3) && (!AreTagsMixed777(tag1, tag2, tag3) || !(sSlotMachine->luckyFlags & LUCKY_BIAS_777)))
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
loopExit++;
2018-09-15 18:01:20 +02:00
break;
}
}
2019-02-14 23:46:44 +01:00
if (loopExit == 0)
2018-09-15 18:01:20 +02:00
break;
2019-02-14 23:46:44 +01:00
extraTurns++;
2018-09-15 18:01:20 +02:00
}
2019-02-14 23:46:44 +01:00
sSlotMachine->reelExtraTurns[2] = extraTurns;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void DecideReelTurns_NoBiasTag_Reel3_Bet3(void)
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
u8 tag1;
u8 tag2;
u8 tag3;
s16 j;
2018-09-15 18:01:20 +02:00
s16 i;
2019-02-14 23:46:44 +01:00
DecideReelTurns_NoBiasTag_Reel3_Bet2();
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[1] != 0 && sSlotMachine->winnerRows[0] != sSlotMachine->winnerRows[1] && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
2018-09-15 18:01:20 +02:00
{
2020-05-20 22:36:00 +02:00
tag1 = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
tag2 = GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[1] - sSlotMachine->reelExtraTurns[1]);
2019-02-14 23:46:44 +01:00
//..and if tags are mixed 7s...
2019-02-15 05:44:18 +01:00
if (AreTagsMixed77(tag1, tag2))
2018-09-15 18:01:20 +02:00
{
2019-02-14 23:46:44 +01:00
j = 1;
2019-02-15 05:44:18 +01:00
if (sSlotMachine->winnerRows[0] == 1)
2019-02-14 23:46:44 +01:00
j = 3;
2018-09-15 18:01:20 +02:00
for (i = 0; i < 5; i++)
{
2020-05-20 22:36:00 +02:00
tag3 = GetTag(RIGHT_REEL, j - (sSlotMachine->reelExtraTurns[2] + i));
2019-02-14 23:46:44 +01:00
if (tag1 == tag3)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2] += i;
2018-09-15 18:01:20 +02:00
break;
}
}
}
}
while (1)
{
2020-05-20 22:36:00 +02:00
tag1 = GetTag(LEFT_REEL, 1 - sSlotMachine->reelExtraTurns[0]);
tag2 = GetTag(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
tag3 = GetTag(RIGHT_REEL, 3 - sSlotMachine->reelExtraTurns[2]);
2019-02-15 05:44:18 +01:00
if (TagsDontMatchOrHaveAny7s(tag1, tag2, tag3) || (AreTagsMixed777(tag1, tag2, tag3) && sSlotMachine->luckyFlags & LUCKY_BIAS_777))
2018-09-15 18:01:20 +02:00
break;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2]++;
2018-09-15 18:01:20 +02:00
}
while (1)
{
2020-05-20 22:36:00 +02:00
tag1 = GetTag(LEFT_REEL, 3 - sSlotMachine->reelExtraTurns[0]);
tag2 = GetTag(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
tag3 = GetTag(RIGHT_REEL, 1 - sSlotMachine->reelExtraTurns[2]);
2019-02-15 05:44:18 +01:00
if (TagsDontMatchOrHaveAny7s(tag1, tag2, tag3) || (AreTagsMixed777(tag1, tag2, tag3) && sSlotMachine->luckyFlags & LUCKY_BIAS_777))
2018-09-15 18:01:20 +02:00
break;
2019-02-07 17:24:09 +01:00
sSlotMachine->reelExtraTurns[2]++;
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void PressStopReelButton(u8 reelNum)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
u8 taskId = CreateTask(Task_PressStopReelButton, 5);
2020-07-27 22:31:36 +02:00
gTasks[taskId].data[15] = reelNum;
2020-07-28 23:34:44 +02:00
Task_PressStopReelButton(taskId);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void Task_PressStopReelButton(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
sReelStopButtonFuncs[gTasks[taskId].data[0]](&gTasks[taskId], taskId);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void StopReelButton_Press(struct Task *task, u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
SetReelButtonTilemap(sReelButtonOffsets[task->data[15]], 0x62, 0x63, 0x72, 0x73);
2018-09-15 18:01:20 +02:00
task->data[0]++;
}
2020-07-28 23:34:44 +02:00
static void StopReelButton_Wait(struct Task *task, u8 taskId)
2018-09-15 18:01:20 +02:00
{
if (++task->data[1] > 11)
task->data[0]++;
}
2020-07-28 23:34:44 +02:00
static void StopReelButton_Unpress(struct Task *task, u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
SetReelButtonTilemap(sReelButtonOffsets[task->data[15]], 0x42, 0x43, 0x52, 0x53);
2018-09-15 18:01:20 +02:00
DestroyTask(taskId);
}
2020-07-28 21:28:16 +02:00
static void LightenMatchLine(u8 matchLineId)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
LoadPalette(sLitMatchLinePalTable[matchLineId], sMatchLinePalOffsets[matchLineId], 2);
2018-09-15 18:01:20 +02:00
}
2020-07-28 21:28:16 +02:00
static void DarkenMatchLine(u8 matchLineId)
2018-09-15 18:01:20 +02:00
{
2020-07-28 21:28:16 +02:00
LoadPalette(sDarkMatchLinePalTable[matchLineId], sMatchLinePalOffsets[matchLineId], 2);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
// light up the match line for each bet by the player
static void LightenBetTiles(u8 betVal)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
for (i = 0; i < sMatchLinesPerBet[betVal]; i++)
LightenMatchLine(sBetToMatchLineIds[betVal][i]);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void DarkenBetTiles(u8 betVal)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
for (i = 0; i < sMatchLinesPerBet[betVal]; i++)
DarkenMatchLine(sBetToMatchLineIds[betVal][i]);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
#define sMatchLineId data[0]
#define sFlashing data[1]
#define sNumFullFlashes data[2]
#define sDelayTimer data[3]
#define sColor data[4]
#define sColorIncr data[5]
#define sAtOriginalColor data[7]
// Creates invisible sprites that flash the bet lines/numbers where a match occurs
// 5 are created, 1 for each possible match line (3 rows, 2 diagonals)
static void CreateInvisibleFlashMatchLineSprites(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->flashMatchLineSpriteIds); i++)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateInvisibleSprite(SpriteCB_FlashMatchingLines);
gSprites[spriteId].sMatchLineId = i;
sSlotMachine->flashMatchLineSpriteIds[i] = spriteId;
2018-09-15 18:01:20 +02:00
}
}
2020-07-27 22:31:36 +02:00
static void FlashMatchLine(u8 matchLineId)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
struct Sprite *sprite = &gSprites[sSlotMachine->flashMatchLineSpriteIds[matchLineId]];
sprite->sFlashing = TRUE;
sprite->sNumFullFlashes = 4;
sprite->sDelayTimer = 0;
sprite->sColor = 0;
sprite->sColorIncr = 2;
sprite->sAtOriginalColor = FALSE;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
// Match line flashes 4 times before the payout begins
// After this it does half-brightness flashes until the payout finishes
static bool8 IsMatchLineDoneFlashingBeforePayout(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->flashMatchLineSpriteIds); i++)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
struct Sprite *sprite = &gSprites[sSlotMachine->flashMatchLineSpriteIds[i]];
if (sprite->sFlashing && sprite->sNumFullFlashes)
2018-09-15 18:01:20 +02:00
return FALSE;
}
return TRUE;
}
2020-07-27 22:31:36 +02:00
// When payout is finished, stop lines flashing (but not if they're in the middle of a flash)
static bool8 TryStopMatchLinesFlashing(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->flashMatchLineSpriteIds); i++)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (!TryStopMatchLineFlashing(sSlotMachine->flashMatchLineSpriteIds[i]))
2018-09-15 18:01:20 +02:00
return FALSE;
}
return TRUE;
}
2020-07-27 22:31:36 +02:00
static bool8 TryStopMatchLineFlashing(u8 spriteId)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
struct Sprite *sprite = &gSprites[spriteId];
if (!sprite->sFlashing)
2018-09-15 18:01:20 +02:00
return TRUE;
2020-07-27 22:31:36 +02:00
if (sprite->sAtOriginalColor)
sprite->sFlashing = FALSE;
return sprite->sAtOriginalColor;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_FlashMatchingLines(struct Sprite *sprite)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
s16 maxColorChange;
if (sprite->sFlashing)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (!sprite->sDelayTimer--)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sAtOriginalColor = FALSE;
sprite->sDelayTimer = 1;
sprite->sColor += sprite->sColorIncr;
maxColorChange = 4;
if (sprite->sNumFullFlashes)
maxColorChange = 8;
if (sprite->sColor <= 0)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
// Returned to original color, reverse
sprite->sAtOriginalColor = TRUE;
sprite->sColorIncr = -sprite->sColorIncr;
if (sprite->sNumFullFlashes)
sprite->sNumFullFlashes--;
}
else if (sprite->sColor >= maxColorChange) {
// Reached peak darkness, reverse
sprite->sColorIncr = -sprite->sColorIncr;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
if (sprite->sNumFullFlashes)
sprite->sDelayTimer <<= 1;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
MultiplyPaletteRGBComponents(sMatchLinePalOffsets[sprite->sMatchLineId], sprite->sColor, sprite->sColor, sprite->sColor);
2018-09-15 18:01:20 +02:00
}
}
2020-07-27 22:31:36 +02:00
#undef sMatchLineId
#undef sFlashing
#undef sNumFullFlashes
#undef sDelayTimer
#undef sColor
#undef sColorIncr
#undef sAtOriginalColor
#define sDelayTimer data[1]
#define sFlashState data[2]
#define sFlashDir data[3]
static void FlashSlotMachineLights(void)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
u8 taskId = CreateTask(Task_FlashSlotMachineLights, 6);
gTasks[taskId].sFlashDir = 1;
Task_FlashSlotMachineLights(taskId);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static bool8 TryStopSlotMachineLights(void)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
u8 taskId = FindTaskIdByFunc(Task_FlashSlotMachineLights);
if (gTasks[taskId].sFlashState == 0)
2018-09-15 18:01:20 +02:00
{
DestroyTask(taskId);
2020-07-28 21:28:16 +02:00
LoadPalette(sSlotMachineMenu_Pal, 0x10, 0x20);
2018-09-15 18:01:20 +02:00
return TRUE;
}
return FALSE;
}
2020-07-27 22:31:36 +02:00
static void Task_FlashSlotMachineLights(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2019-02-22 22:03:35 +01:00
struct Task *task = &gTasks[taskId];
2020-07-27 22:31:36 +02:00
if (!task->sDelayTimer--)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
task->sDelayTimer = 4;
task->sFlashState += task->sFlashDir;
if (task->sFlashState == 0 || task->sFlashState == 2)
task->sFlashDir = -task->sFlashDir;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
LoadPalette(sFlashingLightsPalTable[task->sFlashState], 0x10, 0x20);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
#undef sDelayTimer
#undef sFlashState
#undef sFlashDir
2020-07-28 23:34:44 +02:00
#define tState data[0]
#define tNumBolts data[1]
#define tSpriteId data[2]
#define tTimer data[2] // re-used
#define tAnimating data[15]
2020-07-27 22:31:36 +02:00
static void CreatePikaPowerBoltTask(void)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
sSlotMachine->pikaPowerBoltTaskId = CreateTask(Task_CreatePikaPowerBolt, 8);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void AddPikaPowerBolt(u8 pikaPower)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
struct Task *task = &gTasks[sSlotMachine->pikaPowerBoltTaskId];
2020-07-28 23:34:44 +02:00
ResetPikaPowerBoltTask(task);
task->tState = 1;
task->tNumBolts++;
task->tAnimating = TRUE;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ResetPikaPowerBolts(void)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
struct Task *task = &gTasks[sSlotMachine->pikaPowerBoltTaskId];
2020-07-28 23:34:44 +02:00
ResetPikaPowerBoltTask(task);
task->tState = 3;
task->tAnimating = TRUE;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static bool8 IsPikaPowerBoltAnimating(void)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
return gTasks[sSlotMachine->pikaPowerBoltTaskId].tAnimating;
2018-09-15 18:01:20 +02:00
}
2020-07-26 07:17:09 +02:00
static void Task_CreatePikaPowerBolt(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
sPikaPowerBoltFuncs[gTasks[taskId].tState](&gTasks[taskId]);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void PikaPowerBolt_Idle(struct Task *task)
2018-09-15 18:01:20 +02:00
{
}
2020-07-28 23:34:44 +02:00
static void PikaPowerBolt_AddBolt(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
task->tSpriteId = CreatePikaPowerBoltSprite((task->tNumBolts << 3) + 20, 20);
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
// The bolt sprite spins around as it appears
// Once the anim is done, destroy the sprite and set the bolt in the tilemap instead
static void PikaPowerBolt_WaitAnim(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
if (gSprites[task->tSpriteId].data[7])
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
s16 r5 = task->tNumBolts + 2;
2018-09-15 18:01:20 +02:00
s16 r3 = 0;
s16 r2 = 0;
2020-07-28 23:34:44 +02:00
if (task->tNumBolts == 1)
2018-09-15 18:01:20 +02:00
r3 = 1, r2 = 1;
2020-07-28 23:34:44 +02:00
else if (task->tNumBolts == 16)
2018-09-15 18:01:20 +02:00
r3 = 2, r2 = 2;
2020-07-27 22:31:36 +02:00
sSelectedPikaPowerTile[r2] = sPikaPowerTileTable[r3][0];
2019-03-01 00:56:07 +01:00
LoadBgTilemap(2, &sSelectedPikaPowerTile[r2], 2, r5 + 0x40);
2020-07-28 23:34:44 +02:00
DestroyPikaPowerBoltSprite(task->tSpriteId);
task->tState = 0;
task->tAnimating = 0;
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void PikaPowerBolt_ClearAll(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
s16 r5 = task->tNumBolts + 2;
2018-09-15 18:01:20 +02:00
s16 r3 = 0;
s16 r2 = 3;
2020-07-28 23:34:44 +02:00
if (task->tNumBolts == 1)
2018-09-15 18:01:20 +02:00
r3 = 1, r2 = 1;
2020-07-28 23:34:44 +02:00
else if (task->tNumBolts == 16)
2018-09-15 18:01:20 +02:00
r3 = 2, r2 = 2;
2020-07-28 23:34:44 +02:00
if (task->tTimer == 0)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
sSelectedPikaPowerTile[r2] = sPikaPowerTileTable[r3][1];
2019-03-01 00:56:07 +01:00
LoadBgTilemap(2, &sSelectedPikaPowerTile[r2], 2, r5 + 0x40);
2020-07-28 23:34:44 +02:00
task->tNumBolts--;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
if (++task->tTimer >= 20)
task->tTimer = 0;
if (task->tNumBolts == 0)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
task->tState = 0;
task->tAnimating = 0;
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void ResetPikaPowerBoltTask(struct Task *task)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-26 07:17:09 +02:00
for (i = 2; i < NUM_TASK_DATA; i++)
2018-09-15 18:01:20 +02:00
task->data[i] = 0;
}
2020-07-27 22:31:36 +02:00
static void LoadPikaPowerMeter(u8 pikaPower)
2018-09-15 18:01:20 +02:00
{
s16 i;
s16 r3 = 0, r1 = 0;
s16 r4 = 3;
for (i = 0; i < pikaPower; i++, r4++)
{
r3 = 0, r1 = 0;
if (i == 0)
r3 = 1, r1 = 1;
2019-02-07 17:24:09 +01:00
else if (i == 15) // pikaPower meter is full
2018-09-15 18:01:20 +02:00
r3 = 2, r1 = 2;
2020-07-27 22:31:36 +02:00
sSelectedPikaPowerTile[r1] = sPikaPowerTileTable[r3][0];
2019-03-01 00:56:07 +01:00
LoadBgTilemap(2, &sSelectedPikaPowerTile[r1], 2, r4 + 0x40);
2018-09-15 18:01:20 +02:00
}
for (; i < 16; i++, r4++)
{
r3 = 0, r1 = 3;
if (i == 0)
r3 = 1, r1 = 1;
else if (i == 15)
r3 = 2, r1 = 2;
2020-07-27 22:31:36 +02:00
sSelectedPikaPowerTile[r1] = sPikaPowerTileTable[r3][1];
2019-03-01 00:56:07 +01:00
LoadBgTilemap(2, &sSelectedPikaPowerTile[r1], 2, r4 + 0x40);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
gTasks[sSlotMachine->pikaPowerBoltTaskId].data[1] = pikaPower;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
#undef tState
#undef tNumBolts
#undef tSpriteId
#undef tTimer
#undef tAnimating
#define tState data[0]
static void BeginReelTime(void)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
u8 taskId = CreateTask(Task_ReelTime, 7);
Task_ReelTime(taskId);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static bool8 IsReelTimeTaskDone(void)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
if (FindTaskIdByFunc(Task_ReelTime) == TAIL_SENTINEL)
2018-09-15 18:01:20 +02:00
return TRUE;
return FALSE;
}
2020-07-28 23:34:44 +02:00
static void Task_ReelTime(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
// task.data[1] has something to do with the threshold
// task.data[4] says how many pixels to advance the reel
// task.data[5] is a timer
2020-07-28 23:34:44 +02:00
sReelTimeActions[gTasks[taskId].tState](&gTasks[taskId]);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ReelTime_Init(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeSpinsLeft = 0;
2019-02-15 00:06:21 +01:00
sSlotMachine->reeltimePixelOffset = 0;
sSlotMachine->reeltimePosition = 0;
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[1] = 0;
task->data[2] = 30;
2019-02-15 00:06:21 +01:00
task->data[4] = 1280; // reel speed
2018-09-15 18:01:20 +02:00
gSpriteCoordOffsetX = 0;
gSpriteCoordOffsetY = 0;
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
2020-07-27 22:31:36 +02:00
LoadReelTimeWindowTilemap(REG_OFFSET_BG3VOFS, 0);
2020-07-26 07:17:09 +02:00
CreateReelTimeMachineSprites();
CreateReelTimePikachuSprite();
CreateReelTimeNumberSprites();
CreateReelTimeShadowSprites();
2020-07-27 22:31:36 +02:00
CreateReelTimeNumberGapSprite();
2019-02-15 00:06:21 +01:00
GetReeltimeDraw();
2018-09-15 18:01:20 +02:00
StopMapMusic();
PlayNewMapMusic(MUS_BD_TIME);
}
2020-07-28 23:34:44 +02:00
static void ReelTime_WindowEnter(struct Task *task)
2018-09-15 18:01:20 +02:00
{
s16 r3;
gSpriteCoordOffsetX -= 8;
task->data[1] += 8;
r3 = ((task->data[1] + 240) & 0xff) >> 3;
SetGpuReg(REG_OFFSET_BG1HOFS, task->data[1] & 0x1ff);
if (r3 != task->data[2] && task->data[3] <= 18)
{
task->data[2] = r3;
task->data[3] = task->data[1] >> 3;
2020-07-27 22:31:36 +02:00
LoadReelTimeWindowTilemap(r3, task->data[3]);
2018-09-15 18:01:20 +02:00
}
if (task->data[1] >= 200)
{
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[3] = 0;
}
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ReelTime_WaitStartPikachu(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2018-09-15 18:01:20 +02:00
if (++task->data[5] >= 60)
{
2020-07-28 23:34:44 +02:00
task->tState++;
2020-07-26 07:17:09 +02:00
CreateReelTimeBoltSprites();
CreateReelTimePikachuAuraSprites();
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_PikachuSpeedUp1(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
int i;
u8 pikachuAnimIds[ARRAY_COUNT(sReelTimePikachuAnimIds)];
s16 reelTimeBoltDelays[ARRAY_COUNT(sReelTimeBoltDelays)];
s16 pikachuAuraFlashDelays[ARRAY_COUNT(sPikachuAuraFlashDelays)];
2018-09-15 18:01:20 +02:00
2020-07-27 22:31:36 +02:00
memcpy(pikachuAnimIds, sReelTimePikachuAnimIds, sizeof(sReelTimePikachuAnimIds));
memcpy(reelTimeBoltDelays, sReelTimeBoltDelays, sizeof(sReelTimeBoltDelays));
memcpy(pikachuAuraFlashDelays, sPikachuAuraFlashDelays, sizeof(sPikachuAuraFlashDelays));
2018-09-15 18:01:20 +02:00
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2019-02-07 17:24:09 +01:00
// gradually slow down the reel
2018-09-15 18:01:20 +02:00
task->data[4] -= 4;
2020-07-27 22:31:36 +02:00
i = 4 - (task->data[4] >> 8);
SetReelTimeBoltDelay(reelTimeBoltDelays[i]);
SetReelTimePikachuAuraFlashDelay(pikachuAuraFlashDelays[i]);
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], pikachuAnimIds[i]);
2019-02-07 17:24:09 +01:00
// once speed goes below 256, go to next ReelTimeAction and keep the speed level
2018-09-15 18:01:20 +02:00
if (task->data[4] <= 0x100)
{
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[4] = 0x100;
task->data[5] = 0;
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_PikachuSpeedUp2(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2018-09-15 18:01:20 +02:00
if (++task->data[5] >= 80)
{
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[5] = 0;
2020-07-27 22:31:36 +02:00
SetReelTimePikachuAuraFlashDelay(2);
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 3);
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_WaitReel(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2018-09-15 18:01:20 +02:00
task->data[4] = (u8)task->data[4] + 0x80;
if (++task->data[5] >= 80)
{
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[5] = 0;
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_CheckExplode(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2018-09-15 18:01:20 +02:00
task->data[4] = (u8)task->data[4] + 0x40;
if (++task->data[5] >= 40)
{
task->data[5] = 0;
2019-02-07 17:24:09 +01:00
if (sSlotMachine->reelTimeDraw)
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
if (sSlotMachine->reelTimeSpinsLeft <= task->data[6])
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
else if (task->data[6] > 3)
{
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
else if (ShouldReelTimeMachineExplode(task->data[6]))
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
task->tState = 14; // ReelTime_ExplodeMachine
2018-09-15 18:01:20 +02:00
}
task->data[6]++;
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_LandOnOutcome(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-15 00:06:21 +01:00
s16 reeltimePixelOffset = sSlotMachine->reeltimePixelOffset % 20;
if (reeltimePixelOffset)
2018-09-15 18:01:20 +02:00
{
2019-02-15 00:06:21 +01:00
reeltimePixelOffset = AdvanceReeltimeReelToNextTag(task->data[4] >> 8);
2018-09-15 18:01:20 +02:00
task->data[4] = (u8)task->data[4] + 0x40;
}
2019-02-08 01:13:23 +01:00
else if (GetNearbyReelTimeTag(1) != sSlotMachine->reelTimeDraw)
2018-09-15 18:01:20 +02:00
{
2019-02-08 01:13:23 +01:00
AdvanceReeltimeReel(task->data[4] >> 8);
2019-02-15 00:06:21 +01:00
reeltimePixelOffset = sSlotMachine->reeltimePixelOffset % 20;
2018-09-15 18:01:20 +02:00
task->data[4] = (u8)task->data[4] + 0x40;
}
2019-02-15 00:06:21 +01:00
if (reeltimePixelOffset == 0 && GetNearbyReelTimeTag(1) == sSlotMachine->reelTimeDraw)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
task->data[4] = 0; // stop moving
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_PikachuReact(struct Task *task)
2018-09-15 18:01:20 +02:00
{
if (++task->data[4] >= 60)
{
StopMapMusic();
2020-07-26 07:17:09 +02:00
DestroyReelTimeBoltSprites();
DestroyReelTimePikachuAuraSprites();
2020-07-28 23:34:44 +02:00
task->tState++;
2019-02-07 17:24:09 +01:00
if(sSlotMachine->reelTimeDraw == 0)
2018-09-15 18:01:20 +02:00
{
task->data[4] = 0xa0;
2020-07-27 22:31:36 +02:00
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 5);
2018-09-15 18:01:20 +02:00
PlayFanfare(MUS_ME_ZANNEN);
}
else
{
task->data[4] = 0xc0;
2020-07-27 22:31:36 +02:00
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 4);
2020-07-26 07:17:09 +02:00
gSprites[sSlotMachine->reelTimePikachuSpriteId].animCmdIndex = 0;
2018-09-15 18:01:20 +02:00
if (sSlotMachine->pikaPower)
{
2020-07-28 23:34:44 +02:00
ResetPikaPowerBolts();
2018-09-15 18:01:20 +02:00
sSlotMachine->pikaPower = 0;
}
PlayFanfare(MUS_ME_B_SMALL);
}
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_WaitClearPikaPower(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
if ((task->data[4] == 0 || --task->data[4] == 0) && !IsPikaPowerBoltAnimating())
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ReelTime_CloseWindow(struct Task *task)
2018-09-15 18:01:20 +02:00
{
s16 r4;
gSpriteCoordOffsetX -= 8;
task->data[1] += 8;
task->data[3] += 8;
r4 = ((task->data[1] - 8) & 0xff) >> 3;
SetGpuReg(REG_OFFSET_BG1HOFS, task->data[1] & 0x1ff);
if (task->data[3] >> 3 <= 25)
2020-07-27 22:31:36 +02:00
ClearReelTimeWindowTilemap(r4);
2018-09-15 18:01:20 +02:00
else
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ReelTime_DestroySprites(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeSpinsUsed = 0;
sSlotMachine->reelTimeSpinsLeft = sSlotMachine->reelTimeDraw;
2018-09-15 18:01:20 +02:00
gSpriteCoordOffsetX = 0;
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
2019-02-07 17:24:09 +01:00
sSlotMachine->reelIncrement = 8;
2020-07-26 07:17:09 +02:00
DestroyReelTimePikachuSprite();
DestroyReelTimeMachineSprites();
DestroyReelTimeShadowSprites();
2018-09-15 18:01:20 +02:00
PlayNewMapMusic(sSlotMachine->backupMapMusic);
2020-07-26 07:17:09 +02:00
if (sSlotMachine->reelTimeSpinsLeft == 0)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
DestroyTask(FindTaskIdByFunc(Task_ReelTime));
2018-09-15 18:01:20 +02:00
}
else
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
2019-02-22 22:03:35 +01:00
task->data[1] = SlowReelSpeed();
2018-09-15 18:01:20 +02:00
task->data[2] = 0;
task->data[3] = 0;
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_SetReelIncrement(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
if (sSlotMachine->reelIncrement == task->data[1])
2020-07-28 23:34:44 +02:00
task->tState++;
2020-07-27 22:31:36 +02:00
else if (sSlotMachine->reelPixelOffsets[0] % REEL_SYMBOL_HEIGHT == 0 && (++task->data[2]& 0x07) == 0)
2019-02-07 17:24:09 +01:00
sSlotMachine->reelIncrement >>= 1;
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ReelTime_EndSuccess(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (IsDigitalDisplayAnimFinished())
2020-07-28 23:34:44 +02:00
DestroyTask(FindTaskIdByFunc(Task_ReelTime));
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
static void ReelTime_ExplodeMachine(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
DestroyReelTimeMachineSprites();
DestroyReelTimeBoltSprites();
DestroyReelTimePikachuAuraSprites();
CreateReelTimeExplosionSprite();
gSprites[sSlotMachine->reelTimeShadowSpriteIds[0]].invisible = TRUE;
2020-07-27 22:31:36 +02:00
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 5);
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[4] = 4;
task->data[5] = 0;
StopMapMusic();
PlayFanfare(MUS_ME_ZANNEN);
PlaySE(SE_W153);
}
2020-07-28 23:34:44 +02:00
static void ReelTime_WaitExplode(struct Task *task)
2018-09-15 18:01:20 +02:00
{
gSpriteCoordOffsetY = task->data[4];
SetGpuReg(REG_OFFSET_BG1VOFS, task->data[4]);
if (task->data[5] & 0x01)
task->data[4] = -task->data[4];
if ((++task->data[5] & 0x1f) == 0)
task->data[4] >>= 1;
if (task->data[4] == 0)
{
2020-07-26 07:17:09 +02:00
DestroyReelTimeExplosionSprite();
CreateReelTimeDuckSprites();
CreateBrokenReelTimeMachineSprite();
CreateReelTimeSmokeSprite();
gSprites[sSlotMachine->reelTimeShadowSpriteIds[0]].invisible = FALSE;
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
task->data[5] = 0;
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_WaitSmoke(struct Task *task)
2018-09-15 18:01:20 +02:00
{
gSpriteCoordOffsetY = 0;
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
2020-07-27 22:31:36 +02:00
if (IsReelTimeSmokeAnimFinished())
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
task->tState++;
2020-07-26 07:17:09 +02:00
DestroyReelTimeSmokeSprite();
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
static void ReelTime_EndFailure(struct Task *task)
2018-09-15 18:01:20 +02:00
{
gSpriteCoordOffsetX = 0;
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
PlayNewMapMusic(sSlotMachine->backupMapMusic);
2020-07-26 07:17:09 +02:00
DestroyReelTimePikachuSprite();
DestroyBrokenReelTimeMachineSprite();
DestroyReelTimeShadowSprites();
DestroyReelTimeDuckSprites();
2020-07-28 23:34:44 +02:00
DestroyTask(FindTaskIdByFunc(Task_ReelTime));
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void LoadReelTimeWindowTilemap(s16 a0, s16 a1)
2018-09-15 18:01:20 +02:00
{
s16 i;
for (i = 4; i < 15; i++)
{
2020-07-27 22:31:36 +02:00
LoadBgTilemap(1, &sReelTimeWindow_Tilemap[a1 + (i - 4) * 20], 2, 32 * i + a0);
2018-09-15 18:01:20 +02:00
}
}
2020-07-27 22:31:36 +02:00
static void ClearReelTimeWindowTilemap(s16 a0)
2018-09-15 18:01:20 +02:00
{
u8 i;
for (i = 4; i < 15; i++)
{
2020-07-27 22:31:36 +02:00
LoadBgTilemap(1, sEmptyTilemap, 2, 32 * i + a0);
2018-09-15 18:01:20 +02:00
}
}
2020-07-28 23:34:44 +02:00
#undef tState
#define tState data[0]
2020-07-27 22:31:36 +02:00
// Info Box is the screen shown when Select is pressed
2020-07-26 07:17:09 +02:00
static void OpenInfoBox(u8 digDisplayId)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
u8 taskId = CreateTask(RunInfoBoxActions, 1);
2020-07-26 07:17:09 +02:00
gTasks[taskId].data[1] = digDisplayId;
2019-02-07 17:24:09 +01:00
RunInfoBoxActions(taskId);
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static bool8 IsInfoBoxClosed(void)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
if (FindTaskIdByFunc(RunInfoBoxActions) == 0xFF)
2018-09-15 18:01:20 +02:00
return TRUE;
else
return FALSE;
}
2019-02-22 22:03:35 +01:00
static void RunInfoBoxActions(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-28 23:34:44 +02:00
sInfoBoxActions[gTasks[taskId].tState](&gTasks[taskId]);
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void InfoBox_FadeIn(struct Task *task)
2018-09-15 18:01:20 +02:00
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void InfoBox_WaitForFade(struct Task *task)
2018-09-15 18:01:20 +02:00
{
if (!gPaletteFade.active)
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void InfoBox_DrawWindow(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
DestroyDigitalDisplayScene();
LoadInfoBoxTilemap();
AddWindow(&sWindowTemplate_InfoBox);
2018-09-15 18:01:20 +02:00
PutWindowTilemap(1);
FillWindowPixelBuffer(1, PIXEL_FILL(0));
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void InfoBox_AddText(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-12-10 19:48:20 +01:00
AddTextPrinterParameterized3(1, 1, 2, 5, sColors_ReeltimeHelp, 0, gText_ReelTimeHelp);
2018-09-15 18:01:20 +02:00
CopyWindowToVram(1, 3);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0));
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void InfoBox_AwaitPlayerInput(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
if (JOY_NEW(B_BUTTON | SELECT_BUTTON))
2018-09-15 18:01:20 +02:00
{
FillWindowPixelBuffer(1, PIXEL_FILL(0));
2018-09-15 18:01:20 +02:00
ClearWindowTilemap(1);
CopyWindowToVram(1, 1);
RemoveWindow(1);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
}
2020-07-27 22:31:36 +02:00
static void InfoBox_LoadSlotMachineTilemap(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
LoadSlotMachineMenuTilemap();
2018-09-15 18:01:20 +02:00
ShowBg(3);
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void InfoBox_CreateDigitalDisplay(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-26 07:17:09 +02:00
CreateDigitalDisplayScene(task->data[1]);
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void InfoBox_LoadPikaPowerMeter(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
LoadPikaPowerMeter(sSlotMachine->pikaPower);
2018-09-15 18:01:20 +02:00
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0));
2020-07-28 23:34:44 +02:00
task->tState++;
2018-09-15 18:01:20 +02:00
}
2019-02-22 22:03:35 +01:00
static void InfoBox_FreeTask(struct Task *task)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
DestroyTask(FindTaskIdByFunc(RunInfoBoxActions));
2018-09-15 18:01:20 +02:00
}
2020-07-28 23:34:44 +02:00
#undef tState
2020-07-27 22:31:36 +02:00
#define sWaitForAnim data[7]
static void CreateDigitalDisplayTask(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
struct Task *task;
2020-07-27 22:31:36 +02:00
i = CreateTask(Task_DigitalDisplay, 3);
sSlotMachine->digDisplayTaskId = i;
2019-02-22 22:03:35 +01:00
task = &gTasks[i];
2018-09-15 18:01:20 +02:00
task->data[1] = -1;
2020-07-26 07:17:09 +02:00
for (i = 4; i < NUM_TASK_DATA; i++)
2018-09-15 18:01:20 +02:00
task->data[i] = MAX_SPRITES;
}
2020-07-26 07:17:09 +02:00
// For the panel on the right side of the slot screen
static void CreateDigitalDisplayScene(u8 id)
2018-09-15 18:01:20 +02:00
{
u8 i;
struct Task *task;
2020-07-27 22:31:36 +02:00
DestroyDigitalDisplayScene();
2018-09-15 18:01:20 +02:00
2020-07-27 22:31:36 +02:00
task = &gTasks[sSlotMachine->digDisplayTaskId];
2020-07-26 07:17:09 +02:00
task->data[1] = id;
2018-09-15 18:01:20 +02:00
2020-07-26 07:17:09 +02:00
for (i = 0; sDigitalDisplayScenes[id][i].spriteTemplateId != 255; i++)
2018-09-15 18:01:20 +02:00
{
u8 spriteId;
2020-07-26 07:17:09 +02:00
spriteId = CreateStdDigitalDisplaySprite(
sDigitalDisplayScenes[id][i].spriteTemplateId,
2020-07-27 22:31:36 +02:00
sDigitalDisplayScenes[id][i].dispInfoId,
sDigitalDisplayScenes[id][i].spriteId
2018-09-15 18:01:20 +02:00
);
task->data[4 + i] = spriteId;
}
}
2020-07-27 22:31:36 +02:00
static void AddDigitalDisplaySprite(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 spriteId)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
struct Task *task = &gTasks[sSlotMachine->digDisplayTaskId];
2020-07-26 07:17:09 +02:00
for (i = 4; i < NUM_TASK_DATA; i++)
2018-09-15 18:01:20 +02:00
{
if (task->data[i] == MAX_SPRITES)
{
2020-07-27 22:31:36 +02:00
task->data[i] = CreateDigitalDisplaySprite(templateIdx, callback, x, y, spriteId);
2018-09-15 18:01:20 +02:00
break;
}
}
}
2020-07-27 22:31:36 +02:00
static void DestroyDigitalDisplayScene(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
struct Task *task = &gTasks[sSlotMachine->digDisplayTaskId];
if ((u16)task->data[1] != 0xFFFF)
2020-07-27 22:31:36 +02:00
sDigitalDisplaySceneExitCallbacks[task->data[1]]();
2020-07-26 07:17:09 +02:00
for (i = 4; i < NUM_TASK_DATA; i++)
2018-09-15 18:01:20 +02:00
{
if (task->data[i] != MAX_SPRITES)
{
2019-03-01 00:56:07 +01:00
DestroySprite(&gSprites[task->data[i]]);
2018-09-15 18:01:20 +02:00
task->data[i] = MAX_SPRITES;
}
}
}
2020-07-27 22:31:36 +02:00
static bool8 IsDigitalDisplayAnimFinished(void)
2018-09-15 18:01:20 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
struct Task *task = &gTasks[sSlotMachine->digDisplayTaskId];
2020-07-26 07:17:09 +02:00
for (i = 4; i < NUM_TASK_DATA; i++)
2018-09-15 18:01:20 +02:00
{
if (task->data[i] != MAX_SPRITES)
{
2020-07-27 22:31:36 +02:00
if (gSprites[task->data[i]].sWaitForAnim)
2018-09-15 18:01:20 +02:00
return FALSE;
}
}
return TRUE;
}
2020-07-27 22:31:36 +02:00
static void Task_DigitalDisplay(u8 taskId)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
sDigitalDisplayActions[gTasks[taskId].data[0]](&gTasks[taskId]);
2018-09-15 18:01:20 +02:00
}
2020-07-27 22:31:36 +02:00
static void DigitalDisplay_Idle(struct Task *task)
2018-09-15 18:01:20 +02:00
{
}
2020-07-26 07:17:09 +02:00
static void CreateReelSymbolSprites(void)
2018-09-15 18:01:20 +02:00
{
s16 i;
s16 j;
s16 x;
for (i = 0, x = 0x30; i < 3; i++, x += 0x28)
{
for (j = 0; j < 120; j += 24)
{
2020-07-26 07:17:09 +02:00
struct Sprite *sprite = gSprites + CreateSprite(&sSpriteTemplate_ReelSymbol, x, 0, 14);
2018-09-15 18:01:20 +02:00
sprite->oam.priority = 3;
sprite->data[0] = i;
sprite->data[1] = j;
sprite->data[3] = -1;
}
}
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelSymbol(struct Sprite *sprite)
2018-09-15 18:01:20 +02:00
{
2019-02-07 17:24:09 +01:00
sprite->data[2] = sSlotMachine->reelPixelOffsets[sprite->data[0]] + sprite->data[1];
2018-09-15 18:01:20 +02:00
sprite->data[2] %= 120;
2019-02-08 01:13:23 +01:00
sprite->pos1.y = sSlotMachine->reelPixelOffsetsWhileStopping[sprite->data[0]] + 28 + sprite->data[2];
2020-05-20 22:36:00 +02:00
sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagAtRest(sprite->data[0], sprite->data[2] / 24));
2018-09-15 18:01:20 +02:00
SetSpriteSheetFrameTileNum(sprite);
}
2020-07-26 07:17:09 +02:00
static void CreateCreditPayoutNumberSprites(void)
2018-09-15 18:01:20 +02:00
{
s16 i;
s16 x;
2020-07-26 07:17:09 +02:00
// Credit number sprite
2020-01-26 10:02:15 +01:00
for (x = 203, i = 1; i <= MAX_COINS; i *= 10, x -= 7)
2020-07-26 07:17:09 +02:00
CreateCoinNumberSprite(x, 23, FALSE, i);
// Payout number sprite
2020-01-26 10:02:15 +01:00
for (x = 235, i = 1; i <= MAX_COINS; i *= 10, x -= 7)
2020-07-26 07:17:09 +02:00
CreateCoinNumberSprite(x, 23, TRUE, i);
2018-09-15 18:01:20 +02:00
}
2020-07-26 07:17:09 +02:00
static void CreateCoinNumberSprite(s16 x, s16 y, bool8 isPayout, s16 a3)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
struct Sprite *sprite = &gSprites[CreateSprite(&sSpriteTemplate_CoinNumber, x, y, 13)];
2018-09-15 18:01:20 +02:00
sprite->oam.priority = 2;
2020-07-26 07:17:09 +02:00
sprite->data[0] = isPayout;
2018-09-15 18:01:20 +02:00
sprite->data[1] = a3;
sprite->data[2] = a3 * 10;
sprite->data[3] = -1;
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_CoinNumber(struct Sprite *sprite)
2018-09-15 18:01:20 +02:00
{
u16 tag = sSlotMachine->coins;
if (sprite->data[0])
tag = sSlotMachine->payout;
if (sprite->data[3] != tag)
{
sprite->data[3] = tag;
tag %= (u16)sprite->data[2];
tag /= (u16)sprite->data[1];
tag += 7;
sprite->sheetTileStart = GetSpriteTileStartByTag(tag);
SetSpriteSheetFrameTileNum(sprite);
}
}
2020-07-26 07:17:09 +02:00
static void CreateReelBackgroundSprite(void)
2018-09-15 18:01:20 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelBackground, 88, 72, 15);
2018-09-15 18:01:20 +02:00
gSprites[spriteId].oam.priority = 3;
2020-07-27 22:31:36 +02:00
SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_ReelBackground);
2018-09-15 18:01:20 +02:00
}
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
static void CreateReelTimePikachuSprite(void)
2018-09-15 22:59:45 +02:00
{
struct SpriteTemplate spriteTemplate;
u8 spriteId;
2020-07-26 07:17:09 +02:00
if (sImageTable_ReelTimePikachu == NULL)
sImageTable_ReelTimePikachu = AllocZeroed(sizeof(struct SpriteFrameImage) * 5);
sImageTable_ReelTimePikachu[0].data = sReelTimeGfxPtr + (0 * 0x800);
sImageTable_ReelTimePikachu[0].size = 0x800;
sImageTable_ReelTimePikachu[1].data = sReelTimeGfxPtr + (1 * 0x800);
sImageTable_ReelTimePikachu[1].size = 0x800;
sImageTable_ReelTimePikachu[2].data = sReelTimeGfxPtr + (2 * 0x800);
sImageTable_ReelTimePikachu[2].size = 0x800;
sImageTable_ReelTimePikachu[3].data = sReelTimeGfxPtr + (3 * 0x800);
sImageTable_ReelTimePikachu[3].size = 0x800;
sImageTable_ReelTimePikachu[4].data = sReelTimeGfxPtr + (4 * 0x800);
sImageTable_ReelTimePikachu[4].size = 0x800;
spriteTemplate = sSpriteTemplate_ReelTimePikachu;
spriteTemplate.images = sImageTable_ReelTimePikachu;
2018-09-15 22:59:45 +02:00
spriteId = CreateSprite(&spriteTemplate, 280, 80, 1);
gSprites[spriteId].oam.priority = 1;
gSprites[spriteId].coordOffsetEnabled = TRUE;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimePikachuSpriteId = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimePikachuSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
DestroySprite(&gSprites[sSlotMachine->reelTimePikachuSpriteId]);
2020-07-26 07:17:09 +02:00
if (sImageTable_ReelTimePikachu != NULL)
FREE_AND_SET_NULL(sImageTable_ReelTimePikachu);
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimePikachu(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
sprite->pos2.y = sprite->pos2.x = 0;
if (sprite->animNum == 4)
{
sprite->pos2.y = sprite->pos2.x = 8;
if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0))
sprite->pos2.y = -8;
}
}
2020-07-26 07:17:09 +02:00
static void CreateReelTimeMachineSprites(void)
2018-09-15 22:59:45 +02:00
{
struct SpriteTemplate spriteTemplate;
u8 spriteId;
struct Sprite *sprite;
2020-07-26 07:17:09 +02:00
if (sImageTable_ReelTimeMachineAntennae == NULL)
sImageTable_ReelTimeMachineAntennae = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
sImageTable_ReelTimeMachineAntennae[0].data = sReelTimeGfxPtr + 0x2800;
sImageTable_ReelTimeMachineAntennae[0].size = 0x300;
spriteTemplate = sSpriteTemplate_ReelTimeMachineAntennae;
spriteTemplate.images = sImageTable_ReelTimeMachineAntennae;
2018-09-15 22:59:45 +02:00
spriteId = CreateSprite(&spriteTemplate, 368, 52, 7);
sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
2020-07-26 07:17:09 +02:00
SetSubspriteTables(sprite, sSubspriteTable_ReelTimeMachineAntennae);
sSlotMachine->reelTimeMachineSpriteIds[0] = spriteId;
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
if (sImageTable_ReelTimeMachine == NULL)
sImageTable_ReelTimeMachine = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
sImageTable_ReelTimeMachine[0].data = sReelTimeGfxPtr + 0x2800 + 0x300;
sImageTable_ReelTimeMachine[0].size = 0x500;
spriteTemplate = sSpriteTemplate_ReelTimeMachine;
spriteTemplate.images = sImageTable_ReelTimeMachine;
2018-09-15 22:59:45 +02:00
spriteId = CreateSprite(&spriteTemplate, 368, 84, 7);
sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
2020-07-26 07:17:09 +02:00
SetSubspriteTables(sprite, sSubspriteTable_ReelTimeMachine);
sSlotMachine->reelTimeMachineSpriteIds[1] = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void CreateBrokenReelTimeMachineSprite(void)
2018-09-15 22:59:45 +02:00
{
struct SpriteTemplate spriteTemplate;
u8 spriteId;
struct Sprite *sprite;
2020-07-26 07:17:09 +02:00
if (sImageTable_BrokenReelTimeMachine == NULL)
sImageTable_BrokenReelTimeMachine = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
sImageTable_BrokenReelTimeMachine[0].data = sReelTimeGfxPtr + 0x3000;
sImageTable_BrokenReelTimeMachine[0].size = 0x600;
spriteTemplate = sSpriteTemplate_BrokenReelTimeMachine;
spriteTemplate.images = sImageTable_BrokenReelTimeMachine;
2020-07-27 22:31:36 +02:00
spriteId = CreateSprite(&spriteTemplate, 168 - gSpriteCoordOffsetX, 80, 7);
2018-09-15 22:59:45 +02:00
sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
2020-07-26 07:17:09 +02:00
SetSubspriteTables(sprite, sSubspriteTable_BrokenReelTimeMachine);
sSlotMachine->reelTimeBrokenMachineSpriteId = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void CreateReelTimeNumberSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
s16 r5;
2020-07-26 07:17:09 +02:00
for (i = 0, r5 = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeNumberSpriteIds); i++, r5 += 20)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeNumbers, 368, 0, 10);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
sprite->data[7] = r5;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeNumberSpriteIds[i] = spriteId;
2018-09-15 22:59:45 +02:00
}
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimeNumbers(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2019-02-15 00:06:21 +01:00
s16 r0 = (u16)(sSlotMachine->reeltimePixelOffset + sprite->data[7]);
2018-09-15 22:59:45 +02:00
r0 %= 40;
sprite->pos1.y = r0 + 59;
2019-02-08 01:13:23 +01:00
StartSpriteAnimIfDifferent(sprite, GetNearbyReelTimeTag(r0 / 20));
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void CreateReelTimeShadowSprites(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeShadow, 368, 100, 9);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = 1;
2020-07-26 07:17:09 +02:00
SetSubspriteTables(sprite, sSubspriteTable_ReelTimeShadow);
sSlotMachine->reelTimeShadowSpriteIds[0] = spriteId;
2018-09-15 22:59:45 +02:00
2020-07-27 22:31:36 +02:00
spriteId = CreateSprite(&sSpriteTemplate_ReelTimeShadow, 288, 104, 4);
2018-09-15 22:59:45 +02:00
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = 1;
2020-07-26 07:17:09 +02:00
SetSubspriteTables(sprite, sSubspriteTable_ReelTimeShadow);
sSlotMachine->reelTimeShadowSpriteIds[1] = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
// Creates a small black bar on the Reel Time machine to fill the gap between the numbers
static void CreateReelTimeNumberGapSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeNumberGap, 368, 76, 11);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = 1;
2020-07-27 22:31:36 +02:00
SetSubspriteTables(sprite, sSubspriteTable_ReelTimeNumberGap);
sSlotMachine->reelTimeNumberGapSpriteId = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeMachineSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
DestroySprite(&gSprites[sSlotMachine->reelTimeNumberGapSpriteId]);
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeMachineSpriteIds); i++)
DestroySprite(&gSprites[sSlotMachine->reelTimeMachineSpriteIds[i]]);
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
if (sImageTable_ReelTimeMachineAntennae != NULL)
FREE_AND_SET_NULL(sImageTable_ReelTimeMachineAntennae);
if (sImageTable_ReelTimeMachine != NULL)
FREE_AND_SET_NULL(sImageTable_ReelTimeMachine);
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeNumberSpriteIds); i++)
DestroySprite(&gSprites[sSlotMachine->reelTimeNumberSpriteIds[i]]);
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeShadowSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeShadowSpriteIds); i++)
DestroySprite(&gSprites[sSlotMachine->reelTimeShadowSpriteIds[i]]);
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyBrokenReelTimeMachineSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-26 07:17:09 +02:00
DestroySprite(&gSprites[sSlotMachine->reelTimeBrokenMachineSpriteId]);
if (sImageTable_BrokenReelTimeMachine != NULL)
FREE_AND_SET_NULL(sImageTable_BrokenReelTimeMachine);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
#define sDelayTimer data[0]
#define sXDir data[1]
#define sYDir data[2]
#define sCounter data[3]
#define sDelay data[7]
2020-07-26 07:17:09 +02:00
static void CreateReelTimeBoltSprites(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeBolt, 152, 32, 5);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->hFlip = TRUE;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeBoltSpriteIds[0] = spriteId;
2020-07-27 22:31:36 +02:00
sprite->sDelayTimer = 8;
sprite->sXDir = -1;
sprite->sYDir = -1;
sprite->sDelay = 32;
2018-09-15 22:59:45 +02:00
2020-07-27 22:31:36 +02:00
spriteId = CreateSprite(&sSpriteTemplate_ReelTimeBolt, 184, 32, 5);
2018-09-15 22:59:45 +02:00
sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeBoltSpriteIds[1] = spriteId;
2020-07-27 22:31:36 +02:00
sprite->sXDir = 1;
sprite->sYDir = -1;
sprite->sDelay = 32;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimeBolt(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
if (sprite->sDelayTimer != 0)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sDelayTimer--;
2018-09-15 22:59:45 +02:00
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->invisible = TRUE;
}
else
{
sprite->invisible = FALSE;
2020-07-27 22:31:36 +02:00
sprite->pos2.x += sprite->sXDir;
sprite->pos2.y += sprite->sYDir;
if (++sprite->sCounter >= 8)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sDelayTimer = sprite->sDelay;
sprite->sCounter = 0;
2018-09-15 22:59:45 +02:00
}
}
}
2020-07-27 22:31:36 +02:00
static void SetReelTimeBoltDelay(s16 delay)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
gSprites[sSlotMachine->reelTimeBoltSpriteIds[0]].sDelay = delay;
gSprites[sSlotMachine->reelTimeBoltSpriteIds[1]].sDelay = delay;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeBoltSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeBoltSpriteIds); i++)
DestroySprite(&gSprites[sSlotMachine->reelTimeBoltSpriteIds[i]]);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
#undef sDelayTimer
#undef sXDir
#undef sYDir
#undef sCounter
#undef sDelay
#define sFlashPal data[0]
#define sColorIdx data[5]
#define sDelayTimer data[6]
#define sDelay data[7]
2020-07-26 07:17:09 +02:00
static void CreateReelTimePikachuAuraSprites(void)
2018-09-15 22:59:45 +02:00
{
2020-07-26 07:17:09 +02:00
// Left half of electricity orb
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimePikachuAura, 72, 80, 3);
2018-09-15 22:59:45 +02:00
gSprites[spriteId].oam.priority = 1;
2020-07-27 22:31:36 +02:00
gSprites[spriteId].sFlashPal = TRUE; // Only one of them needs to do the flashing, they share the palette
gSprites[spriteId].sColorIdx = 0;
gSprites[spriteId].sDelayTimer = 16;
gSprites[spriteId].sDelay = 8;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimePikachuAuraSpriteIds[0] = spriteId;
2018-09-15 22:59:45 +02:00
2020-07-26 07:17:09 +02:00
// Right half
2020-07-27 22:31:36 +02:00
spriteId = CreateSprite(&sSpriteTemplate_ReelTimePikachuAura, 104, 80, 3);
2018-09-15 22:59:45 +02:00
gSprites[spriteId].oam.priority = 1;
gSprites[spriteId].hFlip = TRUE;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimePikachuAuraSpriteIds[1] = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimePikachuAura(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 colors[] = {16, 0};
if (sprite->sFlashPal && --sprite->sDelayTimer <= 0)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(PALTAG_PIKA_AURA) << 4) + 0x103, colors[sprite->sColorIdx], colors[sprite->sColorIdx], colors[sprite->sColorIdx]);
++sprite->sColorIdx;
sprite->sColorIdx &= 1;
sprite->sDelayTimer = sprite->sDelay;
2018-09-15 22:59:45 +02:00
}
}
2020-07-27 22:31:36 +02:00
static void SetReelTimePikachuAuraFlashDelay(s16 delay)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
gSprites[sSlotMachine->reelTimePikachuAuraSpriteIds[0]].sDelay = delay;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimePikachuAuraSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(PALTAG_PIKA_AURA) << 4) + 0x103, 0, 0, 0);
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimePikachuAuraSpriteIds); i++)
DestroySprite(&gSprites[sSlotMachine->reelTimePikachuAuraSpriteIds[i]]);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
#undef sFlashPal
#undef sColorIdx
#undef sDelayTimer
#undef sDelay
2020-07-26 07:17:09 +02:00
static void CreateReelTimeExplosionSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeExplosion, 168, 80, 6);
2018-09-15 22:59:45 +02:00
gSprites[spriteId].oam.priority = 1;
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeExplosionSpriteId = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimeExplosion(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
sprite->pos2.y = gSpriteCoordOffsetY;
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeExplosionSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-26 07:17:09 +02:00
DestroySprite(&gSprites[sSlotMachine->reelTimeExplosionSpriteId]);
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
// The "confusion" ducks that circle Pikachu if the Reel Time machine explodes
static void CreateReelTimeDuckSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
u16 sp[] = {0x0, 0x40, 0x80, 0xC0};
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeDuckSpriteIds); i++)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeDuck, 80 - gSpriteCoordOffsetX, 68, 0);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
sprite->data[0] = sp[i];
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeDuckSpriteIds[i] = spriteId;
2018-09-15 22:59:45 +02:00
}
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimeDuck(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
sprite->data[0] -= 2;
sprite->data[0] &= 0xff;
sprite->pos2.x = Cos(sprite->data[0], 20);
sprite->pos2.y = Sin(sprite->data[0], 6);
sprite->subpriority = 0;
if (sprite->data[0] >= 0x80)
{
sprite->subpriority = 2;
}
if (++sprite->data[1] >= 16)
{
sprite->hFlip ^= 1;
sprite->data[1] = 0;
}
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeDuckSprites(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
2020-07-26 07:17:09 +02:00
for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimeDuckSpriteIds); i++)
2018-09-15 22:59:45 +02:00
{
2020-07-26 07:17:09 +02:00
DestroySprite(&gSprites[sSlotMachine->reelTimeDuckSpriteIds[i]]);
2018-09-15 22:59:45 +02:00
}
}
2020-07-27 22:31:36 +02:00
#define sState data[0]
#define sMoveY data[1]
#define sTimer data[2]
#define sAnimFinished data[7]
2020-07-26 07:17:09 +02:00
static void CreateReelTimeSmokeSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_ReelTimeSmoke, 168, 60, 8);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
InitSpriteAffineAnim(sprite);
2020-07-26 07:17:09 +02:00
sSlotMachine->reelTimeSmokeSpriteId = spriteId;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_ReelTimeSmoke(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
if (sprite->sState == 0)
2018-09-15 22:59:45 +02:00
{
if (sprite->affineAnimEnded)
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
else if (sprite->sState == 1)
2018-09-15 22:59:45 +02:00
{
sprite->invisible ^= 1;
2020-07-27 22:31:36 +02:00
if (++sprite->sTimer >= 24)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sTimer = 0;
2018-09-15 22:59:45 +02:00
}
}
else
{
sprite->invisible = TRUE;
2020-07-27 22:31:36 +02:00
if (++sprite->sTimer >= 16)
sprite->sAnimFinished = TRUE;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
sprite->sMoveY &= 0xff;
sprite->sMoveY += 16;
sprite->pos2.y -= (sprite->sMoveY >> 8);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static u8 IsReelTimeSmokeAnimFinished(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
return gSprites[sSlotMachine->reelTimeSmokeSpriteId].sAnimFinished;
2018-09-15 22:59:45 +02:00
}
2020-07-26 07:17:09 +02:00
static void DestroyReelTimeSmokeSprite(void)
2018-09-15 22:59:45 +02:00
{
2020-07-26 07:17:09 +02:00
struct Sprite *sprite = &gSprites[sSlotMachine->reelTimeSmokeSpriteId];
2018-09-15 22:59:45 +02:00
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
2020-07-27 22:31:36 +02:00
#undef sState
#undef sMoveY
#undef sTimer
#undef sAnimFinished
2020-07-26 07:17:09 +02:00
static u8 CreatePikaPowerBoltSprite(s16 x, s16 y)
2018-09-15 22:59:45 +02:00
{
2020-07-26 07:17:09 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_PikaPowerBolt, x, y, 12);
2018-09-15 22:59:45 +02:00
struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 2;
sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
InitSpriteAffineAnim(sprite);
return spriteId;
}
2020-07-26 07:17:09 +02:00
static void SpriteCB_PikaPowerBolt(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
if (sprite->affineAnimEnded)
2020-07-28 23:34:44 +02:00
sprite->data[7] = TRUE;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void DestroyPikaPowerBoltSprite(u8 spriteId)
2018-09-15 22:59:45 +02:00
{
struct Sprite *sprite = &gSprites[spriteId];
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
2020-07-27 22:31:36 +02:00
static u8 CreateStdDigitalDisplaySprite(u8 templateIdx, u8 dispInfoId, s16 spriteId)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
return CreateDigitalDisplaySprite(templateIdx, sDigitalDisplay_SpriteCallbacks[dispInfoId], sDigitalDisplay_SpriteCoords[dispInfoId][0], sDigitalDisplay_SpriteCoords[dispInfoId][1], spriteId);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
#define sState data[0]
#define sCounter data[1]
#define sSpriteId data[6]
static u8 CreateDigitalDisplaySprite(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 internalSpriteId)
2018-09-15 22:59:45 +02:00
{
struct SpriteTemplate spriteTemplate;
u8 spriteId;
struct Sprite *sprite;
2020-07-26 07:17:09 +02:00
spriteTemplate = *sSpriteTemplates_DigitalDisplay[templateIdx];
spriteTemplate.images = sImageTables_DigitalDisplay[templateIdx];
2018-09-15 22:59:45 +02:00
spriteId = CreateSprite(&spriteTemplate, x, y, 16);
sprite = &gSprites[spriteId];
sprite->oam.priority = 3;
sprite->callback = callback;
2020-07-27 22:31:36 +02:00
sprite->sSpriteId = internalSpriteId;
sprite->sWaitForAnim = TRUE;
2020-07-26 07:17:09 +02:00
if (sSubspriteTables_DigitalDisplay[templateIdx])
SetSubspriteTables(sprite, sSubspriteTables_DigitalDisplay[templateIdx]);
2018-09-15 22:59:45 +02:00
return spriteId;
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_Static(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_Smoke(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
s16 targetX[] = {4, -4, 4, -4};
s16 targetY[] = {4, 4, -4, -4};
2018-09-15 22:59:45 +02:00
2020-07-27 22:31:36 +02:00
if (sprite->sCounter++ >= 16)
2018-09-15 22:59:45 +02:00
{
sprite->subspriteTableNum ^= 1;
2020-07-27 22:31:36 +02:00
sprite->sCounter = 0;
2018-09-15 22:59:45 +02:00
}
sprite->pos2.x = 0;
sprite->pos2.y = 0;
if (sprite->subspriteTableNum != 0)
{
2020-07-27 22:31:36 +02:00
sprite->pos2.x = targetX[sprite->sSpriteId];
sprite->pos2.y = targetY[sprite->sSpriteId];
2018-09-15 22:59:45 +02:00
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_SmokeNE(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
sprite->hFlip = TRUE;
2020-07-27 22:31:36 +02:00
SpriteCB_DigitalDisplay_Smoke(sprite);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_SmokeSW(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
sprite->vFlip = TRUE;
2020-07-27 22:31:36 +02:00
SpriteCB_DigitalDisplay_Smoke(sprite);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_SmokeSE(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
sprite->hFlip = TRUE;
sprite->vFlip = TRUE;
2020-07-27 22:31:36 +02:00
SpriteCB_DigitalDisplay_Smoke(sprite);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
// The word "Reel" in Reel Time
static void SpriteCB_DigitalDisplay_Reel(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
sprite->pos1.x += 4;
if (sprite->pos1.x >= 0xd0)
{
sprite->pos1.x = 0xd0;
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
}
break;
case 1:
2020-07-27 22:31:36 +02:00
if (++sprite->sCounter > 90)
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 2:
sprite->pos1.x += 4;
if (sprite->pos1.x >= 0x110)
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 3:
2020-07-27 22:31:36 +02:00
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
break;
}
}
2020-07-27 22:31:36 +02:00
// The word "Time" in Reel Time
static void SpriteCB_DigitalDisplay_Time(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
sprite->pos1.x -= 4;
if (sprite->pos1.x <= 0xd0)
{
sprite->pos1.x = 0xd0;
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
}
break;
case 1:
2020-07-27 22:31:36 +02:00
if (++sprite->sCounter > 90)
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 2:
sprite->pos1.x -= 4;
if (sprite->pos1.x <= 0x90)
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 3:
2020-07-27 22:31:36 +02:00
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
break;
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_ReelTimeNumber(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
2020-07-26 07:17:09 +02:00
StartSpriteAnim(sprite, sSlotMachine->reelTimeSpinsLeft - 1);
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
// fallthrough
case 1:
2020-07-27 22:31:36 +02:00
if (++sprite->sCounter >= 4)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sCounter = 0;
2018-09-15 22:59:45 +02:00
}
break;
case 2:
sprite->pos1.x += 4;
if (sprite->pos1.x >= 0xd0)
{
sprite->pos1.x = 0xd0;
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
}
break;
case 3:
2020-07-27 22:31:36 +02:00
if (++sprite->sCounter > 90)
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 4:
sprite->pos1.x += 4;
if (sprite->pos1.x >= 0xf8)
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 5:
2020-07-27 22:31:36 +02:00
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
break;
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_PokeballRocking(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
sprite->animPaused = TRUE;
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
// fallthrough
case 1:
sprite->pos1.y += 8;
if (sprite->pos1.y >= 0x70)
{
sprite->pos1.y = 0x70;
2020-07-27 22:31:36 +02:00
sprite->sCounter = 16;
sprite->sState++;
2018-09-15 22:59:45 +02:00
}
break;
case 2:
if (sprite->data[2] == 0)
{
2020-07-27 22:31:36 +02:00
sprite->pos1.y -= sprite->sCounter;
sprite->sCounter = -sprite->sCounter;
2018-09-15 22:59:45 +02:00
if (++sprite->data[3] >= 2)
{
2020-07-27 22:31:36 +02:00
sprite->sCounter >>= 2;
2018-09-15 22:59:45 +02:00
sprite->data[3] = 0;
2020-07-27 22:31:36 +02:00
if (sprite->sCounter == 0)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
sprite->animPaused = FALSE;
}
}
}
sprite->data[2]++;
sprite->data[2] &= 0x07;
break;
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_Stop(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
2020-07-27 22:31:36 +02:00
if (++sprite->sCounter > 8)
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 1:
sprite->pos1.y += 2;
if (sprite->pos1.y >= 0x30)
{
sprite->pos1.y = 0x30;
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
}
break;
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_AButtonStop(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
sprite->invisible = TRUE;
2020-07-27 22:31:36 +02:00
if (++sprite->sCounter > 0x20)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sCounter = 5;
2018-09-15 22:59:45 +02:00
sprite->oam.mosaic = TRUE;
sprite->invisible = FALSE;
StartSpriteAnim(sprite, 1);
2020-07-27 22:31:36 +02:00
SetGpuReg(REG_OFFSET_MOSAIC, ((sprite->sCounter << 4) | sprite->sCounter) << 8);
2018-09-15 22:59:45 +02:00
}
break;
case 1:
2020-07-27 22:31:36 +02:00
sprite->sCounter -= (sprite->data[2] >> 8);
if (sprite->sCounter < 0)
sprite->sCounter = 0;
SetGpuReg(REG_OFFSET_MOSAIC, ((sprite->sCounter << 4) | sprite->sCounter) << 8);
2018-09-15 22:59:45 +02:00
sprite->data[2] &= 0xff;
sprite->data[2] += 0x80;
2020-07-27 22:31:36 +02:00
if (sprite->sCounter == 0)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
sprite->oam.mosaic = FALSE;
StartSpriteAnim(sprite, 0);
}
break;
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_PokeballShining(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
if (sprite->sCounter < 3)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
LoadPalette(sPokeballShiningPalTable[sprite->sCounter], (IndexOfSpritePaletteTag(PALTAG_DIG_DISPLAY) << 4) + 0x100, 32);
2018-09-15 22:59:45 +02:00
if (++sprite->data[2] >= 4)
{
sprite->data[1]++;
sprite->data[2] = 0;
}
}
else
{
2020-07-27 22:31:36 +02:00
LoadPalette(sPokeballShiningPalTable[sprite->sCounter], (IndexOfSpritePaletteTag(PALTAG_DIG_DISPLAY) << 4) + 0x100, 32);
2018-09-15 22:59:45 +02:00
if (++sprite->data[2] >= 25)
{
2020-07-27 22:31:36 +02:00
sprite->sCounter = 0;
2018-09-15 22:59:45 +02:00
sprite->data[2] = 0;
}
}
StartSpriteAnimIfDifferent(sprite, 1);
2020-07-27 22:31:36 +02:00
sprite->sWaitForAnim = FALSE;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_RegBonus(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
// Elements in array correspond to R E G B O N U S
s16 letterXOffset[] = { 0, -40, 0, 0, 48, 0, 24, 0};
s16 letterYOffset[] = {-32, 0, -32, -48, 0, -48, 0, -48};
s16 letterDelay[] = { 16, 12, 16, 0, 0, 4, 8, 8};
2018-09-15 22:59:45 +02:00
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
2020-07-27 22:31:36 +02:00
sprite->pos2.x = letterXOffset[sprite->sSpriteId];
sprite->pos2.y = letterYOffset[sprite->sSpriteId];
sprite->sCounter = letterDelay[sprite->sSpriteId];
sprite->sState++;
2018-09-15 22:59:45 +02:00
// fallthrough
case 1:
2020-07-27 22:31:36 +02:00
if (sprite->sCounter-- == 0)
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
case 2:
if (sprite->pos2.x > 0)
sprite->pos2.x -= 4;
else if (sprite->pos2.x < 0)
sprite->pos2.x += 4;
if (sprite->pos2.y > 0)
sprite->pos2.y -= 4;
else if (sprite->pos2.y < 0)
sprite->pos2.y += 4;
if (sprite->pos2.x == 0 && sprite->pos2.y == 0)
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
break;
}
}
2020-07-27 22:31:36 +02:00
static void SpriteCB_DigitalDisplay_BigBonus(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24};
2020-07-27 22:31:36 +02:00
if (sprite->sState == 0)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sprite->sCounter = 12;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
sprite->pos2.x = Cos(sp0[sprite->sSpriteId], sprite->sCounter);
sprite->pos2.y = Sin(sp0[sprite->sSpriteId], sprite->sCounter);
if (sprite->sCounter != 0)
sprite->sCounter--;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
// For the A Button prompt when inserting bet
// Initially no sprite until after the first bet
static void SpriteCB_DigitalDisplay_AButtonStart(struct Sprite *sprite)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
switch (sprite->sState)
2018-09-15 22:59:45 +02:00
{
case 0:
2020-07-27 22:31:36 +02:00
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_CLR;
sSlotMachine->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
sSlotMachine->win0v = WIN_RANGE(32, 136);
2018-09-15 22:59:45 +02:00
sprite->invisible = TRUE;
2020-07-27 22:31:36 +02:00
sprite->sState++;
2018-09-15 22:59:45 +02:00
// fallthrough
case 1:
2020-07-27 22:31:36 +02:00
sprite->sCounter += 2;
sprite->data[2] = sprite->sCounter + 176;
sprite->data[3] = DISPLAY_WIDTH - sprite->sCounter;
if (sprite->data[2] > 208)
sprite->data[2] = 208;
if (sprite->data[3] < 208)
sprite->data[3] = 208;
2018-09-15 22:59:45 +02:00
sSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3];
2020-07-27 22:31:36 +02:00
if (sprite->sCounter > 51)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
2018-09-15 22:59:45 +02:00
}
break;
case 2:
if (sSlotMachine->bet == 0)
break;
2020-07-27 22:31:36 +02:00
AddDigitalDisplaySprite(DIG_SPRITE_A_BUTTON, SpriteCallbackDummy, 208, 116, 0);
sSlotMachine->win0h = WIN_RANGE(192, 224);
sSlotMachine->win0v = WIN_RANGE(104, 128);
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_CLR;
sprite->sState++;
sprite->sCounter = 0;
2018-09-15 22:59:45 +02:00
// fallthrough
case 3:
2020-07-27 22:31:36 +02:00
sprite->sCounter += 2;
sprite->data[2] = sprite->sCounter + 192;
sprite->data[3] = DISPLAY_WIDTH - 16 - sprite->sCounter;
if (sprite->data[2] > 208)
sprite->data[2] = 208;
if (sprite->data[3] < 208)
sprite->data[3] = 208;
2018-09-15 22:59:45 +02:00
sSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3];
2020-07-27 22:31:36 +02:00
if (sprite->sCounter > 15)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sprite->sState++;
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
2018-09-15 22:59:45 +02:00
}
break;
}
}
2020-07-27 22:31:36 +02:00
static void EndDigitalDisplayScene_Dummy(void)
2018-09-15 22:59:45 +02:00
{
}
2020-07-27 22:31:36 +02:00
static void EndDigitalDisplayScene_StopReel(void)
2018-09-15 22:59:45 +02:00
{
SetGpuReg(REG_OFFSET_MOSAIC, 0);
}
2020-07-27 22:31:36 +02:00
static void EndDigitalDisplayScene_Win(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
LoadPalette(sDigitalDisplay_Pal, (IndexOfSpritePaletteTag(PALTAG_DIG_DISPLAY) << 4) + 0x100, 0x20);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void EndDigitalDisplayScene_InsertBet(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sSlotMachine->win0h = DISPLAY_WIDTH;
sSlotMachine->win0v = DISPLAY_HEIGHT;
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
sSlotMachine->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
2018-09-15 22:59:45 +02:00
}
2020-07-28 23:34:44 +02:00
static void LoadSlotMachineGfx(void)
2018-09-15 22:59:45 +02:00
{
u8 i;
2020-07-27 22:31:36 +02:00
LoadReelBackground();
2020-07-26 07:17:09 +02:00
sDigitalDisplayGfxPtr = Alloc(0x3200);
LZDecompressWram(gSlotMachineDigitalDisplay_Gfx, sDigitalDisplayGfxPtr);
sReelTimeGfxPtr = Alloc(0x3600);
LZDecompressWram(sReelTimeGfx, sReelTimeGfxPtr);
2020-07-27 22:31:36 +02:00
sSlotMachineSpritesheetsPtr = AllocZeroed(sizeof(struct SpriteSheet) * ARRAY_COUNT(sSlotMachineSpriteSheets));
for (i = 0; i < ARRAY_COUNT(sSlotMachineSpriteSheets); i++)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sSlotMachineSpritesheetsPtr[i].data = sSlotMachineSpriteSheets[i].data;
sSlotMachineSpritesheetsPtr[i].size = sSlotMachineSpriteSheets[i].size;
sSlotMachineSpritesheetsPtr[i].tag = sSlotMachineSpriteSheets[i].tag;
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
sSlotMachineSpritesheetsPtr[GFXTAG_STOP - 1].data = sDigitalDisplayGfxPtr + 0xA00;
sSlotMachineSpritesheetsPtr[GFXTAG_BONUS - 1].data = sDigitalDisplayGfxPtr + 0x1400;
sSlotMachineSpritesheetsPtr[GFXTAG_BIG - 1].data = sDigitalDisplayGfxPtr + 0x1600;
sSlotMachineSpritesheetsPtr[GFXTAG_REG - 1].data = sDigitalDisplayGfxPtr + 0x1900;
LoadSpriteSheets(sSlotMachineSpritesheetsPtr);
LoadSpritePalettes(sSlotMachineSpritePalettes);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void LoadReelBackground(void)
2018-09-15 22:59:45 +02:00
{
u8 *dest;
u8 i, j;
2020-07-27 22:31:36 +02:00
sReelBackgroundSpriteSheet = AllocZeroed(sizeof(struct SpriteSheet));
sReelBackground_Gfx = AllocZeroed(0x2000); // Background is plain white
dest = sReelBackground_Gfx;
2018-09-15 22:59:45 +02:00
for (i = 0; i < 0x40; i++)
{
for (j = 0; j < 0x20; j++, dest++)
2020-07-27 22:31:36 +02:00
*dest = sReelBackground_Tilemap[j];
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
sReelBackgroundSpriteSheet->data = sReelBackground_Gfx;
sReelBackgroundSpriteSheet->size = 0x800;
sReelBackgroundSpriteSheet->tag = GFXTAG_REEL_BG;
LoadSpriteSheet(sReelBackgroundSpriteSheet);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void LoadMenuGfx(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sMenuGfx = Alloc(0x2200);
LZDecompressWram(gSlotMachineMenu_Gfx, sMenuGfx);
LoadBgTiles(2, sMenuGfx, 0x2200, 0);
2018-09-15 22:59:45 +02:00
LoadPalette(gSlotMachineMenu_Pal, 0, 160);
2020-07-28 21:28:16 +02:00
LoadPalette(sUnkPalette, 208, 32);
2018-09-15 22:59:45 +02:00
}
2020-07-28 23:34:44 +02:00
static void LoadMenuAndReelOverlayTilemaps(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
LoadSlotMachineMenuTilemap();
LoadSlotMachineReelOverlay();
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void LoadSlotMachineMenuTilemap(void)
2018-09-15 22:59:45 +02:00
{
LoadBgTilemap(2, gSlotMachineMenu_Tilemap, 0x500, 0);
}
2020-07-27 22:31:36 +02:00
static void LoadSlotMachineReelOverlay(void)
2018-09-15 22:59:45 +02:00
{
s16 x, y, dx;
for (x = 4; x < 18; x += 5)
{
for (dx = 0; dx < 4; dx++)
{
2020-07-27 22:31:36 +02:00
LoadBgTilemap(3, sReelOverlay_Tilemap, 2, x + dx + 5 * 32);
LoadBgTilemap(3, sReelOverlay_Tilemap + 1, 2, x + dx + 13 * 32);
LoadBgTilemap(3, sReelOverlay_Tilemap + 2, 2, x + dx + 6 * 32);
LoadBgTilemap(3, sReelOverlay_Tilemap + 3, 2, x + dx + 12 * 32);
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
LoadBgTilemap(3, sReelOverlay_Tilemap + 4, 2, x + 6 * 32);
LoadBgTilemap(3, sReelOverlay_Tilemap + 5, 2, x + 12 * 32);
2018-09-15 22:59:45 +02:00
for (y = 7; y <= 11; y++)
2020-07-27 22:31:36 +02:00
LoadBgTilemap(3, sReelOverlay_Tilemap + 6, 2, x + y * 32);
2018-09-15 22:59:45 +02:00
}
}
2020-07-27 22:31:36 +02:00
// For (un)shading the gray button at the bottom of a reel when A is pressed. The button is colored in quadrants
static void SetReelButtonTilemap(s16 offset, u16 topLeft, u16 topRight, u16 bottomLeft, u16 bottomRight)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
sReelButtonPress_Tilemap[0] = topLeft;
sReelButtonPress_Tilemap[1] = topRight;
sReelButtonPress_Tilemap[2] = bottomLeft;
sReelButtonPress_Tilemap[3] = bottomRight;
2018-09-15 22:59:45 +02:00
2020-07-27 22:31:36 +02:00
LoadBgTilemap(2, sReelButtonPress_Tilemap, 2, 15 * 32 + offset); // Top left
LoadBgTilemap(2, sReelButtonPress_Tilemap + 1, 2, 15 * 32 + 1 + offset); // Top right
LoadBgTilemap(2, sReelButtonPress_Tilemap + 2, 2, 16 * 32 + offset); // Bottom left
LoadBgTilemap(2, sReelButtonPress_Tilemap + 3, 2, 16 * 32 + 1 + offset); // Bottom Right
2018-09-15 22:59:45 +02:00
}
2020-07-27 22:31:36 +02:00
static void LoadInfoBoxTilemap(void)
2018-09-15 22:59:45 +02:00
{
2020-07-27 22:31:36 +02:00
LoadBgTilemap(2, gSlotMachineInfoBox_Tilemap, 0x500, 0);
2018-09-15 22:59:45 +02:00
HideBg(3);
}
2020-07-27 22:31:36 +02:00
static void SetDigitalDisplayImagePtrs(void)
2020-07-26 07:17:09 +02:00
{
sImageTables_DigitalDisplay[DIG_SPRITE_REEL] = sImageTable_DigitalDisplay_Reel;
sImageTables_DigitalDisplay[DIG_SPRITE_TIME] = sImageTable_DigitalDisplay_Time;
sImageTables_DigitalDisplay[DIG_SPRITE_INSERT] = sImageTable_DigitalDisplay_Insert;
sImageTables_DigitalDisplay[DIG_SPRITE_WIN] = sImageTable_DigitalDisplay_Win;
sImageTables_DigitalDisplay[DIG_SPRITE_LOSE] = sImageTable_DigitalDisplay_Lose;
sImageTables_DigitalDisplay[DIG_SPRITE_A_BUTTON] = sImageTable_DigitalDisplay_AButton;
sImageTables_DigitalDisplay[DIG_SPRITE_SMOKE] = sImageTable_DigitalDisplay_Smoke;
sImageTables_DigitalDisplay[DIG_SPRITE_NUMBER] = sImageTable_DigitalDisplay_Number;
sImageTables_DigitalDisplay[DIG_SPRITE_POKE_BALL] = sImageTable_DigitalDisplay_Pokeball;
sImageTables_DigitalDisplay[DIG_SPRITE_D_PAD] = sImageTable_DigitalDisplay_DPad;
sImageTables_DigitalDisplay[DIG_SPRITE_STOP_S] = sImageTable_DigitalDisplay_Stop;
sImageTables_DigitalDisplay[DIG_SPRITE_STOP_T] = sImageTable_DigitalDisplay_Stop;
sImageTables_DigitalDisplay[DIG_SPRITE_STOP_O] = sImageTable_DigitalDisplay_Stop;
sImageTables_DigitalDisplay[DIG_SPRITE_STOP_P] = sImageTable_DigitalDisplay_Stop;
sImageTables_DigitalDisplay[DIG_SPRITE_BONUS_B] = sImageTable_DigitalDisplay_Bonus;
sImageTables_DigitalDisplay[DIG_SPRITE_BONUS_O] = sImageTable_DigitalDisplay_Bonus;
sImageTables_DigitalDisplay[DIG_SPRITE_BONUS_N] = sImageTable_DigitalDisplay_Bonus;
sImageTables_DigitalDisplay[DIG_SPRITE_BONUS_U] = sImageTable_DigitalDisplay_Bonus;
sImageTables_DigitalDisplay[DIG_SPRITE_BONUS_S] = sImageTable_DigitalDisplay_Bonus;
sImageTables_DigitalDisplay[DIG_SPRITE_BIG_B] = sImageTable_DigitalDisplay_Big;
sImageTables_DigitalDisplay[DIG_SPRITE_BIG_I] = sImageTable_DigitalDisplay_Big;
sImageTables_DigitalDisplay[DIG_SPRITE_BIG_G] = sImageTable_DigitalDisplay_Big;
sImageTables_DigitalDisplay[DIG_SPRITE_REG_R] = sImageTable_DigitalDisplay_Reg;
sImageTables_DigitalDisplay[DIG_SPRITE_REG_E] = sImageTable_DigitalDisplay_Reg;
sImageTables_DigitalDisplay[DIG_SPRITE_REG_G] = sImageTable_DigitalDisplay_Reg;
sImageTables_DigitalDisplay[DIG_SPRITE_EMPTY] = NULL;
}
2020-07-27 22:31:36 +02:00
static void AllocDigitalDisplayGfx(void)
2020-07-26 07:17:09 +02:00
{
sImageTable_DigitalDisplay_Reel = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Reel[0].data = sDigitalDisplayGfxPtr;
sImageTable_DigitalDisplay_Reel[0].size = 0x600;
sImageTable_DigitalDisplay_Time = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Time[0].data = sDigitalDisplayGfxPtr + 0x600;
sImageTable_DigitalDisplay_Time[0].size = 0x200;
sImageTable_DigitalDisplay_Insert = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Insert[0].data = sDigitalDisplayGfxPtr + 0x800;
sImageTable_DigitalDisplay_Insert[0].size = 0x200;
sImageTable_DigitalDisplay_Stop = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Stop[0].data = sDigitalDisplayGfxPtr + 0xA00;
sImageTable_DigitalDisplay_Stop[0].size = 0x200;
sImageTable_DigitalDisplay_Win = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Win[0].data = sDigitalDisplayGfxPtr + 0xC00;
sImageTable_DigitalDisplay_Win[0].size = 0x300;
sImageTable_DigitalDisplay_Lose = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Lose[0].data = sDigitalDisplayGfxPtr + 0x1000;
sImageTable_DigitalDisplay_Lose[0].size = 0x400;
sImageTable_DigitalDisplay_Bonus = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Bonus[0].data = sDigitalDisplayGfxPtr + 0x1400;
sImageTable_DigitalDisplay_Bonus[0].size = 0x200;
sImageTable_DigitalDisplay_Big = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Big[0].data = sDigitalDisplayGfxPtr + 0x1600;
sImageTable_DigitalDisplay_Big[0].size = 0x300;
sImageTable_DigitalDisplay_Reg = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Reg[0].data = sDigitalDisplayGfxPtr + 0x1900;
sImageTable_DigitalDisplay_Reg[0].size = 0x300;
sImageTable_DigitalDisplay_AButton = AllocZeroed(sizeof(struct SpriteFrameImage) * 2);
sImageTable_DigitalDisplay_AButton[0].data = sDigitalDisplayGfxPtr + 0x1C00;
sImageTable_DigitalDisplay_AButton[0].size = 0x200;
sImageTable_DigitalDisplay_AButton[1].data = sDigitalDisplayGfxPtr + 0x1E00;
sImageTable_DigitalDisplay_AButton[1].size = 0x200;
sImageTable_DigitalDisplay_Smoke = AllocZeroed(sizeof(struct SpriteFrameImage) * 1);
sImageTable_DigitalDisplay_Smoke[0].data = sDigitalDisplayGfxPtr + 0x2000;
sImageTable_DigitalDisplay_Smoke[0].size = 640;
sImageTable_DigitalDisplay_Number = AllocZeroed(sizeof(struct SpriteFrameImage) * 5);
sImageTable_DigitalDisplay_Number[0].data = sDigitalDisplayGfxPtr + 0x2280;
sImageTable_DigitalDisplay_Number[0].size = 0x80;
sImageTable_DigitalDisplay_Number[1].data = sDigitalDisplayGfxPtr + 0x2300;
sImageTable_DigitalDisplay_Number[1].size = 0x80;
sImageTable_DigitalDisplay_Number[2].data = sDigitalDisplayGfxPtr + 0x2380;
sImageTable_DigitalDisplay_Number[2].size = 0x80;
sImageTable_DigitalDisplay_Number[3].data = sDigitalDisplayGfxPtr + 0x2400;
sImageTable_DigitalDisplay_Number[3].size = 0x80;
sImageTable_DigitalDisplay_Number[4].data = sDigitalDisplayGfxPtr + 0x2480;
sImageTable_DigitalDisplay_Number[4].size = 0x80;
sImageTable_DigitalDisplay_Pokeball = AllocZeroed(sizeof(struct SpriteFrameImage) * 2);
sImageTable_DigitalDisplay_Pokeball[0].data = sDigitalDisplayGfxPtr + 0x2600;
sImageTable_DigitalDisplay_Pokeball[0].size = 0x480;
sImageTable_DigitalDisplay_Pokeball[1].data = sDigitalDisplayGfxPtr + 10880;
sImageTable_DigitalDisplay_Pokeball[1].size = 0x480;
sImageTable_DigitalDisplay_DPad = AllocZeroed(sizeof(struct SpriteFrameImage) * 2);
sImageTable_DigitalDisplay_DPad[0].data = sDigitalDisplayGfxPtr + 0x2F00;
sImageTable_DigitalDisplay_DPad[0].size = 0x180;
sImageTable_DigitalDisplay_DPad[1].data = sDigitalDisplayGfxPtr + 0x3080;
sImageTable_DigitalDisplay_DPad[1].size = 0x180;
}
2020-07-27 22:31:36 +02:00
static const u8 sReelSymbolTileTags[NUM_REELS][SYMBOLS_PER_REEL] =
{
2020-07-28 21:28:16 +02:00
[LEFT_REEL] = {
2020-07-27 22:31:36 +02:00
GFXTAG_7_RED,
GFXTAG_CHERRY,
GFXTAG_AZURILL,
GFXTAG_REPLAY,
GFXTAG_POWER,
GFXTAG_LOTAD,
GFXTAG_7_BLUE,
GFXTAG_LOTAD,
GFXTAG_CHERRY,
GFXTAG_POWER,
GFXTAG_REPLAY,
GFXTAG_AZURILL,
GFXTAG_7_RED,
GFXTAG_POWER,
GFXTAG_LOTAD,
GFXTAG_REPLAY,
GFXTAG_AZURILL,
GFXTAG_7_BLUE,
GFXTAG_POWER,
GFXTAG_LOTAD,
GFXTAG_REPLAY
2018-09-15 22:59:45 +02:00
},
2020-07-28 21:28:16 +02:00
[MIDDLE_REEL] = {
2020-07-27 22:31:36 +02:00
GFXTAG_7_RED,
GFXTAG_CHERRY,
GFXTAG_REPLAY,
GFXTAG_LOTAD,
GFXTAG_AZURILL,
GFXTAG_CHERRY,
GFXTAG_REPLAY,
GFXTAG_POWER,
GFXTAG_POWER,
GFXTAG_LOTAD,
GFXTAG_7_BLUE,
GFXTAG_LOTAD,
GFXTAG_REPLAY,
GFXTAG_CHERRY,
GFXTAG_AZURILL,
GFXTAG_LOTAD,
GFXTAG_REPLAY,
GFXTAG_CHERRY,
GFXTAG_LOTAD,
GFXTAG_REPLAY,
GFXTAG_CHERRY
2018-09-15 22:59:45 +02:00
},
2020-07-28 21:28:16 +02:00
[RIGHT_REEL] = {
2020-07-27 22:31:36 +02:00
GFXTAG_7_RED,
GFXTAG_POWER,
GFXTAG_7_BLUE,
GFXTAG_REPLAY,
GFXTAG_LOTAD,
GFXTAG_AZURILL,
GFXTAG_REPLAY,
GFXTAG_LOTAD,
GFXTAG_POWER,
GFXTAG_AZURILL,
GFXTAG_REPLAY,
GFXTAG_LOTAD,
GFXTAG_AZURILL,
GFXTAG_POWER,
GFXTAG_REPLAY,
GFXTAG_LOTAD,
GFXTAG_AZURILL,
GFXTAG_POWER,
GFXTAG_REPLAY,
GFXTAG_LOTAD,
GFXTAG_CHERRY
2018-09-15 22:59:45 +02:00
},
};
2020-07-28 21:28:16 +02:00
static const u8 sReelTimeTags[] = {
2018-09-15 22:59:45 +02:00
1, 0, 5, 4, 3, 2
};
2020-07-28 21:28:16 +02:00
static const s16 sInitialReelPositions[NUM_REELS][2] = {
[LEFT_REEL] = {0, 6},
[MIDDLE_REEL] = {0, 10},
[RIGHT_REEL] = {0, 2}
2018-09-15 22:59:45 +02:00
};
2020-07-28 21:28:16 +02:00
static const u8 sLuckyRoundProbabilities[][3] = {
2018-09-15 22:59:45 +02:00
{1, 1, 12},
{1, 1, 14},
{2, 2, 14},
{2, 2, 14},
{2, 3, 16},
{3, 3, 16}
};
2020-07-28 21:28:16 +02:00
static const u8 sLuckyFlagProbabilities_Top3[][6] = {
2018-09-15 22:59:45 +02:00
{25, 25, 30, 40, 40, 50},
{25, 25, 30, 30, 35, 35},
{25, 25, 30, 25, 25, 30}
};
2020-07-28 21:28:16 +02:00
static const u8 sLuckyFlagProbabilities_NotTop3[][6] = {
2018-09-15 22:59:45 +02:00
{20, 25, 25, 20, 25, 25},
{12, 15, 15, 18, 19, 22},
{25, 25, 25, 30, 30, 40},
{25, 25, 20, 20, 15, 15},
{40, 40, 35, 35, 40, 40}
};
2020-07-28 21:28:16 +02:00
static const u8 sReeltimeProbabilities_UnluckyGame[][17] = {
2018-09-15 22:59:45 +02:00
{243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5},
{ 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5},
{ 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40},
{ 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100},
{ 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6}
};
2020-07-28 21:28:16 +02:00
static const u8 sReelTimeProbabilities_LuckyGame[][17] = {
2018-09-15 22:59:45 +02:00
{ 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5},
{ 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6},
{ 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35},
{ 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50},
{ 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60}
};
2020-07-28 23:34:44 +02:00
static const u16 sReelTimeExplodeProbability[] = {
2019-02-07 17:24:09 +01:00
128, 175, 200, 225, 256
2018-09-15 22:59:45 +02:00
};
2020-07-28 21:28:16 +02:00
static const u16 sReelIncrementTable[][2] = {
2018-09-15 22:59:45 +02:00
{10, 5},
{10, 10},
{10, 15},
{10, 25},
{10, 35}
};
2020-07-28 21:28:16 +02:00
static const u16 sReelTimeBonusIncrementTable[] = {
2018-09-15 22:59:45 +02:00
0, 5, 10, 15, 20
};
2019-02-07 17:24:09 +01:00
// tentative name
2020-07-28 21:28:16 +02:00
static const u8 sBiasTags[] = {
2020-07-27 22:31:36 +02:00
GFXTAG_REPLAY, GFXTAG_CHERRY, GFXTAG_LOTAD, GFXTAG_AZURILL, GFXTAG_POWER, GFXTAG_7_RED, GFXTAG_7_RED, GFXTAG_7_RED
2018-09-15 22:59:45 +02:00
};
2020-07-28 21:28:16 +02:00
static const u16 sLuckyFlagSettings_Top3[] = {
2019-02-15 05:44:18 +01:00
LUCKY_BIAS_777, LUCKY_BIAS_REELTIME, LUCKY_BIAS_MIXED_777
2018-09-15 22:59:45 +02:00
};
2020-07-28 21:28:16 +02:00
static const u16 sLuckyFlagSettings_NotTop3[] = {
2019-02-22 22:03:35 +01:00
LUCKY_BIAS_POWER, LUCKY_BIAS_AZURILL, LUCKY_BIAS_LOTAD, LUCKY_BIAS_CHERRY, LUCKY_BIAS_REPLAY
2018-09-15 22:59:45 +02:00
};
2020-07-28 21:28:16 +02:00
static const u8 sSymToMatch[] = {
[GFXTAG_7_RED] = MATCHED_777_RED,
[GFXTAG_7_BLUE] = MATCHED_777_BLUE,
[GFXTAG_AZURILL] = MATCHED_AZURILL,
[GFXTAG_LOTAD] = MATCHED_LOTAD,
[GFXTAG_CHERRY] = MATCHED_1CHERRY,
[GFXTAG_POWER] = MATCHED_POWER,
[GFXTAG_REPLAY] = MATCHED_REPLAY
};
static const u16 sSlotMatchFlags[] = {
[MATCHED_1CHERRY] = 1 << MATCHED_1CHERRY,
[MATCHED_2CHERRY] = 1 << MATCHED_2CHERRY,
[MATCHED_REPLAY] = 1 << MATCHED_REPLAY,
[MATCHED_LOTAD] = 1 << MATCHED_LOTAD,
[MATCHED_AZURILL] = 1 << MATCHED_AZURILL,
[MATCHED_POWER] = 1 << MATCHED_POWER,
[MATCHED_777_MIXED] = 1 << MATCHED_777_MIXED,
[MATCHED_777_RED] = 1 << MATCHED_777_RED,
[MATCHED_777_BLUE] = 1 << MATCHED_777_BLUE
};
static const u16 sSlotPayouts[] = {
[MATCHED_1CHERRY] = 2,
[MATCHED_2CHERRY] = 4,
[MATCHED_REPLAY] = 0,
[MATCHED_LOTAD] = 6,
[MATCHED_AZURILL] = 12,
[MATCHED_POWER] = 3,
[MATCHED_777_MIXED] = 90,
[MATCHED_777_RED] = 300,
[MATCHED_777_BLUE] = 300
2018-09-15 22:59:45 +02:00
};
2020-07-27 22:31:36 +02:00
static const s16 sDigitalDisplay_SpriteCoords[][2] = {
2020-07-28 21:28:16 +02:00
[DIG_DISPINFO_INSERT] = { 208, 56},
[DIG_DISPINFO_STOP_S] = { 184, 0},
[DIG_DISPINFO_STOP_T] = { 200, 8},
[DIG_DISPINFO_STOP_O] = { 216, 16},
[DIG_DISPINFO_STOP_P] = { 232, 24},
[DIG_DISPINFO_A_BUTTON_STOP] = { 208, 72},
[DIG_DISPINFO_POKE_BALL_ROCKING] = { 208, 8},
[DIG_DISPINFO_WIN] = { 208, 64},
[DIG_DISPINFO_LOSE] = { 208, 56},
2020-07-27 22:31:36 +02:00
[DIG_DISPINFO_SMOKE_NW] = { 192, 88},
[DIG_DISPINFO_SMOKE_NE] = { 224, 88},
[DIG_DISPINFO_SMOKE_SW] = { 192, 120},
[DIG_DISPINFO_SMOKE_SE] = { 224, 120},
2020-07-28 21:28:16 +02:00
[DIG_DISPINFO_REEL] = { 144, 56},
[DIG_DISPINFO_TIME] = { 272, 88},
2020-07-27 22:31:36 +02:00
[DIG_DISPINFO_NUMBER] = { 168, 112},
2020-07-28 21:28:16 +02:00
[DIG_DISPINFO_DPAD] = { 208, 84},
2020-07-27 22:31:36 +02:00
[DIG_DISPINFO_POKE_BALL_SHINING] = { 208, 112},
2020-07-28 21:28:16 +02:00
[DIG_DISPINFO_REG_R] = { 188, 52},
[DIG_DISPINFO_REG_E] = { 208, 52},
[DIG_DISPINFO_REG_G] = { 228, 52},
[DIG_DISPINFO_REG_BONUS_B] = { 184, 72},
[DIG_DISPINFO_REG_BONUS_O] = { 196, 72},
[DIG_DISPINFO_REG_BONUS_N] = { 208, 72},
[DIG_DISPINFO_REG_BONUS_U] = { 220, 72},
[DIG_DISPINFO_REG_BONUS_S] = { 232, 72},
[DIG_DISPINFO_BIG_B] = { 188, 52},
[DIG_DISPINFO_BIG_I] = { 208, 52},
[DIG_DISPINFO_BIG_G] = { 228, 52},
[DIG_DISPINFO_BIG_BONUS_B] = { 184, 72},
[DIG_DISPINFO_BIG_BONUS_O] = { 196, 72},
[DIG_DISPINFO_BIG_BONUS_N] = { 208, 72},
[DIG_DISPINFO_BIG_BONUS_U] = { 220, 72},
[DIG_DISPINFO_BIG_BONUS_S] = { 232, 72},
[DIG_DISPINFO_A_BUTTON_START] = { 0, 0} // Initially offscreen
2020-07-27 22:31:36 +02:00
};
static const SpriteCallback sDigitalDisplay_SpriteCallbacks[] = {
[DIG_DISPINFO_INSERT] = SpriteCB_DigitalDisplay_Static,
[DIG_DISPINFO_STOP_S] = SpriteCB_DigitalDisplay_Stop,
[DIG_DISPINFO_STOP_T] = SpriteCB_DigitalDisplay_Stop,
[DIG_DISPINFO_STOP_O] = SpriteCB_DigitalDisplay_Stop,
[DIG_DISPINFO_STOP_P] = SpriteCB_DigitalDisplay_Stop,
[DIG_DISPINFO_A_BUTTON_STOP] = SpriteCB_DigitalDisplay_AButtonStop,
[DIG_DISPINFO_POKE_BALL_ROCKING] = SpriteCB_DigitalDisplay_PokeballRocking,
[DIG_DISPINFO_WIN] = SpriteCB_DigitalDisplay_Static,
[DIG_DISPINFO_LOSE] = SpriteCB_DigitalDisplay_Static,
[DIG_DISPINFO_SMOKE_NW] = SpriteCB_DigitalDisplay_Smoke,
[DIG_DISPINFO_SMOKE_NE] = SpriteCB_DigitalDisplay_SmokeNE,
[DIG_DISPINFO_SMOKE_SW] = SpriteCB_DigitalDisplay_SmokeSW,
[DIG_DISPINFO_SMOKE_SE] = SpriteCB_DigitalDisplay_SmokeSE,
[DIG_DISPINFO_REEL] = SpriteCB_DigitalDisplay_Reel,
[DIG_DISPINFO_TIME] = SpriteCB_DigitalDisplay_Time,
[DIG_DISPINFO_NUMBER] = SpriteCB_DigitalDisplay_ReelTimeNumber,
[DIG_DISPINFO_DPAD] = SpriteCB_DigitalDisplay_Static,
[DIG_DISPINFO_POKE_BALL_SHINING] = SpriteCB_DigitalDisplay_PokeballShining,
[DIG_DISPINFO_REG_R] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_E] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_G] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_BONUS_B] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_BONUS_O] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_BONUS_N] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_BONUS_U] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_REG_BONUS_S] = SpriteCB_DigitalDisplay_RegBonus,
[DIG_DISPINFO_BIG_B] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_I] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_G] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_BONUS_B] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_BONUS_O] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_BONUS_N] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_BONUS_U] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_BIG_BONUS_S] = SpriteCB_DigitalDisplay_BigBonus,
[DIG_DISPINFO_A_BUTTON_START] = SpriteCB_DigitalDisplay_AButtonStart
2018-09-15 23:19:37 +02:00
};
2020-07-26 07:17:09 +02:00
static const struct DigitalDisplaySprite sDigitalDisplay_InsertBet[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_EMPTY, DIG_DISPINFO_A_BUTTON_START, 0}, // Sprite replaced with DIG_SPRITE_A_BUTTON after first bet
{DIG_SPRITE_INSERT, DIG_DISPINFO_INSERT, 0},
{DIG_SPRITE_D_PAD, DIG_DISPINFO_DPAD, 0},
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite sDigitalDisplay_StopReel[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_STOP_S, DIG_DISPINFO_STOP_S, 0},
{DIG_SPRITE_STOP_T, DIG_DISPINFO_STOP_T, 0},
{DIG_SPRITE_STOP_O, DIG_DISPINFO_STOP_O, 0},
{DIG_SPRITE_STOP_P, DIG_DISPINFO_STOP_P, 0},
{DIG_SPRITE_A_BUTTON, DIG_DISPINFO_A_BUTTON_STOP, 0},
{DIG_SPRITE_POKE_BALL, DIG_DISPINFO_POKE_BALL_ROCKING, 0},
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite sDigitalDisplay_Win[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_WIN, DIG_DISPINFO_WIN, 0},
{DIG_SPRITE_POKE_BALL, DIG_DISPINFO_POKE_BALL_SHINING, 0},
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite sDigitalDisplay_Lose[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_LOSE, DIG_DISPINFO_LOSE, 0},
{DIG_SPRITE_SMOKE, DIG_DISPINFO_SMOKE_NW, 0},
{DIG_SPRITE_SMOKE, DIG_DISPINFO_SMOKE_NE, 1},
{DIG_SPRITE_SMOKE, DIG_DISPINFO_SMOKE_SW, 2},
{DIG_SPRITE_SMOKE, DIG_DISPINFO_SMOKE_SE, 3},
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite sDigitalDisplay_ReelTime[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_REEL, DIG_DISPINFO_REEL, 0},
{DIG_SPRITE_TIME, DIG_DISPINFO_TIME, 0},
{DIG_SPRITE_NUMBER, DIG_DISPINFO_NUMBER, 0}, // Number of reel time spins left
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite sDigitalDisplay_BonusBig[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_BIG_B, DIG_DISPINFO_BIG_B, 0},
{DIG_SPRITE_BIG_I, DIG_DISPINFO_BIG_I, 1},
{DIG_SPRITE_BIG_G, DIG_DISPINFO_BIG_G, 2},
{DIG_SPRITE_BONUS_B, DIG_DISPINFO_BIG_BONUS_B, 3},
{DIG_SPRITE_BONUS_O, DIG_DISPINFO_BIG_BONUS_O, 4},
{DIG_SPRITE_BONUS_N, DIG_DISPINFO_BIG_BONUS_N, 5},
{DIG_SPRITE_BONUS_U, DIG_DISPINFO_BIG_BONUS_U, 6},
{DIG_SPRITE_BONUS_S, DIG_DISPINFO_BIG_BONUS_S, 7},
{DIG_SPRITE_POKE_BALL, DIG_DISPINFO_POKE_BALL_SHINING, 0},
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite sDigitalDisplay_BonusRegular[] = {
2020-07-27 22:31:36 +02:00
{DIG_SPRITE_REG_R, DIG_DISPINFO_REG_R, 0},
{DIG_SPRITE_REG_E, DIG_DISPINFO_REG_E, 1},
{DIG_SPRITE_REG_G, DIG_DISPINFO_REG_G, 2},
{DIG_SPRITE_BONUS_B, DIG_DISPINFO_REG_BONUS_B, 3},
{DIG_SPRITE_BONUS_O, DIG_DISPINFO_REG_BONUS_O, 4},
{DIG_SPRITE_BONUS_N, DIG_DISPINFO_REG_BONUS_N, 5},
{DIG_SPRITE_BONUS_U, DIG_DISPINFO_REG_BONUS_U, 6},
{DIG_SPRITE_BONUS_S, DIG_DISPINFO_REG_BONUS_S, 7},
{DIG_SPRITE_POKE_BALL, DIG_DISPINFO_POKE_BALL_SHINING, 0},
2020-07-26 07:17:09 +02:00
DIG_SPRITE_DUMMY
};
static const struct DigitalDisplaySprite *const sDigitalDisplayScenes[] = {
[DIG_DISPLAY_INSERT_BET] = sDigitalDisplay_InsertBet,
[DIG_DISPLAY_STOP_REEL] = sDigitalDisplay_StopReel,
[DIG_DISPLAY_WIN] = sDigitalDisplay_Win,
[DIG_DISPLAY_LOSE] = sDigitalDisplay_Lose,
[DIG_DISPLAY_REEL_TIME] = sDigitalDisplay_ReelTime,
[DIG_DISPLAY_BONUS_REG] = sDigitalDisplay_BonusRegular,
[DIG_DISPLAY_BONUS_BIG] = sDigitalDisplay_BonusBig
2018-09-15 23:19:37 +02:00
};
2020-07-27 22:31:36 +02:00
static void (*const sDigitalDisplaySceneExitCallbacks[])(void) = {
[DIG_DISPLAY_INSERT_BET] = EndDigitalDisplayScene_InsertBet,
[DIG_DISPLAY_STOP_REEL] = EndDigitalDisplayScene_StopReel,
[DIG_DISPLAY_WIN] = EndDigitalDisplayScene_Win,
[DIG_DISPLAY_LOSE] = EndDigitalDisplayScene_Dummy,
[DIG_DISPLAY_REEL_TIME] = EndDigitalDisplayScene_Dummy,
[DIG_DISPLAY_BONUS_REG] = EndDigitalDisplayScene_Win,
[DIG_DISPLAY_BONUS_BIG] = EndDigitalDisplayScene_Win
2018-09-15 23:19:37 +02:00
};
2020-02-09 20:17:31 +01:00
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_8x8 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(8x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_8x16 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x16),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(8x16),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_16x16 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(16x16),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_16x32 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x32),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(16x32),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_32x32 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x32),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x32),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_32x64 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x64),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x64),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_64x32 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x32),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(64x32),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct OamData sOam_64x64 =
2020-02-09 20:17:31 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x64),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(64x64),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
2020-07-26 07:17:09 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimeNumbers[] =
2020-02-09 20:17:31 +01:00
{
{ gSlotMachineReelTimeNumber0, 0x80 },
{ gSlotMachineReelTimeNumber1, 0x80 },
{ gSlotMachineReelTimeNumber2, 0x80 },
{ gSlotMachineReelTimeNumber3, 0x80 },
{ gSlotMachineReelTimeNumber4, 0x80 },
{ gSlotMachineReelTimeNumber5, 0x80 },
};
2020-07-26 07:17:09 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimeShadow[] = { gSlotMachineReelTimeShadow, 0x200 };
2020-07-27 22:31:36 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimeNumberGap[] = { gSlotMachineReelTimeNumberGap_Gfx, 0x40 };
2020-02-09 20:17:31 +01:00
2020-07-26 07:17:09 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimeBolt[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
{ gSlotMachineReelTimeBolt0, 0x100 },
{ gSlotMachineReelTimeBolt1, 0x100 },
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimePikachuAura[] = { gSlotMachineReelTimePikaAura, 0x400 };
2020-02-09 20:17:31 +01:00
2020-07-26 07:17:09 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimeExplosion[] =
2020-02-09 20:17:31 +01:00
{
{ gSlotMachineReelTimeExplosion0, 0x200 },
{ gSlotMachineReelTimeExplosion1, 0x200 },
};
2020-07-26 07:17:09 +02:00
static const struct SpriteFrameImage sImageTable_ReelTimeDuck[] = { gSlotMachineReelTimeDuck, 0x20};
static const struct SpriteFrameImage sImageTable_ReelTimeSmoke[] = { gSlotMachineReelTimeSmoke, 0x80};
static const struct SpriteFrameImage sImageTable_PikaPowerBolt[] = { gSlotMachinePikaPowerBolt, 0x20};
2020-02-09 20:17:31 +01:00
2020-07-27 22:31:36 +02:00
static const union AnimCmd sAnim_SingleFrame[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END
};
2020-07-27 22:31:36 +02:00
static const union AnimCmd sAnim_ReelTimeDuck[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimePikachu_Still[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimePikachu_ChargingSlow[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(1, 16),
ANIMCMD_FRAME(0, 16),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimePikachu_ChargingMedium[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(1, 8),
ANIMCMD_FRAME(0, 8),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimePikachu_ChargingFast[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(1, 4),
ANIMCMD_FRAME(0, 4),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimePikachu_Cheering[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(2, 32),
ANIMCMD_FRAME(3, 32),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimePikachu_FellOver[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(4, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeNumber_0[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeNumber_1[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(1, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeNumber_2[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(2, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeNumber_3[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(3, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeNumber_4[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(4, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeNumber_5[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(5, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeBolt[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(1, 4),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_ReelTimeExplosion[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_FRAME(1, 16),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_AButton_Flashing[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_FRAME(1, 30),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_AButton_Static[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(1, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_DPad_Flashing[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_FRAME(1, 30),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Pokeball_Rocking[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 16),
ANIMCMD_FRAME(1, 16),
ANIMCMD_FRAME(0, 16),
ANIMCMD_FRAME(1, 16, .hFlip = TRUE),
ANIMCMD_JUMP(0)
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Pokeball_Static[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Number_1[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Number_2[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(1, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Number_3[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(2, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Number_4[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(3, 1),
ANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd sAnim_DigitalDisplay_Number_5[] =
2020-02-09 20:17:31 +01:00
{
ANIMCMD_FRAME(4, 1),
ANIMCMD_END
};
2020-07-27 22:31:36 +02:00
static const union AnimCmd *const sAnims_SingleFrame[] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
sAnim_SingleFrame
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const union AnimCmd *const sAnims_ReelTimeDuck[] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
sAnim_ReelTimeDuck
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_ReelTimePikachu[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_ReelTimePikachu_Still,
sAnim_ReelTimePikachu_ChargingSlow,
sAnim_ReelTimePikachu_ChargingMedium,
sAnim_ReelTimePikachu_ChargingFast,
sAnim_ReelTimePikachu_Cheering,
sAnim_ReelTimePikachu_FellOver
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_ReelTimeNumbers[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_ReelTimeNumber_0,
sAnim_ReelTimeNumber_1,
sAnim_ReelTimeNumber_2,
sAnim_ReelTimeNumber_3,
sAnim_ReelTimeNumber_4,
sAnim_ReelTimeNumber_5
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_ReelTimeBolt[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_ReelTimeBolt
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_ReelTimeExplosion[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_ReelTimeExplosion
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_DigitalDisplay_AButton[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_DigitalDisplay_AButton_Flashing,
sAnim_DigitalDisplay_AButton_Static
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_DigitalDisplay_DPad[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_DigitalDisplay_DPad_Flashing
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_DigitalDisplay_Pokeball[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_DigitalDisplay_Pokeball_Rocking,
sAnim_DigitalDisplay_Pokeball_Static
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AnimCmd *const sAnims_DigitalDisplay_Number[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAnim_DigitalDisplay_Number_1,
sAnim_DigitalDisplay_Number_2,
sAnim_DigitalDisplay_Number_3,
sAnim_DigitalDisplay_Number_4,
sAnim_DigitalDisplay_Number_5
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const union AffineAnimCmd sAffineAnim_ReelTimeSmoke[] =
2020-02-09 20:17:31 +01:00
{
AFFINEANIMCMD_FRAME(16, 16, 0, 0),
AFFINEANIMCMD_LOOP(0),
AFFINEANIMCMD_FRAME(1, 1, 0, 1),
AFFINEANIMCMD_LOOP(0xFF),
AFFINEANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AffineAnimCmd *const sAffineAnims_ReelTimeSmoke[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAffineAnim_ReelTimeSmoke
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
// Spin as it appears
static const union AffineAnimCmd sAffineAnim_PikaPowerBolt[] =
2020-02-09 20:17:31 +01:00
{
AFFINEANIMCMD_FRAME(0, 0, 8, 32),
AFFINEANIMCMD_FRAME(0, 0, 6, 32),
AFFINEANIMCMD_FRAME(0, 0, 4, 16),
AFFINEANIMCMD_FRAME(0, 0, 12, 2),
AFFINEANIMCMD_FRAME(0, 0, -12, 4),
AFFINEANIMCMD_FRAME(0, 0, 12, 2),
AFFINEANIMCMD_FRAME(0, 0, 12, 2),
AFFINEANIMCMD_FRAME(0, 0, -12, 4),
AFFINEANIMCMD_FRAME(0, 0, 12, 2),
AFFINEANIMCMD_END
};
2020-07-26 07:17:09 +02:00
static const union AffineAnimCmd *const sAffineAnims_PikaPowerBolt[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
sAffineAnim_PikaPowerBolt
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelSymbol =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
.tileTag = GFXTAG_SYMBOLS_START,
.paletteTag = PALTAG_REEL,
2020-07-26 07:17:09 +02:00
.oam = &sOam_32x32,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelSymbol
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_CoinNumber =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
.tileTag = GFXTAG_NUMBERS_START,
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_CoinNumber
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelBackground =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
.tileTag = GFXTAG_REEL_BG,
.paletteTag = PALTAG_REEL,
2020-07-26 07:17:09 +02:00
.oam = &sOam_64x64,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimePikachu =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_REEL_TIME_PIKACHU,
2020-07-26 07:17:09 +02:00
.oam = &sOam_64x64,
.anims = sAnims_ReelTimePikachu,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelTimePikachu
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeMachineAntennae =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_REEL_TIME_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeMachine =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_REEL_TIME_MACHINE,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_BrokenReelTimeMachine =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_REEL_TIME_MACHINE,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeNumbers =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_16x16,
.anims = sAnims_ReelTimeNumbers,
.images = sImageTable_ReelTimeNumbers,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelTimeNumbers
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeShadow =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_16x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-07-26 07:17:09 +02:00
.images = sImageTable_ReelTimeShadow,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-27 22:31:36 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeNumberGap =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_16x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
.images = sImageTable_ReelTimeNumberGap,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeBolt =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_16x32,
.anims = sAnims_ReelTimeBolt,
.images = sImageTable_ReelTimeBolt,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelTimeBolt
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimePikachuAura =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_PIKA_AURA,
2020-07-26 07:17:09 +02:00
.oam = &sOam_32x64,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-07-26 07:17:09 +02:00
.images = sImageTable_ReelTimePikachuAura,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelTimePikachuAura
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeExplosion =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_EXPLOSION,
2020-07-26 07:17:09 +02:00
.oam = &sOam_32x32,
.anims = sAnims_ReelTimeExplosion,
.images = sImageTable_ReelTimeExplosion,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelTimeExplosion
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeDuck =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_ReelTimeDuck,
2020-07-26 07:17:09 +02:00
.images = sImageTable_ReelTimeDuck,
2020-02-09 20:17:31 +01:00
.affineAnims = gDummySpriteAffineAnimTable,
2020-07-26 07:17:09 +02:00
.callback = SpriteCB_ReelTimeDuck
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_ReelTimeSmoke =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_16x16,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-07-26 07:17:09 +02:00
.images = sImageTable_ReelTimeSmoke,
.affineAnims = sAffineAnims_ReelTimeSmoke,
.callback = SpriteCB_ReelTimeSmoke
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Reel =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Time =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Insert =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Stop =
2020-02-09 20:17:31 +01:00
{
.tileTag = 18,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Win =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_64x32,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Lose =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_64x32,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Bonus =
2020-02-09 20:17:31 +01:00
{
.tileTag = 19,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Big =
2020-02-09 20:17:31 +01:00
{
.tileTag = 20,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Reg =
2020-02-09 20:17:31 +01:00
{
.tileTag = 21,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_AButton =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_32x32,
.anims = sAnims_DigitalDisplay_AButton,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Smoke =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Number =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_16x16,
.anims = sAnims_DigitalDisplay_Number,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_Pokeball =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
.anims = sAnims_DigitalDisplay_Pokeball,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_DigitalDisplay_DPad =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_DIG_DISPLAY,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
.anims = sAnims_DigitalDisplay_DPad,
2020-02-09 20:17:31 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
2020-07-26 07:17:09 +02:00
static const struct SpriteTemplate sSpriteTemplate_PikaPowerBolt =
2020-02-09 20:17:31 +01:00
{
.tileTag = 0xFFFF,
2020-07-27 22:31:36 +02:00
.paletteTag = PALTAG_MISC,
2020-07-26 07:17:09 +02:00
.oam = &sOam_8x8,
2020-07-27 22:31:36 +02:00
.anims = sAnims_SingleFrame,
2020-07-26 07:17:09 +02:00
.images = sImageTable_PikaPowerBolt,
.affineAnims = sAffineAnims_PikaPowerBolt,
.callback = SpriteCB_PikaPowerBolt
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_ReelBackground[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -64,
.y = -64,
.shape = SPRITE_SHAPE(64x64),
.size = SPRITE_SIZE(64x64),
.tileOffset = 0,
.priority = 3,
},
{
.x = 0,
.y = -64,
.shape = SPRITE_SHAPE(64x64),
.size = SPRITE_SIZE(64x64),
.tileOffset = 0,
.priority = 3,
},
{
.x = -64,
.y = 0,
.shape = SPRITE_SHAPE(64x64),
.size = SPRITE_SIZE(64x64),
.tileOffset = 0,
.priority = 3,
},
{
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(64x64),
.size = SPRITE_SIZE(64x64),
.tileOffset = 0,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_ReelBackground[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_ReelBackground), sSubsprites_ReelBackground
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_ReelTimeMachineAntennae[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -12,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 1,
},
{
.x = 0,
.y = -12,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.priority = 1,
},
{
.x = -32,
.y = -4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.priority = 1,
},
{
.x = 0,
.y = -4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 1,
},
{
.x = -32,
.y = 4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 16,
.priority = 1,
},
{
.x = 0,
.y = 4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 20,
.priority = 1
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_ReelTimeMachineAntennae[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_ReelTimeMachineAntennae), sSubsprites_ReelTimeMachineAntennae
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_ReelTimeMachine[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -20,
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.tileOffset = 0,
.priority = 1,
},
{
.x = -32,
.y = 12,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 32,
.priority = 1,
},
{
.x = 0,
.y = 12,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 36,
.priority = 1,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_ReelTimeMachine[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_ReelTimeMachine), sSubsprites_ReelTimeMachine
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_BrokenReelTimeMachine[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -24,
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.tileOffset = 0,
.priority = 1,
},
{
.x = -32,
.y = 8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 32,
.priority = 1,
},
{
.x = 0,
.y = 8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 36,
.priority = 1,
},
{
.x = -32,
.y = 16,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 40,
.priority = 1,
},
{
.x = 0,
.y = 16,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 44,
.priority = 1,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_BrokenReelTimeMachine[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_BrokenReelTimeMachine), sSubsprites_BrokenReelTimeMachine
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_ReelTimeShadow[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 1,
},
{
.x = 0,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.priority = 1,
},
{
.x = -32,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.priority = 1,
},
{
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 1,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_ReelTimeShadow[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_ReelTimeShadow), sSubsprites_ReelTimeShadow
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const struct Subsprite sSubsprites_ReelTimeNumberGap[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 1,
},
{
.x = -8,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 1,
},
{
.x = -8,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 1,
}
};
2020-07-27 22:31:36 +02:00
static const struct SubspriteTable sSubspriteTable_ReelTimeNumberGap[] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
ARRAY_COUNT(sSubsprites_ReelTimeNumberGap), sSubsprites_ReelTimeNumberGap
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Reel[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -24,
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.tileOffset = 0,
.priority = 3,
},
{
.x = -32,
.y = 8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 32,
.priority = 3,
},
{
.x = 0,
.y = 8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 36,
.priority = 3,
},
{
.x = -32,
.y = 16,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 40,
.priority = 3,
},
{
.x = 0,
.y = 16,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 44,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Reel[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Reel), sSubsprites_DigitalDisplay_Reel
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Time[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 0,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.priority = 3,
},
{
.x = -32,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Time[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Time), sSubsprites_DigitalDisplay_Time
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Insert[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 0,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.priority = 3,
},
{
.x = -32,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Insert[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Insert), sSubsprites_DigitalDisplay_Insert
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Unused1[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 0,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.priority = 3,
},
{
.x = -32,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Unused1[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Unused1), sSubsprites_DigitalDisplay_Unused1
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Win[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -32,
.y = -12,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 0,
.y = -12,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.priority = 3,
},
{
.x = -32,
.y = -4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 0,
.y = -4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 3,
},
{
.x = -32,
.y = 4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 16,
.priority = 3,
},
{
.x = 0,
.y = 4,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 20,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Win[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Win), sSubsprites_DigitalDisplay_Win
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Smoke[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -16,
.y = -16,
.shape = SPRITE_SHAPE(32x32),
.size = SPRITE_SIZE(32x32),
.tileOffset = 0,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Unused2[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x16),
.size = SPRITE_SIZE(16x16),
.tileOffset = 16,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Smoke[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Smoke), sSubsprites_DigitalDisplay_Smoke
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Unused2[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Unused2), sSubsprites_DigitalDisplay_Unused2
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_Pokeball[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -24,
.y = -24,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 8,
-24,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 4,
.priority = 3,
},
{
.x = -24,
.y = -16,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 6,
.priority = 3,
},
{
.x = 8,
.y = -16,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 10,
.priority = 3,
},
{
.x = -24,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.priority = 3,
},
{
.x = 8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 16,
.priority = 3,
},
{
.x = -24,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 18,
.priority = 3,
},
{
.x = 8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 22,
.priority = 3,
},
{
.x = -24,
.y = 8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 24,
.priority = 3,
},
{
.x = 8,
.y = 8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 28,
.priority = 3,
},
{
.x = -24,
.y = 16,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 30,
.priority = 3,
},
{
.x = 8,
.y = 16,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 34,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Pokeball[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_Pokeball), sSubsprites_DigitalDisplay_Pokeball
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_DPad[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -16,
.y = -12,
.shape = SPRITE_SHAPE(32x16),
.size = SPRITE_SIZE(32x16),
.tileOffset = 0,
.priority = 3,
},
{
.x = -16,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 0,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 10,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_DPad[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_DPad), sSubsprites_DigitalDisplay_DPad
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_StopS[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 8,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopS[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_StopS), sSubsprites_DigitalDisplay_StopS
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_StopT[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 2,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 10,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopT[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_StopT), sSubsprites_DigitalDisplay_StopT
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_StopO[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 4,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 12,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopO[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_StopO), sSubsprites_DigitalDisplay_StopO
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_StopP[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 6,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 14,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopP[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_StopP), sSubsprites_DigitalDisplay_StopP
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BonusB[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 8,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusB[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusB), sSubsprites_DigitalDisplay_BonusB
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BonusO[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -4,
.y = -8,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 2,
.priority = 3,
},
{
.x = -4,
.y = 0,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 10,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusO[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusO), sSubsprites_DigitalDisplay_BonusO
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BonusN[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 3,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 11,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusN[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusN), sSubsprites_DigitalDisplay_BonusN
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BonusU[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -4,
.y = -8,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 5,
.priority = 3,
},
{
.x = -4,
.y = 0,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 13,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusU[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusU), sSubsprites_DigitalDisplay_BonusU
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BonusS[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 6,
.priority = 3,
},
{
.x = -8,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 14,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusS[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusS), sSubsprites_DigitalDisplay_BonusS
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BigB[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -12,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 4,
.y = -12,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 2,
.priority = 3,
},
{
.x = -12,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 4,
.y = -4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 10,
.priority = 3,
},
{
.x = -12,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 16,
.priority = 3,
},
{
.x = 4,
.y = 4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 18,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BigB[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BigB), sSubsprites_DigitalDisplay_BigB
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BigI[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 3,
.priority = 3,
},
{
.x = -8,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 11,
.priority = 3,
},
{
.x = -8,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 19,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BigI[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BigI), sSubsprites_DigitalDisplay_BigI
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_BigG[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -12,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 5,
.priority = 3,
},
{
.x = 4,
.y = -12,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 7,
.priority = 3,
},
{
.x = -12,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 13,
.priority = 3,
},
{
.x = 4,
.y = -4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 15,
.priority = 3,
},
{
.x = -12,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 21,
.priority = 3,
},
{
.x = 4,
.y = 4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 23,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BigG[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_BigG), sSubsprites_DigitalDisplay_BigG
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_RegR[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -12,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.priority = 3,
},
{
.x = 4,
.y = -12,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 2,
.priority = 3,
},
{
.x = -12,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 8,
.priority = 3,
},
{
.x = 4,
.y = -4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 10,
.priority = 3,
},
{
.x = -12,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 16,
.priority = 3,
},
{
.x = 4,
.y = 4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 18,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_RegR[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_RegR), sSubsprites_DigitalDisplay_RegR
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_RegE[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -8,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 3,
.priority = 3,
},
{
.x = -8,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 11,
.priority = 3,
},
{
.x = -8,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 19,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_RegE[] =
2020-02-09 20:17:31 +01:00
{
2020-07-26 07:17:09 +02:00
ARRAY_COUNT(sSubsprites_DigitalDisplay_RegE), sSubsprites_DigitalDisplay_RegE
2020-02-09 20:17:31 +01:00
};
2020-07-26 07:17:09 +02:00
static const struct Subsprite sSubsprites_DigitalDisplay_RegG[] =
2020-02-09 20:17:31 +01:00
{
{
.x = -12,
.y = -12,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 5,
.priority = 3,
},
{
.x = 4,
.y = -12,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 7,
.priority = 3,
},
{
.x = -12,
.y = -4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 13,
.priority = 3,
},
{
.x = 4,
.y = -4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 15,
.priority = 3,
},
{
.x = -12,
.y = 4,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 21,
.priority = 3,
},
{
.x = 4,
.y = 4,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 23,
.priority = 3,
}
};
2020-07-26 07:17:09 +02:00
static const struct SubspriteTable sSubspriteTable_DigitalDisplay_RegG[] =
{
ARRAY_COUNT(sSubsprites_DigitalDisplay_RegG), sSubsprites_DigitalDisplay_RegG
};
static const struct SpriteTemplate *const sSpriteTemplates_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES] =
{
[DIG_SPRITE_REEL] = &sSpriteTemplate_DigitalDisplay_Reel,
[DIG_SPRITE_TIME] = &sSpriteTemplate_DigitalDisplay_Time,
[DIG_SPRITE_INSERT] = &sSpriteTemplate_DigitalDisplay_Insert,
[DIG_SPRITE_WIN] = &sSpriteTemplate_DigitalDisplay_Win,
[DIG_SPRITE_LOSE] = &sSpriteTemplate_DigitalDisplay_Lose,
[DIG_SPRITE_A_BUTTON] = &sSpriteTemplate_DigitalDisplay_AButton,
[DIG_SPRITE_SMOKE] = &sSpriteTemplate_DigitalDisplay_Smoke,
[DIG_SPRITE_NUMBER] = &sSpriteTemplate_DigitalDisplay_Number,
[DIG_SPRITE_POKE_BALL] = &sSpriteTemplate_DigitalDisplay_Pokeball,
[DIG_SPRITE_D_PAD] = &sSpriteTemplate_DigitalDisplay_DPad,
[DIG_SPRITE_STOP_S] = &sSpriteTemplate_DigitalDisplay_Stop,
[DIG_SPRITE_STOP_T] = &sSpriteTemplate_DigitalDisplay_Stop,
[DIG_SPRITE_STOP_O] = &sSpriteTemplate_DigitalDisplay_Stop,
[DIG_SPRITE_STOP_P] = &sSpriteTemplate_DigitalDisplay_Stop,
[DIG_SPRITE_BONUS_B] = &sSpriteTemplate_DigitalDisplay_Bonus,
[DIG_SPRITE_BONUS_O] = &sSpriteTemplate_DigitalDisplay_Bonus,
[DIG_SPRITE_BONUS_N] = &sSpriteTemplate_DigitalDisplay_Bonus,
[DIG_SPRITE_BONUS_U] = &sSpriteTemplate_DigitalDisplay_Bonus,
[DIG_SPRITE_BONUS_S] = &sSpriteTemplate_DigitalDisplay_Bonus,
[DIG_SPRITE_BIG_B] = &sSpriteTemplate_DigitalDisplay_Big,
[DIG_SPRITE_BIG_I] = &sSpriteTemplate_DigitalDisplay_Big,
[DIG_SPRITE_BIG_G] = &sSpriteTemplate_DigitalDisplay_Big,
[DIG_SPRITE_REG_R] = &sSpriteTemplate_DigitalDisplay_Reg,
[DIG_SPRITE_REG_E] = &sSpriteTemplate_DigitalDisplay_Reg,
[DIG_SPRITE_REG_G] = &sSpriteTemplate_DigitalDisplay_Reg,
[DIG_SPRITE_EMPTY] = &gDummySpriteTemplate
};
static const struct SubspriteTable *const sSubspriteTables_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES] =
{
[DIG_SPRITE_REEL] = sSubspriteTable_DigitalDisplay_Reel,
[DIG_SPRITE_TIME] = sSubspriteTable_DigitalDisplay_Time,
[DIG_SPRITE_INSERT] = sSubspriteTable_DigitalDisplay_Insert,
[DIG_SPRITE_WIN] = sSubspriteTable_DigitalDisplay_Win,
[DIG_SPRITE_LOSE] = NULL,
[DIG_SPRITE_A_BUTTON] = NULL,
[DIG_SPRITE_SMOKE] = sSubspriteTable_DigitalDisplay_Smoke,
[DIG_SPRITE_NUMBER] = NULL,
[DIG_SPRITE_POKE_BALL] = sSubspriteTable_DigitalDisplay_Pokeball,
[DIG_SPRITE_D_PAD] = sSubspriteTable_DigitalDisplay_DPad,
[DIG_SPRITE_STOP_S] = sSubspriteTable_DigitalDisplay_StopS,
[DIG_SPRITE_STOP_T] = sSubspriteTable_DigitalDisplay_StopT,
[DIG_SPRITE_STOP_O] = sSubspriteTable_DigitalDisplay_StopO,
[DIG_SPRITE_STOP_P] = sSubspriteTable_DigitalDisplay_StopP,
[DIG_SPRITE_BONUS_B] = sSubspriteTable_DigitalDisplay_BonusB,
[DIG_SPRITE_BONUS_O] = sSubspriteTable_DigitalDisplay_BonusO,
[DIG_SPRITE_BONUS_N] = sSubspriteTable_DigitalDisplay_BonusN,
[DIG_SPRITE_BONUS_U] = sSubspriteTable_DigitalDisplay_BonusU,
[DIG_SPRITE_BONUS_S] = sSubspriteTable_DigitalDisplay_BonusS,
[DIG_SPRITE_BIG_B] = sSubspriteTable_DigitalDisplay_BigB,
[DIG_SPRITE_BIG_I] = sSubspriteTable_DigitalDisplay_BigI,
[DIG_SPRITE_BIG_G] = sSubspriteTable_DigitalDisplay_BigG,
[DIG_SPRITE_REG_R] = sSubspriteTable_DigitalDisplay_RegR,
[DIG_SPRITE_REG_E] = sSubspriteTable_DigitalDisplay_RegE,
[DIG_SPRITE_REG_G] = sSubspriteTable_DigitalDisplay_RegG,
[DIG_SPRITE_EMPTY] = NULL
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const struct SpriteSheet sSlotMachineSpriteSheets[22] =
{
{ .data = gSlotMachineReelSymbol1Tiles, .size = 0x200, .tag = GFXTAG_7_RED },
{ .data = gSlotMachineReelSymbol2Tiles, .size = 0x200, .tag = GFXTAG_7_BLUE },
{ .data = gSlotMachineReelSymbol3Tiles, .size = 0x200, .tag = GFXTAG_AZURILL },
{ .data = gSlotMachineReelSymbol4Tiles, .size = 0x200, .tag = GFXTAG_LOTAD },
{ .data = gSlotMachineReelSymbol5Tiles, .size = 0x200, .tag = GFXTAG_CHERRY },
{ .data = gSlotMachineReelSymbol6Tiles, .size = 0x200, .tag = GFXTAG_POWER },
{ .data = gSlotMachineReelSymbol7Tiles, .size = 0x200, .tag = GFXTAG_REPLAY },
{ .data = gSlotMachineNumber0Tiles, .size = 0x40, .tag = GFXTAG_NUM_0 },
{ .data = gSlotMachineNumber1Tiles, .size = 0x40, .tag = GFXTAG_NUM_1 },
{ .data = gSlotMachineNumber2Tiles, .size = 0x40, .tag = GFXTAG_NUM_2 },
{ .data = gSlotMachineNumber3Tiles, .size = 0x40, .tag = GFXTAG_NUM_3 },
{ .data = gSlotMachineNumber4Tiles, .size = 0x40, .tag = GFXTAG_NUM_4 },
{ .data = gSlotMachineNumber5Tiles, .size = 0x40, .tag = GFXTAG_NUM_5 },
{ .data = gSlotMachineNumber6Tiles, .size = 0x40, .tag = GFXTAG_NUM_6 },
{ .data = gSlotMachineNumber7Tiles, .size = 0x40, .tag = GFXTAG_NUM_7 },
{ .data = gSlotMachineNumber8Tiles, .size = 0x40, .tag = GFXTAG_NUM_8 },
{ .data = gSlotMachineNumber9Tiles, .size = 0x40, .tag = GFXTAG_NUM_9 },
// skips GFXTAG_REEL_BG, which has its own spritesheet
// the data for these sheets is determined at runtime
2020-07-27 22:31:36 +02:00
{ .data = NULL, .size = 0x200, .tag = GFXTAG_STOP },
{ .data = NULL, .size = 0x200, .tag = GFXTAG_BONUS },
{ .data = NULL, .size = 0x300, .tag = GFXTAG_BIG },
{ .data = NULL, .size = 0x300, .tag = GFXTAG_REG },
{},
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const u8 *const sReelBackground_Tilemap = gSlotMachineReelBackground_Tilemap;
2020-02-09 20:17:31 +01:00
2020-07-28 21:28:16 +02:00
static const u16 sUnused[] =
2020-02-09 20:17:31 +01:00
{
2020-07-28 21:28:16 +02:00
0x6F7B,
0x6968,
0x36AB,
0x7FFF,
0x5750,
0x7EC0,
0x02BA,
0x02BA,
0x01FD,
0x01FD,
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
// The Bet 2 and 3 match line palettes are duplicated unnecessarily
static const u16 sMiddleRowLit_Pal[] = {RGB(17, 28, 31)};
static const u16 sTopRowLit_Pal[] = {RGB(31, 29, 16)};
static const u16 sBottomRowt_Pal[] = {RGB(31, 29, 16)};
static const u16 sNWSEDiagLit_Pal[] = {RGB(31, 21, 18)};
static const u16 sNESWDiagLit_Pal[] = {RGB(31, 21, 18)};
static const u16 *const sLitMatchLinePalTable[NUM_MATCH_LINES] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
[MATCH_MIDDLE_ROW] = sMiddleRowLit_Pal,
[MATCH_TOP_ROW] = sTopRowLit_Pal,
[MATCH_BOTTOM_ROW] = sBottomRowt_Pal,
[MATCH_NWSE_DIAG] = sNWSEDiagLit_Pal,
[MATCH_NESW_DIAG] = sNESWDiagLit_Pal,
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const u16 *const sDarkMatchLinePalTable[NUM_MATCH_LINES] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
[MATCH_MIDDLE_ROW] = &gSlotMachineMenu_Pal[74],
[MATCH_TOP_ROW] = &gSlotMachineMenu_Pal[75],
[MATCH_BOTTOM_ROW] = &gSlotMachineMenu_Pal[76],
[MATCH_NWSE_DIAG] = &gSlotMachineMenu_Pal[77],
[MATCH_NESW_DIAG] = &gSlotMachineMenu_Pal[78],
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const u8 sMatchLinePalOffsets[NUM_MATCH_LINES] = {
[MATCH_MIDDLE_ROW] = 74,
[MATCH_TOP_ROW] = 75,
[MATCH_BOTTOM_ROW] = 76,
[MATCH_NWSE_DIAG] = 78, // Diag colors flipped for some reason
[MATCH_NESW_DIAG] = 77 // Doesn't matter as both are identical
};
2020-02-09 20:17:31 +01:00
2020-07-28 21:28:16 +02:00
static const u8 sBetToMatchLineIds[MAX_BET][2] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
{MATCH_MIDDLE_ROW, MATCH_MIDDLE_ROW}, // Bet 1
{MATCH_TOP_ROW, MATCH_BOTTOM_ROW}, // Bet 2
{MATCH_NWSE_DIAG, MATCH_NESW_DIAG}, // Bet 3
2020-02-09 20:17:31 +01:00
};
2020-07-28 23:34:44 +02:00
static const u8 sMatchLinesPerBet[MAX_BET] = { 1, 2, 2 };
2020-02-09 20:17:31 +01:00
2020-07-27 22:31:36 +02:00
// Flashing lights at top of slot machine, brightest point inside light goes from toward center of machine, to middle, to toward edges
static const u16 sFlashingLightsInside_Pal[] = INCBIN_U16("graphics/slot_machine/flashing_lights_inside.gbapal");
static const u16 sFlashingLightsMiddle_Pal[] = INCBIN_U16("graphics/slot_machine/flashing_lights_middle.gbapal");
static const u16 sFlashingLightsOutside_Pal[] = INCBIN_U16("graphics/slot_machine/flashing_lights_outside.gbapal");
static const u16 *const sFlashingLightsPalTable[] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
sFlashingLightsInside_Pal,
sFlashingLightsMiddle_Pal,
sFlashingLightsOutside_Pal,
2020-02-09 20:17:31 +01:00
};
2020-07-28 21:28:16 +02:00
static const u16 *const sSlotMachineMenu_Pal = {gSlotMachineMenu_Pal + 16};
2020-02-09 20:17:31 +01:00
2020-07-27 22:31:36 +02:00
static const u16 sPokeballShining0_Pal[] = INCBIN_U16("graphics/slot_machine/pokeball_shining_0.gbapal");
static const u16 sPokeballShining1_Pal[] = INCBIN_U16("graphics/slot_machine/pokeball_shining_1.gbapal");
static const u16 sPokeballShining2_Pal[] = INCBIN_U16("graphics/slot_machine/pokeball_shining_2.gbapal");
static const u16 *const sPokeballShiningPalTable[] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
sPokeballShining0_Pal, // Streak on left side of ball
sPokeballShining1_Pal, // Streak in middle of ball
sPokeballShining2_Pal, // Streak on right side of ball
gSlotMachineDigitalDisplay_Pal, // Back to normal
2020-02-09 20:17:31 +01:00
};
2020-07-27 22:31:36 +02:00
static const u16 *const sDigitalDisplay_Pal = gSlotMachineDigitalDisplay_Pal;
2020-07-28 21:28:16 +02:00
static const u16 sUnkPalette[] = INCBIN_U16("graphics/slot_machine/85A8524.bin");
2020-02-09 20:17:31 +01:00
2020-07-27 22:31:36 +02:00
static const struct SpritePalette sSlotMachineSpritePalettes[] =
2020-02-09 20:17:31 +01:00
{
2020-07-27 22:31:36 +02:00
{ .data = gSlotMachineReelSymbols_Pal, .tag = PALTAG_REEL},
{ .data = gSlotMachineReelTimePikachu_Pal, .tag = PALTAG_REEL_TIME_PIKACHU},
{ .data = gSlotMachineReelTimeMisc_Pal, .tag = PALTAG_REEL_TIME_MISC},
{ .data = gSlotMachineReelTimeMachine_Pal, .tag = PALTAG_REEL_TIME_MACHINE},
{ .data = gSlotMachineMisc_Pal, .tag = PALTAG_MISC},
{ .data = gSlotMachineReelTimeExplosion_Pal, .tag = PALTAG_EXPLOSION},
{ .data = gSlotMachineDigitalDisplay_Pal, .tag = PALTAG_DIG_DISPLAY},
{ .data = gSlotMachineMisc_Pal, .tag = PALTAG_PIKA_AURA},
2020-02-09 20:17:31 +01:00
{}
};
2020-07-26 07:17:09 +02:00
static const u32 sReelTimeGfx[] = INCBIN_U32("graphics/slot_machine/reel_time_gfx.4bpp.lz"); // reel_time_machine and reel_time_pikachu
2020-07-27 22:31:36 +02:00
static const u16 sReelTimeWindow_Tilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window.bin");
static const u16 sEmptyTilemap[] = {0};