summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/koopatlas/core.cpp2
-rw-r--r--src/koopatlas/map.cpp57
-rw-r--r--src/koopatlas/map.h8
-rw-r--r--src/koopatlas/mapdata.cpp27
-rw-r--r--src/koopatlas/mapdata.h3
-rw-r--r--src/koopatlas/pathmanager.cpp30
-rw-r--r--src/koopatlas/pathmanager.h1
7 files changed, 73 insertions, 55 deletions
diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp
index 6b1f290..42bf7c1 100644
--- a/src/koopatlas/core.cpp
+++ b/src/koopatlas/core.cpp
@@ -451,6 +451,8 @@ void dScKoopatlas_c::executeState_Normal() {
} else if (nowPressed & WPAD_PLUS) {
CSMENU_ACTIVE(this->csMenu) = true;
state.setState(&StateID_CSMenu);
+ } else if (nowPressed & WPAD_A) {
+ pathManager.unlockAllPaths();
}
pathManager.execute();
diff --git a/src/koopatlas/map.cpp b/src/koopatlas/map.cpp
index a03d819..4d2bc1d 100644
--- a/src/koopatlas/map.cpp
+++ b/src/koopatlas/map.cpp
@@ -84,6 +84,10 @@ int dWMMap_c::onDraw() {
renderer.scheduleForDrawing();
bgModel.scheduleForDrawing();
+
+ dKPMapData_c *dataCls = &dScKoopatlas_c::instance->mapData;
+ renderPathLayer(dataCls->pathLayer);
+
return true;
}
@@ -133,11 +137,9 @@ void dWMMap_c::renderer_c::drawLayers() {
if (cont) { continue; }
TileReport("Checking layer %d with type %d\n", iLayer, layer->type);
if (layer->type == dKPLayer_s::OBJECTS)
- renderTileLayer(layer, data->sectors);
+ renderTileLayer(layer, data->sectors, 255);
else if (layer->type == dKPLayer_s::DOODADS)
- renderDoodadLayer(layer);
- else if (layer->type == dKPLayer_s::PATHS)
- renderPathLayer(layer);
+ renderDoodadLayer(layer, 255);
}
endRendering();
@@ -207,7 +209,7 @@ void dWMMap_c::renderer_c::beginRendering() {
GXSetTevColor(GX_TEVREG1, (GXColor){0,0,0,255});
}
-void dWMMap_c::renderer_c::renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector_s *sectors) {
+void dWMMap_c::renderer_c::renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector_s *sectors, int alpha) {
//TileReport("Rendering layer %p\n", layer);
// don't render it if we don't need to
@@ -286,23 +288,15 @@ void dWMMap_c::renderer_c::renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector
float coordY2 = yMult * (tileY + 26.0f);
- // GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
- // GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0);
-
+ GXSetTevColor(GX_TEVREG0, (GXColor){255,255,255,alpha});
+
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
- // GXColor1u32(0xFFFFFF80);
GXPosition2s16(worldX + 24, worldY - 24);
GXTexCoord2f32(coordX2, coordY2);
-
- // GXColor1u32(0xFFFFFF80);
GXPosition2s16(worldX + 24, worldY);
GXTexCoord2f32(coordX2, coordY1);
-
- // GXColor1u32(0xFFFFFF80);
GXPosition2s16(worldX, worldY);
GXTexCoord2f32(coordX1, coordY1);
-
- // GXColor1u32(0xFFFFFF80);
GXPosition2s16(worldX, worldY - 24);
GXTexCoord2f32(coordX1, coordY2);
GXEnd();
@@ -316,7 +310,7 @@ void dWMMap_c::renderer_c::renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector
//TileReport("Layer complete\n");
}
-void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {
+void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer, int alpha) {
for (int i = 0; i < layer->doodadCount; i++) {
dKPDoodad_s *doodad = layer->doodads[i];
DoodadReport("Doodad @ %f,%f sized %f,%f with angle %f\n", doodad->x, doodad->y, doodad->width, doodad->height, doodad->angle);
@@ -330,20 +324,19 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {
for (int j = 0; j < doodad->animationCount; j++) {
dKPDoodad_s::animation_s *anim = &doodad->animations[j];
- // FORWARDS COMPATIBILITY: (has a ***)
- // *** if (anim->delayOffset == 0) {
+ if (anim->delayOffset == 0) {
u32 baseTick = anim->baseTick;
if (baseTick == 0) {
anim->baseTick = baseTick = GlobalTickCount;
}
u32 elapsed = GlobalTickCount - baseTick;
- // *** u32 elapsedAdjusted = elapsed;
+ u32 elapsedAdjusted = elapsed;
if (anim->isReversed)
elapsed = anim->frameCount - 1 - elapsed;
if (elapsed >= anim->frameCount) {
- // *** if (elapsed >= (anim->frameCount + anim->delay)) {
+ if (elapsed >= (anim->frameCount + anim->delay)) {
// we've reached the end
switch (anim->loop) {
@@ -365,13 +358,13 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {
anim->baseTick = GlobalTickCount;
break;
}
- // *** }
- // *** elapsedAdjusted = anim->frameCount;
+ }
+ elapsedAdjusted = anim->frameCount;
}
// now calculate the thing
- // *** float progress = elapsedAdjusted / (float)anim->frameCount;
- float progress = elapsed / (float)anim->frameCount;
+ float progress = elapsedAdjusted / (float)anim->frameCount;
+ // float progress = elapsed / (float)anim->frameCount;
float value;
switch (anim->curve) {
@@ -415,10 +408,10 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {
// TODO
break;
}
- // *** }
- // *** else {
- // *** anim->delayOffset -= 1;
- // *** }
+ }
+ else {
+ anim->delayOffset -= 1;
+ }
}
}
@@ -437,6 +430,7 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {
loadCamera(doodadMtx);
loadTexture(doodad->texObj);
+ GXSetTevColor(GX_TEVREG0, (GXColor){255,255,255,alpha});
GXBegin(GX_QUADS, GX_VTXFMT1, 4);
GXPosition2f32(halfW, -halfH);
GXTexCoord2u8(255, 255);
@@ -450,17 +444,12 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {
}
}
-void dWMMap_c::renderer_c::renderPathLayer(dKPLayer_s *layer) {
+void dWMMap_c::renderPathLayer(dKPLayer_s *layer) {
for (int i = 0; i < layer->nodeCount; i++) {
dKPNode_s *node = layer->nodes[i];
if (node->type == dKPNode_s::LEVEL) {
- // OSReport("Node Extra: %x", node->extra);
- // float nx = (float)node->x;
- // float ny = (float)node->y;
- // OSReport("Node Extra: %x, model: %x, matrix: %x, pos: %f, %f", node->extra, node->extra->model, node->extra->matrix, nx, ny);
-
short rz = 0x6000;
short rx = 0x4000;
short ry = 0x8000;
diff --git a/src/koopatlas/map.h b/src/koopatlas/map.h
index e951a41..14c2b87 100644
--- a/src/koopatlas/map.h
+++ b/src/koopatlas/map.h
@@ -42,9 +42,8 @@ class dWMMap_c : public dBase_c {
void beginRendering();
void endRendering();
- void renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector_s *sector);
- void renderDoodadLayer(dKPLayer_s *layer);
- void renderPathLayer(dKPLayer_s *layer);
+ void renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector_s *sector, int alpha);
+ void renderDoodadLayer(dKPLayer_s *layer, int alpha);
void loadTexture(GXTexObj *obj);
@@ -56,6 +55,7 @@ class dWMMap_c : public dBase_c {
float baseZ;
int minX, minY, maxX, maxY;
+ int unlockingAlpha;
};
renderer_c renderer;
@@ -66,6 +66,8 @@ class dWMMap_c : public dBase_c {
mMtx bgMatrix;
S16Vec thing;
+ void renderPathLayer(dKPLayer_s *layer);
+
static dWMMap_c *build();
static dWMMap_c *instance;
};
diff --git a/src/koopatlas/mapdata.cpp b/src/koopatlas/mapdata.cpp
index f65d038..9c84c4a 100644
--- a/src/koopatlas/mapdata.cpp
+++ b/src/koopatlas/mapdata.cpp
@@ -16,7 +16,7 @@ dKPPath_s *dKPNode_s::getOppositeExitTo(dKPPath_s *path) {
bool dKPNode_s::isUnlocked() {
for (int i = 0; i < 4; i++)
if (exits[i])
- if (exits[i])
+ if (exits[i]->isAvailable)
return true;
return false;
}
@@ -39,6 +39,8 @@ void dKPNode_s::setupNodeExtra() {
const char *colour;
+ OSReport("Level %d-%d, isUnlocked: %d, exitComplete: %d", world, level, isUnlocked, exitComplete);
+
// Is it unlocked?
if (!isUnlocked)
colour = "g3d/black.brres";
@@ -56,7 +58,7 @@ void dKPNode_s::setupNodeExtra() {
// Is it a shop?
else if (level == 41)
- const char *colour = "g3d/shop.brres";
+ colour = "g3d/shop.brres";
// Is it complete?
else if ((exitComplete) || (secretComplete)) {
@@ -165,6 +167,8 @@ void dKPMapData_c::unloadTilesets() {
}
void dKPMapData_c::fixup() {
+ OSReport("Setting up Nodes");
+
fixedUp = true;
fixRef(data->layers);
@@ -222,6 +226,25 @@ void dKPMapData_c::fixup() {
// before we finish here, create the Node Extra classes
+
+ // before the first off, do the unlocking.
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+ for (int i = 0; i < pathLayer->pathCount; i++) {
+ dKPPath_s *path = pathLayer->paths[i];
+
+ if (path->unlockType > 0) {
+ u32 conds = save->GetLevelCondition(path->unlockLevelNumber[0] - 1, path->unlockLevelNumber[1] - 1);
+
+ if (path->unlockType == 1 && (conds & COND_NORMAL))
+ path->isAvailable = true;
+ else if (path->unlockType == 2 && (conds & COND_SECRET))
+ path->isAvailable = true;
+ else
+ path->isAvailable = false;
+ }
+ }
+
+
// first off, count how many we need...
int count = 0;
for (int nodeIdx = 0; nodeIdx < pathLayer->nodeCount; nodeIdx++) {
diff --git a/src/koopatlas/mapdata.h b/src/koopatlas/mapdata.h
index f3739a0..18dd9ee 100644
--- a/src/koopatlas/mapdata.h
+++ b/src/koopatlas/mapdata.h
@@ -31,8 +31,7 @@ struct dKPDoodad_s {
int frameCount;
AnimTypes type;
int start, end;
- // FORWARDS COMPATIBILITY:
- // int delay, delayOffset;
+ int delay, delayOffset;
u32 baseTick;
bool isReversed;
diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp
index 7457f99..41515a6 100644
--- a/src/koopatlas/pathmanager.cpp
+++ b/src/koopatlas/pathmanager.cpp
@@ -63,20 +63,6 @@ void dWMPathManager_c::setup() {
// unlock all needed paths
SpammyReport("Unlocking paths\n");
- for (int i = 0; i < pathLayer->pathCount; i++) {
- dKPPath_s *path = pathLayer->paths[i];
-
- if (path->unlockType > 0) {
- u32 conds = save->GetLevelCondition(path->unlockLevelNumber[0] - 1, path->unlockLevelNumber[1] - 1);
-
- if (path->unlockType == 1 && (conds & COND_NORMAL))
- path->isAvailable = true;
- else if (path->unlockType == 2 && (conds & COND_SECRET))
- path->isAvailable = true;
- else
- path->isAvailable = false;
- }
- }
SpammyReport("done\n");
}
@@ -374,3 +360,19 @@ void dWMPathManager_c::activatePoint() {
}
+void dWMPathManager_c::unlockAllPaths() {
+
+ for (int i = 0; i < pathLayer->pathCount; i++) {
+ dKPPath_s *path = pathLayer->paths[i];
+ path->isAvailable = true;
+ }
+
+ // Can't change node models - the price we pay for not using anims
+ // for (int i = 0; i < pathLayer->nodeCount; i++) {
+ // dKPNode_s *node = pathLayer->nodes[i];
+ // node->setupNodeExtra();
+ // }
+
+}
+
+
diff --git a/src/koopatlas/pathmanager.h b/src/koopatlas/pathmanager.h
index 0138161..969bdb2 100644
--- a/src/koopatlas/pathmanager.h
+++ b/src/koopatlas/pathmanager.h
@@ -19,6 +19,7 @@ class dWMPathManager_c {
void startMovementTo(dKPPath_s *path);
void moveThroughPath();
void activatePoint();
+ void unlockAllPaths();
dKPLayer_s *pathLayer;