summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Noga <Tempus@chronometry.ca>2012-07-17 18:55:15 -0500
committerColin Noga <Tempus@chronometry.ca>2012-07-17 18:55:15 -0500
commitd2f76bb1313364397135c93c37672e57b50fb0a2 (patch)
tree8d49cd2235bfc635aa5dba5b8f2cee5c907c12e9
parent5ad897fb987c7e80ac948cf080122a0081a255de (diff)
downloadkamek-d2f76bb1313364397135c93c37672e57b50fb0a2.tar.gz
kamek-d2f76bb1313364397135c93c37672e57b50fb0a2.zip
Map fixes: HUD now reflects map status, Mario model reflects powerup
-rw-r--r--src/koopatlas/core.cpp25
-rw-r--r--src/koopatlas/hud.cpp275
-rw-r--r--src/koopatlas/hud.h11
-rw-r--r--src/koopatlas/player.cpp1
4 files changed, 287 insertions, 25 deletions
diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp
index 4a0d190..eefde51 100644
--- a/src/koopatlas/core.cpp
+++ b/src/koopatlas/core.cpp
@@ -222,7 +222,7 @@ bool WMInit_SetupExtra(void *ptr) {
// need Player before we can set up paths
SpammyReport("creating player\n");
wm->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, wm, 0, 2);
- wm->player->modelHandler->mdlClass->setPowerup(2);
+ wm->player->modelHandler->mdlClass->setPowerup(Player_Powerup[0]);
wm->player->modelHandler->mdlClass->startAnimation(0, 1.2f, 10.0f, 0.0f);
// since we've got all the resources, set up the path data too
@@ -310,6 +310,13 @@ int dScKoopatlas_c::onCreate() {
SpammyReport("GameSetup__LoadScene(0)\n");
GameSetup__LoadScene(0); // lol, stolen from GAME_SETUP
+ SpammyReport("Setting Active Players\n");
+ for (int i = 0; i < 4; i++) {
+ bool isThere = QueryPlayerAvailability(i);
+ int id = Player_ID[i];
+ Player_Active[i] = isThere ? 1 : 0;
+ if (!isThere) Player_Flags[i] = 0;
+ }
SpammyReport("select cursor\n");
this->selectCursor = CreateParentedObject(SELECT_CURSOR, this, 0, 0);
@@ -589,6 +596,14 @@ void dScKoopatlas_c::executeState_PlayerChangeWait() {
}
} else {
if (!NPCHG_ACTIVE(this->numPeopleChange)) {
+
+ for (int i = 0; i < 4; i++) {
+ bool isThere = QueryPlayerAvailability(i);
+ int id = Player_ID[i];
+ Player_Active[i] = isThere ? 1 : 0;
+ if (!isThere) Player_Flags[i] = 0;
+ }
+
state.setState(&StateID_Normal);
}
}
@@ -623,6 +638,8 @@ void dScKoopatlas_c::executeState_EasyPairingWait() {
void dScKoopatlas_c::executeState_PowerupsWait() {
if (!STKI_SHOW(this->stockItem)) {
+ dScKoopatlas_c::instance->player->modelHandler->mdlClass->setPowerup(Player_Powerup[0]);
+
state.setState(&StateID_Normal);
}
@@ -833,12 +850,6 @@ void dScKoopatlas_c::executeState_SaveError() { }
void dScKoopatlas_c::startLevel(dLevelInfo_c::entry_s *entry) {
- for (int i = 0; i < 4; i++) {
- bool isThere = QueryPlayerAvailability(i);
- int id = Player_ID[i];
- Player_Active[i] = isThere ? 1 : 0;
- if (!isThere) Player_Flags[i] = 0;
- }
StartLevelInfo sl;
sl.unk1 = 0;
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
index c20f026..286bbf5 100644
--- a/src/koopatlas/hud.cpp
+++ b/src/koopatlas/hud.cpp
@@ -1,5 +1,7 @@
#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]; }
+
dWMHud_c *dWMHud_c::instance = 0;
dWMHud_c *dWMHud_c::build() {
@@ -54,10 +56,12 @@ int dWMHud_c::onCreate() {
layout.disableAllAnimations();
layout.enableNonLoopAnim(ANIM_BOTTOM_SHOW);
- showPointBar();
+ hidePointBar();
+ setWorldText(" ");
+ setWorldName();
if (dScKoopatlas_c::instance->pathManager.mustComplainToMapCreator)
- dWMHud_c::instance->setText("Please Fix Your Missing Entrance. Thanks");
+ dWMHud_c::instance->setLevelText("Please Fix Your Missing Entrance. Thanks");
layoutLoaded = true;
}
@@ -72,6 +76,11 @@ int dWMHud_c::onDelete() {
int dWMHud_c::onExecute() {
+ updateLives();
+ setWorldName();
+ checkPointStatus();
+ setPointName();
+
layout.execAnimations();
layout.update();
@@ -86,14 +95,41 @@ int dWMHud_c::onDraw() {
}
-void dWMHud_c::updateText() {
- setPointName();
-}
+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]);
-void dWMHud_c::setText(const char *str, int length) {
+ 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;
+ }
+ }
+}
+
+void dWMHud_c::setLevelText(const char *str, int length) {
if (str == 0) {
- setText("--NULL STRING--");
+ setLevelText("--NULL STRING--");
return;
}
@@ -109,13 +145,12 @@ void dWMHud_c::setText(const char *str, int length) {
}
newString[i] = 0;
- setText(newString, i);
+ setLevelText(newString, i);
}
-
-void dWMHud_c::setText(const wchar_t *str, int length) {
+void dWMHud_c::setLevelText(const wchar_t *str, int length) {
if (str == 0) {
- setText("--NULL STRING--");
+ setLevelText("--NULL STRING--");
return;
}
@@ -152,12 +187,224 @@ void dWMHud_c::setPointName() {
dLevelInfo_c *li = &dScKoopatlas_c::instance->levelInfo;
dLevelInfo_c::entry_s *entry = li->search(node->levelNumber[0] - 1, node->levelNumber[1] - 1);
- setText(li->getNameForLevel(entry));
+ setLevelText(li->getNameForLevel(entry));
} else {
- setText("");
+ setLevelText(" ");
+ hidePointBar();
+ }
+}
+
+void dWMHud_c::checkPointStatus() {
+ dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
+
+ if (node->type == dKPNode_s::LEVEL) {
+ 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;
+ }
+
+ } 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::setWorldText(const char *str, int length) {
+ if (str == 0) {
+ setWorldText("--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;
+
+ 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");
+
+ 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);
+
+ box->SetString(str);
+}
+
+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];
+
+ switch (world) {
+ case 1:
+ setWorldText("Yoshi's\nIsland");
+ break;
+
+ case 2:
+ if (((level > 1) && (level < 5)) || (level == 15) || (level == 33) || (level == 34))
+ setWorldText("Soggy\nSewers");
+ else
+ setWorldText("Rubble\nRuins");
+ break;
+
+ case 3:
+ setWorldText("Mushroom\nPeaks");
+ break;
+
+ case 4:
+ setWorldText("Sakura\nVillage");
+ break;
+
+ case 5:
+ if ((level < 6) || (level == 15) || (level == 33) || (level == 34))
+ setWorldText("Freeze Flame\nValley");
+ else
+ setWorldText("Freeze Flame\nVolcano");
+ break;
+
+ case 6:
+ setWorldText("Ghost\nRealm");
+ break;
+
+ case 7:
+ if (level < 4)
+ setWorldText("Sky\nMountain");
+ else
+ setWorldText("Starry\nSkies");
+ break;
+
+ case 8:
+ if ((level < 6) || (level == 15) || (level == 25) || (level == 33) || (level == 34))
+ setWorldText("Koopa\nPlanet");
+ else
+ setWorldText("Koopa\nCore");
+ break;
+
+ case 9:
+ setWorldText("Bonus\nLand");
+ break;
+
+ case 10:
+ if ((level < 6) || (level == 33) || (level == 34))
+ setWorldText("Goldwood\nForest");
+ else if ((level < 11) || (level == 35) || (level == 36))
+ setWorldText("Mini-Mega\nIsland");
+ else if ((level < 16) || (level == 37) || (level == 38) || (level == 31) )
+ setWorldText("Crystal\nCaves");
+ else if ((level < 19) || (level == 39) || (level == 40))
+ setWorldText("Bombard\nCliffs");
+ else
+ setWorldText("Sky\nCity");
+ break;
+
+ default:
+ setWorldText("Unknown\nWorld");
+ break;
+ }
+ }
+}
void dWMHud_c::showPointBar() {
dKPNode_s *node = dScKoopatlas_c::instance->pathManager.currentNode;
@@ -165,8 +412,6 @@ void dWMHud_c::showPointBar() {
if (node->type == dKPNode_s::LEVEL) {
isPointBarShown = true;
- updateText();
-
layout.enableNonLoopAnim(ANIM_TOP_SHOW);
}
}
diff --git a/src/koopatlas/hud.h b/src/koopatlas/hud.h
index 8d964c5..347fcb4 100644
--- a/src/koopatlas/hud.h
+++ b/src/koopatlas/hud.h
@@ -15,14 +15,19 @@ class dWMHud_c : public dBase_c {
bool layoutLoaded;
m2d::EmbedLayout_c layout;
- void updateText();
+ void updateLives();
void showPointBar();
void hidePointBar();
void setPointName();
- void setText(const char *str, int length = -1);
- void setText(const wchar_t *str, int length = -1);
+ void checkPointStatus();
+ void setLevelText(const char *str, int length = -1);
+ void setLevelText(const wchar_t *str, int length = -1);
+
+ void setWorldName();
+ void setWorldText(const char *str, int length = -1);
+ void setWorldText(const wchar_t *str, int length = -1);
static dWMHud_c *build();
static dWMHud_c *instance;
diff --git a/src/koopatlas/player.cpp b/src/koopatlas/player.cpp
index 709fe43..f8e491a 100644
--- a/src/koopatlas/player.cpp
+++ b/src/koopatlas/player.cpp
@@ -5,6 +5,7 @@ daWMPlayer_c *daWMPlayer_c::instance;
int daWMPlayer_c::onCreate() {
this->modelHandler = new dPlayerModelHandler_c(0);
+ // loadModel(u8 player_id, int powerup_id, int unk);
this->modelHandler->loadModel(0, 3, 2);
this->modelHandler->mdlClass->startAnimation(0, 1.2, 10.0, 0.0);
this->modelHandler->setSRT((Vec){0.0,100.0,-100.0}, (S16Vec){0,0,0}, (Vec){2.0,2.0,2.0});