summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/slot_machine.s249
-rw-r--r--include/slot_machine.h6
-rw-r--r--src/field/slot_machine.c100
3 files changed, 88 insertions, 267 deletions
diff --git a/asm/slot_machine.s b/asm/slot_machine.s
index d12c6ef9c..32299d7d0 100644
--- a/asm/slot_machine.s
+++ b/asm/slot_machine.s
@@ -5,255 +5,6 @@
.text
- thumb_func_start sub_8102C48
-sub_8102C48: @ 8102C48
- push {lr}
- ldr r1, _08102C7C @ =gSharedMem
- movs r2, 0x16
- ldrsh r1, [r1, r2]
- lsls r0, 16
- asrs r0, 16
- adds r1, r0
- adds r0, r1, 0
- movs r1, 0x6
- bl __modsi3
- lsls r0, 16
- lsrs r1, r0, 16
- asrs r0, 16
- cmp r0, 0
- bge _08102C6E
- adds r0, 0x6
- lsls r0, 16
- lsrs r1, r0, 16
-_08102C6E:
- ldr r0, _08102C80 @ =gUnknown_083ECCF1
- lsls r1, 16
- asrs r1, 16
- adds r1, r0
- ldrb r0, [r1]
- pop {r1}
- bx r1
- .align 2, 0
-_08102C7C: .4byte gSharedMem
-_08102C80: .4byte gUnknown_083ECCF1
- thumb_func_end sub_8102C48
-
- thumb_func_start sub_8102C84
-sub_8102C84: @ 8102C84
- push {r4-r6,lr}
- adds r5, r0, 0
- lsls r5, 24
- ldr r6, _08102CC8 @ =gSharedMem
- lsrs r5, 23
- adds r4, r6, 0
- adds r4, 0x1C
- adds r4, r5, r4
- lsls r1, 16
- asrs r1, 16
- ldrh r0, [r4]
- adds r1, r0
- strh r1, [r4]
- movs r1, 0
- ldrsh r0, [r4, r1]
- movs r1, 0xFC
- lsls r1, 1
- bl __modsi3
- strh r0, [r4]
- adds r6, 0x28
- adds r5, r6
- movs r1, 0
- ldrsh r0, [r4, r1]
- movs r1, 0x18
- bl __divsi3
- movs r1, 0x15
- subs r1, r0
- strh r1, [r5]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08102CC8: .4byte gSharedMem
- thumb_func_end sub_8102C84
-
- thumb_func_start sub_8102CCC
-sub_8102CCC: @ 8102CCC
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r0, 24
- adds r6, r0, 0
- lsls r1, 16
- lsrs r4, r1, 16
- ldr r0, _08102D24 @ =gSharedMem
- lsls r1, r6, 1
- adds r0, 0x1C
- adds r5, r1, r0
- movs r1, 0
- ldrsh r0, [r5, r1]
- movs r1, 0x18
- bl __modsi3
- lsls r0, 16
- lsrs r0, 16
- lsls r2, r0, 16
- asrs r1, r2, 16
- cmp r1, 0
- beq _08102D18
- lsls r0, r4, 16
- asrs r0, 16
- cmp r1, r0
- bge _08102D00
- lsrs r4, r2, 16
-_08102D00:
- lsls r1, r4, 16
- asrs r1, 16
- adds r0, r6, 0
- bl sub_8102C84
- movs r1, 0
- ldrsh r0, [r5, r1]
- movs r1, 0x18
- bl __modsi3
- lsls r0, 16
- lsrs r0, 16
-_08102D18:
- lsls r0, 16
- asrs r0, 16
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08102D24: .4byte gSharedMem
- thumb_func_end sub_8102CCC
-
- thumb_func_start sub_8102D28
-sub_8102D28: @ 8102D28
- push {r4,lr}
- ldr r4, _08102D58 @ =gSharedMem
- lsls r0, 16
- asrs r0, 16
- ldrh r1, [r4, 0x14]
- adds r0, r1
- strh r0, [r4, 0x14]
- movs r1, 0x14
- ldrsh r0, [r4, r1]
- movs r1, 0x78
- bl __modsi3
- strh r0, [r4, 0x14]
- movs r1, 0x14
- ldrsh r0, [r4, r1]
- movs r1, 0x14
- bl __divsi3
- movs r1, 0x6
- subs r1, r0
- strh r1, [r4, 0x16]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08102D58: .4byte gSharedMem
- thumb_func_end sub_8102D28
-
- thumb_func_start sub_8102D5C
-sub_8102D5C: @ 8102D5C
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r5, _08102DA4 @ =gSharedMem
- movs r1, 0x14
- ldrsh r0, [r5, r1]
- movs r1, 0x14
- bl __modsi3
- lsls r0, 16
- lsrs r0, 16
- lsls r2, r0, 16
- asrs r1, r2, 16
- cmp r1, 0
- beq _08102D9A
- lsls r0, r4, 16
- asrs r0, 16
- cmp r1, r0
- bge _08102D84
- lsrs r4, r2, 16
-_08102D84:
- lsls r0, r4, 16
- asrs r0, 16
- bl sub_8102D28
- movs r1, 0x14
- ldrsh r0, [r5, r1]
- movs r1, 0x14
- bl __modsi3
- lsls r0, 16
- lsrs r0, 16
-_08102D9A:
- lsls r0, 16
- asrs r0, 16
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08102DA4: .4byte gSharedMem
- thumb_func_end sub_8102D5C
-
- thumb_func_start sub_8102DA8
-sub_8102DA8: @ 8102DA8
- push {r4-r7,lr}
- movs r4, 0
- ldr r5, _08102DE0 @ =sub_8102E68
- ldr r7, _08102DE4 @ =gTasks
- ldr r6, _08102DE8 @ =gSharedMem + 0x3A
-_08102DB2:
- adds r0, r5, 0
- movs r1, 0x2
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r7
- strh r4, [r1, 0x26]
- adds r1, r4, r6
- strb r0, [r1]
- bl _call_via_r5
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x2
- bls _08102DB2
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08102DE0: .4byte sub_8102E68
-_08102DE4: .4byte gTasks
-_08102DE8: .4byte gSharedMem + 0x3A
- thumb_func_end sub_8102DA8
-
- thumb_func_start sub_8102DEC
-sub_8102DEC: @ 8102DEC
- lsls r0, 24
- lsrs r0, 24
- ldr r3, _08102E14 @ =gTasks
- ldr r1, _08102E18 @ =gSharedMem
- adds r1, 0x3A
- adds r0, r1
- ldrb r2, [r0]
- lsls r1, r2, 2
- adds r1, r2
- lsls r1, 3
- adds r1, r3
- movs r2, 0x1
- strh r2, [r1, 0x8]
- ldrb r1, [r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r3
- strh r2, [r0, 0x24]
- bx lr
- .align 2, 0
-_08102E14: .4byte gTasks
-_08102E18: .4byte gSharedMem
- thumb_func_end sub_8102DEC
-
thumb_func_start sub_8102E1C
sub_8102E1C: @ 8102E1C
lsls r0, 24
diff --git a/include/slot_machine.h b/include/slot_machine.h
index 738866318..c5e14f719 100644
--- a/include/slot_machine.h
+++ b/include/slot_machine.h
@@ -17,13 +17,15 @@ struct SlotMachineEwramStruct {
/*0x0E*/ s16 unk0E;
/*0x10*/ s16 unk10;
/*0x12*/ s16 bet;
- /*0x14*/ u8 filler14[4];
+ /*0x14*/ s16 unk14;
+ /*0x16*/ s16 unk16;
/*0x18*/ s16 unk18;
/*0x1A*/ u16 unk1A;
/*0x1C*/ s16 unk1C[3];
/*0x22*/ u16 unk22[3];
/*0x28*/ s16 unk28[3];
- /*0x2E*/ u8 filler2E[15];
+ /*0x2E*/ u8 filler2E[12];
+ /*0x3A*/ u8 unk3A[3];
/*0x3D*/ u8 unk3D;
/*0x3E*/ u8 filler3E[26];
/*0x58*/ u16 win0h;
diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c
index 9e3d70727..6f1e7610a 100644
--- a/src/field/slot_machine.c
+++ b/src/field/slot_machine.c
@@ -89,17 +89,19 @@ static u8 sub_8102578(void);
u16 dp15_jump_random_unknown(void);
static u8 sub_81025BC(void);
static void sub_81027A0(void);
-void sub_81027D0(void);
-void sub_8102840(void);
-void sub_810290C(void);
-u8 sub_81029D4(u8 a0, u8 a1, u8 a2);
-void sub_8102A24(void);
+static void sub_81027D0(void);
+static void sub_8102840(void);
+static void sub_810290C(void);
+static u8 sub_81029D4(u8 c1, u8 c2, u8 c3);
+static void sub_8102A24(void);
+static void sub_8102A64(u8 taskId);
bool8 sub_8102A44(void);
-u8 sub_8102BA4(u8 a0, s16 a1);
-void sub_8102DA8(void);
-void sub_8102DEC(u8 a0);
+u8 sub_8102BA4(u8 x, s16 y);
+static void sub_8102DA8(void);
+static void sub_8102DEC(u8 a0);
void sub_8102E1C(u8 a0);
bool8 sub_8102E40(u8 a0);
+void sub_8102E68(u8 taskId);
void sub_8103C14(u8 a0);
void sub_8103D50(u8 a0);
void sub_8103D8C(u8 a0);
@@ -1036,7 +1038,7 @@ static void sub_81027A0(void)
extern const u16 gUnknown_083ECE6C[];
extern const u16 gUnknown_083ECE5A[];
-void sub_81027D0(void)
+static void sub_81027D0(void)
{
u8 c1, c2, c3, payout;
@@ -1052,7 +1054,7 @@ void sub_81027D0(void)
}
}
-void sub_8102840(void)
+static void sub_8102840(void)
{
u8 c1, c2, c3, payout;
@@ -1086,7 +1088,7 @@ void sub_8102840(void)
}
}
-void sub_810290C(void)
+static void sub_810290C(void)
{
u8 c1, c2, c3, payout;
@@ -1120,7 +1122,7 @@ void sub_810290C(void)
extern const u8 gUnknown_083ECE52[];
-u8 sub_81029D4(u8 c1, u8 c2, u8 c3)
+static u8 sub_81029D4(u8 c1, u8 c2, u8 c3)
{
if (c1 == c2 && c1 == c3)
{
@@ -1141,9 +1143,7 @@ u8 sub_81029D4(u8 c1, u8 c2, u8 c3)
return 9;
}
-void sub_8102A64(u8 taskId);
-
-void sub_8102A24(void)
+static void sub_8102A24(void)
{
sub_8102A64(CreateTask(sub_8102A64, 4));
}
@@ -1159,7 +1159,7 @@ bool8 sub_8102A44(void)
extern bool8 (*const gUnknown_083ECB20[])(struct Task *task);
-void sub_8102A64(u8 taskId)
+static void sub_8102A64(u8 taskId)
{
while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId));
}
@@ -1243,6 +1243,74 @@ u8 sub_8102BF8(u8 x, s16 y)
return sub_8102BA4(x, y + r6);
}
+extern const u8 gUnknown_083ECCF1[];
+
+u8 sub_8102C48(s16 a0)
+{
+ s16 r1 = (eSlotMachine->unk16 + a0) % 6;
+ if (r1 < 0)
+ r1 += 6;
+ return gUnknown_083ECCF1[r1];
+}
+
+void sub_8102C84(u8 a0, s16 a1)
+{
+ eSlotMachine->unk1C[a0] += a1;
+ eSlotMachine->unk1C[a0] %= 504;
+ eSlotMachine->unk28[a0] = 21 - eSlotMachine->unk1C[a0] / 24;
+}
+
+s16 sub_8102CCC(u8 a0, s16 a1)
+{
+ s16 r1 = eSlotMachine->unk1C[a0] % 24;
+ if (r1 != 0)
+ {
+ if (r1 < a1)
+ a1 = r1;
+ sub_8102C84(a0, a1);
+ r1 = eSlotMachine->unk1C[a0] % 24;
+ }
+ return r1;
+}
+
+void sub_8102D28(s16 a0)
+{
+ eSlotMachine->unk14 += a0;
+ eSlotMachine->unk14 %= 120;
+ eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20;
+}
+
+s16 sub_8102D5C(s16 a0)
+{
+ s16 r1 = eSlotMachine->unk14 % 20;
+ if (r1 != 0)
+ {
+ if (r1 < a0)
+ a0 = r1;
+ sub_8102D28(a0);
+ r1 = eSlotMachine->unk14 % 20;
+ }
+ return r1;
+}
+
+static void sub_8102DA8(void)
+{
+ u8 i;
+ for (i = 0; i < 3; i++)
+ {
+ u8 taskId = CreateTask(sub_8102E68, 2);
+ gTasks[taskId].data[15] = i;
+ eSlotMachine->unk3A[i] = taskId;
+ sub_8102E68(taskId);
+ }
+}
+
+static void sub_8102DEC(u8 a0)
+{
+ gTasks[eSlotMachine->unk3A[a0]].data[0] = 1;
+ gTasks[eSlotMachine->unk3A[a0]].data[14] = 1;
+}
+
asm(".section .text_a");
static void LoadSlotMachineWheelOverlay(void);