Spectating is properly implemented now

- Spectate button works
- Spectating & objectplace controls are usable now
- New spectator HUD
This commit is contained in:
TehRealSalt 2018-01-22 22:18:57 -05:00
parent 41250d1751
commit 8b88a2ebd8
7 changed files with 338 additions and 141 deletions

View File

@ -2477,9 +2477,9 @@ static void Command_Teamchange2_f(void)
if (COM_Argc() <= 1) if (COM_Argc() <= 1)
{ {
if (G_GametypeHasTeams()) if (G_GametypeHasTeams())
CONS_Printf(M_GetText("changeteam <team>: switch to a new team (%s)\n"), "red, blue or spectator"); CONS_Printf(M_GetText("changeteam2 <team>: switch to a new team (%s)\n"), "red, blue or spectator");
else if (G_GametypeHasSpectators()) else if (G_GametypeHasSpectators())
CONS_Printf(M_GetText("changeteam <team>: switch to a new team (%s)\n"), "spectator or playing"); CONS_Printf(M_GetText("changeteam2 <team>: switch to a new team (%s)\n"), "spectator or playing");
else else
CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n")); CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n"));
return; return;
@ -2563,12 +2563,196 @@ static void Command_Teamchange2_f(void)
static void Command_Teamchange3_f(void) static void Command_Teamchange3_f(void)
{ {
; changeteam_union NetPacket;
boolean error = false;
UINT16 usvalue;
NetPacket.value.l = NetPacket.value.b = 0;
// 0 1
// changeteam3 <color>
if (COM_Argc() <= 1)
{
if (G_GametypeHasTeams())
CONS_Printf(M_GetText("changeteam3 <team>: switch to a new team (%s)\n"), "red, blue or spectator");
else if (G_GametypeHasSpectators())
CONS_Printf(M_GetText("changeteam3 <team>: switch to a new team (%s)\n"), "spectator or playing");
else
CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n"));
return;
}
if (G_GametypeHasTeams())
{
if (!strcasecmp(COM_Argv(1), "red") || !strcasecmp(COM_Argv(1), "1"))
NetPacket.packet.newteam = 1;
else if (!strcasecmp(COM_Argv(1), "blue") || !strcasecmp(COM_Argv(1), "2"))
NetPacket.packet.newteam = 2;
else if (!strcasecmp(COM_Argv(1), "spectator") || !strcasecmp(COM_Argv(1), "0"))
NetPacket.packet.newteam = 0;
else
error = true;
}
else if (G_GametypeHasSpectators())
{
if (!strcasecmp(COM_Argv(1), "spectator") || !strcasecmp(COM_Argv(1), "0"))
NetPacket.packet.newteam = 0;
else if (!strcasecmp(COM_Argv(1), "playing") || !strcasecmp(COM_Argv(1), "1"))
NetPacket.packet.newteam = 3;
else
error = true;
}
else
{
CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n"));
return;
}
if (error)
{
if (G_GametypeHasTeams())
CONS_Printf(M_GetText("changeteam3 <team>: switch to a new team (%s)\n"), "red, blue or spectator");
else if (G_GametypeHasSpectators())
CONS_Printf(M_GetText("changeteam3 <team>: switch to a new team (%s)\n"), "spectator or playing");
return;
}
if (G_GametypeHasTeams())
{
if (NetPacket.packet.newteam == (unsigned)players[thirddisplayplayer].ctfteam ||
(players[thirddisplayplayer].spectator && !NetPacket.packet.newteam))
error = true;
}
else if (G_GametypeHasSpectators())
{
if ((players[thirddisplayplayer].spectator && !NetPacket.packet.newteam) ||
(!players[thirddisplayplayer].spectator && NetPacket.packet.newteam == 3))
error = true;
}
#ifdef PARANOIA
else
I_Error("Invalid gametype after initial checks!");
#endif
if (error)
{
CONS_Alert(CONS_NOTICE, M_GetText("You're already on that team!\n"));
return;
}
if (!cv_allowteamchange.value && NetPacket.packet.newteam) // allow swapping to spectator even in locked teams.
{
CONS_Alert(CONS_NOTICE, M_GetText("The server is not allowing team changes at the moment.\n"));
return;
}
//additional check for hide and seek. Don't allow change of status after hidetime ends.
if (gametype == GT_HIDEANDSEEK && leveltime >= (hidetime * TICRATE))
{
CONS_Alert(CONS_NOTICE, M_GetText("Hiding time expired; no Hide and Seek status changes allowed!\n"));
return;
}
usvalue = SHORT(NetPacket.value.l|NetPacket.value.b);
SendNetXCmd3(XD_TEAMCHANGE, &usvalue, sizeof(usvalue));
} }
static void Command_Teamchange4_f(void) static void Command_Teamchange4_f(void)
{ {
; changeteam_union NetPacket;
boolean error = false;
UINT16 usvalue;
NetPacket.value.l = NetPacket.value.b = 0;
// 0 1
// changeteam4 <color>
if (COM_Argc() <= 1)
{
if (G_GametypeHasTeams())
CONS_Printf(M_GetText("changeteam4 <team>: switch to a new team (%s)\n"), "red, blue or spectator");
else if (G_GametypeHasSpectators())
CONS_Printf(M_GetText("changeteam4 <team>: switch to a new team (%s)\n"), "spectator or playing");
else
CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n"));
return;
}
if (G_GametypeHasTeams())
{
if (!strcasecmp(COM_Argv(1), "red") || !strcasecmp(COM_Argv(1), "1"))
NetPacket.packet.newteam = 1;
else if (!strcasecmp(COM_Argv(1), "blue") || !strcasecmp(COM_Argv(1), "2"))
NetPacket.packet.newteam = 2;
else if (!strcasecmp(COM_Argv(1), "spectator") || !strcasecmp(COM_Argv(1), "0"))
NetPacket.packet.newteam = 0;
else
error = true;
}
else if (G_GametypeHasSpectators())
{
if (!strcasecmp(COM_Argv(1), "spectator") || !strcasecmp(COM_Argv(1), "0"))
NetPacket.packet.newteam = 0;
else if (!strcasecmp(COM_Argv(1), "playing") || !strcasecmp(COM_Argv(1), "1"))
NetPacket.packet.newteam = 3;
else
error = true;
}
else
{
CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n"));
return;
}
if (error)
{
if (G_GametypeHasTeams())
CONS_Printf(M_GetText("changeteam4 <team>: switch to a new team (%s)\n"), "red, blue or spectator");
else if (G_GametypeHasSpectators())
CONS_Printf(M_GetText("changeteam4 <team>: switch to a new team (%s)\n"), "spectator or playing");
return;
}
if (G_GametypeHasTeams())
{
if (NetPacket.packet.newteam == (unsigned)players[fourthdisplayplayer].ctfteam ||
(players[fourthdisplayplayer].spectator && !NetPacket.packet.newteam))
error = true;
}
else if (G_GametypeHasSpectators())
{
if ((players[fourthdisplayplayer].spectator && !NetPacket.packet.newteam) ||
(!players[fourthdisplayplayer].spectator && NetPacket.packet.newteam == 3))
error = true;
}
#ifdef PARANOIA
else
I_Error("Invalid gametype after initial checks!");
#endif
if (error)
{
CONS_Alert(CONS_NOTICE, M_GetText("You're already on that team!\n"));
return;
}
if (!cv_allowteamchange.value && NetPacket.packet.newteam) // allow swapping to spectator even in locked teams.
{
CONS_Alert(CONS_NOTICE, M_GetText("The server is not allowing team changes at the moment.\n"));
return;
}
//additional check for hide and seek. Don't allow change of status after hidetime ends.
if (gametype == GT_HIDEANDSEEK && leveltime >= (hidetime * TICRATE))
{
CONS_Alert(CONS_NOTICE, M_GetText("Hiding time expired; no Hide and Seek status changes allowed!\n"));
return;
}
usvalue = SHORT(NetPacket.value.l|NetPacket.value.b);
SendNetXCmd4(XD_TEAMCHANGE, &usvalue, sizeof(usvalue));
} }
static void Command_ServerTeamChange_f(void) static void Command_ServerTeamChange_f(void)

