summaryrefslogtreecommitdiff
path: root/src/koopatlas/mapdata.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/koopatlas/mapdata.h')
-rw-r--r--src/koopatlas/mapdata.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/koopatlas/mapdata.h b/src/koopatlas/mapdata.h
new file mode 100644
index 0000000..2b643bd
--- /dev/null
+++ b/src/koopatlas/mapdata.h
@@ -0,0 +1,191 @@
+#include <game.h>
+
+// forward declarations
+struct dKPLayer_s;
+
+/******************************************************************************
+ * Doodads
+ ******************************************************************************/
+struct dKPDoodad_s {
+ struct animation_s {
+ enum LoopTypes {
+ CONTIGUOUS, LOOP, REVERSE_LOOP
+ };
+
+ enum CurveTypes {
+ LINEAR, SIN, COS
+ };
+
+ enum AnimTypes {
+ X_POS, Y_POS, ANGLE, X_SCALE, Y_SCALE, OPACITY
+ };
+
+ LoopTypes loop;
+ CurveTypes curve;
+ float frameCount;
+ AnimTypes type;
+ float start, end;
+ };
+
+ float x, y;
+ float width, height;
+ float angle;
+
+ GXTexObj *texObj;
+ int animationCount;
+ animation_s animations[1]; // variable size
+};
+
+/******************************************************************************
+ * Paths
+ ******************************************************************************/
+struct dKPPath_s;
+
+struct dKPNode_s {
+ enum NodeTypes {
+ PASS_THROUGH, STOP, LEVEL, CHANGE
+ };
+
+ short x, y;
+ dKPPath_s *exits[4];
+ dKPLayer_s *tileLayer, *doodadLayer;
+
+ int type;
+ union {
+ struct { u8 levelNumber[2]; };
+ struct { char *destMap; u8 thisID, foreignID, transition; };
+ };
+};
+
+struct dKPPath_s {
+ dKPNode_s *start, *end;
+ dKPLayer_s *tileLayer, *doodadLayer;
+
+ u8 unlockType; // 0 = always, 1 = start, 2 = end
+ u8 unlockIsSecret;
+ float speed;
+ int animation;
+};
+
+/******************************************************************************
+ * Tying It All Together
+ ******************************************************************************/
+struct dKPLayer_s {
+ enum LayerTypes {
+ OBJECTS, DOODADS, PATHS
+ };
+
+ LayerTypes type;
+
+ typedef u16 sector_s[16][16];
+
+ union {
+ struct {
+ GXTexObj *tileset;
+ union {
+ int sectorBounds[4];
+ struct {
+ int sectorLeft;
+ int sectorTop;
+ int sectorRight;
+ int sectorBottom;
+ };
+ };
+ union {
+ int bounds[4];
+ struct {
+ int left;
+ int top;
+ int right;
+ int bottom;
+ };
+ };
+ u16 indices[1]; // variable size
+ };
+
+ struct {
+ int doodadCount;
+ dKPDoodad_s *doodads[1]; // variable size
+ };
+
+ struct {
+ int nodeCount;
+ dKPNode_s **nodes;
+ int pathCount;
+ dKPPath_s **paths;
+ };
+ };
+};
+
+struct dKPUnlock_s {
+ u8 isSecret;
+ u8 level[2];
+ u8 _;
+
+ dKPPath_s *targetPath;
+};
+
+struct dKPMapFile_s {
+ int layerCount;
+ dKPLayer_s **layers;
+
+ int unlockCount;
+ dKPUnlock_s *unlocks;
+
+ int tilesetCount;
+ GXTexObj *tilesets;
+
+ dKPLayer_s::sector_s sectors[1]; // variable size
+};
+
+class dKPMapData_c {
+ private:
+ dDvdLoader_c m_fileLoader;
+
+ template <typename T>
+ inline T* fixRef(T*& indexAsPtr) {
+ unsigned int index = (unsigned int)indexAsPtr;
+ if (index == 0xFFFFFFFF)
+ indexAsPtr = 0;
+ else
+ indexAsPtr = (T*)(((char*)data) + index);
+ return indexAsPtr;
+ }
+
+ template <typename T>
+ inline T* fixRefSafe(T*& indexAsPtr) {
+ unsigned int index = (unsigned int)indexAsPtr;
+ if (index == 0xFFFFFFFF)
+ indexAsPtr = 0;
+ else if (index < 0x80000000)
+ indexAsPtr = (T*)(((char*)data) + index);
+ return indexAsPtr;
+ }
+
+ inline void fixTexObjSafe(GXTexObj *obj) {
+ if (obj->dummy[3] >= 0x10000000) {
+ obj->dummy[3] = (((u32)data) & 0x7FFFFFFF) + (obj->dummy[3] - 0x10000000);
+ obj->dummy[3] >>= 5;
+ }
+ }
+
+ bool fixedUp;
+ bool tilesetsLoaded;
+
+ void fixup();
+
+ bool loadTilesets();
+ void unloadTilesets();
+
+
+ public:
+ dDvdLoader_c *tilesetLoaders;
+ dKPMapFile_s *data;
+ dKPLayer_s *pathLayer;
+
+ dKPMapData_c();
+ bool load(const char *filename);
+ ~dKPMapData_c();
+};
+
+