mgs_reversing/source/chara/snake_vr/sna_init.h

493 lines
19 KiB
C

// FIXME: copy-pasta of snake/sna_init.h
#ifndef __MGS_CHARA_SNA_INIT_H__
#define __MGS_CHARA_SNA_INIT_H__
#include <sys/types.h>
#include <libgte.h>
#include <libgpu.h>
#include "libgv/libgv.h"
#include "game/game.h"
typedef struct ACTSTILL
{
unsigned char stand;
unsigned char setup;
unsigned char squat;
unsigned char crouch;
unsigned char against_wall;
unsigned char squat_against_wall;
unsigned char tap_wall_r;
unsigned char tap_wall_l;
} ACTSTILL;
typedef struct ACTTRANS
{
unsigned char crouch;
unsigned char squat;
unsigned char stand;
unsigned char pad;
} ACTTRANS;
typedef struct ACTMOVE
{
unsigned char stand;
unsigned char setup;
unsigned char squat;
unsigned char crouch;
unsigned char crouch_backwards;
unsigned char against_wall_r;
unsigned char against_wall_l;
unsigned char aim;
unsigned char aim_stance_l;
unsigned char aim_stance_r;
} ACTMOVE;
typedef struct ACTDAMAGE
{
unsigned char field_0;
unsigned char field_1;
unsigned char field_2;
unsigned char field_3;
unsigned char field_4;
unsigned char field_5;
unsigned char field_6;
unsigned char field_7;
unsigned char field_8;
unsigned char field_9;
unsigned char field_A;
unsigned char field_B;
} ACTDAMAGE;
typedef struct ACTATTACK
{
unsigned char aim;
unsigned char reload;
unsigned char punch;
unsigned char setup;
unsigned char shoot;
unsigned char field_5;
unsigned char field_6;
unsigned char field_7;
unsigned char field_8;
unsigned char field_9;
} ACTATTACK;
typedef struct ACTSPECIAL
{
unsigned char field_0;
unsigned char field_1;
unsigned char field_2;
unsigned char field_3;
unsigned char field_4;
unsigned char field_5;
unsigned char field_6;
unsigned char field_7;
} ACTSPECIAL;
typedef struct Sna_E6
{
unsigned char field_0;
unsigned char field_1;
unsigned char field_2;
unsigned char field_3;
} Sna_E6;
typedef struct Target_Data
{
SVECTOR field_0;
SVECTOR field_8_size;
int field_10;
int field_14;
int field_18;
unsigned int field_1C;
} Target_Data;
typedef struct ACTPACK
{
ACTSTILL *still; /* 静止モーション */
ACTMOVE *move; /* 移動モーション */
ACTTRANS *trans; /* 遷移モーション */
ACTDAMAGE *damage; /* ダメージモーション */
ACTATTACK *attack; /* 攻撃モーション */
Sna_E6 *special1; //u_char *special1 ; /* 特殊モーション1 */
ACTSPECIAL *special2; //u_char *special2 ; /* 特殊モーション2 */
} ACTPACK;
typedef enum
{
SNA_FLAG1_UNK1 = 0x1,
SNA_FLAG1_UNK2 = 0x2,
SNA_FLAG1_UNK3 = 0x4,
SNA_FLAG1_UNK4 = 0x8,
SNA_FLAG1_UNK5 = 0x10,
SNA_FLAG1_UNK6 = 0x20,
SNA_FLAG1_UNK7 = 0x40,
SNA_FLAG1_UNK8 = 0x80,
SNA_FLAG1_UNK9 = 0x100,
SNA_FLAG1_UNK10 = 0x200,
SNA_FLAG1_UNK11 = 0x400,
SNA_FLAG1_UNK12 = 0x800,
SNA_FLAG1_UNK13 = 0x1000,
SNA_FLAG1_UNK14 = 0x2000,
SNA_FLAG1_UNK15 = 0x4000,
SNA_FLAG1_UNK16 = 0x8000,
SNA_FLAG1_UNK17 = 0x10000,
SNA_FLAG1_UNK18 = 0x20000,
SNA_FLAG1_UNK19 = 0x40000,
SNA_FLAG1_UNK20 = 0x80000,
SNA_FLAG1_UNK21 = 0x100000,
SNA_FLAG1_UNK22 = 0x200000,
SNA_FLAG1_UNK23 = 0x400000,
SNA_FLAG1_UNK24 = 0x800000,
SNA_FLAG1_UNK25 = 0x1000000,
SNA_FLAG1_UNK26 = 0x2000000,
SNA_FLAG1_UNK27 = 0x4000000,
SNA_FLAG1_UNK28 = 0x8000000,
SNA_FLAG1_UNK29 = 0x10000000,
SNA_FLAG1_UNK30 = 0x20000000,
SNA_FLAG1_UNK31 = 0x40000000,
SNA_FLAG1_UNK32 = 0x80000000,
} SnaFlag1;
typedef enum
{
SNA_FLAG2_UNK1 = 0x1,
SNA_FLAG2_UNK2 = 0x2,
SNA_FLAG2_UNK3 = 0x4,
SNA_FLAG2_UNK4 = 0x8,
SNA_FLAG2_UNK5 = 0x10,
SNA_FLAG2_UNK6 = 0x20,
SNA_FLAG2_UNK7 = 0x40,
SNA_FLAG2_UNK8 = 0x80,
SNA_FLAG2_UNK9 = 0x100,
SNA_FLAG2_UNK10 = 0x200,
SNA_FLAG2_UNK11 = 0x400,
SNA_FLAG2_UNK12 = 0x800,
SNA_FLAG2_UNK13 = 0x1000,
SNA_FLAG2_UNK14 = 0x2000,
SNA_FLAG2_UNK15 = 0x4000,
SNA_FLAG2_UNK16 = 0x8000,
SNA_FLAG2_UNK17 = 0x10000,
SNA_FLAG2_UNK18 = 0x20000,
SNA_FLAG2_UNK19 = 0x40000,
SNA_FLAG2_UNK20 = 0x80000,
SNA_FLAG2_UNK21 = 0x100000,
SNA_FLAG2_UNK22 = 0x200000,
SNA_FLAG2_UNK23 = 0x400000,
SNA_FLAG2_UNK24 = 0x800000,
SNA_FLAG2_UNK25 = 0x1000000,
SNA_FLAG2_UNK26 = 0x2000000,
SNA_FLAG2_UNK27 = 0x4000000,
SNA_FLAG2_UNK28 = 0x8000000,
SNA_FLAG2_UNK29 = 0x10000000,
SNA_FLAG2_UNK30 = 0x20000000,
SNA_FLAG2_UNK31 = 0x40000000,
SNA_FLAG2_UNK32 = 0x80000000,
} SnaFlag2;
// sub struct of SnaInitWork
typedef struct UnkSnakeStruct2
{
unsigned short field_9E4;
short field_9E6;
short field_9E8;
short field_9EA;
short field_9EC_flags3;
short field_9EE;
short field_9F0;
short field_9F2;
SVECTOR field_9F4;
} UnkSnakeStruct2;
typedef struct SnaAutoMove // @ field_A00 in SnaInitWork
{
VECTOR field_0_ivec; // dunno why int vector. this is something like the direction snake is moving
SVECTOR field_10_vec1; // these last two are related to the target position snake wants to move to
SVECTOR field_18_vec2;
} SnaAutoMove;
struct SnaInitWork;
typedef void (*TSnakeFunction)(struct SnaInitWork *, int);
// TODO: define the rest of the joints
#define SNAKEJOINT_NUM 16
// TODO: Many fields and sub structures are not yet recovered/incorrect
typedef struct SnaInitWork
{
GV_ACT actor;
CONTROL control;
OBJECT body;
MOTION_CONTROL m_ctrl;
MOTION_SEGMENT m_segs1[SNAKEJOINT_NUM + 1];
MOTION_SEGMENT m_segs2[SNAKEJOINT_NUM + 1];
SVECTOR rots[SNAKEJOINT_NUM];
SVECTOR adjust[SNAKEJOINT_NUM];
int field_798_p_height;
int field_79C;
int field_7A0_msg_count;
GV_MSG field_7A4_msgs[8];
int field_844;
MATRIX field_848_lighting_mtx; // .t is R, G, B
MATRIX field_868_lighting_mtx2;
GV_ACT *field_888_pShadow;
int *field_88C; // shadow enabled?
unsigned short field_890_autoaim_max_dist;
unsigned short field_892_autoaim_min_angle;
SnaFlag1 field_894_flags1;
// field_898_flags2 removed here
TARGET *field_89C_pTarget;
TARGET field_8A0_target;
TARGET *field_8E8_pTarget;
SVECTOR field_8EC_vec;
int field_8F4;
int field_8F8;
SVECTOR field_8FC;
int field_904_frames_last_choke;
GV_ACT *field_908_weapon_actor;
TSnakeFunction field_90C_pWeaponFn;
int field_910;
int field_914_trigger;
short *field_918_n_bullets;
int field_91C_weapon_idx;
int field_920_tbl;
short field_924;
short field_926;
DG_TEX *field_928;
DG_PRIM *field_92C;
SVECTOR field_930;
SVECTOR field_938;
SVECTOR field_940;
SVECTOR field_948;
POLY_FT4 field_950[2];
int field_9A0;
GV_ACT *field_9A4_item_actor;
int field_9A8_current_item;
int field_9AC;
GV_PAD *field_9B0_pad_ptr;
ACTPACK *actpack;
TSnakeFunction field_9B8_fn_anim;
int field_9BC_anim_frame;
TSnakeFunction field_9C0;
int field_9C4;
TSnakeFunction field_9C8_anim_update_fn_3p; // called for every anim/state while in third person
TSnakeFunction field_9CC_anim_update_fn_1p; // same except first person. caller: 8005a7e0
short field_9D0[10];
UnkSnakeStruct2 field_9E4;
void *field_9FC;
SnaAutoMove field_A00; // auto movement of snake during mini cutscenes. some above fields may also be this
short field_A20;
short field_A22_snake_current_health;
char field_A24_invuln_frames;
char field_A25;
short field_A26_stance; // SNA_STANCE_...
short field_A28;
short field_A2A;
SVECTOR field_A2C;
char field_A34;
char field_A35_vibtime2;
char field_A36;
char field_A37;
short field_A38_local_data;
short field_A3A;
SVECTOR field_A3C;
SVECTOR field_A44;
int field_A4C;
short field_A50;
short field_A52;
// var reused in differenet contexts, union is better than a generic name for all contexts
union {
short choke_count;
short prone_bool_thing;
short wall_thing;
short knockdown_thing;
} field_A54;
short field_A56;
short field_A58;
unsigned short field_A5A;
unsigned short field_A5C;
short field_A5E;
SVECTOR field_A60;
SVECTOR field_A68;
int field_A70;
} SnaInitWork;
typedef void * (*TSnakeEquipFuncion)(CONTROL *, OBJECT *, int);
void sna_start_anim_8004E1F4(SnaInitWork *work, void *pFn);
void SetAction_8004E22C(SnaInitWork *work, int action_flag, int interp);
void sna_8004E260(SnaInitWork *work, int a2, int interp, int a4);
int GM_CheckPlayerStatusFlag(PlayerStatusFlag arg0);
int GM_SetPlayerStatusFlag(PlayerStatusFlag arg0);
void GM_ClearPlayerStatusFlag(PlayerStatusFlag flag);
void sna_set_flags1_8004E2F4(SnaInitWork *snake, SnaFlag1 flags);
void sna_clear_flags1_8004E308(SnaInitWork *snake, SnaFlag1 flags);
int sna_check_flags1_8004E31C(SnaInitWork *snake, SnaFlag1 flags);
void sna_set_flags2_8004E330(SnaInitWork *snake, SnaFlag2 flag);
void sna_clear_flags2_8004E344(SnaInitWork *snake, SnaFlag2 flags);
unsigned int sna_sub_8004E358(SnaInitWork *snake, SnaFlag2 param_2);
void CheckSnakeDead_8004E384(SnaInitWork *snake);
void sna_sub_8004E41C(SnaInitWork *snake, unsigned short flags);
int sub_8004E458(short param_1, int param_2);
int sub_8004E4C0(SnaInitWork *work, int param_2);
int sna_line_check(SVECTOR *line, HZD_HDL *hzd, int flag, int exclude);
void sub_8004E588(HZD_HDL *param_1, SVECTOR *param_2, int *levels);
int sub_8004E930(SnaInitWork *snake, int arg1);
void sub_8004E9D0(SnaInitWork *work);
void sub_8004EA50(SnaInitWork *work, int param_2);
int sna_8004EAA8(SnaInitWork *work, int a2);
void sub_8004EB74(SnaInitWork *work);
void sna_8004EC00(SnaInitWork *work);
void sna_8004EC8C(SnaInitWork *work);
void sub_8004ED08(SnaInitWork *work);
void sub_8004EEB0(SnaInitWork *work);
int sub_8004EFE4(SnaInitWork *work, int param_2);
void sna_8004F034(SnaInitWork *work, unsigned int bits);
void sna_act_helper2_helper4_8004F090(SnaInitWork *work, int param_2);
void sub_8004F14C(SnaInitWork *param_1);
void sub_8004F204(SnaInitWork *param_1);
void sna_set_invuln_8004F2A0(SnaInitWork *work, char invuln_frames);
void sna_clear_invuln_8004F2EC(SnaInitWork *snake);
void sub_8004F338(SnaInitWork *param_1);
int sna_act_unk_helper4_8004FA3C(void);
void sna_8004FA74(SnaInitWork *param_1);
void sub_8004FA9C(SnaInitWork *snake);
int sna_current_item_8004FB38(void);
HZD_FLR **sub_8004FB90(void);
int sna_8004E808(SnaInitWork *work, int a2, int a3, int a4, int a5);
// TODO: move these to game.h even though theyre defined in sna_init.c?
// .. or move the implementation to a static inline in game.h which the definition in sna_init calls?
int GM_Next_BulName_8004FBA0();
void GM_ClearBulName(int idx);
void GM_CheckShukanReverse(unsigned short *pInput);
void GM_CheckShukanReverseAnalog(unsigned char *pInput);
void sna_check_knock_800501F8(SnaInitWork *work, int time);
int sna_prone_check_standup_80050398(SnaInitWork *work);
void sna_80050440(SnaInitWork *work);
void sna_80050568(SnaInitWork *work);
int sub_800507D8(SnaInitWork *param_1);
void sna_80051FD0(SnaInitWork *work);
void sna_fn_80052120(SnaInitWork *work, int time);
void sub_8005230C(SnaInitWork *work, int time);
void sub_80052468(SnaInitWork *work, int time);
void sna_fn_80052540(SnaInitWork *work, int time);
void sna_fn_800525F8(SnaInitWork *work, int time);
void sna_act_helper2_helper_helper_800526BC(SnaInitWork *work, int time);
void sna_anim_idle_8005275C(SnaInitWork *work, int time);
void sna_anim_crouch_800527DC(SnaInitWork *param_1, int time);
void sna_anim_prone_idle_800528BC(SnaInitWork *work, int time);
void sna_anim_run_8005292C(SnaInitWork *work, int time);
void sna_anim_prone_move_800529C0(SnaInitWork *work, int time);
void sna_anim_wall_idle_and_c4_80052A5C(SnaInitWork *work, int time);
void sna_anim_wall_move_80052BA8(SnaInitWork *work, int time);
void sna_anim_wall_crouch_80052CCC(SnaInitWork *work, int time);
void sna_fn_80052E58(SnaInitWork *work, int time);
void sna_anim_crouch_helper_80053014(SnaInitWork *work, int time);
void sna_fn_800531F4(SnaInitWork *work, int time);
void sna_fn_nothing_80053B80(SnaInitWork *param_1, int time);
void sna_anim_run_begin_80053B88(SnaInitWork *param_1, int time);
void sna_anim_prone_begin_80053BE8(SnaInitWork *work, int time);
void sna_anim_prone_standup_80053D74(SnaInitWork *work, int time);
void sna_anim_enter_duct_80053E9C(SnaInitWork *work, int time);
void sub_80053FAC(SnaInitWork *work, int time);
void sna_gun_800540D0(SnaInitWork *work, int time);
void sna_bomb_800541A8(SnaInitWork *work);
void sna_anim_chokethrow_begin1_80054210(SnaInitWork *work, int time);
void sna_8005425C(SnaInitWork *work, int time);
void sna_80054318(SnaInitWork *work, int time);
void sna_fn_800543A8(SnaInitWork *work, int time);
void sna_anim_duct_move_80054424(SnaInitWork *work, int time);
void sna_anim_duct_idle_80054488(SnaInitWork *work, int time);
void sna_anim_shot_flinch_800544E0(SnaInitWork *work, int time);
void sna_act_helper2_helper7_80054648(SnaInitWork *work, int time);
void sna_anim_knockdown_80054710(SnaInitWork *work, int time);
void sna_anim_knockdown_idle_80054930(SnaInitWork *work, int time);
void sna_anim_knockdown_getup_80054A10(SnaInitWork *work, int time);
void sna_anim_knockdown_shot_80054B50(SnaInitWork *work);
void sna_anim_knockdown_shot_tank_80054C08(SnaInitWork *work, int time);
void sna_anim_scope_80055334(SnaInitWork *param_1, int time);
void sna_anim_jpegcam_800553CC(SnaInitWork *work, int time);
void sna_anim_box_idle_800553EC(SnaInitWork *work, int time);
void sna_anim_box_move_8005544C(SnaInitWork *work, int time);
void sna_anim_box_stop_800554B4(SnaInitWork *work, int time);
void sub_8005684C(SnaInitWork *work);
void sub_8005688C(SnaInitWork *work, int time);
void sub_80056928(SnaInitWork *param_1, int time);
void sna_knockdown_check_getup_80056A1C(SnaInitWork *work, int time);
void sna_80056A54(SnaInitWork *work, int time);
void sna_fn_80056AD8(SnaInitWork *work, int time);
void sna_anim_shoot_weapon_80056B88(SnaInitWork *work, int time);
void sna_anim_rungun_begin_80056BDC(SnaInitWork *param_1, int time);
void sna_anim_rungun_80056C3C(SnaInitWork *param_1, int time);
void sna_anim_stinger_800570C0(SnaInitWork *work, int time);
void sna_80057118(SnaInitWork *work, int time);
void sna_800571B8(SnaInitWork *work, int time);
void sna_80057378(SnaInitWork *work, int time);
void sna_anim_shoot_weapon_helper_80057590(SnaInitWork *work, int time);
void sna_anim_rungun_begin_helper_800577B4(SnaInitWork *work, int time);
void sna_auto_aim_800579A0(SnaInitWork *work);
STATIC void OP_ShootStinger(SnaInitWork *work, int time);
void sub_80058644(SnaInitWork *work, int time);
void sna_anim_punch_80058C10(SnaInitWork *work, int time);
void sna_anim_chokethrow_begin2_80058C80(SnaInitWork *work, int time);
void sna_anim_choke_80058E88(SnaInitWork *work, int time);
void sna_anim_choke_rechoke_80058EF4(SnaInitWork *work, int time);
void sna_anim_choke_rechoke_80058EF4(SnaInitWork *work, int time);
void sna_anim_choke_kill_80058F88(SnaInitWork *work, int time);
void snake_vr_sna_init_80055500(SnaInitWork *work, int time);
void sna_anim_choke_drag_80059054(SnaInitWork *work, int time);
void sna_anim_choke_hold_80059154(SnaInitWork *work, int time);
void sub_800591BC(SnaInitWork *work);
void sna_anim_choke_helper_8005951C(SnaInitWork *work, int time);
void sna_anim_choke_rechoke_helper_8005961C(SnaInitWork *work, int time);
void sna_kill_8005B52C(SnaInitWork *work);
void sna_anim_psg1_helper_80057FD4(SnaInitWork *work, int a2);
void sna_80051DA0(SnaInitWork *work);
void sna_80053360(SnaInitWork *work, int time);
void sub_80057BF0(SnaInitWork *work, int a2);
void sna_anim_throw_800589C8(SnaInitWork *work, int a2);
void sna_gun_800540D0(SnaInitWork *work, int a2);
void sna_anim_punch_helper_800591F4(SnaInitWork *work, int a2);
int sna_8004FDE8(SnaInitWork *work, Target_Data *pVec);
void sna_8004F8E4(SnaInitWork *work, int a2);
void sna_fn_800535B8(SnaInitWork *work, int time);
void sna_knockdown_getup_80050668(SnaInitWork *work);
void sna_anim_grenade_80058470(struct SnaInitWork *work, int a2);
void sna_anim_claymore_80057474(struct SnaInitWork *work, int a2);
void sna_anim_psg1_80056DDC(struct SnaInitWork *work, int a2);
void sna_8004EE28(SnaInitWork *work);
void sna_8004EB14(SnaInitWork *work);
void sna_anim_wall_idle_and_c4_helper_800537D4(SnaInitWork *work, int time);
void sna_anim_wall_crouch_helper_80053A54(SnaInitWork *work, int time);
void sub_8004FAE8(SnaInitWork *work);
void sna_anim_wall_move_helper_800538CC(SnaInitWork *work, int time);
void sna_knock_80054D68(SnaInitWork *work, int time);
void sna_anim_rungun_helper_80057844(SnaInitWork *work, int time);
int sna_8005009C(SnaInitWork *work);
int sub_80051BA4(SnaInitWork *work);
int sub_8004EFE4(SnaInitWork *work, int param_2);
int sub_8004E5E8(SnaInitWork *work, int param_2);
int sub_8004E808(SnaInitWork *work, int, int, int, int); // dummy signature
int sna_act_unk_helper2_helper3_80060684(SnaAutoMove *, SVECTOR *);
int sub_800606E4(SnaAutoMove *param_1, SVECTOR *param_2, int param_3);
void sna_anim_claymore_helper_80058780(SnaInitWork *work, int time);
void sna_act_unk2_80051170(TARGET *pTarget);
void sna_act_helper3_helper_80056650(SnaInitWork *work, int time);
void sna_act_unk_helper3_80055DD8(SnaInitWork *work, int time);
void sna_anim_mini_cutscene_800559D8(SnaInitWork *work, int time);
void sna_anim_dying_80055524(SnaInitWork *work, int time);
void sna_act_unk_helper2_helper2_800605DC(SnaAutoMove *autoMove, HZD_HDL *pHzd, SVECTOR *pVec);
int sna_unk_helper2_helper_8006070C(SnaAutoMove *pAutoMove, CONTROL *pControl);
void sna_80057A90(SnaInitWork *work, int time);
void sna_8004EF14(SnaInitWork *work);
void *NewSnake(int name, int where, int argc, char **argv);
int sna_act_unk_helper2_helper_helper_8005C974(HZD_HDL *pHzd, int, int, CONTROL *pControl);
void sna_act_helper2_helper2_80033054(int id, SVECTOR *vec);
int sna_ration_available_8004FB4C(void);
#endif // __MGS_CHARA_SNA_INIT_H__