4#include "n64/CommandMacros.h"
6#include <spdlog/spdlog.h>
7#include <spdlog/fmt/ostr.h>
8#include <lib/binarytools/BinaryWriter.h>
9#include <types/Vec3D.h>
11enum class LevelOpcode {
75inline std::ostream& operator<<(std::ostream& out,
const LevelOpcode& opcode) {
78 case LevelOpcode::EXECUTE:
81 case LevelOpcode::EXIT_AND_EXECUTE:
82 output =
"EXIT_AND_EXECUTE";
84 case LevelOpcode::EXIT:
87 case LevelOpcode::SLEEP:
90 case LevelOpcode::SLEEP_BEFORE_EXIT:
91 output =
"SLEEP_BEFORE_EXIT";
93 case LevelOpcode::JUMP:
96 case LevelOpcode::JUMP_LINK:
99 case LevelOpcode::RETURN:
102 case LevelOpcode::JUMP_LINK_PUSH_ARG:
103 output =
"JUMP_LINK_PUSH_ARG";
105 case LevelOpcode::JUMP_N_TIMES:
106 output =
"JUMP_N_TIMES";
108 case LevelOpcode::LOOP_BEGIN:
109 output =
"LOOP_BEGIN";
111 case LevelOpcode::LOOP_UNTIL:
112 output =
"LOOP_UNTIL";
114 case LevelOpcode::JUMP_IF:
117 case LevelOpcode::JUMP_LINK_IF:
118 output =
"JUMP_LINK_IF";
120 case LevelOpcode::SKIP_IF:
123 case LevelOpcode::SKIP:
126 case LevelOpcode::SKIP_NOP:
129 case LevelOpcode::CALL:
132 case LevelOpcode::CALL_LOOP:
133 output =
"CALL_LOOP";
135 case LevelOpcode::SET_REG:
138 case LevelOpcode::PUSH_POOL:
139 output =
"PUSH_POOL";
141 case LevelOpcode::POP_POOL:
144 case LevelOpcode::FIXED_LOAD:
145 output =
"FIXED_LOAD";
147 case LevelOpcode::LOAD_RAW:
150 case LevelOpcode::LOAD_MIO0:
151 output =
"LOAD_MIO0";
153 case LevelOpcode::LOAD_MARIO_HEAD:
154 output =
"LOAD_MARIO_HEAD";
156 case LevelOpcode::LOAD_MIO0_TEXTURE:
157 output =
"LOAD_MIO0_TEXTURE";
159 case LevelOpcode::INIT_LEVEL:
160 output =
"INIT_LEVEL";
162 case LevelOpcode::CLEAR_LEVEL:
163 output =
"CLEAR_LEVEL";
165 case LevelOpcode::ALLOC_LEVEL_POOL:
166 output =
"ALLOC_LEVEL_POOL";
168 case LevelOpcode::FREE_LEVEL_POOL:
169 output =
"FREE_LEVEL_POOL";
171 case LevelOpcode::AREA:
174 case LevelOpcode::END_AREA:
177 case LevelOpcode::LOAD_MODEL_FROM_DL:
178 output =
"LOAD_MODEL_FROM_DL";
180 case LevelOpcode::LOAD_MODEL_FROM_GEO:
181 output =
"LOAD_MODEL_FROM_GEO";
183 case LevelOpcode::CMD23:
186 case LevelOpcode::OBJECT_WITH_ACTS:
187 output =
"OBJECT_WITH_ACTS";
189 case LevelOpcode::MARIO:
192 case LevelOpcode::WARP_NODE:
193 output =
"WARP_NODE";
195 case LevelOpcode::PAINTING_WARP_NODE:
196 output =
"PAINTING_WARP_NODE";
198 case LevelOpcode::INSTANT_WARP:
199 output =
"INSTANT_WARP";
201 case LevelOpcode::LOAD_AREA:
202 output =
"LOAD_AREA";
204 case LevelOpcode::CMD2A:
207 case LevelOpcode::MARIO_POS:
208 output =
"MARIO_POS";
210 case LevelOpcode::CMD2C:
213 case LevelOpcode::CMD2D:
216 case LevelOpcode::TERRAIN:
219 case LevelOpcode::ROOMS:
222 case LevelOpcode::SHOW_DIALOG:
223 output =
"SHOW_DIALOG";
225 case LevelOpcode::TERRAIN_TYPE:
226 output =
"TERRAIN_TYPE";
228 case LevelOpcode::NOP:
231 case LevelOpcode::TRANSITION:
232 output =
"TRANSITION";
234 case LevelOpcode::BLACKOUT:
237 case LevelOpcode::GAMMA:
240 case LevelOpcode::SET_BACKGROUND_MUSIC:
241 output =
"SET_BACKGROUND_MUSIC";
243 case LevelOpcode::SET_MENU_MUSIC:
244 output =
"SET_MENU_MUSIC";
246 case LevelOpcode::STOP_MUSIC:
247 output =
"STOP_MUSIC";
249 case LevelOpcode::MACRO_OBJECTS:
250 output =
"MACRO_OBJECTS";
252 case LevelOpcode::CMD3A:
255 case LevelOpcode::WHIRLPOOL:
256 output =
"WHIRLPOOL";
258 case LevelOpcode::GET_OR_SET:
259 output =
"GET_OR_SET";
262 throw std::runtime_error(
"Unknown Level Opcode");
265 return out << output;
268#define cur_level_cmd_u8(offset) \
269 (cmd[CMD_PROCESS_OFFSET(offset)])
271#define cur_level_cmd_s16(offset) \
272 (int16_t)BSWAP16((*(int16_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
274#define cur_level_cmd_s32(offset) \
275 (int32_t)BSWAP32((*(int32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
277#define cur_level_cmd_u32(offset) \
278 (uint32_t) BSWAP32((*(uint32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
280#define cur_level_cmd_f32(offset) \
281 (float) BSWAP32((*(float *) &cmd[CMD_PROCESS_OFFSET(offset)]))