View File

@ -1343,62 +1343,43 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
} }
} }
/* if (player->spectator || objectplacing) // SRB2Kart: spectators need special controls
axis = JoyAxis(AXISSTRAFE, ssplayer);
if (gamepadjoystickmove && axis != 0)
{ {
if (axis < 0) if (InputDown(gc_accelerate, ssplayer))
side += sidemove[speed]; cmd->buttons |= BT_ACCELERATE;
else if (axis > 0) if (InputDown(gc_brake, ssplayer))
side -= sidemove[speed]; cmd->buttons |= BT_BRAKE;
axis = JoyAxis(AXISMOVE, ssplayer);
if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0) || (analogjoystickmove && axis < 0))
forward += forwardmove[1];
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0) || (analogjoystickmove && axis > 0))
forward -= forwardmove[1];
} }
else if (analogjoystickmove && axis != 0) else
{ {
// JOYAXISRANGE is supposed to be 1023 (divide by 1024) // forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward.
side += ((axis * sidemove[1]) >> 10); if (InputDown(gc_accelerate, ssplayer) || player->kartstuff[k_mushroomtimer])
{
cmd->buttons |= BT_ACCELERATE;
forward = forwardmove[1]; // 50
}
if (InputDown(gc_brake, ssplayer))
{
cmd->buttons |= BT_BRAKE;
if (cmd->buttons & BT_ACCELERATE || cmd->forwardmove <= 0)
forward -= forwardmove[0]; // 25 - Halved value so clutching is possible
}
// But forward/backward IS used for aiming.
axis = JoyAxis(AXISMOVE, ssplayer);
if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0) || (analogjoystickmove && axis < 0))
cmd->buttons |= BT_FORWARD;
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0) || (analogjoystickmove && axis > 0))
cmd->buttons |= BT_BACKWARD;
} }
*/
// forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward. /*if (InputDown(gc_driftleft, ssplayer))
if (InputDown(gc_accelerate, ssplayer) || player->kartstuff[k_mushroomtimer])
{
cmd->buttons |= BT_ACCELERATE;
forward = forwardmove[1]; // 50
}
if (InputDown(gc_brake, ssplayer))
{
cmd->buttons |= BT_BRAKE;
if (cmd->buttons & BT_ACCELERATE || cmd->forwardmove <= 0)
forward -= forwardmove[0]; // 25 - Halved value so clutching is possible
}
// But forward/backward IS used for aiming.
axis = JoyAxis(AXISMOVE, ssplayer);
if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0) || (analogjoystickmove && axis < 0))
cmd->buttons |= BT_FORWARD;
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0) || (analogjoystickmove && axis > 0))
cmd->buttons |= BT_BACKWARD;
/*
if (InputDown(gc_forward, ssplayer) || (gamepadjoystickmove && axis < 0))
forward = forwardmove[speed];
if (InputDown(gc_backward, ssplayer) || (gamepadjoystickmove && axis > 0))
forward -= forwardmove[speed];
*/
/*
if (analogjoystickmove && axis != 0)
forward -= ((axis * forwardmove[1]) >> 10); // ANALOG!
*/
// some people strafe left & right with mouse buttons
// those people are weird
/* // SRB2kart - these aren't used in kart
if (InputDown(gc_straferight, ssplayer))
side += sidemove[speed];
if (InputDown(gc_strafeleft, ssplayer))
side -= sidemove[speed];
if (InputDown(gc_driftleft, ssplayer))
cmd->buttons |= BT_WEAPONNEXT; // Next Weapon cmd->buttons |= BT_WEAPONNEXT; // Next Weapon
if (InputDown(gc_driftright, ssplayer)) if (InputDown(gc_driftright, ssplayer))
cmd->buttons |= BT_WEAPONPREV; // Previous Weapon cmd->buttons |= BT_WEAPONPREV; // Previous Weapon
@ -1428,26 +1409,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
cmd->buttons |= BT_ACCELERATE; cmd->buttons |= BT_ACCELERATE;
*/ */
if (InputDown(gc_spectate, ssplayer))
cmd->buttons |= BT_SPECTATE;
// SRB2Kart: look backward
if (InputDown(gc_lookback, ssplayer))
// Lua scriptable buttons
if (InputDown(gc_custom1, ssplayer))
cmd->buttons |= BT_CUSTOM1;
if (InputDown(gc_custom2, ssplayer))
cmd->buttons |= BT_CUSTOM2;
if (InputDown(gc_custom3, ssplayer))
cmd->buttons |= BT_CUSTOM3;
// use with any button/key
/*
if (InputDown(gc_brake, ssplayer))
cmd->buttons |= BT_BRAKE;
*/
// Camera Controls // Camera Controls
/* /*
if (cv_debug || cv_analog.value || demoplayback || objectplacing || player->pflags & PF_NIGHTSMODE) if (cv_debug || cv_analog.value || demoplayback || objectplacing || player->pflags & PF_NIGHTSMODE)
@ -1463,6 +1424,17 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (InputDown(gc_jump, ssplayer)) if (InputDown(gc_jump, ssplayer))
cmd->buttons |= BT_JUMP; cmd->buttons |= BT_JUMP;
if (InputDown(gc_spectate, ssplayer))
cmd->buttons |= BT_SPECTATE;
// Lua scriptable buttons
if (InputDown(gc_custom1, ssplayer))
cmd->buttons |= BT_CUSTOM1;
if (InputDown(gc_custom2, ssplayer))
cmd->buttons |= BT_CUSTOM2;
if (InputDown(gc_custom3, ssplayer))
cmd->buttons |= BT_CUSTOM3;
// player aiming shit, ahhhh... // player aiming shit, ahhhh...
{ {
INT32 player_invert = invertmouse ? -1 : 1; INT32 player_invert = invertmouse ? -1 : 1;
@ -1559,6 +1531,19 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (cv_kartmirror.value) if (cv_kartmirror.value)
cmd->sidemove = -cmd->sidemove; cmd->sidemove = -cmd->sidemove;
if (ssplayer == 2 && player->bot == 1) {
if (!player->powers[pw_tailsfly] && (cmd->forwardmove || cmd->sidemove || cmd->buttons))
{
player->bot = 2; // A player-controlled bot. Returns to AI when it respawns.
CV_SetValue(&cv_analog2, true);
}
else
{
G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); // empty, or external driver
B_BuildTiccmd(player, cmd);
}
}
//{ SRB2kart - Drift support //{ SRB2kart - Drift support
axis = JoyAxis(AXISTURN, ssplayer); axis = JoyAxis(AXISTURN, ssplayer);
if (cv_kartmirror.value) if (cv_kartmirror.value)
@ -1575,19 +1560,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
cmd->buttons &= ~BT_DRIFTRIGHT; cmd->buttons &= ~BT_DRIFTRIGHT;
//} //}
if (ssplayer == 2 && player->bot == 1) {
if (!player->powers[pw_tailsfly] && (cmd->forwardmove || cmd->sidemove || cmd->buttons))
{
player->bot = 2; // A player-controlled bot. Returns to AI when it respawns.
CV_SetValue(&cv_analog2, true);
}
else
{
G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); // empty, or external driver
B_BuildTiccmd(player, cmd);
}
}
if (analog) { if (analog) {
cmd->angleturn = (INT16)(thiscam->angle >> 16); cmd->angleturn = (INT16)(thiscam->angle >> 16);
if (player->awayviewtics) if (player->awayviewtics)
@ -1605,7 +1577,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn); cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn);
// SRB2kart - no additional angle if not moving // SRB2kart - no additional angle if not moving
if ((player->mo && player->speed > 0) || (leveltime > 140 && (cmd->buttons & BT_ACCELERATE) && (cmd->buttons & BT_BRAKE))) if ((player->mo && player->speed > 0) || (leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE) || (player->spectator || objectplacing))
lang += (cmd->angleturn<<16); lang += (cmd->angleturn<<16);
cmd->angleturn = (INT16)(lang >> 16); cmd->angleturn = (INT16)(lang >> 16);
@ -1899,11 +1871,12 @@ boolean G_Responder(event_t *ev)
continue; continue;
}*/ }*/
if (gametype != GT_RACE) // srb2kart // SRB2Kart: Ehhh, who cares, Mario Kart's designed around screen-cheating anyway
/*if (gametype != GT_RACE)
{ {
if (players[consoleplayer].kartstuff[k_balloon] > 0) if (players[consoleplayer].kartstuff[k_balloon] > 0)
continue; continue;
} }*/
break; break;
} while (displayplayer != consoleplayer); } while (displayplayer != consoleplayer);
@ -2983,8 +2956,12 @@ boolean G_GametypeHasTeams(void)
// //
boolean G_GametypeHasSpectators(void) boolean G_GametypeHasSpectators(void)
{ {
return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE // SRB2Kart: We don't have any exceptions to not being able to spectate yet. Maybe when SP & bots roll around.
&& gametype != GT_MATCH); // srb2kart: temporary? #if 0
return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE);
#else
return true;
#endif
} }
// //

