summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xinclude/game.h1
-rw-r--r--kamek_pal.x1
-rw-r--r--src/koopatlas/hud.cpp72
3 files changed, 63 insertions, 11 deletions
diff --git a/include/game.h b/include/game.h
index 071d93e..fd0dd3c 100755
--- a/include/game.h
+++ b/include/game.h
@@ -24,6 +24,7 @@ inline T clamp(T value, T one, T two) { return (value < one) ? one : ((value > t
extern "C" {
int wcslen(const wchar_t *str);
+wchar_t *wcscpy(wchar_t *dest, const wchar_t *src);
int strlen(const char *str);
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, int num);
diff --git a/kamek_pal.x b/kamek_pal.x
index 75613ad..4f08ae9 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -974,6 +974,7 @@ SECTIONS {
strrchr = 0x802E1F30;
wcslen = 0x802E470C;
+ wcscpy = 0x802E4728;
IOS_Open = 0x80224DB0;
IOS_Close = 0x80224FA0;
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
index 667feb2..3d2eb04 100644
--- a/src/koopatlas/hud.cpp
+++ b/src/koopatlas/hud.cpp
@@ -345,31 +345,81 @@ void dWMHud_c::loadHeaderInfo() {
LevelNameS->SetString(convertedLevelName);
// LEVEL NUMBER
- wchar_t levelNumber[6];
- levelNumber[0] = '0' + nodeForHeader->levelNumber[0];
+ static const wchar_t *numberKinds[] = {
+ // 0-19 are handled by code
+ L"A", // 20, alternate
+ L"Tower", // 21, tower
+ L"Tower2", // 22, tower 2
+ L"Castle", // 23, castle
+ L"Fortress", // 24, fortress
+ L"FCastle", // 25, final castle
+ L"Train", // 26, train
+ L"Airship", // 27, airship
+ L"Palace", // 28, switch palace
+ L"House", // 29, yoshi's house
+ L"Key1", // 30, key 1
+ L"Key2", // 31, key 2
+ L"Key3", // 32, key 3
+ L"Key4", // 33, key 4
+ L"Key5", // 34, key 5
+ L"Key6", // 35, key 6
+ };
+
+ int origWN = nodeForHeader->levelNumber[0];
+ int origWL = nodeForHeader->levelNumber[1];
+
+ wchar_t levelNumber[16];
+ levelNumber[0] = (origWN >= 10) ? (origWN-10+'A') : (origWN+'0');
levelNumber[1] = '-';
- if (nodeForHeader->levelNumber[1] >= 10) {
- levelNumber[2] = '0' + (nodeForHeader->levelNumber[1] / 10);
- levelNumber[3] = '0' + (nodeForHeader->levelNumber[1] % 10);
+ if (origWL > 20) {
+ wcscpy(&levelNumber[2], numberKinds[origWL-20]);
+ } else if (origWL >= 10) {
+ levelNumber[2] = '1';
+ levelNumber[3] = ('0' - 10) + origWL;
levelNumber[4] = 0;
} else {
- levelNumber[2] = '0' + nodeForHeader->levelNumber[1];
+ levelNumber[2] = '0' + origWL;
levelNumber[3] = 0;
}
LevelNumber->SetString(levelNumber);
LevelNumberS->SetString(levelNumber);
+ nw4r::ut::TextWriter tw2;
+ tw2.font = LevelNumber->font;
+ tw2.SetFontSize(LevelNumber->fontSizeX, LevelNumber->fontSizeY);
+ tw2.lineSpace = LevelNumber->lineSpace;
+ tw2.charSpace = LevelNumber->charSpace;
+ if (LevelNumber->tagProc != 0)
+ tw2.tagProcessor = LevelNumber->tagProc;
+
+ float spacing = 4.0f;
+ float currentPos = tw2.CalcStringWidth(levelNumber, wcslen(levelNumber));
+ currentPos += LevelNumber->trans.x + spacing;
+
// INFO
int w = nodeForHeader->levelNumber[0] - 1;
int l = nodeForHeader->levelNumber[1] - 1;
u32 conds = GetSaveFile()->GetBlock(-1)->GetLevelCondition(w, l);
+
+ NormalExitFlag->trans.x = currentPos;
NormalExitFlag->SetVisible(conds & COND_NORMAL);
+ if (conds & COND_NORMAL)
+ currentPos += NormalExitFlag->size.x + spacing;
+
+ SecretExitFlag->trans.x = currentPos;
SecretExitFlag->SetVisible(conds & COND_SECRET);
- StarCoinOn[0]->SetVisible(conds & COND_COIN1);
- StarCoinOn[1]->SetVisible(conds & COND_COIN2);
- StarCoinOn[2]->SetVisible(conds & COND_COIN3);
+ if (conds & COND_SECRET)
+ currentPos += SecretExitFlag->size.x + spacing;
+
+ for (int i = 0; i < 3; i++) {
+ bool flag = (conds & (COND_COIN1 << i));
+ StarCoinOn[i]->trans.x = currentPos;
+ StarCoinOn[i]->SetVisible(flag);
+ if (flag)
+ currentPos += StarCoinOn[i]->size.x + spacing;
+ }
// SIZE THING
nw4r::ut::TextWriter tw;
@@ -382,8 +432,8 @@ void dWMHud_c::loadHeaderInfo() {
float width = tw.CalcStringWidth(convertedLevelName, charCount);
float totalWidth = width + LevelName->trans.x - 20.0f;
- if (totalWidth < 270.0f)
- totalWidth = 270.0f;
+ if (totalWidth < currentPos)
+ totalWidth = currentPos;
Header_Centre->size.x = totalWidth;
Header_Right->trans.x = totalWidth;