- route the shared control CCMDs through the game interface instead of registering local variants for each game.

This commit is contained in:
Christoph Oelckers 2020-11-29 12:23:31 +01:00
parent 48b16d5233
commit a34f5debe8
19 changed files with 123 additions and 136 deletions

View file

@ -512,7 +512,6 @@ void GameInterface::app_init()
Printf(PRINT_NONOTIFY, "Initializing sound system\n");
sndInit();
registerosdcommands();
gChoke.init(518, chokeCallback);
UpdateDacs(0, true);

View file

@ -100,6 +100,10 @@ struct GameInterface : ::GameInterface
fixed_t playerHorizMin() override { return IntToFixed(-180); }
fixed_t playerHorizMax() override { return IntToFixed(120); }
int playerKeyMove() override { return 1024; }
void WarpToCoords(int x, int y, int z, int a, int h) override;
void ToggleThirdPerson() override;
void SwitchCoopView() override;
void ToggleShowWeapon() override;
GameStats getStats() override;
};

View file

@ -41,7 +41,6 @@ void InitMirrors(void);
void sub_5571C(char mode);
void sub_557C4(int x, int y, int interpolation);
void DrawMirrors(int x, int y, int z, fixed_t a, fixed_t horiz, int smooth, int viewPlayer);
int32_t registerosdcommands(void);
int qanimateoffs(int a1, int a2);
int32_t qgetpalookup(int32_t a1, int32_t a2);
void HookReplaceFunctions();

View file

@ -38,44 +38,38 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS
static int osdcmd_warptocoords(CCmdFuncPtr parm)
void GameInterface::WarpToCoords(int x, int y, int z, int ang, int horz)
{
if (parm->numparms < 3 || parm->numparms > 5)
return CCMD_SHOWHELP;
PLAYER *pPlayer = &gPlayer[myconnectindex];
VIEW* pView = &gPrevView[myconnectindex];
pPlayer->pSprite->x = pView->at50 = gView->pSprite->x = atoi(parm->parms[0]);
pPlayer->pSprite->y = pView->at54 = gView->pSprite->y = atoi(parm->parms[1]);
pPlayer->zView = pView->at38 = gView->zView = atoi(parm->parms[2]);
pPlayer->pSprite->x = pView->at50 = gView->pSprite->x = x;
pPlayer->pSprite->y = pView->at54 = gView->pSprite->y = y;
pPlayer->zView = pView->at38 = gView->zView = z;
if (parm->numparms >= 4)
if (ang != INT_MIN)
{
pPlayer->angle.oang = pPlayer->angle.ang = pView->at30 = gView->angle.ang = buildang(atoi(parm->parms[3]));
pPlayer->angle.oang = pPlayer->angle.ang = pView->at30 = gView->angle.ang = buildang(ang);
}
if (parm->numparms == 5)
if (horz != INT_MIN)
{
pPlayer->horizon.ohoriz = pPlayer->horizon.horiz = pView->at24 = gView->horizon.horiz = buildhoriz(atoi(parm->parms[4]));
pPlayer->horizon.ohoriz = pPlayer->horizon.horiz = pView->at24 = gView->horizon.horiz = buildhoriz(horz);
}
return CCMD_OK;
}
static int osdcmd_third_person_view(CCmdFuncPtr parm)
void GameInterface::ToggleThirdPerson()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
if (gViewPos > VIEWPOS_0)
gViewPos = VIEWPOS_0;
else
gViewPos = VIEWPOS_1;
return CCMD_OK;
}
static int osdcmd_coop_view(CCmdFuncPtr parm)
void GameInterface::SwitchCoopView()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
if (gGameOptions.nGameType == 1)
{
gViewIndex = connectpoint2[gViewIndex];
@ -96,26 +90,12 @@ static int osdcmd_coop_view(CCmdFuncPtr parm)
} while (oldViewIndex != gViewIndex);
gView = &gPlayer[gViewIndex];
}
return CCMD_OK;
}
static int osdcmd_show_weapon(CCmdFuncPtr parm)
void GameInterface::ToggleShowWeapon()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
cl_showweapon = (cl_showweapon + 1) & 3;
return CCMD_OK;
}
int32_t registerosdcommands(void)
{
C_RegisterFunction("warptocoords","warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates",osdcmd_warptocoords);
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_coop_view);
C_RegisterFunction("show_weapon", "Show opponents' weapons", osdcmd_show_weapon);
return 0;
}
END_BLD_NS