View File

@ -2767,6 +2767,9 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
fixed_t p_maxspeed = FixedMul(K_GetKartSpeed(player, false), 3*FRACUNIT); fixed_t p_maxspeed = FixedMul(K_GetKartSpeed(player, false), 3*FRACUNIT);
fixed_t adjustangle = FixedDiv((p_maxspeed>>16) - (player->speed>>16), (p_maxspeed>>16) + player->kartweight); fixed_t adjustangle = FixedDiv((p_maxspeed>>16) - (player->speed>>16), (p_maxspeed>>16) + player->kartweight);
if (player->spectator)
return turnvalue;
if (player->kartstuff[k_feather] & 2 && !P_IsObjectOnGround(player->mo)) if (player->kartstuff[k_feather] & 2 && !P_IsObjectOnGround(player->mo))
adjustangle /= 2; adjustangle /= 2;
@ -4682,9 +4685,12 @@ static void K_drawKartPositionFaces(void)
if (!playeringame[j]) if (!playeringame[j])
continue; continue;
if (players[j].spectator)
continue;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (playeringame[i] && completed[i] == false if (playeringame[i] && completed[i] == false && players[i].mo && !players[i].spectator
&& (rankplayer[ranklines] < 0 || players[i].kartstuff[k_position] < players[rankplayer[ranklines]].kartstuff[k_position])) && (rankplayer[ranklines] < 0 || players[i].kartstuff[k_position] < players[rankplayer[ranklines]].kartstuff[k_position]))
{ {
rankplayer[ranklines] = i; rankplayer[ranklines] = i;
@ -4839,7 +4845,7 @@ static void K_drawKartSpeedometer(void)
static void K_drawKartBalloonsOrKarma(void) static void K_drawKartBalloonsOrKarma(void)
{ {
UINT8 *colormap = R_GetTranslationColormap(-1, stplyr->skincolor, 0); UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0);
INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTOLEFT); INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTOLEFT);
if (splitscreen > 1) if (splitscreen > 1)
@ -4916,6 +4922,9 @@ static void K_drawKartPlayerCheck(void)
if (stplyr->awayviewtics) if (stplyr->awayviewtics)
return; return;
if (camspin)
return;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (&players[i] == stplyr) if (&players[i] == stplyr)
@ -4950,7 +4959,7 @@ static void K_drawKartPlayerCheck(void)
else if (x > 306) else if (x > 306)
x = 306; x = 306;
colormap = R_GetTranslationColormap(-1, players[i].mo->color, 0); colormap = R_GetTranslationColormap(TC_DEFAULT, players[i].mo->color, 0);
V_DrawMappedPatch(x, CHEK_Y, V_HUDTRANS|splitflags, localpatch, colormap); V_DrawMappedPatch(x, CHEK_Y, V_HUDTRANS|splitflags, localpatch, colormap);
} }
} }
@ -5358,28 +5367,31 @@ void K_drawKartHUD(void)
} }
} }
if (gametype == GT_RACE) // Race-only elements if (!stplyr->spectator) // Bottom of the screen elements, don't need in spectate mode
{ {
// Draw the lap counter if (gametype == GT_RACE) // Race-only elements
K_drawKartLaps();
if (!splitscreen)
{ {
// Draw the speedometer // Draw the lap counter
// TODO: Make a better speedometer. K_drawKartLaps();
K_drawKartSpeedometer();
}
if (!modeattacking) if (!splitscreen)
{ {
// Draw the numerical position // Draw the speedometer
K_DrawKartPositionNum(stplyr->kartstuff[k_position]); // TODO: Make a better speedometer.
K_drawKartSpeedometer();
}
if (!modeattacking)
{
// Draw the numerical position
K_DrawKartPositionNum(stplyr->kartstuff[k_position]);
}
}
else if (gametype == GT_MATCH) // Battle-only
{
// Draw the hits left!
K_drawKartBalloonsOrKarma();
} }
}
else if (gametype == GT_MATCH) // Battle-only
{
// Draw the hits left!
K_drawKartBalloonsOrKarma();
} }
} }

