summaryrefslogtreecommitdiff
path: root/src/koopatlas/hud.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/koopatlas/hud.cpp')
-rw-r--r--src/koopatlas/hud.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
new file mode 100644
index 0000000..c5b2c6e
--- /dev/null
+++ b/src/koopatlas/hud.cpp
@@ -0,0 +1,168 @@
+#include "koopatlas/hud.h"
+
+dWMHud_c *dWMHud_c::instance = 0;
+
+dWMHud_c *dWMHud_c::build() {
+ OSReport("Creating WM_Hud\n");
+
+ void *buffer = AllocFromGameHeap1(sizeof(dWMHud_c));
+ dWMHud_c *c = new(buffer) dWMHud_c;
+
+ OSReport("Created WM_Hud @ %p\n", c);
+
+ instance = c;
+ return c;
+}
+
+
+
+dWMHud_c::dWMHud_c() {
+ layoutLoaded = false;
+}
+
+
+// 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);
+ 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()) {
+ 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, 5);
+ layout.loadGroups(groupNames, (int[6]){0, 0, 1, 2, 3, 4}, 6);
+ layout.disableAllAnimations();
+ layout.enableNonLoopAnim(ANIM_BOTTOM_SHOW);
+
+ showPointBar();
+
+ layoutLoaded = true;
+ }
+
+ return true;
+}
+
+
+int dWMHud_c::onDelete() {
+ return layout.free();
+}
+
+
+int dWMHud_c::onExecute() {
+ layout.execAnimations();
+ layout.update();
+
+ return true;
+}
+
+
+int dWMHud_c::onDraw() {
+ layout.scheduleForDrawing();
+
+ return true;
+}
+
+
+void dWMHud_c::updateText() {
+ setPointName();
+}
+
+
+void dWMHud_c::setPointName() {
+ wchar_t newPointName[120];
+ int length;
+
+ // figure this out...
+ /*WMPathPoint *point = dWMPathManager_c::instance->currentPoint;
+
+ if (point->type == WMPathPoint::LEVEL_TYPE) {
+ LevelInfo *li = &dScNewerWorldMap_c::instance->levelInfo;
+ LevelInfo::Entry *entry = li->search(point->params[0] - 1, point->params[1] - 1);
+
+ char *levelName = li->getNameForLevel(entry);
+
+ // copy it
+ // I need to make this into a function.
+ for (int i = 0; i < 120 && i < entry->nameLength; i++) {
+ newPointName[i] = levelName[i];
+ }
+ length = entry->nameLength;
+ newPointName[entry->nameLength] = 0;
+
+ } else {
+ newPointName[0] = 0;
+ length = 0;
+ }*/
+
+ const char *str = "This needs to be done\0";
+ length = 21;
+ for (int i = 0; i < length; i++)
+ newPointName[i] = str[i];
+ newPointName[length] = 0;
+
+ 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(newPointName, 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(newPointName);
+}
+
+
+void dWMHud_c::showPointBar() {
+ //WMPathPoint *point = dWMPathManager_c::instance->currentPoint;
+
+ if (true) {//point->type == WMPathPoint::LEVEL_TYPE) {
+ isPointBarShown = true;
+
+ updateText();
+
+ layout.enableNonLoopAnim(ANIM_TOP_SHOW);
+ }
+}
+
+
+void dWMHud_c::hidePointBar() {
+ if (isPointBarShown) {
+ isPointBarShown = false;
+
+ layout.enableNonLoopAnim(ANIM_TOP_HIDE);
+ }
+}
+
+
+