diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/roulette.c | 1648 | ||||
-rw-r--r-- | src/roulette_util.c | 80 |
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; |