summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xinclude/game.h120
-rw-r--r--include/newer.h1
-rw-r--r--kamek_pal.x10
-rw-r--r--src/koopatlas/core.h2
-rw-r--r--src/koopatlas/hud.cpp433
-rw-r--r--src/koopatlas/hud.h32
-rw-r--r--src/koopatlas/pathmanager.cpp23
-rw-r--r--src/koopatlas/pathmanager.h2
-rw-r--r--src/koopatlas/shop.cpp22
-rw-r--r--src/koopatlas/starcoin.cpp26
-rw-r--r--src/newer.cpp21
11 files changed, 309 insertions, 383 deletions
diff --git a/include/game.h b/include/game.h
index 169b01d..2dc64a6 100755
--- a/include/game.h
+++ b/include/game.h
@@ -505,6 +505,20 @@ namespace lyt {
class Group;
class GroupContainer;
+ namespace detail {
+ class TexCoordAry {
+ public:
+ TexCoordAry();
+ void Free();
+ void Reserve(u8 count);
+ void SetSize(u8 count);
+ void Copy(const void *source, u8 count);
+
+ u8 reservedSize, usedSize;
+ void *data;
+ };
+ }
+
class Layout {
public:
Layout();
@@ -636,11 +650,17 @@ namespace lyt {
u8 flag;
char name[0x11];
- char userdata[8];
+ char userdata[9];
- u8 _D5;
u8 paneIsOwnedBySomeoneElse;
u8 _D7;
+
+ void SetVisible(bool value) {
+ if (value)
+ flag |= 1;
+ else
+ flag &= ~1;
+ }
};
class TextBox : public Pane {
@@ -657,7 +677,7 @@ namespace lyt {
uchar GetVtxColorElement(ulong id) const;
void SetVtxColorElement(ulong id, uchar value);
- virtual void LoadMtx(const DrawInfo &info);
+ void LoadMtx(const DrawInfo &info);
virtual void AllocStringBuffer(u16 size);
virtual void FreeStringBuffer();
@@ -681,6 +701,26 @@ namespace lyt {
u8 alignment;
u8 flags;
};
+
+ class Picture : public Pane {
+ public:
+ Picture(void *, void *); // todo: Picture((res::Picture const *,ResBlockSet const &))
+ ~Picture();
+
+ void *GetRuntimeTypeInfo() const;
+
+ void DrawSelf(const DrawInfo &info);
+
+ ut::Color GetVtxColor(ulong id) const;
+ void SetVtxColor(ulong id, ut::Color color);
+ uchar GetVtxColorElement(ulong id) const;
+ void SetVtxColorElement(ulong id, uchar value);
+
+ virtual void Append(const GXTexObj &obj);
+
+ ut::Color colours[4];
+ detail::TexCoordAry texCoords;
+ };
}
@@ -2482,7 +2522,10 @@ namespace nw4r {
void SetupGXWithColorMapping(Color c1, Color c2);
public:
- Color colors[8]; // todo: document
+ Color minColMapping, maxColMapping;
+ Color vtxColours[4];
+ Color topColour, bottomColour;
+
u32 modeOfSomeKind;
float scaleX;
float scaleY;
@@ -2517,12 +2560,12 @@ namespace nw4r {
bool IsDrawFlagSet(ulong, ulong) const;
- float _4C;
+ float widthLimit;
float charSpace;
- float somethingRelatedToLineHeight;
- u32 _58;
+ float lineSpace;
+ u32 tabWidth;
u32 drawFlag;
- void *tagProcessorMaybe;
+ void *tagProcessor;
};
}
}
@@ -2662,7 +2705,7 @@ namespace m2d {
nw4r::lyt::Pane *getRootPane();
nw4r::lyt::Pane *findPaneByName(const char *name) const;
nw4r::lyt::TextBox *findTextBoxByName(const char *name) const;
- nw4r::lyt::Pane *findPictureByName(const char *name) const; // TODO: change to others
+ nw4r::lyt::Picture *findPictureByName(const char *name) const;
nw4r::lyt::Pane *findWindowByName(const char *name) const;
void animate();
@@ -2700,10 +2743,10 @@ namespace m2d {
// does NSMBW even use consts? I have no idea. maybe not
- void getPanes(const char **names, nw4r::lyt::Pane *output, int count) const;
- void getWindows(const char **names, nw4r::lyt::Pane *output, int count) const; // TODO: change to others
- void getPictures(const char **names, nw4r::lyt::Pane *output, int count) const;
- void getTextBoxes(const char **names, nw4r::lyt::TextBox *output, int count) const;
+ void getPanes(const char **names, nw4r::lyt::Pane **output, int count) const;
+ void getWindows(const char **names, nw4r::lyt::Pane **output, int count) const; // TODO: change to others
+ void getPictures(const char **names, nw4r::lyt::Picture **output, int count) const;
+ void getTextBoxes(const char **names, nw4r::lyt::TextBox **output, int count) const;
void setLangStrings(const char **names, const int *msgIDs, int category, int count);
@@ -3067,6 +3110,57 @@ namespace mHeap {
};
void WriteNumberToTextBox(int *number, const int *fieldLength, nw4r::lyt::TextBox *textBox, bool unk); // 800B3B60
+
+namespace EGG {
+ class MsgRes {
+ private:
+ const u8 *bmg, *INF1, *DAT1, *STR1, *MID1, *FLW1, *FLI1;
+ public:
+ MsgRes(const u8 *bmgFile, u32 unusedParam); // 802D7970
+ virtual ~MsgRes();
+
+ static void parseFormatCode(wchar_t initialTag, const wchar_t *string, u8 *outArgsSize, u32 *outCmd, const wchar_t **args); // 802D7B10
+
+ const wchar_t *findStringForMessageID(int category, int message) const; // 0x802D7B50
+
+ private:
+ void setBMG(const u8 *ptr); // 802D7B90
+ void setINF(const u8 *ptr); // 802D7BA0
+ void setDAT(const u8 *ptr); // 802D7BB0
+ void setSTR(const u8 *ptr); // 802D7BC0
+ void setMID(const u8 *ptr); // 802D7BD0
+ void setFLW(const u8 *ptr); // 802D7BE0
+ void setFLI(const u8 *ptr); // 802D7BF0
+ int identifySectionByMagic(u32 magic) const; // 802D7C00
+
+ protected:
+ struct INFEntry {
+ u32 stringOffset;
+ };
+ const INFEntry *findINFForMessageID(int category, int message) const; // 802D7C90
+ u32 getEntryFromMID(int index) const; // 802D7D70
+ };
+}
+namespace dScript {
+ class Res_c : public EGG::MsgRes {
+ public:
+ Res_c(const u8 *bmgFile, u32 unusedParam); // 800CE7F0
+ ~Res_c();
+
+ u16 getCharScaleForMessageID(int category, int message) const; // 800CE890
+ u8 getFontIDForMessageID(int category, int message) const; // 800CE8C0
+ };
+}
+class MessageClass {
+ public:
+ dDvdLoader_c loader;
+ void *rawBmgPointer;
+ dScript::Res_c *msgRes;
+};
+
+dScript::Res_c *GetBMG(); // 800CDD50
+void WriteBMGToTextBox(nw4r::lyt::TextBox *textBox, dScript::Res_c *res, int category, int message, int argCount, ...); // 0x800C9B50
+
extern "C" dAc_Py_c* GetSpecificPlayerActor(int number);
extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer);
extern "C" dStageActor_c *Actor_SearchByID(u32 actorID);
diff --git a/include/newer.h b/include/newer.h
index 4f34f81..d98f290 100644
--- a/include/newer.h
+++ b/include/newer.h
@@ -27,5 +27,6 @@ enum NWRWorld {
NWRWorld NewerWorldForLevelID(int world, int level);
const wchar_t *NewerWorldName(NWRWorld world);
+int getStarCoinCount();
#endif /* NEWER_H */
diff --git a/kamek_pal.x b/kamek_pal.x
index 02bc004..169d0b4 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -734,9 +734,15 @@ SECTIONS {
findTextBoxByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x80007320;
findPictureByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x800073D0;
findWindowByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x80007470;
+
__ct__Q23m2d13EmbedLayout_cFv = 0x800C89A0;
__dt__Q23m2d13EmbedLayout_cFv = 0x800C89F0;
loadArc__Q23m2d13EmbedLayout_cFPCcb = 0x800C8D00;
+ getPanes__Q23m2d13EmbedLayout_cCFPPCcPPQ34nw4r3lyt4Panei = 0x800C8E50;
+ getWindows__Q23m2d13EmbedLayout_cCFPPCcPPQ34nw4r3lyt6Windowi = 0x800C8EC0;
+ getPictures__Q23m2d13EmbedLayout_cCFPPCcPPQ34nw4r3lyt7Picturei = 0x800C8F30;
+ getTextBoxes__Q23m2d13EmbedLayout_cCFPPCcPPQ34nw4r3lyt7TextBoxi = 0x800C8FA0;
+ setLangStrings__Q23m2d13EmbedLayout_cFPPCcPCiii = 0x800C9010;
loadAnimations__Q23m2d13EmbedLayout_cFPPCci = 0x800C90A0;
loadGroups__Q23m2d13EmbedLayout_cFPPCcPii = 0x800C91E0;
enableNonLoopAnim__Q23m2d13EmbedLayout_cFib = 0x800C93E0;
@@ -747,7 +753,11 @@ SECTIONS {
isAnyAnimOn__Q23m2d13EmbedLayout_cFv = 0x800C9730;
free__Q23m2d13EmbedLayout_cFv = 0x800C9A20;
execAnimations__Q23m2d13EmbedLayout_cFv = 0x800C9650;
+
attachArc__Q23m2d8ResAcc_cFPvPCc = 0x801637A0;
+
+ setSpeed__Q23m2d11FrameCtrl_cFf = 0x80163920;
+
scheduleForDrawing__Q23m2d6Base_cFv = 0x80163990;
RenderEffects__Fii = 0x80093F10;
diff --git a/src/koopatlas/core.h b/src/koopatlas/core.h
index 2a69927..41fba45 100644
--- a/src/koopatlas/core.h
+++ b/src/koopatlas/core.h
@@ -18,7 +18,7 @@
#include "koopatlas/pathmanager.h"
#define WM_DEBUGGING
-// #define WM_SPAMMY_DEBUGGING
+#define WM_SPAMMY_DEBUGGING
#ifdef WM_DEBUGGING
#define MapReport OSReport
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
index 3989a1c..cd52beb 100644
--- a/src/koopatlas/hud.cpp
+++ b/src/koopatlas/hud.cpp
@@ -1,28 +1,5 @@
#include "koopatlas/hud.h"
-void CharToWChar(const char *input, wchar_t *output, int length) { for (int i = 0; i < length; i++) output[i] = input[i]; }
-
-int getStarCoinCount() {
-
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
- int coinsSpent = save->credits_hiscore;
- int coinsEarned = 0;
-
- for (int w = 0; w < 10; w++) {
- for (int l = 0; l < 10; l++) {
- u32 conds = save->GetLevelCondition(w, l);
-
- if (conds & COND_COIN1) { coinsEarned++; }
- if (conds & COND_COIN2) { coinsEarned++; }
- if (conds & COND_COIN3) { coinsEarned++; }
- }
- }
-
- int coinsLeft = coinsEarned - coinsSpent;
- return coinsLeft;
-}
-
-
dWMHud_c *dWMHud_c::instance = 0;
dWMHud_c *dWMHud_c::build() {
@@ -39,25 +16,19 @@ dWMHud_c::dWMHud_c() {
layoutLoaded = false;
}
+enum WMHudAnimation {
+ SHOW_LIVES = 0,
+ SHOW_HEADER,
+ SHOW_FOOTER
+};
-// TODO: Need to define these in a better way, somehow
-#define ANIM_BUTTON_1 0
-#define ANIM_BUTTON_2 1
-#define ANIM_BOTTOM_SHOW 2
-#define ANIM_BOTTOM_HIDE 3
-#define ANIM_TOP_SHOW 4
-#define ANIM_TOP_HIDE 5
int dWMHud_c::onCreate() {
if (!layoutLoaded) {
- bool gotFile = layout.loadArc("maphud.arc", false);
+ bool gotFile = layout.loadArc("MapHUD.arc", false);
if (!gotFile)
return false;
- //static const char *brlanNames[3] = {"maphud_hitbutton.brlan", "maphud_in.brlan", "maphud_out.brlan"};
- static const char *brlanNames[5] = {"maphud_hitbutton.brlan", "bottom_in.brlan", "bottom_out.brlan", "top_in.brlan", "top_out.brlan"};
- static const char *groupNames[6] = {"B01_Button", "B02_Button", "A00_Window", "A00_Window", "A01_Window", "A01_Window"};
-
bool output = layout.build("maphud.brlyt");
if (!IsWideScreen()) {
@@ -70,19 +41,41 @@ int dWMHud_c::onCreate() {
layout.layout.rootPane->scale.y = 0.7711f;
}
- layout.loadAnimations(brlanNames, 5);
- layout.loadGroups(groupNames, (int[6]){0, 0, 1, 2, 3, 4}, 6);
+ static const char *brlanNames[2] = {"MapHUD_ShowMain.brlan", "MapHUD_ShowHeader.brlan"};
+ static const char *groupNames[3] = {"G_Lives", "G_Header", "G_Footer"};
+
+ layout.loadAnimations(brlanNames, 2);
+ layout.loadGroups(groupNames, (int[3]){0, 1, 0}, 3);
layout.disableAllAnimations();
- layout.enableNonLoopAnim(ANIM_BOTTOM_SHOW);
- hidePointBar();
- setWorldText(" ");
- setWorldName();
+ layout.enableNonLoopAnim(SHOW_LIVES);
+ layout.enableNonLoopAnim(SHOW_FOOTER);
+ layout.resetAnim(SHOW_HEADER);
+
+ 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);
- if (dScKoopatlas_c::instance->pathManager.mustComplainToMapCreator)
- dWMHud_c::instance->setLevelText("Please Fix Your Missing Entrance. Thanks");
+ static const char *textBoxNames[7] = {
+ "LevelName", "LevelNameS",
+ "LevelNumber", "LevelNumberS",
+ "WorldName", "WorldNameS",
+ "StarCoinCounter"
+ };
+ layout.getTextBoxes(textBoxNames, &LevelName, 7);
layoutLoaded = true;
+
+ willShowHeader = false;
+
+ if (!dScKoopatlas_c::instance->pathManager.isMoving)
+ enteredNode();
}
return true;
@@ -90,15 +83,22 @@ int dWMHud_c::onCreate() {
int dWMHud_c::onDelete() {
+ if (!layoutLoaded)
+ return true;
+
return layout.free();
}
int dWMHud_c::onExecute() {
- updateLives();
- setWorldName();
- checkPointStatus();
- setPointName();
+ if (!layoutLoaded)
+ return true;
+
+ if (willShowHeader && (!(layout.isAnimOn(SHOW_HEADER)))) {
+ willShowHeader = false;
+ loadHeaderInfo();
+ playShowHeaderAnim();
+ }
layout.execAnimations();
layout.update();
@@ -108,303 +108,124 @@ int dWMHud_c::onExecute() {
int dWMHud_c::onDraw() {
+ if (!layoutLoaded)
+ return true;
+
layout.scheduleForDrawing();
return true;
}
-void dWMHud_c::updateLives() {
-
- static const char *textID[4] = {"M", "L", "B", "Y"};
- static const char *picID[4] = {"P_mariopic", "P_luigipic", "P_toadBlue", "P_toadyellow"};
-
- for (int i = 0; i < 4; i++) {
-
- char boxName [13];
- sprintf(boxName, "T_%slifes_01", textID[i]);
- nw4r::lyt::TextBox *box = layout.findTextBoxByName(boxName);
- nw4r::lyt::Pane *pic = layout.findPictureByName(picID[i]);
-
- if (Player_Active[i] != 0) {
- box->alpha = 0xFF;
- pic->alpha = 0xFF;
-
- char lives [3];
- sprintf(lives, "%02d", Player_Lives[Player_ID[i]]);
- const char *loaves = lives;
- wchar_t life;
-
- CharToWChar(loaves, &life, 3);
-
- box->SetString(&life);
- }
- else {
- box->alpha = 0;
- pic->alpha = 0;
- }
- }
-
- nw4r::lyt::TextBox *coinbox = layout.findTextBoxByName("T_coin_count_01");
-
- char stars [4];
- int starCoinCount = getStarCoinCount();
- sprintf(stars, "%03d", starCoinCount);
- const char *scoins = stars;
- wchar_t wcoins;
-
- CharToWChar(scoins, &wcoins, 4);
-
- coinbox->SetString(&wcoins);
-}
-
-void dWMHud_c::setLevelText(const char *str, int length) {
- if (str == 0) {
- setLevelText("--NULL STRING--");
- return;
- }
-
- if (length == -1) {
- length = strlen(str);
- }
-
- wchar_t newString[128];
-
- int i;
- for (i = 0; i < length && i < 128; i++) {
- newString[i] = str[i];
- }
- newString[i] = 0;
-
- setLevelText(newString, i);
-}
-
-void dWMHud_c::setLevelText(const wchar_t *str, int length) {
- if (str == 0) {
- setLevelText("--NULL STRING--");
- return;
- }
-
- if (length == -1) {
- length = wcslen(str);
- }
-
- nw4r::lyt::TextBox *box = layout.findTextBoxByName("T_levelname_01");
-
- nw4r::ut::TextWriter tw;
- tw.font = box->font;
- tw.SetFontSize(box->fontSizeX, box->fontSizeY);
- tw.somethingRelatedToLineHeight = box->lineSpace;
- tw.charSpace = box->charSpace;
- if (box->tagProc != 0)
- tw.tagProcessorMaybe = box->tagProc;
-
- float width = tw.CalcStringWidth(str, length);
- SpammyReport("Text width: %f\n", width);
- layout.findWindowByName("W_levelname")->size.x = width + 22;
- layout.findPictureByName("P_topleftboxbg")->size.x = width;
- layout.findPictureByName("P_topthinboxbg")->size.x = 597 - width;
- box->SetString(str);
+void dWMHud_c::playShowHeaderAnim() {
+ layout.enableNonLoopAnim(SHOW_HEADER);
}
-
-void dWMHud_c::setPointName() {
- // figure this out...
- dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
-
- if (node->type == dKPNode_s::LEVEL) {
- dLevelInfo_c *li = &dScKoopatlas_c::instance->levelInfo;
- dLevelInfo_c::entry_s *entry = li->search(node->levelNumber[0] - 1, node->levelNumber[1] - 1);
-
- setLevelText(li->getNameForLevel(entry));
- } else {
- setLevelText(" ");
- hidePointBar();
+void dWMHud_c::playHideHeaderAnim() {
+ if (!layout.isAnimOn(SHOW_HEADER)) {
+ layout.enableNonLoopAnim(SHOW_HEADER, true);
}
+ layout.grpHandlers[SHOW_HEADER].frameCtrl.flags = 3; // NO_LOOP | REVERSE
}
-void dWMHud_c::checkPointStatus() {
- dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
-
- if ((node->type == dKPNode_s::LEVEL) && ((node->levelNumber[1] < 30) || (node->levelNumber[1] > 37))) {
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
-
- int world = node->levelNumber[0];
- int level = node->levelNumber[1];
-
- u32 conds = save->GetLevelCondition(world-1, level-1);
- nw4r::lyt::Pane *pic;
-
- if (conds & COND_COIN1) {
- pic = layout.findPictureByName("P_coin_on_01");
- pic->alpha = 0xFF;
-
- pic = layout.findPictureByName("P_coin_off_01");
- pic->alpha = 0;
- }
- else {
- pic = layout.findPictureByName("P_coin_on_01");
- pic->alpha = 0;
-
- pic = layout.findPictureByName("P_coin_off_01");
- pic->alpha = 0xFF;
- }
-
- if (conds & COND_COIN2) {
- pic = layout.findPictureByName("P_coin_on_02");
- pic->alpha = 0xFF;
-
- pic = layout.findPictureByName("P_coin_off_02");
- pic->alpha = 0;
- }
- else {
- pic = layout.findPictureByName("P_coin_on_02");
- pic->alpha = 0;
-
- pic = layout.findPictureByName("P_coin_off_02");
- pic->alpha = 0xFF;
- }
-
- if (conds & COND_COIN3) {
- pic = layout.findPictureByName("P_coin_on_03");
- pic->alpha = 0xFF;
-
- pic = layout.findPictureByName("P_coin_off_03");
- pic->alpha = 0;
- }
- else {
- pic = layout.findPictureByName("P_coin_on_03");
- pic->alpha = 0;
-
- pic = layout.findPictureByName("P_coin_off_03");
- pic->alpha = 0xFF;
- }
-
- if (conds & COND_NORMAL) {
- pic = layout.findPictureByName("P_normalexitflag");
- pic->alpha = 0xFF;
- }
- else {
- pic = layout.findPictureByName("P_normalexitflag");
- pic->alpha = 0;
- }
-
- if (conds & COND_SECRET) {
- pic = layout.findPictureByName("P_secretexitflag");
- pic->alpha = 0xFF;
- }
- else {
- pic = layout.findPictureByName("P_secretexitflag");
- pic->alpha = 0;
- }
-
- u8 deaths = save->death_counts[world-1][level-1];
- nw4r::lyt::TextBox *deathbox = layout.findTextBoxByName("T_death_01");
- char die [4];
- sprintf(die, "%03d", deaths);
- const char *dies = die;
- wchar_t wdie;
- CharToWChar(dies, &wdie, 4);
- deathbox->SetString(&wdie);
-
- } else {
- nw4r::lyt::Pane *pic;
-
- static const char *picNames[8] = {"P_coin_on_01", "P_coin_off_01", "P_coin_on_02", "P_coin_off_02",
- "P_coin_on_03", "P_coin_off_03", "P_normalexitflag", "P_secretexitflag"};
-
- for (int i = 0; i < 8; i++) {
- pic = layout.findPictureByName(picNames[i]);
- pic->alpha = 0;
- }
+void dWMHud_c::loadHeaderInfo() {
+ dLevelInfo_c *levelInfo = &dScKoopatlas_c::instance->levelInfo;
- nw4r::lyt::TextBox *deathbox = layout.findTextBoxByName("T_death_01");
- wchar_t noDie;
- CharToWChar("---", &noDie, 4);
- deathbox->SetString(&noDie);
- }
-}
+ dLevelInfo_c::entry_s *infEntry = levelInfo->search(
+ nodeForHeader->levelNumber[0]-1, nodeForHeader->levelNumber[1]-1);
-void dWMHud_c::setWorldText(const char *str, int length) {
- if (str == 0) {
- setWorldText("--NULL STRING--");
+ if (infEntry == 0) {
+ LevelName->SetString(L"Unknown Level Name!");
+ LevelNameS->SetString(L"Unknown Level Name!");
return;
}
- if (length == -1) {
- length = strlen(str);
+ // 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;
}
- wchar_t newString[128];
+ LevelNumber->SetString(levelNumber);
+ LevelNumberS->SetString(levelNumber);
- int i;
- for (i = 0; i < length && i < 128; i++) {
- newString[i] = str[i];
- }
- newString[i] = 0;
+ // INFO
+ int w = nodeForHeader->levelNumber[0] - 1;
+ int l = nodeForHeader->levelNumber[1] - 1;
- setWorldText(newString, i);
-}
-
-void dWMHud_c::setWorldText(const wchar_t *str, int length) {
- if (str == 0) {
- setWorldText("--NULL STRING--");
- return;
- }
-
- if (length == -1) {
- length = wcslen(str);
- }
-
- nw4r::lyt::TextBox *box = layout.findTextBoxByName("T_area_01");
+ 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 = box->font;
- tw.SetFontSize(box->fontSizeX, box->fontSizeY);
- tw.somethingRelatedToLineHeight = box->lineSpace;
- tw.charSpace = box->charSpace;
- if (box->tagProc != 0)
- tw.tagProcessorMaybe = box->tagProc;
+ 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(str, length);
- SpammyReport("Text width: %f\n", width);
-
- box->SetString(str);
+ float width = tw.CalcStringWidth(convertedLevelName, charCount);
+ float totalWidth = width + LevelName->trans.x - 20.0f;
+ if (totalWidth < 270.0f)
+ totalWidth = 270.0f;
+ Header_Centre->size.x = totalWidth;
+ Header_Right->trans.x = totalWidth;
}
-void dWMHud_c::setWorldName() {
- // figure this out...
- dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
- if (node->type == dKPNode_s::LEVEL) {
- int world = node->levelNumber[0];
- int level = node->levelNumber[1];
- setWorldText(NewerWorldName(NewerWorldForLevelID(world, level)));
- }
-}
-
-void dWMHud_c::showPointBar() {
- dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
+void dWMHud_c::enteredNode(dKPNode_s *node) {
+ if (node == 0)
+ node = dScKoopatlas_c::instance->pathManager.currentNode;
if (node->type == dKPNode_s::LEVEL) {
- isPointBarShown = true;
-
- layout.enableNonLoopAnim(ANIM_TOP_SHOW);
+ willShowHeader = true;
+ nodeForHeader = node;
}
}
+void dWMHud_c::leftNode() {
+ if (layout.grpHandlers[SHOW_HEADER].frameCtrl.currentFrame > 0.1f) {
+ // not hidden
-void dWMHud_c::hidePointBar() {
- if (isPointBarShown) {
- isPointBarShown = false;
-
- layout.enableNonLoopAnim(ANIM_TOP_HIDE);
+ 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 347fcb4..6f10169 100644
--- a/src/koopatlas/hud.h
+++ b/src/koopatlas/hud.h
@@ -15,25 +15,29 @@ class dWMHud_c : public dBase_c {
bool layoutLoaded;
m2d::EmbedLayout_c layout;
- void updateLives();
+ static dWMHud_c *build();
+ static dWMHud_c *instance;
- void showPointBar();
- void hidePointBar();
- void setPointName();
- void checkPointStatus();
- void setLevelText(const char *str, int length = -1);
- void setLevelText(const wchar_t *str, int length = -1);
+ void enteredNode(dKPNode_s *node = 0);
+ void leftNode();
- void setWorldName();
- void setWorldText(const char *str, int length = -1);
- void setWorldText(const wchar_t *str, int length = -1);
+ private:
+ void playShowHeaderAnim();
+ void playHideHeaderAnim();
+ void loadHeaderInfo();
- static dWMHud_c *build();
- static dWMHud_c *instance;
+ bool willShowHeader;
+ dKPNode_s *nodeForHeader;
- private:
- bool isPointBarShown;
+
+ 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/pathmanager.cpp b/src/koopatlas/pathmanager.cpp
index d329c6d..9525732 100644
--- a/src/koopatlas/pathmanager.cpp
+++ b/src/koopatlas/pathmanager.cpp
@@ -336,10 +336,12 @@ void dWMPathManager_c::execute() {
void dWMPathManager_c::startMovementTo(dKPPath_s *path) {
SpammyReport("moving to path %p\n", path);
- dWMHud_c::instance->hidePointBar();
- SpammyReport("point bar hidden\n");
if (!path->isAvailable) { return; }
+ if (currentNode)
+ dWMHud_c::instance->leftNode();
+
+ calledEnteredNode = false;
SpammyReport("a\n");
isMoving = true;
@@ -534,6 +536,18 @@ void dWMPathManager_c::moveThroughPath() {
player->pos.x += move.x;
player->pos.y -= move.y;
+ // what distance is left?
+ if (to->type == dKPNode_s::LEVEL && !calledEnteredNode) {
+ Vec toEndVec = {to->x - player->pos.x, to->y + player->pos.y, 0.0f};
+ float distToEnd = VECMag(&toEndVec);
+ //OSReport("Distance: %f; To:%d,%d; Player:%f,%f; Diff:%f,%f\n", distToEnd, to->x, to->y, player->pos.x, player->pos.y, toEndVec.x, toEndVec.y);
+
+ if (distToEnd < 64.0f) {
+ calledEnteredNode = true;
+ dWMHud_c::instance->enteredNode(to);
+ }
+ }
+
// Check if we've reached the end yet
if (
((move.x > 0) ? (player->pos.x >= to->x) : (player->pos.x <= to->x)) &&
@@ -603,6 +617,8 @@ void dWMPathManager_c::moveThroughPath() {
SaveBlock *save = GetSaveFile()->GetBlock(-1);
save->current_path_node = pathLayer->findNodeID(to);
+ if (!calledEnteredNode)
+ dWMHud_c::instance->enteredNode();
if (to->type == dKPNode_s::LEVEL) {
NWRWorld nWorld = NewerWorldForLevelID(to->levelNumber[0], to->levelNumber[1]);
@@ -610,9 +626,6 @@ void dWMPathManager_c::moveThroughPath() {
save->currentNewerWorld = (u8)nWorld;
}
}
-
- dWMHud_c::instance->showPointBar();
- SpammyReport("Point bar shown\n");
} else {
startMovementTo(to->getOppositeAvailableExitTo(currentPath));
SpammyReport("passthrough node, continuing to next path\n");
diff --git a/src/koopatlas/pathmanager.h b/src/koopatlas/pathmanager.h
index e010aa4..cae96ba 100644
--- a/src/koopatlas/pathmanager.h
+++ b/src/koopatlas/pathmanager.h
@@ -51,6 +51,8 @@ class dWMPathManager_c {
bool evaluateUnlockCondition(u8 *&in, SaveBlock *save, int stack);
bool isEnteringLevel;
+
+ bool calledEnteredNode;
};
#endif
diff --git a/src/koopatlas/shop.cpp b/src/koopatlas/shop.cpp
index eed0222..29a96b0 100644
--- a/src/koopatlas/shop.cpp
+++ b/src/koopatlas/shop.cpp
@@ -1,26 +1,6 @@
#include "koopatlas/shop.h"
-int getStarCoinCountShop() {
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
- int coinsSpent = save->credits_hiscore;
- int coinsEarned = 0;
-
- for (int w = 0; w < 10; w++) {
- for (int l = 0; l < 10; l++) {
- u32 conds = save->GetLevelCondition(w, l);
-
- if (conds & COND_COIN1) { coinsEarned++; }
- if (conds & COND_COIN2) { coinsEarned++; }
- if (conds & COND_COIN3) { coinsEarned++; }
- }
- }
-
- int coinsLeft = coinsEarned - coinsSpent;
- return coinsLeft;
-}
-
-
const char* Produce[10][4] = {
{ "I_kinoko", "g3d/I_kinoko.brres", "I_kinoko", "wait2" },
{ "I_fireflower", "g3d/I_fireflower.brres", "I_fireflower", "wait2" },
@@ -373,7 +353,7 @@ void dWMShop_c::BuyItem(int item) {
layout.enableNonLoopAnim(item-1);
- int cash = getStarCoinCountShop();
+ int cash = getStarCoinCount();
int cost;
int Powerups[10];
diff --git a/src/koopatlas/starcoin.cpp b/src/koopatlas/starcoin.cpp
index 54b7218..3842f87 100644
--- a/src/koopatlas/starcoin.cpp
+++ b/src/koopatlas/starcoin.cpp
@@ -1,26 +1,6 @@
#include "koopatlas/starcoin.h"
#include <game.h>
-int getStarCoinCountCoins() {
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
- int coinsSpent = save->credits_hiscore;
- int coinsEarned = 0;
-
- for (int w = 0; w < 10; w++) {
- for (int l = 0; l < 10; l++) {
- u32 conds = save->GetLevelCondition(w, l);
-
- if (conds & COND_COIN1) { coinsEarned++; }
- if (conds & COND_COIN2) { coinsEarned++; }
- if (conds & COND_COIN3) { coinsEarned++; }
- }
- }
-
- int coinsLeft = coinsEarned - coinsSpent;
- return coinsLeft;
-}
-
-
/*****************************************************************************/
// Starcoin Layout
//
@@ -227,7 +207,7 @@ void dWMStarCoin::LoadCoinsForWorld(int world) {
// Display Total Star Coin Count
- int myCoins = getStarCoinCountCoins();
+ int myCoins = getStarCoinCount();
char myCoinsStr [4];
sprintf(myCoinsStr, "%03d", myCoins);
@@ -346,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);
diff --git a/src/newer.cpp b/src/newer.cpp
index 6d672e2..2bad8a0 100644
--- a/src/newer.cpp
+++ b/src/newer.cpp
@@ -1,4 +1,5 @@
#include <newer.h>
+#include <game.h>
NWRWorld NewerWorldForLevelID(int w, int l) {
switch (w) {
@@ -75,3 +76,23 @@ const wchar_t *NewerWorldName(NWRWorld world) {
return L"Unknown World";
return NewerWorldNames[world];
}
+
+
+int getStarCoinCount() {
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+ int coinsSpent = save->credits_hiscore;
+ int coinsEarned = 0;
+
+ for (int w = 0; w < 10; w++) {
+ for (int l = 0; l < 10; l++) {
+ u32 conds = save->GetLevelCondition(w, l);
+
+ if (conds & COND_COIN1) { coinsEarned++; }
+ if (conds & COND_COIN2) { coinsEarned++; }
+ if (conds & COND_COIN3) { coinsEarned++; }
+ }
+ }
+
+ int coinsLeft = coinsEarned - coinsSpent;
+ return coinsLeft;
+}