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 BehaviorOpcode {
53 SPAWN_CHILD_WITH_PARAM,
55 SET_HITBOX_WITH_OFFSET,
70inline std::ostream& operator<<(std::ostream& out,
const BehaviorOpcode& opcode) {
73 case BehaviorOpcode::BEGIN:
76 case BehaviorOpcode::DELAY:
79 case BehaviorOpcode::CALL:
82 case BehaviorOpcode::RETURN:
85 case BehaviorOpcode::GOTO:
88 case BehaviorOpcode::BEGIN_REPEAT:
89 output =
"BEGIN_REPEAT";
91 case BehaviorOpcode::END_REPEAT:
92 output =
"END_REPEAT";
94 case BehaviorOpcode::END_REPEAT_CONTINUE:
95 output =
"END_REPEAT_CONTINUE";
97 case BehaviorOpcode::BEGIN_LOOP:
98 output =
"BEGIN_LOOP";
100 case BehaviorOpcode::END_LOOP:
103 case BehaviorOpcode::BREAK:
106 case BehaviorOpcode::BREAK_UNUSED:
107 output =
"BREAK_UNUSED";
109 case BehaviorOpcode::CALL_NATIVE:
110 output =
"CALL_NATIVE";
112 case BehaviorOpcode::ADD_FLOAT:
113 output =
"ADD_FLOAT";
115 case BehaviorOpcode::SET_FLOAT:
116 output =
"SET_FLOAT";
118 case BehaviorOpcode::ADD_INT:
121 case BehaviorOpcode::SET_INT:
124 case BehaviorOpcode::OR_INT:
127 case BehaviorOpcode::BIT_CLEAR:
128 output =
"BIT_CLEAR";
130 case BehaviorOpcode::SET_INT_RAND_RSHIFT:
131 output =
"SET_INT_RAND_RSHIFT";
133 case BehaviorOpcode::SET_RANDOM_FLOAT:
134 output =
"SET_RANDOM_FLOAT";
136 case BehaviorOpcode::SET_RANDOM_INT:
137 output =
"SET_RANDOM_INT";
139 case BehaviorOpcode::ADD_RANDOM_FLOAT:
140 output =
"ADD_RANDOM_FLOAT";
142 case BehaviorOpcode::ADD_INT_RAND_RSHIFT:
143 output =
"ADD_INT_RAND_RSHIFT";
145 case BehaviorOpcode::CMD_NOP_1:
146 output =
"CMD_NOP_1";
148 case BehaviorOpcode::CMD_NOP_2:
149 output =
"CMD_NOP_2";
151 case BehaviorOpcode::CMD_NOP_3:
152 output =
"CMD_NOP_3";
154 case BehaviorOpcode::SET_MODEL:
155 output =
"SET_MODEL";
157 case BehaviorOpcode::SPAWN_CHILD:
158 output =
"SPAWN_CHILD";
160 case BehaviorOpcode::DEACTIVATE:
161 output =
"DEACTIVATE";
163 case BehaviorOpcode::DROP_TO_FLOOR:
164 output =
"DROP_TO_FLOOR";
166 case BehaviorOpcode::SUM_FLOAT:
167 output =
"SUM_FLOAT";
169 case BehaviorOpcode::SUM_INT:
172 case BehaviorOpcode::BILLBOARD:
173 output =
"BILLBOARD";
175 case BehaviorOpcode::HIDE:
178 case BehaviorOpcode::SET_HITBOX:
179 output =
"SET_HITBOX";
181 case BehaviorOpcode::CMD_NOP_4:
182 output =
"CMD_NOP_4";
184 case BehaviorOpcode::DELAY_VAR:
185 output =
"DELAY_VAR";
187 case BehaviorOpcode::BEGIN_REPEAT_UNUSED:
188 output =
"BEGIN_REPEAT_UNUSED";
190 case BehaviorOpcode::LOAD_ANIMATIONS:
191 output =
"LOAD_ANIMATIONS";
193 case BehaviorOpcode::ANIMATE:
196 case BehaviorOpcode::SPAWN_CHILD_WITH_PARAM:
197 output =
"SPAWN_CHILD_WITH_PARAM";
199 case BehaviorOpcode::LOAD_COLLISION_DATA:
200 output =
"LOAD_COLLISION_DATA";
202 case BehaviorOpcode::SET_HITBOX_WITH_OFFSET:
203 output =
"SET_HITBOX_WITH_OFFSET";
205 case BehaviorOpcode::SPAWN_OBJ:
206 output =
"SPAWN_OBJ";
208 case BehaviorOpcode::SET_HOME:
211 case BehaviorOpcode::SET_HURTBOX:
212 output =
"SET_HURTBOX";
214 case BehaviorOpcode::SET_INTERACT_TYPE:
215 output =
"SET_INTERACT_TYPE";
217 case BehaviorOpcode::SET_OBJ_PHYSICS:
218 output =
"SET_OBJ_PHYSICS";
220 case BehaviorOpcode::SET_INTERACT_SUBTYPE:
221 output =
"SET_INTERACT_SUBTYPE";
223 case BehaviorOpcode::SCALE:
226 case BehaviorOpcode::PARENT_BIT_CLEAR:
227 output =
"PARENT_BIT_CLEAR";
229 case BehaviorOpcode::ANIMATE_TEXTURE:
230 output =
"ANIMATE_TEXTURE";
232 case BehaviorOpcode::DISABLE_RENDERING:
233 output =
"DISABLE_RENDERING";
235 case BehaviorOpcode::SET_INT_UNUSED:
236 output =
"SET_INT_UNUSED";
238 case BehaviorOpcode::SPAWN_WATER_DROPLET:
239 output =
"SPAWN_WATER_DROPLET";
242 throw std::runtime_error(
"Unknown Behavior Opcode");
245 return out << output;
248#define cur_behavior_cmd_u8(offset) \
249 (cmd[CMD_PROCESS_OFFSET(offset)])
251#define cur_behavior_cmd_s16(offset) \
252 (int16_t)BSWAP16((*(int16_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
254#define cur_behavior_cmd_s32(offset) \
255 (int32_t)BSWAP32((*(int32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
257#define cur_behavior_cmd_u32(offset) \
258 (uint32_t) BSWAP32((*(uint32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
260#define cur_behavior_cmd_f32(offset) \
261 (float) BSWAP32((*(float *) &cmd[CMD_PROCESS_OFFSET(offset)]))