- route 'give' through the network for all games.

This commit is contained in:
Christoph Oelckers 2020-09-03 17:39:41 +02:00
parent fb334e7f1a
commit 8f0a885f63
7 changed files with 313 additions and 457 deletions

View file

@ -38,6 +38,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "inputstate.h" #include "inputstate.h"
#include "d_protocol.h" #include "d_protocol.h"
#include "gstrings.h" #include "gstrings.h"
#include "aistuff.h"
#include "mmulti.h"
BEGIN_PS_NS BEGIN_PS_NS
@ -154,9 +156,74 @@ static cheatseq_t excheats[] = {
}; };
static void cmd_Give(int player, uint8_t** stream, bool skip)
{
int type = ReadByte(stream);
if (skip) return;
if (PlayerList[player].nHealth <= 0 || nNetPlayerCount || gamestate != GS_LEVEL)
{
Printf("give: Cannot give while dead or not in a single-player game.\n");
return;
}
int buttons = 0;
switch (type)
{
case GIVE_ALL:
buttons |= kButtonCheatGuns | kButtonCheatItems | kButtonCheatKeys;
break;
case GIVE_HEALTH:
PlayerList[player].nHealth = 800;
return;
case GIVE_WEAPONS:
case GIVE_AMMO:
buttons |= kButtonCheatGuns;
break;
case GIVE_ARMOR:
// not implemented
break;
case GIVE_KEYS:
buttons |= kButtonCheatKeys;
break;
case GIVE_INVENTORY:
buttons |= kButtonCheatItems;
break;
case GIVE_ITEMS:
buttons |= kButtonCheatItems | kButtonCheatKeys;
break;
}
if (buttons & kButtonCheatGuns) // LOBOCOP cheat
{
FillWeapons(player);
if (player == myconnectindex) StatusMessage(150, GStrings("TXT_EX_WEAPONS"));
}
if (buttons & kButtonCheatKeys) // LOBOPICK cheat
{
PlayerList[player].keys = 0xFFFF;
if (player == myconnectindex) StatusMessage(150, GStrings("TXT_EX_KEYS"));
RefreshStatus();
}
if (buttons & kButtonCheatItems) // LOBOSWAG cheat
{
FillItems(player);
if (player == myconnectindex) StatusMessage(150, GStrings("TXT_EX_ITEMS"));
}
}
void InitCheats() void InitCheats()
{ {
SetCheats(excheats, countof(excheats)); SetCheats(excheats, countof(excheats));
Net_SetCommandHandler(DEM_GIVE, cmd_Give);
} }
END_PS_NS END_PS_NS

View file

@ -185,45 +185,6 @@ static int osdcmd_third_person_view(CCmdFuncPtr parm)
return CCMD_OK; return CCMD_OK;
} }
static int ccmd_give(CCmdFuncPtr parm)
{
if (PlayerList[myconnectindex].nHealth <= 0 || nNetPlayerCount)
{
Printf("give: Cannot give while dead or not in a single-player game.\n");
return CCMD_OK;
}
if (parm->numparms != 1) return CCMD_SHOWHELP;
cheatseq_t* cs = (cheatseq_t*)(intptr_t)1;
if (!stricmp(parm->parms[0], "all"))
{
lLocalCodes |= kButtonCheatGuns | kButtonCheatItems | kButtonCheatKeys;
}
else if (!stricmp(parm->parms[0], "health"))
{
PlayerList[myconnectindex].nHealth = 800;
}
else if (!stricmp(parm->parms[0], "weapons"))
{
lLocalCodes |= kButtonCheatGuns;
}
else if (!stricmp(parm->parms[0], "keys"))
{
lLocalCodes |= kButtonCheatKeys;
}
else if (!stricmp(parm->parms[0], "inventory"))
{
lLocalCodes |= kButtonCheatItems;
}
else if (!stricmp(parm->parms[0], "items"))
{
lLocalCodes |= kButtonCheatItems | kButtonCheatKeys;
}
else return CCMD_SHOWHELP;
return CCMD_OK;
}
static int osdcmd_noop(CCmdFuncPtr parm) static int osdcmd_noop(CCmdFuncPtr parm)
{ {
@ -243,7 +204,6 @@ int32_t registerosdcommands(void)
C_RegisterFunction("third_person_view", "Switch to third person view", osdcmd_third_person_view); C_RegisterFunction("third_person_view", "Switch to third person view", osdcmd_third_person_view);
C_RegisterFunction("coop_view", "Switch player to view from in coop", osdcmd_noop); C_RegisterFunction("coop_view", "Switch player to view from in coop", osdcmd_noop);
C_RegisterFunction("show_weapon", "Show opponents' weapons", osdcmd_noop); C_RegisterFunction("show_weapon", "Show opponents' weapons", osdcmd_noop);
//C_RegisterFunction("give", "give <all|health|weapons|keys|inventory>: gives requested item", ccmd_give);
return 0; return 0;
} }

