Torch
Loading...
Searching...
No Matches
LevelCommand.h
1#pragma once
2
3#include "endianness.h"
4#include "n64/CommandMacros.h"
5#include <string>
6#include <spdlog/spdlog.h>
7#include <spdlog/fmt/ostr.h>
8#include <lib/binarytools/BinaryWriter.h>
9#include <types/Vec3D.h>
10
11enum class LevelOpcode {
12 EXECUTE,
13 EXIT_AND_EXECUTE,
14 EXIT,
15 SLEEP,
16 SLEEP_BEFORE_EXIT,
17 JUMP,
18 JUMP_LINK,
19 RETURN,
20 JUMP_LINK_PUSH_ARG,
21 JUMP_N_TIMES,
22 LOOP_BEGIN,
23 LOOP_UNTIL,
24 JUMP_IF,
25 JUMP_LINK_IF,
26 SKIP_IF,
27 SKIP,
28 SKIP_NOP,
29 CALL,
30 CALL_LOOP,
31 SET_REG,
32 PUSH_POOL,
33 POP_POOL,
34 FIXED_LOAD,
35 LOAD_RAW,
36 LOAD_MIO0,
37 LOAD_MARIO_HEAD,
38 LOAD_MIO0_TEXTURE,
39 INIT_LEVEL,
40 CLEAR_LEVEL,
41 ALLOC_LEVEL_POOL,
42 FREE_LEVEL_POOL,
43 AREA,
44 END_AREA,
45 LOAD_MODEL_FROM_DL,
46 LOAD_MODEL_FROM_GEO,
47 CMD23,
48 OBJECT_WITH_ACTS,
49 MARIO,
50 WARP_NODE,
51 PAINTING_WARP_NODE,
52 INSTANT_WARP,
53 LOAD_AREA,
54 CMD2A,
55 MARIO_POS,
56 CMD2C,
57 CMD2D,
58 TERRAIN,
59 ROOMS,
60 SHOW_DIALOG,
61 TERRAIN_TYPE,
62 NOP,
63 TRANSITION,
64 BLACKOUT,
65 GAMMA,
66 SET_BACKGROUND_MUSIC,
67 SET_MENU_MUSIC,
68 STOP_MUSIC,
69 MACRO_OBJECTS,
70 CMD3A,
71 WHIRLPOOL,
72 GET_OR_SET,
73};
74
75inline std::ostream& operator<<(std::ostream& out, const LevelOpcode& opcode) {
76 std::string output;
77 switch (opcode) {
78 case LevelOpcode::EXECUTE:
79 output = "EXECUTE";
80 break;
81 case LevelOpcode::EXIT_AND_EXECUTE:
82 output = "EXIT_AND_EXECUTE";
83 break;
84 case LevelOpcode::EXIT:
85 output = "EXIT";
86 break;
87 case LevelOpcode::SLEEP:
88 output = "SLEEP";
89 break;
90 case LevelOpcode::SLEEP_BEFORE_EXIT:
91 output = "SLEEP_BEFORE_EXIT";
92 break;
93 case LevelOpcode::JUMP:
94 output = "JUMP";
95 break;
96 case LevelOpcode::JUMP_LINK:
97 output = "JUMP_LINK";
98 break;
99 case LevelOpcode::RETURN:
100 output = "RETURN";
101 break;
102 case LevelOpcode::JUMP_LINK_PUSH_ARG:
103 output = "JUMP_LINK_PUSH_ARG";
104 break;
105 case LevelOpcode::JUMP_N_TIMES:
106 output = "JUMP_N_TIMES";
107 break;
108 case LevelOpcode::LOOP_BEGIN:
109 output = "LOOP_BEGIN";
110 break;
111 case LevelOpcode::LOOP_UNTIL:
112 output = "LOOP_UNTIL";
113 break;
114 case LevelOpcode::JUMP_IF:
115 output = "JUMP_IF";
116 break;
117 case LevelOpcode::JUMP_LINK_IF:
118 output = "JUMP_LINK_IF";
119 break;
120 case LevelOpcode::SKIP_IF:
121 output = "SKIP_IF";
122 break;
123 case LevelOpcode::SKIP:
124 output = "SKIP";
125 break;
126 case LevelOpcode::SKIP_NOP:
127 output = "SKIP_NOP";
128 break;
129 case LevelOpcode::CALL:
130 output = "CALL";
131 break;
132 case LevelOpcode::CALL_LOOP:
133 output = "CALL_LOOP";
134 break;
135 case LevelOpcode::SET_REG:
136 output = "SET_REG";
137 break;
138 case LevelOpcode::PUSH_POOL:
139 output = "PUSH_POOL";
140 break;
141 case LevelOpcode::POP_POOL:
142 output = "POP_POOL";
143 break;
144 case LevelOpcode::FIXED_LOAD:
145 output = "FIXED_LOAD";
146 break;
147 case LevelOpcode::LOAD_RAW:
148 output = "LOAD_RAW";
149 break;
150 case LevelOpcode::LOAD_MIO0:
151 output = "LOAD_MIO0";
152 break;
153 case LevelOpcode::LOAD_MARIO_HEAD:
154 output = "LOAD_MARIO_HEAD";
155 break;
156 case LevelOpcode::LOAD_MIO0_TEXTURE:
157 output = "LOAD_MIO0_TEXTURE";
158 break;
159 case LevelOpcode::INIT_LEVEL:
160 output = "INIT_LEVEL";
161 break;
162 case LevelOpcode::CLEAR_LEVEL:
163 output = "CLEAR_LEVEL";
164 break;
165 case LevelOpcode::ALLOC_LEVEL_POOL:
166 output = "ALLOC_LEVEL_POOL";
167 break;
168 case LevelOpcode::FREE_LEVEL_POOL:
169 output = "FREE_LEVEL_POOL";
170 break;
171 case LevelOpcode::AREA:
172 output = "AREA";
173 break;
174 case LevelOpcode::END_AREA:
175 output = "END_AREA";
176 break;
177 case LevelOpcode::LOAD_MODEL_FROM_DL:
178 output = "LOAD_MODEL_FROM_DL";
179 break;
180 case LevelOpcode::LOAD_MODEL_FROM_GEO:
181 output = "LOAD_MODEL_FROM_GEO";
182 break;
183 case LevelOpcode::CMD23:
184 output = "CMD23";
185 break;
186 case LevelOpcode::OBJECT_WITH_ACTS:
187 output = "OBJECT_WITH_ACTS";
188 break;
189 case LevelOpcode::MARIO:
190 output = "MARIO";
191 break;
192 case LevelOpcode::WARP_NODE:
193 output = "WARP_NODE";
194 break;
195 case LevelOpcode::PAINTING_WARP_NODE:
196 output = "PAINTING_WARP_NODE";
197 break;
198 case LevelOpcode::INSTANT_WARP:
199 output = "INSTANT_WARP";
200 break;
201 case LevelOpcode::LOAD_AREA:
202 output = "LOAD_AREA";
203 break;
204 case LevelOpcode::CMD2A:
205 output = "CMD2A";
206 break;
207 case LevelOpcode::MARIO_POS:
208 output = "MARIO_POS";
209 break;
210 case LevelOpcode::CMD2C:
211 output = "CMD2C";
212 break;
213 case LevelOpcode::CMD2D:
214 output = "CMD2D";
215 break;
216 case LevelOpcode::TERRAIN:
217 output = "TERRAIN";
218 break;
219 case LevelOpcode::ROOMS:
220 output = "ROOMS";
221 break;
222 case LevelOpcode::SHOW_DIALOG:
223 output = "SHOW_DIALOG";
224 break;
225 case LevelOpcode::TERRAIN_TYPE:
226 output = "TERRAIN_TYPE";
227 break;
228 case LevelOpcode::NOP:
229 output = "NOP";
230 break;
231 case LevelOpcode::TRANSITION:
232 output = "TRANSITION";
233 break;
234 case LevelOpcode::BLACKOUT:
235 output = "BLACKOUT";
236 break;
237 case LevelOpcode::GAMMA:
238 output = "GAMMA";
239 break;
240 case LevelOpcode::SET_BACKGROUND_MUSIC:
241 output = "SET_BACKGROUND_MUSIC";
242 break;
243 case LevelOpcode::SET_MENU_MUSIC:
244 output = "SET_MENU_MUSIC";
245 break;
246 case LevelOpcode::STOP_MUSIC:
247 output = "STOP_MUSIC";
248 break;
249 case LevelOpcode::MACRO_OBJECTS:
250 output = "MACRO_OBJECTS";
251 break;
252 case LevelOpcode::CMD3A:
253 output = "CMD3A";
254 break;
255 case LevelOpcode::WHIRLPOOL:
256 output = "WHIRLPOOL";
257 break;
258 case LevelOpcode::GET_OR_SET:
259 output = "GET_OR_SET";
260 break;
261 default:
262 throw std::runtime_error("Unknown Level Opcode");
263 }
264
265 return out << output;
266}
267
268#define cur_level_cmd_u8(offset) \
269 (cmd[CMD_PROCESS_OFFSET(offset)])
270
271#define cur_level_cmd_s16(offset) \
272 (int16_t)BSWAP16((*(int16_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
273
274#define cur_level_cmd_s32(offset) \
275 (int32_t)BSWAP32((*(int32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
276
277#define cur_level_cmd_u32(offset) \
278 (uint32_t) BSWAP32((*(uint32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
279
280#define cur_level_cmd_f32(offset) \
281 (float) BSWAP32((*(float *) &cmd[CMD_PROCESS_OFFSET(offset)]))