summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/dCourse.h268
-rwxr-xr-xinclude/game.h22
-rw-r--r--kamek_pal.x5
-rw-r--r--src/tilesetfixer.cpp11
4 files changed, 295 insertions, 11 deletions
diff --git a/include/dCourse.h b/include/dCourse.h
new file mode 100644
index 0000000..7d8003c
--- /dev/null
+++ b/include/dCourse.h
@@ -0,0 +1,268 @@
+#ifndef __DCOURSE_H
+#define __DCOURSE_H
+
+// Proper headers for Course, not the old shit
+
+class dCourse_c {
+ public:
+ virtual ~dCourse_c();
+
+ void loadFromFile(int courseID);
+
+ struct tilesets_s {
+ char name0[32];
+ char name1[32];
+ char name2[32];
+ char name3[32];
+ };
+
+ struct settings_s {
+ u64 defaultFlags;
+ s16 courseFlag;
+ s16 timeLimit;
+ u8 _[4];
+ u8 startEntrance;
+ u8 __[3];
+ };
+
+ struct bounding_s {
+ s32 yBoundNormalTop;
+ s32 yBoundNormalBottom;
+ s32 yBoundSpecialTop;
+ s32 yBoundSpecialBottom;
+ u16 entryID;
+ u16 lockToBottom;
+ u32 unknown;
+ };
+
+ struct unk_s {
+ u16 unk1;
+ u16 unk2;
+ u16 unk3;
+ u16 unk4;
+ };
+
+ struct bg_s {
+ u16 entryID;
+ u16 xScrollRate;
+ u16 yScrollRate;
+ u16 yPosOffset;
+ u16 xPosOffset;
+ u16 fileID1;
+ u16 fileID2;
+ u16 fileID3;
+ u16 unk1;
+ u16 scale;
+ u32 unk2;
+ };
+
+ struct nextGoto_s {
+ enum Flag {
+ NO_ENTRY = 0x80,
+ CONNECTED_PIPE = 8,
+ LINK_FORWARD = 4,
+ CONNECTED_REVERSE = 1,
+ };
+
+ s16 xPos;
+ s16 yPos;
+ s16 cameraXPos;
+ s16 cameraYPos;
+ u8 entryID;
+ u8 destArea;
+ u8 destEntrance;
+ u8 type;
+ u8 unk1;
+ u8 zoneID;
+ u8 layerID;
+ u8 pathID;
+ u16 flags;
+ u16 unk2;
+ };
+
+ struct sprite_s {
+ u16 type;
+ s16 xPos;
+ s16 yPos;
+ u16 eventIDs;
+ u32 settings;
+ u8 zoneID;
+ u8 layerID;
+ u16 unused;
+ };
+
+ struct load_s {
+ u16 type;
+ u16 unused;
+ };
+
+ struct zone_s {
+ s16 xPos;
+ s16 yPos;
+ s16 xSize;
+ s16 ySize;
+ u16 modelShading;
+ u16 terrainShading;
+ u8 entryID;
+ u8 boundingID;
+ u8 scrollMode;
+ u8 zoomMode;
+ u8 unk10;
+ u8 visibility;
+ u8 fgID;
+ u8 bgID;
+ u8 mpBias;
+ u8 unk3;
+ u8 music;
+ u8 audioModifier;
+ };
+
+ struct rect_s {
+ s16 xPos;
+ s16 yPos;
+ s16 xSize;
+ s16 ySize;
+ u8 entryID;
+ u8 unused[3];
+ };
+
+ struct cameraFlag_s {
+ u32 unk1;
+ u32 unk2;
+ u32 unk3;
+ u8 unk4;
+ u8 scrollMode;
+ u8 zoomMode;
+ u8 unk5;
+ u16 unk6;
+ u8 eventID;
+ u8 unk7;
+ };
+
+ struct rail_s {
+ enum Flag {
+ LOOP = 2,
+ };
+
+ u8 entryID;
+ u8 unknown;
+ u16 startNode;
+ u16 nodeCount;
+ u16 flags;
+ };
+
+ struct railNode_s {
+ u16 xPos;
+ u16 yPos;
+ float speed;
+ float accel;
+ short unk1;
+ short unk2;
+ };
+
+
+ int areaNum;
+
+
+ union {
+ struct {
+ tilesets_s *tilesets;
+ settings_s *settings;
+ bounding_s *bounding;
+ unk_s *unk;
+ bg_s *topBG;
+ bg_s *bottomBG;
+ nextGoto_s *nextGoto;
+ sprite_s *sprite;
+ load_s *load;
+ zone_s *zone;
+ rect_s *rect;
+ cameraFlag_s *cameraFlag;
+ rail_s *rail;
+ railNode_s *railNode;
+ };
+ void *blocks[14];
+ };
+
+ union {
+ struct {
+ int tilesetsSize, settingsSize, boundingSize, unkSize;
+ int topBGSize, bottomBGSize, nextGotoSize, spriteSize;
+ int loadSize, zoneSize, rectSize, cameraFlagSize;
+ int railSize, railNodeSize;
+ };
+ int blockSizes[14];
+ };
+
+ union {
+ struct {
+ int tilesetsCount, settingsCount, boundingCount, unkCount;
+ int topBGCount, bottomBGCount, nextGotoCount, spriteCount;
+ int loadCount, zoneCount, rectCount, cameraFlagCount;
+ int railCount, railNodeCount;
+ };
+ int blockCounts[14];
+ };
+
+ sprite_s *zoneFirstSprite[64];
+ int zoneSpriteCount[64];
+ int zoneFirstSpriteIdx[64];
+
+
+
+ bounding_s *getBoundingByID(u8 id);
+ bg_s *getTopBGByID(u16 id);
+ bg_s *getBottomBGByID(u16 id);
+ nextGoto_s *getNextGotoByID(u8 id);
+ zone_s *getZoneByID(u8 id, mRect *output = 0);
+
+ u8 getZoneID(u8 id);
+ u8 getBoundingIDForZone(u8 id);
+ u8 getScrollForZone(u8 id);
+ u8 getZoomForZone(u8 id);
+ u8 getUnk10ForZone(u8 id);
+ u8 getMusicForZone(u8 id);
+ u8 getAudioModifierForZone(u8 id);
+ u8 getVisibilityForZone(u8 id);
+ u8 getTopBGIDForZone(u8 id);
+ u8 getBottomBGIDForZone(u8 id);
+ u16 getModelShadingForZone(u8 id);
+ u16 getTerrainShadingForZone(u8 id);
+ u8 getMPBiasForZone(u8 id);
+ u16 getWidthForZone(u8 id);
+
+ rect_s *getRectByID(u8 id, mRect *output = 0);
+
+ u8 getZoneIDContainingPosition(Vec *pos);
+ u8 getZoneIDContainingRect(mRect16 *rect);
+
+ bool doesZoneContainPosition(Vec *pos, zone_s *zone);
+ bool doesZoneContainRect(mRect16 *rect, zone_s *zone);
+};
+
+
+class dCourseFull_c {
+ public:
+ dCourse_c courses[4];
+
+ void loadFromFile();
+
+ dCourse_c *get(int id) {
+ if (courses[id].zone)
+ return &courses[id];
+ else
+ return 0;
+ }
+
+ static dCourseFull_c *instance;
+
+ static void createOnHeap(/*EGG::Heap*/void *heap);
+ static void deleteInstance();
+
+ // might not be part of this class, dunno
+ static void generateLevelFilename(int world, int level, char *outBuffer);
+ static char levelFilename[10];
+};
+
+#endif
+
diff --git a/include/game.h b/include/game.h
index 27504d9..a7bafac 100755
--- a/include/game.h
+++ b/include/game.h
@@ -343,6 +343,17 @@ public:
};
+// No idea if these actually exist or not
+class mRect {
+ public:
+ float x, y, width, height;
+};
+
+class mRect16 {
+ public:
+ short x, y, width, height;
+};
+
class mMtx {
Mtx data;
@@ -1046,6 +1057,8 @@ public:
u8 getUnkByte();
+ bool isInList() { return (list1 != 0); }
+
class List {
public:
u32 count;
@@ -1098,6 +1111,7 @@ public:
s16 rotDiffAlt;
u32 isRound;
u32 _CC;
+ // Flag 4 is icy
u32 flagsMaybe;
u32 _D4, _D8;
u8 isAddedToList, _DD, layer;
@@ -2535,6 +2549,14 @@ extern float GlobalScreenWidth, GlobalScreenHeight;
extern u32 GlobalTickCount;
+// A hack, imported from tilesetfixer.cpp
+extern void *BGDatClass, *StagePtr;
+inline int GetAreaNum() {
+ char *st = (char*)StagePtr;
+ return st[0x120E];
+}
+
+
#endif
diff --git a/kamek_pal.x b/kamek_pal.x
index bcfe72a..1c35fc9 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -33,6 +33,9 @@ SECTIONS {
original_onCreate__13daObjKinoko_cFv = 0x8087F8D0;
+ instance__13dCourseFull_c = 0x8042A178;
+ getRectByID__9dCourse_cFUcP5mRect = 0x8008E890;
+
/* Mr Sun Related */
ActivePhysics_InitWithStruct = 0x8008C3E0;
@@ -503,6 +506,8 @@ SECTIONS {
__ct__7PhysicsFv = 0x8007F7A0;
+ __dt__7PhysicsFv = 0x8007F810;
+ setup__7PhysicsFP8dActor_cffffPvPvPvUcUcP7Point2d = 0x8007FA40;
setup__7PhysicsFP8dActor_cPQ27Physics4InfoUcUcP7Point2d = 0x8007FB10;
addToList__7PhysicsFv = 0x8007F900;
removeFromList__7PhysicsFv = 0x8007F950;
diff --git a/src/tilesetfixer.cpp b/src/tilesetfixer.cpp
index a66fc14..73615a1 100644
--- a/src/tilesetfixer.cpp
+++ b/src/tilesetfixer.cpp
@@ -1,19 +1,8 @@
#include <common.h>
#include <game.h>
-extern void *BGDatClass, *StagePtr;
const char *GetTilesetName(void *cls, int areaNum, int slotNum);
-asm int GetAreaNum() {
- nofralloc
- lis r9, StagePtr@h
- ori r9, r9, StagePtr@l
- lwz r9, 0(r9)
- lbz r3, 0x120E(r9)
- blr
-}
-
-
void DoFixes(int slotNumber);
void SwapObjData(u8 *data, int slotNumber);