mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-03-21 17:55:13 -05:00
172 lines
6.6 KiB
C
172 lines
6.6 KiB
C
#include "overlay005/script_message.h"
|
|
|
|
#include "struct_defs/sentence.h"
|
|
|
|
#include "field/field_system.h"
|
|
|
|
#include "bg_window.h"
|
|
#include "field_message.h"
|
|
#include "field_script_context.h"
|
|
#include "font.h"
|
|
#include "game_options.h"
|
|
#include "message.h"
|
|
#include "save_player.h"
|
|
#include "script_manager.h"
|
|
#include "string_gf.h"
|
|
#include "string_template.h"
|
|
#include "text.h"
|
|
#include "unk_02014A84.h"
|
|
|
|
typedef struct ScriptMessage {
|
|
String *msgBuf;
|
|
String *tempBuf;
|
|
StringTemplate *template;
|
|
Window *window;
|
|
u8 *isOpen;
|
|
u8 *messageID;
|
|
} ScriptMessage;
|
|
|
|
static u8 GetTextFrameDelay(ScriptContext *ctx);
|
|
static void InitScriptMessage(FieldSystem *fieldSystem, ScriptMessage *msgData);
|
|
static void Init_ScriptMessageTemplate(FieldSystem *fieldSystem, StringTemplate *template, ScriptMessage *msgData);
|
|
static void OpenMessageBox(FieldSystem *fieldSystem, ScriptMessage *msgData);
|
|
static void LoadAndFormatMessage(ScriptMessage *msgData, const MessageLoader *msgLoader, u32 bufferEntryID);
|
|
static void GetStringFromSentence(ScriptMessage *msgData, u16 sentenceType, u16 sentenceID, u16 word1, u16 word2);
|
|
static void PrintFieldMessage(ScriptMessage *msgData, int fontID, int renderDelay, int canSkipDelay, BOOL autoScroll);
|
|
static void PrintTextMessage(ScriptMessage *msgData, int fontID);
|
|
|
|
void ScriptMessageOptions_Init(ScriptMessageOptions *msgOptions, ScriptContext *ctx)
|
|
{
|
|
msgOptions->renderDelay = GetTextFrameDelay(ctx);
|
|
msgOptions->autoScroll = FALSE;
|
|
msgOptions->fontID = FONT_MESSAGE;
|
|
}
|
|
|
|
void ScriptMessage_Show(ScriptContext *ctx, const MessageLoader *msgLoader, u16 messageID, u8 canSkipDelay, ScriptMessageOptions *msgOptions)
|
|
{
|
|
ScriptMessage msgData;
|
|
u8 renderDelay;
|
|
u8 autoScroll;
|
|
u8 fontID;
|
|
|
|
InitScriptMessage(ctx->fieldSystem, &msgData);
|
|
OpenMessageBox(ctx->fieldSystem, &msgData);
|
|
LoadAndFormatMessage(&msgData, msgLoader, messageID);
|
|
|
|
if (msgOptions == NULL) {
|
|
renderDelay = GetTextFrameDelay(ctx);
|
|
autoScroll = FALSE;
|
|
fontID = FONT_MESSAGE;
|
|
} else {
|
|
renderDelay = msgOptions->renderDelay;
|
|
autoScroll = msgOptions->autoScroll;
|
|
fontID = msgOptions->fontID;
|
|
}
|
|
|
|
PrintFieldMessage(&msgData, fontID, renderDelay, canSkipDelay, autoScroll);
|
|
}
|
|
|
|
void ScriptMessage_ShowInstant(ScriptContext *ctx, const MessageLoader *msgLoader, int messageID)
|
|
{
|
|
ScriptMessage msgData;
|
|
|
|
InitScriptMessage(ctx->fieldSystem, &msgData);
|
|
OpenMessageBox(ctx->fieldSystem, &msgData);
|
|
LoadAndFormatMessage(&msgData, msgLoader, messageID);
|
|
PrintTextMessage(&msgData, FONT_MESSAGE);
|
|
}
|
|
|
|
void ScriptMessage_ShowSentence(ScriptContext *ctx, u16 sentenceType, u16 sentenceID, u16 word1, s16 word2, u8 canSkipDelay)
|
|
{
|
|
ScriptMessage msgData;
|
|
Sentence unused;
|
|
|
|
InitScriptMessage(ctx->fieldSystem, &msgData);
|
|
OpenMessageBox(ctx->fieldSystem, &msgData);
|
|
GetStringFromSentence(&msgData, sentenceType, sentenceID, word1, word2);
|
|
|
|
if (canSkipDelay != FIELD_MESSAGE_SENTENCE_INSTANT) {
|
|
PrintFieldMessage(&msgData, FONT_MESSAGE, GetTextFrameDelay(ctx), canSkipDelay, FALSE);
|
|
} else {
|
|
PrintTextMessage(&msgData, FONT_MESSAGE);
|
|
}
|
|
}
|
|
|
|
void ScriptMessage_ShowTemplate(ScriptContext *fieldSystem, StringTemplate *template, u8 bufferEntryID, u8 canSkipDelay)
|
|
{
|
|
ScriptMessage msgData;
|
|
|
|
Init_ScriptMessageTemplate(fieldSystem->fieldSystem, template, &msgData);
|
|
OpenMessageBox(fieldSystem->fieldSystem, &msgData);
|
|
LoadAndFormatMessage(&msgData, fieldSystem->loader, bufferEntryID);
|
|
PrintFieldMessage(&msgData, FONT_MESSAGE, GetTextFrameDelay(fieldSystem), canSkipDelay, FALSE);
|
|
}
|
|
|
|
static u8 GetTextFrameDelay(ScriptContext *ctx)
|
|
{
|
|
return Options_TextFrameDelay(SaveData_GetOptions(ctx->fieldSystem->saveData));
|
|
}
|
|
|
|
static void InitScriptMessage(FieldSystem *fieldSystem, ScriptMessage *msgData)
|
|
{
|
|
msgData->msgBuf = *(String **)FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_MESSAGE_BUF);
|
|
msgData->tempBuf = *(String **)FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_TEMPORARY_BUF);
|
|
msgData->template = *(StringTemplate **)FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_STR_TEMPLATE);
|
|
msgData->window = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_WINDOW);
|
|
msgData->isOpen = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_IS_MSG_BOX_OPEN);
|
|
msgData->messageID = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_MESSAGE_ID);
|
|
}
|
|
|
|
static void Init_ScriptMessageTemplate(FieldSystem *fieldSystem, StringTemplate *template, ScriptMessage *msgData)
|
|
{
|
|
msgData->msgBuf = *(String **)FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_MESSAGE_BUF);
|
|
msgData->tempBuf = *(String **)FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_TEMPORARY_BUF);
|
|
msgData->template = template;
|
|
msgData->window = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_WINDOW);
|
|
msgData->isOpen = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_IS_MSG_BOX_OPEN);
|
|
msgData->messageID = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_MESSAGE_ID);
|
|
}
|
|
|
|
static void OpenMessageBox(FieldSystem *fieldSystem, ScriptMessage *msgData)
|
|
{
|
|
if (*(msgData->isOpen) == FALSE) {
|
|
FieldMessage_AddWindow(fieldSystem->bgConfig, msgData->window, BG_LAYER_MAIN_3);
|
|
FieldMessage_DrawWindow(msgData->window, SaveData_GetOptions(fieldSystem->saveData));
|
|
*(msgData->isOpen) = TRUE;
|
|
}
|
|
|
|
Window_FillTilemap(msgData->window, 15);
|
|
}
|
|
|
|
static void LoadAndFormatMessage(ScriptMessage *msgData, const MessageLoader *msgLoader, u32 bufferEntryID)
|
|
{
|
|
MessageLoader_GetString(msgLoader, bufferEntryID, msgData->tempBuf);
|
|
StringTemplate_Format(msgData->template, msgData->msgBuf, msgData->tempBuf);
|
|
}
|
|
|
|
static void GetStringFromSentence(ScriptMessage *msgData, u16 sentenceType, u16 sentenceID, u16 word1, u16 word2)
|
|
{
|
|
Sentence sentence;
|
|
String *string;
|
|
|
|
sub_02014A84(&sentence);
|
|
sub_02014CE0(&sentence, sentenceType, sentenceID);
|
|
Sentence_SetWord(&sentence, 0, word1);
|
|
Sentence_SetWord(&sentence, 1, word2);
|
|
|
|
string = sub_02014B34(&sentence, HEAP_ID_FIELD3);
|
|
|
|
String_Copy(msgData->msgBuf, string);
|
|
String_Free(string);
|
|
}
|
|
|
|
static void PrintFieldMessage(ScriptMessage *msgData, int fontID, int renderDelay, int canSkipDelay, BOOL autoScroll)
|
|
{
|
|
*(msgData->messageID) = FieldMessage_PrintWithParams(msgData->window, msgData->msgBuf, fontID, renderDelay, canSkipDelay, autoScroll);
|
|
}
|
|
|
|
static void PrintTextMessage(ScriptMessage *msgData, int fontID)
|
|
{
|
|
*(msgData->messageID) = Text_AddPrinterWithParams(msgData->window, fontID, msgData->msgBuf, 0, 0, TEXT_SPEED_INSTANT, NULL);
|
|
}
|