diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/roulette.c | 1179 |
1 files changed, 1156 insertions, 23 deletions
diff --git a/src/roulette.c b/src/roulette.c index 8a483e123..fb12b93d0 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -2,24 +2,30 @@ #include "alloc.h" #include "bg.h" #include "coins.h" +#include "decompress.h" #include "event_data.h" +#include "field_screen_effect.h" #include "gpu_regs.h" #include "m4a.h" #include "main.h" #include "menu.h" #include "menu_helpers.h" +#include "overworld.h" #include "palette.h" #include "random.h" #include "roulette.h" #include "roulette_util.h" #include "rtc.h" #include "scanline_effect.h" +#include "script.h" #include "sound.h" #include "sprite.h" +#include "string_util.h" #include "task.h" #include "trig.h" #include "tv.h" #include "window.h" +#include "constants/rgb.h" #include "constants/species.h" #include "constants/songs.h" @@ -44,7 +50,7 @@ struct StructgUnknown_083F8DF4 float var1C; }; -struct StructgUnknown_083F8C00 +struct StructgUnknown_085B6154 { u8 var00; u8 var01_0:4; @@ -61,6 +67,15 @@ struct StructgUnknown_083F8C00 u16 var12; }; +struct StructgUnknown_083F8D90 +{ + u8 var00; + u8 var01; + u8 var02; + u8 var03; + u32 var04; +}; + extern struct Roulette { u8 var00; @@ -129,10 +144,21 @@ extern u8 gUnknown_0203AB8C; /*static*/ void sub_81410FC(u8); /*static*/ void sub_8141344(u8); /*static*/ void sub_814155C(u8); +/*static*/ void sub_81415D4(u8); +/*static*/ void sub_81416D4(u8); +/*static*/ void sub_8141778(u8); +/*static*/ void sub_814189C(u8); +/*static*/ void sub_8141A18(u8); +/*static*/ void sub_8141AC0(u8); +/*static*/ void sub_8141B58(u8); +/*static*/ void dp01t_12_3_battle_menu(u8); /*static*/ void sub_8141DE4(u8); +/*static*/ void sub_8141E7C(u8); /*static*/ void sub_8141F7C(u8 taskId, TaskFunc r1, u16 r2, u16 r3); /*static*/ void sub_8141FF4(u8); /*static*/ void sub_8142070(void); +/*static*/ u8 sub_81420D0(u8, u8); +/*static*/ bool8 sub_81421E8(u8, u8); /*static*/ void sub_8142284(u8); /*static*/ void sub_81424FC(u8); /*static*/ u8 sub_8142758(u8); @@ -142,14 +168,17 @@ extern u8 gUnknown_0203AB8C; /*static*/ void sub_8142E70(u8, u8); /*static*/ void sub_8142F7C(void); /*static*/ void sub_8143038(u8, u8); +/*static*/ void sub_8143150(u8); /*static*/ void sub_81431E4(void); /*static*/ void sub_8143314(void); /*static*/ void sub_8143514(u16); /*static*/ void sub_81436D0(u8); /*static*/ void sub_814372C(u8); +/*static*/ void sub_814390C(struct Sprite *); /*static*/ void sub_814391C(void); /*static*/ void sub_81439C8(void); /*static*/ void sub_8143A40(void); +/*static*/ void sub_81446AC(struct Sprite *); extern const struct BgTemplate gUnknown_085B6140[3]; extern const struct WindowTemplate gUnknown_085B614C[]; @@ -164,10 +193,45 @@ extern const u32 gRouletteWheelTiles[]; extern const u32 gUnknown_085B5FA0[]; extern const u8 gUnknown_082A5B89[]; extern const u8 gUnknown_082A5C13[]; +extern const u8 gUnknown_082A5BD7[]; +extern const u8 gUnknown_082A5BCB[]; +extern const u8 gUnknown_082A5BE0[]; +extern const u8 gUnknown_082A5BEF[]; +extern const u8 gUnknown_082A5C21[]; +extern const u8 gUnknown_082A5C61[]; +extern const u8 gUnknown_082A5C04[]; +extern const u8 gUnknown_082A5B12[]; +extern const u8 gUnknown_082A5B6B[]; +extern const u8 gUnknown_082A5B4E[]; extern const struct YesNoFuncTable gUnknown_085B6410; -extern const struct StructgUnknown_083F8C00 gUnknown_085B6154[]; +extern const struct StructgUnknown_085B6154 gUnknown_085B6154[]; extern const u8 gUnknown_085B641E[]; extern const u16 gUnknown_085B6422; +extern const u32 gUnknown_085B642C[]; +extern const u32 gUnknown_085B643C[]; +extern const struct StructgUnknown_083F8D90 gUnknown_085B62E4[]; +extern const struct UnkStruct1 gUnknown_085B63F0[]; +extern const u8 gUnknown_085B6448[]; +extern const struct YesNoFuncTable gUnknown_085B6408; +extern const struct SpritePalette gUnknown_085B7384[]; +extern const struct CompressedSpriteSheet gUnknown_085B7864; +extern const struct CompressedSpriteSheet gUnknown_085B7978; +extern const struct CompressedSpriteSheet gUnknown_085B7A40; +extern const struct CompressedSpriteSheet gUnknown_085B7488; +extern const struct CompressedSpriteSheet gUnknown_085B7490; +extern const struct SpriteTemplate gSpriteTemplate_85B75B0[]; +extern const struct SpriteTemplate gSpriteTemplate_85B7508[]; +extern const struct SpriteTemplate gSpriteTemplate_85B7568[]; +extern const struct SpriteTemplate gSpriteTemplate_85B7928; +extern const struct CompressedSpriteSheet gUnknown_085B741C; +extern const struct SpriteTemplate gSpriteTemplate_85B7610[]; +extern const struct CompressedSpriteSheet gUnknown_085B7750[]; +extern const struct SpriteTemplate gSpriteTemplate_85B77E4; +extern const struct SpriteTemplate gUnknown_085B77FC; +extern const struct SpriteTemplate gUnknown_085B7814; +extern const struct SpriteTemplate gUnknown_085B782C; +extern const struct SpriteTemplate gUnknown_085B7844; +extern const u8 gUnknown_085B7B04[]; void sub_8140238(void) { @@ -557,16 +621,12 @@ void sub_8140D6C(u8 r0) if (var0) { u8 i; - struct Roulette *roulette; sub_81424FC(gTasks[r0].data[4]); sub_8140B64(r0); gTasks[r0].data[1] = z; PlaySE(SE_SELECT); sub_8151A9C(&gUnknown_0203AB88->varB8, 0xFFFF); - roulette = gUnknown_0203AB88; - roulette->varB8.var04[15].var00_7 = 0; - roulette->varB8.var04[14].var00_7 = 0; - roulette->varB8.var04[13].var00_7 = 0; + gUnknown_0203AB88->varB8.var04[13].var00_7 = gUnknown_0203AB88->varB8.var04[14].var00_7 = gUnknown_0203AB88->varB8.var04[15].var00_7 = 0; sub_8142284(gTasks[r0].data[4]); for (i = 0; i < 4; i++) { @@ -605,33 +665,33 @@ void sub_8140FC4(u8 taskId) if ((gTasks[taskId].data[13] -= gUnknown_0203AB88->var19) < 0) gTasks[taskId].data[13] = 0; sub_8143514(gTasks[taskId].data[13]); - gTasks[taskId].func = &sub_8140F6C; + gTasks[taskId].func = sub_8140F6C; } void sub_8141040(u8 taskId) { sub_8140D6C(taskId); - switch (gTasks[taskId].data[0x1]) + switch (gTasks[taskId].data[1]) { case 0: - sub_81409B8(gTasks[taskId].data[0x4]); - gTasks[taskId].data[0x1]+= 1; + sub_81409B8(gTasks[taskId].data[4]); + gTasks[taskId].data[1]+= 1; break; case 30: sub_81409B8(0); - gTasks[taskId].data[0x1]+= 1; + gTasks[taskId].data[1]+= 1; break; case 59: - gTasks[taskId].data[0x1] = 0; + gTasks[taskId].data[1] = 0; break; default: - gTasks[taskId].data[0x1]++; + gTasks[taskId].data[1]++; } if (gMain.newKeys & A_BUTTON) { - if ((gUnknown_0203AB88->var08 & gUnknown_085B6154[gTasks[taskId].data[0x4]].var08)) + if ((gUnknown_0203AB88->var08 & gUnknown_085B6154[gTasks[taskId].data[4]].var08)) PlaySE(SE_BOO); else { @@ -643,19 +703,19 @@ void sub_8141040(u8 taskId) void sub_81410FC(u8 taskId) { - if (gTasks[taskId].data[0x1]-- > 0) + if (gTasks[taskId].data[1]-- > 0) { - if (gTasks[taskId].data[0x1] > 0x2) - gSpriteCoordOffsetX += 0x2; - if ((gUnknown_0203AB88->var26 += 0x4) == 0x68) - gSprites[gUnknown_0203AB88->var3C[0x19]].callback = &SpriteCallbackDummy; + if (gTasks[taskId].data[1] > 2) + gSpriteCoordOffsetX += 2; + if ((gUnknown_0203AB88->var26 += 4) == 104) + gSprites[gUnknown_0203AB88->var3C[25]].callback = &SpriteCallbackDummy; } else { - sub_8142E70(1, 0xFF); - sub_8143038(1, 0xFF); + sub_8142E70(1, -1); + sub_8143038(1, -1); gTasks[taskId].func = sub_8141344; - gTasks[taskId].data[0x1] = 0; + gTasks[taskId].data[1] = 0; } } @@ -1051,3 +1111,1076 @@ _08141558:\n\ .4byte sub_814155C"); } #endif // NONMATCHING + +void sub_814155C(u8 taskId) +{ + u8 index; + gUnknown_0203AB88->var03_7 = 1; + index = gUnknown_0203AB88->var3C[gUnknown_0203AB88->var7C]; + gUnknown_0203AB88->var38 = &gSprites[index]; + gUnknown_0203AB88->var38->callback = sub_81446AC; + gTasks[taskId].data[6]++; + gTasks[taskId].data[0x8]++; + sub_814372C(6 - gTasks[taskId].data[6]); + m4aSongNumStart(SE_TAMAKORO); + gTasks[taskId].func = sub_81415D4; +} + +void sub_81415D4(u8 taskId) +{ + if (gUnknown_0203AB88->var7D) + { + if (gUnknown_0203AB88->var03_5) + { + if (gUnknown_0203AB88->var03_6) + { + gUnknown_0203AB88->var03_6 = FALSE; + gUnknown_0203AB88->var03_5 = FALSE; + } + } + else + { + if (!gTasks[taskId].data[1]) + { + bool8 temp = sub_81421E8(sub_81420D0(taskId, gUnknown_0203AB88->var7E), gUnknown_0203AB88->var1B[gUnknown_0203AB88->var1A_0]); + gTasks[taskId].data[5] = temp; + if (temp == TRUE) + sub_8151A48(&gUnknown_0203AB88->varB8, 0x1000); + } + if (gTasks[taskId].data[1] <= 60) + { + if (gMain.newKeys & A_BUTTON) + gTasks[taskId].data[1] = 60; + gTasks[taskId].data[1]++; + } + else + { + sub_81424FC(gUnknown_0203AB88->var1B[gUnknown_0203AB88->var1A_0]); + sub_8142E70(0, gTasks[taskId].data[12]); + sub_8143038(0, gTasks[taskId].data[6] - 1); + gTasks[taskId].data[1] = 32; + gTasks[taskId].func = sub_81416D4; + } + } + } +} + +void sub_81416D4(u8 taskId) +{ + if (gTasks[taskId].data[1]-- > 0) + { + if (gTasks[taskId].data[1] > 2) + gSpriteCoordOffsetX -= 2; + if ((gUnknown_0203AB88->var26 -= 4) == 104) + gSprites[gUnknown_0203AB88->var3C[25]].callback = sub_814390C; + } + else + { + sub_8143150(gTasks[taskId].data[12]); + if (gTasks[taskId].data[5] == 1) + gTasks[taskId].data[1] = 121; + else + gTasks[taskId].data[1] = 61; + gTasks[taskId].func = sub_8141778; + } +} + +void sub_8141778(u8 taskId) +{ + if (gTasks[taskId].data[1]-- > 1) + { + switch (gTasks[taskId].data[1] % 16) + { + case 8: + sub_8142E70(0, -1); + sub_8143038(0, -1); + break; + case 0: + sub_8142E70(0, gTasks[taskId].data[12]); + sub_8143038(0, gTasks[taskId].data[6] - 1); + break; + } + } + else + { + sub_8141F7C(taskId, sub_814189C, 30, 0); + } +} + +void sub_8141800(u8 taskId) +{ + switch (gTasks[taskId].data[0x5]) + { + case 1: + case 2: + if (IsFanfareTaskInactive()) + { + u32 wins = GetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS); + if (wins < ++gTasks[taskId].data[11]) + SetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS, gTasks[taskId].data[11]); + sub_8141F7C(taskId, sub_8141A18, 0xFFFF, 3); + } + break; + case 0: + default: + if (!IsSEPlaying()) + { + gTasks[taskId].data[11] = FALSE; + sub_8141F7C(taskId, sub_8141AC0, 0xFFFF, 3); + } + break; + } +} + +void sub_814189C(u8 taskId) +{ + switch (gTasks[taskId].data[5]) + { + case 1: + case 2: + if (gTasks[taskId].data[2] == 12) + { + PlayFanfare(MUS_ME_B_BIG); + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5BD7, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + } + else + { + PlayFanfare(MUS_ME_B_SMALL); + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5BCB, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + } + break; + case 0: + default: + m4aSongNumStart(SE_HAZURE); + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5BE0, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + break; + } + gTasks[taskId].data[1] = 0; + gTasks[taskId].func = sub_8141800; +} + +void sub_8141984(u8 taskId) +{ + s32 r0 = gTasks[taskId].data[7]; + switch (r0) + { + case 0: + gTasks[taskId].data[13]++; + m4aSongNumStart(SE_PIN); + sub_8143514(gTasks[taskId].data[13]); + if (gTasks[taskId].data[13] >= 9999) + { + gTasks[taskId].data[1] = r0; + } + else + { + gTasks[taskId].data[1]--; + gTasks[taskId].data[7]++; + } + break; + case 3: + m4aSongNumStop(SE_PIN); + gTasks[taskId].data[7] = 0; + break; + default: + gTasks[taskId].data[7]++; + break; + } + if (gTasks[taskId].data[1] == 0) + sub_8141F7C(taskId, sub_8141AC0, 0xFFFF, 3); +} + +void sub_8141A18(u8 taskId) +{ + ConvertIntToDecimalStringN(gStringVar1, (gUnknown_0203AB88->var19 * gTasks[taskId].data[2]), STR_CONV_MODE_LEFT_ALIGN, 2); + StringExpandPlaceholders(gStringVar4, gUnknown_082A5BEF); + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gStringVar4, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + gTasks[taskId].data[1] = (gUnknown_0203AB88->var19 * gTasks[taskId].data[2]); + gTasks[taskId].data[7] = 0; + gTasks[taskId].func = sub_8141984; +} + +void sub_8141AC0(u8 taskId) +{ + sub_8151A9C(&gUnknown_0203AB88->varB8, 0xFFFF); + gUnknown_0203AB88->varB8.var04[13].var00_7 = gUnknown_0203AB88->varB8.var04[14].var00_7 = gUnknown_0203AB88->varB8.var04[15].var00_7 = 0; + gSprites[gUnknown_0203AB88->var3C[7 + gUnknown_085B6154[gTasks[taskId].data[12]].var00]].invisible = TRUE; + gTasks[taskId].func = sub_8141B58; +} + +void sub_8141B58(u8 taskId) +{ + u8 i = 0; + gTasks[taskId].data[4] = i; + gUnknown_0203AB88->var1B[gUnknown_0203AB88->var1A_0] = 0; + sub_81424FC(0); + gSprites[gUnknown_0203AB88->var3C[48]].invisible = TRUE; + for (i = 0; i < 4; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 41]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[i + 41]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[i + 41]].anims)->type; + } + if (gTasks[taskId].data[13] >= gUnknown_0203AB88->var19) + { + if (gTasks[taskId].data[6] == 6) + { + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5C21, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + sub_8141F7C(taskId, dp01t_12_3_battle_menu, 0xFFFF, 3); + } + else if (gTasks[taskId].data[13] == 9999) + { + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5C61, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + sub_8141F7C(taskId, sub_8140914, 0xFFFF, 0x3); + } + else + { + gTasks[taskId].func = sub_8140914; + } + } + else + { + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5C04, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + sub_8141F7C(taskId, sub_8140994, 0x3C, 0x3); + } +} + +void dp01t_12_3_battle_menu(u8 taskId) +{ + u8 i = 0; + + gTasks[taskId].data[6] = 0; + sub_8141FF4(taskId); + sub_8142070(); + sub_8143A40(); + sub_81424FC(0); + sub_814372C(6); + + for (i = 0; i < 12; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 7]].invisible = FALSE; + } + + if (gTasks[taskId].data[13] == 9999) + { + NewMenuHelpers_DrawStdWindowFrame(gUnknown_0203AB8C, FALSE); + AddTextPrinterParameterized(gUnknown_0203AB8C, 1, gUnknown_082A5C61, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_0203AB8C, 3); + sub_8141F7C(taskId, sub_8140914, 0xFFFF, 3); + } + else + { + gTasks[taskId].func = sub_8140914; + } +} + +void sub_8141DE4(u8 taskId) +{ + sub_8151A9C(&gUnknown_0203AB88->varB8, 0xFFFF); + sub_8151678(&gUnknown_0203AB88->varB8); + SetCoins(gTasks[taskId].data[13]); + if (GetCoins() < gUnknown_0203AB88->var19) + gSpecialVar_0x8004 = TRUE; + else + gSpecialVar_0x8004 = FALSE; + sub_80EDD78(GetCoins()); + BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8141E7C; +} + +void sub_8141E7C(u8 taskId) // end roulette ? +{ + if (UpdatePaletteFade() == 0) + { + SetVBlankCallback(NULL); + gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0; + ResetVramOamAndBgCntRegs(); + ResetAllBgsCoordinates(); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + FreeAllSpritePalettes(); + ResetPaletteFade(); + ResetSpriteData(); + sub_8140418(); + gFieldCallback = sub_80AF168; + SetMainCallback2(CB2_ReturnToField); + DestroyTask(taskId); + } +} + +void sub_8141EF8(u8 taskId) +{ + if (gUnknown_0203AB88->varA8 == 0 || gMain.newKeys & gUnknown_0203AB88->varAA) + { + gTasks[taskId].func = gUnknown_0203AB88->varAC; + if (gUnknown_0203AB88->varAA > 0) + PlaySE(SE_SELECT); + gUnknown_0203AB88->varAC = NULL; + gUnknown_0203AB88->varAA = 0; + gUnknown_0203AB88->varA8 = 0; + } + if (gUnknown_0203AB88->varA8 != 0xFFFF) + gUnknown_0203AB88->varA8--; +} + +void sub_8141F7C(u8 taskId, TaskFunc r1, u16 r2, u16 r3) +{ + gUnknown_0203AB88->varB4 = gTasks[taskId].func; + if (r1 == NULL) + r1 = gUnknown_0203AB88->varB4; + gUnknown_0203AB88->varAC = r1; + gUnknown_0203AB88->varA8 = r2; + if (r2 == 0xFFFF && r3 == 0) + gUnknown_0203AB88->varAA = 0xFFFF; + else + gUnknown_0203AB88->varAA = r3; + gTasks[taskId].func = sub_8141EF8; +} + +void sub_8141FF4(u8 taskId) +{ + u8 i = 0; + gUnknown_0203AB88->var00 = i; + gUnknown_0203AB88->var03_7 = 0; + gUnknown_0203AB88->var03_5 = 0; + gUnknown_0203AB88->var03_6 = 0; + gUnknown_0203AB88->var03_0 = 0; + for (i = 0; i < 6; i++) + { + gUnknown_0203AB88->var1B[i] = 0; + } + gUnknown_0203AB88->var1A_0 = 0; + gTasks[taskId].data[1] = 0; +} + +void sub_8142070(void) +{ + u8 i; + gUnknown_0203AB88->var08 = 0; + for (i = 0; i < 6; i++) + { + gUnknown_0203AB88->var0C[i] = 0; + } + for (i = 0; i < 4; i++) + { + gUnknown_0203AB88->var12[i] = 0; + } + for (i = 0; i < 3; i++) + { + gUnknown_0203AB88->var16[i] = 0; + } + sub_8143038(1, -1); +} + +u8 sub_81420D0(u8 taskId, u8 r1) +{ + u8 i; + u8 z; + u32 t0[4]; + u32 t1[3]; + + memcpy(t0, gUnknown_085B642C, sizeof(t0)); + memcpy(t1, gUnknown_085B643C, sizeof(t1)); + + if (r1 > 11) + return 0; + + gUnknown_0203AB88->var0C[gTasks[taskId].data[6] - 1] = gUnknown_085B62E4[r1].var02; + gTasks[taskId].data[12] = gUnknown_085B62E4[r1].var02; + gUnknown_0203AB88->var08 |= gUnknown_085B62E4[r1].var04; + for (i = 0; i < 4; i++) + { + if (gUnknown_085B62E4[r1].var04 & t0[i]) + gUnknown_0203AB88->var12[i]++; + if (gUnknown_0203AB88->var12[i] > 2) + gUnknown_0203AB88->var08 |= t0[i]; + } + for (z = 0; z < 3; z++) + { + if (gUnknown_085B62E4[r1].var04 & t1[z]) + gUnknown_0203AB88->var16[z]++; + if (gUnknown_0203AB88->var16[z] > 3) + gUnknown_0203AB88->var08 |= t1[z]; + } + return gUnknown_085B62E4[r1].var02; +} + +bool8 sub_81421E8(u8 r0, u8 r1) +{ + u8 t = r0; + if (--r0 < 19) + { + switch (r1) + { + case 0: + return 3; + case 1 ... 4: + if (t == r1 + 5 || t == r1 + 10 || t == r1 + 15) + return TRUE; + break; + case 5: + case 10: + case 15: + if (t >= (r1 + 1) && t <= (r1 + 4)) + return TRUE; + break; + default: + if (t == r1) + return TRUE; + } + } + return FALSE; +} + +void sub_8142284(u8 r0) +{ + + u16 var0 = 0x0; + u8 var2; + u16 var3; + u8 i; + + switch (r0) + { + case 5: + case 10: + case 15: + for (i = (r0 + 1); i < (r0 + 5); i++) + { + if (!(gUnknown_0203AB88->var08 & gUnknown_085B6154[i].var08)) + var0 |= gUnknown_085B6154[i].var10; + } + sub_8151A48(&gUnknown_0203AB88->varB8, var0 &= 0xDFFF); + break; + default: + { + struct UnkStruct1 var1[3]; + memcpy(var1, gUnknown_085B63F0, sizeof(var1)); + if (r0 > 0 && r0 < 5) + var2 = 3; + else + var2 = 1; + var3 = r0 / 5 - 1; + switch (r0 % 5) + { + case 1: + var3 = gSprites[gUnknown_0203AB88->var3C[7]].oam.paletteNum * 16; + break; + case 2: + var3 = gSprites[gUnknown_0203AB88->var3C[8]].oam.paletteNum * 16; + break; + case 3: + var3 = gSprites[gUnknown_0203AB88->var3C[9]].oam.paletteNum * 16; + break; + case 4: + var3 = gSprites[gUnknown_0203AB88->var3C[10]].oam.paletteNum * 16; + break; + } + if (var2 == 1) + { + if (!(gUnknown_0203AB88->var08 & gUnknown_085B6154[r0].var08)) + { + var1[r0 / 5 - 1].var02 += var3; + sub_815168C(&gUnknown_0203AB88->varB8, 13, &var1[r0 / 5 - 1]); + } + else + { + break; + } + } + else + { + for (i = 0; i < 3; i++) + { + u8 var4 = i * 5 + r0 + 5; + if (!(gUnknown_0203AB88->var08 & gUnknown_085B6154[var4].var08)) + { + var1[var4 / 5 - 1].var02 += var3; + sub_815168C(&gUnknown_0203AB88->varB8, i + 13, &var1[var4 / 5 - 1]); + if (var2 == 3) + var0 = gUnknown_085B6154[var4].var10; + var2--; + } + } + if (var2 != 2) + var0 = 0; + } + sub_8151A48(&gUnknown_0203AB88->varB8, var0 |= gUnknown_085B6154[r0].var10); + break; + } + } +} + +void sub_81424FC(u8 r0) +{ + vu8 i; + vu8 z; + vu16 var1; + vu16 var2; + vu8 var0; + u8 v[5]; + u8 l; + gUnknown_0203AB88->var2A = 1; + sub_8142E70(0, 0); + sub_8152058(gUnknown_0203AB88->tilemapBuffers[2], gUnknown_0203AB88->unk_397C, 14, 7, 16, 13); + switch (r0) + { + case 0: + return; + case 1 ... 4: + l = 4; + for (i = 0; i < l; i++) + { + v[i] = i * 5 + r0; + } + break; + case 5: + case 10: + case 15: + l = 5; + for (i = 0; i < l; i++) + { + v[i] = i + r0; + } + break; + default: + l = 1; + v[0] = r0; + } + for (i = 0; i < l; i++) + { + var0 = gUnknown_085B6154[v[i]].var06; + var1 = gUnknown_085B6154[v[i]].var03; + for (z = 0; z < 3; z++) + { + var2 = (gUnknown_085B6154[v[i]].var04 + z) * 32; + gUnknown_0203AB88->tilemapBuffers[2][var1 + var2 + 0] = gUnknown_0203AB88->unk_397C[(var0 + z) * 3 + 208]; + gUnknown_0203AB88->tilemapBuffers[2][var1 + var2 + 1] = gUnknown_0203AB88->unk_397C[(var0 + z) * 3 + 209]; + gUnknown_0203AB88->tilemapBuffers[2][var1 + var2 + 2] = gUnknown_0203AB88->unk_397C[(var0 + z) * 3 + 210]; + } + } +} + +u8 sub_8142758(u8 r0) +{ + u8 var0[5]; + memcpy(var0, gUnknown_085B6448, sizeof(var0)); + + if (r0 > 19) + r0 = 0; + switch (gUnknown_085B6154[r0].var01_0) + { + case 3: + r0 = r0 / 5 - 1; + if (gUnknown_0203AB88->var16[r0] > 3) + return 0; + return var0[gUnknown_0203AB88->var16[r0] + 1]; + case 4: + r0--; + if (gUnknown_0203AB88->var12[r0] > 2) + return 0; + return var0[gUnknown_0203AB88->var12[r0] + 2]; + case 12: + if (gUnknown_0203AB88->var08 & gUnknown_085B6154[r0].var08) + return 0; + return var0[4]; + } + return 0; +} + +void sub_8142814(void) +{ + s32 x1; + s32 x2; + SetGpuReg(REG_OFFSET_BG2PA, gUnknown_0203AB88->var2C.a); + SetGpuReg(REG_OFFSET_BG2PB, gUnknown_0203AB88->var2C.b); + SetGpuReg(REG_OFFSET_BG2PC, gUnknown_0203AB88->var2C.c); + SetGpuReg(REG_OFFSET_BG2PD, gUnknown_0203AB88->var2C.d); + x1 = 0x7400 - gUnknown_0203AB88->var2C.a * (gSpriteCoordOffsetX + 116) + - gUnknown_0203AB88->var2C.b * (gSpriteCoordOffsetY + 80); + x2 = 0x5400 - gUnknown_0203AB88->var2C.c * (gSpriteCoordOffsetX + 116) + - gUnknown_0203AB88->var2C.d * (gSpriteCoordOffsetY + 80); + SetGpuReg(REG_OFFSET_BG2X_L, x1); + SetGpuReg(REG_OFFSET_BG2X_H, (x1 & 0x0fff0000) >> 16); + SetGpuReg(REG_OFFSET_BG2Y_L, x2); + SetGpuReg(REG_OFFSET_BG2Y_H, (x2 & 0x0fff0000) >> 16); +} + +void sub_81428C4(u8 r0) +{ + DisplayYesNoMenu(); + DoYesNoFuncWithChoice(r0, &gUnknown_085B6408); +} + +void sub_81428E4(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + SetMainCallback2(sub_81405CC); + DestroyTask(taskId); + } +} + +void sub_8142918(u8 taskId) +{ + sub_819746C(0, TRUE); + HideCoinsWindow(); + FreeAllWindowBuffers(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gPaletteFade.delayCounter = gPaletteFade.multipurpose2; + UpdatePaletteFade(); + gTasks[taskId].func = sub_81428E4; +} + +void sub_814297C(u8 taskId) +{ + sub_819746C(0, FALSE); + HideCoinsWindow(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +void sub_81429A0(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + gSpecialVar_0x8004 = 1; + HideCoinsWindow(); + sub_819746C(0, TRUE); + ScriptContext2_Disable(); + DestroyTask(taskId); + } +} + +void sub_81429F0(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + u32 temp = gUnknown_085B6344[(gSpecialVar_0x8004 & 1) + (gSpecialVar_0x8004 >> 7 << 1)]; + ConvertIntToDecimalStringN(gStringVar1, temp, STR_CONV_MODE_LEADING_ZEROS, 1); + StringExpandPlaceholders(gStringVar4, gUnknown_082A5B12); + NewMenuHelpers_DrawStdWindowFrame(0, FALSE); + AddTextPrinterParameterized(0, 1, gStringVar4, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(0, 3); + gTasks[taskId].func = sub_81428C4; + } +} + +void Task_Roulette_0(u8 taskId) +{ + s32 temp; + PrintCoinsString(gTasks[taskId].data[13]); + temp = gUnknown_085B6344[(gSpecialVar_0x8004 & 1) + (gSpecialVar_0x8004 >> 7 << 1)]; + ConvertIntToDecimalStringN(gStringVar1, temp, 2, 1); + if (gTasks[taskId].data[13] >= temp) + { + if ((gSpecialVar_0x8004 & 0x80) && (gSpecialVar_0x8004 & 1)) + { + NewMenuHelpers_DrawStdWindowFrame(0, FALSE); + AddTextPrinterParameterized(0, 1, gUnknown_082A5B6B, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(0, 3); + gTasks[taskId].func = sub_81429F0; + } + else + { + StringExpandPlaceholders(gStringVar4, gUnknown_082A5B12); + NewMenuHelpers_DrawStdWindowFrame(0, FALSE); + AddTextPrinterParameterized(0, 1, gStringVar4, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(0, 3); + gTasks[taskId].func = sub_81428C4; + } + } + else + { + StringExpandPlaceholders(gStringVar4, gUnknown_082A5B4E); + NewMenuHelpers_DrawStdWindowFrame(0, FALSE); + AddTextPrinterParameterized(0, 1, gStringVar4, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(0, 3); + gTasks[taskId].func = sub_81429A0; + gTasks[taskId].data[13] = 0; + gTasks[taskId].data[0] = 0; + } +} + +void PlayRoulette(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + ShowCoinsWindow(GetCoins(), 1, 1); + taskId = CreateTask(Task_Roulette_0, 0); + gTasks[taskId].data[13] = GetCoins(); +} + +void sub_8142C0C(u8 r0) +{ + if (!r0) + { + FreeAllSpritePalettes(); + LoadSpritePalettes(gUnknown_085B7384); + LoadCompressedSpriteSheet(&gUnknown_085B7864); + LoadCompressedSpriteSheet(&gUnknown_085B7978); + LoadCompressedSpriteSheet(&gUnknown_085B7A40); + } + else + { + FreeSpriteTilesByTag(14); + FreeSpriteTilesByTag(13); + FreeSpriteTilesByTag(12); + FreeAllSpritePalettes(); + } +} + +u8 sub_8142C60(const struct SpriteTemplate *r0, u8 r1, u16 *r2) +{ + u16 temp; + u8 spriteId = CreateSprite(r0, 116, 80, r0->oam->y); + gSprites[spriteId].data[0] = *r2; + gSprites[spriteId].data[1] = r1; + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].animPaused = TRUE; + gSprites[spriteId].affineAnimPaused = TRUE; + temp = *r2; + *r2 += 30; + if (*r2 >= 360) + *r2 = temp - 330; + return spriteId; +} + +void sub_8142CD0(void) +{ + u8 i, j; + u8 spriteId; + struct SpriteSheet s; + LZ77UnCompWram(gUnknown_085B7488.data, gDecompressionBuffer); + s.data = gDecompressionBuffer; + s.size = gUnknown_085B7488.size; + s.tag = gUnknown_085B7488.tag; + LoadSpriteSheet(&s); + LZ77UnCompWram(gUnknown_085B7490.data, gDecompressionBuffer); + s.data = gDecompressionBuffer; + s.size = gUnknown_085B7490.size; + s.tag = gUnknown_085B7490.tag; + LoadSpriteSheet(&s); + for (i = 0; i < 3; i++) + { + u8 o = i * 24; + for (j = 0; j < 4; j++) + { + spriteId = gUnknown_0203AB88->var3C[(i * 4) + 29 + j] = CreateSprite(&gSpriteTemplate_85B75B0[j], (j * 24) + 148, o + 92, 30); + gSprites[spriteId].animPaused = TRUE; + o += 24; + if (o >= 72) + o = 0; + } + } + for (i = 0; i < 4; i++) + { + spriteId = gUnknown_0203AB88->var3C[i + 41] = CreateSprite(&gSpriteTemplate_85B7508[i], (i * 24) + 148, 70, 30); + gSprites[spriteId].animPaused = TRUE; + } + for (i = 0; i < 3; i++) + { + spriteId = gUnknown_0203AB88->var3C[i + 45] = CreateSprite(&gSpriteTemplate_85B7568[i], 126, (i * 24) + 92, 30); + gSprites[spriteId].animPaused = TRUE; + } +} + +void unref_sub_8142E3C(void) +{ + u8 i; + for (i = 0; i < 12; i++) + { + DestroySprite(&gSprites[gUnknown_0203AB88->var3C[i + 29]]); + } +} + +void sub_8142E70(u8 r0, u8 r1) +{ + u8 i; + switch (r0) + { + case 1: + for (i = 0; i < 19; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 29]].invisible = TRUE; + } + break; + case 0: + for (i = 0; i < 12; i++) + { + if (!(gUnknown_0203AB88->var08 & gUnknown_085B62E4[i].var04)) + gSprites[gUnknown_0203AB88->var3C[i + 29]].invisible = FALSE; + else if (gUnknown_085B62E4[i].var02 != r1) + gSprites[gUnknown_0203AB88->var3C[i + 29]].invisible = TRUE; + else + gSprites[gUnknown_0203AB88->var3C[i + 29]].invisible = FALSE; + } + for (; i < 19; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 29]].invisible = FALSE; + } + break; + } +} + +void sub_8142F7C(void) +{ + u8 i; + for (i = 0; i < 6; i++) + { + gUnknown_0203AB88->var3C[i + 49] = CreateSprite(&gSpriteTemplate_85B7928, 116, 20, 10); + gSprites[gUnknown_0203AB88->var3C[i + 49]].invisible = TRUE; + gSprites[gUnknown_0203AB88->var3C[i + 49]].data[0] = 1; + gSprites[gUnknown_0203AB88->var3C[i + 49]].callback = sub_814390C; + gSprites[gUnknown_0203AB88->var3C[i + 49]].oam.priority = 1; + StartSpriteAnim(&gSprites[gUnknown_0203AB88->var3C[i + 49]], 8); + } +} + +void sub_8143038(u8 r0, u8 r1) +{ + u8 i = 0; + if (r0) + { + for ( ; i < 6; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 49]].invisible = TRUE; + } + } + else + { + for ( ; i < 6; i++) + { + if (!gUnknown_0203AB88->var0C[i] || i == r1) + { + gSprites[gUnknown_0203AB88->var3C[i + 49]].invisible = TRUE; + } + else + { + gSprites[gUnknown_0203AB88->var3C[i + 49]].invisible = FALSE; + gSprites[gUnknown_0203AB88->var3C[i + 49]].pos1.x = (gUnknown_085B6154[gUnknown_0203AB88->var0C[i]].var03 + 1) * 8 + 4; + gSprites[gUnknown_0203AB88->var3C[i + 49]].pos1.y = (gUnknown_085B6154[gUnknown_0203AB88->var0C[i]].var04 + 1) * 8 + 3; + } + } + } +} + +void sub_8143150(u8 r0) +{ + if (!r0) + { + gSprites[gUnknown_0203AB88->var3C[48]].invisible = TRUE; + } + else + { + gSprites[gUnknown_0203AB88->var3C[48]].invisible = FALSE; + gSprites[gUnknown_0203AB88->var3C[48]].pos1.x = (gUnknown_085B6154[r0].var03 + 2) * 8; + gSprites[gUnknown_0203AB88->var3C[48]].pos1.y = (gUnknown_085B6154[r0].var04 + 2) * 8; + } +} + +void sub_81431E4(void) +{ + u8 i, j; + u16 k; + struct SpriteSheet s; + + LZ77UnCompWram(gUnknown_085B741C.data, gDecompressionBuffer); + s.data = gDecompressionBuffer; + s.size = gUnknown_085B741C.size; + s.tag = gUnknown_085B741C.tag; + LoadSpriteSheet(&s); + + k = 15; + for (i = 0; i < 3; i++) + { + for (j = 0; j < 4; j++) + { + u8 spriteId; + spriteId = gUnknown_0203AB88->var3C[(i * 4) + 7 + j] = sub_8142C60(&gSpriteTemplate_85B7610[i * 4 + j], 40, &k); + gSprites[spriteId].animPaused = TRUE; + gSprites[spriteId].affineAnimPaused = TRUE; + } + } +} + +void sub_8143280(struct Sprite *sprite) +{ + s16 cos; + s16 sin; + u32 matrixNum; + s16 angle = gUnknown_0203AB88->var24 + sprite->data[0]; + if (angle >= 360) + angle -= 360; + sin = Sin2(angle); + cos = Cos2(angle); + sprite->pos2.x = sin * sprite->data[1] >> 12; + sprite->pos2.y = -cos * sprite->data[1] >> 12; + matrixNum = sprite->oam.matrixNum; + sin /= 16; + gOamMatrices[matrixNum].d = cos /= 16; + gOamMatrices[matrixNum].a = cos; + gOamMatrices[matrixNum].b = sin; + gOamMatrices[matrixNum].c = -sin; +} + +void sub_8143314(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + struct SpriteSheet s; + LZ77UnCompWram(gUnknown_085B7750[i].data, gDecompressionBuffer); + s.data = gDecompressionBuffer; + s.size = gUnknown_085B7750[i].size; + s.tag = gUnknown_085B7750[i].tag; + LoadSpriteSheet(&s); + } + gUnknown_0203AB88->var3C[20] = CreateSprite(&gSpriteTemplate_85B77E4, 208, 16, 4); + gSprites[gUnknown_0203AB88->var3C[20]].animPaused = TRUE; + for (i = 0; i < 4; i++) + { + gUnknown_0203AB88->var3C[i + 21] = CreateSprite(&gUnknown_085B77FC, i * 8 + 196, 24, 0); + gSprites[gUnknown_0203AB88->var3C[i + 21]].invisible = TRUE; + gSprites[gUnknown_0203AB88->var3C[i + 21]].animPaused = TRUE; + } + gUnknown_0203AB88->var3C[25] = CreateSprite(&gUnknown_085B7814, 120, 68, 4); + gSprites[gUnknown_0203AB88->var3C[25]].animPaused = TRUE; + for (i = 0; i < 3; i++) + { + gUnknown_0203AB88->var3C[i + 26] = CreateSprite(&gUnknown_085B782C, i * 16 + 192, 36, 4); + gSprites[gUnknown_0203AB88->var3C[i + 26]].invisible = TRUE; + gSprites[gUnknown_0203AB88->var3C[i + 26]].animPaused = TRUE; + } + gUnknown_0203AB88->var3C[48] = CreateSprite(&gUnknown_085B7844, 152, 96, 9); + gSprites[gUnknown_0203AB88->var3C[48]].oam.priority = 1; + gSprites[gUnknown_0203AB88->var3C[48]].animPaused = TRUE; + gSprites[gUnknown_0203AB88->var3C[48]].invisible = TRUE; +} + +void sub_8143514(u16 r0) +{ + u8 i; + u16 d = 1000; + bool8 v = FALSE; + for (i = 0; i < 4; i++) + { + u8 t = r0 / d; + gSprites[gUnknown_0203AB88->var3C[i + 21]].invisible = TRUE; + if (t > 0 || v || i == 3) + { + gSprites[gUnknown_0203AB88->var3C[i + 21]].invisible = FALSE; + gSprites[gUnknown_0203AB88->var3C[i + 21]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[i + 21]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[i + 21]].anims + t)->type; + v = TRUE; + } + r0 = r0 % d; + d = d / 10; + } +} + +u8 sub_8143614(u8 r0) +{ + u8 t[5]; + memcpy(t, gUnknown_085B7B04, sizeof(t)); + + if (r0 >= 20) + r0 = 0; + switch (gUnknown_085B6154[r0].var01_0) + { + case 3: + r0 = r0 / 5 - 1; + if (gUnknown_0203AB88->var16[r0] > 3) + return 0; + return t[gUnknown_0203AB88->var16[r0] + 1]; + case 4: + r0--; + if (gUnknown_0203AB88->var12[r0] > 2) + return 0; + return t[gUnknown_0203AB88->var12[r0] + 2]; + case 12: + if (gUnknown_0203AB88->var08 & gUnknown_085B6154[r0].var08) + return 0; + return t[4]; + } + return 0; +} + +void sub_81436D0(u8 r0) +{ + struct Sprite *s = &gSprites[gUnknown_0203AB88->var3C[25]]; + s->animCmdIndex = sub_8143614(r0); + s->oam.tileNum = s->sheetTileStart + (*s->anims + s->animCmdIndex)->type; +} + +void sub_814372C(u8 r0) +{ + u8 i; + u8 t = 0; + if (gUnknown_0203AB88->var19 == 1) + t = 2; + switch (r0) + { + case 6: + for (i = 0; i < 3; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 26]].invisible = FALSE; + gSprites[gUnknown_0203AB88->var3C[i + 26]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[i + 26]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[i + 26]].anims)->type; + } + break; + case 5: + gSprites[gUnknown_0203AB88->var3C[28]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[28]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[28]].anims + t + 1)->type; + break; + case 4: + gSprites[gUnknown_0203AB88->var3C[28]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[28]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[28]].anims + t + 2)->type; + break; + case 3: + gSprites[gUnknown_0203AB88->var3C[27]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[27]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[27]].anims + t + 1)->type; + break; + case 2: + gSprites[gUnknown_0203AB88->var3C[27]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[27]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[27]].anims + t + 2)->type; + break; + case 1: + gSprites[gUnknown_0203AB88->var3C[26]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[26]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[26]].anims + t + 1)->type; + break; + case 0: + default: + for (i = 0; i < 3; i++) + { + gSprites[gUnknown_0203AB88->var3C[i + 26]].oam.tileNum = + gSprites[gUnknown_0203AB88->var3C[i + 26]].sheetTileStart + + (*gSprites[gUnknown_0203AB88->var3C[i + 26]].anims + t + 2)->type; + } + } +} |