summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/koopatlas/starcoin.cpp424
-rw-r--r--src/koopatlas/starcoin.h40
2 files changed, 464 insertions, 0 deletions
diff --git a/src/koopatlas/starcoin.cpp b/src/koopatlas/starcoin.cpp
new file mode 100644
index 0000000..f47d342
--- /dev/null
+++ b/src/koopatlas/starcoin.cpp
@@ -0,0 +1,424 @@
+#include "koopatlas/starcoin.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
+//
+
+
+dWMStarCoin *dWMStarCoin::instance = 0;
+
+dWMStarCoin *dWMStarCoin::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(dWMStarCoin));
+ dWMStarCoin *c = new(buffer) dWMStarCoin;
+
+ instance = c;
+ return c;
+}
+
+dWMStarCoin::dWMStarCoin() {
+ layoutLoaded = false;
+ isHidden = true;
+}
+
+int dWMStarCoin::onCreate() {
+
+ if (!layoutLoaded) {
+ bool gotFile = layout.loadArc("coin.arc", false);
+ if (!gotFile)
+ return false;
+
+ currentItem = 0;
+
+ static const char *brlanNames[2] = {"coin_inWindow.brlan", "coin_outWindow.brlan"};
+ static const char *groupNames[2] = {"A00_Window", "A00_Window"};
+
+ bool output = layout.build("coin.brlyt");
+
+ if (!IsWideScreen()) {
+ layout.clippingEnabled = true;
+ layout.clipX = 0;
+ layout.clipY = 52;
+ layout.clipWidth = 640;
+ layout.clipHeight = 352;
+ layout.layout.rootPane->scale.x = 0.7711f;
+ layout.layout.rootPane->scale.y = 0.7711f;
+ }
+
+ layout.loadAnimations(brlanNames, 2);
+ layout.loadGroups(groupNames, (int[2]){0, 1}, 2);
+ layout.disableAllAnimations();
+
+ layout.drawOrder = 0x01;
+
+ layoutLoaded = true;
+ }
+
+ return true;
+}
+
+
+int dWMStarCoin::onDelete() {
+ return layout.free();
+}
+
+
+int dWMStarCoin::onExecute() {
+ layout.execAnimations();
+ layout.update();
+
+ if (!isHidden) {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ if (!layout.isAnyAnimOn()) {
+ if (nowPressed & WPAD_B) {
+ MapSoundPlayer(SoundRelatedClass, SE_SYS_DIALOGUE_OUT_AUTO, 1);
+ isHidden = true;
+ layout.enableNonLoopAnim(1);
+ }
+ }
+ }
+
+ return true;
+}
+
+int dWMStarCoin::onDraw() {
+ if (isHidden) {
+ if (layout.isAnimOn(1)) { layout.scheduleForDrawing(); }
+ }
+
+ if (!isHidden) {
+ layout.scheduleForDrawing();
+ }
+
+ return true;
+}
+
+void dWMStarCoin::specialDraw1() {
+ if (!isHidden) {
+ Vec pos = {250.0f, 170.0f, 1000.0f};
+ S16Vec rot = {rotation,0,0};
+ Vec scale = {1.0f, 1.0f, 1.0f};
+ matrix.translation(pos.x, pos.y, pos.z);
+ matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+ shopkeep.setDrawMatrix(matrix);
+ shopkeep.setScale(&scale);
+ shopkeep.calcWorld(false);
+ shopkeep.scheduleForDrawing();
+
+ rotation += 0x100;
+ }
+ return;
+}
+
+
+void dWMStarCoin::LoadCoinsForWorld(int world) {
+ if (!isHidden) {
+ return; }
+
+ u8 levelArray[] = {
+ {
+ {1,2,3,4,15},
+ {5,6,7,8,25,38}
+ },
+
+ {
+ {1,2,3,4,15},
+ {5,6,7,8,9,10,25,38}
+ },
+
+ {
+ {1,2,3,4,15},
+ {5,6,7,25,38}
+ },
+
+ {
+ {1,2,3,4,15},
+ {5,6,7,8,25,38}
+ },
+
+ {
+ {1,2,3,4,5,15},
+ {6,7,8,9,10,25,38}
+ },
+
+ {
+ {1,2,3,4,15},
+ {5,6,7,8,9,25,38}
+ },
+
+ {
+ {1,2,3,4},
+ {5,15,6,7,8,9,25,38}
+ },
+
+ {
+ {1,2,3,15,4,25,5},
+ {6,7,16,8,9,10,26}
+ },
+
+ {
+ {1,2,3,4,5},
+ {6,7,8,9,10}
+ },
+
+ {
+ {1,2,3,4,5},
+ {}
+ },
+
+ {
+ {6,7,8,9,10},
+ {}
+ },
+
+ {
+ {11,12,13,14,15},
+ {}
+ },
+
+ {
+ {16,17,18},
+ {}
+ },
+
+ {
+ {19,22,23,24,25},
+ {}
+ }
+ }
+
+ // Handle showing it
+ MapSoundPlayer(SoundRelatedClass, SE_SYS_DIALOGUE_IN, 1);
+ isHidden = false;
+ layout.enableNonLoopAnim(0);
+
+ // Model creation
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ res.data = getResource("star_coin", "g3d/star_coin.brres");
+ nw4r::g3d::ResMdl mdl = res.GetResMdl("star_coinA");
+ shopkeep.setup(mdl, &allocator, 0x224, 1, 0);
+ SetupTextures_Item(&shopkeep, 1);
+
+ allocator.unlink();
+
+
+ // Display Total Star Coin Count
+ int myCoins = getStarCoinCountCoins();
+
+ char myCoinsStr [4];
+ sprintf(myCoinsStr, "%03d", myCoins);
+
+ setText(myCoinsStr, "T_overall_01");
+
+
+ // Display World Name
+ setWorldName(int world);
+
+
+ // Display Per level coins
+ int totalCoins = 0;
+ int currentCoins = 0;
+
+ int i = 0;
+ int j = 1;
+
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+ for (int l = 0; l < 2; l++) {
+ while (levelArray[world-1][l][i]) {
+
+ dLevelInfo_c *li = &dScKoopatlas_c::instance->levelInfo;
+ dLevelInfo_c::entry_s *entry = li->search(world - 1, levelArray[world-1][l][i] - 1);
+
+ setText(li->getNameForLevel(entry);, "T_level_01");
+
+ bool collect;
+ collect = CheckIfCoinCollected(world - 1, l, 0);
+ setCoin(collect, 1, i+j);
+ if (collect) { currentCoins++; }
+
+ collect = CheckIfCoinCollected(world - 1, l, 1);
+ setCoin(collect, 2, i+j);
+ if (collect) { currentCoins++; }
+
+ collect = CheckIfCoinCollected(world - 1, l, 2);
+ setCoin(collect, 3, i+j);
+ if (collect) { currentCoins++; }
+
+ totalCoins += 3;
+ i++;
+ }
+ j += 8;
+ i = 0;
+ }
+
+ // Display per-world Count
+ char tcStr [3];
+ sprintf(tcStr, "%02d", totalCoins);
+
+ setText(tcStr, "T_total_01");
+
+ char ccStr [3];
+ sprintf(ccStr, "%02d", currentCoins);
+
+ setText(ccStr, "T_collected_01");
+}
+
+
+void dWMStarCoin::setCoin(bool on, int coin, int slot) {
+
+ if (coin == 1) {
+ char coinOn [14];
+ sprintf(coinOn, "P_first_on_%02d", slot);
+
+ char coinOff [15];
+ sprintf(coinOff, "P_first_off_%02d", slot);
+ } else if {
+ char coinOn [15];
+ sprintf(coinOn, "P_second_on_%02d", slot);
+
+ char coinOff [16];
+ sprintf(coinOff, "P_second_off_%02d", slot);
+ } else if {
+ char coinOn [14];
+ sprintf(coinOn, "P_third_on_%02d", slot);
+
+ char coinOff [15];
+ sprintf(coinOff, "P_third_off_%02d", slot);
+ } else { return; }
+
+ nw4r::lyt::Pane picOn = layout.findPictureByName(coinOn);
+ nw4r::lyt::Pane picOff = layout.findPictureByName(coinOff);
+
+ if (on) {
+ picOn->alpha = 0xFF;
+ picOff->alpha = 0;
+ }
+ else {
+ picOn->alpha = 0;
+ picOff->alpha = 0xFF;
+ }
+}
+
+void dWMStarCoin::setText(const char *str, const char *name) {
+
+ int length = strlen(str);
+ wchar_t newString[128];
+
+ int i;
+ for (i = 0; i < length && i < 128; i++) {
+ newString[i] = str[i];
+ }
+ newString[i] = 0;
+
+ int wlength = wcslen(newString);
+
+ nw4r::lyt::TextBox *box = layout.findTextBoxByName(name);
+
+ 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(newString, wlength);
+ SpammyReport("Text width: %f\n", width);
+
+ box->SetString(newString);
+}
+
+void dWMStarCoin::setWorldName(int world) {
+
+ switch (world) {
+ case 1:
+ setText("Yoshi's Island", "T_lefttitle_01");
+ setText("Yoshi's Island", "T_righttitle_01")l
+ break;
+
+ case 2:
+ setText("Soggy Sewers", "T_lefttitle_01");
+ setText("Rubble Ruins", "T_righttitle_01")l
+ break;
+
+ case 3:
+ setText("Mushroom Peaks", "T_lefttitle_01");
+ setText("Mushroom Peaks", "T_righttitle_01")l
+ break;
+
+ case 4:
+ setText("Sakura Village", "T_lefttitle_01");
+ setText("Sakura Village", "T_righttitle_01")l
+ break;
+
+ case 5:
+ setText("FreezeFlame Valley", "T_lefttitle_01");
+ setText("FreezeFlame Volcano", "T_righttitle_01")l
+ break;
+
+ case 6:
+ setText("Pumpkin Boneyard", "T_lefttitle_01");
+ setText("Pumpkin Boneyard", "T_righttitle_01")l
+ break;
+
+ case 7:
+ setText("Sky Mountain", "T_lefttitle_01");
+ setText("Starry Skies", "T_righttitle_01")l
+ break;
+
+ case 8:
+ setText("Koopa Planet", "T_lefttitle_01");
+ setText("Koopa Core", "T_righttitle_01")l
+ break;
+
+ case 9:
+ setText("Bonus Land", "T_lefttitle_01");
+ setText("Bonus Land", "T_righttitle_01")l
+ break;
+
+ case 10:
+ setText("Goldwood Forest", "T_lefttitle_01");
+ setText(" ", "T_righttitle_01")l
+
+ // 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:
+ setText("Unknown World", "T_lefttitle_01");
+ setText("Unknown World", "T_righttitle_01")l
+ break;
+ }
+
+}
diff --git a/src/koopatlas/starcoin.h b/src/koopatlas/starcoin.h
new file mode 100644
index 0000000..500ffa6
--- /dev/null
+++ b/src/koopatlas/starcoin.h
@@ -0,0 +1,40 @@
+#ifndef __KOOPATLAS_HUD_H
+#define __KOOPATLAS_HUD_H
+
+#include "koopatlas/core.h"
+
+class dWMStarCoin : public dBase_c {
+ public:
+ dWMStarCoin();
+
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+ void specialDraw1();
+
+ mHeapAllocator_c allocator;
+ nw4r::g3d::ResFile res;
+ m3d::mdl_c shopkeep;
+ mMtx matrix;
+
+ bool layoutLoaded;
+ m2d::EmbedLayout_c layout;
+
+ bool isHidden;
+ s16 rotation;
+
+ void LoadCoinsForWorld(int world);
+ void setCoin(bool On, int coin, int slot);
+ void setText(const char *str, const char *name);
+ void setWorldName(int world);
+
+ static dWMStarCoin *build();
+ static dWMStarCoin *instance;
+
+ private:
+ bool isPointBarShown;
+};
+
+#endif
+