summaryrefslogtreecommitdiff
path: root/src/koopatlas
diff options
context:
space:
mode:
authorColin Noga <Tempus@chronometry.ca>2012-09-21 20:43:21 -0500
committerColin Noga <Tempus@chronometry.ca>2012-09-21 20:43:21 -0500
commitd47a9ed57a826d60c37bfa8a4ae00ccaba0ed806 (patch)
treec3f6657118d71abcd1ce3b4584b3e0472841e53f /src/koopatlas
parent8d0a306f0a526a76182c8d2b513d7a0441d6f466 (diff)
parent5654d5c0a056f9cfc99ac608d16aa0a601b997f5 (diff)
downloadkamek-d47a9ed57a826d60c37bfa8a4ae00ccaba0ed806.tar.gz
kamek-d47a9ed57a826d60c37bfa8a4ae00ccaba0ed806.zip
Merge branch 'level-select' of ssh://treeki.rustedlogic.net:30000/Kamek into level-select
Diffstat (limited to 'src/koopatlas')
-rw-r--r--src/koopatlas/core.h2
-rw-r--r--src/koopatlas/hud.cpp67
-rw-r--r--src/koopatlas/map.cpp8
-rw-r--r--src/koopatlas/mapdata.cpp4
-rw-r--r--src/koopatlas/mapdata.h7
-rw-r--r--src/koopatlas/pathmanager.cpp57
6 files changed, 66 insertions, 79 deletions
diff --git a/src/koopatlas/core.h b/src/koopatlas/core.h
index d2d9454..2674977 100644
--- a/src/koopatlas/core.h
+++ b/src/koopatlas/core.h
@@ -36,7 +36,7 @@ void NewerMapDrawFunc();
#define WM_HUD WM_DANCE_PAKKUN
#define WM_SHOP WM_TOGEZO
-#define WM_SHOPITEM WM_PUKU
+#define WM_SHOPITEM WM_BOARD
#define WM_STARCOIN WM_GHOST
class daWMPlayer_c;
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
index 8f4b778..3989a1c 100644
--- a/src/koopatlas/hud.cpp
+++ b/src/koopatlas/hud.cpp
@@ -383,72 +383,7 @@ void dWMHud_c::setWorldName() {
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("FreezeFlame\nValley");
- else
- setWorldText("FreezeFlame\nVolcano");
- break;
-
- case 6:
- setWorldText("Pumpkin\nBoneyard");
- 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 == 30) || (level == 41) )
- setWorldText("Goldwood\nForest");
- else if ((level < 11) || (level == 32))
- setWorldText("Mini-Mega\nIsland");
- else if ((level < 16) || (level == 33) || (level == 34) || (level == 31) )
- setWorldText("Crystal\nCaves");
- else if (level < 19)
- setWorldText("Bombard\nCliffs");
- else
- setWorldText("Sky\nCity");
- break;
-
- default:
- setWorldText("Unknown\nWorld");
- break;
- }
+ setWorldText(NewerWorldName(NewerWorldForLevelID(world, level)));
}
}
diff --git a/src/koopatlas/map.cpp b/src/koopatlas/map.cpp
index 65d71b8..316c001 100644
--- a/src/koopatlas/map.cpp
+++ b/src/koopatlas/map.cpp
@@ -115,6 +115,14 @@ void dWMMap_c::renderer_c::drawLayers() {
dKPLayer_s *layer = data->layers[iLayer];
renderMtx[2][3] += 2.0f;
+ if (layer->type == dKPLayer_s::PATHS) {
+ // rebase the camera matrix
+ baseZ = 3500.0f;
+ nw4r::g3d::Camera cam3d(GetCameraByID(0));
+ cam3d.GetCameraMtx(&renderMtx);
+ MTXTransApply(renderMtx, renderMtx, 0, 0, baseZ);
+ }
+
if (layer->alpha == 0)
continue; // invisible
diff --git a/src/koopatlas/mapdata.cpp b/src/koopatlas/mapdata.cpp
index ab8ef3a..52a7937 100644
--- a/src/koopatlas/mapdata.cpp
+++ b/src/koopatlas/mapdata.cpp
@@ -152,7 +152,7 @@ bool dKPMapData_c::load(const char *filename) {
fixup();
bool didLoadTilesets = loadTilesets();
- bool didLoadBG = (bgLoader.load("/Maps/Water.brres") != 0);
+ bool didLoadBG = (bgLoader.load(data->backgroundName) != 0);
return didLoadTilesets && didLoadBG;
}
@@ -203,6 +203,8 @@ void dKPMapData_c::fixup() {
fixRef(data->layers);
fixRef(data->tilesets);
fixRef(data->unlockData);
+ fixRef(data->sectors);
+ fixRef(data->backgroundName);
for (int iLayer = 0; iLayer < data->layerCount; iLayer++) {
dKPLayer_s *layer = fixRef(data->layers[iLayer]);
diff --git a/src/koopatlas/mapdata.h b/src/koopatlas/mapdata.h
index 40e1a43..70c31ee 100644
--- a/src/koopatlas/mapdata.h
+++ b/src/koopatlas/mapdata.h
@@ -179,6 +179,9 @@ struct dKPLayer_s {
};
struct dKPMapFile_s {
+ u32 magic;
+ int version;
+
int layerCount;
dKPLayer_s **layers;
@@ -187,7 +190,9 @@ struct dKPMapFile_s {
u8 *unlockData;
- dKPLayer_s::sector_s sectors[1]; // variable size
+ dKPLayer_s::sector_s *sectors;
+
+ const char *backgroundName;
};
class dKPMapData_c {
diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp
index ffc4dfd..a9cd003 100644
--- a/src/koopatlas/pathmanager.cpp
+++ b/src/koopatlas/pathmanager.cpp
@@ -41,11 +41,41 @@ void dWMPathManager_c::setup() {
found = true;
currentNode = node;
- SpammyReport("a1 Node: %p\n", node);
- dKPPath_s *exit = node->getAnyExit();
- SpammyReport("a2 Exit: %p\n", exit);
- startMovementTo(exit);
- SpammyReport("a3\n");
+ // figure out where we should move to
+ dKPPath_s *exitTo = 0;
+
+ for (int i = 0; i < 4; i++) {
+ dKPPath_s *candidateExit = node->exits[i];
+ if (!candidateExit)
+ continue;
+
+ // find out if this path is a candidate
+ dKPNode_s *srcNode = node;
+ dKPPath_s *path = candidateExit;
+
+ while (true) {
+ dKPNode_s *destNode = (path->start == srcNode) ? path->end : path->start;
+ int ct = destNode->getAvailableExitCount();
+ if (destNode == node || ct > 2 || destNode->type == dKPNode_s::LEVEL) {
+ exitTo = path;
+ break;
+ }
+
+ if (ct == 1)
+ break;
+
+ // where to next?
+ path = destNode->getOppositeAvailableExitTo(path);
+ srcNode = destNode;
+ }
+
+ if (exitTo)
+ break;
+ }
+
+ if (!exitTo)
+ exitTo = node->getAnyExit();
+ startMovementTo(exitTo);
break;
}
}
@@ -433,26 +463,26 @@ void dWMPathManager_c::startMovementTo(dKPPath_s *path) {
moveSpeed = 2.0f;
break;
case 13:
- player->startAnimation(Tjumped, 2.0, 0.0, 0.0);
- break;
- case 14:
player->startAnimation(b_dash2, 3.0, 10.0, 0.0);
player->hasSound = true;
player->soundName = SE_PLY_FOOTNOTE_DIRT;
moveSpeed = 5.0f;
break;
- case 15:
+ case 14:
player->startAnimation(wait, 2.0, 10.0, 0.0);
player->rot.y = 0x0000;
MapSoundPlayer(SoundRelatedClass, SE_PLY_DOKAN_IN_OUT, 1);
moveSpeed = 1.0f;
break;
- case 16:
+ case 15:
player->startAnimation(wait, 2.0, 10.0, 0.0);
player->rot.y = 0x8000;
MapSoundPlayer(SoundRelatedClass, SE_OBJ_DOOR_OPEN, 1);
moveSpeed = 0.2f;
break;
+ case 16:
+ player->startAnimation(Tjumped, 2.0, 0.0, 0.0);
+ break;
default:
SpammyReport("No animtaion?!");
player->startAnimation(run, 2.0, 10.0, 0.0);
@@ -560,6 +590,13 @@ void dWMPathManager_c::moveThroughPath() {
SaveBlock *save = GetSaveFile()->GetBlock(-1);
save->current_path_node = pathLayer->findNodeID(to);
+ if (to->type == dKPNode_s::LEVEL) {
+ NWRWorld nWorld = NewerWorldForLevelID(to->levelNumber[0], to->levelNumber[1]);
+ if (nWorld != UNKNOWN_WORLD) {
+ save->currentNewerWorld = (u8)nWorld;
+ }
+ }
+
dWMHud_c::instance->showPointBar();
SpammyReport("Point bar shown\n");
} else {