summaryrefslogtreecommitdiff
path: root/src/worldmap.h
blob: 1f8a9a3537a3fe8ecdbca46e81a6ccef4b532344 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*
 * Newer Super Mario Bros. Wii
 * World Maps
 *
 * Wish me luck. That's all I'm saying. --Treeki
 * Started: 03/06/2010; 11:52pm
 */

// TODO: add Save Error state

//#define MARIO_OPTIONS
//#define WM_DEBUGGING
//#define LEVEL_MENU

#include <common.h>
#include <game.h>

#ifdef LEVEL_MENU
#include "layoutlib.h"
#endif

#include "fileload.h"
#include "levelinfo.h"
#include "3dlib/treeki3d.h"
#include "worldmapdata.h"
#include <g3dhax.h>

enum WMDirection {
	LEFT,
	RIGHT,
	UP,
	DOWN
};

#ifdef WM_DEBUGGING
#define MapReport OSReport
#else
inline void MapReport(const char *str, ...) { }
#endif

void NewerMapDrawFunc();


struct WMResSetEntry {
	u32 key;
	u32 offset;
};

struct WMResSetHeader {
	u32 magic;
	u32 count;
	WMResSetEntry entries[1]; // dynamic size

	char *getName(int index) {
		return (char*)((u32)this + entries[index].offset);
	}
};

class dWMResourceMng_c {
private:
	bool hasSetPath;
	bool isSetLoaded;
	bool isLoadingComplete;

	char setPath[0x40];
	dDvdLoader_c setLoader;
	dDvdLoader_c *resLoaders;

	WMResSetHeader *setData;

public:
	dWMResourceMng_c();
	~dWMResourceMng_c();

	bool loadSet(const char *setName);
	void *operator[](u32 key);

	bool isLoaded();


	u32 resCount() {
		return setData->count;
	}

	u32 keyForIndex(u32 index) {
		return setData->entries[index].key;
	}

	void *dataForIndex(u32 index) {
		return resLoaders[index].buffer;
	}
};


class dWMMap_c : public dBase_c {
public:
	int onCreate();
	int onDelete();
	int onExecute();
	int onDraw();

	static dWMMap_c *build();
	static dWMMap_c *instance;
};


class dWorldCamera_c : public dBase_c {
public:
	int onCreate();
	int onDelete();
	int onExecute();
	int onDraw();

	Point3d camPos;
	Vec camRotate;

	static dWorldCamera_c *build();
	static dWorldCamera_c *instance;
};


class daWMPlayer_c : public dActor_c {
public:
	dPlayerModelHandler_c *modelHandler;

	int onCreate();
	int onDelete();
	int onExecute();
	int onDraw();

	int current_param;

	int currentAnim;
	float currentFrame;
	float currentUnk;
	float currentUpdateRate;

	void startAnimation(int id, float frame, float unk, float updateRate);

	static daWMPlayer_c *build();
	static daWMPlayer_c *instance;
};

// WORLD MAP CLASS LAYOUT
class dScNewerWorldMap_c : public dScene_c {
public:
	#ifdef LEVEL_MENU
	Layout *layout;
	int currentPage;
	int *selections;
	#endif
	int state;
	void *csMenu;
	void *selectCursor;
	void *numPeopleChange;
	void *yesNoWindow;
	void *continueObj;
	void *stockItem;
	void *stockItemShadow;
	void *easyPairing;

	void *levelInfo;
	FileHandle levelInfoFH;

	#ifndef LEVEL_MENU
	mHeapAllocator_c allocator;
	File modelFile;
	m3d::mdl_c model;

	void LoadModel();

	daWMPlayer_c *player;

	WorldMapData wmData;

	bool isMoving;
	WMPathPoint *currentPoint;
	WMPathPoint *nextPoint;

	WMPathDef *currentPath;
	WMPathSegment *currentSegment;
	int currentSegmentID;
	bool reverseThroughPath; // direction we are going through the path

	void HandleMovement();

	void StartMovementTo(WMDirection direction);
	void MoveToSegment(int id);

	void MoveThroughPath();

	void ActivatePoint();
	#endif

	void StartLevel(LevelInfo_Entry *entry);

	#ifdef LEVEL_MENU
	void StartLevel();
	void GenText();
	void SetTitle(const char *text);
	#endif

	int onCreate();
	int onDelete();
	int onExecute();
	int onDraw();

	static dScNewerWorldMap_c *build();
	static dScNewerWorldMap_c *instance;
};