pokeemerald/src/field_message_box.c
2022-07-29 10:17:58 -04:00

164 lines
3.9 KiB
C
Executable File

#include "global.h"
#include "menu.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "match_call.h"
#include "field_message_box.h"
static EWRAM_DATA u8 sFieldMessageBoxMode = 0;
static void ExpandStringAndStartDrawFieldMessage(const u8 *, bool32);
static void StartDrawFieldMessage(void);
void InitFieldMessageBox(void)
{
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
gTextFlags.canABSpeedUpPrint = FALSE;
gTextFlags.useAlternateDownArrow = FALSE;
gTextFlags.autoScroll = FALSE;
gTextFlags.forceMidTextSpeed = FALSE;
}
#define tState data[0]
static void Task_DrawFieldMessage(u8 taskId)
{
struct Task *task = &gTasks[taskId];
switch (task->tState)
{
case 0:
LoadMessageBoxAndBorderGfx();
task->tState++;
break;
case 1:
DrawDialogueFrame(0, TRUE);
task->tState++;
break;
case 2:
if (RunTextPrintersAndIsPrinter0Active() != TRUE)
{
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
DestroyTask(taskId);
}
}
}
#undef tState
static void CreateTask_DrawFieldMessage(void)
{
CreateTask(Task_DrawFieldMessage, 0x50);
}
static void DestroyTask_DrawFieldMessage(void)
{
u8 taskId = FindTaskIdByFunc(Task_DrawFieldMessage);
if (taskId != TASK_NONE)
DestroyTask(taskId);
}
bool8 ShowFieldMessage(const u8 *str)
{
if (sFieldMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN)
return FALSE;
ExpandStringAndStartDrawFieldMessage(str, TRUE);
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL;
return TRUE;
}
static void Task_HidePokenavMessageWhenDone(u8 taskId)
{
if (!IsMatchCallTaskActive())
{
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
DestroyTask(taskId);
}
}
bool8 ShowPokenavFieldMessage(const u8 *str)
{
if (sFieldMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN)
return FALSE;
StringExpandPlaceholders(gStringVar4, str);
CreateTask(Task_HidePokenavMessageWhenDone, 0);
StartMatchCallFromScript(str);
sFieldMessageBoxMode = 2;
return TRUE;
}
bool8 ShowFieldAutoScrollMessage(const u8 *str)
{
if (sFieldMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN)
return FALSE;
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL;
ExpandStringAndStartDrawFieldMessage(str, FALSE);
return TRUE;
}
// Unused
static bool8 ForceShowFieldAutoScrollMessage(const u8 *str)
{
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL;
ExpandStringAndStartDrawFieldMessage(str, TRUE);
return TRUE;
}
// Same as ShowFieldMessage, but instead of accepting a
// string arg it just prints whats already in gStringVar4
bool8 ShowFieldMessageFromBuffer(void)
{
if (sFieldMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN)
return FALSE;
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL;
StartDrawFieldMessage();
return TRUE;
}
static void ExpandStringAndStartDrawFieldMessage(const u8 *str, bool32 allowSkippingDelayWithButtonPress)
{
StringExpandPlaceholders(gStringVar4, str);
AddTextPrinterForMessage(allowSkippingDelayWithButtonPress);
CreateTask_DrawFieldMessage();
}
static void StartDrawFieldMessage(void)
{
AddTextPrinterForMessage(TRUE);
CreateTask_DrawFieldMessage();
}
void HideFieldMessageBox(void)
{
DestroyTask_DrawFieldMessage();
ClearDialogWindowAndFrame(0, TRUE);
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
}
u8 GetFieldMessageBoxMode(void)
{
return sFieldMessageBoxMode;
}
bool8 IsFieldMessageBoxHidden(void)
{
if (sFieldMessageBoxMode == FIELD_MESSAGE_BOX_HIDDEN)
return TRUE;
return FALSE;
}
// Unused
static void ReplaceFieldMessageWithFrame(void)
{
DestroyTask_DrawFieldMessage();
DrawStdWindowFrame(0, TRUE);
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
}
void StopFieldMessage(void)
{
DestroyTask_DrawFieldMessage();
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
}