mirror of
https://github.com/pret/pokeruby.git
synced 2026-09-30 07:21:48 -04:00
432 lines
10 KiB
C
432 lines
10 KiB
C
#include "global.h"
|
|
#include "task.h"
|
|
#include "menu.h"
|
|
#include "palette.h"
|
|
#include "script.h"
|
|
#include "sound.h"
|
|
#include "event_data.h"
|
|
#include "sprite.h"
|
|
|
|
struct MultichoiceListStruct
|
|
{
|
|
struct MenuAction *list;
|
|
u8 count;
|
|
};
|
|
|
|
extern const struct MultichoiceListStruct gMultichoiceLists[];
|
|
|
|
extern u16 gScriptResult;
|
|
|
|
extern void FreeResourcesAndDestroySprite(struct Sprite *sprite);
|
|
extern u8 CreateMonSprite_PicBox(u16, s16, s16, u8);
|
|
extern u8 sub_80B59AC(void);
|
|
|
|
extern u8 gPCText_PlayersPC[];
|
|
extern u8 gPCText_SomeonesPC[];
|
|
extern u8 gPCText_HallOfFame[];
|
|
extern u8 gPCText_LogOff[];
|
|
extern u8 gPCText_LanettesPC[];
|
|
extern u8 gPCText_WhichPCShouldBeAccessed[];
|
|
|
|
void DrawMultichoiceMenu(u8, u8, u8, struct MenuAction *list, u8, u8);
|
|
void sub_80B53B4(u8, u8, u8, struct MenuAction *list, u8);
|
|
void sub_80B52B4(u8);
|
|
void sub_80B5230(u8, u8, u8, u8, u8, u8);
|
|
void task_yes_no_maybe(u8);
|
|
void sub_80B5684(u8);
|
|
void CreatePCMenu(void);
|
|
|
|
bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4)
|
|
{
|
|
if(FuncIsActiveTask(sub_80B52B4) == 1)
|
|
return FALSE;
|
|
else
|
|
{
|
|
gScriptResult = 0xFF;
|
|
DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, 0);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5)
|
|
{
|
|
if(FuncIsActiveTask(sub_80B52B4) == 1)
|
|
return FALSE;
|
|
else
|
|
{
|
|
gScriptResult = 0xFF;
|
|
DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, var5);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
u16 GetStringWidthInTilesForScriptMenu(u8 *str)
|
|
{
|
|
// each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8.
|
|
return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8;
|
|
}
|
|
|
|
void DrawMultichoiceMenu(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4, u8 cursorPos)
|
|
{
|
|
u16 width = GetStringWidthInTilesForScriptMenu(list[0].text);
|
|
u16 newWidth;
|
|
u8 i;
|
|
u8 right;
|
|
u8 bottom;
|
|
|
|
for(i = 1; i < count; i++)
|
|
{
|
|
newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
|
|
if(width < newWidth)
|
|
width = newWidth;
|
|
}
|
|
|
|
right = width;
|
|
right = (right + left) + 1;
|
|
|
|
if(right > 29)
|
|
{
|
|
left = left + (29 - right);
|
|
right = 29;
|
|
}
|
|
|
|
bottom = top + (2 * count + 1);
|
|
|
|
MenuDrawTextWindow(left, top, right, bottom);
|
|
PrintMenuItems(left + 1, top + 1, count, list);
|
|
InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1);
|
|
sub_80B5230(left, top, right, bottom, var4, count);
|
|
}
|
|
|
|
void sub_80B5230(u8 left, u8 top, u8 right, u8 bottom, u8 unkVar, u8 count)
|
|
{
|
|
u8 taskId = CreateTask(sub_80B52B4, 80);
|
|
|
|
gTasks[taskId].data[0] = left;
|
|
gTasks[taskId].data[1] = top;
|
|
gTasks[taskId].data[2] = right;
|
|
gTasks[taskId].data[3] = bottom;
|
|
gTasks[taskId].data[4] = unkVar;
|
|
|
|
if(count > 3)
|
|
gTasks[taskId].data[5] = TRUE;
|
|
else
|
|
gTasks[taskId].data[5] = FALSE;
|
|
}
|
|
|
|
void sub_80B52B4(u8 taskId)
|
|
{
|
|
s8 var;
|
|
|
|
if(!gPaletteFade.active)
|
|
{
|
|
if(!gTasks[taskId].data[5])
|
|
var = ProcessMenuInputNoWrap();
|
|
else
|
|
var = ProcessMenuInput();
|
|
|
|
if(var != -2)
|
|
{
|
|
if(var == -1)
|
|
{
|
|
if(!gTasks[taskId].data[4])
|
|
{
|
|
PlaySE(5);
|
|
gScriptResult = 127;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gScriptResult = var;
|
|
}
|
|
sub_8072DEC();
|
|
MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]);
|
|
DestroyTask(taskId);
|
|
EnableBothScriptContexts();
|
|
}
|
|
}
|
|
}
|
|
|
|
bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4)
|
|
{
|
|
if(FuncIsActiveTask(sub_80B52B4) == 1)
|
|
return FALSE;
|
|
else
|
|
{
|
|
gScriptResult = 0xFF;
|
|
sub_80B53B4(var1, var2, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4)
|
|
{
|
|
u16 width = GetStringWidthInTilesForScriptMenu(list[0].text);
|
|
u16 newWidth;
|
|
u8 i;
|
|
u8 right;
|
|
u8 bottom;
|
|
|
|
for(i = 1; i < count; i++)
|
|
{
|
|
newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
|
|
if(width < newWidth)
|
|
width = newWidth;
|
|
}
|
|
|
|
right = width;
|
|
right = (right + left) + 2;
|
|
bottom = top + (2 * count + 1);
|
|
|
|
PrintMenuItems(left, top, count, list);
|
|
InitMenu(0, left, top, count, 0, right - left - 1);
|
|
sub_80B5230(left, top, right, bottom, var4, count);
|
|
}
|
|
|
|
bool8 yes_no_box(u8 var1, u8 var2)
|
|
{
|
|
u8 taskId;
|
|
|
|
if(FuncIsActiveTask(task_yes_no_maybe) == 1)
|
|
return FALSE;
|
|
else
|
|
{
|
|
gScriptResult = 0xFF;
|
|
DisplayYesNoMenu(var1, var2, 1);
|
|
taskId = CreateTask(task_yes_no_maybe, 0x50);
|
|
gTasks[taskId].data[0] = var1;
|
|
gTasks[taskId].data[1] = var2;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// unused
|
|
bool8 IsScriptActive(void)
|
|
{
|
|
if(gScriptResult == 0xFF)
|
|
return FALSE;
|
|
else
|
|
return TRUE;
|
|
}
|
|
|
|
void task_yes_no_maybe(u8 taskId)
|
|
{
|
|
u8 left, top;
|
|
|
|
if (gTasks[taskId].data[2] < 5)
|
|
{
|
|
gTasks[taskId].data[2]++;
|
|
return;
|
|
}
|
|
|
|
switch (ProcessMenuInputNoWrap())
|
|
{
|
|
case -2:
|
|
return;
|
|
case -1:
|
|
case 1:
|
|
PlaySE(5);
|
|
gScriptResult = 0;
|
|
break;
|
|
case 0:
|
|
gScriptResult = 1;
|
|
break;
|
|
}
|
|
|
|
left = gTasks[taskId].data[0];
|
|
top = gTasks[taskId].data[1];
|
|
|
|
MenuZeroFillWindowRect(left, top, left + 6, top + 5);
|
|
DestroyTask(taskId);
|
|
EnableBothScriptContexts();
|
|
}
|
|
|
|
bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount)
|
|
{
|
|
u8 bottom = 0;
|
|
|
|
if (FuncIsActiveTask(sub_80B5684) == TRUE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
u8 taskId;
|
|
u8 width;
|
|
|
|
gScriptResult = 0xFF;
|
|
|
|
sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0);
|
|
|
|
taskId = CreateTask(sub_80B5684, 80);
|
|
|
|
if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1))
|
|
|| columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount)
|
|
{
|
|
bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top;
|
|
}
|
|
else
|
|
{
|
|
bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top;
|
|
}
|
|
|
|
width = sub_807288C(columnCount);
|
|
gTasks[taskId].data[0] = left;
|
|
gTasks[taskId].data[1] = top;
|
|
gTasks[taskId].data[2] = width + left + 2;
|
|
gTasks[taskId].data[3] = bottom;
|
|
gTasks[taskId].data[4] = a4;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
void sub_80B5684(u8 taskId)
|
|
{
|
|
s8 var = sub_80727CC();
|
|
|
|
if (var != -2)
|
|
{
|
|
if (var == -1)
|
|
{
|
|
if (!gTasks[taskId].data[4])
|
|
{
|
|
PlaySE(5);
|
|
gScriptResult = 127;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gScriptResult = var;
|
|
}
|
|
sub_8072DEC();
|
|
MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]);
|
|
DestroyTask(taskId);
|
|
EnableBothScriptContexts();
|
|
}
|
|
}
|
|
|
|
bool8 TryCreatePCMenu(void)
|
|
{
|
|
if(FuncIsActiveTask(sub_80B52B4) == 1)
|
|
return FALSE;
|
|
else
|
|
{
|
|
gScriptResult = 0xFF;
|
|
CreatePCMenu();
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
void CreatePCMenu(void)
|
|
{
|
|
u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC);
|
|
u8 width;
|
|
u8 numChoices;
|
|
|
|
if(playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC))
|
|
width = playersPCWidth;
|
|
else
|
|
width = 8;
|
|
|
|
if(FlagGet(SYS_GAME_CLEAR)) // player has cleared game?
|
|
{
|
|
numChoices = 4;
|
|
MenuDrawTextWindow(0, 0, width + 2, 9);
|
|
MenuPrint(gPCText_HallOfFame, 1, 5);
|
|
MenuPrint(gPCText_LogOff, 1, 7);
|
|
}
|
|
else
|
|
{
|
|
numChoices = 3;
|
|
MenuDrawTextWindow(0, 0, width + 2, 7);
|
|
MenuPrint(gPCText_LogOff, 1, 5);
|
|
}
|
|
|
|
if(FlagGet(SYS_PC_LANETTE)) // player met lanette?
|
|
MenuPrint(gPCText_LanettesPC, 1, 1);
|
|
else
|
|
MenuPrint(gPCText_SomeonesPC, 1, 1);
|
|
|
|
MenuPrint(gPCText_PlayersPC, 1, 3);
|
|
InitMenu(0, 1, 1, numChoices, 0, width + 1);
|
|
sub_80B5230(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices);
|
|
}
|
|
|
|
void sub_80B5838(void)
|
|
{
|
|
MenuDisplayMessageBox();
|
|
MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15);
|
|
}
|
|
|
|
void task_picbox(u8 taskId)
|
|
{
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
switch(task->data[0])
|
|
{
|
|
case 0:
|
|
task->data[0]++;
|
|
break;
|
|
case 1:
|
|
break;
|
|
case 2:
|
|
FreeResourcesAndDestroySprite(&gSprites[task->data[2]]);
|
|
task->data[0]++;
|
|
break;
|
|
case 3:
|
|
MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
|
|
DestroyTask(taskId);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3)
|
|
{
|
|
u8 taskId;
|
|
u8 var;
|
|
|
|
if(FindTaskIdByFunc(task_picbox) != 0xFF)
|
|
return FALSE;
|
|
else
|
|
{
|
|
MenuDrawTextWindow(var2, var3, var2 + 9, var3 + 10);
|
|
taskId = CreateTask(task_picbox, 0x50);
|
|
gTasks[taskId].data[0] = 0;
|
|
gTasks[taskId].data[1] = var1;
|
|
var = CreateMonSprite_PicBox(var1, var2 * 8 + 40, var3 * 8 + 40, 0);
|
|
gTasks[taskId].data[2] = var;
|
|
gTasks[taskId].data[3] = var2;
|
|
gTasks[taskId].data[4] = var3;
|
|
gSprites[var].callback = SpriteCallbackDummy;
|
|
gSprites[var].oam.priority = 0;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
void *picbox_close(void)
|
|
{
|
|
u8 taskId = FindTaskIdByFunc(task_picbox);
|
|
|
|
if(taskId == 0xFF)
|
|
return NULL;
|
|
|
|
gTasks[taskId].data[0]++;
|
|
return (void *)sub_80B59AC;
|
|
}
|
|
|
|
bool8 sub_80B59AC(void)
|
|
{
|
|
if(FindTaskIdByFunc(task_picbox) == 0xFF)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|