View file

@ -93,6 +93,10 @@ struct GameInterface
virtual fixed_t playerHorizMin() { return IntToFixed(-200); }
virtual fixed_t playerHorizMax() { return IntToFixed(200); }
virtual int playerKeyMove() { return 0; }
virtual void WarpToCoords(int x, int y, int z, int a, int h) {}
virtual void ToggleThirdPerson() { }
virtual void SwitchCoopView() { Printf("Unsupported command\n"); }
virtual void ToggleShowWeapon() { Printf("Unsupported command\n"); }
virtual FString statFPS()
{

View file

@ -41,6 +41,8 @@
#include"packet.h"
#include "gamecontrol.h"
#include "gamestruct.h"
#include "d_net.h"
#include "gamestate.h"
static int WeaponToSend = 0;
ESyncBits ActionsToSend = 0;
@ -327,6 +329,53 @@ CCMD(pause)
sendPause = true;
}
CCMD(warptocoords)
{
if (netgame)
{
Printf("warptocoords cannot be used in multiplayer.\n");
return;
}
if (argv.argc() <= 4)
{
Printf("warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates\n");
return;
}
if (gamestate != GS_LEVEL)
{
Printf("warptocoords: must be in a level\n");
return;
}
int x = atoi(argv[1]);
int y = atoi(argv[2]);
int z = atoi(argv[3]);
int ang = INT_MIN, horiz = INT_MIN;
if (argv.argc() > 4)
{
ang = atoi(argv[4]);
}
if (argv.argc() > 5)
{
horiz = atoi(argv[5]);
}
gi->WarpToCoords(x, y, z, ang, horiz);
}
CCMD(third_person_view)
{
gi->ToggleThirdPerson();
}
CCMD(coop_view)
{
gi->SwitchCoopView();
}
CCMD(show_weapon)
{
gi->ToggleShowWeapon();
}
void ApplyGlobalInput(InputPacket& input, ControlInfo* hidInput, bool const crouchable, bool const disableToggle)
{

View file

@ -267,6 +267,8 @@ struct GameInterface : ::GameInterface
fixed_t playerHorizMin() override { return IntToFixed(-150); }
fixed_t playerHorizMax() override { return IntToFixed(150); }
int playerKeyMove() override { return 6; }
void WarpToCoords(int x, int y, int z, int a, int h) override;
void ToggleThirdPerson() override;
::GameStats getStats() override;
};

View file

