summaryrefslogtreecommitdiff
path: root/src/worldmapdata.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/worldmapdata.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/worldmapdata.cpp b/src/worldmapdata.cpp
new file mode 100644
index 0000000..0473bbb
--- /dev/null
+++ b/src/worldmapdata.cpp
@@ -0,0 +1,93 @@
+#include "worldmapdata.h"
+
+WorldMapData::WorldMapData() {
+
+}
+
+WorldMapData::~WorldMapData() {
+ FreeFile(&this->fh);
+}
+
+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);
+
+ // 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");
+ 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);
+ 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);
+
+ 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);
+ 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;
+ } else {
+ thisPoint->exits.asArray[j].path = header->pathList[(u32)thisPoint->exits.asArray[j].path];
+ }
+ }
+ }
+
+ OSReport("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");
+
+ 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)
+ return i;
+ }
+
+ return -1;
+}