summaryrefslogtreecommitdiff
path: root/src/worldmapdata.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/worldmapdata.h')
-rw-r--r--src/worldmapdata.h149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/worldmapdata.h b/src/worldmapdata.h
new file mode 100644
index 0000000..1d6a305
--- /dev/null
+++ b/src/worldmapdata.h
@@ -0,0 +1,149 @@
+#ifndef __NEWER_WORLDMAPDATA_H
+#define __NEWER_WORLDMAPDATA_H
+
+#include "fileload.h"
+#include <rvl/mtx.h>
+
+// Forward declarations
+struct WMPathPoint;
+struct WMPathAction;
+struct WMPathSegment;
+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)
+// WorldMapData::load() fixes these offsets.
+
+/******************************************************************************/
+// Definition for an entrance onto one side of a path
+// (TODO: Maybe rename this struct?)
+
+// Note: a null WMPathEntrance has no path defined
+// since the path pointer is stored as an index in the data file, the index for
+// a null path becomes -1
+
+struct WMPathEntrance {
+ WMPathDef *path;
+ bool isEndSide;
+
+ bool isValid() { return (this->path != 0); }
+};
+
+
+/******************************************************************************/
+// Definition for one point on the map
+
+struct WMPathPoint {
+ enum PointType {
+ NONE_TYPE,
+ LEVEL_TYPE
+ };
+
+ // Paths you arrive on when you press a direction when at this point
+ union {
+ struct {
+ WMPathEntrance left;
+ WMPathEntrance right;
+ WMPathEntrance up;
+ WMPathEntrance down;
+ } asDirection;
+ WMPathEntrance asArray[4];
+ } exits;
+
+ // Point metadata
+ PointType type;
+ int params[4];
+
+ Vec position;
+};
+
+
+/******************************************************************************/
+// Definition for an action that can be triggered when the player reaches a
+// specific point
+
+struct WMPathAction {
+ enum ActionType {
+ TELEPORT_TYPE // teleports to another submap
+ };
+
+ // Action metadata
+ ActionType type;
+ int params[4];
+};
+
+
+/******************************************************************************/
+// Definition for one part of a path
+
+struct WMPathSegment {
+ // Segment metadata
+ Vec start;
+ Vec end;
+ float stepsPerFrame;
+ int animationType;
+ float animationSpeed;
+ short direction;
+ bool useLastDir;
+ bool alwaysSameDir;
+
+ // Optional Action that's triggered when the player touches this segment
+ WMPathAction *action;
+};
+
+
+/******************************************************************************/
+// Definition for one path
+
+struct WMPathDef {
+ // Path metadata
+ WMPathPoint *startPoint;
+ WMPathPoint *endPoint;
+
+ int segCount;
+ WMPathSegment *segments[1]; // variable-length array
+};
+
+
+
+
+struct WMDataHeader {
+ u32 magic;
+
+ WMPathDef **pathList;
+ int pathCount;
+
+ WMPathPoint **pointList;
+ int pointCount;
+
+ WMPathSegment **segmentList;
+ int segmentCount;
+
+ // todo: remove action list?
+ WMPathAction **actionList;
+ int actionCount;
+};
+
+
+class WorldMapData {
+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];
+ }
+
+ int getPointID(WMPathPoint *point);
+};
+
+#endif // __NEWER_WORLDMAPDATA_H