mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Lots of splitscreen fixes
LOTS of stuff I changed to use arrays instead of constantly duplicated code
This commit is contained in:
parent
0ec506127e
commit
a50a9a1843
18 changed files with 355 additions and 1199 deletions
|
|
@ -1826,9 +1826,6 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
||||||
if (!increment)
|
if (!increment)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*if (var == &cv_pointlimit && (gametype == GT_MATCH))
|
|
||||||
increment *= 50;*/
|
|
||||||
|
|
||||||
if (var == &cv_forceskin) // Special handling.
|
if (var == &cv_forceskin) // Special handling.
|
||||||
{
|
{
|
||||||
INT32 oldvalue = var->value;
|
INT32 oldvalue = var->value;
|
||||||
|
|
@ -1914,13 +1911,8 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
||||||
|
|
||||||
if (newindice >= max || newindice <= MAXVAL)
|
if (newindice >= max || newindice <= MAXVAL)
|
||||||
{
|
{
|
||||||
/*if (var == &cv_pointlimit && (gametype == GT_MATCH) && increment > 0)
|
newvalue = var->PossibleValue[((increment > 0) ? MINVAL : MAXVAL)].value;
|
||||||
CV_SetValue(var, 50);
|
CV_SetValue(var, newvalue);
|
||||||
else*/
|
|
||||||
{
|
|
||||||
newvalue = var->PossibleValue[((increment > 0) ? MINVAL : MAXVAL)].value;
|
|
||||||
CV_SetValue(var, newvalue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
CV_Set(var, var->PossibleValue[newindice].strvalue);
|
CV_Set(var, var->PossibleValue[newindice].strvalue);
|
||||||
|
|
|
||||||
182
src/d_clisrv.c
182
src/d_clisrv.c
|
|
@ -52,7 +52,7 @@
|
||||||
#include "k_pwrlv.h"
|
#include "k_pwrlv.h"
|
||||||
#include "k_bot.h"
|
#include "k_bot.h"
|
||||||
|
|
||||||
#if (defined(CLIENT_LOADINGSCREEN) && !defined(NONET))
|
#ifndef NONET
|
||||||
// cl loading screen
|
// cl loading screen
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
#include "f_finale.h"
|
#include "f_finale.h"
|
||||||
|
|
@ -138,18 +138,12 @@ UINT8 adminpassmd5[16];
|
||||||
boolean adminpasswordset = false;
|
boolean adminpasswordset = false;
|
||||||
|
|
||||||
// Client specific
|
// Client specific
|
||||||
static ticcmd_t localcmds;
|
static ticcmd_t localcmds[MAXSPLITSCREENPLAYERS];
|
||||||
static ticcmd_t localcmds2;
|
|
||||||
static ticcmd_t localcmds3;
|
|
||||||
static ticcmd_t localcmds4;
|
|
||||||
static boolean cl_packetmissed;
|
static boolean cl_packetmissed;
|
||||||
// here it is for the secondary local player (splitscreen)
|
// here it is for the secondary local player (splitscreen)
|
||||||
static UINT8 mynode; // my address pointofview server
|
static UINT8 mynode; // my address pointofview server
|
||||||
|
|
||||||
static UINT8 localtextcmd[MAXTEXTCMD];
|
static UINT8 localtextcmd[MAXSPLITSCREENPLAYERS][MAXTEXTCMD];
|
||||||
static UINT8 localtextcmd2[MAXTEXTCMD]; // splitscreen
|
|
||||||
static UINT8 localtextcmd3[MAXTEXTCMD]; // splitscreen == 2
|
|
||||||
static UINT8 localtextcmd4[MAXTEXTCMD]; // splitscreen == 3
|
|
||||||
static tic_t neededtic;
|
static tic_t neededtic;
|
||||||
SINT8 servernode = 0; // the number of the server node
|
SINT8 servernode = 0; // the number of the server node
|
||||||
char connectedservername[MAXSERVERNAME];
|
char connectedservername[MAXSERVERNAME];
|
||||||
|
|
@ -258,76 +252,27 @@ void RegisterNetXCmd(netxcmd_t id, void (*cmd_f)(UINT8 **p, INT32 playernum))
|
||||||
listnetxcmd[id] = cmd_f;
|
listnetxcmd[id] = cmd_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendNetXCmd(netxcmd_t id, const void *param, size_t nparam)
|
void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_t nparam)
|
||||||
{
|
{
|
||||||
if (localtextcmd[0]+2+nparam > MAXTEXTCMD)
|
if (localtextcmd[playerid][0]+2+nparam > MAXTEXTCMD)
|
||||||
{
|
{
|
||||||
// for future reference: if (cv_debug) != debug disabled.
|
// for future reference: if (cv_debug) != debug disabled.
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("NetXCmd buffer full, cannot add netcmd %d! (size: %d, needed: %s)\n"), id, localtextcmd[0], sizeu1(nparam));
|
CONS_Alert(CONS_ERROR, M_GetText("NetXCmd buffer full, cannot add netcmd %d! (size: %d, needed: %s)\n"), id, localtextcmd[0][0], sizeu1(nparam));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
localtextcmd[0]++;
|
localtextcmd[playerid][0]++;
|
||||||
localtextcmd[localtextcmd[0]] = (UINT8)id;
|
localtextcmd[playerid][localtextcmd[playerid][0]] = (UINT8)id;
|
||||||
if (param && nparam)
|
if (param && nparam)
|
||||||
{
|
{
|
||||||
M_Memcpy(&localtextcmd[localtextcmd[0]+1], param, nparam);
|
M_Memcpy(&localtextcmd[playerid][localtextcmd[playerid][0]+1], param, nparam);
|
||||||
localtextcmd[0] = (UINT8)(localtextcmd[0] + (UINT8)nparam);
|
localtextcmd[playerid][0] = (UINT8)(localtextcmd[playerid][0] + (UINT8)nparam);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// splitscreen player
|
|
||||||
void SendNetXCmd2(netxcmd_t id, const void *param, size_t nparam)
|
|
||||||
{
|
|
||||||
if (localtextcmd2[0]+2+nparam > MAXTEXTCMD)
|
|
||||||
{
|
|
||||||
I_Error("No more place in the buffer for netcmd %d\n",id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
localtextcmd2[0]++;
|
|
||||||
localtextcmd2[localtextcmd2[0]] = (UINT8)id;
|
|
||||||
if (param && nparam)
|
|
||||||
{
|
|
||||||
M_Memcpy(&localtextcmd2[localtextcmd2[0]+1], param, nparam);
|
|
||||||
localtextcmd2[0] = (UINT8)(localtextcmd2[0] + (UINT8)nparam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendNetXCmd3(netxcmd_t id, const void *param, size_t nparam)
|
|
||||||
{
|
|
||||||
if (localtextcmd3[0]+2+nparam > MAXTEXTCMD)
|
|
||||||
{
|
|
||||||
I_Error("No more place in the buffer for netcmd %d\n",id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
localtextcmd3[0]++;
|
|
||||||
localtextcmd3[localtextcmd3[0]] = (UINT8)id;
|
|
||||||
if (param && nparam)
|
|
||||||
{
|
|
||||||
M_Memcpy(&localtextcmd3[localtextcmd3[0]+1], param, nparam);
|
|
||||||
localtextcmd3[0] = (UINT8)(localtextcmd3[0] + (UINT8)nparam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendNetXCmd4(netxcmd_t id, const void *param, size_t nparam)
|
|
||||||
{
|
|
||||||
if (localtextcmd4[0]+2+nparam > MAXTEXTCMD)
|
|
||||||
{
|
|
||||||
I_Error("No more place in the buffer for netcmd %d\n",id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
localtextcmd4[0]++;
|
|
||||||
localtextcmd4[localtextcmd4[0]] = (UINT8)id;
|
|
||||||
if (param && nparam)
|
|
||||||
{
|
|
||||||
M_Memcpy(&localtextcmd4[localtextcmd4[0]+1], param, nparam);
|
|
||||||
localtextcmd4[0] = (UINT8)(localtextcmd4[0] + (UINT8)nparam);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT8 GetFreeXCmdSize(void)
|
UINT8 GetFreeXCmdSize(void)
|
||||||
{
|
{
|
||||||
// -1 for the size and another -1 for the ID.
|
// -1 for the size and another -1 for the ID.
|
||||||
return (UINT8)(localtextcmd[0] - 2);
|
return (UINT8)(localtextcmd[0][0] - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Frees all textcmd memory for the specified tic
|
// Frees all textcmd memory for the specified tic
|
||||||
|
|
@ -488,10 +433,8 @@ void D_ResetTiccmds(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
memset(&localcmds, 0, sizeof(ticcmd_t));
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||||
memset(&localcmds2, 0, sizeof(ticcmd_t));
|
memset(&localcmds[i], 0, sizeof(ticcmd_t));
|
||||||
memset(&localcmds3, 0, sizeof(ticcmd_t));
|
|
||||||
memset(&localcmds4, 0, sizeof(ticcmd_t));
|
|
||||||
|
|
||||||
// Reset the net command list
|
// Reset the net command list
|
||||||
for (i = 0; i < TEXTCMD_HASH_SIZE; i++)
|
for (i = 0; i < TEXTCMD_HASH_SIZE; i++)
|
||||||
|
|
@ -1197,7 +1140,7 @@ static void CV_LoadPlayerNames(UINT8 **p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(CLIENT_LOADINGSCREEN) && !defined(NONET))
|
#ifndef NONET
|
||||||
|
|
||||||
//
|
//
|
||||||
// CL_DrawConnectionStatus
|
// CL_DrawConnectionStatus
|
||||||
|
|
@ -1344,6 +1287,8 @@ static boolean CL_AskFileList(INT32 firstfile)
|
||||||
static boolean CL_SendJoin(void)
|
static boolean CL_SendJoin(void)
|
||||||
{
|
{
|
||||||
UINT8 localplayers = 1;
|
UINT8 localplayers = 1;
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
if (netgame)
|
if (netgame)
|
||||||
CONS_Printf(M_GetText("Sending join request...\n"));
|
CONS_Printf(M_GetText("Sending join request...\n"));
|
||||||
netbuffer->packettype = PT_CLIENTJOIN;
|
netbuffer->packettype = PT_CLIENTJOIN;
|
||||||
|
|
@ -1359,12 +1304,11 @@ static boolean CL_SendJoin(void)
|
||||||
strncpy(netbuffer->u.clientcfg.application, SRB2APPLICATION,
|
strncpy(netbuffer->u.clientcfg.application, SRB2APPLICATION,
|
||||||
sizeof netbuffer->u.clientcfg.application);
|
sizeof netbuffer->u.clientcfg.application);
|
||||||
|
|
||||||
CleanupPlayerName(consoleplayer, cv_playername.zstring);
|
for (i = 0; i <= splitscreen; i++)
|
||||||
if (splitscreen)
|
CleanupPlayerName(g_localplayers[i], cv_playername[i].zstring);
|
||||||
CleanupPlayerName(1, cv_playername2.zstring);/* 1 is a HACK? oh no */
|
|
||||||
|
|
||||||
strncpy(netbuffer->u.clientcfg.names[0], cv_playername.zstring, MAXPLAYERNAME);
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||||
strncpy(netbuffer->u.clientcfg.names[1], cv_playername2.zstring, MAXPLAYERNAME);
|
strncpy(netbuffer->u.clientcfg.names[i], cv_playername[i].zstring, MAXPLAYERNAME);
|
||||||
|
|
||||||
return HSendPacket(servernode, false, 0, sizeof (clientconfig_pak));
|
return HSendPacket(servernode, false, 0, sizeof (clientconfig_pak));
|
||||||
}
|
}
|
||||||
|
|
@ -2808,7 +2752,7 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
|
||||||
if (!playeringame[playernum])
|
if (!playeringame[playernum])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (server && !demoplayback && playernode[playernum] != UINT8_MAX && !players[playernum].bot)
|
if (server && !demo.playback && playernode[playernum] != UINT8_MAX && !players[playernum].bot)
|
||||||
{
|
{
|
||||||
INT32 node = playernode[playernum];
|
INT32 node = playernode[playernum];
|
||||||
//playerpernode[node] = 0; // It'd be better to remove them all at once, but ghosting happened, so continue to let CL_RemovePlayer do it one-by-one
|
//playerpernode[node] = 0; // It'd be better to remove them all at once, but ghosting happened, so continue to let CL_RemovePlayer do it one-by-one
|
||||||
|
|
@ -2832,12 +2776,12 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
|
||||||
LUAh_PlayerQuit(&players[playernum], reason); // Lua hook for player quitting
|
LUAh_PlayerQuit(&players[playernum], reason); // Lua hook for player quitting
|
||||||
|
|
||||||
// don't look through someone's view who isn't there
|
// don't look through someone's view who isn't there
|
||||||
if (playernum == displayplayer)
|
if (playernum == displayplayers[0])
|
||||||
{
|
{
|
||||||
// Call ViewpointSwitch hooks here.
|
// Call ViewpointSwitch hooks here.
|
||||||
// The viewpoint was forcibly changed.
|
// The viewpoint was forcibly changed.
|
||||||
LUAh_ViewpointSwitch(&players[consoleplayer], &players[consoleplayer], true);
|
LUAh_ViewpointSwitch(&players[consoleplayer], &players[consoleplayer], true);
|
||||||
displayplayer = consoleplayer;
|
displayplayers[0] = consoleplayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_RemovePartyMember(playernum);
|
G_RemovePartyMember(playernum);
|
||||||
|
|
@ -3724,7 +3668,7 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
|
||||||
{
|
{
|
||||||
if (newplayer->mo)
|
if (newplayer->mo)
|
||||||
{
|
{
|
||||||
newplayer->viewheight = 41*newplayer->height/48;
|
newplayer->viewheight = P_GetPlayerViewHeight(newplayer);
|
||||||
|
|
||||||
if (newplayer->mo->eflags & MFE_VERTICALFLIP)
|
if (newplayer->mo->eflags & MFE_VERTICALFLIP)
|
||||||
newplayer->viewz = newplayer->mo->z + newplayer->mo->height - newplayer->viewheight;
|
newplayer->viewz = newplayer->mo->z + newplayer->mo->height - newplayer->viewheight;
|
||||||
|
|
@ -3919,22 +3863,22 @@ static boolean SV_AddWaitingPlayers(const char *name, const char *name2, const c
|
||||||
if (playerpernode[node] < 1)
|
if (playerpernode[node] < 1)
|
||||||
{
|
{
|
||||||
nodetoplayer[node] = newplayernum;
|
nodetoplayer[node] = newplayernum;
|
||||||
WRITESTRINGN(p, name, MAXPLAYERNAME);
|
WRITESTRINGN(buf_p, name, MAXPLAYERNAME);
|
||||||
}
|
}
|
||||||
else if (playerpernode[node] < 2)
|
else if (playerpernode[node] < 2)
|
||||||
{
|
{
|
||||||
nodetoplayer2[node] = newplayernum;
|
nodetoplayer2[node] = newplayernum;
|
||||||
WRITESTRINGN(p, name2, MAXPLAYERNAME);
|
WRITESTRINGN(buf_p, name2, MAXPLAYERNAME);
|
||||||
}
|
}
|
||||||
else if (playerpernode[node] < 3)
|
else if (playerpernode[node] < 3)
|
||||||
{
|
{
|
||||||
nodetoplayer3[node] = newplayernum;
|
nodetoplayer3[node] = newplayernum;
|
||||||
WRITESTRINGN(p, name3, MAXPLAYERNAME);
|
WRITESTRINGN(buf_p, name3, MAXPLAYERNAME);
|
||||||
}
|
}
|
||||||
else if (playerpernode[node] < 4)
|
else if (playerpernode[node] < 4)
|
||||||
{
|
{
|
||||||
nodetoplayer4[node] = newplayernum;
|
nodetoplayer4[node] = newplayernum;
|
||||||
WRITESTRINGN(p, name4, MAXPLAYERNAME);
|
WRITESTRINGN(buf_p, name4, MAXPLAYERNAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITEUINT8(buf_p, nodetoplayer[node]); // consoleplayer
|
WRITEUINT8(buf_p, nodetoplayer[node]); // consoleplayer
|
||||||
|
|
@ -4001,7 +3945,7 @@ boolean SV_SpawnServer(void)
|
||||||
else doomcom->numslots = 1;
|
else doomcom->numslots = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SV_AddWaitingPlayers(cv_playername.zstring, cv_playername2.zstring, cv_playername3.zstring, cv_playername4.zstring);
|
return SV_AddWaitingPlayers(cv_playername[0].zstring, cv_playername[1].zstring, cv_playername[2].zstring, cv_playername[3].zstring);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4015,10 +3959,10 @@ void SV_StopServer(void)
|
||||||
Y_EndVote();
|
Y_EndVote();
|
||||||
gamestate = wipegamestate = GS_NULL;
|
gamestate = wipegamestate = GS_NULL;
|
||||||
|
|
||||||
localtextcmd[0] = 0;
|
localtextcmd[0][0] = 0;
|
||||||
localtextcmd2[0] = 0;
|
localtextcmd[1][0] = 0;
|
||||||
localtextcmd3[0] = 0;
|
localtextcmd[2][0] = 0;
|
||||||
localtextcmd4[0] = 0;
|
localtextcmd[3][0] = 0;
|
||||||
|
|
||||||
for (i = firstticstosend; i < firstticstosend + TICQUEUE; i++)
|
for (i = firstticstosend; i < firstticstosend + TICQUEUE; i++)
|
||||||
D_Clearticcmd(i);
|
D_Clearticcmd(i);
|
||||||
|
|
@ -4039,7 +3983,7 @@ void SV_StartSinglePlayerServer(void)
|
||||||
|
|
||||||
if (modeattacking == ATTACKING_CAPSULES)
|
if (modeattacking == ATTACKING_CAPSULES)
|
||||||
{
|
{
|
||||||
G_SetGametype(GT_MATCH);
|
G_SetGametype(BT_BATTLE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -4181,7 +4125,7 @@ static void HandleConnect(SINT8 node)
|
||||||
SV_SendSaveGame(node); // send a complete game state
|
SV_SendSaveGame(node); // send a complete game state
|
||||||
DEBFILE("send savegame\n");
|
DEBFILE("send savegame\n");
|
||||||
}
|
}
|
||||||
SV_AddWaitingPlayers(names[0], names[1]);
|
SV_AddWaitingPlayers(names[0], names[1], names[2], names[3]);
|
||||||
joindelay += cv_joindelay.value * TICRATE;
|
joindelay += cv_joindelay.value * TICRATE;
|
||||||
player_joining = true;
|
player_joining = true;
|
||||||
}
|
}
|
||||||
|
|
@ -5282,26 +5226,26 @@ static void CL_SendClientCmd(void)
|
||||||
else if (gamestate != GS_NULL && (addedtogame || dedicated))
|
else if (gamestate != GS_NULL && (addedtogame || dedicated))
|
||||||
{
|
{
|
||||||
packetsize = sizeof (clientcmd_pak);
|
packetsize = sizeof (clientcmd_pak);
|
||||||
G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds, 1);
|
G_MoveTiccmd(&netbuffer->u.clientpak.cmd, &localcmds[0], 1);
|
||||||
netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic%TICQUEUE]);
|
netbuffer->u.clientpak.consistancy = SHORT(consistancy[gametic%TICQUEUE]);
|
||||||
|
|
||||||
if (splitscreen) // Send a special packet with 2 cmd for splitscreen
|
if (splitscreen) // Send a special packet with 2 cmd for splitscreen
|
||||||
{
|
{
|
||||||
netbuffer->packettype = (mis ? PT_CLIENT2MIS : PT_CLIENT2CMD);
|
netbuffer->packettype = (mis ? PT_CLIENT2MIS : PT_CLIENT2CMD);
|
||||||
packetsize = sizeof (client2cmd_pak);
|
packetsize = sizeof (client2cmd_pak);
|
||||||
G_MoveTiccmd(&netbuffer->u.client2pak.cmd2, &localcmds2, 1);
|
G_MoveTiccmd(&netbuffer->u.client2pak.cmd2, &localcmds[1], 1);
|
||||||
|
|
||||||
if (splitscreen > 1)
|
if (splitscreen > 1)
|
||||||
{
|
{
|
||||||
netbuffer->packettype = (mis ? PT_CLIENT3MIS : PT_CLIENT3CMD);
|
netbuffer->packettype = (mis ? PT_CLIENT3MIS : PT_CLIENT3CMD);
|
||||||
packetsize = sizeof (client3cmd_pak);
|
packetsize = sizeof (client3cmd_pak);
|
||||||
G_MoveTiccmd(&netbuffer->u.client3pak.cmd3, &localcmds3, 1);
|
G_MoveTiccmd(&netbuffer->u.client3pak.cmd3, &localcmds[2], 1);
|
||||||
|
|
||||||
if (splitscreen > 2)
|
if (splitscreen > 2)
|
||||||
{
|
{
|
||||||
netbuffer->packettype = (mis ? PT_CLIENT4MIS : PT_CLIENT4CMD);
|
netbuffer->packettype = (mis ? PT_CLIENT4MIS : PT_CLIENT4CMD);
|
||||||
packetsize = sizeof (client4cmd_pak);
|
packetsize = sizeof (client4cmd_pak);
|
||||||
G_MoveTiccmd(&netbuffer->u.client4pak.cmd4, &localcmds4, 1);
|
G_MoveTiccmd(&netbuffer->u.client4pak.cmd4, &localcmds[3], 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5312,43 +5256,43 @@ static void CL_SendClientCmd(void)
|
||||||
if (cl_mode == CL_CONNECTED || dedicated)
|
if (cl_mode == CL_CONNECTED || dedicated)
|
||||||
{
|
{
|
||||||
// Send extra data if needed
|
// Send extra data if needed
|
||||||
if (localtextcmd[0])
|
if (localtextcmd[0][0])
|
||||||
{
|
{
|
||||||
netbuffer->packettype = PT_TEXTCMD;
|
netbuffer->packettype = PT_TEXTCMD;
|
||||||
M_Memcpy(netbuffer->u.textcmd,localtextcmd, localtextcmd[0]+1);
|
M_Memcpy(netbuffer->u.textcmd,localtextcmd[0], localtextcmd[0][0]+1);
|
||||||
// All extra data have been sent
|
// All extra data have been sent
|
||||||
if (HSendPacket(servernode, true, 0, localtextcmd[0]+1)) // Send can fail...
|
if (HSendPacket(servernode, true, 0, localtextcmd[0][0]+1)) // Send can fail...
|
||||||
localtextcmd[0] = 0;
|
localtextcmd[0][0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send extra data if needed for player 2 (splitscreen == 1)
|
// Send extra data if needed for player 2 (splitscreen == 1)
|
||||||
if (localtextcmd2[0])
|
if (localtextcmd[1][0])
|
||||||
{
|
{
|
||||||
netbuffer->packettype = PT_TEXTCMD2;
|
netbuffer->packettype = PT_TEXTCMD2;
|
||||||
M_Memcpy(netbuffer->u.textcmd, localtextcmd2, localtextcmd2[0]+1);
|
M_Memcpy(netbuffer->u.textcmd, localtextcmd[1], localtextcmd[1][0]+1);
|
||||||
// All extra data have been sent
|
// All extra data have been sent
|
||||||
if (HSendPacket(servernode, true, 0, localtextcmd2[0]+1)) // Send can fail...
|
if (HSendPacket(servernode, true, 0, localtextcmd[1][0]+1)) // Send can fail...
|
||||||
localtextcmd2[0] = 0;
|
localtextcmd[1][0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send extra data if needed for player 3 (splitscreen == 2)
|
// Send extra data if needed for player 3 (splitscreen == 2)
|
||||||
if (localtextcmd3[0])
|
if (localtextcmd[2][0])
|
||||||
{
|
{
|
||||||
netbuffer->packettype = PT_TEXTCMD3;
|
netbuffer->packettype = PT_TEXTCMD3;
|
||||||
M_Memcpy(netbuffer->u.textcmd, localtextcmd3, localtextcmd3[0]+1);
|
M_Memcpy(netbuffer->u.textcmd, localtextcmd[2], localtextcmd[2][0]+1);
|
||||||
// All extra data have been sent
|
// All extra data have been sent
|
||||||
if (HSendPacket(servernode, true, 0, localtextcmd3[0]+1)) // Send can fail...
|
if (HSendPacket(servernode, true, 0, localtextcmd[2][0]+1)) // Send can fail...
|
||||||
localtextcmd3[0] = 0;
|
localtextcmd[2][0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send extra data if needed for player 4 (splitscreen == 3)
|
// Send extra data if needed for player 4 (splitscreen == 3)
|
||||||
if (localtextcmd4[0])
|
if (localtextcmd[3][0])
|
||||||
{
|
{
|
||||||
netbuffer->packettype = PT_TEXTCMD4;
|
netbuffer->packettype = PT_TEXTCMD4;
|
||||||
M_Memcpy(netbuffer->u.textcmd, localtextcmd4, localtextcmd4[0]+1);
|
M_Memcpy(netbuffer->u.textcmd, localtextcmd[3], localtextcmd[3][0]+1);
|
||||||
// All extra data have been sent
|
// All extra data have been sent
|
||||||
if (HSendPacket(servernode, true, 0, localtextcmd4[0]+1)) // Send can fail...
|
if (HSendPacket(servernode, true, 0, localtextcmd[3][0]+1)) // Send can fail...
|
||||||
localtextcmd4[0] = 0;
|
localtextcmd[3][0] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5485,23 +5429,23 @@ static void Local_Maketic(INT32 realtics)
|
||||||
if (!dedicated) rendergametic = gametic;
|
if (!dedicated) rendergametic = gametic;
|
||||||
|
|
||||||
// translate inputs (keyboard/mouse/joystick) into game controls
|
// translate inputs (keyboard/mouse/joystick) into game controls
|
||||||
G_BuildTiccmd(&localcmds, realtics, 1);
|
G_BuildTiccmd(&localcmds[0], realtics, 1);
|
||||||
localcmds.angleturn |= TICCMD_RECEIVED;
|
localcmds[0].angleturn |= TICCMD_RECEIVED;
|
||||||
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
G_BuildTiccmd(&localcmds2, realtics, 2);
|
G_BuildTiccmd(&localcmds[1], realtics, 2);
|
||||||
localcmds2.angleturn |= TICCMD_RECEIVED;
|
localcmds[1].angleturn |= TICCMD_RECEIVED;
|
||||||
|
|
||||||
if (splitscreen > 1)
|
if (splitscreen > 1)
|
||||||
{
|
{
|
||||||
G_BuildTiccmd(&localcmds3, realtics, 3);
|
G_BuildTiccmd(&localcmds[2], realtics, 3);
|
||||||
localcmds3.angleturn |= TICCMD_RECEIVED;
|
localcmds[2].angleturn |= TICCMD_RECEIVED;
|
||||||
|
|
||||||
if (splitscreen > 2)
|
if (splitscreen > 2)
|
||||||
{
|
{
|
||||||
G_BuildTiccmd(&localcmds4, realtics, 4);
|
G_BuildTiccmd(&localcmds[3], realtics, 4);
|
||||||
localcmds4.angleturn |= TICCMD_RECEIVED;
|
localcmds[3].angleturn |= TICCMD_RECEIVED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -618,10 +618,8 @@ void D_ClientServerInit(void);
|
||||||
|
|
||||||
// Initialise the other field
|
// Initialise the other field
|
||||||
void RegisterNetXCmd(netxcmd_t id, void (*cmd_f)(UINT8 **p, INT32 playernum));
|
void RegisterNetXCmd(netxcmd_t id, void (*cmd_f)(UINT8 **p, INT32 playernum));
|
||||||
void SendNetXCmd(netxcmd_t id, const void *param, size_t nparam);
|
void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_t nparam);
|
||||||
void SendNetXCmd2(netxcmd_t id, const void *param, size_t nparam); // splitsreen player
|
#define SendNetXCmd(id, param, nparam) SendNetXCmdForPlayer(0, id, param, nparam) // Shortcut for P1
|
||||||
void SendNetXCmd3(netxcmd_t id, const void *param, size_t nparam); // splitsreen3 player
|
|
||||||
void SendNetXCmd4(netxcmd_t id, const void *param, size_t nparam); // splitsreen4 player
|
|
||||||
void SendKick(UINT8 playernum, UINT8 msg);
|
void SendKick(UINT8 playernum, UINT8 msg);
|
||||||
|
|
||||||
// Create any new ticcmds and broadcast to other players.
|
// Create any new ticcmds and broadcast to other players.
|
||||||
|
|
@ -636,7 +634,7 @@ void CL_AddSplitscreenPlayer(void);
|
||||||
void CL_RemoveSplitscreenPlayer(UINT8 p);
|
void CL_RemoveSplitscreenPlayer(UINT8 p);
|
||||||
void CL_Reset(void);
|
void CL_Reset(void);
|
||||||
void CL_ClearPlayer(INT32 playernum);
|
void CL_ClearPlayer(INT32 playernum);
|
||||||
void CL_RemovePlayer(INT32 playernum, INT32 reason);
|
void CL_RemovePlayer(INT32 playernum, kickreason_t reason);
|
||||||
void CL_QueryServerList(msg_server_t *list);
|
void CL_QueryServerList(msg_server_t *list);
|
||||||
void CL_UpdateServerList(boolean internetsearch, INT32 room);
|
void CL_UpdateServerList(boolean internetsearch, INT32 room);
|
||||||
// Is there a game running
|
// Is there a game running
|
||||||
|
|
|
||||||
1116
src/d_netcmd.c
1116
src/d_netcmd.c
File diff suppressed because it is too large
Load diff
|
|
@ -18,21 +18,9 @@
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
|
||||||
// console vars
|
// console vars
|
||||||
extern consvar_t cv_playername;
|
extern consvar_t cv_playername[MAXSPLITSCREENPLAYERS];
|
||||||
extern consvar_t cv_playercolor;
|
extern consvar_t cv_playercolor[MAXSPLITSCREENPLAYERS];
|
||||||
extern consvar_t cv_skin;
|
extern consvar_t cv_skin[MAXSPLITSCREENPLAYERS];
|
||||||
// secondary splitscreen player
|
|
||||||
extern consvar_t cv_playername2;
|
|
||||||
extern consvar_t cv_playercolor2;
|
|
||||||
extern consvar_t cv_skin2;
|
|
||||||
// third splitscreen player
|
|
||||||
extern consvar_t cv_playername3;
|
|
||||||
extern consvar_t cv_playercolor3;
|
|
||||||
extern consvar_t cv_skin3;
|
|
||||||
// fourth splitscreen player
|
|
||||||
extern consvar_t cv_playername4;
|
|
||||||
extern consvar_t cv_playercolor4;
|
|
||||||
extern consvar_t cv_skin4;
|
|
||||||
// preferred number of players
|
// preferred number of players
|
||||||
extern consvar_t cv_splitplayers;
|
extern consvar_t cv_splitplayers;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11269,7 +11269,7 @@ struct {
|
||||||
|
|
||||||
// Gametypes, for use with global var "gametype"
|
// Gametypes, for use with global var "gametype"
|
||||||
{"GT_RACE",GT_RACE},
|
{"GT_RACE",GT_RACE},
|
||||||
{"GT_MATCH",GT_MATCH},
|
{"GT_BATTLE",GT_BATTLE},
|
||||||
|
|
||||||
// for P_DamageMobj
|
// for P_DamageMobj
|
||||||
//// Damage types
|
//// Damage types
|
||||||
|
|
|
||||||
12
src/g_demo.c
12
src/g_demo.c
|
|
@ -1878,7 +1878,7 @@ void G_RecordDemo(const char *name)
|
||||||
demobuffer = malloc(maxsize);
|
demobuffer = malloc(maxsize);
|
||||||
demoend = demobuffer + maxsize;
|
demoend = demobuffer + maxsize;
|
||||||
|
|
||||||
demorecording = true;
|
demo.recording = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void G_RecordMetal(void)
|
void G_RecordMetal(void)
|
||||||
|
|
@ -2712,8 +2712,8 @@ void G_DoPlayDemo(char *defdemoname)
|
||||||
M_StartMessage(msg, NULL, MM_NOTHING);
|
M_StartMessage(msg, NULL, MM_NOTHING);
|
||||||
Z_Free(pdemoname);
|
Z_Free(pdemoname);
|
||||||
Z_Free(demobuffer);
|
Z_Free(demobuffer);
|
||||||
demoplayback = false;
|
demo.playback = false;
|
||||||
titledemo = false;
|
demo.title = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
demo_p += 12; // DEMOHEADER
|
demo_p += 12; // DEMOHEADER
|
||||||
|
|
@ -2732,8 +2732,8 @@ void G_DoPlayDemo(char *defdemoname)
|
||||||
M_StartMessage(msg, NULL, MM_NOTHING);
|
M_StartMessage(msg, NULL, MM_NOTHING);
|
||||||
Z_Free(pdemoname);
|
Z_Free(pdemoname);
|
||||||
Z_Free(demobuffer);
|
Z_Free(demobuffer);
|
||||||
demoplayback = false;
|
demo.playback = false;
|
||||||
titledemo = false;
|
demo.title = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3530,7 +3530,7 @@ static void G_StopDemoRecording(void)
|
||||||
saved = FIL_WriteFile(va(pandf, srb2home, demoname), demobuffer, demo_p - demobuffer); // finally output the file.
|
saved = FIL_WriteFile(va(pandf, srb2home, demoname), demobuffer, demo_p - demobuffer); // finally output the file.
|
||||||
}
|
}
|
||||||
free(demobuffer);
|
free(demobuffer);
|
||||||
demorecording = false;
|
demo.recording = false;
|
||||||
|
|
||||||
if (modeattacking != ATTACKING_RECORD)
|
if (modeattacking != ATTACKING_RECORD)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
57
src/g_game.c
57
src/g_game.c
|
|
@ -1543,7 +1543,7 @@ boolean G_Responder(event_t *ev)
|
||||||
|| ev->data1 == gamecontrol[0][gc_pause][1]
|
|| ev->data1 == gamecontrol[0][gc_pause][1]
|
||||||
|| ev->data1 == KEY_PAUSE)
|
|| ev->data1 == KEY_PAUSE)
|
||||||
{
|
{
|
||||||
if (modeattacking && !demoplayback && (gamestate == GS_LEVEL))
|
if (modeattacking && !demo.playback && (gamestate == GS_LEVEL))
|
||||||
{
|
{
|
||||||
pausebreakkey = (ev->data1 == KEY_PAUSE);
|
pausebreakkey = (ev->data1 == KEY_PAUSE);
|
||||||
if (menuactive || pausedelay < 0 || leveltime < 2)
|
if (menuactive || pausedelay < 0 || leveltime < 2)
|
||||||
|
|
@ -3028,60 +3028,20 @@ void G_SetGametypeDescription(INT16 gtype, char *descriptiontext, UINT8 leftcolo
|
||||||
// Gametype rankings
|
// Gametype rankings
|
||||||
INT16 gametyperankings[NUMGAMETYPES] =
|
INT16 gametyperankings[NUMGAMETYPES] =
|
||||||
{
|
{
|
||||||
GT_COOP,
|
|
||||||
GT_COMPETITION,
|
|
||||||
GT_RACE,
|
GT_RACE,
|
||||||
|
GT_BATTLE,
|
||||||
GT_MATCH,
|
|
||||||
GT_TEAMMATCH,
|
|
||||||
|
|
||||||
GT_TAG,
|
|
||||||
GT_HIDEANDSEEK,
|
|
||||||
|
|
||||||
GT_CTF,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Gametype to TOL (Type Of Level)
|
// Gametype to TOL (Type Of Level)
|
||||||
UINT32 gametypetol[NUMGAMETYPES] =
|
UINT32 gametypetol[NUMGAMETYPES] =
|
||||||
{
|
{
|
||||||
TOL_COOP, // Co-op
|
|
||||||
TOL_COMPETITION, // Competition
|
|
||||||
TOL_RACE, // Race
|
TOL_RACE, // Race
|
||||||
|
TOL_BATTLE, // Battle
|
||||||
TOL_MATCH, // Match
|
|
||||||
TOL_MATCH, // Team Match
|
|
||||||
|
|
||||||
TOL_TAG, // Tag
|
|
||||||
TOL_TAG, // Hide and Seek
|
|
||||||
|
|
||||||
TOL_CTF, // CTF
|
|
||||||
};
|
};
|
||||||
|
|
||||||
tolinfo_t TYPEOFLEVEL[NUMTOLNAMES] = {
|
tolinfo_t TYPEOFLEVEL[NUMTOLNAMES] = {
|
||||||
{"SOLO",TOL_SP},
|
|
||||||
{"SP",TOL_SP},
|
|
||||||
{"SINGLEPLAYER",TOL_SP},
|
|
||||||
{"SINGLE",TOL_SP},
|
|
||||||
|
|
||||||
{"COOP",TOL_COOP},
|
|
||||||
{"CO-OP",TOL_COOP},
|
|
||||||
|
|
||||||
{"COMPETITION",TOL_COMPETITION},
|
|
||||||
{"RACE",TOL_RACE},
|
{"RACE",TOL_RACE},
|
||||||
|
{"BATTLE",TOL_BATTLE},
|
||||||
{"MATCH",TOL_MATCH},
|
|
||||||
{"TAG",TOL_TAG},
|
|
||||||
{"CTF",TOL_CTF},
|
|
||||||
|
|
||||||
{"2D",TOL_2D},
|
|
||||||
{"MARIO",TOL_MARIO},
|
|
||||||
{"NIGHTS",TOL_NIGHTS},
|
|
||||||
{"OLDBRAK",TOL_ERZ3},
|
|
||||||
|
|
||||||
{"XMAS",TOL_XMAS},
|
|
||||||
{"CHRISTMAS",TOL_XMAS},
|
|
||||||
{"WINTER",TOL_XMAS},
|
|
||||||
|
|
||||||
{NULL, 0}
|
{NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -3537,11 +3497,10 @@ void G_AddMapToBuffer(INT16 map)
|
||||||
//
|
//
|
||||||
static void G_UpdateVisited(void)
|
static void G_UpdateVisited(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
boolean spec = G_IsSpecialStage(gamemap);
|
boolean spec = G_IsSpecialStage(gamemap);
|
||||||
// Update visitation flags?
|
// Update visitation flags?
|
||||||
if ((!modifiedgame || savemoddata) // Not modified
|
if ((!modifiedgame || savemoddata) // Not modified
|
||||||
&& !multiplayer && !demoplayback && (gametype == GT_COOP) // SP/RA/NiGHTS mode
|
&& !multiplayer && !demo.playback && (gametype == GT_COOP) // SP/RA/NiGHTS mode
|
||||||
&& !(spec && stagefailed)) // Not failed the special stage
|
&& !(spec && stagefailed)) // Not failed the special stage
|
||||||
{
|
{
|
||||||
UINT8 earnedEmblems;
|
UINT8 earnedEmblems;
|
||||||
|
|
@ -3609,12 +3568,12 @@ static void G_HandleSaveLevel(void)
|
||||||
remove(liveeventbackup);
|
remove(liveeventbackup);
|
||||||
cursaveslot = 0;
|
cursaveslot = 0;
|
||||||
}
|
}
|
||||||
else if ((!modifiedgame || savemoddata) && !(netgame || multiplayer || ultimatemode || demorecording || metalrecording || modeattacking))
|
else if ((!modifiedgame || savemoddata) && !(netgame || multiplayer || ultimatemode || demo.recording || metalrecording || modeattacking))
|
||||||
G_SaveGame((UINT32)cursaveslot, spstage_start);
|
G_SaveGame((UINT32)cursaveslot, spstage_start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// and doing THIS here means you don't lose your progress if you close the game mid-intermission
|
// and doing THIS here means you don't lose your progress if you close the game mid-intermission
|
||||||
else if (!(ultimatemode || netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking)
|
else if (!(ultimatemode || netgame || multiplayer || demo.playback || demo.recording || metalrecording || modeattacking)
|
||||||
&& (!modifiedgame || savemoddata) && cursaveslot > 0 && CanSaveLevel(lastmap+1))
|
&& (!modifiedgame || savemoddata) && cursaveslot > 0 && CanSaveLevel(lastmap+1))
|
||||||
G_SaveGame((UINT32)cursaveslot, lastmap+1); // not nextmap+1 to route around special stages
|
G_SaveGame((UINT32)cursaveslot, lastmap+1); // not nextmap+1 to route around special stages
|
||||||
}
|
}
|
||||||
|
|
@ -3964,7 +3923,7 @@ static void G_DoContinued(void)
|
||||||
tokenlist = 0;
|
tokenlist = 0;
|
||||||
token = 0;
|
token = 0;
|
||||||
|
|
||||||
if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking) && (!modifiedgame || savemoddata) && cursaveslot > 0)
|
if (!(netgame || multiplayer || demo.playback || demo.recording || metalrecording || modeattacking) && (!modifiedgame || savemoddata) && cursaveslot > 0)
|
||||||
G_SaveGameOver((UINT32)cursaveslot, true);
|
G_SaveGameOver((UINT32)cursaveslot, true);
|
||||||
|
|
||||||
// Reset # of lives
|
// Reset # of lives
|
||||||
|
|
|
||||||
|
|
@ -157,23 +157,7 @@ void COM_Lua_f(void)
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
WRITESTRINGN(p, COM_Argv(i), 255);
|
WRITESTRINGN(p, COM_Argv(i), 255);
|
||||||
|
|
||||||
switch (lpn)
|
SendNetXCmdForPlayer(lpn, XD_LUACMD, buf, p-buf);
|
||||||
{
|
|
||||||
case 3:
|
|
||||||
SendNetXCmd4(XD_LUACMD, buf, p-buf);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
SendNetXCmd3(XD_LUACMD, buf, p-buf);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
SendNetXCmd2(XD_LUACMD, buf, p-buf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
case 0:
|
|
||||||
SendNetXCmd(XD_LUACMD, buf, p-buf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
44
src/m_menu.c
44
src/m_menu.c
|
|
@ -841,9 +841,9 @@ static menuitem_t SP_GrandPrixPlaceholderMenu[] =
|
||||||
// Single Player Time Attack
|
// Single Player Time Attack
|
||||||
static menuitem_t SP_TimeAttackMenu[] =
|
static menuitem_t SP_TimeAttackMenu[] =
|
||||||
{
|
{
|
||||||
{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Name", &cv_playername, 0},
|
{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Name", &cv_playername[0], 0},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Character", &cv_chooseskin, 13},
|
{IT_STRING|IT_CVAR, NULL, "Character", &cv_chooseskin, 13},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Color", &cv_playercolor, 26},
|
{IT_STRING|IT_CVAR, NULL, "Color", &cv_playercolor[0], 26},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Level", &cv_nextmap, 78},
|
{IT_STRING|IT_CVAR, NULL, "Level", &cv_nextmap, 78},
|
||||||
|
|
||||||
{IT_DISABLED, NULL, "Guest...", &SP_GuestReplayDef, 98},
|
{IT_DISABLED, NULL, "Guest...", &SP_GuestReplayDef, 98},
|
||||||
|
|
@ -9815,14 +9815,14 @@ static void M_SetupMultiPlayer(INT32 choice)
|
||||||
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
||||||
multi_tics = multi_state->tics;
|
multi_tics = multi_state->tics;
|
||||||
|
|
||||||
strcpy(setupm_name, cv_playername.string);
|
strcpy(setupm_name, cv_playername[0].string);
|
||||||
|
|
||||||
// set for player 1
|
// set for player 1
|
||||||
setupm_player = &players[consoleplayer];
|
setupm_player = &players[consoleplayer];
|
||||||
setupm_cvskin = &cv_skin;
|
setupm_cvskin = &cv_skin[0];
|
||||||
setupm_cvcolor = &cv_playercolor;
|
setupm_cvcolor = &cv_playercolor[0];
|
||||||
setupm_cvname = &cv_playername;
|
setupm_cvname = &cv_playername[0];
|
||||||
setupm_cvfollower = &cv_follower;
|
setupm_cvfollower = &cv_follower[0];
|
||||||
|
|
||||||
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
||||||
|
|
||||||
|
|
@ -9855,14 +9855,14 @@ static void M_SetupMultiPlayer2(INT32 choice)
|
||||||
|
|
||||||
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
||||||
multi_tics = multi_state->tics;
|
multi_tics = multi_state->tics;
|
||||||
strcpy (setupm_name, cv_playername2.string);
|
strcpy (setupm_name, cv_playername[1].string);
|
||||||
|
|
||||||
// set for splitscreen secondary player
|
// set for splitscreen secondary player
|
||||||
setupm_player = &players[g_localplayers[1]];
|
setupm_player = &players[g_localplayers[1]];
|
||||||
setupm_cvskin = &cv_skin2;
|
setupm_cvskin = &cv_skin[1];
|
||||||
setupm_cvcolor = &cv_playercolor2;
|
setupm_cvcolor = &cv_playercolor[1];
|
||||||
setupm_cvname = &cv_playername2;
|
setupm_cvname = &cv_playername[1];
|
||||||
setupm_cvfollower = &cv_follower2;
|
setupm_cvfollower = &cv_follower[1];
|
||||||
|
|
||||||
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
||||||
|
|
||||||
|
|
@ -9895,14 +9895,14 @@ static void M_SetupMultiPlayer3(INT32 choice)
|
||||||
|
|
||||||
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
||||||
multi_tics = multi_state->tics;
|
multi_tics = multi_state->tics;
|
||||||
strcpy(setupm_name, cv_playername3.string);
|
strcpy(setupm_name, cv_playername[2].string);
|
||||||
|
|
||||||
// set for splitscreen third player
|
// set for splitscreen third player
|
||||||
setupm_player = &players[g_localplayers[2]];
|
setupm_player = &players[g_localplayers[2]];
|
||||||
setupm_cvskin = &cv_skin3;
|
setupm_cvskin = &cv_skin[2];
|
||||||
setupm_cvcolor = &cv_playercolor3;
|
setupm_cvcolor = &cv_playercolor[2];
|
||||||
setupm_cvname = &cv_playername3;
|
setupm_cvname = &cv_playername[2];
|
||||||
setupm_cvfollower = &cv_follower3;
|
setupm_cvfollower = &cv_follower[2];
|
||||||
|
|
||||||
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
||||||
|
|
||||||
|
|
@ -9935,14 +9935,14 @@ static void M_SetupMultiPlayer4(INT32 choice)
|
||||||
|
|
||||||
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
multi_state = &states[mobjinfo[MT_PLAYER].seestate];
|
||||||
multi_tics = multi_state->tics;
|
multi_tics = multi_state->tics;
|
||||||
strcpy(setupm_name, cv_playername4.string);
|
strcpy(setupm_name, cv_playername[3].string);
|
||||||
|
|
||||||
// set for splitscreen fourth player
|
// set for splitscreen fourth player
|
||||||
setupm_player = &players[g_localplayers[3]];
|
setupm_player = &players[g_localplayers[3]];
|
||||||
setupm_cvskin = &cv_skin4;
|
setupm_cvskin = &cv_skin[3];
|
||||||
setupm_cvcolor = &cv_playercolor4;
|
setupm_cvcolor = &cv_playercolor[3];
|
||||||
setupm_cvname = &cv_playername4;
|
setupm_cvname = &cv_playername[3];
|
||||||
setupm_cvfollower = &cv_follower4;
|
setupm_cvfollower = &cv_follower[3];
|
||||||
|
|
||||||
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
setupm_fakefollower = atoi(setupm_cvfollower->string); // update fake follower value
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -783,7 +783,7 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png
|
||||||
"Title", "Description", "Playername", "Mapnum", "Mapname",
|
"Title", "Description", "Playername", "Mapnum", "Mapname",
|
||||||
"Location", "Interface", "Render Mode", "Revision", "Build Date", "Build Time"};
|
"Location", "Interface", "Render Mode", "Revision", "Build Date", "Build Time"};
|
||||||
char titletxt[] = "SRB2Kart " VERSIONSTRING;
|
char titletxt[] = "SRB2Kart " VERSIONSTRING;
|
||||||
png_charp playertxt = cv_playername.zstring;
|
png_charp playertxt = cv_playername[0].zstring;
|
||||||
char desctxt[] = "SRB2Kart Screenshot";
|
char desctxt[] = "SRB2Kart Screenshot";
|
||||||
char Movietxt[] = "SRB2Kart Movie";
|
char Movietxt[] = "SRB2Kart Movie";
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
|
||||||
|
|
@ -1327,7 +1327,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
||||||
S_ChangeMusicEx("_gover", 0, 0, 0, (2*MUSICRATE) - (MUSICRATE/25), 0); // 1.96 seconds
|
S_ChangeMusicEx("_gover", 0, 0, 0, (2*MUSICRATE) - (MUSICRATE/25), 0); // 1.96 seconds
|
||||||
//P_PlayJingle(target->player, JT_GOVER); // can't be used because incompatible with track fadeout
|
//P_PlayJingle(target->player, JT_GOVER); // can't be used because incompatible with track fadeout
|
||||||
|
|
||||||
if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking) && numgameovers < maxgameovers)
|
if (!(netgame || multiplayer || demo.playback || demo.recording || metalrecording || modeattacking) && numgameovers < maxgameovers)
|
||||||
{
|
{
|
||||||
numgameovers++;
|
numgameovers++;
|
||||||
if ((!modifiedgame || savemoddata) && cursaveslot > 0)
|
if ((!modifiedgame || savemoddata) && cursaveslot > 0)
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,8 @@
|
||||||
|
|
||||||
#define mariomode (maptol & TOL_MARIO)
|
#define mariomode (maptol & TOL_MARIO)
|
||||||
|
|
||||||
|
#define P_GetPlayerViewHeight(player) (41*player->mo->height/48)
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
THINK_POLYOBJ,
|
THINK_POLYOBJ,
|
||||||
|
|
|
||||||
|
|
@ -2624,7 +2624,7 @@ void P_PlayerZMovement(mobj_t *mo)
|
||||||
mo->player->viewheight -= mo->floorz - mo->z;
|
mo->player->viewheight -= mo->floorz - mo->z;
|
||||||
|
|
||||||
mo->player->deltaviewheight =
|
mo->player->deltaviewheight =
|
||||||
(FixedMul(41*mo->player->height/48, mo->scale) - mo->player->viewheight)>>3;
|
(P_GetPlayerViewHeight(mo->player) - mo->player->viewheight)>>3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// adjust height
|
// adjust height
|
||||||
|
|
@ -13426,7 +13426,7 @@ void P_AfterPlayerSpawn(INT32 playernum)
|
||||||
|
|
||||||
P_SetPlayerAngle(p, mobj->angle);
|
P_SetPlayerAngle(p, mobj->angle);
|
||||||
|
|
||||||
p->viewheight = 41*p->height/48;
|
p->viewheight = P_GetPlayerViewHeight(p);
|
||||||
|
|
||||||
if (p->mo->eflags & MFE_VERTICALFLIP)
|
if (p->mo->eflags & MFE_VERTICALFLIP)
|
||||||
p->viewz = p->mo->z + p->mo->height - p->viewheight;
|
p->viewz = p->mo->z + p->mo->height - p->viewheight;
|
||||||
|
|
|
||||||
|
|
@ -480,24 +480,10 @@ static void P_NetUnArchivePlayers(void)
|
||||||
players[i].botvars.itemdelay = READUINT32(save_p);
|
players[i].botvars.itemdelay = READUINT32(save_p);
|
||||||
players[i].botvars.itemconfirm = READUINT32(save_p);
|
players[i].botvars.itemconfirm = READUINT32(save_p);
|
||||||
players[i].botvars.turnconfirm = READSINT8(save_p);
|
players[i].botvars.turnconfirm = READSINT8(save_p);
|
||||||
=======
|
|
||||||
players[i].thokitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].spinitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].revitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].followitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].actionspd = READFIXED(save_p);
|
|
||||||
players[i].mindash = READFIXED(save_p);
|
|
||||||
players[i].maxdash = READFIXED(save_p);
|
|
||||||
players[i].normalspeed = READFIXED(save_p);
|
|
||||||
players[i].runspeed = READFIXED(save_p);
|
|
||||||
players[i].thrustfactor = READUINT8(save_p);
|
|
||||||
players[i].accelstart = READUINT8(save_p);
|
|
||||||
players[i].acceleration = READUINT8(save_p);
|
|
||||||
players[i].jumpfactor = READFIXED(save_p);
|
|
||||||
players[i].height = READFIXED(save_p);
|
|
||||||
players[i].spinheight = READFIXED(save_p);
|
|
||||||
|
|
||||||
players[i].viewheight = 41*players[i].height/48; // scale cannot be factored in at this point
|
players[i].followitem = (mobjtype_t)READUINT32(save_p);
|
||||||
|
|
||||||
|
//players[i].viewheight = P_GetPlayerViewHeight(players[i]); // scale cannot be factored in at this point
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3849,45 +3849,12 @@ static void P_InitCamera(void)
|
||||||
{
|
{
|
||||||
if (!dedicated)
|
if (!dedicated)
|
||||||
{
|
{
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
P_SetupCamera();
|
P_SetupCamera();
|
||||||
|
|
||||||
// Salt: CV_ClearChangedFlags() messes with your settings :(
|
for (i = 0; i <= splitscreen; i++)
|
||||||
/*if (!cv_cam_height.changed)
|
displayplayers[i] = g_localplayers[i]; // Start with your OWN view, please!
|
||||||
CV_Set(&cv_cam_height, cv_cam_height.defaultvalue);
|
|
||||||
if (!cv_cam2_height.changed)
|
|
||||||
CV_Set(&cv_cam2_height, cv_cam2_height.defaultvalue);
|
|
||||||
|
|
||||||
if (!cv_cam_dist.changed)
|
|
||||||
CV_Set(&cv_cam_dist, cv_cam_dist.defaultvalue);
|
|
||||||
if (!cv_cam2_dist.changed)
|
|
||||||
CV_Set(&cv_cam2_dist, cv_cam2_dist.defaultvalue);*/
|
|
||||||
|
|
||||||
// Though, I don't think anyone would care about cam_rotate being reset back to the only value that makes sense :P
|
|
||||||
if (!cv_cam_rotate.changed)
|
|
||||||
CV_Set(&cv_cam_rotate, cv_cam_rotate.defaultvalue);
|
|
||||||
if (!cv_cam2_rotate.changed)
|
|
||||||
CV_Set(&cv_cam2_rotate, cv_cam2_rotate.defaultvalue);
|
|
||||||
|
|
||||||
if (!cv_analog[0].changed)
|
|
||||||
CV_SetValue(&cv_analog[0], 0);
|
|
||||||
if (!cv_analog[1].changed)
|
|
||||||
CV_SetValue(&cv_analog[1], 0);
|
|
||||||
|
|
||||||
displayplayer = consoleplayer; // Start with your OWN view, please!
|
|
||||||
}
|
|
||||||
|
|
||||||
if (twodlevel)
|
|
||||||
{
|
|
||||||
CV_SetValue(&cv_analog[0], false);
|
|
||||||
CV_SetValue(&cv_analog[1], false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (cv_useranalog[0].value)
|
|
||||||
CV_SetValue(&cv_analog[0], true);
|
|
||||||
|
|
||||||
if ((splitscreen && cv_useranalog[1].value) || botingame)
|
|
||||||
CV_SetValue(&cv_analog[1], true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4346,7 +4313,7 @@ boolean P_LoadLevel(boolean fromnetsave)
|
||||||
if (!lastmaploaded) // Start a new game?
|
if (!lastmaploaded) // Start a new game?
|
||||||
{
|
{
|
||||||
// I'd love to do this in the menu code instead of here, but everything's a mess and I can't guarantee saving proper player struct info before the first act's started. You could probably refactor it, but it'd be a lot of effort. Easier to just work off known good code. ~toast 22/06/2020
|
// I'd love to do this in the menu code instead of here, but everything's a mess and I can't guarantee saving proper player struct info before the first act's started. You could probably refactor it, but it'd be a lot of effort. Easier to just work off known good code. ~toast 22/06/2020
|
||||||
if (!(ultimatemode || netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking || marathonmode)
|
if (!(ultimatemode || netgame || multiplayer || demo.playback || demo.recording || metalrecording || modeattacking || marathonmode)
|
||||||
&& (!modifiedgame || savemoddata) && cursaveslot > 0)
|
&& (!modifiedgame || savemoddata) && cursaveslot > 0)
|
||||||
G_SaveGame((UINT32)cursaveslot, gamemap);
|
G_SaveGame((UINT32)cursaveslot, gamemap);
|
||||||
// If you're looking for saving sp file progression (distinct from G_SaveGameOver), check G_DoCompleted.
|
// If you're looking for saving sp file progression (distinct from G_SaveGameOver), check G_DoCompleted.
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,7 @@ void P_CalcHeight(player_t *player)
|
||||||
}
|
}
|
||||||
|
|
||||||
// move viewheight
|
// move viewheight
|
||||||
pviewheight = FixedMul(41*player->height/48, mo->scale); // default eye view height
|
pviewheight = P_GetPlayerViewHeight(player); // default eye view height
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
player->viewz = mo->z + mo->height - player->viewheight - bob;
|
player->viewz = mo->z + mo->height - player->viewheight - bob;
|
||||||
|
|
@ -3191,9 +3191,9 @@ void P_ResetCamera(player_t *player, camera_t *thiscam)
|
||||||
x = player->mo->x - P_ReturnThrustX(player->mo, thiscam->angle, player->mo->radius);
|
x = player->mo->x - P_ReturnThrustX(player->mo, thiscam->angle, player->mo->radius);
|
||||||
y = player->mo->y - P_ReturnThrustY(player->mo, thiscam->angle, player->mo->radius);
|
y = player->mo->y - P_ReturnThrustY(player->mo, thiscam->angle, player->mo->radius);
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
z = player->mo->z + player->mo->height - (41*player->height/48) - 16*FRACUNIT;
|
z = player->mo->z + player->mo->height - P_GetPlayerViewHeight(player) - 16*FRACUNIT;
|
||||||
else
|
else
|
||||||
z = player->mo->z + (41*player->height/48);
|
z = player->mo->z + P_GetPlayerViewHeight(player);
|
||||||
|
|
||||||
// set bits for the camera
|
// set bits for the camera
|
||||||
thiscam->x = x;
|
thiscam->x = x;
|
||||||
|
|
@ -4683,7 +4683,7 @@ void P_PlayerAfterThink(player_t *player)
|
||||||
{
|
{
|
||||||
// defaults to make sure 1st person cam doesn't do anything weird on startup
|
// defaults to make sure 1st person cam doesn't do anything weird on startup
|
||||||
player->deltaviewheight = 0;
|
player->deltaviewheight = 0;
|
||||||
player->viewheight = FixedMul(41*player->height/48, player->mo->scale);
|
player->viewheight = P_GetPlayerViewHeight(player);
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
player->viewz = player->mo->z + player->mo->height - player->viewheight;
|
player->viewz = player->mo->z + player->mo->height - player->viewheight;
|
||||||
|
|
|
||||||
|
|
@ -1859,8 +1859,8 @@ void Y_StartVote(void)
|
||||||
I_Error("voteendtic is dirty");
|
I_Error("voteendtic is dirty");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
widebgpatch = W_CachePatchName(((gametype == GT_MATCH) ? "BATTLSCW" : "INTERSCW"), PU_STATIC);
|
widebgpatch = W_CachePatchName(((gametype == GT_BATTLE) ? "BATTLSCW" : "INTERSCW"), PU_STATIC);
|
||||||
bgpatch = W_CachePatchName(((gametype == GT_MATCH) ? "BATTLSCR" : "INTERSCR"), PU_STATIC);
|
bgpatch = W_CachePatchName(((gametype == GT_BATTLE) ? "BATTLSCR" : "INTERSCR"), PU_STATIC);
|
||||||
cursor = W_CachePatchName("M_CURSOR", PU_STATIC);
|
cursor = W_CachePatchName("M_CURSOR", PU_STATIC);
|
||||||
cursor1 = W_CachePatchName("P1CURSOR", PU_STATIC);
|
cursor1 = W_CachePatchName("P1CURSOR", PU_STATIC);
|
||||||
cursor2 = W_CachePatchName("P2CURSOR", PU_STATIC);
|
cursor2 = W_CachePatchName("P2CURSOR", PU_STATIC);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue