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"
|
2019-09-09 03:07:54 +02:00
|
|
|
#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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
/*0x14*/ s16 reeltimePixelOffset;
|
|
|
|
/*0x16*/ s16 reeltimePosition;
|
2019-02-07 17:24:09 +01:00
|
|
|
/*0x18*/ s16 currReel;
|
2019-02-07 19:39:18 +01:00
|
|
|
/*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];
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
static const u8 sReeltimeProbabilities_UnluckyGame[][17];
|
2020-07-28 21:28:16 +02:00
|
|
|
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
|
|
|
};
|
|
|
|
|
2021-04-10 04:39:34 +02:00
|
|
|
static const u8 sColors_ReeltimeHelp[] = {TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY};
|
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:
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
StoreWordInTwoHalfwords(&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
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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;
|
2020-08-21 00:02:00 +02:00
|
|
|
PlaySE(SE_SHOP);
|
2018-08-11 17:57:20 +02:00
|
|
|
}
|
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
|
|
|
{
|
2020-08-21 00:02:00 +02:00
|
|
|
PlaySE(SE_SHOP);
|
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
|
|
|
{
|
2019-02-22 07:40:11 +01:00
|
|
|
DrawDialogueFrame(0, 0);
|
2018-09-08 23:38:30 +02:00
|
|
|
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
|
|
|
{
|
2019-02-22 07:40:11 +01: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
|
|
|
{
|
2019-02-07 19:39:18 +01: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
|
|
|
{
|
2019-02-07 19:39:18 +01:00
|
|
|
DrawLuckyFlags();
|
2020-07-27 22:31:36 +02:00
|
|
|
DestroyDigitalDisplayScene();
|
2019-02-07 19:39:18 +01:00
|
|
|
|
2020-07-28 23:34:44 +02:00
|
|
|
SpinSlotReel(LEFT_REEL);
|
|
|
|
SpinSlotReel(MIDDLE_REEL);
|
|
|
|
SpinSlotReel(RIGHT_REEL);
|
2019-02-07 19:39:18 +01:00
|
|
|
|
2019-10-20 08:31:51 +02:00
|
|
|
IncrementDailySlotsUses();
|
2019-02-07 19:39:18 +01:00
|
|
|
|
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)
|
|
|
|
{
|
2019-02-07 19:39:18 +01:00
|
|
|
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
|
|
|
{
|
2020-08-21 00:02:00 +02:00
|
|
|
PlaySE(SE_CONTEST_PLACE);
|
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
|
|
|
{
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayFanfare(MUS_SLOTS_JACKPOT);
|
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
|
|
|
{
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayFanfare(MUS_SLOTS_JACKPOT);
|
2020-07-26 07:17:09 +02:00
|
|
|
CreateDigitalDisplayScene(DIG_DISPLAY_BONUS_REG);
|
2018-08-11 17:57:20 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayFanfare(MUS_SLOTS_WIN);
|
2020-07-26 07:17:09 +02:00
|
|
|
CreateDigitalDisplayScene(DIG_DISPLAY_WIN);
|
2018-08-11 17:57:20 +02:00
|
|
|
}
|
2019-02-07 19:39:18 +01: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
|
|
|
{
|
2019-02-22 07:40:11 +01:00
|
|
|
DrawDialogueFrame(0, 0);
|
2018-09-08 23:38:30 +02:00
|
|
|
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
|
|
|
{
|
2019-02-22 07:40:11 +01: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
|
|
|
{
|
2019-02-22 07:40:11 +01: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
|
|
|
{
|
2019-02-22 07:40:11 +01:00
|
|
|
DrawDialogueFrame(0, 0);
|
2018-09-08 23:38:30 +02:00
|
|
|
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
|
|
|
{
|
2019-02-22 07:40:11 +01: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
|
|
|
{
|
2019-02-22 07:40:11 +01:00
|
|
|
DrawDialogueFrame(0, 0);
|
2018-09-08 23:38:30 +02:00
|
|
|
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
|
|
|
{
|
2019-02-22 07:40:11 +01: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);
|
2021-04-25 23:22:45 +02:00
|
|
|
TryPutFindThatGamerOnAir(GetCoins());
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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
|
|
|
{
|
2019-02-07 19:39:18 +01: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
|
|
|
{
|
2019-02-07 19:39:18 +01:00
|
|
|
if (IsThisRoundLucky())
|
2018-08-11 18:47:56 +02:00
|
|
|
{
|
2019-03-01 00:56:07 +01:00
|
|
|
attempts = AttemptsAtLuckyFlags_Top3();
|
2019-02-07 19:39:18 +01:00
|
|
|
if (attempts != 3) // if you found a lucky number
|
2018-08-11 18:47:56 +02:00
|
|
|
{
|
2019-02-07 19:39:18 +01:00
|
|
|
// attempts == 1: reelTime flag set
|
2020-07-28 21:28:16 +02:00
|
|
|
sSlotMachine->luckyFlags |= sLuckyFlagSettings_Top3[attempts];
|
2019-02-07 19:39:18 +01:00
|
|
|
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();
|
2019-02-07 19:39:18 +01:00
|
|
|
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
|
|
|
{
|
2019-02-07 19:39:18 +01:00
|
|
|
s16 count;
|
2018-08-11 18:47:56 +02:00
|
|
|
|
2019-02-07 19:39:18 +01: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;
|
|
|
|
}
|
2019-02-07 19:39:18 +01:00
|
|
|
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
|
|
|
{
|
2019-02-07 19:39:18 +01:00
|
|
|
s16 count;
|
2018-08-11 18:47:56 +02:00
|
|
|
|
2019-02-07 19:39:18 +01: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;
|
|
|
|
}
|
2019-02-07 19:39:18 +01:00
|
|
|
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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
if (sSlotMachine->luckyGame == FALSE)
|
|
|
|
return sReeltimeProbabilities_UnluckyGame[reelTimeDraw][sSlotMachine->pikaPower];
|
|
|
|
else
|
|
|
|
return sReelTimeProbabilities_LuckyGame[reelTimeDraw][sSlotMachine->pikaPower];
|
2018-08-11 18:47:56 +02:00
|
|
|
}
|
|
|
|
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
else
|
|
|
|
return FALSE;
|
2018-08-11 18:47:56 +02:00
|
|
|
}
|
|
|
|
|
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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
else
|
|
|
|
return FALSE;
|
2018-08-11 18:47:56 +02:00
|
|
|
}
|
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;
|
2020-11-03 02:02:39 +01:00
|
|
|
if (JOY_HELD(A_BUTTON))
|
2018-09-15 18:01:20 +02:00
|
|
|
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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
}
|
|
|
|
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
static void AdvanceReeltimeReel(s16 value)
|
2018-09-15 18:01:20 +02:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
sSlotMachine->reeltimePixelOffset += value;
|
|
|
|
sSlotMachine->reeltimePixelOffset %= 120;
|
|
|
|
sSlotMachine->reeltimePosition = 6 - sSlotMachine->reeltimePixelOffset / 20;
|
2018-09-15 18:01:20 +02:00
|
|
|
}
|
|
|
|
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s16 AdvanceReeltimeReelToNextTag(s16 value)
|
2018-09-15 18:01:20 +02:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
AdvanceReeltimeReel(value);
|
|
|
|
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;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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();
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
GetReeltimeDraw();
|
2018-09-15 18:01:20 +02:00
|
|
|
StopMapMusic();
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayNewMapMusic(MUS_ROULETTE);
|
2018-09-15 18:01:20 +02:00
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
}
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s16 reeltimePixelOffset = sSlotMachine->reeltimePixelOffset % 20;
|
|
|
|
if (reeltimePixelOffset)
|
2018-09-15 18:01:20 +02:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
AdvanceReeltimeReel(task->data[4] >> 8);
|
|
|
|
reeltimePixelOffset = sSlotMachine->reeltimePixelOffset % 20;
|
2018-09-15 18:01:20 +02:00
|
|
|
task->data[4] = (u8)task->data[4] + 0x40;
|
|
|
|
}
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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);
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayFanfare(MUS_TOO_BAD);
|
2018-09-15 18:01:20 +02:00
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayFanfare(MUS_SLOTS_WIN);
|
2018-09-15 18:01:20 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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();
|
2020-08-21 00:02:00 +02:00
|
|
|
PlayFanfare(MUS_TOO_BAD);
|
|
|
|
PlaySE(SE_M_EXPLOSION);
|
2018-09-15 18:01:20 +02:00
|
|
|
}
|
|
|
|
|
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
|
|
|
{
|
2021-02-20 05:22:26 +01:00
|
|
|
if (FindTaskIdByFunc(RunInfoBoxActions) == TASK_NONE)
|
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
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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);
|
2019-03-02 23:25:39 +01:00
|
|
|
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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
AddTextPrinterParameterized3(1, 1, 2, 5, sColors_ReeltimeHelp, 0, gText_ReelTimeHelp);
|
2018-09-15 18:01:20 +02:00
|
|
|
CopyWindowToVram(1, 3);
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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
|
|
|
{
|
2019-03-02 23:25:39 +01:00
|
|
|
FillWindowPixelBuffer(1, PIXEL_FILL(0));
|
2018-09-15 18:01:20 +02:00
|
|
|
ClearWindowTilemap(1);
|
|
|
|
CopyWindowToVram(1, 1);
|
|
|
|
RemoveWindow(1);
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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);
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 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];
|
|
|
|
|
2018-12-05 15:31:01 +01:00
|
|
|
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;
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y2 = sprite->x2 = 0;
|
2018-09-15 22:59:45 +02:00
|
|
|
if (sprite->animNum == 4)
|
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y2 = sprite->x2 = 8;
|
2018-09-15 22:59:45 +02:00
|
|
|
if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0))
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y2 = -8;
|
2018-09-15 22:59:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s16 r0 = (u16)(sSlotMachine->reeltimePixelOffset + sprite->data[7]);
|
2018-09-15 22:59:45 +02:00
|
|
|
r0 %= 40;
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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--;
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 = 0;
|
|
|
|
sprite->y2 = 0;
|
2018-09-15 22:59:45 +02:00
|
|
|
sprite->invisible = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sprite->invisible = FALSE;
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 += sprite->sXDir;
|
|
|
|
sprite->y2 += sprite->sYDir;
|
2020-07-27 22:31:36 +02:00
|
|
|
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
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y2 = gSpriteCoordOffsetY;
|
2018-09-15 22:59:45 +02:00
|
|
|
}
|
|
|
|
|
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;
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 = Cos(sprite->data[0], 20);
|
|
|
|
sprite->y2 = Sin(sprite->data[0], 6);
|
2018-09-15 22:59:45 +02:00
|
|
|
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;
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y2 -= (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
|
|
|
}
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 = 0;
|
|
|
|
sprite->y2 = 0;
|
2018-09-15 22:59:45 +02:00
|
|
|
if (sprite->subspriteTableNum != 0)
|
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 = targetX[sprite->sSpriteId];
|
|
|
|
sprite->y2 = 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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x += 4;
|
|
|
|
if (sprite->x >= 0xd0)
|
2018-09-15 22:59:45 +02:00
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x += 4;
|
|
|
|
if (sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x -= 4;
|
|
|
|
if (sprite->x <= 0xd0)
|
2018-09-15 22:59:45 +02:00
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x -= 4;
|
|
|
|
if (sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x += 4;
|
|
|
|
if (sprite->x >= 0xd0)
|
2018-09-15 22:59:45 +02:00
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x += 4;
|
|
|
|
if (sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y += 8;
|
|
|
|
if (sprite->y >= 0x70)
|
2018-09-15 22:59:45 +02:00
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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)
|
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y -= sprite->sCounter;
|
2020-07-27 22:31:36 +02:00
|
|
|
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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->y += 2;
|
|
|
|
if (sprite->y >= 0x30)
|
2018-09-15 22:59:45 +02:00
|
|
|
{
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->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:
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 = letterXOffset[sprite->sSpriteId];
|
|
|
|
sprite->y2 = letterYOffset[sprite->sSpriteId];
|
2020-07-27 22:31:36 +02:00
|
|
|
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:
|
2021-07-07 15:11:52 +02:00
|
|
|
if (sprite->x2 > 0)
|
|
|
|
sprite->x2 -= 4;
|
|
|
|
else if (sprite->x2 < 0)
|
|
|
|
sprite->x2 += 4;
|
2018-09-15 22:59:45 +02:00
|
|
|
|
2021-07-07 15:11:52 +02:00
|
|
|
if (sprite->y2 > 0)
|
|
|
|
sprite->y2 -= 4;
|
|
|
|
else if (sprite->y2 < 0)
|
|
|
|
sprite->y2 += 4;
|
2018-09-15 22:59:45 +02:00
|
|
|
|
2021-07-07 15:11:52 +02:00
|
|
|
if (sprite->x2 == 0 && sprite->y2 == 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
|
|
|
}
|
2021-07-07 15:11:52 +02:00
|
|
|
sprite->x2 = Cos(sp0[sprite->sSpriteId], sprite->sCounter);
|
|
|
|
sprite->y2 = Sin(sp0[sprite->sSpriteId], sprite->sCounter);
|
2020-07-27 22:31:36 +02:00
|
|
|
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}
|
|
|
|
};
|
|
|
|
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +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
|
2020-05-09 14:49:51 +02:00
|
|
|
// 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-05-09 14:49:51 +02:00
|
|
|
{},
|
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};
|