View file

@ -1281,23 +1281,6 @@ loc_1AB8E:
uint16_t buttons = sPlayerInput[nPlayer].buttons; uint16_t buttons = sPlayerInput[nPlayer].buttons;
auto actions = sPlayerInput[nPlayer].actions; auto actions = sPlayerInput[nPlayer].actions;
if (buttons & kButtonCheatGuns) // LOBOCOP cheat
{
FillWeapons(nPlayer);
StatusMessage(150, "All weapons loaded for player");
}
if (buttons & kButtonCheatKeys) // LOBOPICK cheat
{
PlayerList[nPlayer].keys = 0xFFFF;
StatusMessage(150, "All keys loaded for player");
RefreshStatus();
}
if (buttons & kButtonCheatItems) // LOBOSWAG cheat
{
FillItems(nPlayer);
StatusMessage(150, "All items loaded for player");
}
// loc_1AEF5: // loc_1AEF5:
if (PlayerList[nPlayer].nHealth > 0) if (PlayerList[nPlayer].nHealth > 0)
{ {

View file

@ -37,13 +37,6 @@ Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au)
BEGIN_DUKE_NS BEGIN_DUKE_NS
bool cheatGod(cheatseq_t*);
bool cheatWeapons(cheatseq_t* s);
bool cheatStuff(cheatseq_t* s);
bool cheatKeys(cheatseq_t* s);
bool cheatInventory(cheatseq_t* s);
bool cheatItems(cheatseq_t* s);
static void dowarp(MapRecord *map) static void dowarp(MapRecord *map)
{ {
ud.m_monsters_off = ud.monsters_off = 0; ud.m_monsters_off = ud.monsters_off = 0;
@ -190,57 +183,6 @@ static int ccmd_spawn(CCmdFuncPtr parm)
return CCMD_OK; return CCMD_OK;
} }
// Strangely enough JFDuke does not have a 'give' CCMD, so this is based on the version in EDuke32.
static int ccmd_give(CCmdFuncPtr parm)
{
if (numplayers != 1 || (ps[myconnectindex].gm & MODE_GAME) == 0 ||
ps[myconnectindex].dead_flag != 0)
{
Printf("give: Cannot give while dead or not in a single-player game.\n");
return CCMD_OK;
}
if (parm->numparms != 1) return CCMD_SHOWHELP;
cheatseq_t* cs = (cheatseq_t*)(intptr_t)1;
if (!stricmp(parm->parms[0], "all"))
{
cheatStuff(cs);
}
else if (!stricmp(parm->parms[0], "health"))
{
sprite[ps[myconnectindex].i].extra = max_player_health<<1;
}
else if (!stricmp(parm->parms[0], "weapons"))
{
cheatWeapons(cs);
}
else if (!stricmp(parm->parms[0], "ammo"))
{
int maxw = VOLUMEONE ? SHRINKER_WEAPON : MAX_WEAPONS;
for (int i = maxw; i >= PISTOL_WEAPON; i--)
addammo(i, &ps[myconnectindex], max_ammo_amount[i]);
}
else if (!stricmp(parm->parms[0], "armor"))
{
ps[myconnectindex].shield_amount = 100;
}
else if (!stricmp(parm->parms[0], "keys"))
{
cheatKeys(cs);
}
else if (!stricmp(parm->parms[0], "inventory"))
{
cheatInventory(cs);
}
else if (!stricmp(parm->parms[0], "items"))
{
cheatItems(cs);
}
else return CCMD_SHOWHELP;
return CCMD_OK;
}
static int osdcmd_warptocoords(CCmdFuncPtr parm) static int osdcmd_warptocoords(CCmdFuncPtr parm)
{ {
if (parm->numparms < 3 || parm->numparms > 5) if (parm->numparms < 3 || parm->numparms > 5)
@ -312,7 +254,6 @@ int registerosdcommands(void)
{ {
C_RegisterFunction("map","map <mapname>: warp to the given map, identified by its name", ccmd_map); C_RegisterFunction("map","map <mapname>: warp to the given map, identified by its name", ccmd_map);
C_RegisterFunction("levelwarp","levelwarp <e> <m>: warp to episode 'e' and map 'm'", ccmd_levelwarp); C_RegisterFunction("levelwarp","levelwarp <e> <m>: warp to episode 'e' and map 'm'", ccmd_levelwarp);
//C_RegisterFunction("give","give <all|health|weapons|ammo|armor|keys|inventory>: gives requested item", ccmd_give);
C_RegisterFunction("restartmap", "restartmap: restarts the current map", ccmd_restartmap); C_RegisterFunction("restartmap", "restartmap: restarts the current map", ccmd_restartmap);
C_RegisterFunction("spawn","spawn <picnum> [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties",ccmd_spawn); C_RegisterFunction("spawn","spawn <picnum> [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties",ccmd_spawn);
C_RegisterFunction("warptocoords","warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates",osdcmd_warptocoords); C_RegisterFunction("warptocoords","warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates",osdcmd_warptocoords);

View file

@ -39,6 +39,7 @@ source as it is released.
#include "mapinfo.h" #include "mapinfo.h"
#include "cheathandler.h" #include "cheathandler.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "gamestate.h"
EXTERN_CVAR(Int, developer) EXTERN_CVAR(Int, developer)
EXTERN_CVAR(Bool, sv_cheats) EXTERN_CVAR(Bool, sv_cheats)
@ -217,81 +218,70 @@ const char* GameInterface::GenericCheat(int player, int cheat)
} }
} }
static bool cheatWeapons(int player)
bool cheatWeapons(cheatseq_t *s)
{ {
int weaponLimit = (VOLUMEONE) ? SHRINKER_WEAPON : MAX_WEAPONS; int weaponLimit = (VOLUMEONE) ? SHRINKER_WEAPON : MAX_WEAPONS;
for (int weapon = PISTOL_WEAPON; weapon < weaponLimit; weapon++ ) for (int weapon = PISTOL_WEAPON; weapon < weaponLimit; weapon++ )
{ {
addammo( weapon, &ps[myconnectindex], max_ammo_amount[weapon] ); addammo( weapon, &ps[player], max_ammo_amount[weapon] );
ps[myconnectindex].gotweapon.Set(weapon); ps[player].gotweapon.Set(weapon);
} }
if (isRRRA()) if (isRRRA())
ps[myconnectindex].ammo_amount[SLINGBLADE_WEAPON] = 1; ps[player].ammo_amount[SLINGBLADE_WEAPON] = 1;
if (s) FTA(119,&ps[myconnectindex]);
return true; return true;
} }
bool cheatInventory(cheatseq_t *s) static bool cheatInventory(int player)
{ {
auto invGet = [](int defvalue, int evtype, int16_t &dest) auto invGet = [=](int defvalue, int evtype, int16_t &dest)
{ {
SetGameVarID(g_iReturnVarID, defvalue, -1, myconnectindex); SetGameVarID(g_iReturnVarID, defvalue, -1, player);
OnEvent(evtype, -1, myconnectindex, -1); OnEvent(evtype, -1, player, -1);
if (GetGameVarID(g_iReturnVarID, -1, myconnectindex) >= 0) if (GetGameVarID(g_iReturnVarID, -1, player) >= 0)
{ {
dest = GetGameVarID(g_iReturnVarID, -1, myconnectindex); dest = GetGameVarID(g_iReturnVarID, -1, player);
} }
}; };
invGet(400, EVENT_CHEATGETSTEROIDS, ps[myconnectindex].steroids_amount); invGet(400, EVENT_CHEATGETSTEROIDS, ps[player].steroids_amount);
if (!isRR()) invGet(1200, EVENT_CHEATGETHEAT, ps[myconnectindex].heat_amount); if (!isRR()) invGet(1200, EVENT_CHEATGETHEAT, ps[player].heat_amount);
invGet(isRR() ? 2000 : 200, EVENT_CHEATGETBOOT, ps[myconnectindex].boot_amount); invGet(isRR() ? 2000 : 200, EVENT_CHEATGETBOOT, ps[player].boot_amount);
invGet(100, EVENT_CHEATGETSHIELD, ps[myconnectindex].shield_amount); invGet(100, EVENT_CHEATGETSHIELD, ps[player].shield_amount);
invGet(6400, EVENT_CHEATGETSCUBA, ps[myconnectindex].scuba_amount); invGet(6400, EVENT_CHEATGETSCUBA, ps[player].scuba_amount);
invGet(2400, EVENT_CHEATGETHOLODUKE, ps[myconnectindex].holoduke_amount); invGet(2400, EVENT_CHEATGETHOLODUKE, ps[player].holoduke_amount);
invGet(isRR() ? 600 : 1600, EVENT_CHEATGETJETPACK, ps[myconnectindex].jetpack_amount); invGet(isRR() ? 600 : 1600, EVENT_CHEATGETJETPACK, ps[player].jetpack_amount);
invGet(max_player_health, EVENT_CHEATGETFIRSTAID, ps[myconnectindex].firstaid_amount); invGet(max_player_health, EVENT_CHEATGETFIRSTAID, ps[player].firstaid_amount);
if (s) FTA(120,&ps[myconnectindex]);
return true; return true;
} }
bool cheatKeys(cheatseq_t *s) static bool cheatKeys(int player)
{ {
ps[myconnectindex].got_access = 7; ps[player].got_access = 7;
if (isRR()) for (int ikey = 0; ikey < 5; ikey++) if (isRR()) for (int ikey = 0; ikey < 5; ikey++)
ps[myconnectindex].keys[ikey] = 1; ps[player].keys[ikey] = 1;
if (s) FTA(121,&ps[myconnectindex]);
return true; return true;
} }
static bool cheatDebug(cheatseq_t *) static bool cheatStuff(int player)
{ {
// Let's do something useful with this. cheatWeapons(player);
if (developer == 0) developer = 3; cheatInventory(player);
else developer = 0; if (!isNamWW2GI()) cheatKeys(player);
return true; return true;
} }
static bool cheatAllen(cheatseq_t *) static bool cheatItems(int player)
{ {
FTA(79,&ps[myconnectindex]); cheatInventory(player);
if (!isNamWW2GI()) cheatKeys(player);
return true; return true;
} }
bool cheatStuff(cheatseq_t *)
{
cheatWeapons(nullptr);
cheatInventory(nullptr);
if (!isNamWW2GI()) cheatKeys(nullptr);
FTA(5,&ps[myconnectindex]);
return true;
}
static bool cheatLevel(cheatseq_t *s) static bool cheatLevel(cheatseq_t *s)
{ {
@ -313,15 +303,6 @@ static bool cheatLevel(cheatseq_t *s)
return true; return true;
} }
bool cheatItems(cheatseq_t *)
{
cheatInventory(nullptr);
if (!isNamWW2GI()) cheatKeys(nullptr);
FTA(5,&ps[myconnectindex]);
return true;
}
static bool cheatSkill(cheatseq_t *s) static bool cheatSkill(cheatseq_t *s)
{ {
lastlevel = 0; lastlevel = 0;
@ -334,6 +315,20 @@ static bool cheatSkill(cheatseq_t *s)
// The remaining cheats are client side only. // The remaining cheats are client side only.
static bool cheatDebug(cheatseq_t*)
{
// Let's do something useful with this.
if (developer == 0) developer = 3;
else developer = 0;
return true;
}
static bool cheatAllen(cheatseq_t*)
{
FTA(79, &ps[myconnectindex]);
return true;
}
static bool cheatBeta(cheatseq_t *) static bool cheatBeta(cheatseq_t *)
{ {
FTA(105,&ps[myconnectindex]); FTA(105,&ps[myconnectindex]);
@ -473,6 +468,64 @@ static cheatseq_t rrcheats[] = {
{ "rdvan", nullptr, SendGenericCheat, 0, CHT_VAN }, { "rdvan", nullptr, SendGenericCheat, 0, CHT_VAN },
}; };
static void cmd_Give(int player, uint8_t** stream, bool skip)
{
int type = ReadByte(stream);
if (skip) return;
if (numplayers != 1 || gamestate != GS_LEVEL || ps[player].dead_flag != 0)
{
Printf("give: Cannot give while dead or not in a single-player game.\n");
return;
}
switch (type)
{
case GIVE_ALL:
cheatStuff(player);
FTA(5, &ps[player]);
break;
case GIVE_HEALTH:
sprite[ps[player].i].extra = max_player_health << 1;
break;
case GIVE_WEAPONS:
cheatWeapons(player);
FTA(119, &ps[player]);
break;
case GIVE_AMMO:
{
int maxw = VOLUMEONE ? SHRINKER_WEAPON : MAX_WEAPONS;
for (int i = maxw; i >= PISTOL_WEAPON; i--)
addammo(i, &ps[player], max_ammo_amount[i]);
break;
}
case GIVE_ARMOR:
ps[player].shield_amount = 100;
break;
case GIVE_KEYS:
cheatKeys(player);
FTA(121, &ps[player]);
break;
case GIVE_INVENTORY:
cheatInventory(player);
FTA(120, &ps[player]);
break;
case GIVE_ITEMS:
cheatItems(player);
FTA(5, &ps[player]);
break;
}
}
void InitCheats() void InitCheats()
{ {
if (isRRRA()) SetCheats(rrcheats, countof(rrcheats)); if (isRRRA()) SetCheats(rrcheats, countof(rrcheats));
@ -480,6 +533,7 @@ void InitCheats()
else if (isWW2GI()) SetCheats(ww2cheats, countof(ww2cheats)); else if (isWW2GI()) SetCheats(ww2cheats, countof(ww2cheats));
else if (isNam()) SetCheats(namcheats, countof(namcheats)); else if (isNam()) SetCheats(namcheats, countof(namcheats));
else SetCheats(dukecheats, countof(dukecheats)); else SetCheats(dukecheats, countof(dukecheats));
Net_SetCommandHandler(DEM_GIVE, cmd_Give);
} }
END_DUKE_NS END_DUKE_NS

View file

@ -39,6 +39,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#include "cheathandler.h" #include "cheathandler.h"
#include "d_protocol.h" #include "d_protocol.h"
#include "cheats.h" #include "cheats.h"
#include "gamestate.h"
//#include "inv.h" //#include "inv.h"
BEGIN_SW_NS BEGIN_SW_NS
@ -141,71 +142,6 @@ bool MapCheat(cheatseq_t* c)
return true; return true;
} }
bool WeaponCheat(cheatseq_t* c)
{
if (!checkCheat(c)) return false;
PLAYERp p;
short pnum;
unsigned int i;
USERp u;
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
u = User[p->PlayerSprite];
if (!TEST(p->Flags, PF_TWO_UZI))
{
SET(p->Flags, PF_TWO_UZI);
SET(p->Flags, PF_PICKED_UP_AN_UZI);
}
// ALL WEAPONS
if (!SW_SHAREWARE)
p->WpnFlags = 0xFFFFFFFF;
else
p->WpnFlags = 0x0000207F; // Disallows high weapon cheat in shareware
for (i = 0; i < SIZ(p->WpnAmmo); i++)
{
p->WpnAmmo[i] = DamageData[i].max_ammo;
}
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
PlayerUpdateWeapon(p, u->WeaponNum);
}
return true;
}
bool AmmoCheat(cheatseq_t* c)
{
if (!checkCheat(c)) return false;
PLAYERp p;
short pnum;
unsigned int i;
USERp u;
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
u = User[p->PlayerSprite];
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
for (i = 0; i < SIZ(p->WpnAmmo); i++)
{
p->WpnAmmo[i] = DamageData[i].max_ammo;
}
PlayerUpdateWeapon(p, u->WeaponNum);
}
return true;
}
bool WarpCheat(cheatseq_t* c) bool WarpCheat(cheatseq_t* c)
{ {
@ -235,176 +171,6 @@ bool WarpCheat(cheatseq_t* c)
return true; return true;
} }
bool ItemCheat(cheatseq_t* c)
{
PLAYERp pp;
if (!(pp = checkCheat(c))) return false;
//
// Get all ITEMS
//
PLAYERp p;
short pnum;
short inv;
int i;
PutStringInfo(pp, "ITEMS");
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
memset(p->HasKey, TRUE, sizeof(p->HasKey));
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
p->Armor = 100;
for (inv = 0; inv < MAX_INVENTORY; inv++)
{
p->InventoryPercent[inv] = 100;
//p->InventoryAmount[inv] = 1;
p->InventoryAmount[inv] = InventoryData[inv].MaxInv;
//PlayerUpdateInventory(p, inv);
}
PlayerUpdateInventory(p, p->InventoryNum);
//p->InventoryNum = 0;
}
for (i=0; i<numsectors; i++)
{
if (SectUser[i] && SectUser[i]->stag == SECT_LOCK_DOOR)
SectUser[i]->number = 0; // unlock all doors of this type
}
WeaponCheat(c);
return true;
}
bool InventoryCheat(cheatseq_t* c)
{
PLAYERp pp;
if (!(pp = checkCheat(c))) return false;
//
// Get all ITEMS
//
PLAYERp p;
short pnum;
short inv;
int i;
PutStringInfo(pp, "INVENTORY");
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
p->Armor = 100;
for (inv = 0; inv < MAX_INVENTORY; inv++)
{
p->InventoryPercent[inv] = 100;
//p->InventoryAmount[inv] = 1;
p->InventoryAmount[inv] = InventoryData[inv].MaxInv;
//PlayerUpdateInventory(p, inv);
}
PlayerUpdateInventory(p, p->InventoryNum);
//p->InventoryNum = 0;
}
return true;
}
bool ArmorCheat(cheatseq_t* c)
{
PLAYERp pp;
if (!(pp = checkCheat(c))) return false;
short pnum;
const char *str = nullptr;
TRAVERSE_CONNECT(pnum)
{
if (User[Player[pnum].PlayerSprite]->Health < pp->MaxHealth)
str = "ARMOR";
Player[pnum].Armor = 100;
}
if (str) PutStringInfo(pp, GStrings(str));
return true;
}
bool HealCheat(cheatseq_t* c)
{
PLAYERp pp;
if (!(pp = checkCheat(c))) return false;
short pnum;
const char *str = nullptr;
TRAVERSE_CONNECT(pnum)
{
if (User[Player[pnum].PlayerSprite]->Health < pp->MaxHealth)
str = "TXTS_ADDEDHEALTH";
User[Player[pnum].PlayerSprite]->Health += 25;
}
if (str) PutStringInfo(pp, GStrings(str));
return true;
}
bool KeyCheat(cheatseq_t* c)
{
PLAYERp pp;
if (!(pp = checkCheat(c))) return false;
// Get KEYS
PLAYERp p;
short pnum;
const char *cp = (char*)c->Args;
const char *str = "TXTS_GIVEKEY";
int keynum = 0;
keynum = atol(cp);
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
if (keynum >= 1 && keynum <= 8)
{
if (p->HasKey[keynum-1] == FALSE)
{
p->HasKey[keynum-1] = TRUE; // cards: 0=red 1=blue 2=green 3=yellow | keys: 4=gold 5=silver 6=bronze 7=red
str = "TXTS_KEYGIVEN";
}
else
{
p->HasKey[keynum-1] = FALSE;
str = "TXTS_KEYREMOVED";
}
}
}
PutStringInfo(pp, GStrings(str));
return true;
}
bool KeysCheat(cheatseq_t* c)
{
PLAYERp pp;
if (!(pp = checkCheat(c))) return false;
// Get KEYS
PLAYERp p;
short pnum;
const char* str = "TXTS_GIVEKEY";
int keynum = 0;
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
memset(p->HasKey, TRUE, sizeof(p->HasKey));
}
PutStringInfo(pp, GStrings(str));
return true;
}
bool EveryCheatToggle(cheatseq_t* c) bool EveryCheatToggle(cheatseq_t* c)
{ {
EveryCheat ^= 1; EveryCheat ^= 1;
@ -420,7 +186,6 @@ static cheatseq_t swcheats[] = {
{"lwchan", "god" }, {"lwchan", "god" },
{"lwgimme", "give all" }, {"lwgimme", "give all" },
{"lwmedic", "give health" }, {"lwmedic", "give health" },
{"lwkey#", nullptr, KeyCheat, 0},
{"lwkeys", "give keys" }, {"lwkeys", "give keys" },
{"lwammo", "give ammo" }, {"lwammo", "give ammo" },
{"lwarmor", "give armor" }, {"lwarmor", "give armor" },
@ -435,10 +200,151 @@ static cheatseq_t swcheats[] = {
{"lwroom", nullptr, RoomCheat, true}, // Room above room debug {"lwroom", nullptr, RoomCheat, true}, // Room above room debug
}; };
static void WeaponCheat(int player)
{
auto p = &Player[player];
auto u = User[p->PlayerSprite];
if (!TEST(p->Flags, PF_TWO_UZI))
{
SET(p->Flags, PF_TWO_UZI);
SET(p->Flags, PF_PICKED_UP_AN_UZI);
}
// ALL WEAPONS
if (!SW_SHAREWARE) p->WpnFlags = 0xFFFFFFFF;
else p->WpnFlags = 0x0000207F; // Disallows high weapon cheat in shareware
for (int i = 0; i < SIZ(p->WpnAmmo); i++)
{
p->WpnAmmo[i] = DamageData[i].max_ammo;
}
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
PlayerUpdateWeapon(p, u->WeaponNum);
}
static void ItemCheat(int player)
{
auto p = &Player[player];
PutStringInfo(p, GStrings("GIVING EVERYTHING!"));
memset(p->HasKey, TRUE, sizeof(p->HasKey));
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
p->Armor = 100;
for (int inv = 0; inv < MAX_INVENTORY; inv++)
{
p->InventoryPercent[inv] = 100;
p->InventoryAmount[inv] = InventoryData[inv].MaxInv;
}
PlayerUpdateInventory(p, p->InventoryNum);
for (int i = 0; i < numsectors; i++)
{
if (SectUser[i] && SectUser[i]->stag == SECT_LOCK_DOOR)
SectUser[i]->number = 0; // unlock all doors of this type
}
}
static void cmd_Give(int player, uint8_t** stream, bool skip)
{
int type = ReadByte(stream);
if (skip) return;
if (numplayers != 1 || gamestate != GS_LEVEL || (Player[player].Flags & PF_DEAD))
{
Printf("give: Cannot give while dead or not in a single-player game.\n");
return;
}
switch (type)
{
case GIVE_ALL:
ItemCheat(player);
WeaponCheat(player);
break;
case GIVE_HEALTH:
if (User[Player[player].PlayerSprite]->Health < Player[player].MaxHealth)
{
User[Player[player].PlayerSprite]->Health += 25;
PutStringInfo(&Player[player], GStrings("TXTS_ADDEDHEALTH"));
}
break;
case GIVE_WEAPONS:
WeaponCheat(player);
break;
case GIVE_AMMO:
{
auto p = &Player[player];
auto u = User[p->PlayerSprite];
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
for (int i = 0; i < SIZ(p->WpnAmmo); i++)
{
p->WpnAmmo[i] = DamageData[i].max_ammo;
}
PlayerUpdateWeapon(p, u->WeaponNum);
break;
}
case GIVE_ARMOR:
if (User[Player[player].PlayerSprite]->Health < Player[player].MaxHealth)
{
Player[player].Armor = 100;
PutStringInfo(&Player[player], GStrings("TXTB_FULLARM"));
}
break;
case GIVE_KEYS:
memset(Player[player].HasKey, TRUE, sizeof(Player[player].HasKey));
PutStringInfo(&Player[player], GStrings("TXTS_GIVEKEY"));
break;
case GIVE_INVENTORY:
{
auto p = &Player[player];
PutStringInfo(p, GStrings("GOT ALL INVENTORY"));
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
p->Armor = 100;
for (int inv = 0; inv < MAX_INVENTORY; inv++)
{
p->InventoryPercent[inv] = 100;
p->InventoryAmount[inv] = InventoryData[inv].MaxInv;
}
PlayerUpdateInventory(p, p->InventoryNum);
}
break;
case GIVE_ITEMS:
ItemCheat(player);
break;
}
}
void InitCheats() void InitCheats()
{ {
SetCheats(swcheats, countof(swcheats)); SetCheats(swcheats, countof(swcheats));
Net_SetCommandHandler(DEM_GIVE, cmd_Give);
} }
END_SW_NS END_SW_NS

View file

@ -114,60 +114,6 @@ int osdcmd_levelwarp(CCmdFuncPtr parm)
return CCMD_OK; return CCMD_OK;
} }
struct cheatseq_t;
bool WeaponCheat(cheatseq_t* c);
bool AmmoCheat(cheatseq_t* c);
bool ItemCheat(cheatseq_t* c);
bool InventoryCheat(cheatseq_t* c);
bool ArmorCheat(cheatseq_t* c);
bool HealCheat(cheatseq_t* c);
bool KeysCheat(cheatseq_t* c);
static int osdcmd_give(CCmdFuncPtr parm)
{
int32_t i;
if (parm->numparms != 1) return CCMD_SHOWHELP;
if (!stricmp(parm->parms[0], "all"))
{
ItemCheat(nullptr);
return CCMD_OK;
}
else if (!stricmp(parm->parms[0], "health"))
{
HealCheat(nullptr);
return CCMD_OK;
}
else if (!stricmp(parm->parms[0], "weapons"))
{
WeaponCheat(nullptr);
return CCMD_OK;
}
else if (!stricmp(parm->parms[0], "ammo"))
{
AmmoCheat(nullptr);
return CCMD_OK;
}
else if (!stricmp(parm->parms[0], "armor"))
{
ArmorCheat(nullptr);
return CCMD_OK;
}
else if (!stricmp(parm->parms[0], "keys"))
{
KeysCheat(nullptr);
return CCMD_OK;
}
else if (!stricmp(parm->parms[0], "inventory"))
{
InventoryCheat(nullptr);
return CCMD_OK;
}
return CCMD_SHOWHELP;
}
static int osdcmd_warptocoords(CCmdFuncPtr parm) static int osdcmd_warptocoords(CCmdFuncPtr parm)
{ {
if (parm->numparms < 3 || parm->numparms > 5) if (parm->numparms < 3 || parm->numparms > 5)
@ -280,7 +226,6 @@ static int osdcmd_noop(CCmdFuncPtr parm)
int32_t registerosdcommands(void) int32_t registerosdcommands(void)
{ {
C_RegisterFunction("map","map <mapfile>: loads the given map", osdcmd_map); C_RegisterFunction("map","map <mapfile>: loads the given map", osdcmd_map);
//C_RegisterFunction("give","give <all|health|weapons|ammo|armor|keys|inventory>: gives requested item", osdcmd_give);
C_RegisterFunction("mirror_debug", "mirror [mirrornum]: print mirror debug info", osdcmd_mirror); C_RegisterFunction("mirror_debug", "mirror [mirrornum]: print mirror debug info", osdcmd_mirror);
C_RegisterFunction("levelwarp", "levelwarp <num>: warp to level", osdcmd_levelwarp); C_RegisterFunction("levelwarp", "levelwarp <num>: warp to level", osdcmd_levelwarp);
C_RegisterFunction("restartmap", "restartmap: restarts the current map", osdcmd_restartmap); C_RegisterFunction("restartmap", "restartmap: restarts the current map", osdcmd_restartmap);