@ -36,29 +36,24 @@ BEGIN_PS_NS
static bool gamesetinput = false;
static int osdcmd_warptocoords(CCmdFuncPtr parm)
void GameInterface::WarpToCoords(int x, int y, int z, int ang, int horz)
{
if (parm->numparms < 3 || parm->numparms > 5)
return CCMD_SHOWHELP;
Player *nPlayer = &PlayerList[nLocalPlayer];
spritetype *pSprite = &sprite[nPlayer->nSprite];
nPlayer->opos.x = pSprite->x = atoi(parm->parms[0]);
nPlayer->opos.y = pSprite->y = atoi(parm->parms[1]);
nPlayer->opos.z = pSprite->z = atoi(parm->parms[2]);
nPlayer->opos.x = pSprite->x = x;
nPlayer->opos.y = pSprite->y = y;
nPlayer->opos.z = pSprite->z = z;
if (parm->numparms >= 4)
if (ang != INT_MIN)
{
nPlayer->angle.oang = nPlayer->angle.ang = buildang(atoi(parm->parms[3]));
nPlayer->angle.oang = nPlayer->angle.ang = buildang(ang);
}
if (parm->numparms == 5)
if (horz != INT_MIN)
{
nPlayer->horizon.ohoriz = nPlayer->horizon.horiz = buildhoriz(atoi(parm->parms[4]));
nPlayer->horizon.ohoriz = nPlayer->horizon.horiz = buildhoriz(horz);
}
return CCMD_OK;
}
static int osdcmd_doors(CCmdFuncPtr parm)
@ -105,9 +100,9 @@ static int osdcmd_spawn(CCmdFuncPtr parm)
return CCMD_OK;
}
static int osdcmd_third_person_view(CCmdFuncPtr parm)
void GameInterface::ToggleThirdPerson()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
if (!nFreeze)
{
bCamera = !bCamera;
@ -122,25 +117,14 @@ static int osdcmd_third_person_view(CCmdFuncPtr parm)
{
gamesetinput = cl_syncinput = false;
}
return CCMD_OK;
}
static int osdcmd_noop(CCmdFuncPtr parm)
{
// this is for silencing key bindings only.
return CCMD_OK;
}
int32_t registerosdcommands(void)
{
//if (VOLUMEONE)
C_RegisterFunction("doors", "opens/closes doors", osdcmd_doors);
C_RegisterFunction("spawn","spawn <creaturetype>: spawns a creature",osdcmd_spawn);
C_RegisterFunction("warptocoords","warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates",osdcmd_warptocoords);
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("show_weapon", "Show opponents' weapons", osdcmd_noop);
return 0;
}

View file

