From 86cef888c196c138f71388aa9b701ac09eb95d14 Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Mon, 23 Jul 2012 00:34:04 -0500 Subject: More node and path related code --- src/koopatlas/core.cpp | 2 ++ src/koopatlas/map.cpp | 57 +++++++++++++++++-------------------------- src/koopatlas/map.h | 8 +++--- src/koopatlas/mapdata.cpp | 27 ++++++++++++++++++-- src/koopatlas/mapdata.h | 3 +-- src/koopatlas/pathmanager.cpp | 30 ++++++++++++----------- src/koopatlas/pathmanager.h | 1 + 7 files changed, 73 insertions(+), 55 deletions(-) (limited to 'src/koopatlas') 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; -- cgit v1.2.3