diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 11c9acff..b8eb5ec8 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2477,9 +2477,9 @@ static void Command_Teamchange2_f(void) if (COM_Argc() <= 1) { if (G_GametypeHasTeams()) - CONS_Printf(M_GetText("changeteam : switch to a new team (%s)\n"), "red, blue or spectator"); + CONS_Printf(M_GetText("changeteam2 : switch to a new team (%s)\n"), "red, blue or spectator"); else if (G_GametypeHasSpectators()) - CONS_Printf(M_GetText("changeteam : switch to a new team (%s)\n"), "spectator or playing"); + CONS_Printf(M_GetText("changeteam2 : 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; @@ -2563,12 +2563,196 @@ static void Command_Teamchange2_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 + + if (COM_Argc() <= 1) + { + if (G_GametypeHasTeams()) + CONS_Printf(M_GetText("changeteam3 : switch to a new team (%s)\n"), "red, blue or spectator"); + else if (G_GametypeHasSpectators()) + CONS_Printf(M_GetText("changeteam3 : 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 : switch to a new team (%s)\n"), "red, blue or spectator"); + else if (G_GametypeHasSpectators()) + CONS_Printf(M_GetText("changeteam3 : 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) { - ; + changeteam_union NetPacket; + boolean error = false; + UINT16 usvalue; + NetPacket.value.l = NetPacket.value.b = 0; + + // 0 1 + // changeteam4 + + if (COM_Argc() <= 1) + { + if (G_GametypeHasTeams()) + CONS_Printf(M_GetText("changeteam4 : switch to a new team (%s)\n"), "red, blue or spectator"); + else if (G_GametypeHasSpectators()) + CONS_Printf(M_GetText("changeteam4 : 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 : switch to a new team (%s)\n"), "red, blue or spectator"); + else if (G_GametypeHasSpectators()) + CONS_Printf(M_GetText("changeteam4 : 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) diff --git a/src/g_game.c b/src/g_game.c index f2f07493..cb20dbe8 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1343,62 +1343,43 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) } } - /* - axis = JoyAxis(AXISSTRAFE, ssplayer); - if (gamepadjoystickmove && axis != 0) + if (player->spectator || objectplacing) // SRB2Kart: spectators need special controls { - if (axis < 0) - side += sidemove[speed]; - else if (axis > 0) - side -= sidemove[speed]; + if (InputDown(gc_accelerate, ssplayer)) + cmd->buttons |= BT_ACCELERATE; + if (InputDown(gc_brake, ssplayer)) + 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) - side += ((axis * sidemove[1]) >> 10); + // forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward. + 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_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)) + /*if (InputDown(gc_driftleft, ssplayer)) cmd->buttons |= BT_WEAPONNEXT; // Next Weapon if (InputDown(gc_driftright, ssplayer)) cmd->buttons |= BT_WEAPONPREV; // Previous Weapon @@ -1428,26 +1409,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) 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 /* 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)) 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... { INT32 player_invert = invertmouse ? -1 : 1; @@ -1559,6 +1531,19 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (cv_kartmirror.value) 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 axis = JoyAxis(AXISTURN, ssplayer); if (cv_kartmirror.value) @@ -1575,19 +1560,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) 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) { cmd->angleturn = (INT16)(thiscam->angle >> 16); if (player->awayviewtics) @@ -1605,7 +1577,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn); // 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); cmd->angleturn = (INT16)(lang >> 16); @@ -1899,11 +1871,12 @@ boolean G_Responder(event_t *ev) 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) continue; - } + }*/ break; } while (displayplayer != consoleplayer); @@ -2983,8 +2956,12 @@ boolean G_GametypeHasTeams(void) // boolean G_GametypeHasSpectators(void) { - return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE - && gametype != GT_MATCH); // srb2kart: temporary? + // SRB2Kart: We don't have any exceptions to not being able to spectate yet. Maybe when SP & bots roll around. +#if 0 + return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE); +#else + return true; +#endif } // diff --git a/src/k_kart.c b/src/k_kart.c index 4ceb8b72..9e54559b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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 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)) adjustangle /= 2; @@ -4682,9 +4685,12 @@ static void K_drawKartPositionFaces(void) if (!playeringame[j]) continue; + if (players[j].spectator) + continue; + 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] = i; @@ -4839,7 +4845,7 @@ static void K_drawKartSpeedometer(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); if (splitscreen > 1) @@ -4916,6 +4922,9 @@ static void K_drawKartPlayerCheck(void) if (stplyr->awayviewtics) return; + if (camspin) + return; + for (i = 0; i < MAXPLAYERS; i++) { if (&players[i] == stplyr) @@ -4950,7 +4959,7 @@ static void K_drawKartPlayerCheck(void) else if (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); } } @@ -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 - K_drawKartLaps(); - - if (!splitscreen) + if (gametype == GT_RACE) // Race-only elements { - // Draw the speedometer - // TODO: Make a better speedometer. - K_drawKartSpeedometer(); - } + // Draw the lap counter + K_drawKartLaps(); - if (!modeattacking) - { - // Draw the numerical position - K_DrawKartPositionNum(stplyr->kartstuff[k_position]); + if (!splitscreen) + { + // Draw the speedometer + // 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(); } } diff --git a/src/m_cheat.c b/src/m_cheat.c index c453e5d9..afa2663c 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1101,7 +1101,7 @@ void OP_ObjectplaceMovement(player_t *player) if (!(cmd->angleturn & TICCMD_RECEIVED)) ticmiss++; - if (cmd->buttons & BT_JUMP) + if (cmd->buttons & BT_ACCELERATE) player->mo->z += FRACUNIT*cv_speed.value; else if (cmd->buttons & BT_BRAKE) player->mo->z -= FRACUNIT*cv_speed.value; @@ -1167,19 +1167,19 @@ void OP_ObjectplaceMovement(player_t *player) if (player->pflags & PF_ATTACKDOWN) { // 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; // Do nothing. return; } - if (cmd->buttons & BT_FORWARD) + /*if (cmd->buttons & BT_FORWARD) { OP_CycleThings(-1); player->pflags |= PF_ATTACKDOWN; } - else if (cmd->buttons & BT_BACKWARD) + else*/ if (cmd->buttons & BT_JUMP) { OP_CycleThings(1); player->pflags |= PF_ATTACKDOWN; @@ -1266,10 +1266,10 @@ void Command_ObjectPlace_f(void) HU_DoCEcho(va(M_GetText( "\\\\\\\\\\\\\\\\\\\\\\\\\x82" " Objectplace Controls: \x80\\\\" - "Camera L/R: Cycle mapthings\\" - " Jump: Float up \\" - " Spin: Float down \\" - " Fire Ring: Place object \\"))); + " Drift: Cycle mapthings\\" + "Accelerate: Float up \\" + " Brake: Float down \\" + " Item: Place object \\"))); } // Save all the player's data. diff --git a/src/p_mobj.c b/src/p_mobj.c index 3c09ee2d..184166b8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9468,7 +9468,10 @@ void P_SpawnPlayer(INT32 playernum) p->spectator = false; } else if (netgame && p->jointime < 1) - /*p->spectator = true*/; + { + //p->spectator = true; + p->kartstuff[k_comebackshowninfo] = 0; + } else if (multiplayer && !netgame) { // 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; P_SetScale(overheadarrow, mobj->destscale); - if (leveltime < 1) - p->kartstuff[k_comebackshowninfo] = 0; - if (gametype != GT_RACE) { /*INT32 i; diff --git a/src/p_user.c b/src/p_user.c index b9a1924d..f286601d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -5067,7 +5067,7 @@ static void P_SpectatorMovement(player_t *player) if (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; else if (cmd->buttons & BT_BRAKE) player->mo->z -= FRACUNIT*16; @@ -8011,12 +8011,13 @@ static void P_DeathThink(player_t *player) player->playerstate = PST_REBORN; else if (player->lives > 0 && !G_IsSpecialStage(gamemap) && leveltime >= 140) // Don't allow "click to respawn" in special stages! { - // SRB2kart - if (player->spectator) + // SRB2kart-- But wait, why'd we add this? :eggthinking: + /*if (player->spectator) { CONS_Printf("%s entered the game.\n", player_names[player-players]); player->spectator = false; - } + }*/ + //player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c // SRB2kart - spawn automatically after 1 second @@ -8385,7 +8386,12 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall // SRB2kart - Camera flipper if (lookback) + { camrotate += 180; + camspeed *= 2; + if (camspeed > FRACUNIT) + camspeed = FRACUNIT; + } #ifdef REDSANALOG 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; } - if ((netgame || splitscreen) && player->spectator && cmd->buttons & BT_ATTACK && !player->powers[pw_flashing]) + + if ((netgame || splitscreen) && !player->powers[pw_flashing]) { - if (P_SpectatorJoinGame(player)) - return; // player->mo was removed. + if (player->spectator && cmd->buttons & BT_ATTACK) + { + 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. diff --git a/src/st_stuff.c b/src/st_stuff.c index 85b74bd2..6a5bc796 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1951,15 +1951,17 @@ static void ST_overlayDrawer(void) #endif ) { - V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(60), V_HUDTRANSHALF, M_GetText("You are a spectator.")); - if (G_GametypeHasTeams()) - V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, M_GetText("Press Fire to be assigned to a team.")); + // SRB2kart: changed positions & text + V_DrawString(2, BASEVIDHEIGHT-50, V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); + /*if (G_GametypeHasTeams()) + V_DrawString(2, BASEVIDHEIGHT-40, V_HUDTRANSHALF, M_GetText("Item - Join Team")); 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.")); - else - V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, M_GetText("Press Fire to enter the game.")); - V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(148), V_HUDTRANSHALF, M_GetText("Press F12 to watch another player.")); - V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(164), V_HUDTRANSHALF, M_GetText("Press Jump to float and Spin to sink.")); + V_DrawString(2, BASEVIDHEIGHT-40, V_HUDTRANSHALF|V_REDMAP, M_GetText("- CANNOT JOIN -")); + else*/ + V_DrawString(2, BASEVIDHEIGHT-40, V_HUDTRANSHALF, M_GetText("Item - Enter Game")); + V_DrawString(2, BASEVIDHEIGHT-30, V_HUDTRANSHALF, M_GetText("F12 - Change View")); + V_DrawString(2, BASEVIDHEIGHT-20, V_HUDTRANSHALF, M_GetText("Accelerate - Float")); + V_DrawString(2, BASEVIDHEIGHT-10, V_HUDTRANSHALF, M_GetText("Brake - Sink")); } }