GearLoader 1.1.0
Mod loader for GGXXACPR
Loading...
Searching...
No Matches
ggxxacpr_c.h
1/*-------------------------------------------------------------------------------------------------
2* This header serves as the GGXXACPR ABI which defines its native data types and structures.
3*
4* Mod Developers:
5* This header is included by `baseMod_c.h`. If you're forgoing the basemod
6* include this header instead to interface with the game directly.
7*
8* GearLoader Developers:
9* Existing definitions should only be changed to address compiler compatibility,
10* fix breaking game updates, identify unknown fields, and refine field names.
11*--------------------------------------------------------------------------------------------------*/
12
13#ifndef GGXXACPR_H
14#define GGXXACPR_H
15
16#define GGXXACPR_ABI_VERSION "1.1.0"
17#define GGXXACPR_ABI_VERSION_NUM 0x010100
18
19#include <assert.h>
20
21#if __cplusplus
22 #include <cstdint>
23#else
24 #include <stdint.h>
25#endif
26
27// Used for fields that have a known data type, but unknown use
28#define UNKNOWN_FIELD(label) _unknown_##label
29// Used for stretchs of struct data that are either unknown or unused
30#define PAD(num_bytes, label) uint8_t _padding_##label[num_bytes]
31
32static_assert(sizeof(float) == 4, "float size must be 32-bit");
33static_assert(sizeof(void*) == 4, "pointer size must be 32-bit");
34
35
36/* ========== #ENUMS ========== */
37
38enum GGXXACPR_GameVersion {
39 GAME_VERSION_ACCENT_CORE = 0,
40 GAME_VERSION_PLUS_R
41};
42
43// Set when selecting a main menu item
44enum GGXXACPR_MainMenuItem {
45 MAIN_MENU_ITEM_ARCADE = 0,
46 MAIN_MENU_ITEM_MOM,
47 MAIN_MENU_ITEM_VERSUS,
48 MAIN_MENU_ITEM_ONLINE,
49 MAIN_MENU_ITEM_VS_CPU,
50 MAIN_MENU_ITEM_TEAM_VERSUS,
51 MAIN_MENU_ITEM_TEAM_VS_CPU,
52 MAIN_MENU_ITEM_TRAINING,
53 MAIN_MENU_ITEM_SURVIVAL,
54 MAIN_MENU_ITEM_MISSION,
55 MAIN_MENU_ITEM_STORY,
56 MAIN_MENU_ITEM_GALLERY,
57 MAIN_MENU_ITEM_REPLAY_THEATER,
58 MAIN_MENU_ITEM_SOUND_TEST
59};
60
61// Dictates high-level program flow
62enum GGXXACPR_JobMode {
63 JOB_MODE_AUTO_LOAD = 0x0,
64 JOB_MODE_AUTO_SAVE = 0x1,
65 JOB_MODE_TITLE_SCREEN = 0x2,
66 JOB_MODE_INIT_GAME_INFO = 0x3,
67 JOB_MODE_GAME_INIT = 0x5,
68 JOB_MODE_BATTLE = 0x6,
69 JOB_MODE_DEMO = 0x7,
70 JOB_MODE_TITLE_MAIN = 0x9,
71 JOB_MODE_MENUS = 0xA,
72 JOB_MODE_LOAD_CHAR_SELECT = 0xF,
73 JOB_MODE_LOAD_STAGE_SELECT = 0x10,
74 JOB_MODE_LOAD_VERSUS_SCREEN = 0x11,
75 JOB_MODE_LOAD_STORY_MODE_SPLASH_SCREEN = 0x12,
76 JOB_MODE_LOAD_WIN_SCREEN = 0x14,
77 JOB_MODE_LOAD_STORY_ENDING = 0x16,
78 JOB_MODE_OPTION_MENU = 0x19,
79 JOB_MODE_DEBUG_SOUND_MENU = 0x21,
80 JOB_MODE_MISSION_MENU = 0x24,
81 JOB_MODE_STORY_INIT = 0x29,
82 JOB_MODE_SREXEC = 0x2B,
83 JOB_MODE_CREXEC = 0x2C,
84 JOB_MODE_MOVIE_EXECUTE = 0x2D,
85 JOB_MODE_MATC = 0x2E,
86 JOB_MODE_MISSION_WIN = 0x2F,
87 JOB_MODE_SURVIVAL_START = 0x30,
88 JOB_MODE_GALLERY_MAIN = 0x31,
89 JOB_MODE_SURVIVAL = 0x32,
90 JOB_MODE_TEAM_VS = 0x33,
91 JOB_MODE_FRAMERATE_TEST = 0x34,
92 JOB_MODE_REPLAY_SELECT = 0x35,
93 JOB_MODE_SOUND_MODE_EXECUTE = 0x38,
94 JOB_MODE_VERSUS_SPLASH = 0x41
95};
96
97// Determines UI, player control, and other features in battle.
98enum GGXXACPR_GameModeFeatureFlags {
99 GAME_MODE_FEATURE_FLAGS_NONE = 0x0,
100 GAME_MODE_FEATURE_FLAGS_P1_CONTROL = 0x1,
101 GAME_MODE_FEATURE_FLAGS_P2_CONTROL = 0x2,
102 GAME_MODE_FEATURE_FLAGS_TRAINING = 0x0100,
103 GAME_MODE_FEATURE_FLAGS_SURVIVAL = 0x0200,
104 GAME_MODE_FEATURE_FLAGS_DEMO = 0x0400,
105 GAME_MODE_FEATURE_FLAGS_VERSUS = 0x800,
106 GAME_MODE_FEATURE_FLAGS_VERSUS_CPU = 0x2000,
107 GAME_MODE_FEATURE_FLAGS_STORY = 0x4000,
108 GAME_MODE_FEATURE_FLAGS_MISSION = 0x8000,
109 GAME_MODE_FEATURE_FLAGS_WATCH = 0x10000,
110 GAME_MODE_FEATURE_FLAGS_FREE_PLAY = 0x20000,
111 GAME_MODE_FEATURE_FLAGS_TEAM_VERSUS = 0x40000,
112};
113
114// Character / entity group ids
115enum GGXXACPR_EntityId {
116 ENTITY_ID_NONE = 0,
117 ENTITY_ID_SOL = 1,
118 ENTITY_ID_KY = 2,
119 ENTITY_ID_MAY = 3,
120 ENTITY_ID_MILLIA = 4,
121 ENTITY_ID_AXL = 5,
122 ENTITY_ID_POTEMKIN = 6,
123 ENTITY_ID_CHIPP = 7,
124 ENTITY_ID_EDDIE = 8,
125 ENTITY_ID_BAIKEN = 9,
126 ENTITY_ID_FAUST = 10,
127 ENTITY_ID_TESTAMENT = 11,
128 ENTITY_ID_JAM = 12,
129 ENTITY_ID_ANJI = 13,
130 ENTITY_ID_JOHNNY = 14,
131 ENTITY_ID_VENOM = 15,
132 ENTITY_ID_DIZZY = 16,
133 ENTITY_ID_SLAYER = 17,
134 ENTITY_ID_I_NO = 18,
135 ENTITY_ID_ZAPPA = 19,
136 ENTITY_ID_BRIDGET = 20,
137 ENTITY_ID_ROBO_KY = 21,
138 ENTITY_ID_ABA = 22,
139 ENTITY_ID_ORDER_SOL = 23,
140 ENTITY_ID_KLIFF = 24,
141 ENTITY_ID_JUSTICE = 25,
142 ENTITY_ID_DIZZY_ENTITY_1 = 0x20, // Scythe / Ice Spike
143 ENTITY_ID_MILLIA_ENTITY_1 = 0x21, // Everything but hair pin and IK
144 ENTITY_ID_VENOM_ENTITY_1 = 0x22, // Normal balls
145 ENTITY_ID_EDDIE_ENTITY_SHADOW = 0x23,
146 ENTITY_ID_KY_ENTITY = 0x29,
147 ENTITY_ID_FAUST_ENTITY_1 = 0x2B, // Items except for the minis
148 ENTITY_ID_SOL_ENTITY = 0x2C,
149 ENTITY_ID_MILLIA_ENTITY_2 = 0x2E, // Hair pin / IK
150 ENTITY_ID_JAM_ENTITY = 0x2F,
151 ENTITY_ID_VENOM_ENTITY_2 = 0x31, // Charged ball
152 ENTITY_ID_VENOM_ENTITY_3 = 0x32, // Dark Angel / IK
153 ENTITY_ID_MILLIA_ENTITY_3 = 0x34, // Main IK entity
154 ENTITY_ID_MAY_ENTITY_INSTANT_KILL_1 = 0x37, // Jellyfish pirates
155 ENTITY_ID_BAIKEN_ENTITY = 0x39,
156 ENTITY_ID_BAIKEN_ENTITY_INSTANT_KILL = 0x3A,
157 ENTITY_ID_CHIPP_ENTITY = 0x3B,
158 ENTITY_ID_POTEMKIN_ENTITY = 0x3D,
159 ENTITY_ID_JOHNNY_ENTITY = 0x3F,
160 ENTITY_ID_FAUST_ENTITY_2 = 0x40, // Love explosion / IK
161 ENTITY_ID_EDDIE_ENTITY = 0x41,
162 ENTITY_ID_DIZZY_ENTITY_2 = 0x43, // Fish / Knife / Bubble / Supers
163 ENTITY_ID_MAY_ENTITY_1 = 0x44, // Dolphins
164 ENTITY_ID_MAY_ENTITY_2 = 0x46, // Supers
165 ENTITY_ID_MAY_ENTITY_3 = 0x48, // Hoop
166 ENTITY_ID_FAUST_ENTITY_3 = 0x4A, // Minis / Love
167 ENTITY_ID_MAY_ENTITY_INSTANT_KILL_2 = 0x4B, // Granny / Mech girl pirates
168 ENTITY_ID_ANJI_ENTITY = 0x4C,
169 ENTITY_ID_AXL_ENTITY_1 = 0x4D, // Rensen / Kokuu Geki / Super / Counter bandana visual / IK
170 ENTITY_ID_ANJI_ENTITY_BUTTERFLY = 0x4E,
171 ENTITY_ID_TESTAMENT_ENTITY_1 = 0x4F, // Curse / Net / Nightmare Circular
172 ENTITY_ID_TESTAMENT_ENTITY_2 = 0x50, // Tree / EXE Beast
173 ENTITY_ID_AXL_ENTITY_2 = 0x51, // Unblockable / Counter visual / Shiranami no Homura explosion
174 ENTITY_ID_TESTAMENT_ENTITY_CROW = 0x52,
175 ENTITY_ID_JOHNNY_ENTITY_COIN = 0x55,
176 ENTITY_ID_I_NO_ENTITY = 0x56,
177 ENTITY_ID_ZAPPA_ENTITY_RAOU = 0x57,
178 ENTITY_ID_SLAYER_ENTITY = 0x58,
179 ENTITY_ID_ZAPPA_ENTITY = 0x59,
180 ENTITY_ID_ZAPPA_ENTITY_TRIPLETS = 0x5B,
181 ENTITY_ID_BRIDGET_ENTITY_1 = 0x5C,
182 ENTITY_ID_ZAPPA_ENTITY_SWORD = 0x5D,
183 ENTITY_ID_BRIDGET_ENTITY_2 = 0x5E, // KSMH~Stop / Maintenance Disaster / IK
184 ENTITY_ID_ZAPPA_ENTITY_DOG = 0x60,
185 ENTITY_ID_ROBO_KY_ENTITY_1 = 0x62, // 6P / 6H / 2D / Rocket / Install explosion
186 ENTITY_ID_ROBO_KY_ENTITY_2 = 0x63, // 2H / Air Rocket Punch / Mini-Robo-Kys in IK
187 ENTITY_ID_ABA_ENTITY = 0x64,
188 ENTITY_ID_ORDER_SOL_ENTITY_1 = 0x67,
189 ENTITY_ID_ORDER_SOL_ENTITY_2 = 0x68, // Little fire visual on Tyrant Rave (maybe others)
190 ENTITY_ID_KLIFF_ENTITY = 0x6C,
191 ENTITY_ID_JUSTICE_ENTITY_1 = 0x6E, // Everything but nukes
192 ENTITY_ID_JUSTICE_ENTITY_2 = 0x6F, // Nukes
193 ENTITY_ID_BURST_ENTITY = 0x84,
194};
195
196enum GGXXACPR_StageId {
197 STAGE_ID_GREY = 0, // London alien easter egg
198 STAGE_ID_LONDON,
199 STAGE_ID_COLONY,
200 STAGE_ID_RUSSIA,
201 STAGE_ID_CHINA,
202 STAGE_ID_MAY_SHIP,
203 STAGE_ID_ZEPP,
204 STAGE_ID_NIRVANA,
205 STAGE_ID_PARIS,
206 STAGE_ID_HELL,
207 STAGE_ID_GROVE,
208 STAGE_ID_VERDANT,
209 STAGE_ID_CASTLE,
210 STAGE_ID_BABYLON,
211 STAGE_ID_PHANTOM_CITY,
212 STAGE_ID_UNKNOWN,
213 STAGE_ID_FRASCO,
214 STAGE_ID_AD2172,
215 STAGE_ID_GRAVE,
216 STAGE_ID_HEAVEN,
217 STAGE_ID_KOREA,
218
219 STAGE_ID_LONDON_RELOAD = 21,
220 STAGE_ID_COLONY_RELOAD,
221 STAGE_ID_RUSSIA_RELOAD,
222 STAGE_ID_CHINA_RELOAD,
223 STAGE_ID_MAY_SHIP_RELOAD,
224 STAGE_ID_ZEPP_RELOAD,
225 STAGE_ID_NIRVANA_RELOAD,
226 STAGE_ID_PARIS_RELOAD,
227 STAGE_ID_HELL_RELOAD,
228 STAGE_ID_GROVE_RELOAD,
229 STAGE_ID_VERDANT_RELOAD,
230 STAGE_ID_CASTLE_RELOAD,
231 STAGE_ID_BABYLON_RELOAD,
232 STAGE_ID_PHANTOM_CITY_RELOAD,
233 STAGE_ID_UNKNOWN_RELOAD,
234 STAGE_ID_FRASCO_RELOAD,
235 STAGE_ID_AD2172_RELOAD,
236 STAGE_ID_GRAVE_RELOAD,
237 STAGE_ID_HEAVEN_RELOAD,
238 STAGE_ID_KOREA_RELOAD,
239
240 STAGE_ID_LONDON_SLASH = 41,
241 STAGE_ID_COLONY_SLASH,
242 STAGE_ID_RUSSIA_SLASH,
243 STAGE_ID_CHINA_SLASH,
244 STAGE_ID_MAY_SHIP_SLASH,
245 STAGE_ID_ZEPP_SLASH,
246 STAGE_ID_NIRVANA_SLASH,
247 STAGE_ID_PARIS_SLASH,
248 STAGE_ID_HELL_SLASH,
249 STAGE_ID_GROVE_SLASH,
250 STAGE_ID_VERDANT_SLASH,
251 STAGE_ID_CASTLE_SLASH,
252 STAGE_ID_BABYLON_SLASH,
253 STAGE_ID_PHANTOM_CITY_SLASH,
254 STAGE_ID_UNKNOWN_SLASH,
255 STAGE_ID_FRASCO_SLASH,
256 STAGE_ID_AD2172_SLASH,
257 STAGE_ID_GRAVE_SLASH,
258 STAGE_ID_HEAVEN_SLASH,
259 STAGE_ID_KOREA_SLASH,
260};
261
262enum GGXXACPR_ColliderId {
263 COLLIDER_ID_DUMMY,
264 COLLIDER_ID_HIT_BOX,
265 COLLIDER_ID_HURT_BOX,
266 // Signals the game to use the hitbox of the same array index in `Entity::extraHitboxSet`
267 // instead. This behavior can be seen on Dizzy's knife projectile (421S).
268 COLLIDER_ID_USE_EXTRA,
269 // Rather than acting like a collider, contains dimensions for
270 // a push box adjustment. Can be seen on Sol's 6H.
271 COLLIDER_ID_ADJUST_PUSH,
272 // Defines a spawn location for a sub-entity
273 COLLIDER_ID_SPAWN,
274 COLLIDER_ID_UNKNOWN_6,
275};
276
277enum GGXXACPR_ActionState {
278 ACTION_STATE_NONE = 0x0,
279 ACTION_STATE_IS_ENTITY = 0x1, /* Typically always set unless the entity is despawning */
280 ACTION_STATE_COLLIDES_WITH_P2 = 0x2,
281 ACTION_STATE_COLLIDES_WITH_P1 = 0x4,
282 ACTION_STATE_DRAW_SPRITE = 0x8,
283 ACTION_STATE_IS_AIRBORNE = 0x10,
284 ACTION_STATE_IS_IN_HITSTUN = 0x20,
285 ACTION_STATE_DISABLE_HITBOXES = 0x40,
286 ACTION_STATE_DISABLE_HURTBOXES = 0x80, /* Essentially identical to StrikeInvuln but some mechanics/moves use one over the other. */
287 ACTION_STATE_KNOCKED_DOWN = 0x100,
288 ACTION_STATE_IS_IN_BLOCKSTUN = 0x200,
289 ACTION_STATE_IS_CROUCHING = 0x400,
290 ACTION_STATE_IS_CORNERED = 0x800,
291 ACTION_STATE_LANDING_FLAG = 0x1000,
292 ACTION_STATE_IS_AT_SCREEN_LIMIT = 0x2000, /* Bounded by screen edge, but not necessarily cornered */
293 ACTION_STATE_PROJECTILE_INVULN = 0x4000, /* A legacy value, that's mainly used in throw animations as a sort of invuln flag. */
294 ACTION_STATE_WAKEUP = 0x8000,
295 ACTION_STATE_DISABLE_WAKEUP = 0x10000, /* Set at round end for the KO'd player. */
296 ACTION_STATE_STRIKE_INVULN = 0x20000,
297 ACTION_STATE_IS_IDLE = 0x40000,
298 ACTION_STATE_SUPER_FLASH = 0x80000, /* Set only when the entity is frozen in super flash. */
299 ACTION_STATE_NO_COLLISION = 0x100000,
300 ACTION_STATE_GRAVITY = 0x200000,
301 ACTION_STATE_UNKNOWN_BIT_22 = 0x400000,
302 ACTION_STATE_THROW_INVULN = 0x800000,
303 ACTION_STATE_UNKNOWN_BIT_24 = 0x1000000,
304 ACTION_STATE_UNKNOWN_BIT_25 = 0x2000000,
305 ACTION_STATE_UNKNOWN_BIT_26 = 0x4000000,
306 ACTION_STATE_UNKNOWN_BIT_27 = 0x8000000,
307 ACTION_STATE_UNKNOWN_BIT_28 = 0x10000000,
308 ACTION_STATE_UNKNOWN_BIT_29 = 0x20000000,
309 ACTION_STATE_IGNORE_RECEIVED_HIT_EFFECTS = 0x40000000, /* Used for Dizzy bubble. Essentially disables hitstop. */
310 ACTION_STATE_DESPAWN = 0x80000000, /* Entity is marked for despawn */
311};
312
313enum GGXXACPR_AttackState {
314 ATTACK_STATE_NONE = 0x0,
315 ATTACK_STATE_IS_ATTACK = 0x1,
316 ATTACK_STATE_UNKNOWN_BIT_1 = 0x2,
317 ATTACK_STATE_UNKNOWN_BIT_2 = 0x4,
318 ATTACK_STATE_UNKNOWN_BIT_3 = 0x8,
319 ATTACK_STATE_IN_GATLING_WINDOW = 0x10,
320 ATTACK_STATE_SPECIAL_CANCEL_OKAY = 0x20,
321 ATTACK_STATE_UNKNOWN_BIT_6 = 0x40,
322 ATTACK_STATE_UNKNOWN_BIT_7 = 0x80,
323 ATTACK_STATE_HOMING_JUMP_OKAY = 0x100,
324 ATTACK_STATE_KARA_FD_OKAY = 0x200,
325 ATTACK_STATE_NO_SPECIAL_CANCEL = 0x400,
326 ATTACK_STATE_IN_RECOVERY = 0x800,
327 ATTACK_STATE_HAS_CONNECTED = 0x1000,
328 ATTACK_STATE_UNKNOWN_BIT_13 = 0x2000,
329 ATTACK_STATE_UNKNOWN_BIT_14 = 0x4000,
330 ATTACK_STATE_UNKNOWN_BIT_15 = 0x8000,
331 ATTACK_STATE_JUMP_CANCELABLE = 0x10000,
332 ATTACK_STATE_HAS_HIT_OPPONENT = 0x20000,
333 ATTACK_STATE_UNKNOWN_BIT_18 = 0x40000,
334 ATTACK_STATE_UNKNOWN_BIT_19 = 0x80000,
335 ATTACK_STATE_UNKNOWN_BIT_20 = 0x100000, /* maybe related to guardpoint */
336 ATTACK_STATE_UNKNOWN_BIT_21 = 0x200000,
337 ATTACK_STATE_UNKNOWN_BIT_22 = 0x400000,
338 ATTACK_STATE_UNKNOWN_BIT_23 = 0x800000
339};
340
341// Command state flags. Still unsure on exact usage of these values, so
342// take their names and descriptions with a grain of salt.
343// Command state flags relate to available state transitions
344// excluding gatlings, cancels, and kara cancels.
345enum GGXXACPR_CommandState {
346 COMMAND_STATE_NONE = 0x0,
347 COMMAND_STATE_NO_NEUTRAL = 0x1,
348 COMMAND_STATE_NO_FORWARD = 0x2,
349 COMMAND_STATE_NO_BACKWARD = 0x4,
350 COMMAND_STATE_NO_CROUCH = 0x8,
351 COMMAND_STATE_NO_JUMP = 0x10,
352 COMMAND_STATE_UNKNOWN_BIT_5 = 0x20,
353 COMMAND_STATE_NO_ATTACK = 0x40,
354 COMMAND_STATE_UNKNOWN_BIT_7 = 0x80,
355 COMMAND_STATE_GUARD = 0x100,
356 COMMAND_STATE_UNKNOWN_BIT_9 = 0x200,
357 COMMAND_STATE_AIR_DASH = 0x400,
358 COMMAND_STATE_UKEMI = 0x800,
359 COMMAND_STATE_PREJUMP = 0x1000,
360 COMMAND_STATE_DISABLE_THROW = 0x2000,
361 COMMAND_STATE_FAUST_CRAWL_FORWARD = 0x4000,
362 COMMAND_STATE_FAUST_CRAWL_BACKWARD = 0x8000,
363};
364
365enum GGXXACPR_GuardState {
366 GUARD_STATE_NONE = 0,
367 GUARD_STATE_STAND_BLOCKING = 0x1,
368 GUARD_STATE_CROUCH_BLOCKING = 0x2,
369 GUARD_STATE_AIR_BLOCKING = 0x4,
370 GUARD_STATE_FAULTLESS_DEFENSE = 0x8,
371 GUARD_STATE_UNKNOWN_BIT_4 = 0x10,
372 GUARD_STATE_UNKNOWN_BIT_5 = 0x20,
373 GUARD_STATE_IN_BLOCKSTUN = 0x40,
374 GUARD_STATE_UNKNOWN_BIT_7 = 0x80,
375 GUARD_STATE_UNKNOWN_BIT_8 = 0x100,
376 GUARD_STATE_GUARD_POINT = 0x200,
377 GUARD_STATE_ARMOR = 0x400,
378 GUARD_STATE_PARRY_1 = 0x800,
379 GUARD_STATE_PARRY_2 = 0x1000,
380 GUARD_STATE_UNKNOWN_BIT_13 = 0x2000,
381 GUARD_STATE_UNKNOWN_BIT_14 = 0x4000,
382 GUARD_STATE_UNKNOWN_BIT_15 = 0x8000,
383};
384
385enum GGXXACPR_BackgroundState {
386 BACKGROUND_STATE_NONE = 0,
387 BACKGROUND_STATE_UNKNOWN_BIT_0 = 0x1,
388 BACKGROUND_STATE_HUD_OFF = 0x2,
389 BACKGROUND_STATE_DEFAULT = 0x4,
390 BACKGROUND_STATE_BLACK_BACKGROUND = 0x8,
391 BACKGROUND_STATE_POST_FLASH_DIM = 0x10,
392 BACKGROUND_STATE_UNKNOWN_BIT_5 = 0x20,
393 BACKGROUND_STATE_UNKNOWN_BIT_6 = 0x40,
394 BACKGROUND_STATE_UNKNOWN_BIT_7 = 0x80,
395 BACKGROUND_STATE_UNKNOWN_BIT_8 = 0x100,
396 BACKGROUND_STATE_UNKNOWN_BIT_9 = 0x200,
397 BACKGROUND_STATE_UNKNOWN_BIT_10 = 0x400,
398 BACKGROUND_STATE_SUPER_FLASH = 0x800,
399 BACKGROUND_STATE_UNKNOWN_BIT_12 = 0x1000,
400 BACKGROUND_STATE_UNKNOWN_BIT_13 = 0x2000,
401 BACKGROUND_STATE_FORCE_BREAK_SUPER_FLASH = 0x4000,
402 BACKGROUND_STATE_LIGHTNING = 0x8000,
403};
404
405enum GGXXACPR_SpriteRenderState {
406 SPRITE_RENDER_STATE_NONE = 0x0,
407 SPRITE_RENDER_STATE_IGNORE_UNIVERSAL_Y_OFFSET = 0x8,
408 SPRITE_RENDER_STATE_DEAD_ANGLE_OR_FRC_FLASH = 0x200,
409 SPRITE_RENDER_STATE_STROBE = 0x400, /* Usually paired with `FIRE` */
410 SPRITE_RENDER_STATE_FIRE = 0x1000,
411 SPRITE_RENDER_STATE_INSTALL_FLASH = 0x4000,
412 SPRITE_RENDER_STATE_INVISIBLE = 0x8000,
413 SPRITE_RENDER_STATE_SILHOUETTE = 0x10000,
414 SPRITE_RENDER_STATE_MOROHA_MODE_FLASH = 0x80000, /* Also used for Justice's install */
415 SPRITE_RENDER_STATE_POISON_FLASH = 0x100000,
416 SPRITE_RENDER_STATE_INSTANT_BLOCK_FLASH = 0x800000,
417 SPRITE_RENDER_STATE_COUNTER_HIT_FLASH = 0x1000000,
418 SPRITE_RENDER_STATE_EASY_FRC_FLASH = 0x4000000, /* Survival mode mechanic */
419 SPRITE_RENDER_STATE_LIGHT_GREEN_FLASH = 0x8000000,
420 SPRITE_RENDER_STATE_LIGHT_YELLOW_FLASH = 0x10000000,
421 SPRITE_RENDER_STATE_LIGHT_BLUE_FLASH = 0x20000000
422};
423
424enum GGXXACPR_DrawSpriteAttributes {
425 ACPR_DRAW_SPRITE_ALIGN_LEFT = 0x1,
426 ACPR_DRAW_SPRITE_ALIGN_X_CENTER = 0x2,
427 ACPR_DRAW_SPRITE_ALIGN_TOP = 0x4,
428 ACPR_DRAW_SPRITE_ALIGN_Y_CENTER = 0x8,
429 ACPR_DRAW_SPRITE_FLIP_TEXTURE_U = 0x10,
430 ACPR_DRAW_SPRITE_FLIP_TEXTURE_Y = 0x20,
431 ACPR_DRAW_SPRITE_ROTATE_CCW_90 = 0x1000,
432 ACPR_DRAW_SPRITE_ROTATE_180 = 0x2000,
433};
434
435enum GGXXACPR_RawControllerInput {
436 INPUT_NONE = 0x0,
437 INPUT_SELECT = 0x1,
438 INPUT_L3 = 0x2,
439 INPUT_R3 = 0x4,
440 INPUT_START = 0x8,
441 INPUT_UP = 0x10,
442 INPUT_RIGHT = 0x20,
443 INPUT_DOWN = 0x40,
444 INPUT_LEFT = 0x80,
445 INPUT_L2 = 0x100,
446 INPUT_R2 = 0x200,
447 INPUT_L1 = 0x400,
448 INPUT_R1 = 0x800,
449 INPUT_TOP_FACE = 0x1000,
450 INPUT_RIGHT_FACE = 0x2000,
451 INPUT_BOTTOM_FACE = 0x4000,
452 INPUT_LEFT_FACE = 0x8000,
453};
454
455enum GGXXACPR_Language {
456 ACPR_LANG_JPN,
457 ACPR_LANG_ENG,
458 ACPR_LANG_FRA,
459 ACPR_LANG_ITA,
460 ACPR_LANG_GER,
461 ACPR_LANG_POR,
462 ACPR_LANG_SPA,
463 ACPR_LANG_KOR
464};
465
466/* ========== #STRUCTS ========== */
467
468typedef struct GGXXACPR_LocaleState {
469 uint32_t Language; // enum `GGXXACPR_Language`
470 uint32_t Format; // Unknown, string format maybe
471 uint8_t Buffer[0x600]; // String buffer. Size may be larger
473static_assert(sizeof(GGXXACPR_LocaleState) == 0x608);
474
475typedef struct GGXXACPR_FiberData {
476 int32_t State;
477 int32_t Waiting;
478 uint32_t StackSize;
479 int32_t UNKNOWN_FIELD(0x0C);
480 uint32_t Flags;
481 int32_t UNKNOWN_FIELD(0x14);
482 char Name[24];
483 void* EntryPoint;
484 void* Handle;
485 PAD(28, 0x38);
487static_assert(sizeof(GGXXACPR_FiberData) == 0x54);
488
489typedef struct GGXXACPR_PlayerInput {
490 uint32_t InputRaw1; // enum `GGXXACPR_RawControllerInput`
491 uint32_t InputRaw2; // enum `GGXXACPR_RawControllerInput`
492 uint32_t InputPress1; // enum `GGXXACPR_RawControllerInput`
493 uint32_t InputPress2; // enum `GGXXACPR_RawControllerInput`
494 uint32_t InputRelease; // enum `GGXXACPR_RawControllerInput`
495 int32_t SelectCharge;
496 int32_t L3Charge;
497 int32_t R3Charge;
498 int32_t StartCharge;
499 int32_t UpCharge;
500 int32_t RightCharge;
501 int32_t DownCharge;
502 int32_t LeftCharge;
503 int32_t L2Charge;
504 int32_t R2Charge;
505 int32_t L1Charge;
506 int32_t R1Charge;
507 int32_t TopFaceCharge;
508 int32_t RightFaceCharge;
509 int32_t BottomFaceCharge;
510 int32_t LeftFaceCharge;
511 PAD(0x40, 0x54);
512 uint8_t isActive;
513 PAD(3, 0x95);
515static_assert(sizeof(GGXXACPR_PlayerInput) == 0x98);
516
517typedef struct GGXXACPR_Collider {
518 int16_t xOffset;
519 int16_t yOffset;
520 int16_t width;
521 int16_t height;
522 uint16_t boxTypeId; /* enum COLLIDER_ID */
523 uint16_t boxFlags; /* unknown */
525static_assert(sizeof(GGXXACPR_Collider) == 0xC );
526
527typedef struct GGXXACPR_ActionHeader {
528 uint32_t ActHeaderFlags;
529 int16_t lvlFlag;
530 uint8_t damage;
531 uint8_t flag2;
533
534typedef struct GGXXACPR_HitParam {
535 int16_t launchVelocityX;
536 int16_t launchVelocityY;
537 PAD(40, 0x05);
538 int16_t counterHitLaunchVelocityX;
539 int16_t counterHitLaunchVelocityY;
540 PAD(24, 0x30);
541 int16_t cleanHitCheckXDist;
542 int16_t cleanHitCheckYDist;
543 int16_t cleanHitCheckHalfWidth;
544 int16_t cleanHitCheckHalfHeight;
545 int16_t cleanHitCheckScale;
546 uint8_t forceCleanHit;
547 PAD(9, 0x53);
549/* Struct layout sanity checks */
550static_assert(offsetof(GGXXACPR_HitParam, counterHitLaunchVelocityX) == 0x2C);
551static_assert(offsetof(GGXXACPR_HitParam, cleanHitCheckXDist) == 0x48);
552static_assert(sizeof(GGXXACPR_HitParam) == 0x5C);
553
554typedef struct GGXXACPR_DamageParam {
555 int16_t downX;
556 int16_t downY;
557 int16_t downGravity;
558 int16_t downUkemiTime;
559 int16_t faintPoint;
560 uint16_t UNKNOWN_FIELD(0xA);
561 uint32_t downFlag;
562 int16_t kezuri; /* chip damage? */
563 int16_t damageHosei; /* some scaling thing */
564 uint16_t hitSetParamNo;
565 uint16_t hitSetParamFlag;
566 uint16_t GuardSetParamNo;
567 uint16_t GuardSetParamFlag;
568 uint8_t dno; // used for hit level, but one less than on wiki
569 uint8_t dprob;
570 uint8_t gno; // used for hit level, but one less than on wiki
571 uint8_t gprob;
572 int16_t UNKNOWN_FIELD(0x20);
573 int16_t UNKNOWN_FIELD(0x22);
574 int16_t UNKNOWN_FIELD(0x24);
575 int16_t UNKNOWN_FIELD(0x26);
576 int16_t UNKNOWN_FIELD(0x28);
577 int16_t UNKNOWN_FIELD(0x2A);
579static_assert(sizeof(GGXXACPR_DamageParam) == 0x2C);
580
581typedef struct GGXXACPR_Screenshake {
582 float offset; // Current offset to apply to camera
583 uint16_t flags; // First 3 bits determine shake magnitude, 4th bit flips the direction.
584 uint16_t timer; // Starts at 1 and counts up until reaching a terminating value (0x7F) in the shake value array.
586static_assert(sizeof(GGXXACPR_Screenshake) == 0x8);
587// Covers a region of static game memory that holds camera data
588// as well as some cached calculations related to camera behavior.
589//
590// Many values listed are copys of base data and are only used to render certain
591// graphical elements. Manipulating these copies will only change the way elements
592// are rendered for one frame before the value is recopied from the base data.
593typedef struct GGXXACPR_Camera {
594 float UNKNOWN_FIELD(0x0); // Some sort of zoom scale
595 float playerXDist;
596 float playerYDist;
597 GGXXACPR_Screenshake horizontalScreenshake;
598 int32_t cameraXPos_stageCopy;
599 int32_t cameraYPos_stageCopy;
600 uint32_t cameraWidth_2; // Duplicated for unknown reason
601 PAD(4, 0x1C);
602 int32_t leftEdgePos;
603 int32_t anchorYPosMinus40000; // Unknown use
604 uint32_t cameraWidth_3; // Duplicated for unknown reason
605 uint32_t cameraHeight;
606 float minPlayerYPosFloat;
607 int32_t xDiff; // The change in position since the last frame. Data is recorded but unused.
608 int32_t yDiff; // The change in position since the last frame. Data is recorded but unused.
609 uint32_t cameraWidth_actual; // direct manipulation affects camera size
610 int32_t zoomTimer; // Timer that delays rezoom to ideal camera size
611 float zoom;
612 float zoomBackgroundScale; // direct manipulation affects background render scale
613 float zoomSpriteScale; // direct manipulation affects player sprite render scale
614 uint32_t cameraFlags;
615 PAD(4, 0x54);
616 int32_t player1XPos;
617 int32_t player2XPos;
618 int32_t minPlayerYPos;
619 int32_t UNKNOWN_FIELD(0x64); // Something like player 1 screen-space velocity
620 int32_t UNKNOWN_FIELD(0x68); // Something like player 2 screen-space velocity
621 int32_t UNKNOWN_FIELD(0x6C); // Something about player height
622 GGXXACPR_Screenshake verticalScreenshake;
623 float playerCenterPointX;
624 int32_t cameraXPos_actual; // anchor point on the X-axis is the middle of the camera view
625 int32_t cameraYPos_actual; // anchor point on the Y-axis lines up with the ground on the default view. Roughly 1/6th of the screen from the bottom edge.
626 PAD(8, 0x84);
627 int32_t cameraXPos_spriteCopy;
628 int32_t cameraYPos_spriteCopy;
629 uint32_t cameraWidth_4; // Duplicated for unknown reason
631
632/* Struct layout sanity checks */
633static_assert(offsetof(GGXXACPR_Camera, cameraWidth_actual) == 0x40);
634static_assert(offsetof(GGXXACPR_Camera, player1XPos) == 0x5C);
635static_assert(offsetof(GGXXACPR_Camera, playerCenterPointX) == 0x7C);
636static_assert(sizeof(GGXXACPR_Camera) == 0x9C);
637
638/* Character specific union structs */
640 int16_t DragonInstallTimer;
641 PAD(2, 0x2);
642 int16_t DragonInstallSecond; // 2 byte bool
643 PAD(26, 0x6);
646 uint16_t RestiveRollingLimit;
657 PAD(26, 0x6);
660 uint16_t LustShakerMash;
661 PAD(2, 0x2);
668 PAD(24, 0x8);
671 PAD(2, 0x0);
672 uint16_t RensenState; // Unknown
673 PAD(28, 0x4);
676 uint8_t GiganticBulletInputted;
677 PAD(31, 0x1);
680 int16_t LandBreakActOverride;
681 PAD(2, 0x2);
682 int16_t InvisibilityTimer;
683 // Essentially a 2 byte bool. Game code has the following line for
684 // example when toggling: `FastShuriken = 1 - FastShuriken;`
685 int16_t FastShuriken;
686 PAD(8, 0x8);
687 int16_t InvisibilityLevel;
688 PAD(14, 0x12);
691 uint16_t Flags; // Unknown
692 PAD(2, 0x2);
693 int16_t EddieGauge;
694 PAD(1, 0x6);
695 uint8_t SummonMode; // 0 = Normal, 1 = Vice
696 PAD(24, 0x8);
699 PAD(1, 0x0);
700 uint8_t DefenderChest; // Chest selected by defender in 236236S
701 uint8_t AttackerChest; // Chest selected by attacker in 236236S
702 PAD(1, 0x3);
703 int32_t DoorXPos; // World coordinate for door exit location
704 PAD(24, 0x8);
707 uint16_t CrowState; // 1 = Tracking Testament, 2 = Perched (idle animation)
708 PAD(2, 0x2);
709 int16_t DollCount;
710 PAD(2, 0x6);
711 int16_t CurseAttacks; // Current attack number in the curse sequence
712 PAD(2, 0xA);
713 int32_t CurseSequence; // The current curse sequence [0,3]
714 PAD(16, 0x10);
717 PAD(1, 0x0);
718 uint8_t CardSpecialChainsRemaining;
719 PAD(1, 0x2);
720 uint8_t RyuujinCards; // 22K
721 uint8_t GekirinCards; // 22S
722 uint8_t KenroukakuCards; // 22H
723 PAD(1, 0x6);
724 uint8_t ParryBufferTime; // Buffer window timer on successful parry
725 int8_t Parry; // -1 = Parry window, -2 = Successful hitstop, >0 = Cooldown timer
726 uint8_t JumpFlagOverride;
727 uint8_t UnknownOverride;
728 PAD(21, 0xB);
731 int16_t GuardPointCancelTimer;
732 int16_t GuardPointCancelOkay;
733 PAD(28, 0x4);
736 int16_t MistFinerLevel;
737 PAD(2, 0x2);
738 uint8_t EXMistFinerTimer;
739 uint8_t CoinsUsed;
740 PAD(26, 0x6);
743 uint8_t BilliardLaunchAngle;
744 uint8_t ChargedBilliardTimer;
745 uint8_t BilliardHealth; // Health imparted to billiards struck (billiard health determines damage)
746 uint8_t BilliardBounceFlags; // Flags imparted to billiards struck determine bounce behavior
747 PAD(4, 0x4);
748 uint8_t EXObjectBallStocks;
749 PAD(23, 0x9);
752 uint8_t FishActQueue[4];
753 uint8_t KnifeReleased; // bool
754 PAD(3, 0x5);
755 uint8_t EXKnifeStandby; // bool
756 PAD(1, 0x9);
757 uint16_t EXNecroInstallTimer;
758 PAD(20, 0xC);
761 uint8_t Summon; // 0 = Naked, 1 = Sword, 2 = Dog, 3 = Triplets, 4 = Raou
762 PAD(1, 0x1);
763 int16_t Timer; // Summon rng timer?
764 int16_t RaouTimer;
765 int16_t ChatterCooldown; // lol
766 int16_t DogGatlingLimitReached; // 2 byte bool
767 uint16_t DogActionBuffer;
768 PAD(3, 0xC);
769 uint8_t AirDarknessAnthemUsesRemaining; // Set to 1 upon going airborne
770 uint16_t RaouDuration; // RaouTimer is initialized to this value. Referenced by HUD element display code.
771 PAD(14, 0x12);
774 int16_t YoYoSpeed;
775 uint16_t YoYoFlags;
776 uint16_t YoYoSetupTimer;
777 PAD(2, 0x6);
778 uint16_t RollingMovementUsesRemaining; // Set to 1 upon going airborne
779 uint16_t ThrowDirection; // Yo-yo throw direction given in numpad notation [1-9];
780 uint16_t Unknown_0xC;
781 uint16_t Unknown_0xE;
782 int32_t ThrowXVelocity;
783 int32_t ThrowYVelocity;
784 PAD(8, 0x18);
787 int16_t HeatGain; // Target heat value is (HeatGain * 100/111) + 3000 and caps at 12000
788 PAD(2, 0x2);
789 int16_t Heat;
790 int16_t RisKyTimer;
791 PAD(6, 0x8);
792 int16_t RisKyHitboxIndex;
793 PAD(16, 0x10);
796 uint16_t InstallMode; // 0 = Normal, 1 = Moroha, 2 = Goku Moroha
797 uint16_t BloodBagCount;
798 PAD(2, 0x4);
799 uint16_t HealthReduction; // Health loss on hit
800 uint16_t BloodGauge;
801 PAD(4, 0xA);
802 uint16_t InstallMode_2; // Mode Duplicate? 0 = Normal, 1 = Moroha, 2 = Goku Moroha
803 uint16_t InstallAnimationTimer; // Timer used for background fade effect
804 PAD(14, 0x12);
807 uint16_t ChargeLevelFreezeTimer; // `ChargeLevelActual` Does not update while the value is non zero
808 PAD(6, 0x2);
809 uint16_t ChargeLevelActual; // Red part
810 uint16_t DragonInstallFollowUp; // 1 = Good, 2 = Failed;
811 uint16_t DragonInstallTimer; // Timer for traditional Dragon Install boss mechanic
812 uint16_t ChargeLevelTarget; // Yellow part
813 PAD(16, 0x10);
816 uint16_t ScaleRipperTimer;
817 PAD(30, 0x2);
820 uint16_t InstallTimer;
821 uint16_t AirMichaelSwordUsesRemaining; // Set to 1 upon being airborne
822 PAD(28, 0x4);
824
825static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Sol));
826static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_May));
827static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Millia));
828static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Axl));
829static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Potemkin));
830static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Chipp));
831static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Eddie));
832static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Faust));
833static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Testament));
834static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Jam));
835static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Anji));
836static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Johnny));
837static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Venom));
838static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Dizzy));
839static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Zappa));
840static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Bridget));
841static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_RoboKy));
842static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_ABA));
843static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_OrderSol));
844static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Kliff));
845static_assert(0x20 == sizeof(GGXXACPR_CharacterSpecificVariables_Justice));
846
871
872// A sub-struct that contains data exclusive to player entities (as opposed to more generic entity data).
873typedef struct GGXXACPR_PlayerData {
874 // Range: [0, 10000]
875 uint16_t tension;
876 uint8_t staggerShakeTime;
877 uint8_t backStepInvalid;
878 uint16_t currentGlobalProration;
879 int16_t negativePenaltyTimer;
880 int16_t counterRedTime; /* Timer for the red flash effect on players that have just taken a counter hit. */
881 uint16_t homingJumpFlag;
882 int32_t homingJumpTimer;
883 int32_t runInertia;
884 int32_t offX;
885 int16_t throwProtectionTimer;
886 int16_t guardBar;
887 int16_t guardTimer;
888 int16_t untechTimer;
889 uint16_t homingJumpDir;
890 uint8_t reqHit;
891 uint8_t hitDispTime;
892 float hitDispIn;
893 uint8_t inertiaFlag;
894 uint8_t whiteOutTime;
895 uint8_t invulnCounter;
896 uint8_t airDashRecoveryTimer;
897 uint8_t inertiaTime;
898 uint8_t downBoundDamage;
899 PAD(2, 0x2E);
900 int16_t tensionGainPenaltyTimer;
901 uint8_t frcTime;
902 uint8_t frcLockoutTimer;
903 int32_t UNKNOWN_FIELD(0x34);
904 int16_t UNKNOWN_FIELD(0x38);
905 int16_t UNKNOWN_FIELD(0x3A);
906 uint8_t UNKNOWN_FIELD(0x3C);
907 uint8_t instantBlockTimer;
908 int16_t instantBlockLockoutTimer;
909
910 /* OFFSET 0x40 -------------------------------------------------- */
911
912 uint32_t getChainDataTableFunc;
913 uint32_t enemyPtr;
914 int16_t punchKey;
915 int16_t kickKey;
916 int16_t slashKey;
917 int16_t heavySlashKey;
918 int16_t dustKey;
919 int16_t fuckinKey;
920 int16_t posResetKey;
921 int16_t pauseKey;
922 int16_t recPlayerKey;
923 int16_t recEnemyKey;
924 int16_t playMemoryKey;
925 int16_t switchKey;
926 int16_t enemyWalkKey;
927 int16_t enemyJumpKey;
928 int16_t punchAndKickKey;
929 int16_t punchAndDustKey;
930 int16_t pksKey;
931 int16_t pksshKey;
932 int16_t lifeLength;
933 int16_t lifeLengthDamage;
934 uint8_t jumpCount;
935 uint8_t airDashCount;
936 int16_t jumpFlags;
937 int16_t chainFlag1;
938 int16_t chainFlag2;
939 uint32_t rendaFlag;
940 int16_t dizzyBuildup;
941 int16_t dizzyDuration;
942
943 /* OFFSET 0x80 -------------------------------------------------- */
944
945 uint32_t exCommandFunc;
946 uint8_t jumpDirection;
947 uint8_t cpu;
948 uint8_t sousaiTime;
949 uint8_t dizzyThreshold; /* AKA FaintMax in debug symbols */
950 GGXXACPR_CharacterSpecificVariables characterSpecific;
951 PAD(4, 0x9C);
952 uint32_t hitstunFlags; /* SlidingKD, wall bounce, etc */
953 uint32_t UNKNOWN_FIELD(0xB0); /* RE note: Child?*/
954 uint32_t atkHitInterrupt;
955 uint32_t atkGuardInterrupt;
956 uint32_t damageInterrupt;
957
958 /* OFFSET 0xC0 -------------------------------------------------- */
959
960 uint32_t landInterrupt;
961 uint32_t actChangeInterrupt;
962 uint32_t guardFunc;
963 uint32_t getUpInterrupt;
964 uint32_t guardCheckInterrupt;
965 uint32_t posByEnemyAddr;
966 uint8_t overKillFlag;
967 uint8_t objFlag;
968 uint8_t dustTime;
969 uint8_t afterImageIndex;
970 int32_t keyHook;
971 int16_t healthVisual;
972 int16_t tensionPulse;
973 int16_t tensionSideTime;
974 int16_t tensionPassivityCounter;
975 int32_t lastPosX;
976 int16_t tensionBar;
977 uint8_t tShand;
978 uint8_t pushTime;
979 uint8_t attackDown;
980 uint8_t defenseDown;
981 uint8_t jumpSeal;
982 uint8_t artsSeal;
983 uint8_t poison;
984 uint8_t mistTime; /* Baccus Sigh */
985 int16_t comboTime;
986 int16_t burstMeter;
987 uint8_t UNKNOWN_FIELD(0xFA); /* RE Notes: something about throw */
988 uint8_t throwCounterThing;
989 uint8_t UNKNOWN_FIELD(0xFC); /* RE Notes: relates to blue burst */
990 uint8_t UNKNOWN_FIELD(0xFD);
991 int16_t comboCounter;
992
993 /* OFFSET 0x100 -------------------------------------------------- */
994
995 int16_t comboCounterVisual;
996 uint8_t UNKNOWN_FIELD(0x102); /* RE Note: some counter relates to light green flash effect */
997 uint8_t UNKNOWN_FIELD(0x103);
998 uint8_t allCounter;
999 uint8_t punchSeal;
1000 uint8_t kickSeal;
1001 uint8_t slashSeal;
1002 uint8_t heavySlashSeal;
1003 uint8_t dustSeal;
1004 uint8_t UNKNOWN_FIELD(0x10A); /* RE Note: relates to IB/SB */
1005 uint8_t slashBackActiveWindow;
1006 uint8_t slashBackGuardLockoutTimer;
1007 uint8_t slashBackGuardstunTimer;
1008 uint8_t slashBackLockoutOnWakeupTimer;
1009 uint8_t slashBackFollowupTimer;
1010 int16_t throwTechFlags;
1011 uint8_t UNKNOWN_FIELD(0x112); /* RE Note: Resets beginning of act_update */
1012 uint8_t UNKNOWN_FIELD(0x113); /* RE Note: a count down timer */
1013 int32_t throwTechColorCounter;
1014 int32_t UNKNOWN_FIELD(0x118); /* RE Note: Resets beginning of act_update */
1015 int32_t cleanHitCounter;
1016 int32_t UNKNOWN_FIELD(0x120);
1017 int32_t UNKNOWN_FIELD(0x124);
1018 int32_t UNKNOWN_FIELD(0x128);
1019 int32_t UNKNOWN_FIELD(0x12C);
1020 int32_t UNKNOWN_FIELD(0x130);
1021 int32_t UNKNOWN_FIELD(0x134);
1022 int32_t tensionCopy;
1023 int32_t UNKNOWN_FIELD(0x13C); /* RE Note: Tension thing (relates to expenditure) */
1024
1025 /* OFFSET 0x140 -------------------------------------------------- */
1026
1027 int32_t tensionRefill; /* Training */
1028 int32_t UNKNOWN_FIELD(0x144);
1030
1031/* Struct layout sanity checks */
1032static_assert(offsetof(GGXXACPR_PlayerData, getChainDataTableFunc) == 0x40);
1033static_assert(offsetof(GGXXACPR_PlayerData, exCommandFunc) == 0x80);
1034static_assert(offsetof(GGXXACPR_PlayerData, landInterrupt) == 0xC0);
1035static_assert(offsetof(GGXXACPR_PlayerData, comboCounterVisual) == 0x100);
1036static_assert(offsetof(GGXXACPR_PlayerData, tensionRefill) == 0x140);
1037static_assert(sizeof(GGXXACPR_PlayerData) == 0x148);
1038
1039
1040/*
1041* Represents Players, projectiles, summons, and graphical effects.
1042* Essentially anything that is represented by a sprite.
1043*/
1044typedef struct GGXXACPR_Entity GGXXACPR_Entity;
1045typedef struct GGXXACPR_Entity {
1046 uint16_t id; /* enum ENTITY_ID*/
1047 uint8_t bIsFacingRight;
1048 uint8_t bIsLeftSide;
1049 // Together with the `Next` pointer forms a doubly-linked list. There is
1050 // one linked list for projectiles/summons and another for graphical entities.
1051 // Each linked-listed has a dummy root entity (unsure about graphic entities).
1052 // These values are nullptr for player entities.
1053 struct GGXXACPR_Entity* prevPtr;
1054 // Together with the `Prev` pointer forms a doubly-linked list. There is
1055 // one linked list for projectiles/summons and another for graphical entities.
1056 // Each linked-listed has a dummy root entity (unsure about graphic entities).
1057 // These values are nullptr for player entities.
1058 struct GGXXACPR_Entity* nextPtr;
1059 uint32_t actionState; /* enum ACTION_STATE */
1060 uint16_t bufferedActionId;
1061 uint16_t bufferFlag; /* bitfield */
1062 uint16_t bufferedActionIdTemp;
1063 uint16_t bufferFlagTemp;
1064 uint16_t actId; /* Current action id. */
1065 uint16_t localId;
1066 uint16_t actTimer; /* Frame counter for the current action. */
1067 uint16_t health; /* [0 - 460] */
1068 GGXXACPR_Entity* parentEntity;
1069 uint16_t actionIdSv;
1070 PAD(1, 0x26);
1071 uint8_t playerIndex; /* P1 = 0, P2 = 1 */
1072 uint16_t parentFlag;
1073 uint16_t guardState; /* enum GUARD_STATE */
1074 // Contains additional player entity data. Always nullptr on non-player entities.
1075 GGXXACPR_PlayerData* playerEntityDataPtr;
1076 uint32_t graphicFunction;
1077 uint32_t attackState; /* enum ATTACK_STATE */
1078 uint32_t commandFlags; /* enum COMMAND_STATE */
1079 uint32_t cellTop;
1080
1081 /* OFFSET 0x40 -------------------------------------------------- */
1082
1083 uint16_t cellNo;
1084 uint16_t lastCellNo;
1085 uint16_t imageNo;
1086 uint16_t lastImageNo;
1087 uint32_t gclTop;
1088 int16_t coreX;
1089 int16_t coreY;
1090 int16_t scale;
1091 int16_t scaleY;
1092 GGXXACPR_Collider* colliderSetPtr; /* pointer to a Collider struct array. */
1093 GGXXACPR_Collider* extraColliderSetPtr; /* pointer to a Collider struct array. */
1094 uint8_t boxFlag;
1095 uint8_t hitboxFlag;
1096 uint8_t hurtboxFlag;
1097 PAD(1, 0x5F);
1098 uint32_t tensionAddByHit;
1099 struct GGXXACPR_Entity* attackTargetPtr;
1100 struct GGXXACPR_Entity* hitColliPtr;
1101 struct GGXXACPR_Entity* damColliPtr;
1102 int32_t imageW;
1103 int32_t imageH;
1104 uint8_t colliCnt;
1105 uint8_t colliNo;
1106 int16_t priority2;
1107 int16_t UNKNOWN_FIELD(0x7C); /* RE note: maybe something to do with the after image trail */
1108 int16_t UNKNOWN_FIELD(0x7E); /* RE note: maybe something to do with the after image trail */
1109
1110 /* OFFSET 0x80 -------------------------------------------------- */
1111
1112 int16_t displayVar1;
1113 int16_t displayVar2;
1114 uint8_t boxCount; /* length of `hitboxSetPtr` and `extraHitboxSetPtr` arrays */
1115 int8_t hitboxSetIterationVar;
1116 PAD(2, 0x86);
1117 uint32_t hitParamPtr;
1118 uint32_t damParamPtr;
1119 uint32_t colliHitInterrupt;
1120 uint32_t paletteProcedurePtr;
1121 uint8_t paletteId;
1122 uint8_t localPalette;
1123 uint8_t paletteFlag;
1124 uint8_t fadVal;
1125 int16_t spriteIdTop;
1126 int16_t fbSpriteIdTop;
1127 int16_t spriteIdMax;
1128 int16_t spriteId;
1129 uint32_t sphAddr;
1130 int16_t transMode;
1131 uint8_t spriteIdIdx;
1132 uint8_t texSizeMax;
1133 uint32_t spriteFlag;
1134 int32_t xPos; /* In world units */
1135 int32_t yPos; /* In world units */
1136 int32_t xVelocity; /* world units per frame */
1137 int32_t yVelocity; /* world units per frame */
1138
1139 /* OFFSET 0xC0 -------------------------------------------------- */
1140
1141 int32_t speedsvX;
1142 int32_t speedsvY;
1143 int32_t hitBackX;
1144 int32_t rHitBackX;
1145 int32_t adBackX;
1146 int32_t gravity;
1147 int16_t parentX;
1148 int16_t parentY;
1149 uint16_t angle;
1150 int16_t drawPriority; /* Higher values draw first, lower values draw over higher values (i.e. Z position). */
1151 uint32_t instTable; /* Pointer to an array of ActionHeader struct pointers */
1152 GGXXACPR_ActionHeader actHeader;
1153 GGXXACPR_ActionHeader* actHeaderPtr;
1154 uint32_t instAddr;
1155 uint16_t instSt;
1156 uint16_t instVal;
1157 uint16_t animationNo;
1158 uint16_t animationTime;
1159 uint8_t animationRate;
1160 uint8_t hitstopTime; /* Hitstop duration timer. */
1161 uint8_t animationTimeMax;
1162 int8_t mark; /* move-specific variable. Used to denote active windows of command grabs, some counter stance moves, etc. */
1163
1164 /* OFFSET 0x100 -------------------------------------------------- */
1165
1166 uint8_t trans;
1167 uint8_t trans2;
1168 uint16_t dashFlags;
1169 uint16_t airDashFlags;
1170 uint16_t airDashFlags2;
1171 PAD(24, 0x108);
1172 uint32_t throwFlags; /* bitfield */
1173 PAD(12, 0x124);
1175
1176/* Struct layout sanity checks */
1177static_assert(offsetof(GGXXACPR_Entity, cellNo) == 0x40);
1178static_assert(offsetof(GGXXACPR_Entity, displayVar1) == 0x80);
1179static_assert(offsetof(GGXXACPR_Entity, speedsvX) == 0xC0);
1180static_assert(offsetof(GGXXACPR_Entity, trans) == 0x100);
1181static_assert(sizeof(GGXXACPR_Entity) == 0x130);
1182
1183enum GGXXACPR_TrainingState {
1184 ACPR_TRAINING_STATE_DEFAULT,
1185 ACPR_TRAINING_STATE_SWITCH,
1186 ACPR_TRAINING_STATE_RECORDING_STANDBY,
1187 ACPR_TRAINING_STATE_RECORDING_RECORD,
1188 ACPR_TRAINING_STATE_RECORDING_PLAYBACK,
1189 ACPR_TRAINING_STATE_PRACTICE_UNUSED,
1190};
1195 uint8_t UNKNOWN_FIELD(0x0);
1196 uint8_t UNKNOWN_FIELD(0x1);
1197 uint16_t PlaybackTimer;
1198 int32_t* Recording;
1199 int32_t InstantStartIndex;
1200 int32_t RecordingSize;
1202static_assert(sizeof(GGXXACPR_ReversalRecordingState) == 0x10);
1207 uint16_t State; // Enum GGXXACPR_TrainingState
1208 uint16_t PlaybackTimer;
1209 int16_t UNKNOWN_FIELD(0x4);
1210 int16_t RNG;
1211 int32_t Recordings[4500][4];
1212 int32_t UNKNOWN_FIELD(0x11948); // Current slot?
1213 int32_t InstantStartIndices[4];
1214 int32_t RecordingSizes[4];
1215 int32_t UNKNOWN_FIELD(0x1196C); // Recording ptr?
1216 int32_t UNKNOWN_FIELD(0x11970); // starting point?
1217 int32_t UNKNOWN_FIELD(0x11974); // recording size?
1218 int32_t UNKNOWN_FIELD(0x11978);
1219 struct GGXXACPR_ReversalRecordingState ReversalRecordingStates[2];
1220 uint32_t InputArray[4][2]; // Enum GGXXACPR_RawControllerInput
1222static_assert(offsetof(GGXXACPR_DummyRecordingState, UNKNOWN_FIELD(0x11948)) == 0x11948);
1223static_assert(offsetof(GGXXACPR_DummyRecordingState, UNKNOWN_FIELD(0x11978)) == 0x11978);
1224static_assert(sizeof(GGXXACPR_DummyRecordingState) == (0x6bb6d0 - 0x6a9d14));
1225
1226#if defined(D3DCOLOR_DEFINED) && defined(D3DVECTOR_DEFINED)
1227 typedef D3DVECTOR GGXXACPR_Vector;
1228 typedef D3DCOLOR GGXXACPR_Color;
1229#else
1230 typedef struct GGXXACPR_Vector {
1231 float x, y, z;
1233 // Format is A8R8G8B8
1234 typedef uint32_t GGXXACPR_Color;
1235#endif
1236
1237typedef struct GGXXACPR_ColorVertex {
1238 GGXXACPR_Vector Vector;
1239 GGXXACPR_Color Color;
1241
1246 int32_t spriteId;
1247 float x, y, z;
1248 float zm_x, zm_y;
1249 float u0, v0, u1, v1;
1250 int32_t angle;
1251 float alpha; // transparency
1252 int16_t listType;
1253 uint16_t attribute; // see enum GGXXACPR_DrawSpriteAttributes
1254 int32_t base_color;
1255 int32_t offset_color;
1256 int32_t size_x;
1257 int32_t size_y;
1258 int32_t texture;
1260/* Struct layout sanity checks */
1261static_assert(offsetof(GGXXACPR_DrawSpriteParams, z) == 0x0C);
1262static_assert(offsetof(GGXXACPR_DrawSpriteParams, v0) == 0x1C);
1263static_assert(offsetof(GGXXACPR_DrawSpriteParams, v1) == 0x24);
1264static_assert(sizeof(GGXXACPR_DrawSpriteParams) == 0x48);
1265
1266#undef UNKNOWN_FIELD
1267#undef PAD
1268
1269#endif
Definition ggxxacpr_c.h:527
Definition ggxxacpr_c.h:593
Definition ggxxacpr_c.h:795
Definition ggxxacpr_c.h:730
Definition ggxxacpr_c.h:670
Definition ggxxacpr_c.h:716
Definition ggxxacpr_c.h:645
uint16_t HoopDolphinType
Definition ggxxacpr_c.h:656
uint16_t RestiveRollingDirection
Definition ggxxacpr_c.h:651
uint8_t SecretGardenQueue[4]
Definition ggxxacpr_c.h:667
Definition ggxxacpr_c.h:639
Definition ggxxacpr_c.h:517
Definition ggxxacpr_c.h:1237
Definition ggxxacpr_c.h:554
Definition ggxxacpr_c.h:1245
Training mode dummy recording struct.
Definition ggxxacpr_c.h:1206
Definition ggxxacpr_c.h:1045
Definition ggxxacpr_c.h:475
Definition ggxxacpr_c.h:534
Definition ggxxacpr_c.h:468
Definition ggxxacpr_c.h:873
Definition ggxxacpr_c.h:489
Training mode dummy reversal recording struct.
Definition ggxxacpr_c.h:1194
Definition ggxxacpr_c.h:581
Definition ggxxacpr_c.h:1230
Definition ggxxacpr_c.h:847