Files
pokeruby/src/roulette.c
T
2020-08-29 01:47:36 -04:00

1798 lines
47 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "global.h"
#include "random.h"
#include "graphics.h"
#include "ewram.h"
#include "field_fadetransition.h"
#include "constants/game_stat.h"
#include "m4a.h"
#include "main.h"
#include "menu.h"
#include "menu_cursor.h"
#include "menu_helpers.h"
#include "overworld.h"
#include "palette.h"
#include "pokemon.h"
#include "roulette.h"
#include "roulette_util.h"
#include "rtc.h"
#include "constants/songs.h"
#include "sound.h"
#include "script.h"
#include "constants/species.h"
#include "sprite.h"
#include "strings2.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "trig.h"
#include "scanline_effect.h"
asm(".include \"constants/gba_constants.inc\"");
#if DEBUG
void *gUnknown_Debug_03005FB8;
#endif
void sub_81150FC(void);
void sub_8115124(void);
void sub_8115238(void);
void sub_8115384(void);
void sub_8115634(u8);
void sub_81156BC(u8);
void sub_8115734(u8);
void sub_811577C(u8);
void sub_81157AC(u8);
void sub_81157D0(u8);
void sub_8115928(u8, u8);
void sub_811597C(u8);
void sub_81159BC(u8);
u8 sub_8115A94(s16 *, u8);
void sub_8115B58(u8);
void sub_8115DA0(u8);
void sub_8115E14(u8);
void sub_8115ECC(u8);
u8 sub_8115F58(u16, u16);
void sub_8116100(u8);
void sub_8116308(u8);
void sub_811637C(u8);
void sub_8116474(u8);
void sub_8116514(u8);
void sub_811659C(u8);
void sub_8116638(u8);
void sub_81166E8(u8);
void sub_811677C(u8);
void sub_81167F4(u8);
void sub_8116880(u8);
void dp01t_12_3_battle_menu(u8);
void sub_8116AB0(u8);
void sub_8116B40(u8);
void sub_8116BC0(u8);
void sub_8116C34(u8, TaskFunc, u16, u16);
void sub_8116CAC(u8);
void sub_8116CF8(void);
u8 sub_8116D54(u8, u8);
u8 sub_8116E5C(u8, u8);
void sub_8116EF8(u8);
void sub_8117158(u8);
u8 sub_8117380(u8);
void sub_8117434(void);
void sub_81174F8(u8);
void sub_8117528(u8);
void sub_811755C(u8);
void sub_81175C0(u8);
void sub_81175DC(u8);
void sub_8117630(u8);
void Task_Roulette_0(u8);
const u16 gUnknown_083F86BC[] = INCBIN_U16("graphics/roulette/83F86BC.gbapal");
const u8 gUnknown_083F88BC[] = INCBIN_U8("graphics/roulette/83F88BC.bin.lz");
const u8 gUnknown_083F8A60[] = INCBIN_U8("graphics/roulette/wheel_map.bin.lz");
const struct StructgUnknown_083F8C00 gUnknown_083F8C00[] = {
{255, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0},
{12, 4, 1, 0, 17, 7, 0, 0, 0, 2, 0x10842, 0xe000, 0},
{13, 4, 2, 0, 20, 7, 0, 0, 0, 4, 0x21084, 0xe000, 0},
{14, 4, 3, 0, 23, 7, 0, 0, 0, 8, 0x42108, 0xe000, 0},
{15, 4, 4, 0, 26, 7, 0, 0, 0, 16, 0x84210, 0xe000, 0},
{16, 3, 0, 1, 14, 10, 0, 12, 0, 32, 0x3e0, 0x249, 0},
{0, 12, 1, 1, 17, 10, 3, 3, 0, 64, 64, 0x2001, 0},
{9, 12, 2, 1, 20, 10, 3, 3, 0, 128, 128, 0x2200, 0},
{6, 12, 3, 1, 23, 10, 3, 3, 0, 0x100, 0x100, 0x2040, 0},
{3, 12, 4, 1, 26, 10, 3, 3, 0, 0x200, 0x200, 0x2008, 0},
{17, 3, 0, 2, 14, 13, 3, 15, 0, 0x400, 0x7c00, 0x492, 0},
{4, 12, 1, 2, 17, 13, 6, 6, 0, 0x800, 0x800, 0x2010, 0},
{1, 12, 2, 2, 20, 13, 6, 6, 0, 0x1000, 0x1000, 0x2002, 0},
{10, 12, 3, 2, 23, 13, 6, 6, 0, 0x2000, 0x2000, 0x2400, 0},
{7, 12, 4, 2, 26, 13, 6, 6, 0, 0x4000, 0x4000, 0x2080, 0},
{18, 3, 0, 3, 14, 16, 6, 18, 0, 0x8000, 0xf8000, 0x924, 0},
{8, 12, 1, 3, 17, 16, 9, 9, 0, 0x10000, 0x10000, 0x2100, 0},
{5, 12, 2, 3, 20, 16, 9, 9, 0, 0x20000, 0x20000, 0x2020, 0},
{2, 12, 3, 3, 23, 16, 9, 9, 0, 0x40000, 0x40000, 0x2004, 0},
{11, 12, 4, 3, 26, 16, 9, 9, 0, 0x80000, 0x80000, 0x2800, 0},
};
const struct StructgUnknown_083F8D90 gUnknown_083F8D90[] = {
{ 0, 1, 6, 64},
{ 1, 3, 12, 0x1000},
{ 2, 5, 18, 0x40000},
{ 3, 7, 9, 0x200},
{ 4, 9, 11, 0x800},
{ 5, 11, 17, 0x20000},
{ 6, 13, 8, 0x100},
{ 7, 15, 14, 0x4000},
{ 8, 17, 16, 0x10000},
{ 9, 19, 7, 128},
{10, 21, 13, 0x2000},
{11, 23, 19, 0x80000}
};
const u8 gUnknown_083F8DF0[] = {
1, 3,
1, 6,
};
const struct StructgUnknown_083F8DF4 gUnknown_083F8DF4[] = {
{
.var00 = 1,
.var01 = 60,
.var02 = 30,
.var03 = 1,
.var04 = 1,
.var08 = 45,
.var0A = 30,
.var0C = 1,
.var10 = 75,
.var12 = 27,
.var14 = 24,
.var18 = 10,
.var1A = 360,
.var1C = -0.5f
}, {
.var00 = 3,
.var01 = 30,
.var02 = 15,
.var03 = 1,
.var04 = 0,
.var08 = 75,
.var0A = 60,
.var0C = 2,
.var10 = 0,
.var12 = 54,
.var14 = 48,
.var18 = 10,
.var1A = 270,
.var1C = -1.0f
}
};
const struct UnkStruct1 gUnknown_083F8E34[] = {
{
.var00 = 0x8000,
.var02 = 5,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 10,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 21,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 85,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 90,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 101,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 117,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 122,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 133,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 149,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 154,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x8000,
.var02 = 165,
.var04 = 1,
.var05 = 1,
.var06 = 255,
.var07_0 = 8,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x77d6,
.var02 = 40,
.var04 = 2,
.var05 = 10,
.var06 = 255,
.var07_0 = 14,
.var07_5 = 2,
.var07_7 = FALSE
}
};
const struct UnkStruct1 gUnknown_083F8E9C[] = {
{
.var00 = 0x53ff,
.var02 = 0x101,
.var04 = 5,
.var05 = 30,
.var06 = 255,
.var07_0 = 14,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x7ffb,
.var02 = 0x106,
.var04 = 5,
.var05 = 30,
.var06 = 255,
.var07_0 = 14,
.var07_5 = 2,
.var07_7 = FALSE
}, {
.var00 = 0x7f7f,
.var02 = 0x10b,
.var04 = 5,
.var05 = 30,
.var06 = 255,
.var07_0 = 14,
.var07_5 = 2,
.var07_7 = FALSE
}
};
const struct YesNoFuncTable gUnknown_083F8EB4 = {
sub_811755C,
sub_81175C0
};
const struct YesNoFuncTable gUnknown_083F8EBC = {
sub_811577C,
sub_81157AC
};
extern u8 gUnknown_02019000[];
extern u16 gSpecialVar_0x8004;
extern u16 gPlttBufferFaded[];
extern u16 gPlttBufferUnfaded[];
extern const u8 gUnknown_081C4157[];
extern const u8 gUnknown_081C41E3;
extern const u16 gUnknown_083F8ECE;
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 u32 gUnknown_083F8ED8[];
extern const u32 gUnknown_083F8EE8[];
extern const u8 gUnknown_083F8EF4[];
extern const u8 gUnknown_081C40DF;
extern const u8 gUnknown_081C4139;
extern const u8 gUnknown_081C411C;
#if DEBUG
EWRAM_DATA u8 unk_203955C[4] = { 0 };
EWRAM_DATA u8 unk_2039560 = 0;
#endif
void sub_81150FC(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
if (eRoulette->varB8.var00)
task_tutorial_controls_fadein(&eRoulette->varB8);
}
void sub_8115124(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_8117434();
REG_BG1HOFS = 0x200 - eRoulette->var26;
if (eRoulette->var01)
REG_BLDALPHA = eRoulette->var34;
if (eRoulette->var2A != 0)
{
DmaCopy16(3, &gBGTilemapBuffers[1][224], (void *)(VRAM + 0x21c0), 0x340);
eRoulette->var2A = 0;
}
switch (eRoulette->var28)
{
case 1:
REG_BG0CNT = (32 * 248);
DmaCopy16(3, &gBGTilemapBuffers[2][224], (void *)(VRAM + 0xf9c0), 0x340);
eRoulette->var28 = 2;
break;
case 2:
DmaCopy16(3, &gBGTilemapBuffers[2][224], (void *)(VRAM + 0xf9c0), 0x340);
break;
case 255:
REG_BG0CNT = 0x1f08;
DmaFill16(3, 0, (void *)(VRAM + 0xf9c0), 0x340);
eRoulette->var28 = 0;
case 0:
break;
}
}
void sub_8115238(void)
{
u8 i;
u32 temp;
const struct StructgUnknown_083F8DF4 *s0;
u16 arr[] = {RGB(24, 4, 10), RGB(10, 19, 6), RGB(24, 4, 10)};
memset(eRoulette, 0, sizeof(*eRoulette));
eRoulette->var04_0 = (gSpecialVar_0x8004 & 1);
if (gSpecialVar_0x8004 & 0x80)
eRoulette->var04_7 = 1;
s0 = gUnknown_083F8DF4;
eRoulette->var22 = s0[eRoulette->var04_0].var03;
eRoulette->var23 = s0[eRoulette->var04_0].var04;
eRoulette->var19 = temp = gUnknown_083F8DF0[eRoulette->var04_0 + eRoulette->var04_7 * 2];
eRoulette->var1A_4 = 1;
if (temp == 1)
gPlttBufferUnfaded[0] = gPlttBufferUnfaded[81] = gPlttBufferFaded[0] = gPlttBufferFaded[81] = arr[0];
else
gPlttBufferUnfaded[0] = gPlttBufferUnfaded[81] = gPlttBufferFaded[0] = gPlttBufferFaded[81] = arr[1];
sub_8124918((&eRoulette->varB8));
for (i = 0; i < 13; i++)
sub_812492C((&eRoulette->varB8), i, &gUnknown_083F8E34[i]);
for (i = 0; i < 6; i++)
{
switch (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2))
{
case SPECIES_SHROOMISH:
eRoulette->var02 |= 1;
break;
case SPECIES_TAILLOW:
eRoulette->var02 |= 2;
break;
}
}
RtcCalcLocalTime();
}
void sub_8115384(void)
{
u32 temp_IME;
u8 taskid;
#if DEBUG
gUnknown_Debug_03005FB8 = eRoulette;
#endif
switch (gMain.state)
{
case 0:
SetVBlankCallback(NULL);
ScanlineEffect_Stop();
ClearVideoCallbacks();
sub_80F9368();
REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(6) | BGCNT_TXT512x256;
REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(4) | BGCNT_TXT512x256;
REG_BLDCNT = BLDCNT_EFFECT_NONE | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BD;
REG_BLDALPHA = BLDALPHA_BLEND(10, 6);
LZ77UnCompVram(gUnknown_08E8096C, (void *)VRAM);
LZ77UnCompVram(gRouletteWheelTiles, (void *)(VRAM + 0x4000));
gMain.state++;
break;
case 1:
ResetPaletteFade();
ResetSpriteData();
ResetTasks();
gMain.state++;
break;
case 2:
Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
InitMenuWindow(&gMenuTextWindowTemplate);
LoadPalette(gUnknown_083F86BC, 0, 0x1c0);
gMain.state++;
break;
case 3:
sub_8115238();
ClearBGTilemapBuffers();
LZ77UnCompWram(gUnknown_083F88BC, (void *)(ewram18800));
LZ77UnCompVram(gUnknown_083F8A60, (void *)(VRAM + 0x3000));
gMain.state++;
break;
case 4:
sub_8117838(0);
sub_811857C();
sub_81184D8();
sub_8117F2C();
sub_8117900();
sub_8117BBC();
sub_8117DF4();
gMain.state++;
break;
case 5:
AnimateSprites();
BuildOamBuffer();
sub_81180F4(gSaveBlock1.coins);
sub_81182F8(6);
sub_811829C(0);
sub_8117158(0);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(gUnknown_081C4157, 1, 15);
gSpriteCoordOffsetX = -60;
gSpriteCoordOffsetY = 0;
gMain.state++;
break;
case 6:
REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
gMain.state++;
break;
case 7:
temp_IME = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
REG_IME = temp_IME;
REG_DISPSTAT |= 8;
SetVBlankCallback(sub_8115124);
BeginHardwarePaletteFade(255, 0, 16, 0 , 1);
taskid = eRoulette->varA4 = CreateTask(sub_81156BC, 0);
gTasks[taskid].data[6] = 6;
gTasks[taskid].data[13] = gSaveBlock1.coins;
eRoulette->varA5 = CreateTask(sub_8115634, 1);
SetMainCallback2(sub_81150FC);
break;
}
}
void sub_8115634(u8 taskId)
{
s16 sin;
s16 cos;
s32 cos32;
if (eRoulette->var21++ == eRoulette->var23)
{
eRoulette->var21 = 0;
if ((eRoulette->var24 -= eRoulette->var22) < 0)
eRoulette->var24 = 360 - eRoulette->var22;
}
sin = Sin2(eRoulette->var24);
cos = Cos2(eRoulette->var24);
sin = sin / 16;
cos32 = cos / 16;
eRoulette->var2C.d = cos32;
eRoulette->var2C.a = cos32;
eRoulette->var2C.b = sin;
eRoulette->var2C.c = -sin;
#if DEBUG
if (unk_203955C[0] != 0 && (gMain.newKeys & START_BUTTON))
{
gTasks[eRoulette->varA4].func = sub_81157AC;
m4aMPlayStop(&gMPlayInfo_SE1);
m4aMPlayStop(&gMPlayInfo_SE2);
m4aMPlayStop(&gMPlayInfo_SE3);
}
#endif
}
void sub_81156BC(u8 taskid)
{
if (UpdatePaletteFade() == 0)
{
REG_BLDCNT |= BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BD;
REG_BLDALPHA = BLDALPHA_BLEND(8, 8);
gTasks[taskid].data[6] = 0;
sub_8116CAC(taskid);
sub_8116CF8();
sub_81185E8();
sub_8117158(0);
sub_81182F8(6);
sub_8116C34(taskid, sub_81159BC, 0xffff, 3);
}
}
void sub_8115734(u8 taskid)
{
DisplayYesNoMenu(20, 8, 1);
sub_814AAF8(RGB(30, 12, 11));
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C41E3, 1, 15);
DoYesNoFuncWithChoice(taskid, &gUnknown_083F8EBC);
}
void sub_811577C(u8 taskid)
{
Menu_EraseWindowRect(20, 8, 26, 13);
gTasks[taskid].func = sub_81159BC;
}
void sub_81157AC(u8 taskid)
{
DestroyTask(eRoulette->varA5);
sub_8116AB0(taskid);
}
void sub_81157D0(u8 r0)
{
u8 temp0, temp1;
switch (r0)
{
case 0:
sub_8124DDC(&gBGTilemapBuffers[2][0], 0, 14, 7, 16, 13);
break;
case 1:
case 2:
case 3:
case 4:
temp0 = (r0 * 3 + 14);
sub_8124DDC(&gBGTilemapBuffers[2][0], 0, 14, 7, 16, 13);
sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a32, temp0, 7, 3, 13);
break;
case 5:
case 10:
case 15:
temp1 = ((r0 - 1) / 5 * 3 + 10);
sub_8124DDC(&gBGTilemapBuffers[2][0], 0, 14, 7, 16, 13);
sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a80, 14, temp1, 16, 3);
break;
default:
temp0 = ((r0 % 5) * 3 + 14);
temp1 = ((r0 - 1) / 5 * 3 + 7);
sub_8124DDC(&gBGTilemapBuffers[2][0], 0, 14, 7, 16, 13);
sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a20, temp0, temp1, 3, 3);
break;
}
}
void sub_8115928(u8 taskid, u8 r1)
{
if (!r1)
sub_811829C(gTasks[taskid].data[4]);
else
sub_811829C(eRoulette->var1B[eRoulette->var1A_0]);
sub_81157D0(gTasks[taskid].data[4]);
}
void sub_811597C(u8 taskid)
{
eRoulette->var28 = 1;
sub_81157D0(gTasks[taskid].data[4]);
eRoulette->var23 = 2;
eRoulette->var21 = 0;
gTasks[taskid].func = sub_8115E14;
}
void sub_81159BC(u8 taskid)
{
s16 i;
if (eRoulette->var08 & 0x20)
{
for (i = 11; (i < 14); i++)
if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0)
break;
}
else
{
for (i = 6; (i < 10); i++)
if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0)
break;
}
gTasks[taskid].data[4] = i;
sub_8116CAC(taskid);
sub_8117158(gTasks[taskid].data[4]);
sub_811829C(gTasks[taskid].data[4]);
sub_8116EF8(gTasks[taskid].data[4]);
gTasks[taskid].data[1] = 0;
gTasks[taskid].func = sub_811597C;
}
u8 sub_8115A94(s16 *r0, u8 r1)
{
s8 temp1 = 0;
s8 temp = 0;
s8 arr[4] = {-5, 5, -1, 1};
s8 t;
t = (u8)*r0;
switch (r1)
{
case 0:
case 1:
temp1 = (*r0 % 5);
temp = temp1 + 15;
if (temp1 == 0)
temp1 = 5;
break;
case 2:
case 3:
temp1 = (s16)(*r0 / 5) * 5;
temp = temp1 + 4;
if (temp1 == 0)
temp1 = 1;
break;
}
*r0 += arr[r1];
if (*r0 < temp1)
*r0 = temp;
if (*r0 > temp)
*r0 = temp1;
if (*r0 != t)
return TRUE;
return FALSE;
}
void sub_8115B58(u8 r0)
{
u8 z = 0;
bool8 var0 = FALSE;
if (gMain.newKeys & DPAD_UP)
{
var0 = TRUE;
if (!sub_8115A94(&gTasks[r0].data[4], 0))
return;
}
if (gMain.newKeys & DPAD_DOWN)
{
var0 = TRUE;
if (!sub_8115A94(&gTasks[r0].data[4], 1))
return;
}
if (gMain.newKeys & DPAD_LEFT)
{
var0 = TRUE;
if (!sub_8115A94(&gTasks[r0].data[4], 2))
return;
}
if (gMain.newKeys & DPAD_RIGHT)
{
var0 = TRUE;
if (!sub_8115A94(&gTasks[r0].data[4], 3))
return;
}
if (var0)
{
u8 i;
sub_8117158(gTasks[r0].data[4]);
sub_8115928(r0, FALSE);
gTasks[r0].data[1] = z;
PlaySE(SE_SELECT);
sub_8124D3C((&eRoulette->varB8), 0xffff);
eRoulette->varB8.var04[15].var00_7 = 0;
eRoulette->varB8.var04[14].var00_7 = 0;
eRoulette->varB8.var04[13].var00_7 = 0;
sub_8116EF8(gTasks[r0].data[4]);
for (i = 0; i < 4; i++)
{
gSprites[eRoulette->var3C[i + 41]].oam.tileNum =
gSprites[eRoulette->var3C[i + 41]].sheetTileStart
+ (*gSprites[eRoulette->var3C[i + 41]].anims)->type;
}
if ((u16)(gTasks[r0].data[4] - 1) < 4 && !(eRoulette->var08 & gUnknown_083F8C00[gTasks[r0].data[4]].var08) )
{
z = gTasks[r0].data[4] - 1;
gSprites[eRoulette->var3C[z + 41]].oam.tileNum =
gSprites[eRoulette->var3C[z + 41]].sheetTileStart
+ (*gSprites[eRoulette->var3C[z + 41]].anims + 1)->type;
}
}
}
void sub_8115D58(u8 r0)
{
eRoulette->var28 = 255;
if (eRoulette->var19 == 1)
eRoulette->var23 = 1;
else
eRoulette->var23 = 0;
eRoulette->var21 = 0;
gTasks[r0].data[1] = 32;
gTasks[r0].func = sub_8115ECC;
}
void sub_8115DA0(u8 taskid)
{
eRoulette->var1B[eRoulette->var1A_0] = gTasks[taskid].data[4];
gTasks[taskid].data[2] = sub_8117380(eRoulette->var1B[eRoulette->var1A_0]);
sub_811829C(eRoulette->var1B[eRoulette->var1A_0]);
if ((gTasks[taskid].data[13] -= eRoulette->var19) < 0)
gTasks[taskid].data[13] = 0;
sub_81180F4(gTasks[taskid].data[13]);
gTasks[taskid].func = sub_8115D58;
}
void sub_8115E14(u8 taskid)
{
sub_8115B58(taskid);
switch (gTasks[taskid].data[1])
{
case 0:
sub_81157D0(gTasks[taskid].data[4]);
gTasks[taskid].data[1]+= 1;
break;
case 30:
sub_81157D0(0);
gTasks[taskid].data[1]+= 1;
break;
case 59:
gTasks[taskid].data[1] = 0;
break;
default:
gTasks[taskid].data[1]++;
}
if (gMain.newKeys & A_BUTTON)
{
if ((eRoulette->var08 & gUnknown_083F8C00[gTasks[taskid].data[4]].var08))
PlaySE(SE_BOO);
else
{
m4aSongNumStart(SE_SHOP);
gTasks[taskid].func = sub_8115DA0;
}
}
}
void sub_8115ECC(u8 taskid)
{
if (gTasks[taskid].data[1]-- > 0)
{
if (gTasks[taskid].data[1] > 2)
gSpriteCoordOffsetX += 2;
if ((eRoulette->var26 += 4) == 104)
gSprites[eRoulette->var3C[25]].callback = &SpriteCallbackDummy;
}
else
{
sub_8117AA8(1, 255);
sub_8117C60(1, 255);
gTasks[taskid].func = sub_8116100;
gTasks[taskid].data[1] = 0;
}
}
u8 sub_8115F58(u16 r0, u16 r1)
{
u8 timeh;
switch (eRoulette->var02)
{
case 1: // SHROOMISH
case 2: // TAILLOW
// one of the two is in party
timeh = gLocalTime.hours - 4;
if (!(timeh > 5))
{
if (!(r0 < 12 || (r1 & 1)))
return 1;
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 2;
}
}
else if (!(r1 & 3))
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 2;
}
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02;
}
break;
case 3:
// both are in party
timeh = gLocalTime.hours - 4;
if (!(timeh > 6))
{
if (r0 < 6 || (r1 & 1))
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 2;
}
else
{
return 1;
}
}
else if ((r1 & 1) && !(r0 < 7))
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 4;
}
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 2;
}
break;
case 0:
default:
// neither is in party
timeh = gLocalTime.hours - 4;
if (!(timeh > 5))
{
if (!(r1 & 3))
{
return 1;
}
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 2;
}
}
else if (!(r1 & 3))
{
if (!(r0 < 13))
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02 / 2;
}
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02;
}
}
else if (r1 & (128 << 8))
{
if (!(r0 < 13))
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var02;
}
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var01;
}
}
else
{
const struct StructgUnknown_083F8DF4 *p = gUnknown_083F8DF4;
return p[eRoulette->var04_0].var01 * 2;
}
}
}
void sub_8116100(u8 taskid)
{
u8 randf;
s8 randfinal;
s8 r5;
u16 g = 0;
u16 rand;
u16 randmod;
u16 angles[] = {0, 180, 90, 270};
rand = Random();
randmod = rand % 100;
eRoulette->var7C = gTasks[taskid].data[6];
eRoulette->var7F = g;
eRoulette->var7E = g;
eRoulette->var7D = g;
randf = sub_8115F58(gTasks[taskid].data[8], rand);
randfinal = (rand % randf) - (randf / 2);
if (gLocalTime.hours < 13)
r5 = 0;
else
r5 = 1;
if (randmod < 80)
r5 *= 2;
else
r5 = (1 - r5) * 2;
eRoulette->var80 = g = gUnknown_083F8DF4[eRoulette->var04_0].var1A + randfinal;
//
g = S16TOPOSFLOAT(g) / 5.0f;
eRoulette->var82 = g * 3;
eRoulette->var84 = g;
eRoulette->var86 = g;
//
eRoulette->var88 = S16TOPOSFLOAT(angles[(rand & 1) + r5]);
eRoulette->var8C = S16TOPOSFLOAT(gUnknown_083F8DF4[eRoulette->var04_0].var18);
eRoulette->var90 = ((eRoulette->var8C * 0.5f) - eRoulette->var8C) / S16TOPOSFLOAT(g * 3);
eRoulette->var94 = 68.0f;
eRoulette->var9C = 0.0f;
eRoulette->var98 = -(8.0f / S16TOPOSFLOAT(g * 3));
eRoulette->varA0 = 36.0f;
gTasks[taskid].func = sub_8116308;
}
void sub_8116308(u8 taskid)
{
u8 index;
eRoulette->var03_7 = 1;
index = eRoulette->var3C[eRoulette->var7C];
eRoulette->var38 = &gSprites[index];
eRoulette->var38->callback = sub_81191F4;
gTasks[taskid].data[6]++;
gTasks[taskid].data[8]++;
sub_81182F8(6 - gTasks[taskid].data[6]);
m4aSongNumStart(SE_ROULETTE_BALL);
gTasks[taskid].func = sub_811637C;
}
void sub_811637C(u8 taskid)
{
if (eRoulette->var7D)
{
if (eRoulette->var03_5)
{
if (eRoulette->var03_6)
{
eRoulette->var03_6 = FALSE;
eRoulette->var03_5 = FALSE;
}
}
else
{
if (!gTasks[taskid].data[1])
{
u8 temp = sub_8116E5C(sub_8116D54(taskid, eRoulette->var7E), eRoulette->var1B[eRoulette->var1A_0]);
gTasks[taskid].data[5] = temp;
if (temp == 1)
sub_8124CE8((&eRoulette->varB8), 0x1000);
}
if (gTasks[taskid].data[1] < 61)
{
if (gMain.newKeys & A_BUTTON)
gTasks[taskid].data[1] = 60;
gTasks[taskid].data[1]++;
}
else
{
sub_8117158(eRoulette->var1B[eRoulette->var1A_0]);
sub_8117AA8(0, (u8)gTasks[taskid].data[12]);
sub_8117C60(0, (u8)gTasks[taskid].data[6] - 1);
gTasks[taskid].data[1] = 32;
gTasks[taskid].func = sub_8116474;
}
}
}
}
void sub_8116474(u8 taskid)
{
if (gTasks[taskid].data[1]-- > 0)
{
if (gTasks[taskid].data[1] > 2)
gSpriteCoordOffsetX -= 2;
if ((eRoulette->var26 -= 4) == 104)
gSprites[eRoulette->var3C[25]].callback = sub_81184CC;
}
else
{
sub_8117D68(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_8116514;
}
}
void sub_8116514(u8 taskid)
{
if (gTasks[taskid].data[1]-- > 1)
{
switch (gTasks[taskid].data[1] % 16)
{
case 8:
sub_8117AA8(0, 255);
sub_8117C60(0, 255);
break;
case 0:
sub_8117AA8(0, (u8)gTasks[taskid].data[12]);
sub_8117C60(0, (u8)gTasks[taskid].data[6] - 1);
break;
}
}
else
{
sub_8116C34(taskid, sub_8116638, 30, 0);
}
}
void sub_811659C(u8 taskid)
{
switch (gTasks[taskid].data[5])
{
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_8116C34(taskid, sub_811677C, 0xffff, 3);
}
break;
case 0:
default:
if (!IsSEPlaying())
{
gTasks[taskid].data[11] = FALSE;
sub_8116C34(taskid, sub_81167F4, 0xffff, 3);
}
}
}
void sub_8116638(u8 taskid)
{
switch (gTasks[taskid].data[5])
{
case 1:
case 2:
if (gTasks[taskid].data[2] == 12)
{
PlayFanfare(MUS_SLOTS_JACKPOT);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C41A5, 1, 15);
}
else
{
PlayFanfare(MUS_SLOTS_WIN);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C4199, 1, 15);
}
break;
case 0:
default:
m4aSongNumStart(SE_FAILURE);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C41AE, 1, 15);
}
gTasks[taskid].data[1] = 0;
gTasks[taskid].func = sub_811659C;
}
void sub_81166E8(u8 taskid)
{
s32 r0 = gTasks[taskid].data[7];
switch (r0)
{
case 0:
gTasks[taskid].data[13]++;
m4aSongNumStart(SE_PIN);
sub_81180F4(gTasks[taskid].data[13]);
if (gTasks[taskid].data[13] > 0x270e)
{
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]++;
}
if (gTasks[taskid].data[1] == 0)
sub_8116C34(taskid, sub_81167F4, 0xffff, 3);
}
void sub_811677C(u8 taskid)
{
ConvertIntToDecimalStringN((u8 *)&gStringVar1, (eRoulette->var19 * gTasks[taskid].data[2]), STR_CONV_MODE_LEFT_ALIGN, 2);
StringExpandPlaceholders((u8 *)&gStringVar4, &gUnknown_081C41BD);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText((u8 *)&gStringVar4, 1, 15);
gTasks[taskid].data[1] = (eRoulette->var19 * gTasks[taskid].data[2]);
gTasks[taskid].data[7] = 0;
gTasks[taskid].func = sub_81166E8;
}
void sub_81167F4(u8 taskid)
{
sub_8124D3C((&eRoulette->varB8), 0xffff);
eRoulette->varB8.var04[15].var00_7 = 0;
eRoulette->varB8.var04[14].var00_7 = 0;
eRoulette->varB8.var04[13].var00_7 = 0;
gSprites[eRoulette->var3C[7 + gUnknown_083F8C00[gTasks[taskid].data[12]].var00]].invisible = TRUE;
gTasks[taskid].func = sub_8116880;
}
void sub_8116880(u8 taskid)
{
u8 i = 0;
gTasks[taskid].data[4] = i;
eRoulette->var1B[eRoulette->var1A_0] = 0;
sub_8117158(0);
gSprites[eRoulette->var3C[48]].invisible = TRUE;
for (i = 0; i < 4; i++)
{
gSprites[eRoulette->var3C[i + 41]].oam.tileNum =
gSprites[eRoulette->var3C[i + 41]].sheetTileStart
+ (*gSprites[eRoulette->var3C[i + 41]].anims)->type;
}
if (!(gTasks[taskid].data[13] < eRoulette->var19))
{
if (gTasks[taskid].data[6] == 6)
{
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C41F1, 1, 15);
sub_8116C34(taskid, &dp01t_12_3_battle_menu, 0xffff, 3);
}
else if (gTasks[taskid].data[13] == 0x270f)
{
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C4231, 1, 15);
sub_8116C34(taskid, sub_8115734, 0xffff, 3);
}
else
{
gTasks[taskid].func = sub_8115734;
}
}
else
{
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C41D2, 1, 15);
sub_8116C34(taskid, sub_81157AC, 60, 3);
}
}
void dp01t_12_3_battle_menu(u8 taskid)
{
u8 i = 0;
gTasks[taskid].data[6] = 0;
sub_8116CAC(taskid);
sub_8116CF8();
sub_81185E8();
sub_8117158(0);
sub_81182F8(6);
for (i = 0; i < 12; i++)
gSprites[eRoulette->var3C[i + 7]].invisible = FALSE;
if (gTasks[taskid].data[13] == 0x270f)
{
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C4231, 1, 15);
sub_8116C34(taskid, sub_8115734, 0xffff, 3);
}
else
{
gTasks[taskid].func = sub_8115734;
}
}
void sub_8116AB0(u8 taskid)
{
sub_8124D3C((&eRoulette->varB8), 0xffff);
sub_8124918((&eRoulette->varB8));
gSaveBlock1.coins = gTasks[taskid].data[13];
if (gSaveBlock1.coins < eRoulette->var19)
gSpecialVar_0x8004 = TRUE;
else
gSpecialVar_0x8004 = FALSE;
BeginHardwarePaletteFade(255, 0, 0, 16, 0);
gTasks[taskid].func = sub_8116B40;
}
void sub_8116B40(u8 taskId) // end roulette ?
{
if (UpdatePaletteFade() == 0)
{
SetVBlankCallback(NULL);
memset(eRoulette, 0, 0x17c);
gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0;
sub_80F9368();
FreeAllSpritePalettes();
ResetPaletteFade();
ResetSpriteData();
ClearBGTilemapBuffers();
REG_BLDCNT = 0;
REG_BLDALPHA = 0;
REG_BLDY = 0;
gFieldCallback = sub_8080990;
SetMainCallback2(&CB2_ReturnToField);
DestroyTask(taskId);
#if DEBUG
unk_203955C[0] = 0;
#endif
}
}
void sub_8116BC0(u8 taskid)
{
if (eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA)
{
gTasks[taskid].func = eRoulette->varAC;
if (eRoulette->varAA > 0)
PlaySE(SE_SELECT);
eRoulette->varAC = NULL;
eRoulette->varAA = 0;
eRoulette->varA8 = 0;
}
if (eRoulette->varA8 != 0xffff)
eRoulette->varA8--;
}
void sub_8116C34(u8 taskid, TaskFunc r1, u16 r2, u16 r3)
{
eRoulette->varB4 = gTasks[taskid].func;
if (r1 == NULL)
r1 = eRoulette->varB4;
eRoulette->varAC = r1;
eRoulette->varA8 = r2;
if (r2 == 0xffff && r3 == 0)
eRoulette->varAA = 0xffff;
else
eRoulette->varAA = r3;
gTasks[taskid].func = sub_8116BC0;
}
void sub_8116CAC(u8 taskid)
{
u8 i = 0;
eRoulette->var00 = i;
eRoulette->var03_0 = 0;
eRoulette->var03_5 = 0;
eRoulette->var03_6 = 0;
eRoulette->var03_7 = 0;
for (i = 0; i < 6; i++)
eRoulette->var1B[i] = 0;
eRoulette->var1A_0 = 0;
gTasks[taskid].data[1] = 0;
}
void sub_8116CF8(void)
{
u8 i;
eRoulette->var08 = 0;
for (i = 0; i < 6; i++)
eRoulette->var0C[i] = 0;
for (i = 0; i < 4; i++)
eRoulette->var12[i] = 0;
for (i = 0; i < 3; i++)
eRoulette->var16[i] = 0;
sub_8117C60(1, 255);
}
u8 sub_8116D54(u8 taskid, u8 r1)
{
u32 t0[] = {67650, 135300, 270600, 541200};
u32 t1[] = {0x3e0, 0x7c00, 0xf8000};
if (r1 > 11)
{
return 0;
}
else
{
u8 i;
u8 z;
eRoulette->var0C[gTasks[taskid].data[6] - 1] = gUnknown_083F8D90[r1].var02;
gTasks[taskid].data[12] = gUnknown_083F8D90[r1].var02;
eRoulette->var08 |= gUnknown_083F8D90[r1].var04;
for (i = 0; i < 4; i++)
{
if (gUnknown_083F8D90[r1].var04 & t0[i])
eRoulette->var12[i]++;
if (eRoulette->var12[i] > 2)
eRoulette->var08 |= t0[i];
}
for (z = 0; z < 3; z++)
{
if (gUnknown_083F8D90[r1].var04 & t1[z])
eRoulette->var16[z]++;
if (eRoulette->var16[z] > 3)
eRoulette->var08 |= t1[z];
}
return gUnknown_083F8D90[r1].var02;
}
}
u8 sub_8116E5C(u8 r0, u8 r1)
{
u8 t = r0;
if (--r0 < 19)
{
switch (r1)
{
case 0:
return 3;
break;
case 1 ... 4:
if (t == r1 + 5 || t == r1 + 10 || t == r1 + 15)
return 1;
break;
case 5:
case 10:
case 15:
if (!(t < r1 + 1) && !(t > r1 + 4))
return 1;
break;
default:
if (t == r1)
return 1;
}
}
return 0;
}
void sub_8116EF8(u8 r0)
{
u16 var0 = 0;
u8 var2;
u16 var3;
u8 i;
switch (r0)
{
case 5:
case 10:
case 15:
for (i = (r0 + 1); i < (r0 + 5); i++)
if (!(eRoulette->var08 & gUnknown_083F8C00[i].var08))
var0 |= gUnknown_083F8C00[i].var10;
sub_8124CE8(&eRoulette->varB8, var0 &= 0xdfff);
break;
default:
{
struct UnkStruct1 var1[3];
memcpy(var1, gUnknown_083F8E9C, sizeof var1);
if (r0 > 0 && r0 < 5)
var2 = 3;
else
var2 = 1;
var3 = r0 / 5 - 1;
switch (r0 % 5)
{
case 1:
var3 = gSprites[eRoulette->var3C[7 + 0]].oam.paletteNum * 16;
break;
case 2:
var3 = gSprites[eRoulette->var3C[7 + 1]].oam.paletteNum * 16;
break;
case 3:
var3 = gSprites[eRoulette->var3C[7 + 2]].oam.paletteNum * 16;
break;
case 4:
var3 = gSprites[eRoulette->var3C[7 + 3]].oam.paletteNum * 16;
break;
}
if (var2 == 1)
{
if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08))
{
var1[r0 / 5 - 1].var02 += var3;
sub_812492C(&eRoulette->varB8, 13, &var1[r0 / 5 - 1]);
}
else
return;
}
else
{
for (i = 0; i < 3; i++)
{
u8 var4 = i * 5 + r0 + 5;
if (!(eRoulette->var08 & gUnknown_083F8C00[var4].var08))
{
var1[var4 / 5 - 1].var02 += var3;
sub_812492C(&eRoulette->varB8, i + 13, &var1[var4 / 5 - 1]);
if (var2 == 3)
var0 = gUnknown_083F8C00[var4].var10;
var2--;
}
}
if (var2 != 2)
var0 = 0;
}
sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10);
break;
}
}
}
void sub_8117158(u8 r0)
{
vu8 i;
vu8 z;
vu16 var1;
vu16 var2;
vu8 var0;
u8 v[5];
u8 l;
eRoulette->var2A = 1;
sub_8117AA8(0, 0);
sub_8124E2C(gBGTilemapBuffers[1], (u16 *)ewram18800, 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_083F8C00[v[i]].var06;
var1 = gUnknown_083F8C00[v[i]].var03;
for (z = 0; z < 3; z++)
{
var2 = (gUnknown_083F8C00[v[i]].var04 + z) * 32;
gBGTilemapBuffers[1][var1 + var2 + 0] = ewram189a0[(var0 + z) * 3 + 0];
gBGTilemapBuffers[1][var1 + var2 + 1] = ewram189a0[(var0 + z) * 3 + 1];
gBGTilemapBuffers[1][var1 + var2 + 2] = ewram189a0[(var0 + z) * 3 + 2];
}
}
}
u8 sub_8117380(u8 r0)
{
u8 var0[] = {0, 3, 4, 6, 12};
if (r0 > 19)
r0 = 0;
switch (gUnknown_083F8C00[r0].var01_0)
{
case 3:
r0 = r0 / 5 - 1;
if (eRoulette->var16[r0] > 3)
return 0;
return var0[eRoulette->var16[r0] + 1];
case 4:
r0--;
if (eRoulette->var12[r0] > 2)
return 0;
return var0[eRoulette->var12[r0] + 2];
case 12:
if (eRoulette->var08 & gUnknown_083F8C00[r0].var08)
return 0;
return var0[4];
}
return 0;
}
void sub_8117434(void)
{
s32 x1;
s32 x2;
REG_BG2PA = eRoulette->var2C.a;
REG_BG2PB = eRoulette->var2C.b;
REG_BG2PC = eRoulette->var2C.c;
REG_BG2PD = eRoulette->var2C.d;
x1 = 0x7400 - eRoulette->var2C.a * (gSpriteCoordOffsetX + 116)
- eRoulette->var2C.b * (gSpriteCoordOffsetY + 80);
x2 = 0x5400 - eRoulette->var2C.c * (gSpriteCoordOffsetX + 116)
- eRoulette->var2C.d * (gSpriteCoordOffsetY + 80);
REG_BG2X_L = x1;
REG_BG2X_H = (x1 & 0xfff0000) >> 16;
REG_BG2Y_L = x2;
REG_BG2Y_H = (x2 & 0xfff0000) >> 16;
}
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(20, 8, 1);
sub_814AAF8(RGB(30, 12, 11));
DoYesNoFuncWithChoice(r0, &gUnknown_083F8EB4);
}
void sub_8117528(u8 taskid)
{
if (!gPaletteFade.active)
{
SetVBlankCallback(NULL);
SetMainCallback2(sub_8115384);
DestroyTask(taskid);
}
}
void sub_811755C(u8 taskid)
{
Menu_EraseWindowRect(20, 8, 26, 13);
Menu_EraseScreen();
BeginNormalPaletteFade(0xffffffff, 0, 0, 16, RGB(0, 0, 0));
gPaletteFade.delayCounter = gPaletteFade.multipurpose2;
UpdatePaletteFade();
gTasks[taskid].func = sub_8117528;
}
void sub_81175C0(u8 taskid)
{
#if DEBUG
unk_203955C[0] = 0;
#endif
Menu_EraseScreen();
ScriptContext2_Disable();
DestroyTask(taskid);
}
void sub_81175DC(u8 taskid)
{
gTasks[taskid].data[0]++;
if (!(gMain.newKeys & (A_BUTTON | B_BUTTON)) && gTasks[taskid].data[0] < 61)
return;
gSpecialVar_0x8004 = 1;
Menu_EraseScreen();
ScriptContext2_Disable();
DestroyTask(taskid);
}
void sub_8117630(u8 taskid)
{
u32 temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 1) + (gSpecialVar_0x8004 >> 7 << 1)];
ConvertIntToDecimalStringN(gStringVar1, temp, 2, 1);
StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(gStringVar4, 1, 15);
gTasks[taskid].func = sub_81174F8;
}
void Task_Roulette_0(u8 taskid)
{
s32 temp;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskid].data[13], 1, 4);
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
Menu_DrawStdWindowFrame(0, 0, 9, 3);
MenuPrint_RightAligned(gStringVar4, 9, 1);
temp = gUnknown_083F8DF0[(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))
{
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(&gUnknown_081C4139, 1, 15);
sub_8116C34(taskid , sub_8117630, 0xffff, 3);
}
else
{
StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(gStringVar4, 1, 15);
gTasks[taskid].func = sub_81174F8;
}
}
else
{
StringExpandPlaceholders(gStringVar4, &gUnknown_081C411C);
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(gStringVar4, 1, 15);
gTasks[taskid].func = sub_81175DC;
gTasks[taskid].data[13] = 0;
gTasks[taskid].data[0] = 0;
}
}
#if DEBUG
#if (ENGLISH && REVISION == 0)
static const u8 gUnknown_Debug_0842510D[] = _("コインの かず STARTで きめて\nAーp1 Bーm1 R:Lー×10");
#else
static const u8 gUnknown_Debug_0842510D[] = _("Set COIN and Press START\nAーp1 Bーm1 R:Lー×10");
#endif
void debug_sub_812CDE4(u8 taskId)
{
#if (ENGLISH && REVISION == 0)
u8 coinText[] = {0xFD, 0x02, 0xFF};
#endif
if (gMain.newKeys & A_BUTTON)
{
gTasks[taskId].data[13]++;
if (gTasks[taskId].data[13] == 10000)
gTasks[taskId].data[13] = 0;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].data[13]--;
if (gTasks[taskId].data[13] == -1)
gTasks[taskId].data[13] = 9999;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & R_BUTTON)
{
gTasks[taskId].data[13] += 10;
if (gTasks[taskId].data[13] > 9999)
gTasks[taskId].data[13] -= 9999;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & L_BUTTON)
{
gTasks[taskId].data[13] -= 10;
if (gTasks[taskId].data[13] < 0)
gTasks[taskId].data[13] += 9999;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & START_BUTTON)
{
gSaveBlock1.coins = gTasks[taskId].data[13];
gTasks[taskId].func = Task_Roulette_0;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
unk_2039560 = 0;
}
else if (gMain.newKeys & SELECT_BUTTON)
{
gSaveBlock1.coins = gTasks[taskId].data[13];
gTasks[taskId].func = Task_Roulette_0;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
unk_2039560 = 1;
}
}
void debug_sub_812CFE8(u8 taskId)
{
gTasks[taskId].data[13] = gSaveBlock1.coins;
if (Random() & 1)
gSpecialVar_0x8004 |= 128;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
Menu_DrawStdWindowFrame(0, 0, 9, 3);
#if (ENGLISH && REVISION == 0)
Menu_PrintText(gStringVar4, 2, 1);
#else
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(gUnknown_Debug_0842510D, 1, 15);
gTasks[taskId].func = debug_sub_812CDE4;
}
#endif
void PlayRoulette(void)
{
u8 taskid;
ScriptContext2_Enable();
#if DEBUG
unk_2039560 = 0;
if (unk_203955C[0] != 0)
{
CreateTask(debug_sub_812CFE8, 0);
return;
}
#endif
taskid = CreateTask(Task_Roulette_0, 0);
gTasks[taskid].data[13] = gSaveBlock1.coins;
}