Torch
Loading...
Searching...
No Matches
BehaviorCommand.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 BehaviorOpcode {
12 BEGIN,
13 DELAY,
14 CALL,
15 RETURN,
16 GOTO,
17 BEGIN_REPEAT,
18 END_REPEAT,
19 END_REPEAT_CONTINUE,
20 BEGIN_LOOP,
21 END_LOOP,
22 BREAK,
23 BREAK_UNUSED,
24 CALL_NATIVE,
25 ADD_FLOAT,
26 SET_FLOAT,
27 ADD_INT,
28 SET_INT,
29 OR_INT,
30 BIT_CLEAR,
31 SET_INT_RAND_RSHIFT,
32 SET_RANDOM_FLOAT,
33 SET_RANDOM_INT,
34 ADD_RANDOM_FLOAT,
35 ADD_INT_RAND_RSHIFT,
36 CMD_NOP_1,
37 CMD_NOP_2,
38 CMD_NOP_3,
39 SET_MODEL,
40 SPAWN_CHILD,
41 DEACTIVATE,
42 DROP_TO_FLOOR,
43 SUM_FLOAT,
44 SUM_INT,
45 BILLBOARD,
46 HIDE,
47 SET_HITBOX,
48 CMD_NOP_4,
49 DELAY_VAR,
50 BEGIN_REPEAT_UNUSED,
51 LOAD_ANIMATIONS,
52 ANIMATE,
53 SPAWN_CHILD_WITH_PARAM,
54 LOAD_COLLISION_DATA,
55 SET_HITBOX_WITH_OFFSET,
56 SPAWN_OBJ,
57 SET_HOME,
58 SET_HURTBOX,
59 SET_INTERACT_TYPE,
60 SET_OBJ_PHYSICS,
61 SET_INTERACT_SUBTYPE,
62 SCALE,
63 PARENT_BIT_CLEAR,
64 ANIMATE_TEXTURE,
65 DISABLE_RENDERING,
66 SET_INT_UNUSED,
67 SPAWN_WATER_DROPLET,
68};
69
70inline std::ostream& operator<<(std::ostream& out, const BehaviorOpcode& opcode) {
71 std::string output;
72 switch (opcode) {
73 case BehaviorOpcode::BEGIN:
74 output = "BEGIN";
75 break;
76 case BehaviorOpcode::DELAY:
77 output = "DELAY";
78 break;
79 case BehaviorOpcode::CALL:
80 output = "CALL";
81 break;
82 case BehaviorOpcode::RETURN:
83 output = "RETURN";
84 break;
85 case BehaviorOpcode::GOTO:
86 output = "GOTO";
87 break;
88 case BehaviorOpcode::BEGIN_REPEAT:
89 output = "BEGIN_REPEAT";
90 break;
91 case BehaviorOpcode::END_REPEAT:
92 output = "END_REPEAT";
93 break;
94 case BehaviorOpcode::END_REPEAT_CONTINUE:
95 output = "END_REPEAT_CONTINUE";
96 break;
97 case BehaviorOpcode::BEGIN_LOOP:
98 output = "BEGIN_LOOP";
99 break;
100 case BehaviorOpcode::END_LOOP:
101 output = "END_LOOP";
102 break;
103 case BehaviorOpcode::BREAK:
104 output = "BREAK";
105 break;
106 case BehaviorOpcode::BREAK_UNUSED:
107 output = "BREAK_UNUSED";
108 break;
109 case BehaviorOpcode::CALL_NATIVE:
110 output = "CALL_NATIVE";
111 break;
112 case BehaviorOpcode::ADD_FLOAT:
113 output = "ADD_FLOAT";
114 break;
115 case BehaviorOpcode::SET_FLOAT:
116 output = "SET_FLOAT";
117 break;
118 case BehaviorOpcode::ADD_INT:
119 output = "ADD_INT";
120 break;
121 case BehaviorOpcode::SET_INT:
122 output = "SET_INT";
123 break;
124 case BehaviorOpcode::OR_INT:
125 output = "OR_INT";
126 break;
127 case BehaviorOpcode::BIT_CLEAR:
128 output = "BIT_CLEAR";
129 break;
130 case BehaviorOpcode::SET_INT_RAND_RSHIFT:
131 output = "SET_INT_RAND_RSHIFT";
132 break;
133 case BehaviorOpcode::SET_RANDOM_FLOAT:
134 output = "SET_RANDOM_FLOAT";
135 break;
136 case BehaviorOpcode::SET_RANDOM_INT:
137 output = "SET_RANDOM_INT";
138 break;
139 case BehaviorOpcode::ADD_RANDOM_FLOAT:
140 output = "ADD_RANDOM_FLOAT";
141 break;
142 case BehaviorOpcode::ADD_INT_RAND_RSHIFT:
143 output = "ADD_INT_RAND_RSHIFT";
144 break;
145 case BehaviorOpcode::CMD_NOP_1:
146 output = "CMD_NOP_1";
147 break;
148 case BehaviorOpcode::CMD_NOP_2:
149 output = "CMD_NOP_2";
150 break;
151 case BehaviorOpcode::CMD_NOP_3:
152 output = "CMD_NOP_3";
153 break;
154 case BehaviorOpcode::SET_MODEL:
155 output = "SET_MODEL";
156 break;
157 case BehaviorOpcode::SPAWN_CHILD:
158 output = "SPAWN_CHILD";
159 break;
160 case BehaviorOpcode::DEACTIVATE:
161 output = "DEACTIVATE";
162 break;
163 case BehaviorOpcode::DROP_TO_FLOOR:
164 output = "DROP_TO_FLOOR";
165 break;
166 case BehaviorOpcode::SUM_FLOAT:
167 output = "SUM_FLOAT";
168 break;
169 case BehaviorOpcode::SUM_INT:
170 output = "SUM_INT";
171 break;
172 case BehaviorOpcode::BILLBOARD:
173 output = "BILLBOARD";
174 break;
175 case BehaviorOpcode::HIDE:
176 output = "HIDE";
177 break;
178 case BehaviorOpcode::SET_HITBOX:
179 output = "SET_HITBOX";
180 break;
181 case BehaviorOpcode::CMD_NOP_4:
182 output = "CMD_NOP_4";
183 break;
184 case BehaviorOpcode::DELAY_VAR:
185 output = "DELAY_VAR";
186 break;
187 case BehaviorOpcode::BEGIN_REPEAT_UNUSED:
188 output = "BEGIN_REPEAT_UNUSED";
189 break;
190 case BehaviorOpcode::LOAD_ANIMATIONS:
191 output = "LOAD_ANIMATIONS";
192 break;
193 case BehaviorOpcode::ANIMATE:
194 output = "ANIMATE";
195 break;
196 case BehaviorOpcode::SPAWN_CHILD_WITH_PARAM:
197 output = "SPAWN_CHILD_WITH_PARAM";
198 break;
199 case BehaviorOpcode::LOAD_COLLISION_DATA:
200 output = "LOAD_COLLISION_DATA";
201 break;
202 case BehaviorOpcode::SET_HITBOX_WITH_OFFSET:
203 output = "SET_HITBOX_WITH_OFFSET";
204 break;
205 case BehaviorOpcode::SPAWN_OBJ:
206 output = "SPAWN_OBJ";
207 break;
208 case BehaviorOpcode::SET_HOME:
209 output = "SET_HOME";
210 break;
211 case BehaviorOpcode::SET_HURTBOX:
212 output = "SET_HURTBOX";
213 break;
214 case BehaviorOpcode::SET_INTERACT_TYPE:
215 output = "SET_INTERACT_TYPE";
216 break;
217 case BehaviorOpcode::SET_OBJ_PHYSICS:
218 output = "SET_OBJ_PHYSICS";
219 break;
220 case BehaviorOpcode::SET_INTERACT_SUBTYPE:
221 output = "SET_INTERACT_SUBTYPE";
222 break;
223 case BehaviorOpcode::SCALE:
224 output = "SCALE";
225 break;
226 case BehaviorOpcode::PARENT_BIT_CLEAR:
227 output = "PARENT_BIT_CLEAR";
228 break;
229 case BehaviorOpcode::ANIMATE_TEXTURE:
230 output = "ANIMATE_TEXTURE";
231 break;
232 case BehaviorOpcode::DISABLE_RENDERING:
233 output = "DISABLE_RENDERING";
234 break;
235 case BehaviorOpcode::SET_INT_UNUSED:
236 output = "SET_INT_UNUSED";
237 break;
238 case BehaviorOpcode::SPAWN_WATER_DROPLET:
239 output = "SPAWN_WATER_DROPLET";
240 break;
241 default:
242 throw std::runtime_error("Unknown Behavior Opcode");
243 }
244
245 return out << output;
246}
247
248#define cur_behavior_cmd_u8(offset) \
249 (cmd[CMD_PROCESS_OFFSET(offset)])
250
251#define cur_behavior_cmd_s16(offset) \
252 (int16_t)BSWAP16((*(int16_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
253
254#define cur_behavior_cmd_s32(offset) \
255 (int32_t)BSWAP32((*(int32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
256
257#define cur_behavior_cmd_u32(offset) \
258 (uint32_t) BSWAP32((*(uint32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
259
260#define cur_behavior_cmd_f32(offset) \
261 (float) BSWAP32((*(float *) &cmd[CMD_PROCESS_OFFSET(offset)]))