Files
Jedi-Academy/code/client/cl_input_hotswap.cpp
2013-04-04 14:32:05 -07:00

243 lines
4.5 KiB
C++

/*
TODO: finalize item support
1) Make ItemSelectUp() work.
2) Change cg.itemSelect to whatever var is used to store selected item.
3) Make sure commands in itemCommands work in both multi & single player.
*/
#include "client.h"
#include "../cgame/cg_local.h"
#include "cl_input_hotswap.h"
#include "../qcommon/xb_settings.h"
#define FORCESELECTTIME forcepowerSelectTime
#define FORCESELECT forcepowerSelect
#define INVSELECTTIME inventorySelectTime
#define INVSELECT inventorySelect
#define REGISTERSOUND cgi_S_RegisterSound
#define STARTSOUND cgi_S_StartLocalSound
#define WEAPONBINDSTR "weapon"
#define BIND_TIME 2000 //number of milliseconds button is held before binding
const char *itemCommands[INV_MAX] = {
"use_electrobinoculars\n",
"use_bacta\n",
"use_seeker\n",
"use_goggles\n",
"use_sentry\n",
NULL, //goodie key
NULL, //security key
};
// Commands to issue when user presses a force-bound button
const char *forceDownCommands[MAX_SHOWPOWERS] = {
"force_absorb\n",
"force_heal\n",
"force_protect\n",
"force_distract\n",
"force_speed\n",
"force_throw\n",
"force_pull\n",
"force_sight\n",
"+force_drain\n",
"+force_lightning\n",
"force_rage\n",
"+force_grip\n",
};
// Commands to issue when user releases a force-bound button
const char *forceUpCommands[MAX_SHOWPOWERS] = {
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
"-force_drain\n",
"-force_lightning\n",
NULL,
"-force_grip\n",
};
HotSwapManager::HotSwapManager(int uniqueID) :
uniqueID(uniqueID)
{
Reset();
}
const char *HotSwapManager::GetBinding(void)
{
char buf[64];
sprintf(buf, "hotswap%d", uniqueID);
cvar_t *cvar = Cvar_Get(buf, "", CVAR_ARCHIVE);
if(!cvar || !cvar->string[0])
return NULL;
if (cvar->integer < HOTSWAP_CAT_ITEM) { // Weapon
return va("weapon %d", cvar->integer);
} else if (cvar->integer < HOTSWAP_CAT_FORCE) { // Item
return itemCommands[cvar->integer - HOTSWAP_CAT_ITEM];
} else { // Force power
return forceDownCommands[cvar->integer - HOTSWAP_CAT_FORCE];
}
}
const char *HotSwapManager::GetBindingUp(void)
{
char buf[64];
sprintf(buf, "hotswap%d", uniqueID);
cvar_t *cvar = Cvar_Get(buf, "", CVAR_ARCHIVE);
if(!cvar || !cvar->string[0])
return NULL;
// Only force powers have release-commands
if (cvar->integer < HOTSWAP_CAT_FORCE) {
return NULL;
} else {
return forceUpCommands[cvar->integer - HOTSWAP_CAT_FORCE];
}
}
void HotSwapManager::Bind(void)
{
if(WeaponSelectUp()) {
HotSwapBind(uniqueID, HOTSWAP_CAT_WEAPON, cg.weaponSelect);
} else if(ForceSelectUp()) {
HotSwapBind(uniqueID, HOTSWAP_CAT_FORCE, cg.FORCESELECT);
} else if(ItemSelectUp()) {
HotSwapBind(uniqueID, HOTSWAP_CAT_ITEM, cg.INVSELECT);
} else{
assert(0);
}
noBind = true;
STARTSOUND(REGISTERSOUND("sound/interface/update"), 0);
}
bool HotSwapManager::ForceSelectUp(void)
{
return cg.FORCESELECTTIME != 0 &&
(cg.FORCESELECTTIME + WEAPON_SELECT_TIME >= cg.time);
}
bool HotSwapManager::WeaponSelectUp(void)
{
return cg.weaponSelectTime != 0 &&
(cg.weaponSelectTime + WEAPON_SELECT_TIME >= cg.time);
}
bool HotSwapManager::ItemSelectUp(void)
{
return cg.INVSELECTTIME != 0 &&
(cg.INVSELECTTIME + WEAPON_SELECT_TIME >= cg.time);
}
bool HotSwapManager::HUDInBindState(void)
{
return ForceSelectUp() || WeaponSelectUp() || ItemSelectUp();
}
void HotSwapManager::Update(void)
{
if(down) {
//Increment bindTime only if HUD is in select mode.
if(HUDInBindState()) {
bindTime += cls.frametime;
} else {
//Clear bind time.
bindTime = 0;
}
}
//Down long enough, bind button.
if(!noBind && bindTime >= BIND_TIME) {
Bind();
}
}
void HotSwapManager::Execute(void)
{
const char *binding = GetBinding();
if(binding) {
Cbuf_ExecuteText(EXEC_NOW, binding);
}
}
void HotSwapManager::ExecuteUp(void)
{
const char *binding = GetBindingUp();
if(binding) {
Cbuf_ExecuteText(EXEC_NOW, binding);
}
}
void HotSwapManager::SetDown(void)
{
//Set the down flag.
down = true;
//Execute the bind if the HUD isn't up. Also, prevent re-binding!
if(!HUDInBindState()) {
Execute();
noBind = true;
}
}
void HotSwapManager::SetUp(void)
{
// Execute the tail of the command if the HUD isn't up.
if(!HUDInBindState()) {
ExecuteUp();
}
Reset();
}
void HotSwapManager::Reset(void)
{
down = false;
bindTime = 0;
noBind = false;
}
void HotSwapBind(int buttonID, int category, int value)
{
char uniqueID[64];
sprintf(uniqueID, "hotswap%d", buttonID);
// Add category as an offset for when we retrieve it
Cvar_SetValue( uniqueID, value+category );
Settings.hotswapSP[buttonID] = value+category;
Settings.Save();
}