@ -337,7 +337,7 @@ void animatesprites_d(int x, int y, int a, int smoothratio)
}
}
if ((display_mirror == 1 || screenpeek != p || !h->GetOwner()) && ud.multimode > 1 && ud.showweapons && ps[p].GetActor()->s.extra > 0 && ps[p].curr_weapon > 0)
if ((display_mirror == 1 || screenpeek != p || !h->GetOwner()) && ud.multimode > 1 && cl_showweapon && ps[p].GetActor()->s.extra > 0 && ps[p].curr_weapon > 0)
{
auto newtspr = &tsprite[spritesortcnt];
memcpy(newtspr, t, sizeof(spritetype));

View file

@ -384,7 +384,7 @@ void animatesprites_r(int x, int y, int a, int smoothratio)
}
}
if ((display_mirror == 1 || screenpeek != p || !h->GetOwner()) && ud.multimode > 1 && ud.showweapons && ps[p].GetActor()->s.extra > 0 && ps[p].curr_weapon > 0)
if ((display_mirror == 1 || screenpeek != p || !h->GetOwner()) && ud.multimode > 1 && cl_showweapon && ps[p].GetActor()->s.extra > 0 && ps[p].curr_weapon > 0)
{
auto newtspr = &tsprite[spritesortcnt];
memcpy(newtspr, t, sizeof(spritetype));

View file

@ -33,9 +33,6 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
BEGIN_DUKE_NS
short pinsectorresetdown(short sect);
void ballreturn(DDukeActor *ball)
{
DukeStatIterator it(STAT_BOWLING);

View file

@ -103,33 +103,28 @@ static int ccmd_spawn(CCmdFuncPtr parm)
return CCMD_OK;
}
static int osdcmd_warptocoords(CCmdFuncPtr parm)
void GameInterface::WarpToCoords(int x, int y, int z, int ang, int horz)
{
if (parm->numparms < 3 || parm->numparms > 5)
return CCMD_SHOWHELP;
player_struct* p = &ps[myconnectindex];
p->oposx = p->posx = atoi(parm->parms[0]);
p->oposy = p->posy = atoi(parm->parms[1]);
p->oposz = p->posz = atoi(parm->parms[2]);
p->oposx = p->posx = x;
p->oposy = p->posy = y;
p->oposz = p->posz = z;
if (parm->numparms >= 4)
if (ang != INT_MIN)
{
p->angle.oang = p->angle.ang = buildang(atoi(parm->parms[3]));
p->angle.oang = p->angle.ang = buildang(ang);
}
if (parm->numparms == 5)
if (horz != INT_MIN)
{
p->horizon.ohoriz = p->horizon.horiz = buildhoriz(atoi(parm->parms[4]));
p->horizon.ohoriz = p->horizon.horiz = buildhoriz(horz);
}
return CCMD_OK;
}
static int osdcmd_third_person_view(CCmdFuncPtr parm)
void GameInterface::ToggleThirdPerson()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
if (!isRRRA() || (!ps[myconnectindex].OnMotorcycle && !ps[myconnectindex].OnBoat))
{
if (ps[myconnectindex].over_shoulder_on)
@ -142,42 +137,29 @@ static int osdcmd_third_person_view(CCmdFuncPtr parm)
}
FTA(QUOTE_VIEW_MODE_OFF + ps[myconnectindex].over_shoulder_on, &ps[myconnectindex]);
}
return CCMD_OK;
}
static int osdcmd_coop_view(CCmdFuncPtr parm)
void GameInterface::SwitchCoopView()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
if (ud.coop || ud.recstat == 2)
{
screenpeek = connectpoint2[screenpeek];
if (screenpeek == -1) screenpeek = 0;
}
return CCMD_OK;
}
static int osdcmd_show_weapon(CCmdFuncPtr parm)
void GameInterface::ToggleShowWeapon()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (ud.multimode > 1)
{
ud.showweapons = 1 - ud.showweapons;
cl_showweapon = ud.showweapons;
FTA(QUOTE_WEAPON_MODE_OFF - ud.showweapons, &ps[screenpeek]);
}
return CCMD_OK;
if (gamestate != GS_LEVEL) return;
cl_showweapon = cl_showweapon == 0;
FTA(QUOTE_WEAPON_MODE_OFF - cl_showweapon, &ps[screenpeek]);
}
int registerosdcommands(void)
{
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("third_person_view", "Switch to third person view", osdcmd_third_person_view);
C_RegisterFunction("coop_view", "Switch player to view from in coop", osdcmd_coop_view);
C_RegisterFunction("show_weapon", "Show opponents' weapons", osdcmd_show_weapon);
return 0;
}

View file

@ -291,7 +291,6 @@ static bool cheatItems(int player)
static bool cheatLevel(cheatseq_t *s)
{
lastlevel = 0;
int volnume,levnume;
volnume = s->Args[0] - '0' - 1;
levnume = (s->Args[1] - '0')*10+(s->Args[2]-'0') - 1;

View file

@ -59,6 +59,10 @@ struct GameInterface : public ::GameInterface
void LevelCompleted(MapRecord* map, int skill) override;
bool DrawAutomapPlayer(int x, int y, int z, int a) override;
int playerKeyMove() override { return 40; }
void WarpToCoords(int x, int y, int z, int a, int h) override;
void ToggleThirdPerson() override;
void SwitchCoopView() override;
void ToggleShowWeapon() override;
};

View file

