summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/slot_machine.s339
-rw-r--r--include/slot_machine.h31
-rw-r--r--include/sprite.h2
-rw-r--r--src/field/slot_machine.c162
4 files changed, 178 insertions, 356 deletions
diff --git a/asm/slot_machine.s b/asm/slot_machine.s
index c5dd8bd26..a289ec573 100644
--- a/asm/slot_machine.s
+++ b/asm/slot_machine.s
@@ -5,345 +5,6 @@
.text
- thumb_func_start sub_8101B04
-sub_8101B04: @ 8101B04
- push {r4,r5,lr}
- ldr r5, _08101B70 @ =REG_BG0CNT
- movs r1, 0
- strh r1, [r5]
- ldr r2, _08101B74 @ =REG_BG1CNT
- strh r1, [r2]
- ldr r3, _08101B78 @ =REG_BG2CNT
- strh r1, [r3]
- ldr r4, _08101B7C @ =REG_BG3CNT
- strh r1, [r4]
- ldr r0, _08101B80 @ =REG_BG0HOFS
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- ldr r1, _08101B84 @ =0x00001f08
- adds r0, r1, 0
- strh r0, [r5]
- ldr r1, _08101B88 @ =0x00001c01
- adds r0, r1, 0
- strh r0, [r2]
- ldr r2, _08101B8C @ =0x00001d02
- adds r0, r2, 0
- strh r0, [r3]
- ldr r1, _08101B90 @ =0x00001e02
- adds r0, r1, 0
- strh r0, [r4]
- ldr r0, _08101B94 @ =REG_WININ
- movs r1, 0x3F
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- ldr r1, _08101B98 @ =REG_BLDCNT
- ldr r2, _08101B9C @ =0x00001048
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- ldr r2, _08101BA0 @ =0x00000809
- adds r0, r2, 0
- strh r0, [r1]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08101B70: .4byte REG_BG0CNT
-_08101B74: .4byte REG_BG1CNT
-_08101B78: .4byte REG_BG2CNT
-_08101B7C: .4byte REG_BG3CNT
-_08101B80: .4byte REG_BG0HOFS
-_08101B84: .4byte 0x00001f08
-_08101B88: .4byte 0x00001c01
-_08101B8C: .4byte 0x00001d02
-_08101B90: .4byte 0x00001e02
-_08101B94: .4byte REG_WININ
-_08101B98: .4byte REG_BLDCNT
-_08101B9C: .4byte 0x00001048
-_08101BA0: .4byte 0x00000809
- thumb_func_end sub_8101B04
-
- thumb_func_start sub_8101BA4
-sub_8101BA4: @ 8101BA4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- bl sub_81019EC
- ldr r5, _08101C74 @ =gSharedMem
- movs r4, 0
- strb r4, [r5]
- strb r4, [r5, 0x2]
- bl Random
- movs r1, 0x1
- ands r1, r0
- strb r1, [r5, 0x3]
- strb r4, [r5, 0x4]
- movs r0, 0
- strh r4, [r5, 0x8]
- strb r0, [r5, 0xA]
- strb r0, [r5, 0xB]
- ldr r0, _08101C78 @ =gSaveBlock1
- ldr r1, _08101C7C @ =0x00000494
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r5, 0xC]
- strh r4, [r5, 0xE]
- strh r4, [r5, 0x10]
- strh r4, [r5, 0x12]
- strh r4, [r5, 0x18]
- movs r0, 0x8
- strh r0, [r5, 0x1A]
- adds r1, r5, 0
- adds r1, 0x58
- movs r0, 0xF0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0xA0
- strh r0, [r1]
- adds r0, r5, 0
- adds r0, 0x5C
- movs r1, 0x3F
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- bl GetCurrentMapMusic
- adds r1, r5, 0
- adds r1, 0x60
- strh r0, [r1]
- movs r7, 0
- adds r6, r5, 0
- ldr r2, _08101C80 @ =gUnknown_083ECCF8
- mov r9, r2
- movs r0, 0x1C
- adds r0, r6
- mov r8, r0
-_08101C14:
- lsls r5, r7, 1
- adds r0, r6, 0
- adds r0, 0x22
- adds r0, r5, r0
- movs r1, 0
- strh r1, [r0]
- adds r4, r6, 0
- adds r4, 0x28
- adds r4, r5, r4
- ldrb r0, [r6, 0x3]
- lsls r0, 1
- lsls r1, r7, 2
- adds r0, r1
- add r0, r9
- movs r1, 0
- ldrsh r0, [r0, r1]
- movs r1, 0x15
- bl __modsi3
- strh r0, [r4]
- add r5, r8
- movs r2, 0
- ldrsh r0, [r4, r2]
- lsls r1, r0, 1
- adds r1, r0
- lsls r1, 3
- movs r2, 0xFC
- lsls r2, 1
- adds r0, r2, 0
- subs r0, r1
- strh r0, [r5]
- movs r1, 0
- ldrsh r0, [r5, r1]
- adds r1, r2, 0
- bl __modsi3
- strh r0, [r5]
- adds r0, r7, 0x1
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0x2
- bls _08101C14
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08101C74: .4byte gSharedMem
-_08101C78: .4byte gSaveBlock1
-_08101C7C: .4byte 0x00000494
-_08101C80: .4byte gUnknown_083ECCF8
- thumb_func_end sub_8101BA4
-
- thumb_func_start sub_8101C84
-sub_8101C84: @ 8101C84
- push {r4,lr}
- ldr r4, _08101C9C @ =gWindowConfig_81E7128
- adds r0, r4, 0
- bl SetUpWindowConfig
- adds r0, r4, 0
- bl InitMenuWindow
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08101C9C: .4byte gWindowConfig_81E7128
- thumb_func_end sub_8101C84
-
- thumb_func_start sub_8101CA0
-sub_8101CA0: @ 8101CA0
- push {lr}
- bl ResetPaletteFade
- bl ResetSpriteData
- ldr r1, _08101CBC @ =gOamLimit
- movs r0, 0x80
- strb r0, [r1]
- bl FreeAllSpritePalettes
- bl ResetTasks
- pop {r0}
- bx r0
- .align 2, 0
-_08101CBC: .4byte gOamLimit
- thumb_func_end sub_8101CA0
-
- thumb_func_start sub_8101CC0
-sub_8101CC0: @ 8101CC0
- push {lr}
- bl sub_8106448
- bl sub_81064B8
- bl sub_81063C0
- pop {r0}
- bx r0
- thumb_func_end sub_8101CC0
-
- thumb_func_start sub_8101CD4
-sub_8101CD4: @ 8101CD4
- push {lr}
- bl sub_8104EA8
- bl sub_8104F8C
- bl sub_8103DC8
- bl sub_81050C4
- pop {r0}
- bx r0
- thumb_func_end sub_8101CD4
-
- thumb_func_start sub_8101CEC
-sub_8101CEC: @ 8101CEC
- push {lr}
- bl sub_8104048
- bl sub_8102DA8
- bl sub_8104C5C
- bl sub_8101D04
- pop {r0}
- bx r0
- thumb_func_end sub_8101CEC
-
- thumb_func_start sub_8101D04
-sub_8101D04: @ 8101D04
- push {r4,lr}
- ldr r4, _08101D20 @ =sub_8101D24
- adds r0, r4, 0
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- bl _call_via_r4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08101D20: .4byte sub_8101D24
- thumb_func_end sub_8101D04
-
- thumb_func_start sub_8101D24
-sub_8101D24: @ 8101D24
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r7, _08101D50 @ =gUnknown_083ECAAC
- lsls r1, r0, 2
- adds r1, r0
- lsls r4, r1, 3
- ldr r6, _08101D54 @ =gSharedMem
- ldr r5, _08101D58 @ =gTasks
-_08101D36:
- ldrb r0, [r6]
- lsls r0, 2
- adds r0, r7
- ldr r1, [r0]
- adds r0, r4, r5
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _08101D36
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08101D50: .4byte gUnknown_083ECAAC
-_08101D54: .4byte gSharedMem
-_08101D58: .4byte gTasks
- thumb_func_end sub_8101D24
-
- thumb_func_start sub_8101D5C
-sub_8101D5C: @ 8101D5C
- push {r4,lr}
- sub sp, 0x4
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldr r4, _08101D88 @ =gSharedMem
- ldrb r0, [r4, 0x2]
- bl sub_810423C
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
- movs r0, 0
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08101D88: .4byte gSharedMem
- thumb_func_end sub_8101D5C
-
- thumb_func_start sub_8101D8C
-sub_8101D8C: @ 8101D8C
- push {lr}
- ldr r0, _08101DA8 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08101DA2
- ldr r1, _08101DAC @ =gSharedMem
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
-_08101DA2:
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08101DA8: .4byte gPaletteFade
-_08101DAC: .4byte gSharedMem
- thumb_func_end sub_8101D8C
-
thumb_func_start sub_8101DB0
sub_8101DB0: @ 8101DB0
push {lr}
diff --git a/include/slot_machine.h b/include/slot_machine.h
index c39aa7ca8..60b1f177a 100644
--- a/include/slot_machine.h
+++ b/include/slot_machine.h
@@ -1,6 +1,37 @@
#ifndef GUARD_SLOT_MACHINE_H
#define GUARD_SLOT_MACHINE_H
+struct SlotMachineEwramStruct {
+ /*0x00*/ u8 unk00;
+ /*0x01*/ u8 unk01;
+ /*0x02*/ u8 unk02;
+ /*0x03*/ u8 unk03;
+ /*0x04*/ u8 unk04;
+ /*0x05*/ u8 filler05[3];
+ /*0x08*/ u16 unk08;
+ /*0x0A*/ u8 unk0A;
+ /*0x0B*/ u8 unk0B;
+ /*0x0C*/ u16 coins;
+ /*0x0E*/ u16 unk0E;
+ /*0x10*/ u16 unk10;
+ /*0x12*/ u16 unk12;
+ /*0x14*/ u8 filler14[4];
+ /*0x18*/ u16 unk18;
+ /*0x1A*/ u16 unk1A;
+ /*0x1C*/ s16 unk1C[3];
+ /*0x22*/ u16 unk22[3];
+ /*0x28*/ s16 unk28[3];
+ /*0x2E*/ u8 filler2E[15];
+ /*0x3D*/ u8 unk3D;
+ /*0x3E*/ u8 filler3E[26];
+ /*0x58*/ u16 win0h;
+ /*0x5a*/ u16 win0v;
+ /*0x5c*/ u16 winIn;
+ /*0x5e*/ u16 winOut;
+ /*0x60*/ u16 backupMapMusic;
+ /*0x64*/ void *unk64;
+};
+
void PlaySlotMachine(u8, void *);
void sub_8104DA4(void);
u8 sub_8105BB4(u8, u8, s16);
diff --git a/include/sprite.h b/include/sprite.h
index a87260ec0..7b6dd2bef 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -229,6 +229,8 @@ extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
extern s16 gSpriteCoordOffsetX;
extern s16 gSpriteCoordOffsetY;
+extern u8 gOamLimit;
+
extern struct Sprite gSprites[];
void ResetSpriteData(void);
diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c
index 60f8a58ff..cb1326151 100644
--- a/src/field/slot_machine.c
+++ b/src/field/slot_machine.c
@@ -1,26 +1,16 @@
#include "global.h"
+#include "random.h"
+#include "sound.h"
#include "main.h"
#include "slot_machine.h"
#include "decompress.h"
#include "palette.h"
#include "task.h"
#include "util.h"
+#include "text.h"
+#include "menu.h"
#include "ewram.h"
-struct SlotMachineEwramStruct {
- /*0x00*/ u8 unk00;
- /*0x01*/ u8 unk01;
- /*0x02*/ u8 filler02[59];
- /*0x3D*/ u8 unk3D;
- /*0x3E*/ u8 filler3E[26];
- /*0x58*/ u16 win0h;
- /*0x5a*/ u16 win0v;
- /*0x5c*/ u16 winIn;
- /*0x5e*/ u16 winOut;
- /*0x60*/ u8 filler_60[4];
- /*0x64*/ void *unk64;
-};
-
struct UnkStruct1 {
/*0x00*/ u8 unk00;
/*0x01*/ u8 unk01;
@@ -47,17 +37,30 @@ void sub_8101954(void);
void sub_81019B0(u8 arg0, void *ptr);
void nullsub_67(u8 taskId);
void sub_8101A28(void);
-void sub_8101BA4(void);
+void sub_8101A44(void);
void sub_8101A8C(void);
void sub_8101AE0(void);
void sub_8101B04(void);
+void sub_8101BA4(void);
void sub_8101C84(void);
void sub_8101CA0(void);
void sub_8101CC0(void);
void sub_8101CD4(void);
void sub_8101CEC(void);
-void sub_8101A44(void);
-
+void sub_8101D04(void);
+void sub_8101D24(u8 taskId);
+
+void sub_8102DA8(void);
+void sub_8103DC8(void);
+void sub_8104048(void);
+void sub_810423C(u8 a0);
+void sub_8104C5C(void);
+void sub_8104EA8(void);
+void sub_8104F8C(void);
+void sub_81050C4(void);
+void sub_8106448(void);
+void sub_81064B8(void);
+void sub_81063C0(void);
void PlaySlotMachine(u8 arg0, void *ptr)
{
@@ -170,6 +173,131 @@ void sub_8101AE0(void)
DmaClear16(3, (u16 *)OAM, OAM_SIZE);
}
+void sub_8101B04(void)
+{
+ REG_BG0CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2);
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28);
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29);
+ REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30);
+ REG_WININ = 0x3f;
+ REG_WINOUT = 0x3f;
+ REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ;
+ REG_BLDALPHA = 0x809;
+}
+
+extern const s16 gUnknown_083ECCF8[3][2];
+
+void sub_8101BA4(void)
+{
+ u8 i;
+
+ sub_81019EC();
+ eSlotMachine->unk00 = 0;
+ eSlotMachine->unk02 = 0;
+ eSlotMachine->unk03 = Random() & 1;
+ eSlotMachine->unk04 = 0;
+ eSlotMachine->unk08 = 0;
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->coins = gSaveBlock1.coins;
+ eSlotMachine->unk0E = 0;
+ eSlotMachine->unk10 = 0;
+ eSlotMachine->unk12 = 0;
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->unk1A = 8;
+ eSlotMachine->win0h = 0xf0;
+ eSlotMachine->win0v = 0xa0;
+ eSlotMachine->winIn = 0x3f;
+ eSlotMachine->winOut = 0x3f;
+ eSlotMachine->backupMapMusic = GetCurrentMapMusic();
+ for (i = 0; i < 3; i++)
+ {
+ eSlotMachine->unk22[i] = 0;
+ eSlotMachine->unk28[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21;
+ eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->unk28[i] * 24;
+ eSlotMachine->unk1C[i] %= 0x1f8;
+ }
+}
+
+void sub_8101C84(void)
+{
+ SetUpWindowConfig(&gWindowConfig_81E7128);
+ InitMenuWindow(&gWindowConfig_81E7128);
+}
+
+void sub_8101CA0(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ gOamLimit = 128;
+ FreeAllSpritePalettes();
+ ResetTasks();
+}
+
+void sub_8101CC0(void)
+{
+ sub_8106448();
+ sub_81064B8();
+ sub_81063C0();
+}
+
+void sub_8101CD4(void)
+{
+ sub_8104EA8();
+ sub_8104F8C();
+ sub_8103DC8();
+ sub_81050C4();
+}
+
+void sub_8101CEC(void)
+{
+ sub_8104048();
+ sub_8102DA8();
+ sub_8104C5C();
+ sub_8101D04();
+}
+
+extern bool8 (*const gUnknown_083ECAAC[])(struct Task *task);
+
+void sub_8101D04(void)
+{
+ sub_8101D24(CreateTask(sub_8101D24, 0));
+}
+
+void sub_8101D24(u8 taskId)
+{
+ while (gUnknown_083ECAAC[eSlotMachine->unk00](gTasks + taskId));
+}
+
+bool8 sub_8101D5C(struct Task *task)
+{
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ sub_810423C(eSlotMachine->unk02);
+ eSlotMachine->unk00++;
+ return FALSE;
+}
+
+bool8 sub_8101D8C(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ eSlotMachine->unk00++;
+ }
+ return FALSE;
+}
+
asm(".section .text_a");
static void LoadSlotMachineWheelOverlay(void);