summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/roulette.c1648
-rw-r--r--src/roulette_util.c80
2 files changed, 1666 insertions, 62 deletions
diff --git a/src/roulette.c b/src/roulette.c
index 76b5a4d9c..1661cce03 100644
--- a/src/roulette.c
+++ b/src/roulette.c
@@ -22,6 +22,10 @@
#include "rom4.h"
#include "string_util.h"
#include "field_fadetransition.h"
+#include "script.h"
+#include "strings2.h"
+
+asm(".include \"constants/gba_constants.inc\"");
extern u8 gUnknown_02019000[];
extern u16 gSpecialVar_0x8004;
@@ -53,9 +57,14 @@ extern const u16 gUnknown_083F8ECE;
struct StructUnknown_083F8C00
{
u8 var00;
- u8 var01;
- u16 var02;
- u32 var04;
+ u8 var01_0:4;
+ u8 var01_4:4;
+ u8 var02;
+ u8 var03;
+ u8 var04;
+ u8 var05;
+ u8 var06;
+ u8 var07;
u32 var08;
u32 var0C;
u16 var10;
@@ -91,6 +100,45 @@ extern const u32 gUnknown_083F8EE8[];
extern const struct UnkStruct1 gUnknown_083F8E9C[];
+extern const u8 gUnknown_083F8EF4[];
+
+extern const struct YesNoFuncTable gUnknown_083F8EB4;
+
+//Strings TODO: give proper names
+extern const u8 gUnknown_081C40DF;
+extern const u8 gUnknown_081C4139;
+extern const u8 gUnknown_081C411C;
+
+extern const u8 gUnknown_083F92A8[];
+extern const u8 gUnknown_083F90FC[];
+extern const u8 gUnknown_083F9D3C[];
+extern const struct SpritePalette gUnknown_083F9E30;
+extern const struct SpriteSheet gUnknown_083F9F54;
+extern const struct SpriteSheet gUnknown_083F9F5C;
+extern const struct SpriteTemplate gSpriteTemplate_83FA07C[];
+extern const struct SpriteTemplate gSpriteTemplate_83F9FD4[];
+extern const struct SpriteTemplate gSpriteTemplate_83FA034[];
+
+extern const struct SpriteTemplate gSpriteTemplate_83FA40C;
+
+extern const struct SpriteSheet gUnknown_083F9EE8;
+extern const struct SpriteTemplate gSpriteTemplate_83FA0DC[];
+
+extern struct OamMatrix gOamMatrices[];
+
+extern const struct SpriteSheet gUnknown_083FA21C[];
+extern const struct SpriteTemplate gSpriteTemplate_83FA2B0;
+extern const struct SpriteTemplate gSpriteTemplate_83FA2C8;
+extern const struct SpriteTemplate gSpriteTemplate_83FA2E0;
+extern const struct SpriteTemplate gSpriteTemplate_83FA2F8;
+extern const struct SpriteTemplate gSpriteTemplate_83FA310;
+
+extern const u8 gUnknown_083FA608[0x5];
+
+extern const struct SpriteSheet gUnknown_083FA42C;
+extern const struct SpriteTemplate gSpriteTemplate_83FA434;
+
+
void sub_8117434(void);
void sub_8117838(u8);
@@ -158,10 +206,15 @@ void dp01t_12_3_battle_menu(u8);
extern u8 ewram[];
+#define ewram17000 ((u16 *) (ewram + 0x17000)) //money stuff?
+#define ewram17E00 ((u16 *) (ewram + 0x17E00))
+#define ewram17800 ((u16 *) (ewram + 0x17800))
+#define ewram18000 ((u16 *) (ewram + 0x18000))
+#define ewram18800 ((u16 *) (ewram + 0x18800))
+#define ewram189a0 ((u16 *) (ewram + 0x189a0))
#define ewram18a20 ((u16 *) (ewram + 0x18a20))
#define ewram18a32 ((u16 *) (ewram + 0x18A32))
#define ewram18a80 ((u16 *) (ewram + 0x18a80))
-#define ewram19000 ((u8 *) (ewram + 0x19000))
#define RDATA ((struct RData *) (ewram + 0x19000))
#define S16TOPOSFLOAT(val) \
@@ -172,7 +225,7 @@ extern u8 ewram[];
f; \
})
-struct Matrix
+struct OamMatrix
{
s16 a;
s16 b;
@@ -221,13 +274,11 @@ struct RData /* ewram + 0x19000 */
s16 var26;
s16 var28;
s16 var2A;
- struct Matrix var2C;
+ struct OamMatrix var2C;
u16 var34;
u8 v99[0x2];
struct Sprite *var38;
- u8 var3C[0x30]; // TODO: add some defines for the different areas
- u8 var6C;
- u8 v6[0xF];
+ u8 var3C[0x40]; // Sprite IDs ? TODO: add some defines for the different areas
u8 var7C;
u8 var7D;
u8 var7E;
@@ -257,15 +308,11 @@ struct RData /* ewram + 0x19000 */
void sub_81150FC(void)
{
- u8 *p;
- struct UnkStruct0 *s;
RunTasks();
AnimateSprites();
BuildOamBuffer();
- p = ewram19000;
- s = (struct UnkStruct0 *)(&p[0xB8]);
- if (s->val0)
- task_tutorial_controls_fadein(s);
+ if (RDATA->varB8.val0)
+ task_tutorial_controls_fadein(&RDATA->varB8);
}
void sub_8115124(void)
@@ -1474,7 +1521,7 @@ void sub_8116880(u8 taskid)
gTasks[taskid].data[0x4] = i;
RDATA->var1B[RDATA->var1A_0] = 0x0;
sub_8117158(0x0);
- gSprites[RDATA->var6C].invisible = TRUE;
+ gSprites[RDATA->var3C[0x30]].invisible = TRUE;
for (i = 0; i < 0x4; i++)
{
gSprites[RDATA->var3C[i + 0x29]].oam.tileNum =
@@ -1683,7 +1730,8 @@ u8 sub_8116E5C(u8 r0, u8 r1)
}
return 0x0;
}
-/*
+
+#ifdef NONMATCHING // stack variable switched with a register variable
void sub_8116EF8(u8 r0)
{
@@ -1738,7 +1786,6 @@ void sub_8116EF8(u8 r0)
}
else
{
- //u8 i;
for (i = 0; i < 0x3; i++)
{
u8 var4 = i * 0x5 + r0 + 0x5;
@@ -1758,4 +1805,1569 @@ void sub_8116EF8(u8 r0)
}
}
}
+
+#else
+__attribute__((naked))
+void sub_8116EF8(u8 r0)
+{
+asm(".syntax unified\n\
+push {r4-r7,lr}\n\
+mov r7, r10\n\
+mov r6, r9\n\
+mov r5, r8\n\
+push {r5-r7}\n\
+sub sp, 0x20\n\
+lsls r0, 24\n\
+lsrs r6, r0, 24\n\
+movs r0, 0\n\
+str r0, [sp, 0x18]\n\
+cmp r6, 0xA\n\
+beq _08116F1E\n\
+cmp r6, 0xA\n\
+bgt _08116F1A\n\
+cmp r6, 0x5\n\
+beq _08116F1E\n\
+b _08116F7C\n\
+_08116F1A:\n\
+cmp r6, 0xF\n\
+bne _08116F7C\n\
+_08116F1E:\n\
+adds r0, r6, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+adds r0, r6, 0x5\n\
+ldr r7, _08116F70 @ =0x020190b8\n\
+cmp r4, r0\n\
+bge _08116F5E\n\
+adds r1, r7, 0\n\
+subs r1, 0xB8\n\
+ldr r3, _08116F74 @ =gUnknown_083F8C00\n\
+ldr r5, [r1, 0x8]\n\
+adds r6, r3, 0\n\
+adds r6, 0x8\n\
+adds r2, r0, 0\n\
+_08116F3A:\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+lsls r1, r0, 2\n\
+adds r0, r1, r6\n\
+ldr r0, [r0]\n\
+ands r0, r5\n\
+cmp r0, 0\n\
+bne _08116F54\n\
+adds r0, r1, r3\n\
+ldrh r0, [r0, 0x10]\n\
+ldr r1, [sp, 0x18]\n\
+orrs r1, r0\n\
+str r1, [sp, 0x18]\n\
+_08116F54:\n\
+adds r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+cmp r4, r2\n\
+blt _08116F3A\n\
+_08116F5E:\n\
+ldr r0, _08116F78 @ =0x0000dfff\n\
+ldr r2, [sp, 0x18]\n\
+ands r2, r0\n\
+str r2, [sp, 0x18]\n\
+adds r0, r7, 0\n\
+adds r1, r2, 0\n\
+bl sub_8124CE8\n\
+b _0811713C\n\
+.align 2, 0\n\
+_08116F70: .4byte 0x020190b8\n\
+_08116F74: .4byte gUnknown_083F8C00\n\
+_08116F78: .4byte 0x0000dfff\n\
+_08116F7C:\n\
+mov r0, sp\n\
+ldr r1, _08116FC8 @ =gUnknown_083F8E9C\n\
+ldm r1!, {r2-r4}\n\
+stm r0!, {r2-r4}\n\
+ldm r1!, {r2-r4}\n\
+stm r0!, {r2-r4}\n\
+subs r0, r6, 0x1\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+movs r3, 0x1\n\
+mov r10, r3\n\
+cmp r0, 0x3\n\
+bhi _08116F9A\n\
+movs r4, 0x3\n\
+mov r10, r4\n\
+_08116F9A:\n\
+adds r0, r6, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+lsls r0, 24\n\
+lsrs r0, 8\n\
+ldr r1, _08116FCC @ =0xffff0000\n\
+adds r0, r1\n\
+lsrs r7, r0, 16\n\
+adds r0, r6, 0\n\
+movs r1, 0x5\n\
+bl __umodsi3\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+cmp r0, 0x2\n\
+beq _08116FF8\n\
+cmp r0, 0x2\n\
+bgt _08116FD4\n\
+cmp r0, 0x1\n\
+beq _08116FE4\n\
+ldr r4, _08116FD0 @ =0x02019000\n\
+b _0811703A\n\
+.align 2, 0\n\
+_08116FC8: .4byte gUnknown_083F8E9C\n\
+_08116FCC: .4byte 0xffff0000\n\
+_08116FD0: .4byte 0x02019000\n\
+_08116FD4:\n\
+cmp r0, 0x3\n\
+beq _0811700C\n\
+cmp r0, 0x4\n\
+beq _08117020\n\
+ldr r4, _08116FE0 @ =0x02019000\n\
+b _0811703A\n\
+.align 2, 0\n\
+_08116FE0: .4byte 0x02019000\n\
+_08116FE4:\n\
+ldr r3, _08116FF0 @ =gSprites\n\
+ldr r2, _08116FF4 @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x43\n\
+b _08117028\n\
+.align 2, 0\n\
+_08116FF0: .4byte gSprites\n\
+_08116FF4: .4byte 0x02019000\n\
+_08116FF8:\n\
+ldr r3, _08117004 @ =gSprites\n\
+ldr r2, _08117008 @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x44\n\
+b _08117028\n\
+.align 2, 0\n\
+_08117004: .4byte gSprites\n\
+_08117008: .4byte 0x02019000\n\
+_0811700C:\n\
+ldr r3, _08117018 @ =gSprites\n\
+ldr r2, _0811701C @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x45\n\
+b _08117028\n\
+.align 2, 0\n\
+_08117018: .4byte gSprites\n\
+_0811701C: .4byte 0x02019000\n\
+_08117020:\n\
+ldr r3, _08117088 @ =gSprites\n\
+ldr r2, _0811708C @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x46\n\
+_08117028:\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 4\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+adds r0, r3\n\
+ldrb r0, [r0, 0x5]\n\
+lsrs r0, 4\n\
+lsls r7, r0, 4\n\
+adds r4, r2, 0\n\
+_0811703A:\n\
+mov r2, r10\n\
+cmp r2, 0x1\n\
+bne _08117094\n\
+ldr r1, _08117090 @ =gUnknown_083F8C00\n\
+lsls r2, r6, 2\n\
+adds r0, r2, r6\n\
+lsls r0, 2\n\
+adds r1, 0x8\n\
+adds r0, r1\n\
+ldr r1, [r4, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+str r2, [sp, 0x1C]\n\
+cmp r1, 0\n\
+bne _0811713C\n\
+adds r0, r6, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+subs r1, r0, 0x1\n\
+lsls r1, 3\n\
+mov r3, sp\n\
+adds r2, r3, r1\n\
+ldrh r1, [r2, 0x2]\n\
+adds r1, r7, r1\n\
+strh r1, [r2, 0x2]\n\
+adds r1, r4, 0\n\
+adds r1, 0xB8\n\
+lsls r0, 3\n\
+subs r0, 0x8\n\
+adds r2, r3, r0\n\
+adds r0, r1, 0\n\
+movs r1, 0xD\n\
+bl sub_812492C\n\
+b _08117122\n\
+.align 2, 0\n\
+_08117088: .4byte gSprites\n\
+_0811708C: .4byte 0x02019000\n\
+_08117090: .4byte gUnknown_083F8C00\n\
+_08117094:\n\
+movs r4, 0\n\
+lsls r0, r6, 2\n\
+str r0, [sp, 0x1C]\n\
+ldr r1, _0811714C @ =0x02019000\n\
+mov r8, r1\n\
+ldr r2, _08117150 @ =gUnknown_083F8C00\n\
+mov r9, r2\n\
+_081170A2:\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+adds r0, r6, r0\n\
+adds r0, 0x5\n\
+lsls r0, 24\n\
+lsrs r2, r0, 24\n\
+lsls r0, r2, 2\n\
+adds r0, r2\n\
+lsls r5, r0, 2\n\
+mov r0, r9\n\
+adds r0, 0x8\n\
+adds r0, r5, r0\n\
+mov r3, r8\n\
+ldr r1, [r3, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+bne _0811710E\n\
+adds r0, r2, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+subs r1, r0, 0x1\n\
+lsls r1, 3\n\
+mov r3, sp\n\
+adds r2, r3, r1\n\
+ldrh r1, [r2, 0x2]\n\
+adds r1, r7, r1\n\
+strh r1, [r2, 0x2]\n\
+adds r1, r4, 0\n\
+adds r1, 0xD\n\
+lsls r1, 24\n\
+lsrs r1, 24\n\
+lsls r0, 3\n\
+subs r0, 0x8\n\
+adds r2, r3, r0\n\
+mov r0, r8\n\
+adds r0, 0xB8\n\
+bl sub_812492C\n\
+mov r0, r10\n\
+cmp r0, 0x3\n\
+bne _08117104\n\
+mov r1, r9\n\
+adds r0, r5, r1\n\
+ldrh r0, [r0, 0x10]\n\
+str r0, [sp, 0x18]\n\
+_08117104:\n\
+mov r0, r10\n\
+subs r0, 0x1\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+mov r10, r0\n\
+_0811710E:\n\
+adds r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+cmp r4, 0x2\n\
+bls _081170A2\n\
+mov r2, r10\n\
+cmp r2, 0x2\n\
+beq _08117122\n\
+movs r3, 0\n\
+str r3, [sp, 0x18]\n\
+_08117122:\n\
+ldr r0, _08117154 @ =0x020190b8\n\
+ldr r2, _08117150 @ =gUnknown_083F8C00\n\
+ldr r4, [sp, 0x1C]\n\
+adds r1, r4, r6\n\
+lsls r1, 2\n\
+adds r1, r2\n\
+ldrh r1, [r1, 0x10]\n\
+ldr r2, [sp, 0x18]\n\
+orrs r2, r1\n\
+str r2, [sp, 0x18]\n\
+adds r1, r2, 0\n\
+bl sub_8124CE8\n\
+_0811713C:\n\
+add sp, 0x20\n\
+pop {r3-r5}\n\
+mov r8, r3\n\
+mov r9, r4\n\
+mov r10, r5\n\
+pop {r4-r7}\n\
+pop {r0}\n\
+bx r0\n\
+.align 2, 0\n\
+_0811714C: .4byte 0x02019000\n\
+_08117150: .4byte gUnknown_083F8C00\n\
+_08117154: .4byte 0x020190b8\n\
+.syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING //not enough stack usage
+void sub_8117158(u8 r0)
+{
+ u8 i;
+ u8 l;
+ u8 v[0x5];
+ u8 z;
+ u8 var0;
+ u8 var1;
+ u16 var2;
+ RDATA->var2A = 0x1;
+ sub_8117AA8(0x0, 0x0);
+ sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18800, 0xE, 0x7, 0x10, 0xD);
+ switch(r0)
+ {
+ case 0x0:
+ return;
+ case 0x1 ... 0x4:
+ l = 0x4;
+ for (i = 0x0; i < l; i++)
+ v[i] = i * 0x5 + r0;
+ break;
+ case 0x5:
+ case 0xA:
+ case 0xF:
+ l = 0x5;
+ for (i = 0x0; i < l; i++)
+ v[i] = i + r0;
+ break;
+ default:
+ l = 0x1;
+ v[0] = r0;
+ }
+ for (i = 0x0; i < l; i++)
+ {
+ //_0811727C
+ var0 = gUnknown_083F8C00[v[i]].var06;
+ var1 = gUnknown_083F8C00[v[i]].var03;
+ for (z = 0; z < 0x3; z++)
+ {
+ var2 = (gUnknown_083F8C00[v[i]].var04 + z) * 0x20;
+ gBGTilemapBuffers[2][var2 + var1 + 0x0] = ewram189a0[(var0 + z) * 0x3 + 0x0];
+ gBGTilemapBuffers[2][var2 + var1 + 0x1] = ewram189a0[(var0 + z) * 0x3 + 0x1];
+ gBGTilemapBuffers[2][var2 + var1 + 0x2] = ewram189a0[(var0 + z) * 0x3 + 0x2];
+ }
+ //_08117350
+ }
+}
+#else
+__attribute__((naked))
+void sub_8117158(u8 r0)
+{
+asm(".syntax unified\n\
+push {r4-r7,lr}\n\
+mov r7, r10\n\
+mov r6, r9\n\
+mov r5, r8\n\
+push {r5-r7}\n\
+sub sp, 0x24\n\
+lsls r0, 24\n\
+lsrs r5, r0, 24\n\
+ldr r4, _0811719C @ =0x02019000\n\
+movs r0, 0x1\n\
+strh r0, [r4, 0x2A]\n\
+movs r0, 0\n\
+movs r1, 0\n\
+bl sub_8117AA8\n\
+ldr r0, _081171A0 @ =gBGTilemapBuffers + 0x800\n\
+ldr r1, _081171A4 @ =0xfffff800\n\
+adds r4, r1\n\
+movs r1, 0x10\n\
+str r1, [sp]\n\
+movs r1, 0xD\n\
+str r1, [sp, 0x4]\n\
+adds r1, r4, 0\n\
+movs r2, 0xE\n\
+movs r3, 0x7\n\
+bl sub_8124E2C\n\
+cmp r5, 0xF\n\
+bhi _08117250\n\
+lsls r0, r5, 2\n\
+ldr r1, _081171A8 @ =_081171AC\n\
+adds r0, r1\n\
+ldr r0, [r0]\n\
+mov pc, r0\n\
+.align 2, 0\n\
+_0811719C: .4byte 0x02019000\n\
+_081171A0: .4byte gBGTilemapBuffers + 0x800\n\
+_081171A4: .4byte 0xfffff800\n\
+_081171A8: .4byte _081171AC\n\
+.align 2, 0\n\
+_081171AC:\n\
+.4byte _08117360\n\
+.4byte _081171EC\n\
+.4byte _081171EC\n\
+.4byte _081171EC\n\
+.4byte _081171EC\n\
+.4byte _08117220\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117220\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117220\n\
+_081171EC:\n\
+movs r0, 0x4\n\
+str r0, [sp, 0x18]\n\
+add r1, sp, 0x8\n\
+movs r0, 0\n\
+strb r0, [r1]\n\
+adds r0, r1, 0\n\
+ldrb r0, [r0]\n\
+cmp r0, 0x3\n\
+bhi _08117258\n\
+add r4, sp, 0x10\n\
+adds r3, r1, 0\n\
+_08117202:\n\
+ldrb r2, [r3]\n\
+adds r2, r4\n\
+ldrb r1, [r3]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+adds r0, r5, r0\n\
+strb r0, [r2]\n\
+ldrb r0, [r3]\n\
+adds r0, 0x1\n\
+strb r0, [r3]\n\
+ldrb r0, [r3]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcc _08117202\n\
+b _08117258\n\
+_08117220:\n\
+movs r0, 0x5\n\
+str r0, [sp, 0x18]\n\
+add r1, sp, 0x8\n\
+movs r0, 0\n\
+strb r0, [r1]\n\
+adds r0, r1, 0\n\
+ldrb r0, [r0]\n\
+cmp r0, 0x4\n\
+bhi _08117258\n\
+add r3, sp, 0x10\n\
+adds r2, r1, 0\n\
+_08117236:\n\
+ldrb r1, [r2]\n\
+adds r1, r3\n\
+ldrb r0, [r2]\n\
+adds r0, r5, r0\n\
+strb r0, [r1]\n\
+ldrb r0, [r2]\n\
+adds r0, 0x1\n\
+strb r0, [r2]\n\
+ldrb r0, [r2]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcc _08117236\n\
+b _08117258\n\
+_08117250:\n\
+movs r0, 0x1\n\
+str r0, [sp, 0x18]\n\
+add r0, sp, 0x10\n\
+strb r5, [r0]\n\
+_08117258:\n\
+add r1, sp, 0x8\n\
+movs r0, 0\n\
+strb r0, [r1]\n\
+adds r0, r1, 0\n\
+ldrb r0, [r0]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcs _08117360\n\
+mov r0, sp\n\
+adds r0, 0xE\n\
+str r0, [sp, 0x1C]\n\
+add r1, sp, 0x10\n\
+mov r9, r1\n\
+add r0, sp, 0x8\n\
+mov r12, r0\n\
+mov r1, sp\n\
+adds r1, 0xA\n\
+str r1, [sp, 0x20]\n\
+_0811727C:\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+add r0, r9\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+ldr r1, _08117370 @ =gUnknown_083F8C00\n\
+adds r0, r1\n\
+ldrb r0, [r0, 0x6]\n\
+ldr r1, [sp, 0x1C]\n\
+strb r0, [r1]\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+add r0, r9\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+ldr r1, _08117370 @ =gUnknown_083F8C00\n\
+adds r0, r1\n\
+ldrb r0, [r0, 0x3]\n\
+ldr r1, [sp, 0x20]\n\
+strh r0, [r1]\n\
+mov r4, sp\n\
+adds r4, 0x9\n\
+movs r0, 0\n\
+strb r0, [r4]\n\
+ldrb r0, [r4]\n\
+cmp r0, 0x2\n\
+bhi _08117350\n\
+add r5, sp, 0xC\n\
+ldr r7, [sp, 0x20]\n\
+ldr r0, _08117374 @ =gBGTilemapBuffers + 0x800\n\
+mov r8, r0\n\
+ldr r6, [sp, 0x1C]\n\
+ldr r1, _08117378 @ =0x020189a0\n\
+mov r10, r1\n\
+_081172C8:\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+add r0, r9\n\
+ldrb r0, [r0]\n\
+lsls r1, r0, 2\n\
+adds r1, r0\n\
+lsls r1, 2\n\
+ldr r0, _08117370 @ =gUnknown_083F8C00\n\
+adds r1, r0\n\
+adds r3, r4, 0\n\
+ldrb r0, [r4]\n\
+ldrb r1, [r1, 0x4]\n\
+adds r0, r1\n\
+lsls r0, 5\n\
+strh r0, [r5]\n\
+ldrh r0, [r7]\n\
+ldrh r2, [r5]\n\
+adds r2, r0\n\
+lsls r2, 1\n\
+add r2, r8\n\
+ldrb r0, [r6]\n\
+ldrb r1, [r4]\n\
+adds r1, r0\n\
+lsls r0, r1, 1\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+add r0, r10\n\
+ldrh r0, [r0]\n\
+strh r0, [r2]\n\
+ldrh r0, [r7]\n\
+ldrh r2, [r5]\n\
+adds r2, r0\n\
+adds r2, 0x1\n\
+lsls r2, 1\n\
+add r2, r8\n\
+ldrb r0, [r6]\n\
+ldrb r1, [r4]\n\
+adds r1, r0\n\
+lsls r0, r1, 1\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+mov r1, r10\n\
+adds r1, 0x2\n\
+adds r0, r1\n\
+ldrh r0, [r0]\n\
+strh r0, [r2]\n\
+ldrh r0, [r7]\n\
+ldrh r2, [r5]\n\
+adds r2, r0\n\
+adds r2, 0x2\n\
+lsls r2, 1\n\
+add r2, r8\n\
+ldrb r0, [r6]\n\
+ldrb r1, [r4]\n\
+adds r1, r0\n\
+lsls r0, r1, 1\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+ldr r1, _0811737C @ =0x020189a4\n\
+adds r0, r1\n\
+ldrh r0, [r0]\n\
+strh r0, [r2]\n\
+ldrb r0, [r4]\n\
+adds r0, 0x1\n\
+strb r0, [r4]\n\
+ldrb r0, [r3]\n\
+cmp r0, 0x2\n\
+bls _081172C8\n\
+_08117350:\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+adds r0, 0x1\n\
+strb r0, [r1]\n\
+ldrb r0, [r1]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcc _0811727C\n\
+_08117360:\n\
+add sp, 0x24\n\
+pop {r3-r5}\n\
+mov r8, r3\n\
+mov r9, r4\n\
+mov r10, r5\n\
+pop {r4-r7}\n\
+pop {r0}\n\
+bx r0\n\
+.align 2, 0\n\
+_08117370: .4byte gUnknown_083F8C00\n\
+_08117374: .4byte gBGTilemapBuffers + 0x800\n\
+_08117378: .4byte 0x020189a0\n\
+_0811737C: .4byte 0x020189a4\n\
+.syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING
+u8 sub_8117380(u8 r0)
+{
+ u8 var0[0x5];
+ u8 t;
+ u8 z;
+ memcpy(var0, gUnknown_083F8EF4, 0x5);
+ if (r0 > 0x13)
+ r0 = 0x0;
+ switch (gUnknown_083F8C00[r0].var01_0)
+ {
+ case 0x3:
+ z = r0 / 0x5 - 0x1;
+ if (RDATA->var16[z] > 0x3)
+ return 0x0;
+ return var0[RDATA->var16[z] + 0x1];
+ case 0x4:
+ t = r0 - 0x1;
+ if (RDATA->var12[t] > 0x2)
+ return 0x0;
+ return var0[RDATA->var12[t] + 0x2];
+ case 0xC:
+ if (RDATA->var08 & gUnknown_083F8C00[r0].var08)
+ return 0x0;
+ return var0[0x4];
+ default:
+ }
+ return 0x0;
+}
+#else
+__attribute__((naked))
+u8 sub_8117380(u8 r0)
+{
+asm(".syntax unified\n\
+push {r4,lr}\n\
+sub sp, 0x8\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r1, _081173B8 @ =gUnknown_083F8EF4\n\
+mov r0, sp\n\
+movs r2, 0x5\n\
+bl memcpy\n\
+cmp r4, 0x13\n\
+bls _08117398\n\
+movs r4, 0\n\
+_08117398:\n\
+ldr r3, _081173BC @ =gUnknown_083F8C00\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+lsls r2, r0, 2\n\
+adds r0, r2, r3\n\
+ldrb r0, [r0, 0x1]\n\
+lsls r0, 28\n\
+lsrs r0, 28\n\
+cmp r0, 0x4\n\
+beq _081173EC\n\
+cmp r0, 0x4\n\
+bgt _081173C0\n\
+cmp r0, 0x3\n\
+beq _081173C6\n\
+b _08117428\n\
+.align 2, 0\n\
+_081173B8: .4byte gUnknown_083F8EF4\n\
+_081173BC: .4byte gUnknown_083F8C00\n\
+_081173C0:\n\
+cmp r0, 0xC\n\
+beq _0811740C\n\
+b _08117428\n\
+_081173C6:\n\
+adds r0, r4, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+subs r0, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _081173E8 @ =0x02019000\n\
+adds r0, 0x16\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x3\n\
+bhi _08117428\n\
+ldrb r0, [r1]\n\
+adds r0, 0x1\n\
+b _08117402\n\
+.align 2, 0\n\
+_081173E8: .4byte 0x02019000\n\
+_081173EC:\n\
+subs r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08117408 @ =0x02019000\n\
+adds r0, 0x12\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x2\n\
+bhi _08117428\n\
+ldrb r0, [r1]\n\
+adds r0, 0x2\n\
+_08117402:\n\
+add r0, sp\n\
+ldrb r0, [r0]\n\
+b _0811742A\n\
+.align 2, 0\n\
+_08117408: .4byte 0x02019000\n\
+_0811740C:\n\
+ldr r1, _08117424 @ =0x02019000\n\
+adds r0, r3, 0\n\
+adds r0, 0x8\n\
+adds r0, r2, r0\n\
+ldr r1, [r1, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+bne _08117428\n\
+mov r0, sp\n\
+ldrb r0, [r0, 0x4]\n\
+b _0811742A\n\
+.align 2, 0\n\
+_08117424: .4byte 0x02019000\n\
+_08117428:\n\
+movs r0, 0\n\
+_0811742A:\n\
+add sp, 0x8\n\
+pop {r4}\n\
+pop {r1}\n\
+bx r1\n\
+.syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING
+void sub_8117434(void) //sprite rotation ?
+{
+ s32 x1;
+ s32 x2;
+ REG_BG2PA = RDATA->var2C.a;
+ REG_BG2PB = RDATA->var2C.b;
+ REG_BG2PC = RDATA->var2C.c;
+ REG_BG2PD = RDATA->var2C.d;
+ x1 = 0x7400 - RDATA->var2C.a * (gSpriteCoordOffsetX + 0x74)
+ - RDATA->var2C.b * (gSpriteCoordOffsetY + 0x50);
+ x2 = 0x5400 - RDATA->var2C.c * gSpriteCoordOffsetX
+ - RDATA->var2C.d * gSpriteCoordOffsetY;
+ REG_BG2X_L = x1;
+ REG_BG2X_H = (x1 & 0x0fff0000) >> 16;
+ REG_BG2Y_L = x2;
+ REG_BG2Y_H = (x2 & 0x0fff0000) >> 16;
+}
+#else
+__attribute__((naked))
+void sub_8117434(void)
+{
+asm(".syntax unified\n\
+push {r4-r6,lr}\n\
+ldr r1, _081174AC @ =REG_BG2PA\n\
+ldr r4, _081174B0 @ =0x02019000\n\
+ldrh r0, [r4, 0x2C]\n\
+strh r0, [r1]\n\
+adds r1, 0x2\n\
+ldrh r0, [r4, 0x2E]\n\
+strh r0, [r1]\n\
+adds r1, 0x2\n\
+ldrh r0, [r4, 0x30]\n\
+strh r0, [r1]\n\
+adds r1, 0x2\n\
+ldrh r0, [r4, 0x32]\n\
+strh r0, [r1]\n\
+movs r0, 0x2E\n\
+ldrsh r2, [r4, r0]\n\
+ldr r0, _081174B4 @ =gSpriteCoordOffsetY\n\
+movs r3, 0\n\
+ldrsh r1, [r0, r3]\n\
+adds r1, 0x50\n\
+adds r0, r2, 0\n\
+muls r0, r1\n\
+movs r2, 0xE8\n\
+lsls r2, 7\n\
+subs r2, r0\n\
+movs r6, 0x2C\n\
+ldrsh r5, [r4, r6]\n\
+ldr r0, _081174B8 @ =gSpriteCoordOffsetX\n\
+movs r6, 0\n\
+ldrsh r3, [r0, r6]\n\
+adds r3, 0x74\n\
+adds r0, r5, 0\n\
+muls r0, r3\n\
+subs r2, r0\n\
+movs r5, 0x32\n\
+ldrsh r0, [r4, r5]\n\
+muls r0, r1\n\
+movs r1, 0xA8\n\
+lsls r1, 7\n\
+subs r1, r0\n\
+movs r6, 0x30\n\
+ldrsh r0, [r4, r6]\n\
+muls r0, r3\n\
+subs r1, r0\n\
+ldr r0, _081174BC @ =REG_BG2X_L\n\
+strh r2, [r0]\n\
+adds r0, 0x2\n\
+ldr r3, _081174C0 @ =0x0fff0000\n\
+ands r2, r3\n\
+asrs r2, 16\n\
+strh r2, [r0]\n\
+adds r0, 0x2\n\
+strh r1, [r0]\n\
+adds r0, 0x2\n\
+ands r1, r3\n\
+asrs r1, 16\n\
+strh r1, [r0]\n\
+pop {r4-r6}\n\
+pop {r0}\n\
+bx r0\n\
+.align 2, 0\n\
+_081174AC: .4byte REG_BG2PA\n\
+_081174B0: .4byte 0x02019000\n\
+_081174B4: .4byte gSpriteCoordOffsetY\n\
+_081174B8: .4byte gSpriteCoordOffsetX\n\
+_081174BC: .4byte REG_BG2X_L\n\
+_081174C0: .4byte 0x0fff0000\n\
+.syntax divided\n");
+}
+#endif
+
+s16 sub_81174C4(s16 r0, s16 r1)
+{
+ s32 t = r0 * r1;
+ t /= 0x100;
+ return t;
+}
+
+s16 sub_81174E0(s16 r0)
+{
+ s32 t = 0x10000;
+ return t / r0;
+}
+
+void sub_81174F8(u8 r0)
+{
+ DisplayYesNoMenu(0x14, 0x8, 0x1);
+ sub_814AAF8(0x2D9E);
+ DoYesNoFuncWithChoice(r0, &gUnknown_083F8EB4);
+}
+
+void sub_8117528(u8 taskid)
+{
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ SetMainCallback2(&sub_8115384);
+ DestroyTask(taskid);
+ }
+}
+
+void sub_811755C(u8 taskid)
+{
+ MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD);
+ MenuZeroFillScreen();
+ BeginNormalPaletteFade(-0x1, 0x0, 0x0, 0x10, 0x0);
+ gPaletteFade.delayCounter = gPaletteFade.multipurpose2;
+ UpdatePaletteFade();
+ gTasks[taskid].func = &sub_8117528;
+}
+
+void sub_81175C0(u8 taskid)
+{
+ MenuZeroFillScreen();
+ ScriptContext2_Disable();
+ DestroyTask(taskid);
+}
+
+void sub_81175DC(u8 taskid)
+{
+ gTasks[taskid].data[0]++;
+ if (!(gMain.newKeys & (A_BUTTON | B_BUTTON)) && gTasks[taskid].data[0] < 0x3D)
+ return;
+ gSpecialVar_0x8004 = 0x1;
+ MenuZeroFillScreen();
+ ScriptContext2_Disable();
+ DestroyTask(taskid);
+}
+
+void sub_8117630(u8 taskid)
+{
+ u32 temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 0x1) + (gSpecialVar_0x8004 >> 0x7 << 0x1)];
+ ConvertIntToDecimalStringN(gStringVar1, temp, 0x2, 0x1);
+ StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(gStringVar4, 0x1, 0xF);
+ gTasks[taskid].func = &sub_81174F8;
+}
+
+void Task_Roulette_0(u8 taskid)
+{
+ s32 temp;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskid].data[0xD], 0x1, 0x4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuDrawTextWindow(0x0, 0x0, 0x9, 0x3);
+ MenuPrint_RightAligned(gStringVar4, 0x9, 0x1);
+ temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 0x1) + (gSpecialVar_0x8004 >> 0x7 << 0x1)];
+ ConvertIntToDecimalStringN(gStringVar1, temp, 0x2, 0x1);
+ if (gTasks[taskid].data[0xD] >= temp)
+ {
+ if ((gSpecialVar_0x8004 & 0x80) && (gSpecialVar_0x8004 & 0x1))
+ {
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C4139, 0x1, 0xF);
+ sub_8116C34(taskid , &sub_8117630, 0xFFFF, 0x3);
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(gStringVar4, 0x1, 0xF);
+ gTasks[taskid].func = &sub_81174F8;
+ }
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, &gUnknown_081C411C);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(gStringVar4, 0x1, 0xF);
+ gTasks[taskid].func = &sub_81175DC;
+ gTasks[taskid].data[0xD] = 0x0;
+ gTasks[taskid].data[0x0] = 0x0;
+ }
+}
+
+void PlayRoulette()
+{
+ u8 taskid;
+ ScriptContext2_Enable();
+ taskid = CreateTask(&Task_Roulette_0, 0x0);
+ gTasks[taskid].data[0xD] = gSaveBlock1.coins;
+}
+
+void sub_8117838(u8 r0)
+{
+ if (!r0)
+ {
+ FreeAllSpritePalettes();
+ LoadSpritePalettes(&gUnknown_083F9E30);
+ LZ77UnCompWram(gUnknown_083F92A8, ewram17000);
+ LZ77UnCompWram(gUnknown_083F90FC, ewram17E00);
+ LZ77UnCompWram(gUnknown_083F9D3C, ewram18000);
+ }
+ else
+ {
+ FreeAllSpritePalettes();
+ }
+}
+
+u8 sub_8117890(const struct SpriteTemplate *r0, u8 r1, u16 *r2)
+{
+ u16 temp;
+ u8 spriteid = CreateSprite(r0, 0x74, 0x50, r0->oam->y);
+ gSprites[spriteid].data0 = *r2;
+ gSprites[spriteid].data1 = r1;
+ gSprites[spriteid].coordOffsetEnabled = TRUE;
+ gSprites[spriteid].animPaused = TRUE;
+ gSprites[spriteid].affineAnimPaused = TRUE;
+ temp = *r2;
+ *r2 += 0x1E;
+ if (*r2 > 0x167)
+ *r2 = temp - 0x14A;
+ return spriteid;
+}
+
+void sub_8117900(void)
+{
+ u8 i, j;
+ u8 spriteid;
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083F9F54.data, ewram);
+ s.data = ewram;
+ s.size = gUnknown_083F9F54.size;
+ s.tag = gUnknown_083F9F54.tag;
+ LoadSpriteSheet(&s);
+ LZ77UnCompWram(gUnknown_083F9F5C.data, ewram);
+ s.data = ewram;
+ s.size = gUnknown_083F9F5C.size;
+ s.tag = gUnknown_083F9F5C.tag;
+ LoadSpriteSheet(&s);
+ for (i = 0; i < 0x3; i++)
+ {
+ u8 o = i * 0x18;
+ for (j = 0; j < 0x4; j++)
+ {
+ spriteid = RDATA->var3C[0x1D + i * 0x4 + j] =
+ CreateSprite(&gSpriteTemplate_83FA07C[j], j * 0x18 + 0x94, o + 0x5C, 0x1E);
+ gSprites[spriteid].animPaused = TRUE;
+ o += 0x18;
+ if (o > 0x47)
+ o = 0x0;
+ }
+ }
+ for (i = 0x0; i < 0x4; i++)
+ {
+ spriteid = RDATA->var3C[0x29 + i] =
+ CreateSprite(&gSpriteTemplate_83F9FD4[i], (s16)(i * 0x18 + 0x94), 0x46, 0x1E);
+ gSprites[spriteid].animPaused = TRUE;
+ }
+ for (i = 0x0; i < 0x3; i++)
+ {
+ spriteid = RDATA->var3C[0x2D + i] =
+ CreateSprite(&gSpriteTemplate_83FA034[i], 0x7E, (s16)(i * 0x18 + 0x5C), 0x1E);
+ gSprites[spriteid].animPaused = TRUE;
+ }
+}
+
+void unref_sub_8117A74(void) //destroy all sprites at 0x1D
+{
+ u8 i;
+ for (i = 0x0; i < 0xC; i++)
+ DestroySprite(&gSprites[RDATA->var3C[0x1D + i]]);
+}
+
+void sub_8117AA8(u8 r0, u8 r1)
+{
+ u8 i;
+ switch(r0)
+ {
+ case 0x1:
+ for (i = 0x0; i < 0x13; i++)
+ gSprites[RDATA->var3C[0x1D + i]].invisible = TRUE;
+ break;
+ case 0x0:
+ for (i = 0x0; i < 0xC; i++)
+ {
+ if (!(RDATA->var08 & gUnknown_083F8D90[i].var04))
+ gSprites[RDATA->var3C[0x1D + i]].invisible = FALSE;
+ else if(!(gUnknown_083F8D90[i].var02 == r1))
+ gSprites[RDATA->var3C[0x1D + i]].invisible = TRUE;
+ else
+ gSprites[RDATA->var3C[0x1D + i]].invisible = FALSE;
+ }
+ for ( ; i < 0x13; i++)
+ gSprites[RDATA->var3C[0x1D + i]].invisible = FALSE;
+ break;
+ }
+}
+
+void sub_8117BBC(void)
+{
+ u8 i;
+ for (i = 0x0; i < 0x6; i++)
+ {
+ RDATA->var3C[0x31 + i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x14, 0xA);
+ gSprites[RDATA->var3C[0x31 + i]].invisible = TRUE;
+ gSprites[RDATA->var3C[0x31 + i]].data0 = 0x1;
+ gSprites[RDATA->var3C[0x31 + i]].callback = &sub_81184CC;
+ gSprites[RDATA->var3C[0x31 + i]].oam.priority = 0x1;
+ StartSpriteAnim(&gSprites[RDATA->var3C[0x31 + i]], 0x8);
+ }
+}
+
+void sub_8117C60(u8 r0, u8 r1)
+{
+ u8 i = 0x0;
+ if (r0)
+ {
+ for ( ; i < 0x6; i++)
+ gSprites[RDATA->var3C[0x31 + i]].invisible = TRUE;
+ }
+ else
+ {
+ for ( ; i < 0x6; i++)
+ {
+ if (!(RDATA->var0C[i]) || (i == r1))
+ {
+ gSprites[RDATA->var3C[0x31 + i]].invisible = TRUE;
+ }
+ else
+ {
+ gSprites[RDATA->var3C[0x31 + i]].invisible = FALSE;
+ gSprites[RDATA->var3C[0x31 + i]].pos1.x = (gUnknown_083F8C00[RDATA->var0C[i]].var03 + 0x1) * 0x8 + 0x4;
+ gSprites[RDATA->var3C[0x31 + i]].pos1.y = (gUnknown_083F8C00[RDATA->var0C[i]].var04 + 0x1) * 0x8 + 0x3;
+ }
+ }
+ }
+}
+
+void sub_8117D68(u8 r0)
+{
+ if (!r0)
+ {
+ gSprites[RDATA->var3C[0x30]].invisible = TRUE;
+ }
+ else
+ {
+ gSprites[RDATA->var3C[0x30]].invisible = FALSE;
+ gSprites[RDATA->var3C[0x30]].pos1.x = (gUnknown_083F8C00[r0].var03 + 0x2) * 0x8;
+ gSprites[RDATA->var3C[0x30]].pos1.y = (gUnknown_083F8C00[r0].var04 + 0x2) * 0x8;
+ }
+}
+
+void sub_8117DF4(void)
+{
+ u8 i, j;
+ u16 k;
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083F9EE8.data, ewram);
+ s.data = ewram;
+ s.size = gUnknown_083F9EE8.size;
+ s.tag = gUnknown_083F9EE8.tag;
+ LoadSpriteSheet(&s);
+ k = 0xF;
+ for (i = 0x0; i < 0x3; i++)
+ {
+ for (j = 0x0; j < 0x4; j++)
+ {
+ u8 spriteid;
+ spriteid =
+ RDATA->var3C[0x7 + i * 0x4 + j] = sub_8117890(&gSpriteTemplate_83FA0DC[i * 0x4 + j], 0x28, &k);
+ gSprites[spriteid].animPaused = TRUE;
+ gSprites[spriteid].affineAnimPaused = TRUE;
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_8117E98(struct Sprite *sprite)
+{
+ struct OamMatrix *m;
+ u8 p;
+ u16 angle;
+ s16 cos, sin, z;
+ u32 cos32;
+ angle = RDATA->var24 + sprite->data0;
+ z = angle;
+ if (z > 359)
+ angle = z - 360;
+ sin = Sin2(angle);
+ cos = Cos2(angle);
+ sprite->pos2.x = sin * sprite->data1 >> 0xC;
+ sprite->pos2.y = -cos * sprite->data1 >> 0xC;
+ p = sprite->oam.matrixNum;
+ sin = sin / 0x10;
+ m = &gOamMatrices[p];
+ cos32 = cos / 0x10;
+
+ m->d = cos32;
+ m->a = cos32;
+ m->b = sin;
+ m->c = -sin;
+}
+#else
+__attribute__((naked))
+void sub_8117E98(struct Sprite *r0)
+{
+asm(".syntax unified\n\
+push {r4-r6,lr}\n\
+adds r6, r0, 0\n\
+ldr r0, _08117F1C @ =0x02019000\n\
+ldrh r1, [r6, 0x2E]\n\
+ldrh r0, [r0, 0x24]\n\
+adds r1, r0\n\
+lsls r1, 16\n\
+lsrs r4, r1, 16\n\
+asrs r1, 16\n\
+ldr r0, _08117F20 @ =0x00000167\n\
+cmp r1, r0\n\
+ble _08117EB8\n\
+ldr r2, _08117F24 @ =0xfffffe98\n\
+adds r0, r1, r2\n\
+lsls r0, 16\n\
+lsrs r4, r0, 16\n\
+_08117EB8:\n\
+adds r0, r4, 0\n\
+bl Sin2\n\
+lsls r0, 16\n\
+lsrs r5, r0, 16\n\
+adds r0, r4, 0\n\
+bl Cos2\n\
+lsls r2, r5, 16\n\
+asrs r2, 16\n\
+movs r3, 0x30\n\
+ldrsh r1, [r6, r3]\n\
+muls r1, r2\n\
+asrs r1, 12\n\
+strh r1, [r6, 0x24]\n\
+lsls r0, 16\n\
+asrs r4, r0, 16\n\
+negs r1, r4\n\
+movs r3, 0x30\n\
+ldrsh r0, [r6, r3]\n\
+muls r0, r1\n\
+asrs r0, 12\n\
+strh r0, [r6, 0x26]\n\
+ldrb r0, [r6, 0x3]\n\
+lsls r0, 26\n\
+lsrs r3, r0, 27\n\
+cmp r2, 0\n\
+bge _08117EF2\n\
+adds r2, 0xF\n\
+_08117EF2:\n\
+lsls r0, r2, 12\n\
+lsrs r5, r0, 16\n\
+ldr r1, _08117F28 @ =gOamMatrices\n\
+lsls r0, r3, 3\n\
+adds r1, r0, r1\n\
+adds r0, r4, 0\n\
+cmp r0, 0\n\
+bge _08117F04\n\
+adds r0, 0xF\n\
+_08117F04:\n\
+asrs r0, 4\n\
+strh r0, [r1, 0x6]\n\
+strh r0, [r1]\n\
+strh r5, [r1, 0x2]\n\
+lsls r0, r5, 16\n\
+asrs r0, 16\n\
+negs r0, r0\n\
+strh r0, [r1, 0x4]\n\
+pop {r4-r6}\n\
+pop {r0}\n\
+bx r0\n\
+.align 2, 0\n\
+_08117F1C: .4byte 0x02019000\n\
+_08117F20: .4byte 0x00000167\n\
+_08117F24: .4byte 0xfffffe98\n\
+_08117F28: .4byte gOamMatrices\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_8117F2C(void)
+{
+ u8 i;
+ for (i = 0x0; i < 0x5; i++)
+ {
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083FA21C[i].data, ewram);
+ s.data = ewram;
+ s.size = gUnknown_083FA21C[i].size;
+ s.tag = gUnknown_083FA21C[i].tag;
+ LoadSpriteSheet(&s);
+ }
+ RDATA->var3C[0x14] = CreateSprite(&gSpriteTemplate_83FA2B0, 0xD0, 0x10, 0x4);
+ gSprites[RDATA->var3C[0x14]].animPaused = TRUE;
+ for (i = 0x0; i < 0x4; i++)
+ {
+ RDATA->var3C[0x15 + i] = CreateSprite(&gSpriteTemplate_83FA2C8, (s16)(i * 0x8 + 0xC4), 0x18, 0x0);
+ gSprites[RDATA->var3C[0x15 + i]].invisible = TRUE;
+ gSprites[RDATA->var3C[0x15 + i]].animPaused = TRUE;
+ }
+ RDATA->var3C[0x19] = CreateSprite(&gSpriteTemplate_83FA2E0, 0x78, 0x44, 0x4);
+ gSprites[RDATA->var3C[0x19]].animPaused = TRUE;
+ for (i = 0x0; i < 0x3; i++)
+ {
+ RDATA->var3C[0x1A + i] = CreateSprite(&gSpriteTemplate_83FA2F8, (s16)(i * 0x10 + 0xC0), 0x24, 0x4);
+ gSprites[RDATA->var3C[0x1A + i]].invisible = TRUE;
+ gSprites[RDATA->var3C[0x1A + i]].animPaused = TRUE;
+ }
+ RDATA->var3C[0x30] = CreateSprite(&gSpriteTemplate_83FA310, 0x98, 0x60, 0x9);
+ gSprites[RDATA->var3C[0x30]].oam.priority = 0x1;
+ gSprites[RDATA->var3C[0x30]].animPaused = TRUE;
+ gSprites[RDATA->var3C[0x30]].invisible = TRUE;
+}
+
+void sub_81180F4(u16 r0)
+{
+ u8 i;
+ u16 d = 1000;
+ bool8 v = FALSE;
+ for (i = 0x0; i < 0x4; i++)
+ {
+ u8 t = r0 / d;
+ gSprites[RDATA->var3C[0x15 + i]].invisible = TRUE;
+ if (t > 0x0 || v || i == 0x3)
+ {
+ gSprites[RDATA->var3C[0x15 + i]].invisible = FALSE;
+ gSprites[RDATA->var3C[0x15 + i]].oam.tileNum =
+ gSprites[RDATA->var3C[0x15 + i]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x15 + i]].anims + t)->type;
+ v = TRUE;
+ }
+ r0 = r0 % d;
+ d = d / 10;
+ }
+}
+
+#ifdef NONMATCHING
+u8 sub_81181E8(u8 r0)
+{
+ u8 t[0x5];
+ memcpy(&t, &gUnknown_083FA608, 0x5);
+ if (r0 > 0x13)
+ r0 = 0x0;
+ switch(gUnknown_083F8C00[r0].var01_0)
+ {
+ case 0x3:
+ r0 = r0 / 0x5 - 0x1;
+ if ((u32)RDATA->var16[r0] < 0x4)
+ return t[0x1 + RDATA->var16[r0]]; // couldn't recreate redundant loads
+ break;
+ case 0x4:
+ r0 = r0 - 0x1;
+ if (RDATA->var12[r0] < 0x3)
+ return t[0x2 + RDATA->var12[r0]];
+ break;
+ case 0xC:
+ if (!(RDATA->var08 & gUnknown_083F8C00[r0].var08))
+ return t[0x4];
+ break;
+ }
+ return 0x0;
+}
+#else
+__attribute__((naked))
+u8 sub_81181E8(u8 r0)
+{
+asm(".syntax unified\n\
+push {r4,lr}\n\
+sub sp, 0x8\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r1, _08118220 @ =gUnknown_083FA608\n\
+mov r0, sp\n\
+movs r2, 0x5\n\
+bl memcpy\n\
+cmp r4, 0x13\n\
+bls _08118200\n\
+movs r4, 0\n\
+_08118200:\n\
+ldr r3, _08118224 @ =gUnknown_083F8C00\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+lsls r2, r0, 2\n\
+adds r0, r2, r3\n\
+ldrb r0, [r0, 0x1]\n\
+lsls r0, 28\n\
+lsrs r0, 28\n\
+cmp r0, 0x4\n\
+beq _08118254\n\
+cmp r0, 0x4\n\
+bgt _08118228\n\
+cmp r0, 0x3\n\
+beq _0811822E\n\
+b _08118290\n\
+.align 2, 0\n\
+_08118220: .4byte gUnknown_083FA608\n\
+_08118224: .4byte gUnknown_083F8C00\n\
+_08118228:\n\
+cmp r0, 0xC\n\
+beq _08118274\n\
+b _08118290\n\
+_0811822E:\n\
+adds r0, r4, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+subs r0, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08118250 @ =0x02019000\n\
+adds r0, 0x16\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x3\n\
+bhi _08118290\n\
+ldrb r0, [r1]\n\
+adds r0, 0x1\n\
+b _0811826A\n\
+.align 2, 0\n\
+_08118250: .4byte 0x02019000\n\
+_08118254:\n\
+subs r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08118270 @ =0x02019000\n\
+adds r0, 0x12\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x2\n\
+bhi _08118290\n\
+ldrb r0, [r1]\n\
+adds r0, 0x2\n\
+_0811826A:\n\
+add r0, sp\n\
+ldrb r0, [r0]\n\
+b _08118292\n\
+.align 2, 0\n\
+_08118270: .4byte 0x02019000\n\
+_08118274:\n\
+ldr r1, _0811828C @ =0x02019000\n\
+adds r0, r3, 0\n\
+adds r0, 0x8\n\
+adds r0, r2, r0\n\
+ldr r1, [r1, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+bne _08118290\n\
+mov r0, sp\n\
+ldrb r0, [r0, 0x4]\n\
+b _08118292\n\
+.align 2, 0\n\
+_0811828C: .4byte 0x02019000\n\
+_08118290:\n\
+movs r0, 0\n\
+_08118292:\n\
+add sp, 0x8\n\
+pop {r4}\n\
+pop {r1}\n\
+bx r1\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_811829C(u8 r0)
+{
+ struct Sprite *s = &gSprites[RDATA->var3C[0x19]];
+ s->animCmdIndex = sub_81181E8(r0);
+ s->oam.tileNum =
+ s->sheetTileStart
+ + (*s->anims + s->animCmdIndex)->type;
+}
+
+void sub_81182F8(u8 r0)
+{
+ u8 i;
+ u8 t = 0x0;
+ if (RDATA->var19 == 0x1)
+ t = 0x2;
+ switch(r0)
+ {
+ case 0x6:
+ for (i = 0x0; i < 0x3; i++)
+ {
+ gSprites[RDATA->var3C[0x1A + i]].invisible = FALSE;
+ gSprites[RDATA->var3C[0x1A + i]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1A + i]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1A + i]].anims)->type;
+ }
+ break;
+ case 0x5:
+ gSprites[RDATA->var3C[0x1C]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1C]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1C]].anims + t + 0x1)->type;
+ break;
+ case 0x4:
+ gSprites[RDATA->var3C[0x1C]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1C]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1C]].anims + t + 0x2)->type;
+ break;
+ case 0x3:
+ gSprites[RDATA->var3C[0x1B]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1B]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1B]].anims + t + 0x1)->type;
+ break;
+ case 0x2:
+ gSprites[RDATA->var3C[0x1B]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1B]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1B]].anims + t + 0x2)->type;
+ break;
+ case 0x1:
+ gSprites[RDATA->var3C[0x1A]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1A]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1A]].anims + t + 0x1)->type;
+ break;
+ case 0x0:
+ default:
+ for (i = 0x0; i < 0x3; i++)
+ {
+ gSprites[RDATA->var3C[0x1A + i]].oam.tileNum =
+ gSprites[RDATA->var3C[0x1A + i]].sheetTileStart
+ + (*gSprites[RDATA->var3C[0x1A + i]].anims + t + 2)->type;
+ }
+ }
+}
+
+void sub_81184CC(struct Sprite *sprite)
+{
+ sprite->pos2.x = RDATA->var26;
+}
+
+void sub_81184D8(void)
+{
+ u8 spriteid;
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083FA42C.data, ewram);
+ s.data = ewram;
+ s.size = gUnknown_083FA42C.size;
+ s.tag = gUnknown_083FA42C.tag;
+ LoadSpriteSheet(&s);
+ spriteid = CreateSprite(&gSpriteTemplate_83FA434, 0x74, 0x50, 0x51);
+ gSprites[spriteid].data0 = RDATA->var24;
+ gSprites[spriteid].data1 = 0x0;
+ gSprites[spriteid].animPaused = TRUE;
+ gSprites[spriteid].affineAnimPaused = TRUE;
+ gSprites[spriteid].coordOffsetEnabled = TRUE;
+}
+
+void sub_8118554(struct Sprite *sprite)
+{
+ u32 t = sprite->oam.matrixNum;
+ struct OamMatrix *m = &gOamMatrices[0];
+ m[t].d = RDATA->var2C.a;
+ m[t].a = RDATA->var2C.a;
+ m[t].b = RDATA->var2C.b;
+ m[t].c = RDATA->var2C.c;
+}
+
+void sub_811857C(void)
+{
+ u8 i;
+ for (i = 0x0; i < 0x6; i++)
+ {
+ u8 spriteid =
+ RDATA->var3C[i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x50, 0x39 - i);
+ if (spriteid != 0x40)
+ {
+ gSprites[RDATA->var3C[i]].invisible = TRUE;
+ gSprites[RDATA->var3C[i]].coordOffsetEnabled = TRUE;
+ }
+ }
+}
+/*
+void sub_81185E8(void)
+{
+ u8 t = RDATA->var3C[0x0];
+ u8 i;
+ for (i = 0x0; i < 0x6; i++)
+ {
+ u8 j;
+ gSprites[t].invisible = TRUE;
+ gSprites[t].callback = &SpriteCallbackDummy;
+ StartSpriteAnim(&gSprites[t], 0x0);
+ for (j = 0x0; j < 0x8; j++)
+ *(&gSprites[t].data0 + j) = 0x0; // zero allocation not quite right
+ t++;
+ }
+}
*/
diff --git a/src/roulette_util.c b/src/roulette_util.c
index 7501c3d80..bb47ed540 100644
--- a/src/roulette_util.c
+++ b/src/roulette_util.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "roulette_util.h"
+#include "roulette.h"
static u8 sub_81249E4(struct UnkStruct3 *);
static u8 sub_8124BEC(struct UnkStruct3 *);
@@ -17,47 +18,38 @@ void sub_8124918(struct UnkStruct0 *r0)
u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2)
{
if (!(r1 < 0x10) || (r0->val3[r1].field1))
- {
- return 0xFF;
- }
- else
- {
- r0->val3[r1].val4 = r2->val0;
- r0->val3[r1].val5 = r2->val1;
- r0->val3[r1].val6 = r2->val2;
- r0->val3[r1].val7 = r2->val3;
- r0->val3[r1].val8 = r2->val4;
+ return 0xFF;
- r0->val3[r1].field2 = r2->field0;
- r0->val3[r1].field3 = r2->field1;
- r0->val3[r1].field4 = r2->field2;
+ r0->val3[r1].val4.val0 = r2->val0;
+ r0->val3[r1].val4.val1 = r2->val1;
+ r0->val3[r1].val4.val2 = r2->val2;
+ r0->val3[r1].val4.val3 = r2->val3;
+ r0->val3[r1].val4.val4 = r2->val4;
+ r0->val3[r1].val4.field0 = r2->field0;
+ r0->val3[r1].val4.field1 = r2->field1;
+ r0->val3[r1].val4.field2 = r2->field2;
- r0->val3[r1].field0 = 0x0;
- r0->val3[r1].field1 = 0x1;
+ //Why not r0->val3[r1].val4 = *r2; ?
- r0->val3[r1].val2 = 0x0;
- r0->val3[r1].val1 = 0x0;
- if (r0->val3[r1].field4 < 0)
- r0->val3[r1].val3 = 0xFF;
- else
- r0->val3[r1].val3 = 0x1;
- return r1;
- }
+ r0->val3[r1].field0 = 0x0;
+ r0->val3[r1].field1 = 0x1;
+
+ r0->val3[r1].val2 = 0x0;
+ r0->val3[r1].val1 = 0x0;
+ if (r0->val3[r1].val4.field2 < 0)
+ r0->val3[r1].val3 = 0xFF;
+ else
+ r0->val3[r1].val3 = 0x1;
+ return r1;
}
#ifdef NONMATCHING
- //Functionally equivalent
u8 unref_sub_81249B0(struct UnkStruct0 *r0, u8 r1)
{
if (!(r1 < 0x10) || (r0->val3[r1].field1))
- {
- return 0xFF;
- }
- else
- {
- memset(&(r0->val3[r1]), 0, 0xC);
- return r1;
- }
+ return 0xFF;
+ r0->val3[r1] = (struct UnkStruct3){0};
+ return r1;
}
#else
__attribute__((naked))
@@ -99,9 +91,9 @@ u8 sub_81249E4(struct UnkStruct3 *r0)
{
u8 i;
u8 returnval;
- for (i = 0; i < r0->val6; i++)
+ for (i = 0; i < r0->val4.val2; i++)
{
- u32 offset = r0->val5 + i;
+ u32 offset = r0->val4.val1 + i;
struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[offset];
struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[offset];
switch(r0->field0)
@@ -136,7 +128,7 @@ u8 sub_81249E4(struct UnkStruct3 *r0)
break;
}
}
- if (((u32)r0->val2++) != r0->field2)
+ if (((u32)r0->val2++) != r0->val4.field0)
{
returnval = 0x0;
}
@@ -159,13 +151,13 @@ u8 sub_8124BEC(struct UnkStruct3 *r0)
switch (r0->field0)
{
case 0x1:
- for (rg2 = 0; rg2 < r0->val6; rg2++)
- gPlttBufferFaded[r0->val5 + rg2] = r0->val4;
+ for (rg2 = 0; rg2 < r0->val4.val2; rg2++)
+ gPlttBufferFaded[r0->val4.val1 + rg2] = r0->val4.val0;
r0->field0++;
break;
case 0x2:
- for (rg2 = 0; rg2 < r0->val6; rg2++)
- gPlttBufferFaded[r0->val5 + rg2] = gPlttBufferUnfaded[r0->val5 + rg2];
+ for (rg2 = 0; rg2 < r0->val4.val2; rg2++)
+ gPlttBufferFaded[r0->val4.val1 + rg2] = gPlttBufferUnfaded[r0->val4.val1 + rg2];
r0->field0--;
break;
}
@@ -183,11 +175,11 @@ void task_tutorial_controls_fadein(struct UnkStruct0 *r0)
{
if (((u8)--r0->val3[i].val1) == 0xFF) // if underflow ?
{
- if (r0->val3[i].val4 & (0x80 << 8)) // PlttData->unused_15 ?
+ if (r0->val3[i].val4.val0 & (0x80 << 8)) // PlttData->unused_15 ?
sub_81249E4(&r0->val3[i]);
else
sub_8124BEC(&r0->val3[i]);
- r0->val3[i].val1 = r0->val3[i].val7;
+ r0->val3[i].val1 = r0->val3[i].val4.val3;
}
}
}
@@ -222,14 +214,14 @@ void sub_8124D3C(struct UnkStruct0 *r0, u16 r1)
{
if ((r1 >> i) & 0x1)
{
- u32 offset = r0->val3[i].val5;
+ u32 offset = r0->val3[i].val4.val1;
u16 *faded = &gPlttBufferFaded[offset];
u16 *unfaded = &gPlttBufferUnfaded[offset];
- memcpy(faded, unfaded, r0->val3[i].val6 * 2);
+ memcpy(faded, unfaded, r0->val3[i].val4.val2 * 2);
r0->val3[i].field0 = 0x0;
r0->val3[i].val2 = 0x0;
r0->val3[i].val1 = 0x0;
- if (r0->val3[i].field4 < 0)
+ if (r0->val3[i].val4.field2 < 0)
r0->val3[i].val3 = 0xFF;
else
r0->val3[i].val3 = 0x1;