@ -126,8 +126,8 @@ static void DoUserDef(bool bSet, int lVar1, int lLabelID, int lVar2, DDukeActor*
break;
case USERDEFS_SHOWWEAPONS:
if (bSet) ud.showweapons = lValue;
else SetGameVarID((int)lVar2, ud.showweapons, sActor, sPlayer);
// Read-only user state.
if (!bSet) SetGameVarID((int)lVar2, cl_showweapon, sActor, sPlayer);
break;
case USERDEFS_FROM_BONUS:

View file

@ -919,6 +919,7 @@ void enterlevel(MapRecord *mi, int gamemode)
ud.monsters_off = ud.m_monsters_off;
ud.coop = ud.m_coop;
ud.ffire = ud.m_ffire;
lastlevel = 0;
OnEvent(EVENT_ENTERLEVEL);
@ -994,7 +995,6 @@ void startnewgame(MapRecord* map, int skill)
newgame(map, skill, [=](bool)
{
enterlevel(map, 0);
ud.showweapons = cl_showweapon;
PlayerColorChanged();
inputState.ClearAllInput();
gameaction = ga_level;

View file

@ -126,7 +126,6 @@ struct user_defs
int levelclock;
unsigned char god, cashman, eog;
unsigned char clipping;
unsigned char showweapons;
unsigned char user_pals[MAXPLAYERS];
short from_bonus;

View file

@ -2186,6 +2186,9 @@ struct GameInterface : ::GameInterface
void NewGame(MapRecord *map, int skill) override;
bool DrawAutomapPlayer(int x, int y, int z, int a) override;
int playerKeyMove() override { return 35; }
void WarpToCoords(int x, int y, int z, int a, int h) override;
void ToggleThirdPerson() override;
void SwitchCoopView() override;
GameStats getStats() override;

View file

@ -48,26 +48,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_SW_NS
static int osdcmd_warptocoords(CCmdFuncPtr parm)
void GameInterface::WarpToCoords(int x, int y, int z, int ang, int horz)
{
if (parm->numparms < 3 || parm->numparms > 5)
return CCMD_SHOWHELP;
Player->oposx = Player->posx = x;
Player->oposy = Player->posy = y;
Player->oposz = Player->posz = z;
Player->oposx = Player->posx = atoi(parm->parms[0]);
Player->oposy = Player->posy = atoi(parm->parms[1]);
Player->oposz = Player->posz = atoi(parm->parms[2]);
if (parm->numparms >= 4)
if (ang != INT_MIN)
{
Player->angle.oang = Player->angle.ang = buildang(atoi(parm->parms[3]));
Player->angle.oang = Player->angle.ang = buildang(ang);
}
if (parm->numparms == 5)
if (horz != INT_MIN)
{
Player->horizon.ohoriz = Player->horizon.horiz = buildhoriz(atoi(parm->parms[4]));
Player->horizon.ohoriz = Player->horizon.horiz = buildhoriz(horz);
}
return CCMD_OK;
}
static int osdcmd_mirror(CCmdFuncPtr parm)
@ -100,9 +95,9 @@ static int osdcmd_mirror(CCmdFuncPtr parm)
return CCMD_OK;
}
static int osdcmd_third_person_view(CCmdFuncPtr parm)
void GameInterface::ToggleThirdPerson()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
auto pp = &Player[myconnectindex];
if (inputState.ShiftPressed())
{
@ -121,12 +116,11 @@ static int osdcmd_third_person_view(CCmdFuncPtr parm)
pp->camera_dist = 0;
}
}
return CCMD_OK;
}
static int osdcmd_coop_view(CCmdFuncPtr parm)
void GameInterface::SwitchCoopView()
{
if (gamestate != GS_LEVEL) return CCMD_OK;
if (gamestate != GS_LEVEL) return;
if (gNet.MultiGameType == MULTI_GAME_COOPERATIVE)
{
screenpeek = connectpoint2[screenpeek];
@ -148,23 +142,11 @@ static int osdcmd_coop_view(CCmdFuncPtr parm)
DoPlayerNightVisionPalette(tp);
}
}
return CCMD_OK;
}
static int osdcmd_noop(CCmdFuncPtr parm)
{
// this is for silencing key bindings only.
return CCMD_OK;
}
int32_t registerosdcommands(void)
{
C_RegisterFunction("mirror_debug", "mirror [mirrornum]: print mirror debug info", osdcmd_mirror);
C_RegisterFunction("warptocoords","warptocoords [x] [y] [z] [ang] (optional) [horiz] (optional): warps the player to the specified coordinates",osdcmd_warptocoords);
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_coop_view);
C_RegisterFunction("show_weapon", "Show opponents' weapons", osdcmd_noop);
return 0;
}