View File

@ -1101,7 +1101,7 @@ void OP_ObjectplaceMovement(player_t *player)
if (!(cmd->angleturn & TICCMD_RECEIVED)) if (!(cmd->angleturn & TICCMD_RECEIVED))
ticmiss++; ticmiss++;
if (cmd->buttons & BT_JUMP) if (cmd->buttons & BT_ACCELERATE)
player->mo->z += FRACUNIT*cv_speed.value; player->mo->z += FRACUNIT*cv_speed.value;
else if (cmd->buttons & BT_BRAKE) else if (cmd->buttons & BT_BRAKE)
player->mo->z -= FRACUNIT*cv_speed.value; player->mo->z -= FRACUNIT*cv_speed.value;
@ -1167,19 +1167,19 @@ void OP_ObjectplaceMovement(player_t *player)
if (player->pflags & PF_ATTACKDOWN) if (player->pflags & PF_ATTACKDOWN)
{ {
// Are ANY objectplace buttons pressed? If no, remove flag. // Are ANY objectplace buttons pressed? If no, remove flag.
if (!(cmd->buttons & (BT_ATTACK|BT_SPECTATE|BT_BACKWARD|BT_FORWARD))) if (!(cmd->buttons & (BT_ATTACK|BT_JUMP)))
player->pflags &= ~PF_ATTACKDOWN; player->pflags &= ~PF_ATTACKDOWN;
// Do nothing. // Do nothing.
return; return;
} }
if (cmd->buttons & BT_FORWARD) /*if (cmd->buttons & BT_FORWARD)
{ {
OP_CycleThings(-1); OP_CycleThings(-1);
player->pflags |= PF_ATTACKDOWN; player->pflags |= PF_ATTACKDOWN;
} }
else if (cmd->buttons & BT_BACKWARD) else*/ if (cmd->buttons & BT_JUMP)
{ {
OP_CycleThings(1); OP_CycleThings(1);
player->pflags |= PF_ATTACKDOWN; player->pflags |= PF_ATTACKDOWN;
@ -1266,10 +1266,10 @@ void Command_ObjectPlace_f(void)
HU_DoCEcho(va(M_GetText( HU_DoCEcho(va(M_GetText(
"\\\\\\\\\\\\\\\\\\\\\\\\\x82" "\\\\\\\\\\\\\\\\\\\\\\\\\x82"
" Objectplace Controls: \x80\\\\" " Objectplace Controls: \x80\\\\"
"Camera L/R: Cycle mapthings\\" " Drift: Cycle mapthings\\"
" Jump: Float up \\" "Accelerate: Float up \\"
" Spin: Float down \\" " Brake: Float down \\"
" Fire Ring: Place object \\"))); " Item: Place object \\")));
} }
// Save all the player's data. // Save all the player's data.

