From 7872b701ce56d09b015736a33df92404b1525b70 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 4 Jul 2020 21:36:27 +0200 Subject: [PATCH] - CCMD cleanup. --- source/games/duke/CMakeLists.txt | 2 +- source/games/duke/src/actors.cpp | 2 +- source/games/duke/src/actors_d.cpp | 2 +- source/games/duke/src/ccmds.cpp | 306 ++++++++++++++++++++++++ source/games/duke/src/cheats.h | 110 --------- source/games/duke/src/d_menu.cpp | 1 - source/games/duke/src/game.h | 1 - source/games/duke/src/global.h | 5 + source/games/duke/src/osdcmds.h | 48 ---- source/games/duke/src/player_d.cpp | 4 +- source/games/duke/src/sectors.cpp | 2 +- source/games/duke/src/sectors_d.cpp | 4 +- source/games/duke/src/zz_game.cpp | 20 +- source/games/duke/src/zz_osdcmds.cpp | 344 --------------------------- 14 files changed, 320 insertions(+), 531 deletions(-) create mode 100644 source/games/duke/src/ccmds.cpp delete mode 100644 source/games/duke/src/cheats.h delete mode 100644 source/games/duke/src/osdcmds.h delete mode 100644 source/games/duke/src/zz_osdcmds.cpp diff --git a/source/games/duke/CMakeLists.txt b/source/games/duke/CMakeLists.txt index 9927f03f0..3ae3b3354 100644 --- a/source/games/duke/CMakeLists.txt +++ b/source/games/duke/CMakeLists.txt @@ -10,6 +10,7 @@ set( PCH_SOURCES src/animatesprites_r.cpp src/animatesprites_d.cpp src/bowling.cpp + src/ccmds.cpp src/cheats.cpp src/d_menu.cpp src/dispatch.cpp @@ -45,7 +46,6 @@ set( PCH_SOURCES src/zz_game.cpp src/zz_global.cpp src/zz_net.cpp - src/zz_osdcmds.cpp src/zz_player.cpp src/zz_premap.cpp src/zz_savegame.cpp diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index fbccfcd21..33322ad35 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -2808,7 +2808,7 @@ void handle_se14(int i, bool checkstat, int RPG, int JIBS6) } if (s->xvel <= 64 && statstate) - stopsound(hittype[i].lastvx); + S_StopEnvSound(hittype[i].lastvx, i); if ((sc->floorz - sc->ceilingz) < (108 << 8)) { diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index bc9d3b98b..70e87b724 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -3870,7 +3870,7 @@ void moveeffectors_d(void) //STATNUM 3 x = ldist(&sprite[ps[p].i], &sprite[j]); if (x < 768) { - if (S_CheckSoundPlaying(DUKE_LONGTERM_PAIN) < 1) + if (S_CheckSoundPlaying(ps[p].i, DUKE_LONGTERM_PAIN) < 1) spritesound(DUKE_LONGTERM_PAIN, ps[p].i); spritesound(SHORT_CIRCUIT, ps[p].i); sprite[ps[p].i].extra -= 8 + (krand() & 7); diff --git a/source/games/duke/src/ccmds.cpp b/source/games/duke/src/ccmds.cpp new file mode 100644 index 000000000..90f48a476 --- /dev/null +++ b/source/games/duke/src/ccmds.cpp @@ -0,0 +1,306 @@ +//------------------------------------------------------------------------- +/* +Copyright (C) 1996, 2003 - 3D Realms Entertainment + +This file is part of Duke Nukem 3D version 1.5 - Atomic Edition + +Duke Nukem 3D is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +Original Source: 1996 - Todd Replogle +Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms +Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au) +*/ +//------------------------------------------------------------------------- + +#include "ns.h" + +#include "duke3d.h" +#include "osdcmds.h" +#include "savegame.h" +#include "sbar.h" +#include "mapinfo.h" +#include "cheathandler.h" + +BEGIN_DUKE_NS + +bool cheatGod(cheatseq_t*); +bool cheatClip(cheatseq_t*); +bool cheatWeapons(cheatseq_t* s); +bool cheatStuff(cheatseq_t* s); +bool cheatKeys(cheatseq_t* s); +bool cheatInventory(cheatseq_t* s); + +static void dowarp(int volume, int level) +{ + ud.m_monsters_off = ud.monsters_off = 0; + + ud.m_respawn_items = 0; + ud.m_respawn_inventory = 0; + + ud.multimode = 1; + + ud.m_volume_number = volume; + m_level_number = level; + if (ps[myconnectindex].gm & MODE_GAME) + { + G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill); + ps[myconnectindex].gm = MODE_RESTART; + } + else G_NewGame_EnterLevel(); +} + +static int ccmd_levelwarp(CCmdFuncPtr parm) +{ + if (parm->numparms != 2) + return CCMD_SHOWHELP; + int e = atoi(parm->parms[0]); + int m = atoi(parm->parms[1]); + if (e == 0 || m == 0) + { + Printf(TEXTCOLOR_RED "Invalid level!: E%sL%s\n", parm->parms[0], parm->parms[1]); + return CCMD_OK; + } + dowarp(e - 1, m - 1); + + return CCMD_OK; +} + +static int ccmd_map(CCmdFuncPtr parm) +{ + if (parm->numparms != 1) + { + return CCMD_SHOWHELP; + } + FString mapname = parm->parms[0]; + + if (!fileSystem.Lookup(mapname, "MAP")) + { + Printf(TEXTCOLOR_RED "map: file \"%s\" not found.\n", mapname.GetChars()); + return CCMD_OK; + } + int volume, level; + // Check if the map is already defined. + for (int i = 0; i < 512; i++) + { + if (mapList[i].labelName.CompareNoCase(mapname) == 0) + { + volume = i / MAXLEVELS; + level = i % MAXLEVELS; + goto foundone; + } + } + if (VOLUMEONE) + { + Printf(TEXTCOLOR_RED "Cannot use user maps in shareware.\n"); + return CCMD_OK; + } + // Treat as user map if not found in the list of regular maps. + boardfilename[0] = '/'; + boardfilename[1] = 0; + volume = 0; + level = 7; + DefaultExtension(mapname, ".map"); + strcat(boardfilename, mapname); +foundone: + if (numplayers > 1) + { + return CCMD_OK; + } + + dowarp(volume, level); + return CCMD_OK; +} + + +static int ccmd_activatecheat(CCmdFuncPtr parm) +{ + if (parm->numparms != 1) + return CCMD_SHOWHELP; + + PlaybackCheat(parm->parms[0]); + return CCMD_OK; +} + +static int ccmd_god(CCmdFuncPtr) +{ + if (numplayers == 1 && ps[myconnectindex].gm & MODE_GAME) + cheatGod(nullptr); + else + Printf("god: Not in a single-player game.\n"); + + return CCMD_OK; +} + +static int ccmd_noclip(CCmdFuncPtr) +{ + if (numplayers == 1 && ps[myconnectindex].gm & MODE_GAME) + { + cheatClip(nullptr); + } + else + { + Printf("noclip: Not in a single-player game.\n"); + } + + return CCMD_OK; +} + +int ccmd_restartmap(CCmdFuncPtr) +{ + if (ps[myconnectindex].gm & MODE_GAME && ud.multimode == 1) + ps[myconnectindex].gm = MODE_RESTART; + + return CCMD_OK; +} + +static int ccmd_spawn(CCmdFuncPtr parm) +{ + int x = 0, y = 0, z = 0; + unsigned int cstat = 0, picnum = 0; + unsigned int pal = 0; + int ang = 0; + int set = 0, idx; + + if (numplayers > 1 || !(ps[myconnectindex].gm & MODE_GAME)) { + Printf("spawn: Can't spawn sprites in multiplayer games or demos\n"); + return CCMD_OK; + } + + switch (parm->numparms) { + case 7: // x,y,z + x = atol(parm->parms[4]); + y = atol(parm->parms[5]); + z = atol(parm->parms[6]); + set |= 8; + case 4: // ang + ang = atol(parm->parms[3]) & 2047; set |= 4; + case 3: // cstat + cstat = (unsigned short)atol(parm->parms[2]); set |= 2; + case 2: // pal + pal = (unsigned char)atol(parm->parms[1]); set |= 1; + case 1: // tile number + if (isdigit(parm->parms[0][0])) { + picnum = (unsigned short)atol(parm->parms[0]); + } + else { + int i, j; + for (j = 0; j < 2; j++) { + for (i = 0; i < labelcnt; i++) { + if ( + (j == 0 && !strcmp(label + (i * MAXLABELLEN), parm->parms[0])) || + (j == 1 && !stricmp(label + (i * MAXLABELLEN), parm->parms[0])) + ) { + picnum = (unsigned short)labelcode[i]; + break; + } + } + if (i < labelcnt) break; + } + if (i == labelcnt) { + Printf("spawn: Invalid tile label given\n"); + return CCMD_OK; + } + } + + if (picnum >= MAXTILES) { + Printf("spawn: Invalid tile number\n"); + return CCMD_OK; + } + break; + default: + return CCMD_SHOWHELP; + } + + idx = fi.spawn(ps[myconnectindex].i, (short)picnum); + if (set & 1) sprite[idx].pal = (char)pal; + if (set & 2) sprite[idx].cstat = (short)cstat; + if (set & 4) sprite[idx].ang = ang; + if (set & 8) { + if (setsprite(idx, x, y, z) < 0) { + Printf("spawn: Sprite can't be spawned into null space\n"); + deletesprite(idx); + } + } + + return CCMD_OK; +} + +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 return CCMD_SHOWHELP; + return CCMD_OK; +} + + + +int registerosdcommands(void) +{ + C_RegisterFunction("map","map : warp to the given map, identified by its name", ccmd_map); + C_RegisterFunction("levelwarp","levelwarp : warp to episode 'e' and map 'm'", ccmd_levelwarp); + + C_RegisterFunction("give","give : gives requested item", ccmd_give); + C_RegisterFunction("god","god: toggles god mode", ccmd_god); + C_RegisterFunction("activatecheat","activatecheat : activates a cheat code", ccmd_activatecheat); + + C_RegisterFunction("noclip","noclip: toggles clipping mode", ccmd_noclip); + C_RegisterFunction("restartmap", "restartmap: restarts the current map", ccmd_restartmap); + + C_RegisterFunction("spawn","spawn [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties",ccmd_spawn); + + return 0; +} + +END_DUKE_NS diff --git a/source/games/duke/src/cheats.h b/source/games/duke/src/cheats.h deleted file mode 100644 index fc60209eb..000000000 --- a/source/games/duke/src/cheats.h +++ /dev/null @@ -1,110 +0,0 @@ -//------------------------------------------------------------------------- -/* -Copyright (C) 2016 EDuke32 developers and contributors - -This file is part of EDuke32. - -EDuke32 is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 2 -as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ -//------------------------------------------------------------------------- - -#pragma once - -BEGIN_DUKE_NS - -#define MAXCHEATLEN 20 -#define NUMCHEATCODES (int32_t)ARRAY_SIZE(CheatStrings) - -extern void G_DoCheats(void); -extern void G_SetupCheats(void); - -// Cheats -// KEEPINSYNC game.c: char CheatStrings[][] -enum cheatindex_t -{ - CHEAT_CORNHOLIO, // 0 - CHEAT_STUFF, - CHEAT_SCOTTY, - CHEAT_COORDS, - CHEAT_VIEW, - CHEAT_TIME, // 5 - CHEAT_UNLOCK, - CHEAT_CASHMAN, - CHEAT_ITEMS, - CHEAT_RATE, - CHEAT_SKILL, // 10 - CHEAT_BETA, - CHEAT_HYPER, - CHEAT_MONSTERS, - CHEAT_RESERVED, - CHEAT_RESERVED2, // 15 - CHEAT_TODD, - CHEAT_SHOWMAP, - CHEAT_KROZ, - CHEAT_ALLEN, - CHEAT_CLIP, // 20 - CHEAT_WEAPONS, - CHEAT_INVENTORY, - CHEAT_KEYS, - CHEAT_DEBUG, - CHEAT_RAJOSEPH, // 25 - CHEAT_RAMRBILL, - CHEAT_RATONY, - CHEAT_RAGARY, - CHEAT_RARHETT, - CHEAT_RAAARON, // 30 - CHEAT_RANOCHEAT, - CHEAT_RAWOLESLAGLE, - CHEAT_RAMIKAEL, - CHEAT_RAGREG, - CHEAT_RANOAH, // 35 - CHEAT_RAARIJIT, - CHEAT_RADONUT, - CHEAT_RAKFC, - CHEAT_RAVAN, - NUMCHEATS, -}; - -extern char CheatStrings[NUMCHEATS][MAXCHEATLEN]; - -// KEEPINSYNC game.c: uint8_t CheatFunctionIDs[] -// KEEPINSYNC menus.c: MenuEntry_t ME_CheatCodes[] -enum CheatCodeFunctions -{ - CHEATFUNC_CASHMAN, - CHEATFUNC_GOD, - CHEATFUNC_GIVEEVERYTHING, - CHEATFUNC_GIVEWEAPONS, - CHEATFUNC_GIVEALLITEMS, - CHEATFUNC_GIVEINVENTORY, - CHEATFUNC_GIVEKEYS, - CHEATFUNC_HYPER, - CHEATFUNC_VIEW, - CHEATFUNC_SHOWMAP, - CHEATFUNC_UNLOCK, - CHEATFUNC_CLIP, - CHEATFUNC_WARP, - CHEATFUNC_SKILL, - CHEATFUNC_MONSTERS, - CHEATFUNC_FRAMERATE, - CHEATFUNC_QUOTEBETA, - CHEATFUNC_QUOTETODD, - CHEATFUNC_QUOTEALLEN, - CHEATFUNC_COORDS, - CHEATFUNC_DEBUG, - NUMCHEATFUNCS, -}; - -END_DUKE_NS diff --git a/source/games/duke/src/d_menu.cpp b/source/games/duke/src/d_menu.cpp index 533e8cb47..c089b3a19 100644 --- a/source/games/duke/src/d_menu.cpp +++ b/source/games/duke/src/d_menu.cpp @@ -30,7 +30,6 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms #include "duke3d.h" -#include "osdcmds.h" #include "savegame.h" #include "game.h" #include "superfasthash.h" diff --git a/source/games/duke/src/game.h b/source/games/duke/src/game.h index a95b24694..f071bec33 100644 --- a/source/games/duke/src/game.h +++ b/source/games/duke/src/game.h @@ -229,7 +229,6 @@ void lotsofcolourglass(int spriteNum,int wallNum,int glassCnt); void lotsofglass(int spriteNum,int wallnum,int glassCnt); void G_BackToMenu(void); -void G_DumpDebugInfo(void); const char* G_PrintYourTime(void); const char* G_PrintParTime(void); diff --git a/source/games/duke/src/global.h b/source/games/duke/src/global.h index c1e62f602..fae15fedf 100644 --- a/source/games/duke/src/global.h +++ b/source/games/duke/src/global.h @@ -64,6 +64,11 @@ G_EXTERN actor_t actor[MAXSPRITES]; // actorinfo: tile-specific data THAT DOES NOT CHANGE during the course of a game G_EXTERN ActorInfo actorinfo[MAXTILES]; G_EXTERN animwalltype animwall[MAXANIMWALLS]; +enum +{ + MAXLABELLEN = 64 +}; + extern char *label; G_EXTERN char g_loadFromGroupOnly; G_EXTERN char g_skillCnt; diff --git a/source/games/duke/src/osdcmds.h b/source/games/duke/src/osdcmds.h deleted file mode 100644 index 1da5de9c6..000000000 --- a/source/games/duke/src/osdcmds.h +++ /dev/null @@ -1,48 +0,0 @@ -//------------------------------------------------------------------------- -/* -Copyright (C) 2010 EDuke32 developers and contributors - -This file is part of EDuke32. - -EDuke32 is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 2 -as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ -//------------------------------------------------------------------------- - -#ifndef osdcmds_h_ -#define osdcmds_h_ - -BEGIN_DUKE_NS - -struct osdcmd_cheatsinfo { - int32_t cheatnum; // -1 = none, else = see DoCheats() - int32_t volume,level; -}; - -extern struct osdcmd_cheatsinfo osdcmd_cheatsinfo_stat; - -int32_t registerosdcommands(void); - -// key bindings stuff -typedef struct { - const char *name; - int32_t id; -} keydef_t; - -extern const char *const ConsoleButtons[]; - -END_DUKE_NS - -#endif // osdcmds_h_ - diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index d484da47f..a58ecc9c9 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -1402,8 +1402,8 @@ int doincrements_d(struct player_struct* p) p->jetpack_on = 0; checkavailinven(p); spritesound(DUKE_JETPACK_OFF, p->i); - stopsound(DUKE_JETPACK_IDLE); - stopsound(DUKE_JETPACK_ON); + S_StopEnvSound(DUKE_JETPACK_IDLE, p->i); + S_StopEnvSound(DUKE_JETPACK_ON, p->i); } } diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp index 67bcbb579..e896f2001 100644 --- a/source/games/duke/src/sectors.cpp +++ b/source/games/duke/src/sectors.cpp @@ -348,7 +348,7 @@ int getanimationgoal(const int* animptr) j = -1; for (i = animatecnt - 1; i >= 0; i--) - if (animptr == (int*)animateptr[i]) + if (animptr == animateptr[i]) { j = i; break; diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index 85a3183b1..8a528de22 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -1663,8 +1663,8 @@ void checksectors_d(int snum) else if (sprite[p->i].extra < max_player_health) sprite[p->i].extra = max_player_health; } - else if (S_CheckSoundPlaying(FLUSH_TOILET) == 0) - spritesound(FLUSH_TOILET, p->i); + else if (S_CheckSoundPlaying(neartagsprite, FLUSH_TOILET) == 0) + spritesound(FLUSH_TOILET, neartagsprite); return; case NUKEBUTTON: diff --git a/source/games/duke/src/zz_game.cpp b/source/games/duke/src/zz_game.cpp index b97defbbe..207ca1bbd 100644 --- a/source/games/duke/src/zz_game.cpp +++ b/source/games/duke/src/zz_game.cpp @@ -27,7 +27,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "duke3d.h" #include "compat.h" #include "baselayer.h" -#include "osdcmds.h" #include "net.h" #include "savegame.h" @@ -59,6 +58,7 @@ BEGIN_DUKE_NS void SetDispatcher(); void InitCheats(); void checkcommandline(); +int registerosdcommands(void); int16_t max_ammo_amount[MAX_WEAPONS]; @@ -972,24 +972,6 @@ bool GameInterface::GenerateSavePic() } -void G_DumpDebugInfo(void) -{ - int32_t j,x; - // FILE * fp=fopen("condebug.log","w"); - - for (x=0; x= 0) - { - buildprint("Sprite ", j, " (", TrackerCast(sprite[j].x), ",", TrackerCast(sprite[j].y), ",", TrackerCast(sprite[j].z), - ") (picnum: ", TrackerCast(sprite[j].picnum), ")\n"); - buildprint("\n"); - j = nextspritestat[j]; - } - } -} - static int G_MaybeTakeOnFloorPal(tspritetype *pSprite, int sectNum) { int const floorPal = sector[sectNum].floorpal; diff --git a/source/games/duke/src/zz_osdcmds.cpp b/source/games/duke/src/zz_osdcmds.cpp deleted file mode 100644 index 92b333903..000000000 --- a/source/games/duke/src/zz_osdcmds.cpp +++ /dev/null @@ -1,344 +0,0 @@ -//------------------------------------------------------------------------- -/* -Copyright (C) 2010 EDuke32 developers and contributors -Copyright (C) 2020 Raze developers and contributors - -This file is part of EDuke32. - -EDuke32 is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 2 -as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ -//------------------------------------------------------------------------- - -#include "ns.h" // Must come before everything else! - -#include "duke3d.h" -#include "osdcmds.h" -#include "savegame.h" -#include "sbar.h" -#include "mapinfo.h" -#include "cheathandler.h" - -BEGIN_DUKE_NS - -bool cheatGod(cheatseq_t*); -bool cheatClip(cheatseq_t*); -bool cheatWeapons(cheatseq_t* s); -bool cheatStuff(cheatseq_t* s); -bool cheatKeys(cheatseq_t* s); -bool cheatInventory(cheatseq_t* s); - -static int osdcmd_levelwarp(CCmdFuncPtr parm) -{ - if (parm->numparms != 2) - return OSDCMD_SHOWHELP; - int e = atoi(parm->parms[0]); - int m = atoi(parm->parms[1]); - if (e == 0 || m == 0) - { - Printf(TEXTCOLOR_RED "Invalid level!: E%sL%s\n", parm->parms[0], parm->parms[1]); - return OSDCMD_OK; - } - - ud.m_volume_number = e - 1; - m_level_number = m - 1; - - ud.m_monsters_off = ud.monsters_off = 0; - - ud.m_respawn_items = 0; - ud.m_respawn_inventory = 0; - - ud.multimode = 1; - - if (g_player[myconnectindex].ps->gm & MODE_GAME) - { - G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill); - g_player[myconnectindex].ps->gm = MODE_RESTART; - } - else G_NewGame_EnterLevel(); - - return OSDCMD_OK; -} - -static int osdcmd_map(CCmdFuncPtr parm) -{ - if (parm->numparms != 1) - { - return OSDCMD_SHOWHELP; - } - FString mapname = parm->parms[0]; - - if (!fileSystem.Lookup(mapname, "MAP")) - { - Printf(TEXTCOLOR_RED "map: file \"%s\" not found.\n", mapname.GetChars()); - return OSDCMD_OK; - } - - // Check if the map is already defined. - for (int i = 0; i < 512; i++) - { - if (mapList[i].labelName.CompareNoCase(mapname) == 0) - { - ud.m_volume_number = i / MAXLEVELS; - m_level_number = i % MAXLEVELS; - goto foundone; - } - } - if (VOLUMEONE) - { - Printf(TEXTCOLOR_RED "Cannot use user maps in shareware.\n"); - return OSDCMD_OK; - } - // Treat as user map - boardfilename[0] = '/'; - boardfilename[1] = 0; - ud.m_volume_number = 0; - m_level_number = 7; - DefaultExtension(mapname, ".map"); - strcat(boardfilename, mapname); -foundone: - if (numplayers > 1) - { - return OSDCMD_OK; - } - - ud.m_monsters_off = ud.monsters_off = 0; - - ud.m_respawn_items = 0; - ud.m_respawn_inventory = 0; - - ud.multimode = 1; - - if (g_player[myconnectindex].ps->gm & MODE_GAME) - { - G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill); - g_player[myconnectindex].ps->gm = MODE_RESTART; - } - else G_NewGame_EnterLevel(); - - return OSDCMD_OK; -} - - -static int osdcmd_activatecheat(CCmdFuncPtr parm) -{ - if (parm->numparms != 1) - return OSDCMD_SHOWHELP; - - PlaybackCheat(parm->parms[0]); - return OSDCMD_OK; -} - -static int osdcmd_god(CCmdFuncPtr) -{ - if (numplayers == 1 && ps[myconnectindex].gm & MODE_GAME) - cheatGod(nullptr); - else - Printf("god: Not in a single-player game.\n"); - - return OSDCMD_OK; -} - -static int osdcmd_noclip(CCmdFuncPtr) -{ - if (numplayers == 1 && ps[myconnectindex].gm & MODE_GAME) - { - cheatClip(nullptr); - } - else - { - Printf("noclip: Not in a single-player game.\n"); - } - - return OSDCMD_OK; -} - -int osdcmd_restartmap(CCmdFuncPtr UNUSED(parm)) -{ - UNREFERENCED_CONST_PARAMETER(parm); - - if (g_player[myconnectindex].ps->gm & MODE_GAME && ud.multimode == 1) - g_player[myconnectindex].ps->gm = MODE_RESTART; - - return OSDCMD_OK; -} - -static int osdcmd_spawn(CCmdFuncPtr parm) -{ - int32_t picnum = 0; - uint16_t cstat=0; - char pal=0; - int16_t ang=0; - int16_t set=0, idx; - vec3_t vect; - - if (numplayers > 1 || !(g_player[myconnectindex].ps->gm & MODE_GAME)) - { - Printf("spawn: Can't spawn sprites in multiplayer games or demos\n"); - return OSDCMD_OK; - } - - switch (parm->numparms) - { - case 7: // x,y,z - vect.x = Batol(parm->parms[4]); - vect.y = Batol(parm->parms[5]); - vect.z = Batol(parm->parms[6]); - set |= 8; - fallthrough__; - case 4: // ang - ang = Batol(parm->parms[3]) & 2047; - set |= 4; - fallthrough__; - case 3: // cstat - cstat = (uint16_t)Batol(parm->parms[2]); - set |= 2; - fallthrough__; - case 2: // pal - pal = (uint8_t)Batol(parm->parms[1]); - set |= 1; - fallthrough__; - case 1: // tile number - if (isdigit(parm->parms[0][0])) - { - picnum = Batol(parm->parms[0]); - } - else - { - int32_t i; - int32_t j; - - for (j=0; j<2; j++) - { - for (i=0; iparms[0])) || - (j == 1 && !Bstrcasecmp(label+(i<<6), parm->parms[0]))) - { - picnum = labelcode[i]; - break; - } - } - - if (i < labelcnt) - break; - } - if (i==labelcnt) - { - Printf("spawn: Invalid tile label given\n"); - return OSDCMD_OK; - } - } - - if ((uint32_t)picnum >= MAXUSERTILES) - { - Printf("spawn: Invalid tile number\n"); - return OSDCMD_OK; - } - break; - - default: - return OSDCMD_SHOWHELP; - } - - idx = fi.spawn(g_player[myconnectindex].ps->i, picnum); - if (set & 1) sprite[idx].pal = (uint8_t)pal; - if (set & 2) sprite[idx].cstat = (int16_t)cstat; - if (set & 4) sprite[idx].ang = ang; - if (set & 8) - { - if (setsprite(idx, &vect) < 0) - { - Printf("spawn: Sprite can't be spawned into null space\n"); - deletesprite(idx); - } - } - - return OSDCMD_OK; -} - -static int osdcmd_give(CCmdFuncPtr parm) -{ - int32_t i; - - if (numplayers != 1 || (g_player[myconnectindex].ps->gm & MODE_GAME) == 0 || - g_player[myconnectindex].ps->dead_flag != 0) - { - Printf("give: Cannot give while dead or not in a single-player game.\n"); - return OSDCMD_OK; - } - - if (parm->numparms != 1) return OSDCMD_SHOWHELP; - - cheatseq_t* cs = (cheatseq_t*)(intptr_t)1; - if (!Bstrcasecmp(parm->parms[0], "all")) - { - cheatStuff(cs); - return OSDCMD_OK; - } - else if (!Bstrcasecmp(parm->parms[0], "health")) - { - sprite[g_player[myconnectindex].ps->i].extra = max_player_health<<1; - return OSDCMD_OK; - } - else if (!Bstrcasecmp(parm->parms[0], "weapons")) - { - cheatWeapons(cs); - return OSDCMD_OK; - } - else if (!Bstrcasecmp(parm->parms[0], "ammo")) - { - for (i=MAX_WEAPONS-(VOLUMEONE?6:1)-1; i>=PISTOL_WEAPON; i--) - P_AddAmmo(g_player[myconnectindex].ps,i, max_ammo_amount[i]); - return OSDCMD_OK; - } - else if (!Bstrcasecmp(parm->parms[0], "armor")) - { - g_player[myconnectindex].ps->inv_amount[GET_SHIELD] = 100; - return OSDCMD_OK; - } - else if (!Bstrcasecmp(parm->parms[0], "keys")) - { - cheatKeys(cs); - return OSDCMD_OK; - } - else if (!Bstrcasecmp(parm->parms[0], "inventory")) - { - cheatInventory(cs); - return OSDCMD_OK; - } - return OSDCMD_SHOWHELP; -} - - - -int32_t registerosdcommands(void) -{ - - C_RegisterFunction("map","map : loads the given map", osdcmd_map); - C_RegisterFunction("levelwarp","levelwarp : warp to episode 'e' and map 'm'", osdcmd_levelwarp); - - C_RegisterFunction("give","give : gives requested item", osdcmd_give); - C_RegisterFunction("god","god: toggles god mode", osdcmd_god); - C_RegisterFunction("activatecheat","activatecheat : activates a cheat code", osdcmd_activatecheat); - - C_RegisterFunction("noclip","noclip: toggles clipping mode", osdcmd_noclip); - C_RegisterFunction("restartmap", "restartmap: restarts the current map", osdcmd_restartmap); - - C_RegisterFunction("spawn","spawn [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties",osdcmd_spawn); - - return 0; -} - -END_DUKE_NS