mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-27 20:20:40 +00:00
- rework of weapon input to use common features in shared code.
This also adds stubs for all unimplemented features in the games for easier addition.
This commit is contained in:
parent
89f5b26988
commit
10df3e094a
14 changed files with 177 additions and 162 deletions
|
@ -525,14 +525,16 @@ void ProcessFrame(void)
|
|||
char buffer[128];
|
||||
for (int i = connecthead; i >= 0; i = connectpoint2[i])
|
||||
{
|
||||
gPlayer[i].input.syncFlags.value &= ~flag_buttonmask;
|
||||
gPlayer[i].input.syncFlags.value |= gFifoInput[gNetFifoTail & 255][i].syncFlags.value;
|
||||
int newweap = gFifoInput[gNetFifoTail & 255][i].getNewWeapon();
|
||||
if (newweap) gPlayer[i].newWeapon = newweap;
|
||||
gPlayer[i].input.fvel = gFifoInput[gNetFifoTail&255][i].fvel;
|
||||
gPlayer[i].input.q16avel = gFifoInput[gNetFifoTail&255][i].q16avel;
|
||||
gPlayer[i].input.svel = gFifoInput[gNetFifoTail&255][i].svel;
|
||||
gPlayer[i].input.q16horz = gFifoInput[gNetFifoTail&255][i].q16horz;
|
||||
auto& inp = gPlayer[i].input;
|
||||
auto oldactions = inp.actions;
|
||||
auto oldflags = inp.syncFlags.value;
|
||||
|
||||
inp = gFifoInput[gNetFifoTail & 255][i];
|
||||
inp.actions |= oldactions & SB_INTERFACE_MASK; // should be everything non-button and non-weapon
|
||||
inp.syncFlags.value |= oldflags & ~flag_buttonmask;
|
||||
|
||||
int newweap = inp.getNewWeapon();
|
||||
if (newweap > 0 && newweap < WeaponSel_MaxBlood) gPlayer[i].newWeapon = newweap;
|
||||
}
|
||||
gNetFifoTail++;
|
||||
|
||||
|
|
|
@ -150,8 +150,7 @@ void ctrlGetInput(void)
|
|||
gInput.syncFlags.quit = 1;
|
||||
|
||||
gInput.syncFlags.value |= BitsToSend.value;
|
||||
if (WeaponToSend != 0)
|
||||
gInput.SetNewWeapon(WeaponToSend);
|
||||
ApplyGlobalInput(gInput, &info);
|
||||
|
||||
BitsToSend.value = 0;
|
||||
WeaponToSend = 0;
|
||||
|
@ -345,27 +344,9 @@ void ctrlGetInput(void)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int ccmd_slot(CCmdFuncPtr parm)
|
||||
{
|
||||
if (parm->numparms != 1) return CCMD_SHOWHELP;
|
||||
|
||||
auto slot = atoi(parm->parms[0]);
|
||||
if (slot >= 1 && slot <= 10)
|
||||
{
|
||||
WeaponToSend = slot;
|
||||
return CCMD_OK;
|
||||
}
|
||||
return CCMD_SHOWHELP;
|
||||
}
|
||||
|
||||
void registerinputcommands()
|
||||
{
|
||||
C_RegisterFunction("slot", "slot <weaponslot>: select a weapon from the given slot (1-10)", ccmd_slot);
|
||||
C_RegisterFunction("weapprev", nullptr, [](CCmdFuncPtr)->int { if (gPlayer[myconnectindex].nextWeapon == 0) BitsToSend.prevWeapon = 1; return CCMD_OK; });
|
||||
C_RegisterFunction("weapnext", nullptr, [](CCmdFuncPtr)->int { if (gPlayer[myconnectindex].nextWeapon == 0) BitsToSend.nextWeapon = 1; return CCMD_OK; });
|
||||
C_RegisterFunction("pause", nullptr, [](CCmdFuncPtr)->int { BitsToSend.pause = 1; sendPause = true; return CCMD_OK; });
|
||||
C_RegisterFunction("proximitybombs", nullptr, [](CCmdFuncPtr)->int { WeaponToSend = 11; return CCMD_OK; });
|
||||
C_RegisterFunction("remotebombs", nullptr, [](CCmdFuncPtr)->int { WeaponToSend = 12; return CCMD_OK; });
|
||||
C_RegisterFunction("jumpboots", nullptr, [](CCmdFuncPtr)->int { BitsToSend.useJumpBoots = 1; return CCMD_OK; });
|
||||
C_RegisterFunction("medkit", nullptr, [](CCmdFuncPtr)->int { BitsToSend.useMedKit = 1; return CCMD_OK; });
|
||||
C_RegisterFunction("centerview", nullptr, [](CCmdFuncPtr)->int { BitsToSend.lookCenter = 1; return CCMD_OK; });
|
||||
|
|
|
@ -1331,7 +1331,7 @@ void ProcessInput(PLAYER *pPlayer)
|
|||
pPlayer->q16horiz = mulscale16(0x8000-(Cos(ClipHigh(pPlayer->deathTime*8, 1024))>>15), fix16_from_int(120));
|
||||
}
|
||||
if (pPlayer->curWeapon)
|
||||
pInput->SetNewWeapon(pPlayer->curWeapon);
|
||||
pInput->setNewWeapon(pPlayer->curWeapon);
|
||||
if (pInput->syncFlags.action)
|
||||
{
|
||||
if (bSeqStat)
|
||||
|
|
|
@ -119,8 +119,8 @@ struct PLAYER
|
|||
char hasFlag;
|
||||
short used2[8]; // ??
|
||||
int damageControl[7];
|
||||
char curWeapon;
|
||||
char nextWeapon;
|
||||
int8_t curWeapon;
|
||||
int8_t nextWeapon;
|
||||
int weaponTimer;
|
||||
int weaponState;
|
||||
int weaponAmmo; //rename
|
||||
|
|
|
@ -2026,9 +2026,9 @@ void WeaponProcess(PLAYER *pPlayer) {
|
|||
pPlayer->newWeapon = pPlayer->nextWeapon;
|
||||
pPlayer->nextWeapon = 0;
|
||||
}
|
||||
if (pPlayer->input.syncFlags.nextWeapon)
|
||||
if (pPlayer->input.getNewWeapon() == WeaponSel_Next)
|
||||
{
|
||||
pPlayer->input.syncFlags.nextWeapon = 0;
|
||||
pPlayer->input.setNewWeapon(0);
|
||||
pPlayer->weaponState = 0;
|
||||
pPlayer->nextWeapon = 0;
|
||||
int t;
|
||||
|
@ -2042,9 +2042,9 @@ void WeaponProcess(PLAYER *pPlayer) {
|
|||
}
|
||||
pPlayer->newWeapon = weapon;
|
||||
}
|
||||
if (pPlayer->input.syncFlags.prevWeapon)
|
||||
else if (pPlayer->input.getNewWeapon() == WeaponSel_Prev)
|
||||
{
|
||||
pPlayer->input.syncFlags.prevWeapon = 0;
|
||||
pPlayer->input.setNewWeapon(0);
|
||||
pPlayer->weaponState = 0;
|
||||
pPlayer->nextWeapon = 0;
|
||||
int t;
|
||||
|
@ -2058,6 +2058,10 @@ void WeaponProcess(PLAYER *pPlayer) {
|
|||
}
|
||||
pPlayer->newWeapon = weapon;
|
||||
}
|
||||
else if (pPlayer->input.getNewWeapon() == WeaponSel_Alt)
|
||||
{
|
||||
// todo
|
||||
}
|
||||
if (pPlayer->weaponState == -1)
|
||||
{
|
||||
pPlayer->weaponState = 0;
|
||||
|
|
|
@ -41,6 +41,8 @@
|
|||
#include"packet.h"
|
||||
#include "gamecontrol.h"
|
||||
|
||||
static int WeaponToSend = 0;
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
@ -220,3 +222,58 @@ void SetupGameButtons()
|
|||
buttonMap.SetButtons(actions, NUM_ACTIONS);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
CCMD(slot)
|
||||
{
|
||||
// The max differs between games so we have to handle this here.
|
||||
int max = (g_gameType & GAMEFLAG_PSEXHUMED) || (g_gameType & (GAMEFLAG_DUKE | GAMEFLAG_SHAREWARE)) == (GAMEFLAG_DUKE | GAMEFLAG_SHAREWARE) ? 7 : (g_gameType & GAMEFLAG_BLOOD) ? 12 : 10;
|
||||
if (argv.argc() != 2)
|
||||
{
|
||||
Printf("slot <weaponslot>: select a weapon from the given slot (1-%d)", max);
|
||||
}
|
||||
|
||||
auto slot = atoi(argv[1]);
|
||||
if (slot >= 1 && slot <= max)
|
||||
{
|
||||
WeaponToSend = slot;
|
||||
}
|
||||
}
|
||||
|
||||
CCMD(weapprev)
|
||||
{
|
||||
WeaponToSend = WeaponSel_Prev;
|
||||
}
|
||||
|
||||
CCMD(weapnext)
|
||||
{
|
||||
WeaponToSend = WeaponSel_Next;
|
||||
}
|
||||
|
||||
CCMD(weapalt)
|
||||
{
|
||||
WeaponToSend = WeaponSel_Alt; // Only used by SW - should also be made usable by Blood ans Duke which put multiple weapons in the same slot.
|
||||
}
|
||||
|
||||
void ApplyGlobalInput(InputPacket& input, ControlInfo *info)
|
||||
{
|
||||
if (WeaponToSend != 0) input.setNewWeapon(WeaponToSend);
|
||||
WeaponToSend = 0;
|
||||
if (info)
|
||||
{
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && info->dz > 0) input.setNewWeapon(WeaponSel_Prev);
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && info->dz < 0) input.setNewWeapon(WeaponSel_Next);
|
||||
}
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select))
|
||||
{
|
||||
// This eats the controller input for regular use
|
||||
info->dx = 0;
|
||||
info->dz = 0;
|
||||
info->dyaw = 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -11,6 +11,7 @@
|
|||
#include "d_event.h"
|
||||
#include "m_joy.h"
|
||||
#include "gamecvars.h"
|
||||
#include "packet.h"
|
||||
|
||||
|
||||
struct ControlInfo
|
||||
|
@ -98,3 +99,5 @@ enum GameFunction_t
|
|||
};
|
||||
|
||||
void SetupGameButtons();
|
||||
void ApplyGlobalInput(InputPacket& input, ControlInfo *info);
|
||||
|
||||
|
|
|
@ -4,14 +4,15 @@
|
|||
#include "fix16.h"
|
||||
#include "tflags.h"
|
||||
|
||||
|
||||
enum ESyncBits_ : uint32_t
|
||||
{
|
||||
SB_FIRST_WEAPON_BIT = 1 << 0,
|
||||
|
||||
SB_WEAPONMASK_BITS = (15u * SB_FIRST_WEAPON_BIT), // Weapons take up 4 bits
|
||||
|
||||
SB_INTERFACE_BITS = (SB_WEAPONMASK_BITS)
|
||||
SB_BUTTON_MASK = 0, // all input from buttons (i.e. active while held)
|
||||
SB_INTERFACE_MASK = 0, // all input from CCMDs
|
||||
SB_INTERFACE_BITS = (SB_WEAPONMASK_BITS | SB_INTERFACE_MASK)
|
||||
};
|
||||
|
||||
// enforce type safe operations on the input bits.
|
||||
|
@ -27,6 +28,20 @@ enum
|
|||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
// The maximum valid weapons for the respective games.
|
||||
WeaponSel_Max = 10,
|
||||
WeaponSel_MaxExhumed = 7,
|
||||
WeaponSel_MaxBlood = 12,
|
||||
|
||||
// Use named constants instead of magic values for these. The maximum of the supported games is 12 weapons for Blood so these 3 are free.
|
||||
// Should there ever be need for more weapons to select, the bit field needs to be expanded.
|
||||
WeaponSel_Next = 13,
|
||||
WeaponSel_Prev = 14,
|
||||
WeaponSel_Alt = 15
|
||||
};
|
||||
|
||||
enum EDukeSyncBits_ : uint32_t
|
||||
{
|
||||
SKB_JUMP = 1 << 0,
|
||||
|
@ -88,8 +103,6 @@ union SYNCFLAGS
|
|||
unsigned int prevItem : 1;
|
||||
unsigned int nextItem : 1;
|
||||
unsigned int useItem : 1;
|
||||
unsigned int prevWeapon : 1;
|
||||
unsigned int nextWeapon : 1;
|
||||
unsigned int holsterWeapon : 1;
|
||||
unsigned int lookCenter : 1;
|
||||
unsigned int lookLeft : 1;
|
||||
|
@ -193,8 +206,10 @@ struct InputPacket
|
|||
return (actions & SB_WEAPONMASK_BITS).GetValue();
|
||||
}
|
||||
|
||||
void SetNewWeapon(int weap)
|
||||
void setNewWeapon(int weap)
|
||||
{
|
||||
actions = (actions & ~SB_WEAPONMASK_BITS) | (ESyncBits::FromInt(weap) & SB_WEAPONMASK_BITS);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#include "screenjob.h"
|
||||
#include "c_console.h"
|
||||
#include "cheathandler.h"
|
||||
#include "inputstate.h"
|
||||
#include "core/menu/menu.h"
|
||||
|
||||
BEGIN_PS_NS
|
||||
|
@ -466,6 +467,23 @@ void GameMove(void)
|
|||
totalmoves++;
|
||||
}
|
||||
|
||||
static int SelectNextWeapon(int weap2)
|
||||
{
|
||||
// todo
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int SelectPrevWeapon(int weap2)
|
||||
{
|
||||
// todo
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int SelectAltWeapon(int weap2)
|
||||
{
|
||||
// todo
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GameTicker()
|
||||
{
|
||||
|
@ -496,6 +514,19 @@ void GameTicker()
|
|||
lPlayerXVel -= (lPlayerXVel >> 5) + (lPlayerXVel >> 6);
|
||||
lPlayerYVel -= (lPlayerYVel >> 5) + (lPlayerYVel >> 6);
|
||||
}
|
||||
int weap2 = localInput.getNewWeapon();
|
||||
if (weap2 == WeaponSel_Next)
|
||||
{
|
||||
weap2 = SelectNextWeapon(weap2);
|
||||
}
|
||||
else if (weap2 == WeaponSel_Prev)
|
||||
{
|
||||
weap2 = SelectPrevWeapon(weap2);
|
||||
}
|
||||
else if (weap2 == WeaponSel_Alt)
|
||||
{
|
||||
weap2 = SelectAltWeapon(weap2);
|
||||
}
|
||||
|
||||
sPlayerInput[nLocalPlayer].xVel = lPlayerXVel;
|
||||
sPlayerInput[nLocalPlayer].yVel = lPlayerYVel;
|
||||
|
@ -503,7 +534,6 @@ void GameTicker()
|
|||
sPlayerInput[nLocalPlayer].buttons = lLocalButtons | lLocalCodes;
|
||||
int weap = sPlayerInput[nLocalPlayer].getNewWeapon();
|
||||
sPlayerInput[nLocalPlayer].actions = localInput.actions;
|
||||
int weap2 = localInput.getNewWeapon();
|
||||
if (weap2 <= 0 || weap2 > 7) sPlayerInput[nLocalPlayer].SetNewWeapon(weap);
|
||||
sPlayerInput[nLocalPlayer].nTarget = besttarget;
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ BEGIN_PS_NS
|
|||
extern short bPlayerPan;
|
||||
extern short bLockPan;
|
||||
|
||||
int WeaponToSend, BitsToSend;
|
||||
int BitsToSend;
|
||||
bool g_MyAimMode;
|
||||
|
||||
short nInputStack = 0;
|
||||
|
@ -187,6 +187,12 @@ void PlayerInterruptKeys(bool after)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!after)
|
||||
{
|
||||
ApplyGlobalInput(localInput, &info);
|
||||
}
|
||||
|
||||
|
||||
// JBF: Run key behaviour is selectable
|
||||
int const playerRunning = G_CheckAutorun(buttonMap.ButtonDown(gamefunc_Run));
|
||||
int const turnAmount = playerRunning ? 12 : 8;
|
||||
|
@ -280,13 +286,6 @@ void PlayerInterruptKeys(bool after)
|
|||
|
||||
localInput.q16avel = fix16_sadd(localInput.q16avel, input_angle);
|
||||
|
||||
if (!after)
|
||||
{
|
||||
if (WeaponToSend > 0)
|
||||
localInput.SetNewWeapon(WeaponToSend);
|
||||
WeaponToSend = 0;
|
||||
}
|
||||
|
||||
if (!nFreeze)
|
||||
{
|
||||
PlayerList[nLocalPlayer].q16angle = fix16_sadd(PlayerList[nLocalPlayer].q16angle, input_angle) & 0x7FFFFFF;
|
||||
|
@ -380,33 +379,16 @@ void PlayerInterruptKeys(bool after)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int ccmd_slot(CCmdFuncPtr parm)
|
||||
{
|
||||
if (parm->numparms != 1) return CCMD_SHOWHELP;
|
||||
|
||||
auto slot = atoi(parm->parms[0]);
|
||||
if (slot >= 1 && slot <= 7)
|
||||
{
|
||||
WeaponToSend = slot;
|
||||
return CCMD_OK;
|
||||
}
|
||||
return CCMD_SHOWHELP;
|
||||
}
|
||||
|
||||
int ccmd_centerview(CCmdFuncPtr parm);
|
||||
|
||||
|
||||
void registerinputcommands()
|
||||
{
|
||||
C_RegisterFunction("slot", "slot <weaponslot>: select a weapon from the given slot (1-10)", ccmd_slot);
|
||||
C_RegisterFunction("pause", nullptr, [](CCmdFuncPtr)->int { /*BitsToSend |= SKB_PAUSE;*/ sendPause = true; return CCMD_OK; });
|
||||
C_RegisterFunction("centerview", nullptr, ccmd_centerview);
|
||||
C_RegisterFunction("invprev", nullptr, [](CCmdFuncPtr)->int { if (PlayerList[nLocalPlayer].nHealth > 0) SetPrevItem(nLocalPlayer); return CCMD_OK; });
|
||||
C_RegisterFunction("invnext", nullptr, [](CCmdFuncPtr)->int { if (PlayerList[nLocalPlayer].nHealth > 0) SetNextItem(nLocalPlayer); return CCMD_OK; });
|
||||
C_RegisterFunction("invuse", nullptr, [](CCmdFuncPtr)->int { if (PlayerList[nLocalPlayer].nHealth > 0) UseCurItem(nLocalPlayer); return CCMD_OK; });
|
||||
// todo: These still need to be implemented.
|
||||
C_RegisterFunction("weapprev", nullptr, [](CCmdFuncPtr)->int { /*WeaponToSend = 11;*/ return CCMD_OK; });
|
||||
C_RegisterFunction("weapnext", nullptr, [](CCmdFuncPtr)->int { /*WeaponToSend = 12;*/ return CCMD_OK; });
|
||||
|
||||
// These are only here to silence the engine when the keys bound to them are pressed. The functions do not exist.
|
||||
C_RegisterFunction("turnaround", nullptr, [](CCmdFuncPtr)->int { return CCMD_OK; });
|
||||
|
@ -417,7 +399,6 @@ void registerinputcommands()
|
|||
// This is called from ImputState::ClearAllInput and resets all static state being used here.
|
||||
void GameInterface::clearlocalinputstate()
|
||||
{
|
||||
WeaponToSend = 0;
|
||||
BitsToSend = 0;
|
||||
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@ source as it is released.
|
|||
|
||||
BEGIN_DUKE_NS
|
||||
|
||||
static int WeaponToSend;
|
||||
static EDukeSyncBits BitsToSend;
|
||||
|
||||
// State timer counters.
|
||||
|
@ -146,7 +145,6 @@ void hud_input(int snum)
|
|||
{
|
||||
int i, k;
|
||||
uint8_t dainv;
|
||||
unsigned int j;
|
||||
struct player_struct* p;
|
||||
short unk;
|
||||
|
||||
|
@ -339,16 +337,12 @@ void hud_input(int snum)
|
|||
if (dainv >= 1 && dainv < 8) FTA(invquotes[dainv - 1], p);
|
||||
}
|
||||
|
||||
j = PlayerNewWeapon(snum) - 1;
|
||||
if (j >= 0)
|
||||
{
|
||||
int a = 0;
|
||||
}
|
||||
if (j > 0 && p->kickback_pic > 0)
|
||||
p->wantweaponfire = j;
|
||||
int weap = PlayerNewWeapon(snum);
|
||||
if (weap > 1 && p->kickback_pic > 0)
|
||||
p->wantweaponfire = weap - 1;
|
||||
|
||||
// Here we have to be extra careful that the weapons do not get mixed up, so let's keep the code for Duke and RR completely separate.
|
||||
fi.selectweapon(snum, j);
|
||||
fi.selectweapon(snum, weap);
|
||||
|
||||
if (PlayerInput(snum, SKB_HOLSTER))
|
||||
{
|
||||
|
@ -467,7 +461,7 @@ void hud_input(int snum)
|
|||
{
|
||||
if (!isRR())
|
||||
{
|
||||
j = max_player_health - sprite[p->i].extra;
|
||||
int j = max_player_health - sprite[p->i].extra;
|
||||
|
||||
if ((unsigned int)p->firstaid_amount > j)
|
||||
{
|
||||
|
@ -485,7 +479,7 @@ void hud_input(int snum)
|
|||
}
|
||||
else
|
||||
{
|
||||
j = 10;
|
||||
int j = 10;
|
||||
if (p->firstaid_amount > j)
|
||||
{
|
||||
p->firstaid_amount -= j;
|
||||
|
@ -631,7 +625,7 @@ static void processInputBits(player_struct *p, ControlInfo &info)
|
|||
loc.sbits |= BitsToSend;
|
||||
BitsToSend = 0;
|
||||
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select))
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select)) // todo: This must go to global code.
|
||||
{
|
||||
if (info.dx < 0 || info.dyaw < 0) loc.sbits |= SKB_INV_LEFT;
|
||||
if (info.dx > 0 || info.dyaw < 0) loc.sbits |= SKB_INV_RIGHT;
|
||||
|
@ -657,23 +651,7 @@ static void processInputBits(player_struct *p, ControlInfo &info)
|
|||
if (buttonMap.ButtonDown(gamefunc_Quick_Kick)) loc.sbits |= SKB_QUICK_KICK;
|
||||
if (in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming)) loc.sbits |= SKB_AIMMODE;
|
||||
|
||||
int j = WeaponToSend;
|
||||
WeaponToSend = 0;
|
||||
if (VOLUMEONE && (j >= 7 && j <= 10)) j = 0;
|
||||
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && info.dz > 0) j = 11;
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select) && info.dz < 0) j = 12;
|
||||
|
||||
if (j) loc.SetNewWeapon(j);
|
||||
|
||||
}
|
||||
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Select))
|
||||
{
|
||||
// This eats the controller input for regular use
|
||||
info.dx = 0;
|
||||
info.dz = 0;
|
||||
info.dyaw = 0;
|
||||
ApplyGlobalInput(loc, &info);
|
||||
}
|
||||
|
||||
if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming))
|
||||
|
@ -1188,24 +1166,8 @@ void GetInput()
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int ccmd_slot(CCmdFuncPtr parm)
|
||||
{
|
||||
if (parm->numparms != 1) return CCMD_SHOWHELP;
|
||||
|
||||
auto slot = atoi(parm->parms[0]);
|
||||
if (slot >= 1 && slot <= 10)
|
||||
{
|
||||
WeaponToSend = slot;
|
||||
return CCMD_OK;
|
||||
}
|
||||
return CCMD_SHOWHELP;
|
||||
}
|
||||
|
||||
void registerinputcommands()
|
||||
{
|
||||
C_RegisterFunction("slot", "slot <weaponslot>: select a weapon from the given slot (1-10)", ccmd_slot);
|
||||
C_RegisterFunction("weapprev", nullptr, [](CCmdFuncPtr)->int { WeaponToSend = 11; return CCMD_OK; });
|
||||
C_RegisterFunction("weapnext", nullptr, [](CCmdFuncPtr)->int { WeaponToSend = 12; return CCMD_OK; });
|
||||
C_RegisterFunction("pause", nullptr, [](CCmdFuncPtr)->int { BitsToSend |= SKB_PAUSE; sendPause = true; return CCMD_OK; });
|
||||
C_RegisterFunction("steroids", nullptr, [](CCmdFuncPtr)->int { BitsToSend |= SKB_STEROIDS; return CCMD_OK; });
|
||||
C_RegisterFunction("nightvision", nullptr, [](CCmdFuncPtr)->int { BitsToSend |= SKB_NIGHTVISION; return CCMD_OK; });
|
||||
|
@ -1224,7 +1186,6 @@ void registerinputcommands()
|
|||
// This is called from ImputState::ClearAllInput and resets all static state being used here.
|
||||
void GameInterface::clearlocalinputstate()
|
||||
{
|
||||
WeaponToSend = 0;
|
||||
BitsToSend = 0;
|
||||
nonsharedtimer = 0;
|
||||
turnheldtime = 0;
|
||||
|
|
|
@ -1099,18 +1099,22 @@ void shoot_d(int i, int atwith)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void selectweapon_d(int snum, int j) // playernum, weaponnum
|
||||
void selectweapon_d(int snum, int weap) // playernum, weaponnum
|
||||
{
|
||||
int i, k;
|
||||
int i, j, k;
|
||||
auto p = &ps[snum];
|
||||
if (p->last_pissed_time <= (26 * 218) && p->show_empty_weapon == 0 && p->kickback_pic == 0 && p->quick_kick == 0 && sprite[p->i].xrepeat > 32 && p->access_incs == 0 && p->knee_incs == 0)
|
||||
{
|
||||
if ((p->weapon_pos == 0 || (p->holster_weapon && p->weapon_pos == -9)))
|
||||
{
|
||||
if (j == 10 || j == 11)
|
||||
if (weap == WeaponSel_Alt)
|
||||
{
|
||||
// todo
|
||||
}
|
||||
else if (weap == WeaponSel_Next || weap == WeaponSel_Prev)
|
||||
{
|
||||
k = p->curr_weapon;
|
||||
j = (j == 10 ? -1 : 1); // JBF: prev (-1) or next (1) weapon choice
|
||||
j = (weap == WeaponSel_Prev ? -1 : 1); // JBF: prev (-1) or next (1) weapon choice
|
||||
i = 0;
|
||||
|
||||
while ((k >= 0 && k < 10) || (PLUTOPAK && k == GROW_WEAPON && (p->subweapon & (1 << GROW_WEAPON)) != 0)
|
||||
|
@ -1146,8 +1150,8 @@ void selectweapon_d(int snum, int j) // playernum, weaponnum
|
|||
if (PLUTOPAK) // JBF 20040116: so we don't select grower with v1.3d
|
||||
if (k == SHRINKER_WEAPON && (p->subweapon & (1 << GROW_WEAPON)))
|
||||
k = GROW_WEAPON;
|
||||
if (isWorldTour() && k == FREEZE_WEAPON && (p->subweapon & (1 << FLAMETHROWER_WEAPON)) != 0)
|
||||
k = FLAMETHROWER_WEAPON;
|
||||
if (isWorldTour() && k == FREEZE_WEAPON && (p->subweapon & (1 << FLAMETHROWER_WEAPON)) != 0)
|
||||
k = FLAMETHROWER_WEAPON;
|
||||
|
||||
j = k;
|
||||
break;
|
||||
|
@ -1186,10 +1190,10 @@ void selectweapon_d(int snum, int j) // playernum, weaponnum
|
|||
}
|
||||
}
|
||||
}
|
||||
else j = weap - 1;
|
||||
|
||||
k = -1;
|
||||
|
||||
|
||||
if (j == HANDBOMB_WEAPON && p->ammo_amount[HANDBOMB_WEAPON] == 0)
|
||||
{
|
||||
k = headspritestat[1];
|
||||
|
|
|
@ -947,15 +947,19 @@ void shoot_r(int i, int atwith)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void selectweapon_r(int snum, int j)
|
||||
void selectweapon_r(int snum, int weap)
|
||||
{
|
||||
int i, k;
|
||||
int i, j, k;
|
||||
auto p = &ps[snum];
|
||||
if (p->last_pissed_time <= (26 * 218) && p->show_empty_weapon == 0 && p->kickback_pic == 0 && p->quick_kick == 0 && sprite[p->i].xrepeat > 8 && p->access_incs == 0 && p->knee_incs == 0)
|
||||
{
|
||||
if ((p->weapon_pos == 0 || (p->holster_weapon && p->weapon_pos == -9)))
|
||||
{
|
||||
if (j == 10 || j == 11)
|
||||
if (weap == WeaponSel_Alt)
|
||||
{
|
||||
// todo
|
||||
}
|
||||
else if (weap == WeaponSel_Next || weap == WeaponSel_Prev)
|
||||
{
|
||||
k = p->curr_weapon;
|
||||
if (isRRRA())
|
||||
|
@ -964,7 +968,7 @@ void selectweapon_r(int snum, int j)
|
|||
else if (k == BUZZSAW_WEAPON) k = THROWSAW_WEAPON;
|
||||
else if (k == SLINGBLADE_WEAPON) k = KNEE_WEAPON;
|
||||
}
|
||||
j = (j == 10 ? -1 : 1);
|
||||
j = (weap == WeaponSel_Prev ? -1 : 1); // JBF: prev (-1) or next (1) weapon choice
|
||||
i = 0;
|
||||
|
||||
while (k >= 0 && k < 10)
|
||||
|
@ -987,10 +991,10 @@ void selectweapon_r(int snum, int j)
|
|||
}
|
||||
}
|
||||
}
|
||||
else j = weap - 1;
|
||||
|
||||
k = -1;
|
||||
|
||||
|
||||
if (j == DYNAMITE_WEAPON && p->ammo_amount[DYNAMITE_WEAPON] == 0)
|
||||
{
|
||||
k = headspritestat[1];
|
||||
|
|
|
@ -36,7 +36,6 @@ BEGIN_SW_NS
|
|||
|
||||
SWBOOL MultiPlayQuitFlag = FALSE;
|
||||
|
||||
int WeaponToSend = 0;
|
||||
int BitsToSend = 0;
|
||||
int inv_hotkey = 0;
|
||||
|
||||
|
@ -172,6 +171,9 @@ getinput(InputPacket *loc, SWBOOL tied)
|
|||
// for dividing controller input to match speed input speed of other games.
|
||||
float const ticrateScale = 0.75f;
|
||||
|
||||
ApplyGlobalInput(*loc, &info);
|
||||
|
||||
|
||||
if (running)
|
||||
{
|
||||
if (pp->sop_control)
|
||||
|
@ -341,18 +343,12 @@ getinput(InputPacket *loc, SWBOOL tied)
|
|||
SET_LOC_KEY(loc->bits, SK_LOOK_UP, buttonMap.ButtonDown(gamefunc_Look_Up));
|
||||
SET_LOC_KEY(loc->bits, SK_LOOK_DOWN, buttonMap.ButtonDown(gamefunc_Look_Down));
|
||||
|
||||
if (WeaponToSend > 0)
|
||||
{
|
||||
loc->SetNewWeapon(WeaponToSend);
|
||||
WeaponToSend = 0;
|
||||
}
|
||||
else if (WeaponToSend == -1)
|
||||
if (loc->getNewWeapon() == WeaponSel_Next)
|
||||
{
|
||||
USERp u = User[pp->PlayerSprite];
|
||||
short next_weapon = u->WeaponNum + 1;
|
||||
short start_weapon;
|
||||
|
||||
WeaponToSend = 0;
|
||||
start_weapon = u->WeaponNum + 1;
|
||||
|
||||
if (u->WeaponNum == WPN_SWORD)
|
||||
|
@ -381,16 +377,14 @@ getinput(InputPacket *loc, SWBOOL tied)
|
|||
}
|
||||
}
|
||||
|
||||
SET(loc->bits, next_weapon + 1);
|
||||
loc->setNewWeapon(next_weapon + 1);
|
||||
}
|
||||
else if (WeaponToSend == -2)
|
||||
else if (loc->getNewWeapon() == WeaponSel_Prev)
|
||||
{
|
||||
USERp u = User[pp->PlayerSprite];
|
||||
short prev_weapon = u->WeaponNum - 1;
|
||||
short start_weapon;
|
||||
|
||||
WeaponToSend = 0;
|
||||
|
||||
start_weapon = u->WeaponNum - 1;
|
||||
|
||||
if (u->WeaponNum == WPN_SWORD)
|
||||
|
@ -416,16 +410,13 @@ getinput(InputPacket *loc, SWBOOL tied)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
SET(loc->bits, prev_weapon + 1);
|
||||
loc->setNewWeapon(prev_weapon + 1);
|
||||
}
|
||||
|
||||
if (false)//buttonMap.ButtonDown(gamefunc_Alt_Weapon)) will be renabled in an upcoming commit.
|
||||
else if (loc->getNewWeapon() == WeaponSel_Alt)
|
||||
{
|
||||
//buttonMap.ClearButton(gamefunc_Alt_Weapon);
|
||||
USERp u = User[pp->PlayerSprite];
|
||||
short const which_weapon = u->WeaponNum + 1;
|
||||
SET(loc->bits, which_weapon);
|
||||
loc->setNewWeapon(which_weapon);
|
||||
}
|
||||
|
||||
|
||||
|
@ -480,25 +471,8 @@ getinput(InputPacket *loc, SWBOOL tied)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int ccmd_slot(CCmdFuncPtr parm)
|
||||
{
|
||||
if (parm->numparms != 1) return CCMD_SHOWHELP;
|
||||
|
||||
auto slot = atoi(parm->parms[0]);
|
||||
if (slot >= 1 && slot <= 10)
|
||||
{
|
||||
WeaponToSend = slot;
|
||||
return CCMD_OK;
|
||||
}
|
||||
return CCMD_SHOWHELP;
|
||||
}
|
||||
|
||||
|
||||
void registerinputcommands()
|
||||
{
|
||||
C_RegisterFunction("slot", "slot <weaponslot>: select a weapon from the given slot (1-10)", ccmd_slot);
|
||||
C_RegisterFunction("weapprev", nullptr, [](CCmdFuncPtr)->int { WeaponToSend = -2; return CCMD_OK; });
|
||||
C_RegisterFunction("weapnext", nullptr, [](CCmdFuncPtr)->int { WeaponToSend = -1; return CCMD_OK; });
|
||||
C_RegisterFunction("pause", nullptr, [](CCmdFuncPtr)->int { BitsToSend |= BIT(SK_PAUSE); sendPause = true; return CCMD_OK; });
|
||||
C_RegisterFunction("smoke_bomb", nullptr, [](CCmdFuncPtr)->int { inv_hotkey = INVENTORY_CLOAK + 1; return CCMD_OK; });
|
||||
C_RegisterFunction("nightvision", nullptr, [](CCmdFuncPtr)->int { inv_hotkey = INVENTORY_NIGHT_VISION + 1; return CCMD_OK; });
|
||||
|
@ -517,7 +491,6 @@ void registerinputcommands()
|
|||
// This is called from ImputState::ClearAllInput and resets all static state being used here.
|
||||
void GameInterface::clearlocalinputstate()
|
||||
{
|
||||
WeaponToSend = 0;
|
||||
BitsToSend = 0;
|
||||
inv_hotkey = 0;
|
||||
|
||||
|
|
Loading…
Reference in a new issue