From 8913306df84b047812f98d91b621b36df40aabfc Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 2 Mar 2021 08:16:54 +1000 Subject: [PATCH] Discover gunctrl struct --- src/game/activemenu/activemenu.c | 20 +++---- src/game/chr/chr.c | 2 +- src/game/core.c | 4 +- src/game/game_010b20.c | 38 ++++++------ src/game/game_097ba0.c | 62 +++++++++---------- src/game/game_127910.c | 24 ++++---- src/game/sight.c | 2 +- src/game/training/training.c | 2 +- src/include/types.h | 100 ++++++++++++++++--------------- 9 files changed, 130 insertions(+), 124 deletions(-) diff --git a/src/game/activemenu/activemenu.c b/src/game/activemenu/activemenu.c index e660b32c3..217955b01 100644 --- a/src/game/activemenu/activemenu.c +++ b/src/game/activemenu/activemenu.c @@ -670,9 +670,9 @@ void amApply(s32 slot) } break; case 1: // Function - if (g_Vars.currentplayer->weaponnum >= WEAPON_UNARMED - && g_Vars.currentplayer->weaponnum <= WEAPON_COMBATBOOST - && g_MpPlayers[g_Vars.currentplayerstats->mpindex].gunfuncs[(g_Vars.currentplayer->weaponnum - 1) >> 3] & (1 << (g_Vars.currentplayer->weaponnum - 1 & 7))) { + if (g_Vars.currentplayer->gunctrl.weaponnum >= WEAPON_UNARMED + && g_Vars.currentplayer->gunctrl.weaponnum <= WEAPON_COMBATBOOST + && g_MpPlayers[g_Vars.currentplayerstats->mpindex].gunfuncs[(g_Vars.currentplayer->gunctrl.weaponnum - 1) >> 3] & (1 << (g_Vars.currentplayer->gunctrl.weaponnum - 1 & 7))) { if (slot == 1) { g_AmMenus[g_AmIndex].togglefunc = true; } @@ -766,9 +766,9 @@ void amGetSlotDetails(s32 slot, u32 *flags, char *label) if (slot == 1) { if (!secfunc - || g_Vars.currentplayer->weaponnum < WEAPON_UNARMED - || g_Vars.currentplayer->weaponnum > WEAPON_COMBATBOOST - || (g_MpPlayers[g_Vars.currentplayerstats->mpindex].gunfuncs[(g_Vars.currentplayer->weaponnum - 1) >> 3] & (1 << (g_Vars.currentplayer->weaponnum - 1 & 7))) == 0) { + || g_Vars.currentplayer->gunctrl.weaponnum < WEAPON_UNARMED + || g_Vars.currentplayer->gunctrl.weaponnum > WEAPON_COMBATBOOST + || (g_MpPlayers[g_Vars.currentplayerstats->mpindex].gunfuncs[(g_Vars.currentplayer->gunctrl.weaponnum - 1) >> 3] & (1 << (g_Vars.currentplayer->gunctrl.weaponnum - 1 & 7))) == 0) { *flags |= AMSLOTFLAG_CURRENT; } @@ -777,9 +777,9 @@ void amGetSlotDetails(s32 slot, u32 *flags, char *label) } } else { if (!prifunc || ( - g_Vars.currentplayer->weaponnum >= WEAPON_UNARMED - && g_Vars.currentplayer->weaponnum <= WEAPON_COMBATBOOST - && g_MpPlayers[g_Vars.currentplayerstats->mpindex].gunfuncs[(g_Vars.currentplayer->weaponnum - 1) >> 3] & (1 << (g_Vars.currentplayer->weaponnum - 1 & 7)))) { + g_Vars.currentplayer->gunctrl.weaponnum >= WEAPON_UNARMED + && g_Vars.currentplayer->gunctrl.weaponnum <= WEAPON_COMBATBOOST + && g_MpPlayers[g_Vars.currentplayerstats->mpindex].gunfuncs[(g_Vars.currentplayer->gunctrl.weaponnum - 1) >> 3] & (1 << (g_Vars.currentplayer->gunctrl.weaponnum - 1 & 7)))) { *flags |= AMSLOTFLAG_CURRENT; } @@ -1031,7 +1031,7 @@ void amAssignWeaponSlots(void) void amOpen(void) { - if (g_Vars.currentplayer->passivemode == false) { + if (g_Vars.currentplayer->gunctrl.passivemode == false) { g_AmIndex = g_Vars.currentplayernum; g_Vars.currentplayer->activemenumode = AMMODE_VIEW; g_PlayersWithControl[g_Vars.currentplayernum] = false; diff --git a/src/game/chr/chr.c b/src/game/chr/chr.c index 71ce6dbc2..35d9f1335 100644 --- a/src/game/chr/chr.c +++ b/src/game/chr/chr.c @@ -4082,7 +4082,7 @@ void chrUpdateCloak(struct chrdata *chr) // If cloak is enabled via cloaking device or via RCP120 if ((g_Vars.currentplayer->devicesactive & DEVICE_CLOAKDEVICE) - || (g_Vars.currentplayer->weaponnum == WEAPON_RCP120 + || (g_Vars.currentplayer->gunctrl.weaponnum == WEAPON_RCP120 && (g_Vars.currentplayer->devicesactive & DEVICE_CLOAKRCP120))) { if ((chr->hidden & CHRHFLAG_CLOAKED) == 0 && chr->cloakpause < 1) { chrCloak(chr, true); diff --git a/src/game/core.c b/src/game/core.c index e74f0e259..9e10806e7 100644 --- a/src/game/core.c +++ b/src/game/core.c @@ -1062,12 +1062,12 @@ Gfx *coreRender(Gfx *gdl) } var80084050++; - } else if (g_Vars.currentplayer->unk1583_06 + } else if (g_Vars.currentplayer->gunctrl.unk1583_06 && var80075d60 == 2 && g_Vars.currentplayer->cameramode != CAMERAMODE_THIRDPERSON && g_Vars.currentplayer->cameramode != CAMERAMODE_EYESPY && var8009dfc0 == 0) { - g_Vars.currentplayer->unk1583_06 = func0f09eae4(); + g_Vars.currentplayer->gunctrl.unk1583_06 = func0f09eae4(); } if (g_Vars.lockscreen) { diff --git a/src/game/game_010b20.c b/src/game/game_010b20.c index b26a60d71..40924d21f 100644 --- a/src/game/game_010b20.c +++ b/src/game/game_010b20.c @@ -147,25 +147,25 @@ void func0f010bb0(void) i = ALIGN16(func0f09ddfc()); } - g_Vars.currentplayer->unk158c = malloc(i, MEMPOOL_STAGE); - g_Vars.currentplayer->unk159c = 0; - g_Vars.currentplayer->unk15a0 = 0; - g_Vars.currentplayer->unk15a4 = 0; - g_Vars.currentplayer->unk15b0 = 0; - g_Vars.currentplayer->unk15b1 = 0; - g_Vars.currentplayer->unk1588 = 0; - g_Vars.currentplayer->unk1584 = -1; - g_Vars.currentplayer->unk15ea = 2; - g_Vars.currentplayer->unk15eb = 0; + g_Vars.currentplayer->gunctrl.unk158c = malloc(i, MEMPOOL_STAGE); + g_Vars.currentplayer->gunctrl.unk159c = 0; + g_Vars.currentplayer->gunctrl.unk15a0 = 0; + g_Vars.currentplayer->gunctrl.unk15a4 = 0; + g_Vars.currentplayer->gunctrl.unk15b0 = 0; + g_Vars.currentplayer->gunctrl.unk15b1 = 0; + g_Vars.currentplayer->gunctrl.gunmemtype = 0; + g_Vars.currentplayer->gunctrl.gunmemnew = -1; + g_Vars.currentplayer->gunctrl.unk15ea = 2; + g_Vars.currentplayer->gunctrl.unk15eb = 0; - g_Vars.currentplayer->unk1583_06 = true; - g_Vars.currentplayer->unk1583_00 = false; - g_Vars.currentplayer->unk1583_04 = false; + g_Vars.currentplayer->gunctrl.unk1583_06 = true; + g_Vars.currentplayer->gunctrl.unk1583_00 = false; + g_Vars.currentplayer->gunctrl.unk1583_04 = false; - g_Vars.currentplayer->switchtoweaponnum = -1; - g_Vars.currentplayer->unk15e7 = 0; + g_Vars.currentplayer->gunctrl.switchtoweaponnum = -1; + g_Vars.currentplayer->gunctrl.unk15e7 = 0; - g_Vars.currentplayer->invertgunfunc = false; + g_Vars.currentplayer->gunctrl.invertgunfunc = false; g_Vars.currentplayer->hands[0] = hand; g_Vars.currentplayer->hands[1] = hand; @@ -176,7 +176,7 @@ void func0f010bb0(void) g_Vars.currentplayer->hands[1].audiohandle = NULL; g_Vars.currentplayer->hands[0].audiohandle = NULL; - g_Vars.currentplayer->unk15f2 = 0; + g_Vars.currentplayer->gunctrl.unk15f2 = 0; for (i = 0; i < ARRAYCOUNT(g_Vars.currentplayer->hands[1].unk0d74); i++) { g_Vars.currentplayer->hands[1].unk0d74[i] = 0; @@ -194,8 +194,8 @@ void func0f010bb0(void) g_Vars.currentplayerstats->killcount = 0; g_Vars.currentplayerstats->ggkillcount = 0; g_Vars.currentplayer->deathcount = 0; - g_Vars.currentplayer->unk15f8 = 1; - g_Vars.currentplayer->unk15fc = 1; + g_Vars.currentplayer->gunposamplitude = 1; + g_Vars.currentplayer->gunxamplitude = 1; g_Vars.currentplayer->doautoselect = false; g_Vars.currentplayer->playertriggeron = false; g_Vars.currentplayer->playertriggerprev = false; diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 2d0b068f7..cd2ac0bb4 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -8004,20 +8004,20 @@ glabel var7f1ac6cc void func0f09df50(void) { - g_Vars.currentplayer->unk15ea = 11; + g_Vars.currentplayer->gunctrl.unk15ea = 11; } void func0f09df64(s32 arg0) { struct player *player = g_Vars.currentplayer; - if (player->unk15ea == 0) { - player->unk15b0 = 0; - player->unk15b1 = 0; - player->unk1584 = arg0; - player->unk15eb = -1; + if (player->gunctrl.unk15ea == 0) { + player->gunctrl.unk15b0 = 0; + player->gunctrl.unk15b1 = 0; + player->gunctrl.gunmemnew = arg0; + player->gunctrl.unk15eb = -1; } else { - player->unk1584 = arg0; + player->gunctrl.gunmemnew = arg0; } } @@ -12100,12 +12100,12 @@ void currentPlayerEquipWeapon(s32 weaponnum) { struct player *player = g_Vars.currentplayer; - if (player->weaponnum == weaponnum && player->switchtoweaponnum == -1) { + if (player->gunctrl.weaponnum == weaponnum && player->gunctrl.switchtoweaponnum == -1) { return; } - player->switchtoweaponnum = weaponnum; - player->unk1583_05 = 0; + player->gunctrl.switchtoweaponnum = weaponnum; + player->gunctrl.unk1583_05 = 0; } s32 handGetWeaponNum(s32 handnum) @@ -12114,7 +12114,7 @@ s32 handGetWeaponNum(s32 handnum) return WEAPON_NONE; } - return g_Vars.currentplayer->weaponnum; + return g_Vars.currentplayer->gunctrl.weaponnum; } s32 getCurrentPlayerWeaponIdWrapper(s32 handnum) @@ -12136,13 +12136,13 @@ s32 func0f0a1a68(s32 arg0) { s32 weaponnum; - if (g_Vars.currentplayer->switchtoweaponnum >= 0) { - weaponnum = g_Vars.currentplayer->switchtoweaponnum; + if (g_Vars.currentplayer->gunctrl.switchtoweaponnum >= 0) { + weaponnum = g_Vars.currentplayer->gunctrl.switchtoweaponnum; } else { - weaponnum = g_Vars.currentplayer->weaponnum; + weaponnum = g_Vars.currentplayer->gunctrl.weaponnum; } - if (!g_Vars.currentplayer->unk1583_00 && arg0 == 1) { + if (!g_Vars.currentplayer->gunctrl.unk1583_00 && arg0 == 1) { weaponnum = WEAPON_NONE; } @@ -12155,10 +12155,11 @@ void func0f0a1ab0(void) struct player *player = g_Vars.currentplayer; s32 dualweaponnum; - if (invHasSingleWeaponIncAllGuns(player->prevweaponnum)) { - currentPlayerEquipWeaponWrapper(HAND_RIGHT, player->prevweaponnum); + if (invHasSingleWeaponIncAllGuns(player->gunctrl.prevweaponnum)) { + currentPlayerEquipWeaponWrapper(HAND_RIGHT, player->gunctrl.prevweaponnum); - dualweaponnum = invHasDoubleWeaponIncAllGuns(player->prevweaponnum, player->prevweaponnum) * player->prevweaponnum * player->unk1583_01; + dualweaponnum = invHasDoubleWeaponIncAllGuns(player->gunctrl.prevweaponnum, player->gunctrl.prevweaponnum) + * player->gunctrl.prevweaponnum * player->gunctrl.unk1583_01; currentPlayerEquipWeaponWrapper(HAND_LEFT, dualweaponnum); } else { func0f0a1df4(); @@ -12561,9 +12562,9 @@ void currentPlayerEquipWeaponWrapper(bool arg0, s32 weaponnum) { if (arg0 == 1) { if (weaponnum == WEAPON_NONE) { - g_Vars.currentplayer->unk1583_00 = false; + g_Vars.currentplayer->gunctrl.unk1583_00 = false; } else { - g_Vars.currentplayer->unk1583_00 = true; + g_Vars.currentplayer->gunctrl.unk1583_00 = true; } } else { if (weaponnum > WEAPON_SUICIDEPILL) { @@ -13202,7 +13203,7 @@ void currentPlayerLoseGunInNbombStorm(struct prop *prop) return; } - if (weaponnum <= WEAPON_UNARMED || player->switchtoweaponnum != -1) { + if (weaponnum <= WEAPON_UNARMED || player->gunctrl.switchtoweaponnum != -1) { return; } @@ -20417,7 +20418,7 @@ glabel var7f1acb14 void func0f0a8c50(void) { if (g_Vars.currentplayer->hands[HAND_RIGHT].unk0d0f_03 == 0) { - g_Vars.currentplayer->invertgunfunc = false; + g_Vars.currentplayer->gunctrl.invertgunfunc = false; } } @@ -20507,7 +20508,7 @@ void currentPlayerTickInventory(bool triggeron) s32 i; // Remove weapons if in passive mode - if (g_Vars.currentplayer->passivemode) { + if (g_Vars.currentplayer->gunctrl.passivemode) { struct chrdata *chr = g_Vars.currentplayer->prop->chr; triggeron = false; @@ -20516,13 +20517,14 @@ void currentPlayerTickInventory(bool triggeron) invGiveSingleWeapon(WEAPON_UNARMED); } - if (g_Vars.currentplayer->weaponnum != WEAPON_UNARMED - && g_Vars.currentplayer->switchtoweaponnum != WEAPON_UNARMED) { + if (g_Vars.currentplayer->gunctrl.weaponnum != WEAPON_UNARMED + && g_Vars.currentplayer->gunctrl.switchtoweaponnum != WEAPON_UNARMED) { currentPlayerEquipWeapon(WEAPON_UNARMED); } - g_Vars.currentplayer->unk1583_00 = 0; + g_Vars.currentplayer->gunctrl.unk1583_00 = 0; g_Vars.currentplayer->devicesactive = 0; + chr->cloakpause = 0; chr->cloakfadefrac = 0; chr->cloakfadefinished = false; @@ -20581,7 +20583,7 @@ void currentPlayerTickInventory(bool triggeron) if (player->hands[HAND_LEFT].unk0640 && player->hands[HAND_RIGHT].unk0640 - && player->weaponnum != WEAPON_REMOTEMINE) { + && player->gunctrl.weaponnum != WEAPON_REMOTEMINE) { if (player->playertrigtime240 > 80) { gunsfiring[player->curguntofire] = 1; @@ -20604,7 +20606,7 @@ void currentPlayerTickInventory(bool triggeron) player->curguntofire = 1 - player->curguntofire; } - if (player->weaponnum == WEAPON_REMOTEMINE) { + if (player->gunctrl.weaponnum == WEAPON_REMOTEMINE) { player->curguntofire = 0; } @@ -20664,7 +20666,7 @@ void playersSetPassiveMode(bool enable) s32 i; for (i = 0; i < PLAYERCOUNT(); i++) { - g_Vars.players[i]->passivemode = enable; + g_Vars.players[i]->gunctrl.passivemode = enable; } } @@ -20953,7 +20955,7 @@ s32 currentPlayerGetAmmoCount(s32 ammotype) for (i = 0; i < 2; i++) { if (player->hands[i].unk0640) { for (j = 0; j < 2; j++) { - if (player->equippedammotypes[j] == ammotype) { + if (player->gunctrl.totalammo[j] == ammotype) { total = player->hands[i].loadedammo[j] + total; } } diff --git a/src/game/game_127910.c b/src/game/game_127910.c index 53a4fb75a..ffd0eae49 100644 --- a/src/game/game_127910.c +++ b/src/game/game_127910.c @@ -399,25 +399,25 @@ void playerAllocate(s32 index) g_Vars.players[index]->slayerrocket = NULL; g_Vars.players[index]->badrockettime = 0; - g_Vars.players[index]->unk1588 = 0; - g_Vars.players[index]->unk158c = NULL; - g_Vars.players[index]->unk1590 = 0; + g_Vars.players[index]->gunctrl.gunmemtype = 0; + g_Vars.players[index]->gunctrl.unk158c = NULL; + g_Vars.players[index]->gunctrl.unk1590 = 0; - g_Vars.players[index]->weaponnum = WEAPON_NONE; - g_Vars.players[index]->prevweaponnum = -1; - g_Vars.players[index]->switchtoweaponnum = -1; + g_Vars.players[index]->gunctrl.weaponnum = WEAPON_NONE; + g_Vars.players[index]->gunctrl.prevweaponnum = -1; + g_Vars.players[index]->gunctrl.switchtoweaponnum = -1; - g_Vars.players[index]->unk15ea = 2; - g_Vars.players[index]->unk15eb = 0; - g_Vars.players[index]->unk15e6 = 0; + g_Vars.players[index]->gunctrl.unk15ea = 2; + g_Vars.players[index]->gunctrl.unk15eb = 0; + g_Vars.players[index]->gunctrl.unk15e6 = 0; - g_Vars.players[index]->passivemode = false; + g_Vars.players[index]->gunctrl.passivemode = false; g_Vars.players[index]->hands[0] = hand; g_Vars.players[index]->hands[1] = hand; - g_Vars.players[index]->unk15f8 = 1; - g_Vars.players[index]->unk15fc = 1; + g_Vars.players[index]->gunposamplitude = 1; + g_Vars.players[index]->gunxamplitude = 1; g_Vars.players[index]->doautoselect = false; g_Vars.players[index]->playertriggeron = false; diff --git a/src/game/sight.c b/src/game/sight.c index d79854c76..ea85eae91 100644 --- a/src/game/sight.c +++ b/src/game/sight.c @@ -6122,7 +6122,7 @@ Gfx *sightRender(Gfx *gdl, bool sighton, s32 sight) return gdl; } - if (g_Vars.currentplayer->passivemode) { + if (g_Vars.currentplayer->gunctrl.passivemode) { return gdl; } diff --git a/src/game/training/training.c b/src/game/training/training.c index 166116757..2a4cd30db 100644 --- a/src/game/training/training.c +++ b/src/game/training/training.c @@ -1818,7 +1818,7 @@ void frBeginSession(s32 weapon) frCloseAndLockDoor(); for (i = 0; i < 2; i++) { - if (g_Vars.currentplayer->equippedammotypes[i] >= 0) { + if (g_Vars.currentplayer->gunctrl.totalammo[i] >= 0) { g_Vars.currentplayer->hands[0].loadedammo[i] = 0; g_Vars.currentplayer->hands[1].loadedammo[i] = 0; } diff --git a/src/include/types.h b/src/include/types.h index 54cab1588..059036ee1 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -2223,6 +2223,55 @@ struct player0610 { /*0x0e*/ u16 unk0e; }; +struct gunctrl { + /*0x1580*/ s8 weaponnum; + /*0x1581*/ s8 prevweaponnum; // previously drawn weapon, switched to when throwing Dragon/Laptop or when ammo depleted + /*0x1582*/ s8 switchtoweaponnum; // weaponnum to change to + /*0x1583*/ u8 unk1583_00 : 1; + /*0x1583*/ u8 unk1583_01 : 1; + /*0x1583*/ u8 invertgunfunc : 1; + /*0x1583*/ u8 unk1583_03 : 1; + /*0x1583*/ u8 unk1583_04 : 1; + /*0x1583*/ u8 unk1583_05 : 1; + /*0x1583*/ u8 unk1583_06 : 1; + /*0x1583*/ u8 passivemode : 1; + /*0x1584*/ s32 gunmemnew; + /*0x1588*/ u32 gunmemtype; + /*0x158c*/ void *unk158c; + /*0x1590*/ u32 unk1590; + /*0x1594*/ s32 unk1594; + /*0x1598*/ u32 unk1598; + /*0x159c*/ u16 unk159c; + /*0x15a0*/ s32 unk15a0; + /*0x15a4*/ s32 unk15a4; + /*0x15a8*/ u32 unk15a8; + /*0x15ac*/ u32 unk15ac; + /*0x15b0*/ u8 unk15b0; + /*0x15b1*/ u8 unk15b1; + /*0x15b4*/ u32 unk15b4; + /*0x15b8*/ u32 unk15b8; + /*0x15bc*/ u32 unk15bc; + /*0x15c0*/ u32 unk15c0; + /*0x15c4*/ u32 unk15c4; + /*0x15c8*/ u32 unk15c8; + /*0x15cc*/ u32 unk15cc; + /*0x15d0*/ u32 unk15d0; + /*0x15d4*/ u32 unk15d4; + /*0x15d8*/ u32 unk15d8; + /*0x15dc*/ u32 unk15dc; + /*0x15e0*/ u32 unk15e0; + /*0x15e4*/ s8 totalammo[2]; + /*0x15e6*/ u8 unk15e6; + /*0x15e7*/ u8 unk15e7; + /*0x15e8*/ u16 unk15e8; + /*0x15ea*/ u8 unk15ea; + /*0x15eb*/ s8 unk15eb; + /*0x15ec*/ u32 unk15ec; + /*0x15f0*/ u16 unk15f0; + /*0x15f2*/ u16 unk15f2; + /*0x15f4*/ u32 unk15f4; +}; + struct player { /*0x0000*/ s32 cameramode; /*0x0004*/ struct coord memcampos; @@ -2479,54 +2528,9 @@ struct player { /*0x0634*/ s16 viewleft; // 0 /*0x0636*/ s16 viewtop; // 0 /*0x0638*/ struct hand hands[2]; - /*0x1580*/ s8 weaponnum; - /*0x1581*/ s8 prevweaponnum; // previously drawn weapon, switched to when throwing Dragon/Laptop or when ammo depleted - /*0x1582*/ s8 switchtoweaponnum; // weaponnum to change to - /*0x1583*/ u8 unk1583_00 : 1; - /*0x1583*/ u8 unk1583_01 : 1; - /*0x1583*/ u8 invertgunfunc : 1; - /*0x1583*/ u8 unk1583_03 : 1; - /*0x1583*/ u8 unk1583_04 : 1; - /*0x1583*/ u8 unk1583_05 : 1; - /*0x1583*/ u8 unk1583_06 : 1; - /*0x1583*/ u8 passivemode : 1; - /*0x1584*/ s32 unk1584; - /*0x1588*/ u32 unk1588; - /*0x158c*/ void *unk158c; - /*0x1590*/ u32 unk1590; - /*0x1594*/ s32 unk1594; - /*0x1598*/ u32 unk1598; - /*0x159c*/ u16 unk159c; - /*0x15a0*/ s32 unk15a0; - /*0x15a4*/ s32 unk15a4; - /*0x15a8*/ u32 unk15a8; - /*0x15ac*/ u32 unk15ac; - /*0x15b0*/ u8 unk15b0; - /*0x15b1*/ u8 unk15b1; - /*0x15b4*/ u32 unk15b4; - /*0x15b8*/ u32 unk15b8; - /*0x15bc*/ u32 unk15bc; - /*0x15c0*/ u32 unk15c0; - /*0x15c4*/ u32 unk15c4; - /*0x15c8*/ u32 unk15c8; - /*0x15cc*/ u32 unk15cc; - /*0x15d0*/ u32 unk15d0; - /*0x15d4*/ u32 unk15d4; - /*0x15d8*/ u32 unk15d8; - /*0x15dc*/ u32 unk15dc; - /*0x15e0*/ u32 unk15e0; - /*0x15e4*/ s8 equippedammotypes[2]; - /*0x15e6*/ u8 unk15e6; - /*0x15e7*/ u8 unk15e7; - /*0x15e8*/ u16 unk15e8; - /*0x15ea*/ u8 unk15ea; - /*0x15eb*/ s8 unk15eb; - /*0x15ec*/ u32 unk15ec; - /*0x15f0*/ u16 unk15f0; - /*0x15f2*/ u16 unk15f2; - /*0x15f4*/ u32 unk15f4; - /*0x15f8*/ f32 unk15f8; - /*0x15fc*/ f32 unk15fc; + struct gunctrl gunctrl; + /*0x15f8*/ f32 gunposamplitude; + /*0x15fc*/ f32 gunxamplitude; /*0x1600*/ s32 doautoselect; /*0x1604*/ u32 playertriggeron; /*0x1608*/ u32 playertriggerprev;