diff options
author | M <No Email> | 2017-09-26 18:27:22 +0200 |
---|---|---|
committer | Made-s <made111@gmx.de> | 2018-01-06 00:24:34 +0100 |
commit | 1b87916e0549cf4a087fde6b1c12e9c362ac4d68 (patch) | |
tree | e80615588dfbe686cdfc83bea2c4c83afec55b7d /src | |
parent | 102a039e1e1419e69b45cee55094f5bbdbe16cf1 (diff) |
decompiled up to sub_8116EF8, added roulette header
Diffstat (limited to 'src')
-rw-r--r-- | src/roulette.c | 1171 |
1 files changed, 1108 insertions, 63 deletions
diff --git a/src/roulette.c b/src/roulette.c index 3a0702d1d..76b5a4d9c 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1,5 +1,5 @@ #include "global.h" - +#include "roulette.h" #include "roulette_util.h" #include "task.h" #include "palette.h" @@ -15,6 +15,13 @@ #include "sprite.h" #include "menu_cursor.h" #include "sound.h" +#include "songs.h" +#include "m4a.h" +#include "rng.h" +#include "game_stat.h" +#include "rom4.h" +#include "string_util.h" +#include "field_fadetransition.h" extern u8 gUnknown_02019000[]; extern u16 gSpecialVar_0x8004; @@ -41,19 +48,50 @@ extern const u8 gUnknown_081C4157[]; extern const struct YesNoFuncTable gUnknown_083F8EBC; extern const u8 gUnknown_081C41E3; +extern const u16 gUnknown_083F8ECE; + struct StructUnknown_083F8C00 { - u32 var00; + u8 var00; + u8 var01; + u16 var02; u32 var04; u32 var08; u32 var0C; - u32 var10; + u16 var10; + u16 var12; +}; + +struct StructgUnknown_083F8D90 +{ + u8 var00; + u8 var01; + u8 var02; + u8 var03; + u32 var04; }; extern const struct StructUnknown_083F8C00 gUnknown_083F8C00[]; const extern u8 gUnknown_083F8ECA[]; +const extern u8 gUnknown_081C41A5; +const extern u8 gUnknown_081C4199; +const extern u8 gUnknown_081C41AE; + +const extern u8 gUnknown_081C41BD; + +const extern u8 gUnknown_081C41F1; +const extern u8 gUnknown_081C4231; +const extern u8 gUnknown_081C41D2; + +extern const struct StructgUnknown_083F8D90 gUnknown_083F8D90[]; +extern const u32 gUnknown_083F8ED8[]; +extern const u32 gUnknown_083F8EE8[]; + +extern const struct UnkStruct1 gUnknown_083F8E9C[]; + +void sub_8117434(void); void sub_8117838(u8); void sub_811857C(void); @@ -84,6 +122,39 @@ void sub_8115E14(u8); void sub_8116EF8(u8); +void sub_8115ECC(u8); + +u8 sub_8117380(u8); + +void sub_8117AA8(u8, u8); +void sub_8117C60(u8, u8); +void sub_8116100(u8); + +void sub_8116308(u8); + +void sub_81191F4(struct Sprite *); +void sub_811637C(u8); + +u8 sub_8116D54(u8, u8); +u8 sub_8116E5C(u8 ,u8); +void sub_8116474(u8); + +void sub_81184CC(struct Sprite *); +void sub_8117D68(u8); +void sub_8116514(u8); + +void sub_8116638(u8); + +void sub_811677C(u8); +void sub_81167F4(u8); + +void sub_8116880(u8); +void sub_81157AC(u8); + +void sub_8116B40(u8); + + +void dp01t_12_3_battle_menu(u8); extern u8 ewram[]; @@ -91,12 +162,17 @@ extern u8 ewram[]; #define ewram18a32 ((u16 *) (ewram + 0x18A32)) #define ewram18a80 ((u16 *) (ewram + 0x18a80)) #define ewram19000 ((u8 *) (ewram + 0x19000)) -#define ewram190b8 ((u8 *) (ewram + 0x190B8)) #define RDATA ((struct RData *) (ewram + 0x19000)) -#define UNKDATA ((struct UnkStruct0 *) (ewram + 0x190B8)) -//////////////// -struct OamMatrix +#define S16TOPOSFLOAT(val) \ +({ \ + s16 v = (val); \ + float f = (float)v; \ + if(v < 0) f += 65536.0f; \ + f; \ +}) + +struct Matrix { s16 a; s16 b; @@ -104,20 +180,6 @@ struct OamMatrix s16 d; }; -struct SpriteCopyRequest -{ - const u8 *src; - u8 *dest; - u16 size; -}; - -struct OamDimensions -{ - s8 width; - s8 height; -}; -//////////////// - struct Unkg083F8DF4 { u8 var00; @@ -125,21 +187,29 @@ struct Unkg083F8DF4 u8 var02; u8 var03; u8 var04; - u8 v[0x1B]; + u8 v[0x13]; + s16 var18; + s16 var1A; //is this signed or not ? + u8 v2[0x4]; }; struct RData /* ewram + 0x19000 */ { - u8 v00; + u8 var00; u8 var01; u8 var02; - u8 v03; + u8 var03_0:5; + u8 var03_5:1; + u8 var03_6:1; + u8 var03_7:1; u8 var04_0:2; u8 var04_2:5; u8 var04_7:1; u8 v7[0x3]; - u32 var08; // may be bitfield - u8 v0[0xD]; + u32 var08; + u8 var0C[0x6]; + u8 var12[0x4]; + u8 var16[0x3]; u8 var19; u8 var1A_0:4; u8 var1A_4:4; @@ -148,23 +218,43 @@ struct RData /* ewram + 0x19000 */ u8 var22; u8 var23; s16 var24; - u16 var26; + s16 var26; s16 var28; s16 var2A; - struct OamMatrix var2C; + struct Matrix var2C; u16 var34; - u8 v99[0x6]; - u8 var3C; - u8 v67[0x28]; - u8 var65[0x4]; - u8 v6[0x3B]; + u8 v99[0x2]; + struct Sprite *var38; + u8 var3C[0x30]; // TODO: add some defines for the different areas + u8 var6C; + u8 v6[0xF]; + u8 var7C; + u8 var7D; + u8 var7E; + u8 var7F; + s16 var80; + s16 var82; + s16 var84; + s16 var86; + float var88; + float var8C; + float var90; + float var94; + float var98; + float var9C; + float varA0; u8 varA4; u8 varA5; // taskid + u8 v51[0x2]; + u16 varA8; + u16 varAA; + TaskFunc varAC; + u8 v46[0x4]; + TaskFunc varB4; + struct UnkStruct0 varB8; }; -void sub_8117434(void); - void sub_81150FC(void) { u8 *p; @@ -246,9 +336,9 @@ void sub_8115238(void) unfaded[0x51] = arr[1]; unfaded[0x0] = arr[1]; } - sub_8124918(UNKDATA); + sub_8124918((&RDATA->varB8)); for (i = 0; i < 0xD; i++) - sub_812492C(UNKDATA, i, (struct UnkStruct1 *)&gUnknown_083F8E34[i * 8]); + sub_812492C((&RDATA->varB8), i, (struct UnkStruct1 *)&gUnknown_083F8E34[i * 8]); for (i = 0; i < 0x6; i++) { switch (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2)) @@ -649,15 +739,15 @@ bool8 sub_8115A94(s16 *r0, u8 r1) t = (u8)*r0; switch (r1) { - case 0x0: - case 0x1: + case 0x0: + case 0x1: temp1 = (*r0 % 5); temp = temp1 + 0xF; if (temp1 == 0) temp1 = 0x5; break; - case 0x2: - case 0x3: + case 0x2: + case 0x3: temp1 = (s16)(*r0 / 5) * 5; temp = temp1 + 0x4; if (temp1 == 0) @@ -674,10 +764,10 @@ bool8 sub_8115A94(s16 *r0, u8 r1) return FALSE; } - void sub_8115B58(u8 r0) { - bool8 var0; + u8 z = 0x0; + bool8 var0 = FALSE; if (!(gMain.newKeys & DPAD_UP) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x0))) if (!(gMain.newKeys & DPAD_DOWN) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x1))) if (!(gMain.newKeys & DPAD_LEFT) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x2))) @@ -685,32 +775,987 @@ void sub_8115B58(u8 r0) if (var0) { u8 i; - //u16 temp5; sub_8117158(gTasks[r0].data[0x4]); sub_8115928(r0, FALSE); - gTasks[r0].data[0x1] = 0; - PlaySE(0x5); - sub_8124D3C(UNKDATA, 0xFFFF); - UNKDATA->val3[0xF].field1 = 0x0; - UNKDATA->val3[0xE].field1 = 0x0; - UNKDATA->val3[0xD].field1 = 0x0; + gTasks[r0].data[0x1] = z; + PlaySE(SE_SELECT); + sub_8124D3C((&RDATA->varB8), 0xFFFF); + (&RDATA->varB8)->val3[0xF].field1 = 0x0; + (&RDATA->varB8)->val3[0xE].field1 = 0x0; + (&RDATA->varB8)->val3[0xD].field1 = 0x0; sub_8116EF8(gTasks[r0].data[0x4]); - for (i = 0; i < 4; i++) + for (i = 0; i < 0x4; i++) { - struct Sprite *sprite = &gSprites[RDATA->var65[i]]; - //u16 *temp0 = ; //deoptimize ->var65 - sprite->oam.tileNum = ((*sprite->anims)->type + sprite->sheetTileStart); + gSprites[RDATA->var3C[i + 0x29]].oam.tileNum = + gSprites[RDATA->var3C[i + 0x29]].sheetTileStart + + (*gSprites[RDATA->var3C[i + 0x29]].anims)->type; } - //temp5 = (); - if ((u16)(gTasks[r0].data[0x4] - 1) < 0x4) + if ((u16)(gTasks[r0].data[0x4] - 1) < 0x4 && !(RDATA->var08 & gUnknown_083F8C00[gTasks[r0].data[0x4]].var08) ) { - if ((RDATA->var08 & gUnknown_083F8C00[gTasks[r0].data[0x4]].var08) == 0) - { - //u16 temp1 = gTasks[r0].data[0x4] - 1; - u32 temp2 = gSprites[RDATA->var65[(u8)(gTasks[r0].data[0x4] - 1)]].sheetTileStart; - temp2 += (u16)((*gSprites[RDATA->var65[r0]].anims + 1)->type); - gSprites[RDATA->var65[r0]].oam.tileNum = temp2; - } + z = gTasks[r0].data[0x4] - 1; + gSprites[RDATA->var3C[z + 0x29]].oam.tileNum = + gSprites[RDATA->var3C[z + 0x29]].sheetTileStart + + (*gSprites[RDATA->var3C[z + 0x29]].anims + 1)->type; } } } + +void sub_8115D58(u8 r0) +{ + RDATA->var28 = 0xFF; + if (RDATA->var19 == 1) + RDATA->var23 = 1; + else + RDATA->var23 = 0; + RDATA->var21 = 0; + gTasks[r0].data[0x1] = 0x20; + gTasks[r0].func = &sub_8115ECC; +} + +void sub_8115DA0(u8 taskid) +{ + RDATA->var1B[RDATA->var1A_0] = gTasks[taskid].data[0x4]; + gTasks[taskid].data[0x2] = sub_8117380(RDATA->var1B[RDATA->var1A_0]); + sub_811829C(RDATA->var1B[RDATA->var1A_0]); + if ((gTasks[taskid].data[0xD] -= RDATA->var19) < 0) + gTasks[taskid].data[0xD] = 0; + sub_81180F4(gTasks[taskid].data[0xD]); + gTasks[taskid].func = &sub_8115D58; +} + +void sub_8115E14(u8 taskid) +{ + sub_8115B58(taskid); + switch (gTasks[taskid].data[0x1]) + { + case 0x0: + sub_81157D0(gTasks[taskid].data[0x4]); + gTasks[taskid].data[0x1]+= 1; + break; + case 0x1E: + sub_81157D0(0); + gTasks[taskid].data[0x1]+= 1; + break; + case 0x3B: + gTasks[taskid].data[0x1] = 0; + break; + default: + gTasks[taskid].data[0x1]++; + } + if (gMain.newKeys & A_BUTTON) + { + if ((RDATA->var08 & gUnknown_083F8C00[gTasks[taskid].data[0x4]].var08)) + PlaySE(SE_BOO); + else + { + m4aSongNumStart(SE_REGI); + gTasks[taskid].func = &sub_8115DA0; + } + } +} + +void sub_8115ECC(u8 taskid) +{ + if (gTasks[taskid].data[0x1]-- > 0) + { + if (gTasks[taskid].data[0x1] > 0x2) + gSpriteCoordOffsetX += 0x2; + if ((RDATA->var26 += 0x4) == 0x68) + gSprites[RDATA->var3C[0x19]].callback = &SpriteCallbackDummy; + } + else + { + sub_8117AA8(0x1, 0xFF); + sub_8117C60(0x1, 0xFF); + gTasks[taskid].func = &sub_8116100; + gTasks[taskid].data[0x1] = 0; + } +} + +u8 sub_8115F58(u16 r0, u16 r1) +{ + u8 timeh; + switch (RDATA->var02) + { + case 0x1: // SHROOMISH + case 0x2: // TAILLOW + // one of the two is in party + timeh = gLocalTime.hours - 0x4; + if (!(timeh > 0x5)) + { + if (!(r0 < 0xC || (r1 & 0x1))) + return 0x1; + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 2; + } + } + else if (!(r1 & 0x3)) + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 2; + } + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02; + } + break; + case 0x3: + // both are in party + timeh = gLocalTime.hours - 0x4; + if (!(timeh > 0x6)) + { + if (r0 < 0x6 || (r1 & 0x1)) + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 2; + } + else + { + return 0x1; + } + } + else if ((r1 & 0x1) && !(r0 < 0x7)) + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 4; + } + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 2; + } + break; + case 0: + default: + // neither is in party + timeh = gLocalTime.hours - 0x4; + if (!(timeh > 5)) + { + if (!(r1 & 0x3)) + { + return 0x1; + } + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 2; + } + } + else if (!(r1 & 0x3)) + { + if (!(r0 < 0xD)) + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02 / 2; + } + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02; + } + } + else if (r1 & (0x80 << 8)) + { + if (!(r0 < 0xD)) + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var02; + } + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var01; + } + } + else + { + struct Unkg083F8DF4 *p = &gUnknown_083F8DF4[0]; + return p[RDATA->var04_0].var01 * 2; + } + } +} + +#ifdef NONMATCHING +void sub_8116100(u8 taskid) +{ + u8 randf; + u16 floatr; + float tempf; + u32 zzz; + s8 randfinal; + s8 r5; + u16 g; + u16 rand; + u16 randmod; + s16 angles[0x4]; // angles in 90 degree steps + u8 zero = 0x0; + memcpy(angles, &gUnknown_083F8ECE, 0x8); + rand = Random(); + randmod = rand % 0x64; + RDATA->var7C = gTasks[taskid].data[0x6]; + RDATA->var7F = zero; + RDATA->var7E = zero; + RDATA->var7D = zero; + randf = sub_8115F58(gTasks[taskid].data[0x8], rand); + randfinal = (rand % randf) - (randf / 2); + if (gLocalTime.hours < 0xD) + r5 = 0x0; + else + r5 = 0x1; + if (randmod < 0x50) + r5 *= 2; + else + r5 = (1 - r5) * 2; + g = (&gUnknown_083F8DF4[RDATA->var04_0])->var1A; + RDATA->var80 = (g + randfinal); + tempf = S16TOPOSFLOAT(g + randfinal); + // some register differences here + floatr = tempf / 5.0f; + zzz = floatr * 3; + RDATA->var82 = floatr * 3; + RDATA->var84 = floatr; + RDATA->var86 = floatr; + // + RDATA->var88 = S16TOPOSFLOAT(angles[(rand & 0x1) + r5]); + RDATA->var8C = S16TOPOSFLOAT((&gUnknown_083F8DF4[RDATA->var04_0])->var18); + RDATA->var90 = ((RDATA->var8C * 0.5f) - RDATA->var8C) / S16TOPOSFLOAT(zzz); + RDATA->var94 = 68.0f; + RDATA->var9C = 0.0f; + RDATA->var98 = -(8.0f / S16TOPOSFLOAT(zzz)); + RDATA->varA0 = 36.0f; + gTasks[taskid].func = &sub_8116308; +} +#else +__attribute__((naked)) +void sub_8116100(u8 taskid) +{ +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, 0x8\n\ +lsls r0, 24\n\ +lsrs r0, 24\n\ +mov r9, r0\n\ +movs r4, 0\n\ +ldr r1, _08116188 @ =gUnknown_083F8ECE\n\ +mov r0, sp\n\ +movs r2, 0x8\n\ +bl memcpy\n\ +bl Random\n\ +lsls r0, 16\n\ +lsrs r7, r0, 16\n\ +adds r0, r7, 0\n\ +movs r1, 0x64\n\ +bl __umodsi3\n\ +lsls r0, 16\n\ +lsrs r6, r0, 16\n\ +ldr r3, _0811618C @ =0x02019000\n\ +ldr r1, _08116190 @ =gTasks\n\ +mov r2, r9\n\ +lsls r0, r2, 2\n\ +add r0, r9\n\ +lsls r0, 3\n\ +adds r0, r1\n\ +ldrh r2, [r0, 0x14]\n\ +adds r1, r3, 0\n\ +adds r1, 0x7C\n\ +strb r2, [r1]\n\ +adds r1, 0x3\n\ +strb r4, [r1]\n\ +subs r1, 0x1\n\ +strb r4, [r1]\n\ +subs r1, 0x1\n\ +strb r4, [r1]\n\ +ldrh r0, [r0, 0x18]\n\ +adds r1, r7, 0\n\ +bl sub_8115F58\n\ +adds r4, r0, 0\n\ +lsls r4, 24\n\ +lsrs r1, r4, 24\n\ +adds r0, r7, 0\n\ +bl __modsi3\n\ +lsrs r4, 25\n\ +subs r0, r4\n\ +lsls r0, 24\n\ +lsrs r4, r0, 24\n\ +ldr r0, _08116194 @ =gLocalTime\n\ +ldrb r0, [r0, 0x2]\n\ +lsls r0, 24\n\ +asrs r0, 24\n\ +movs r5, 0x1\n\ +cmp r0, 0xC\n\ +bgt _08116180\n\ +movs r5, 0\n\ +_08116180:\n\ +cmp r6, 0x4F\n\ +bhi _08116198\n\ +lsls r0, r5, 25\n\ +b _081161A2\n\ +.align 2, 0\n\ +_08116188: .4byte gUnknown_083F8ECE\n\ +_0811618C: .4byte 0x02019000\n\ +_08116190: .4byte gTasks\n\ +_08116194: .4byte gLocalTime\n\ +_08116198:\n\ +lsls r1, r5, 24\n\ +asrs r1, 24\n\ +movs r0, 0x1\n\ +subs r0, r1\n\ +lsls r0, 25\n\ +_081161A2:\n\ +lsrs r5, r0, 24\n\ +ldr r6, _081162D8 @ =0x02019000\n\ +ldrb r0, [r6, 0x4]\n\ +lsls r0, 30\n\ +mov r10, r0\n\ +lsrs r0, 25\n\ +ldr r1, _081162DC @ =gUnknown_083F8DF4\n\ +adds r0, r1\n\ +lsls r4, 24\n\ +asrs r4, 24\n\ +ldrh r0, [r0, 0x1A]\n\ +adds r4, r0\n\ +adds r0, r6, 0\n\ +adds r0, 0x80\n\ +strh r4, [r0]\n\ +lsls r4, 16\n\ +asrs r4, 16\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +cmp r4, 0\n\ +bge _081161D4\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +_081161D4:\n\ +ldr r1, _081162E4 @ =0x40a00000\n\ +bl __divsf3\n\ +bl __fixunssfsi\n\ +lsls r0, 16\n\ +lsrs r4, r0, 16\n\ +lsls r0, r4, 1\n\ +adds r0, r4\n\ +mov r8, r0\n\ +adds r0, r6, 0\n\ +adds r0, 0x82\n\ +mov r2, r8\n\ +strh r2, [r0]\n\ +adds r0, 0x2\n\ +strh r4, [r0]\n\ +adds r0, 0x2\n\ +strh r4, [r0]\n\ +movs r0, 0x1\n\ +ands r0, r7\n\ +lsls r1, r5, 24\n\ +asrs r1, 24\n\ +adds r0, r1\n\ +lsls r0, 1\n\ +add r0, sp\n\ +movs r1, 0\n\ +ldrsh r4, [r0, r1]\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +cmp r4, 0\n\ +bge _0811621A\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +_0811621A:\n\ +ldr r2, _081162E8 @ =0x02019088\n\ +str r0, [r2]\n\ +adds r7, r6, 0\n\ +adds r7, 0x8C\n\ +mov r1, r10\n\ +lsrs r0, r1, 25\n\ +ldr r2, _081162DC @ =gUnknown_083F8DF4\n\ +adds r0, r2\n\ +movs r1, 0x18\n\ +ldrsh r4, [r0, r1]\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +adds r5, r0, 0\n\ +cmp r4, 0\n\ +bge _08116242\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +adds r5, r0, 0\n\ +_08116242:\n\ +str r5, [r7]\n\ +adds r7, r6, 0\n\ +adds r7, 0x90\n\ +ldr r1, _081162EC @ =0x3f000000\n\ +adds r0, r5, 0\n\ +bl __mulsf3\n\ +adds r1, r5, 0\n\ +bl __subsf3\n\ +adds r5, r0, 0\n\ +mov r2, r8\n\ +lsls r0, r2, 16\n\ +asrs r4, r0, 16\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +adds r2, r0, 0\n\ +cmp r4, 0\n\ +bge _08116272\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +adds r2, r0, 0\n\ +_08116272:\n\ +adds r0, r5, 0\n\ +adds r1, r2, 0\n\ +bl __divsf3\n\ +str r0, [r7]\n\ +adds r1, r6, 0\n\ +adds r1, 0x94\n\ +ldr r0, _081162F0 @ =0x42880000\n\ +str r0, [r1]\n\ +adds r1, 0x8\n\ +ldr r0, _081162F4 @ =0x00000000\n\ +str r0, [r1]\n\ +adds r5, r6, 0\n\ +adds r5, 0x98\n\ +adds r0, r4, 0\n\ +bl __floatsisf\n\ +adds r2, r0, 0\n\ +cmp r4, 0\n\ +bge _081162A2\n\ +ldr r1, _081162E0 @ =0x47800000\n\ +bl __addsf3\n\ +adds r2, r0, 0\n\ +_081162A2:\n\ +ldr r0, _081162F8 @ =0x41000000\n\ +adds r1, r2, 0\n\ +bl __divsf3\n\ +bl __negsf2\n\ +str r0, [r5]\n\ +adds r1, r6, 0\n\ +adds r1, 0xA0\n\ +ldr r0, _081162FC @ =0x42100000\n\ +str r0, [r1]\n\ +ldr r1, _08116300 @ =gTasks\n\ +mov r2, r9\n\ +lsls r0, r2, 2\n\ +add r0, r9\n\ +lsls r0, 3\n\ +adds r0, r1\n\ +ldr r1, _08116304 @ =sub_8116308\n\ +str r1, [r0]\n\ +add sp, 0x8\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\ +_081162D8: .4byte 0x02019000\n\ +_081162DC: .4byte gUnknown_083F8DF4\n\ +_081162E0: .4byte 0x47800000\n\ +_081162E4: .4byte 0x40a00000\n\ +_081162E8: .4byte 0x02019088\n\ +_081162EC: .4byte 0x3f000000\n\ +_081162F0: .4byte 0x42880000\n\ +_081162F4: .4byte 0x00000000\n\ +_081162F8: .4byte 0x41000000\n\ +_081162FC: .4byte 0x42100000\n\ +_08116300: .4byte gTasks\n\ +_08116304: .4byte sub_8116308\n\ +.syntax divided\n"); +} +#endif + +void sub_8116308(u8 taskid) +{ + u8 index; + RDATA->var03_7 = 1; + index = RDATA->var3C[RDATA->var7C]; + RDATA->var38 = &gSprites[index]; + (&gSprites[index])->callback = &sub_81191F4; + gTasks[taskid].data[0x6]++; + gTasks[taskid].data[0x8]++; + sub_81182F8(0x6 - gTasks[taskid].data[0x6]); + m4aSongNumStart(SE_TAMAKORO); + gTasks[taskid].func = &sub_811637C; +} + +void sub_811637C(u8 taskid) +{ + if (RDATA->var7D) + { + if (RDATA->var03_5) + { + if (RDATA->var03_6) + { + RDATA->var03_6 = FALSE; + RDATA->var03_5 = FALSE; + } + } + else + { + if (!gTasks[taskid].data[0x1]) + { + u8 temp = sub_8116E5C(sub_8116D54(taskid, RDATA->var7E), RDATA->var1B[RDATA->var1A_0]); + gTasks[taskid].data[0x5] = temp; + if (temp == 1) + sub_8124CE8((&RDATA->varB8), 0x1000); + } + if (gTasks[taskid].data[0x1] < 0x3D) + { + if (gMain.newKeys & A_BUTTON) + gTasks[taskid].data[0x1] = 0x3C; + gTasks[taskid].data[0x1]++; + } + else + { + sub_8117158(RDATA->var1B[RDATA->var1A_0]); + sub_8117AA8(0x0, (u8)gTasks[taskid].data[0xC]); + sub_8117C60(0x0, (u8)gTasks[taskid].data[0x6] - 0x1); + gTasks[taskid].data[0x1] = 0x20; + gTasks[taskid].func = &sub_8116474; + } + } + } +} + +void sub_8116474(u8 taskid) +{ + if (gTasks[taskid].data[0x1]-- > 0x0) + { + if(gTasks[taskid].data[0x1] > 0x2) + gSpriteCoordOffsetX -= 0x2; + if((RDATA->var26 -= 0x4) == 0x68) + gSprites[RDATA->var3C[0x19]].callback = &sub_81184CC; + } + else + { + sub_8117D68(gTasks[taskid].data[0xC]); + if (gTasks[taskid].data[0x5] == 1) + gTasks[taskid].data[0x1] = 0x79; + else + gTasks[taskid].data[0x1] = 0x3D; + gTasks[taskid].func = &sub_8116514; + } +} + +void sub_8116514(u8 taskid) +{ + if (gTasks[taskid].data[0x1]-- > 0x1) + { + switch(gTasks[taskid].data[0x1] % 0x10) + { + case 0x8: + sub_8117AA8(0x0, 0xFF); + sub_8117C60(0x0, 0xFF); + break; + case 0x0: + sub_8117AA8(0x0, (u8)gTasks[taskid].data[0xC]); + sub_8117C60(0x0, (u8)gTasks[taskid].data[0x6] - 0x1); + break; + } + } + else + { + sub_8116C34(taskid, &sub_8116638, 0x1E, 0x0); + } +} + +void sub_811659C(u8 taskid) +{ + switch(gTasks[taskid].data[0x5]) + { + case 0x1: + case 0x2: + if (IsFanfareTaskInactive()) + { + u32 wins = GetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS); + if(wins < ++gTasks[taskid].data[0xB]) + SetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS, gTasks[taskid].data[0xB]); + sub_8116C34(taskid, &sub_811677C, 0xFFFF, 0x3); + } + break; + case 0: + default: + if (!IsSEPlaying()) + { + gTasks[taskid].data[0xB] = FALSE; + sub_8116C34(taskid, &sub_81167F4, 0xFFFF, 0x3); + } + } +} + +void sub_8116638(u8 taskid) +{ + switch(gTasks[taskid].data[0x5]) + { + case 0x1: + case 0x2: + if (gTasks[taskid].data[0x2] == 0xC) + { + PlayFanfare(BGM_ME_B_BIG); + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C41A5, 0x1, 0xF); + } + else + { + PlayFanfare(BGM_ME_B_SMALL); + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C4199, 0x1, 0xF); + } + break; + case 0: + default: + m4aSongNumStart(SE_HAZURE); + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C41AE, 0x1, 0xF); + } + gTasks[taskid].data[0x1] = 0x0; + gTasks[taskid].func = &sub_811659C; +} + +void sub_81166E8(u8 taskid) +{ + s32 r0 = gTasks[taskid].data[0x7]; + switch(r0) + { + case 0x0: + gTasks[taskid].data[0xD]++; + m4aSongNumStart(SE_PIN); + sub_81180F4(gTasks[taskid].data[0xD]); + if (gTasks[taskid].data[0xD] > 0x270E) + { + gTasks[taskid].data[0x1] = r0; + } + else + { + gTasks[taskid].data[0x1]--; + gTasks[taskid].data[0x7]++; + } + break; + case 0x3: + m4aSongNumStop(SE_PIN); + gTasks[taskid].data[0x7] = 0x0; + break; + default: + gTasks[taskid].data[0x7]++; + } + if (gTasks[taskid].data[0x1] == 0x0) + sub_8116C34(taskid, &sub_81167F4, 0xFFFF, 0x3); +} + +void sub_811677C(u8 taskid) +{ + ConvertIntToDecimalStringN((u8 *)&gStringVar1, (RDATA->var19 * gTasks[taskid].data[0x2]), STR_CONV_MODE_LEFT_ALIGN, 0x2); + StringExpandPlaceholders((u8 *)&gStringVar4, &gUnknown_081C41BD); + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint((u8 *)&gStringVar4, 0x1, 0xF); + gTasks[taskid].data[0x1] = (RDATA->var19 * gTasks[taskid].data[0x2]); + gTasks[taskid].data[0x7] = 0x0; + gTasks[taskid].func = &sub_81166E8; +} + +void sub_81167F4(u8 taskid) +{ + sub_8124D3C((&RDATA->varB8), 0xFFFF); + (&RDATA->varB8)->val3[0xF].field1 = 0x0; + (&RDATA->varB8)->val3[0xE].field1 = 0x0; + (&RDATA->varB8)->val3[0xD].field1 = 0x0; + gSprites[RDATA->var3C[0x7 + gUnknown_083F8C00[gTasks[taskid].data[0xC]].var00]].invisible = TRUE; + gTasks[taskid].func = &sub_8116880; +} + +void sub_8116880(u8 taskid) +{ + u8 i = 0; + gTasks[taskid].data[0x4] = i; + RDATA->var1B[RDATA->var1A_0] = 0x0; + sub_8117158(0x0); + gSprites[RDATA->var6C].invisible = TRUE; + for (i = 0; i < 0x4; i++) + { + gSprites[RDATA->var3C[i + 0x29]].oam.tileNum = + gSprites[RDATA->var3C[i + 0x29]].sheetTileStart + + (*gSprites[RDATA->var3C[i + 0x29]].anims)->type; + } + if (!(gTasks[taskid].data[0xD] < RDATA->var19)) + { + if (gTasks[taskid].data[0x6] == 0x6) + { + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C41F1, 0x1, 0xF); + sub_8116C34(taskid, &dp01t_12_3_battle_menu, 0xFFFF, 0x3); + } + else if (gTasks[taskid].data[0xD] == 0x270F) + { + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C4231, 0x1, 0xF); + sub_8116C34(taskid, &sub_8115734, 0xFFFF, 0x3); + } + else + { + gTasks[taskid].func = &sub_8115734; + } + } + else + { + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C41D2, 0x1, 0xF); + sub_8116C34(taskid, &sub_81157AC, 0x3C, 0x3); + } +} + +void dp01t_12_3_battle_menu(u8 taskid) +{ + u8 i = 0x0; + gTasks[taskid].data[0x6] = 0x0; + sub_8116CAC(taskid); + sub_8116CF8(); + sub_81185E8(); + sub_8117158(0x0); + sub_81182F8(0x6); + for (i = 0; i < 0xC; i++) + gSprites[RDATA->var3C[i + 0x7]].invisible = FALSE; + if (gTasks[taskid].data[0xD] == 0x270F) + { + MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13); + MenuPrint(&gUnknown_081C4231, 0x1, 0xF); + sub_8116C34(taskid, &sub_8115734, 0xFFFF, 0x3); + } + else + { + gTasks[taskid].func = &sub_8115734; + } +} + +void sub_8116AB0(u8 taskid) +{ + sub_8124D3C((&RDATA->varB8), 0xFFFF); + sub_8124918((&RDATA->varB8)); + gSaveBlock1.coins = gTasks[taskid].data[0xD]; + if (gSaveBlock1.coins < RDATA->var19) + gSpecialVar_0x8004 = TRUE; + else + gSpecialVar_0x8004 = FALSE; + BeginHardwarePaletteFade(0xFF, 0x0, 0x0, 0x10, 0x0); + gTasks[taskid].func = &sub_8116B40; +} + +void sub_8116B40(u8 taskid) // end oulette ? +{ + if (UpdatePaletteFade() == 0) + { + SetVBlankCallback(0x0); + memset(RDATA, 0x0, 0x17C); + gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0x0; + sub_80F9368(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + ResetSpriteData(); + sub_80F9020(); + REG_BLDCNT = 0x0; + REG_BLDALPHA = 0x0; + REG_BLDY = 0x0; + gFieldCallback = &sub_8080990; + SetMainCallback2(&c2_exit_to_overworld_2_switch); + DestroyTask(taskid); + } +} + +void sub_8116BC0(u8 taskid) +{ + if(RDATA->varA8 == 0 || gMain.newKeys & RDATA->varAA) + { + gTasks[taskid].func = RDATA->varAC; + if (RDATA->varAA > 0) + PlaySE(SE_SELECT); + RDATA->varAC = NULL; + RDATA->varAA = 0x0; + RDATA->varA8 = 0x0; + } + if (RDATA->varA8 != 0xFFFF) + RDATA->varA8--; +} + +void sub_8116C34(u8 taskid, TaskFunc r1, u16 r2, u16 r3) +{ + RDATA->varB4 = gTasks[taskid].func; + if(r1 == NULL) + r1 = RDATA->varB4; + RDATA->varAC = r1; + RDATA->varA8 = r2; + if (r2 == 0xFFFF && r3 == 0) + RDATA->varAA = 0xFFFF; + else + RDATA->varAA = r3; + gTasks[taskid].func = &sub_8116BC0; +} + +void sub_8116CAC(u8 taskid) +{ + u8 i = 0; + RDATA->var00 = i; + RDATA->var03_0 = 0x0; + RDATA->var03_5 = 0x0; + RDATA->var03_6 = 0x0; + RDATA->var03_7 = 0x0; + for (i = 0; i < 0x6; i++) + RDATA->var1B[i] = 0x0; + RDATA->var1A_0 = 0x0; + gTasks[taskid].data[0x1] = 0x0; +} + +void sub_8116CF8(void) +{ + u8 i; + RDATA->var08 = 0x0; + for (i = 0; i < 0x6; i++) + RDATA->var0C[i] = 0x0; + for (i = 0; i < 0x4; i++) + RDATA->var12[i] = 0x0; + for (i = 0; i < 0x3; i++) + RDATA->var16[i] = 0x0; + sub_8117C60(0x1, 0xFF); +} + +u8 sub_8116D54(u8 taskid, u8 r1) +{ + u32 t0[0x4]; + u32 t1[0x3]; + memcpy(t0, gUnknown_083F8ED8, 0x10); + memcpy(t1, gUnknown_083F8EE8, 0xC); + if (r1 > 0xB) + { + return 0x0; + } + else + { + u8 i; + u8 z; + RDATA->var0C[gTasks[taskid].data[0x6] - 1] = gUnknown_083F8D90[r1].var02; + gTasks[taskid].data[0xC] = gUnknown_083F8D90[r1].var02; + RDATA->var08 |= gUnknown_083F8D90[r1].var04; + for (i = 0; i < 0x4; i++) + { + if (gUnknown_083F8D90[r1].var04 & t0[i]) + RDATA->var12[i]++; + if (RDATA->var12[i] > 0x2) + RDATA->var08 |= t0[i]; + } + for (z = 0; z < 0x3; z++) + { + if (gUnknown_083F8D90[r1].var04 & t1[z]) + RDATA->var16[z]++; + if (RDATA->var16[z] > 0x3) + RDATA->var08 |= t1[z]; + } + return gUnknown_083F8D90[r1].var02; + } +} + +u8 sub_8116E5C(u8 r0, u8 r1) +{ + u8 t = r0; + if (--r0 < 0x13) + { + switch(r1) + { + case 0x0: + return 0x3; + break; + case 0x1 ... 0x4: + if (t == r1 + 5 || t == r1 + 10 || t == r1 + 15) + return 0x1; + break; + case 0x5: + case 0xA: + case 0xF: + if (!(t < r1 + 1) && !(t > r1 + 4)) + return 0x1; + break; + default: + if (t == r1) + return 0x1; + } + } + return 0x0; +} +/* +void sub_8116EF8(u8 r0) +{ + + u32 var0 = 0x0; + struct UnkStruct1 var1[0x3]; + u32 var2; + u16 var3; + u32 var4; + u8 i; + switch(r0) + { + case 0x5: + case 0xA: + case 0xF: + for (i = (r0 + 0x1); i < (r0 + 0x5); i++) + if (!(RDATA->var08 & gUnknown_083F8C00[i].var08)) + var0 |= gUnknown_083F8C00[i].var10; + var0 &= 0xDFFF; + sub_8124CE8(&RDATA->varB8, var0); + break; + default: + memcpy(var1, gUnknown_083F8E9C, 0x18); + if ((u8)(r0 - 0x1) < 0x4) + var2 = 0x3; + else + var2 = 0x1; + var3 = ((r0 / 0x5) - 0x1); + switch((u8)r0 % 0x5) + { + case 0x1: + var3 = gSprites[RDATA->var3C[0x7 + 0x0]].oam.paletteNum * 0x10; + break; + case 0x2: + var3 = gSprites[RDATA->var3C[0x7 + 0x1]].oam.paletteNum * 0x10; + break; + case 0x3: + var3 = gSprites[RDATA->var3C[0x7 + 0x2]].oam.paletteNum * 0x10; + break; + case 0x4: + var3 = gSprites[RDATA->var3C[0x7 + 0x3]].oam.paletteNum * 0x10; + break; + } + if (var2 == 0x1) + { + if (!(RDATA->var08 & gUnknown_083F8C00[r0].var08)) + { + var4 = (r0 / 0x5); + var1[var4 - 0x1].val1 += var3; + sub_812492C(&RDATA->varB8, 0xD, &var1[var4 - 0x2]); + sub_8124CE8(&RDATA->varB8, var0 |= gUnknown_083F8C00[r0].var10); + } + } + else + { + //u8 i; + for (i = 0; i < 0x3; i++) + { + u8 var4 = i * 0x5 + r0 + 0x5; + if (!(RDATA->var08 & gUnknown_083F8C00[var4].var08)) + { + u8 var5 = (var4 / 0x5); + var1[var5 - 0x1].val1 += var3; + sub_812492C(&RDATA->varB8, (u8)(0xD + i), &var1[var5 - 0x2]); + if (var2 == 0x3) + var0 = gUnknown_083F8C00[var4].var10; + var2--; + } + } + if (var2 != 0x2) + var0 = 0x0; + sub_8124CE8(&RDATA->varB8, var0 |= gUnknown_083F8C00[r0].var10); + } + } +} +*/ |