field_name_box smol followup (#7762)

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
mudskipper13 2025-09-20 16:17:47 +07:00 committed by GitHub
parent a55d603502
commit 6a4f923904
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 28 additions and 24 deletions

View File

@ -1,17 +1,20 @@
#ifndef GUARD_FIELD_NAME_BOX_H
#define GUARD_FIELD_NAME_BOX_H
#define NAME_BOX_BASE_TILES_TOTAL (6) // Total tiles within the namebox's .png, best practice to make all images uses the same total tiles.
#define NAME_BOX_BASE_TILE_NUM (0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT))
extern EWRAM_DATA const u8 *gSpeakerName;
extern const u8 *const gSpeakerNamesTable[];
void TrySpawnNamebox(void);
void TrySpawnNamebox(u32 tileNum);
u32 GetNameboxWindowId(void);
void DestroyNamebox(void);
void FillNamebox(void);
void DrawNamebox(u32 windowId, bool32 copyToVram);
void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram);
void ClearNamebox(u32 windowId, bool32 copyToVram);
void SetSpeakerName(const u8 *name);
u32 GetNameboxWidth(void);
void TrySpawnAndShowNamebox(const u8 *speaker);
void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum);
#endif // GUARD_FIELD_NAME_BOX_H

View File

@ -43,7 +43,7 @@ static void Task_DrawFieldMessage(u8 taskId)
u32 nameboxWinId = GetNameboxWindowId();
DrawDialogueFrame(0, TRUE);
if (nameboxWinId != WINDOW_NONE)
DrawNamebox(nameboxWinId, TRUE);
DrawNamebox(nameboxWinId, NAME_BOX_BASE_TILE_NUM, TRUE);
task->tState++;
break;
case 2:
@ -127,7 +127,7 @@ bool8 ShowFieldMessageFromBuffer(void)
static void ExpandStringAndStartDrawFieldMessage(const u8 *str, bool32 allowSkippingDelayWithButtonPress)
{
TrySpawnNamebox();
TrySpawnNamebox(NAME_BOX_BASE_TILE_NUM);
StringExpandPlaceholders(gStringVar4, str);
AddTextPrinterForMessage(allowSkippingDelayWithButtonPress);
CreateTask_DrawFieldMessage();

View File

@ -17,19 +17,16 @@
#include "constants/speaker_names.h"
#include "data/speaker_names.h"
#define NAME_BOX_BASE_TILE_TOTAL (6)
#define NAME_BOX_BASE_TILE_NUM (0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT) - NAME_BOX_BASE_TILE_TOTAL)
static EWRAM_INIT u8 sNameboxWindowId = WINDOW_NONE;
EWRAM_DATA const u8 *gSpeakerName = NULL;
static const u32 sNameBoxDefaultGfx[] = INCBIN_U32("graphics/text_window/name_box.4bpp");
static const u32 sNameBoxPokenavGfx[] = INCBIN_U32("graphics/pokenav/name_box.4bpp");
static void WindowFunc_DrawNamebox(u8, u8, u8, u8, u8, u8);
static void WindowFunc_DrawNamebox(u32, u32, u32, u32, u32, u32, u32);
static void WindowFunc_ClearNamebox(u8, u8, u8, u8, u8, u8);
void TrySpawnNamebox(void)
void TrySpawnNamebox(u32 tileNum)
{
u8 *strbuf = AllocZeroed(32 * sizeof(u8));
if ((OW_FLAG_SUPPRESS_NAME_BOX != 0 && FlagGet(OW_FLAG_SUPPRESS_NAME_BOX)) || gSpeakerName == NULL || !strbuf)
@ -70,7 +67,7 @@ void TrySpawnNamebox(void)
.width = winWidth,
.height = OW_NAME_BOX_DEFAULT_HEIGHT,
.paletteNum = matchCall ? 14 : DLG_WINDOW_PALETTE_NUM,
.baseBlock = 0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT),
.baseBlock = tileNum,
};
sNameboxWindowId = AddWindow(&template);
@ -136,10 +133,14 @@ void FillNamebox(void)
}
}
void DrawNamebox(u32 windowId, bool32 copyToVram)
void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram)
{
LoadBgTiles(GetWindowAttribute(sNameboxWindowId, WINDOW_BG), GetNameboxGraphics(), 0x0C0, NAME_BOX_BASE_TILE_NUM);
CallWindowFunction(windowId, WindowFunc_DrawNamebox);
// manual instead of using CallWindowFunction for extra tileNum param
struct WindowTemplate *w = &gWindows[windowId].window;
u32 size = TILE_OFFSET_4BPP(NAME_BOX_BASE_TILES_TOTAL);
LoadBgTiles(GetWindowAttribute(sNameboxWindowId, WINDOW_BG), GetNameboxGraphics(), size, tileNum);
WindowFunc_DrawNamebox(w->bg, w->tilemapLeft, w->tilemapTop, w->width, w->height, w->paletteNum, tileNum);
PutWindowTilemap(windowId);
if (copyToVram == TRUE)
CopyWindowToVram(windowId, COPYWIN_FULL);
@ -153,15 +154,15 @@ void ClearNamebox(u32 windowId, bool32 copyToVram)
CopyWindowToVram(windowId, COPYWIN_FULL);
}
static void WindowFunc_DrawNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p)
static void WindowFunc_DrawNamebox(u32 bg, u32 L, u32 T, u32 w, u32 h, u32 p, u32 tileNum)
{
// left-most
FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM, L - 1, T, 1, 1, p);
FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 3, L - 1, T + 1, 1, 1, p);
FillBgTilemapBufferRect(bg, tileNum, L - 1, T, 1, 1, p);
FillBgTilemapBufferRect(bg, tileNum + 3, L - 1, T + 1, 1, 1, p);
// right-most
FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 2, L + w, T, 1, 1, p);
FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 5, L + w, T + 1, 1, 1, p);
FillBgTilemapBufferRect(bg, tileNum + 2, L + w, T, 1, 1, p);
FillBgTilemapBufferRect(bg, tileNum + 5, L + w, T + 1, 1, 1, p);
}
static void WindowFunc_ClearNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p)
@ -183,12 +184,12 @@ void SetSpeaker(struct ScriptContext *ctx)
}
// useful for other context e.g. match call
void TrySpawnAndShowNamebox(const u8 *speaker)
void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum)
{
gSpeakerName = speaker;
TrySpawnNamebox();
TrySpawnNamebox(tileNum);
if (sNameboxWindowId != WINDOW_NONE)
DrawNamebox(sNameboxWindowId, TRUE);
DrawNamebox(sNameboxWindowId, tileNum - NAME_BOX_BASE_TILES_TOTAL, TRUE);
else // either NULL or SP_NAME_NONE
RedrawDialogueFrame();
}

View File

@ -1326,7 +1326,7 @@ static bool32 MatchCall_PrintIntro(u8 taskId)
if (!sMatchCallState.triggeredFromScript)
SelectMatchCallMessage(sMatchCallState.trainerId, gStringVar4);
TrySpawnAndShowNamebox(gSpeakerName);
TrySpawnAndShowNamebox(gSpeakerName, NAME_BOX_BASE_TILE_NUM);
InitMatchCallTextPrinter(tWindowId, gStringVar4);
return TRUE;
}

View File

@ -1233,7 +1233,7 @@ static u16 RenderText(struct TextPrinter *textPrinter)
case EXT_CTRL_CODE_SPEAKER:
{
enum SpeakerNames name = *textPrinter->printerTemplate.currentChar++;
TrySpawnAndShowNamebox(gSpeakerNamesTable[name]);
TrySpawnAndShowNamebox(gSpeakerNamesTable[name], NAME_BOX_BASE_TILE_NUM);
return RENDER_REPEAT;
}