164 lines
3.9 KiB
C
164 lines
3.9 KiB
C
|
#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, 1);
|
||
|
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, 1);
|
||
|
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, 1);
|
||
|
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
|
||
|
}
|
||
|
|
||
|
void StopFieldMessage(void)
|
||
|
{
|
||
|
DestroyTask_DrawFieldMessage();
|
||
|
sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
|
||
|
}
|