View File

@ -9468,7 +9468,10 @@ void P_SpawnPlayer(INT32 playernum)
p->spectator = false; p->spectator = false;
} }
else if (netgame && p->jointime < 1) else if (netgame && p->jointime < 1)
/*p->spectator = true*/; {
//p->spectator = true;
p->kartstuff[k_comebackshowninfo] = 0;
}
else if (multiplayer && !netgame) else if (multiplayer && !netgame)
{ {
// If you're in a team game and you don't have a team assigned yet... // If you're in a team game and you don't have a team assigned yet...
@ -9545,9 +9548,6 @@ void P_SpawnPlayer(INT32 playernum)
overheadarrow->flags2 |= MF2_DONTDRAW; overheadarrow->flags2 |= MF2_DONTDRAW;
P_SetScale(overheadarrow, mobj->destscale); P_SetScale(overheadarrow, mobj->destscale);
if (leveltime < 1)
p->kartstuff[k_comebackshowninfo] = 0;
if (gametype != GT_RACE) if (gametype != GT_RACE)
{ {
/*INT32 i; /*INT32 i;

View File

@ -5067,7 +5067,7 @@ static void P_SpectatorMovement(player_t *player)
if (player->mo->z < player->mo->floorz) if (player->mo->z < player->mo->floorz)
player->mo->z = player->mo->floorz; player->mo->z = player->mo->floorz;
if (cmd->buttons & BT_JUMP) if (cmd->buttons & BT_ACCELERATE)
player->mo->z += FRACUNIT*16; player->mo->z += FRACUNIT*16;
else if (cmd->buttons & BT_BRAKE) else if (cmd->buttons & BT_BRAKE)
player->mo->z -= FRACUNIT*16; player->mo->z -= FRACUNIT*16;
@ -8011,12 +8011,13 @@ static void P_DeathThink(player_t *player)
player->playerstate = PST_REBORN; player->playerstate = PST_REBORN;
else if (player->lives > 0 && !G_IsSpecialStage(gamemap) && leveltime >= 140) // Don't allow "click to respawn" in special stages! else if (player->lives > 0 && !G_IsSpecialStage(gamemap) && leveltime >= 140) // Don't allow "click to respawn" in special stages!
{ {
// SRB2kart // SRB2kart-- But wait, why'd we add this? :eggthinking:
if (player->spectator) /*if (player->spectator)
{ {
CONS_Printf("%s entered the game.\n", player_names[player-players]); CONS_Printf("%s entered the game.\n", player_names[player-players]);
player->spectator = false; player->spectator = false;
} }*/
//player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c //player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c
// SRB2kart - spawn automatically after 1 second // SRB2kart - spawn automatically after 1 second
@ -8385,7 +8386,12 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
// SRB2kart - Camera flipper // SRB2kart - Camera flipper
if (lookback) if (lookback)
{
camrotate += 180; camrotate += 180;
camspeed *= 2;
if (camspeed > FRACUNIT)
camspeed = FRACUNIT;
}
#ifdef REDSANALOG #ifdef REDSANALOG
if (P_AnalogMove(player) && (player->cmd.buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD)) { if (P_AnalogMove(player) && (player->cmd.buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD)) {
@ -9379,10 +9385,26 @@ void P_PlayerThink(player_t *player)
player->realtime = 0; player->realtime = 0;
} }
if ((netgame || splitscreen) && player->spectator && cmd->buttons & BT_ATTACK && !player->powers[pw_flashing])
if ((netgame || splitscreen) && !player->powers[pw_flashing])
{ {
if (P_SpectatorJoinGame(player)) if (player->spectator && cmd->buttons & BT_ATTACK)
return; // player->mo was removed. {
if (P_SpectatorJoinGame(player))
return; // player->mo was removed.
}
else if (!player->spectator && cmd->buttons & BT_SPECTATE)
{
if (player == &players[consoleplayer])
COM_ImmedExecute("changeteam spectator");
else if (splitscreen && player == &players[secondarydisplayplayer])
COM_ImmedExecute("changeteam2 spectator");
else if (splitscreen > 1 && player == &players[thirddisplayplayer])
COM_ImmedExecute("changeteam3 spectator");
else if (splitscreen > 2 && player == &players[fourthdisplayplayer])
COM_ImmedExecute("changeteam4 spectator");
//return;
}
} }
// Even if not NiGHTS, pull in nearby objects when walking around as John Q. Elliot. // Even if not NiGHTS, pull in nearby objects when walking around as John Q. Elliot.

View File

@ -1951,15 +1951,17 @@ static void ST_overlayDrawer(void)
#endif #endif
) )
{ {
V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(60), V_HUDTRANSHALF, M_GetText("You are a spectator.")); // SRB2kart: changed positions & text
if (G_GametypeHasTeams()) V_DrawString(2, BASEVIDHEIGHT-50, V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -"));
V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, M_GetText("Press Fire to be assigned to a team.")); /*if (G_GametypeHasTeams())
V_DrawString(2, BASEVIDHEIGHT-40, V_HUDTRANSHALF, M_GetText("Item - Join Team"));
else if (G_IsSpecialStage(gamemap) && useNightsSS) else if (G_IsSpecialStage(gamemap) && useNightsSS)
V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, M_GetText("You cannot join the game until the stage has ended.")); V_DrawString(2, BASEVIDHEIGHT-40, V_HUDTRANSHALF|V_REDMAP, M_GetText("- CANNOT JOIN -"));
else else*/
V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, M_GetText("Press Fire to enter the game.")); V_DrawString(2, BASEVIDHEIGHT-40, V_HUDTRANSHALF, M_GetText("Item - Enter Game"));
V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(148), V_HUDTRANSHALF, M_GetText("Press F12 to watch another player.")); V_DrawString(2, BASEVIDHEIGHT-30, V_HUDTRANSHALF, M_GetText("F12 - Change View"));
V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(164), V_HUDTRANSHALF, M_GetText("Press Jump to float and Spin to sink.")); V_DrawString(2, BASEVIDHEIGHT-20, V_HUDTRANSHALF, M_GetText("Accelerate - Float"));
V_DrawString(2, BASEVIDHEIGHT-10, V_HUDTRANSHALF, M_GetText("Brake - Sink"));
} }
} }