summaryrefslogtreecommitdiff
path: root/src/koopatlas
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/koopatlas/hud.cpp122
-rw-r--r--src/koopatlas/hud.h18
-rw-r--r--src/koopatlas/starcoin.cpp4
3 files changed, 138 insertions, 6 deletions
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
index b7e40d2..266c284 100644
--- a/src/koopatlas/hud.cpp
+++ b/src/koopatlas/hud.cpp
@@ -54,7 +54,24 @@ int dWMHud_c::onCreate() {
static const char *tbNames[2] = {"MenuButtonInfo", "ItemsButtonInfo"};
layout.setLangStrings(tbNames, (int[2]){12, 15}, 4, 2);
+ static const char *pictureNames[7] = {
+ "Header_Centre", "Header_Right",
+ "NormalExitFlag", "SecretExitFlag",
+ "StarCoinOn0", "StarCoinOn1", "StarCoinOn2"
+ };
+ layout.getPictures(pictureNames, &Header_Centre, 7);
+
+ static const char *textBoxNames[7] = {
+ "LevelName", "LevelNameS",
+ "LevelNumber", "LevelNumberS",
+ "WorldName", "WorldNameS",
+ "StarCoinCounter"
+ };
+ layout.getTextBoxes(textBoxNames, &LevelName, 7);
+
layoutLoaded = true;
+
+ willShowHeader = false;
}
return true;
@@ -73,6 +90,12 @@ int dWMHud_c::onExecute() {
if (!layoutLoaded)
return true;
+ if (willShowHeader && (!(layout.isAnimOn(SHOW_HEADER)))) {
+ willShowHeader = false;
+ loadHeaderInfo();
+ playShowHeaderAnim();
+ }
+
layout.execAnimations();
layout.update();
@@ -97,9 +120,104 @@ void dWMHud_c::playShowHeaderAnim() {
}
void dWMHud_c::playHideHeaderAnim() {
- if (layout.isAnimOn(SHOW_HEADER)) {
+ if (!layout.isAnimOn(SHOW_HEADER)) {
layout.enableNonLoopAnim(SHOW_HEADER, true);
}
- layout.grpHandlers[SHOW_HEADER].frameCtrl.flags = 2; // NO_LOOP | REVERSE
+ layout.grpHandlers[SHOW_HEADER].frameCtrl.flags = 3; // NO_LOOP | REVERSE
+}
+
+
+void dWMHud_c::loadHeaderInfo() {
+ dLevelInfo_c *levelInfo = &dScKoopatlas_c::instance->levelInfo;
+
+ dLevelInfo_c::entry_s *infEntry = levelInfo->search(
+ nodeForHeader->levelNumber[0], nodeForHeader->levelNumber[1]);
+
+ if (infEntry == 0) {
+ LevelName->SetString(L"Unknown Level Name!");
+ LevelNameS->SetString(L"Unknown Level Name!");
+ return;
+ }
+
+ // LEVEL NAME
+ wchar_t convertedLevelName[100];
+ const char *sourceLevelName = levelInfo->getNameForLevel(infEntry);
+ int charCount = 0;
+
+ while (*sourceLevelName != 0 && charCount < 99) {
+ convertedLevelName[charCount] = *sourceLevelName;
+ sourceLevelName++;
+ charCount++;
+ }
+ convertedLevelName[charCount] = 0;
+
+ LevelName->SetString(convertedLevelName);
+ LevelNameS->SetString(convertedLevelName);
+
+ // LEVEL NUMBER
+ wchar_t levelNumber[6];
+ levelNumber[0] = '0' + nodeForHeader->levelNumber[0];
+ levelNumber[1] = '-';
+ if (nodeForHeader->levelNumber[1] >= 10) {
+ levelNumber[2] = '0' + (nodeForHeader->levelNumber[1] / 10);
+ levelNumber[3] = '0' + (nodeForHeader->levelNumber[1] % 10);
+ levelNumber[4] = 0;
+ } else {
+ levelNumber[2] = '0' + nodeForHeader->levelNumber[1];
+ levelNumber[3] = 0;
+ }
+
+ LevelNumber->SetString(levelNumber);
+ LevelNumberS->SetString(levelNumber);
+
+ // INFO
+ int w = nodeForHeader->levelNumber[0] - 1;
+ int l = nodeForHeader->levelNumber[1] - 1;
+
+ u32 conds = GetSaveFile()->GetBlock(-1)->GetLevelCondition(w, l);
+ NormalExitFlag->SetVisible(conds & COND_NORMAL);
+ SecretExitFlag->SetVisible(conds & COND_SECRET);
+ StarCoinOn[0]->SetVisible(conds & COND_COIN1);
+ StarCoinOn[1]->SetVisible(conds & COND_COIN2);
+ StarCoinOn[2]->SetVisible(conds & COND_COIN3);
+
+ // SIZE THING
+ nw4r::ut::TextWriter tw;
+ tw.font = LevelName->font;
+ tw.SetFontSize(LevelName->fontSizeX, LevelName->fontSizeY);
+ tw.lineSpace = LevelName->lineSpace;
+ tw.charSpace = LevelName->charSpace;
+ if (LevelName->tagProc != 0)
+ tw.tagProcessor = LevelName->tagProc;
+
+ float width = tw.CalcStringWidth(convertedLevelName, charCount);
+ Header_Centre->size.x = width + LevelName->trans.x - 20.0f;
+ Header_Right->trans.x = Header_Centre->size.x;
+}
+
+
+
+void dWMHud_c::enteredNode() {
+ dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
+
+ if (node->type == dKPNode_s::LEVEL) {
+ willShowHeader = true;
+ nodeForHeader = node;
+ }
+}
+
+void dWMHud_c::leftNode() {
+ if (layout.grpHandlers[SHOW_HEADER].frameCtrl.currentFrame > 0.1f) {
+ // not hidden
+
+ if ((layout.isAnimOn(SHOW_HEADER) && (layout.grpHandlers[SHOW_HEADER].frameCtrl.flags & 2))
+ || (!layout.isAnimOn(SHOW_HEADER))) {
+ // currently being shown, OR fully shown already
+ playHideHeaderAnim();
+ }
+ }
}
+
+
+
diff --git a/src/koopatlas/hud.h b/src/koopatlas/hud.h
index 87f731b..632a078 100644
--- a/src/koopatlas/hud.h
+++ b/src/koopatlas/hud.h
@@ -19,11 +19,25 @@ class dWMHud_c : public dBase_c {
static dWMHud_c *instance;
- bool showingHeader;
-
+ void enteredNode();
+ void leftNode();
+ private:
void playShowHeaderAnim();
void playHideHeaderAnim();
+ void loadHeaderInfo();
+
+ bool willShowHeader;
+ dKPNode_s *nodeForHeader;
+
+
+ nw4r::lyt::Picture *Header_Centre, *Header_Right;
+ nw4r::lyt::Picture *NormalExitFlag, *SecretExitFlag;
+ nw4r::lyt::Picture *StarCoinOn[3];
+ nw4r::lyt::TextBox *LevelName, *LevelNameS;
+ nw4r::lyt::TextBox *LevelNumber, *LevelNumberS;
+ nw4r::lyt::TextBox *WorldName, *WorldNameS;
+ nw4r::lyt::TextBox *StarCoinCounter;
};
#endif
diff --git a/src/koopatlas/starcoin.cpp b/src/koopatlas/starcoin.cpp
index d4bdbd8..3842f87 100644
--- a/src/koopatlas/starcoin.cpp
+++ b/src/koopatlas/starcoin.cpp
@@ -326,10 +326,10 @@ void dWMStarCoin::setText(const char *str, const char *name) {
nw4r::ut::TextWriter tw;
tw.font = box->font;
tw.SetFontSize(box->fontSizeX, box->fontSizeY);
- tw.somethingRelatedToLineHeight = box->lineSpace;
+ tw.lineSpace = box->lineSpace;
tw.charSpace = box->charSpace;
if (box->tagProc != 0)
- tw.tagProcessorMaybe = box->tagProc;
+ tw.tagProcessor = box->tagProc;
float width = tw.CalcStringWidth(newString, wlength);
SpammyReport("Text width: %f\n", width);