diff options
Diffstat (limited to '')
-rwxr-xr-x | include/game.h | 12 | ||||
-rw-r--r-- | setgen.py | 1 | ||||
-rw-r--r-- | src/wmresourcemng.cpp | 20 | ||||
-rw-r--r-- | src/worldmap.cpp | 47 | ||||
-rw-r--r-- | src/worldmap.h | 7 | ||||
-rw-r--r-- | src/worldmapdata.cpp | 75 | ||||
-rw-r--r-- | src/worldmapdata.h | 60 |
7 files changed, 132 insertions, 90 deletions
diff --git a/include/game.h b/include/game.h index 6df656f..13e5be2 100755 --- a/include/game.h +++ b/include/game.h @@ -792,10 +792,13 @@ struct Tree { typedef bool (*ChainedFunc)(void*);
-struct FunctionChain {
+class FunctionChain {
+public:
ChainedFunc *functions;
u16 count;
u16 current;
+
+ void setup(ChainedFunc *functions, u16 count); // 8015F740
};
@@ -876,7 +879,7 @@ public: class dScene_c : public dBase_c {
public:
- FunctionChain *funcChain;
+ FunctionChain *ptrToInitChain;
dScene_c();
@@ -890,6 +893,11 @@ public: int afterDraw();
~dScene_c();
+
+
+ void setInitChain(FunctionChain &initChain) {
+ ptrToInitChain = &initChain;
+ }
};
class dActor_c : public dBase_c {
@@ -2,6 +2,7 @@ import struct names = {} names['PATH'] = '/Maps/forest/pathdata.bin' +names['SCN0'] = '/Maps/forest/mainscene.bin' names['3D00'] = '/Maps/forest/base.brres' header = struct.pack('>4sI', b'MSet', len(names)) diff --git a/src/wmresourcemng.cpp b/src/wmresourcemng.cpp index 088cef4..741abb2 100644 --- a/src/wmresourcemng.cpp +++ b/src/wmresourcemng.cpp @@ -63,12 +63,18 @@ bool dWMResourceMng_c::loadSet(const char *setName) { // now try to load every resource // if even ONE of them fails, then don't return true - bool isLoadingComplete = true; + isLoadingComplete = true; for (int i = 0; i < setData->count; i++) { void *thisResource = resLoaders[i].load(setData->getName(i)); - MapReport("Load(%s) result: %p\n", setData->getName(i), thisResource); + u32 key = setData->entries[i].key; + char key1 = key >> 24; + char key2 = key >> 16; + char key3 = key >> 8; + char key4 = key & 0xFF; + + MapReport("Load(%c%c%c%c:%s) result: %p\n", key>>24, key>>16, key>>8, key&0xFF, setData->getName(i), thisResource); isLoadingComplete &= (thisResource != 0); } @@ -76,6 +82,8 @@ bool dWMResourceMng_c::loadSet(const char *setName) { // if they are ALL loaded, then this will be true if (isLoadingComplete) { prepareResources(); + + MapReport("Loading completed!\n"); } return isLoadingComplete; @@ -83,14 +91,20 @@ bool dWMResourceMng_c::loadSet(const char *setName) { void *dWMResourceMng_c::operator[](u32 key) { - if (!isLoadingComplete) + MapReport("Obtaining resource %c%c%c%c\n", key>>24, key>>16, key>>8, key&0xFF); + + if (!isLoadingComplete) { + MapReport("Loading is not complete. Returning 0\n"); return 0; + } for (int i = 0; i < setData->count; i++) { if (key == setData->entries[i].key) return resLoaders[i].buffer; } + MapReport("Not found!\n"); + return 0; } diff --git a/src/worldmap.cpp b/src/worldmap.cpp index d24710c..d537ff6 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -19,6 +19,23 @@ dScNewerWorldMap_c *dScNewerWorldMap_c::build() { }
+/*ChainedFunc *initFunctions[] = {
+ WMInit_StartLoading,
+ WMInit_LoadResources,
+ WMInit_EndLoading,
+ WMInit_CreateManagers,
+ WMInit_SetupWait,
+ WMInit_SetupWipe
+};
+
+
+dScNewerWorldMap_c::dScNewerWorldMap_c() {
+ initChain.setup(
+
+ setInitChain(initChain);
+}*/
+
+
#define SELC_SETUP_DONE(sc) (*((bool*)(((u32)(sc))+0xD38)))
#define EASYP_SETUP_DONE(ep) (*((bool*)(((u32)(ep))+0x278)))
@@ -172,22 +189,8 @@ int dScNewerWorldMap_c::onCreate() { levelInfoFile.open("/NewerRes/LevelInfo.bin");
levelInfo.load(levelInfoFile.ptr());
- // load the menu info
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
-
LoadModel();
- wmData.load("/NewerRes/TestMap.wm");
-
-
- WMDataHeader *hdr = (WMDataHeader*)wmData.fh.filePtr;
- if (save->current_path_node >= hdr->pointCount) {
- this->currentPoint = wmData.getPath(0)->startPoint;
- } else {
- this->currentPoint = hdr->pointList[save->current_path_node];
- }
-
-
return true;
}
@@ -306,12 +309,23 @@ int dScNewerWorldMap_c::onExecute() { this->state = STATE_NORMAL;
}
+ // since we've got all the resources, set up the path data too
+ pathData.load(resMng['PATH']);
+
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+
+ if (save->current_path_node >= pathData.pointCount()) {
+ this->currentPoint = pathData.getPath(0)->startPoint;
+ } else {
+ this->currentPoint = pathData.getPoint(save->current_path_node);
+ }
+
// and now Player setup
this->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, this, 0, 2);
this->player->modelHandler->mdlClass->setPowerup(2);
this->player->modelHandler->mdlClass->startAnimation(0, 1.2f, 10.0f, 0.0f);
this->player->pos = this->currentPoint->position;
- }
+s }
} break;
@@ -791,6 +805,7 @@ void dScNewerWorldMap_c::HandleMovement() { else if (nowPressed & WPAD_DOWN && currentPoint->exits.asDirection.down.isValid())
StartMovementTo(DOWN);
+
if (nowPressed & WPAD_TWO)
ActivatePoint();
}
@@ -855,7 +870,7 @@ void dScNewerWorldMap_c::MoveThroughPath() { SaveBlock *save = GetSaveFile()->GetBlock(-1);
//save->current_world = newPage; ?
- save->current_path_node = wmData.getPointID(this->currentPoint);
+ save->current_path_node = pathData.getPointID(this->currentPoint);
} else {
this->MoveToSegment(nextSegment);
}
diff --git a/src/worldmap.h b/src/worldmap.h index 8ea7e4c..8813e6d 100644 --- a/src/worldmap.h +++ b/src/worldmap.h @@ -92,6 +92,10 @@ public: // WORLD MAP CLASS LAYOUT
class dScNewerWorldMap_c : public dScene_c {
public:
+ dScNewerWorldMap_c();
+
+ FunctionChain initChain;
+
int state;
void *csMenu;
void *selectCursor;
@@ -106,6 +110,7 @@ public: LevelInfo levelInfo;
dWMResourceMng_c resMng;
+ dWMPathData_c pathData;
mHeapAllocator_c allocator;
File modelFile;
@@ -115,8 +120,6 @@ public: daWMPlayer_c *player;
- WorldMapData wmData;
-
bool isMoving;
WMPathPoint *currentPoint;
WMPathPoint *nextPoint;
diff --git a/src/worldmapdata.cpp b/src/worldmapdata.cpp index 0473bbb..2f23afc 100644 --- a/src/worldmapdata.cpp +++ b/src/worldmapdata.cpp @@ -1,59 +1,59 @@ -#include "worldmapdata.h" +#include "worldmap.h" + +dWMPathData_c::dWMPathData_c() { -WorldMapData::WorldMapData() { - } -WorldMapData::~WorldMapData() { - FreeFile(&this->fh); +dWMPathData_c::~dWMPathData_c() { + } -bool WorldMapData::load(const char *filename) { - OSReport("Loading WM Data file: %s\n", filename); - - u32 ptr = (u32)LoadFile(&this->fh, filename); - WMDataHeader *header = (WMDataHeader*)ptr; - - OSReport("Loaded WM Data file @ %p\n", ptr); - +bool dWMPathData_c::load(void *data) { + MapReport("dWMPathData_c initialised with %p\n", data); + + WMPathHeader *header = (WMPathHeader*)data; + this->data = header; + + u32 ptr = (u32)data; // for easy addition! probably bad practice, but whatever.. + // first off, fix the list pointers header->pathList = (WMPathDef**)((u32)header->pathList + ptr); header->pointList = (WMPathPoint**)((u32)header->pointList + ptr); header->segmentList = (WMPathSegment**)((u32)header->segmentList + ptr); header->actionList = (WMPathAction**)((u32)header->actionList + ptr); - + // now, fix every pointer in the lists - OSReport("Fixing up list pointers\n"); + MapReport("Fixing up list pointers\n"); for (int i = 0; i < header->pathCount; i++) header->pathList[i] = (WMPathDef*)((u32)header->pathList[i] + ptr); - + for (int i = 0; i < header->pointCount; i++) header->pointList[i] = (WMPathPoint*)((u32)header->pointList[i] + ptr); - + for (int i = 0; i < header->segmentCount; i++) header->segmentList[i] = (WMPathSegment*)((u32)header->segmentList[i] + ptr); - + for (int i = 0; i < header->actionCount; i++) header->actionList[i] = (WMPathAction*)((u32)header->actionList[i] + ptr); - + // next up, fix every pointer in these structs - OSReport("Fixing up path pointers [%d]\n", header->pathCount); + MapReport("Fixing up path pointers [%d]\n", header->pathCount); for (int i = 0; i < header->pathCount; i++) { WMPathDef *thisPath = header->pathList[i]; - //OSReport("Path @ %p - Index: %d - Segments: %d\n", thisPath, i, thisPath->segCount); - + //MapReport("Path @ %p - Index: %d - Segments: %d\n", thisPath, i, thisPath->segCount); + thisPath->startPoint = header->pointList[(u32)thisPath->startPoint]; thisPath->endPoint = header->pointList[(u32)thisPath->endPoint]; - + for (int j = 0; j < thisPath->segCount; j++) { thisPath->segments[j] = header->segmentList[(u32)thisPath->segments[j]]; } } - - OSReport("Fixing up point pointers [%d]\n", header->pointCount); + + MapReport("Fixing up point pointers [%d]\n", header->pointCount); for (int i = 0; i < header->pointCount; i++) { WMPathPoint *thisPoint = header->pointList[i]; - + for (int j = 0; j < 4; j++) { if ((u32)thisPoint->exits.asArray[j].path == -1) { thisPoint->exits.asArray[j].path = 0; @@ -62,32 +62,31 @@ bool WorldMapData::load(const char *filename) { } } } - - OSReport("Fixing up segment pointers [%d]\n", header->segmentCount); + + MapReport("Fixing up segment pointers [%d]\n", header->segmentCount); for (int i = 0; i < header->segmentCount; i++) { WMPathSegment *thisSegment = header->segmentList[i]; - + if ((u32)thisSegment->action == -1) { thisSegment->action = 0; } else { thisSegment->action = header->actionList[(u32)thisSegment->action]; } } - - OSReport("Load complete\n"); - + + MapReport("Load complete\n"); + return true; } -int WorldMapData::getPointID(WMPathPoint *point) { - WMDataHeader *header = (WMDataHeader*)this->fh.filePtr; - - for (int i = 0; i < header->pointCount; i++) { - if (header->pointList[i] == point) +int dWMPathData_c::getPointID(WMPathPoint *point) { + for (int i = 0; i < data->pointCount; i++) { + if (data->pointList[i] == point) return i; } - + return -1; } + diff --git a/src/worldmapdata.h b/src/worldmapdata.h index 1d6a305..16322b0 100644 --- a/src/worldmapdata.h +++ b/src/worldmapdata.h @@ -1,7 +1,7 @@ #ifndef __NEWER_WORLDMAPDATA_H #define __NEWER_WORLDMAPDATA_H -#include "fileload.h" +#include <common.h> #include <rvl/mtx.h> // Forward declarations @@ -12,7 +12,7 @@ struct WMPathDef; // here's a note: while most of these structs contain pointers to other structs, // in the data file these fields actually contain an index into the lists -// (defined in WMDataHeader) +// (defined in WMPathHeader) // WorldMapData::load() fixes these offsets. /******************************************************************************/ @@ -26,7 +26,7 @@ struct WMPathDef; struct WMPathEntrance { WMPathDef *path; bool isEndSide; - + bool isValid() { return (this->path != 0); } }; @@ -39,7 +39,7 @@ struct WMPathPoint { NONE_TYPE, LEVEL_TYPE }; - + // Paths you arrive on when you press a direction when at this point union { struct { @@ -50,11 +50,11 @@ struct WMPathPoint { } asDirection; WMPathEntrance asArray[4]; } exits; - + // Point metadata PointType type; int params[4]; - + Vec position; }; @@ -67,7 +67,7 @@ struct WMPathAction { enum ActionType { TELEPORT_TYPE // teleports to another submap }; - + // Action metadata ActionType type; int params[4]; @@ -87,7 +87,7 @@ struct WMPathSegment { short direction; bool useLastDir; bool alwaysSameDir; - + // Optional Action that's triggered when the player touches this segment WMPathAction *action; }; @@ -100,7 +100,7 @@ struct WMPathDef { // Path metadata WMPathPoint *startPoint; WMPathPoint *endPoint; - + int segCount; WMPathSegment *segments[1]; // variable-length array }; @@ -108,15 +108,15 @@ struct WMPathDef { -struct WMDataHeader { +struct WMPathHeader { u32 magic; - + WMPathDef **pathList; int pathCount; - + WMPathPoint **pointList; int pointCount; - + WMPathSegment **segmentList; int segmentCount; @@ -126,24 +126,26 @@ struct WMDataHeader { }; -class WorldMapData { +class dWMPathData_c { +private: + WMPathHeader *data; + public: - WorldMapData(); - ~WorldMapData(); - - bool load(const char *filename); - - FileHandle fh; - - int getPathCount() { - return ((WMDataHeader*)fh.filePtr)->pathCount; - } - - WMPathDef *getPath(int idx) { - return ((WMDataHeader*)fh.filePtr)->pathList[idx]; - } - + dWMPathData_c(); + ~dWMPathData_c(); + + bool load(void *data); + + int pathCount() { return data->pathCount; } + int pointCount() { return data->pointCount; } + int segmentCount() { return data->segmentCount; } + + WMPathDef *getPath(int idx) { return data->pathList[idx]; } + WMPathPoint *getPoint(int idx) { return data->pointList[idx]; } + WMPathSegment *getSegment(int idx) { return data->segmentList[idx]; } + int getPointID(WMPathPoint *point); }; #endif // __NEWER_WORLDMAPDATA_H + |