diff --git a/src/d_clisrv.c b/src/d_clisrv.c index b9f8dd58..40cd17dc 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1228,6 +1228,7 @@ static boolean CL_SendJoin(void) localplayers++; if (splitscreen4) localplayers++; + netbuffer->u.clientcfg.localplayers = localplayers; netbuffer->u.clientcfg.version = VERSION; netbuffer->u.clientcfg.subversion = SUBVERSION; @@ -2324,9 +2325,7 @@ static void Command_connect(void) CONS_Alert(CONS_ERROR, M_GetText("There is no network driver\n")); } - splitscreen = false; - splitscreen3 = false; - splitscreen4 = false; + splitscreen = splitscreen3 = splitscreen4 = false; SplitScreen_OnChange(); botingame = false; botskin = 0; @@ -2708,7 +2707,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum) // Is playernum authorized to make this kick? if (playernum != serverplayer && !IsPlayerAdmin(playernum) - && !(playerpernode[playernode[playernum]] == 2 + && !(playerpernode[playernode[playernum]] >= 2 && nodetoplayer2[playernode[playernum]] == pnum && nodetoplayer3[playernode[playernum]] == pnum && nodetoplayer4[playernode[playernum]] == pnum)) @@ -3078,7 +3077,7 @@ static inline void SV_AddNode(INT32 node) static void Got_AddPlayer(UINT8 **p, INT32 playernum) { INT16 node, newplayernum; - boolean splitscreenplayer; + UINT8 splitscreenplayer = 0; if (playernum != serverplayer && !IsPlayerAdmin(playernum)) { @@ -3097,8 +3096,8 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum) node = READUINT8(*p); newplayernum = READUINT8(*p); - splitscreenplayer = newplayernum & 0x80; - newplayernum &= ~0x80; + splitscreenplayer = newplayernum/MAXPLAYERS; + newplayernum %= MAXPLAYERS; // Clear player before joining, lest some things get set incorrectly // HACK: don't do this for splitscreen, it relies on preset values @@ -3116,11 +3115,13 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum) if (node == mynode) { playernode[newplayernum] = 0; // for information only - if (!splitscreenplayer) + if (splitscreenplayer == 0) { consoleplayer = newplayernum; displayplayer = newplayernum; secondarydisplayplayer = newplayernum; + thirddisplayplayer = newplayernum; + fourthdisplayplayer = newplayernum; DEBFILE("spawning me\n"); // Apply player flags as soon as possible! players[newplayernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE); @@ -3131,16 +3132,39 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum) } else { - secondarydisplayplayer = newplayernum; - DEBFILE("spawning my brother\n"); - if (botingame) - players[newplayernum].bot = 1; - // Same goes for player 2 when relevant - players[newplayernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE); - if (cv_flipcam2.value) - players[newplayernum].pflags |= PF_FLIPCAM; - if (cv_analog2.value) - players[newplayernum].pflags |= PF_ANALOGMODE; + if (splitscreenplayer == 2) + { + thirddisplayplayer = newplayernum; + DEBFILE("spawning my sister\n"); + players[newplayernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE); + if (cv_flipcam3.value) + players[newplayernum].pflags |= PF_FLIPCAM; + if (cv_analog3.value) + players[newplayernum].pflags |= PF_ANALOGMODE; + } + else if (splitscreenplayer == 3) + { + fourthdisplayplayer = newplayernum; + DEBFILE("spawning my trusty pet dog\n"); + players[newplayernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE); + if (cv_flipcam4.value) + players[newplayernum].pflags |= PF_FLIPCAM; + if (cv_analog4.value) + players[newplayernum].pflags |= PF_ANALOGMODE; + } + else + { + secondarydisplayplayer = newplayernum; + DEBFILE("spawning my brother\n"); + if (botingame) + players[newplayernum].bot = 1; + // Same goes for player 2 when relevant + players[newplayernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE); + if (cv_flipcam2.value) + players[newplayernum].pflags |= PF_FLIPCAM; + if (cv_analog2.value) + players[newplayernum].pflags |= PF_ANALOGMODE; + } } D_SendPlayerConfig(); addedtogame = true; @@ -3182,7 +3206,8 @@ static boolean SV_AddWaitingPlayers(void) for (; newplayernum < MAXPLAYERS; newplayernum++) { for (n = 0; n < MAXNETNODES; n++) - if (nodetoplayer[n] == newplayernum || nodetoplayer2[n] == newplayernum) + if (nodetoplayer[n] == newplayernum || nodetoplayer2[n] == newplayernum + || nodetoplayer3[n] == newplayernum || nodetoplayer4[n] == newplayernum) break; if (n == MAXNETNODES) break; @@ -3201,7 +3226,17 @@ static boolean SV_AddWaitingPlayers(void) else if (playerpernode[node] < 2) { nodetoplayer2[node] = newplayernum; - buf[1] |= 0x80; + buf[1] += MAXPLAYERS; + } + else if (playerpernode[node] < 3) + { + nodetoplayer3[node] = newplayernum; + buf[1] += MAXPLAYERS*2; + } + else if (playerpernode[node] < 4) + { + nodetoplayer4[node] = newplayernum; + buf[1] += MAXPLAYERS*3; } playerpernode[node]++; @@ -3804,10 +3839,17 @@ FILESTAMP else if (resynch_score[node]) --resynch_score[node]; break; - case PT_TEXTCMD2: // splitscreen special - netconsole = nodetoplayer2[node]; - /* FALLTHRU */ case PT_TEXTCMD: + case PT_TEXTCMD2: // splitscreen special + case PT_TEXTCMD3: + case PT_TEXTCMD4: + if (netbuffer->packettype == PT_TEXTCMD2) + netconsole = nodetoplayer2[node]; + else if (netbuffer->packettype == PT_TEXTCMD3) + netconsole = nodetoplayer3[node]; + else if (netbuffer->packettype == PT_TEXTCMD4) + netconsole = nodetoplayer4[node]; + if (client) break; @@ -3896,6 +3938,20 @@ FILESTAMP SendNetXCmd(XD_KICK, &buf, 2); nodetoplayer2[node] = -1; } + if (nodetoplayer3[node] != -1 && nodetoplayer3[node] >= 0 + && playeringame[(UINT8)nodetoplayer3[node]]) + { + buf[0] = nodetoplayer3[node]; + SendNetXCmd(XD_KICK, &buf, 2); + nodetoplayer3[node] = -1; + } + if (nodetoplayer4[node] != -1 && nodetoplayer4[node] >= 0 + && playeringame[(UINT8)nodetoplayer4[node]]) + { + buf[0] = nodetoplayer4[node]; + SendNetXCmd(XD_KICK, &buf, 2); + nodetoplayer4[node] = -1; + } } Net_CloseConnection(node); nodeingame[node] = false; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index c4c3836d..c15aa8a7 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -66,6 +66,8 @@ typedef enum PT_TEXTCMD, // Extra text commands from the client. PT_TEXTCMD2, // Splitscreen text commands. + PT_TEXTCMD3, + PT_TEXTCMD4, PT_CLIENTJOIN, // Client wants to join; used in start game. PT_NODETIMEOUT, // Packet sent to self if the connection times out. PT_RESYNCHING, // Packet sent to resync players. @@ -107,6 +109,7 @@ typedef struct ticcmd_t cmd, cmd2; } ATTRPACK client2cmd_pak; +/* // Splitscreen3 packet // WARNING: must have the same format of clientcmd_pak, for more easy use typedef struct @@ -126,6 +129,7 @@ typedef struct INT16 consistancy; ticcmd_t cmd, cmd2, cmd3, cmd4; } ATTRPACK client4cmd_pak; +*/ #ifdef _MSC_VER #pragma warning(disable : 4200) @@ -417,8 +421,8 @@ typedef struct { clientcmd_pak clientpak; // 144 bytes client2cmd_pak client2pak; // 200 bytes - client3cmd_pak client3pak; // 256 bytes(?) - client4cmd_pak client4pak; // 312 bytes(?) + //client3cmd_pak client3pak; // 256 bytes(?) + //client4cmd_pak client4pak; // 312 bytes(?) servertics_pak serverpak; // 132495 bytes (more around 360, no?) serverconfig_pak servercfg; // 773 bytes resynchend_pak resynchend; // diff --git a/src/d_net.c b/src/d_net.c index 643c41ac..32dc0217 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -892,6 +892,8 @@ static void DebugPrintpacket(const char *header) break; case PT_TEXTCMD: case PT_TEXTCMD2: + case PT_TEXTCMD3: + case PT_TEXTCMD4: fprintf(debugfile, " length %d\n ", netbuffer->u.textcmd[0]); fprintf(debugfile, "[%s]", netxcmdnames[netbuffer->u.textcmd[1] - 1]); fprintfstringnewline((char *)netbuffer->u.textcmd + 2, netbuffer->u.textcmd[0] - 1); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 20316d99..6a454f46 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1045,11 +1045,12 @@ static void CleanupPlayerName(INT32 playernum, const char *newname) // spaces may have been removed if (playernum == consoleplayer) CV_StealthSet(&cv_playername, tmpname); - else if (playernum == secondarydisplayplayer - || (!netgame && playernum == 1)) - { + else if (playernum == secondarydisplayplayer || (!netgame && playernum == 1)) CV_StealthSet(&cv_playername2, tmpname); - } + else if (playernum == thirddisplayplayer || (!netgame && playernum == 2)) + CV_StealthSet(&cv_playername3, tmpname); + else if (playernum == fourthdisplayplayer || (!netgame && playernum == 3)) + CV_StealthSet(&cv_playername4, tmpname); else I_Assert(((void)"CleanupPlayerName used on non-local player", 0)); Z_Free(buf); @@ -1157,11 +1158,15 @@ static void ForceAllSkins(INT32 forcedskin) CV_StealthSet(&cv_skin, skins[forcedskin].name); else if (i == secondarydisplayplayer) CV_StealthSet(&cv_skin2, skins[forcedskin].name); + else if (i == thirddisplayplayer) + CV_StealthSet(&cv_skin3, skins[forcedskin].name); + else if (i == fourthdisplayplayer) + CV_StealthSet(&cv_skin4, skins[forcedskin].name); } } } -static INT32 snacpending = 0, snac2pending = 0, chmappending = 0; +static INT32 snacpending = 0, snac2pending = 0, snac3pending = 0, snac4pending = 0, chmappending = 0; // name, color, or skin has changed // @@ -1284,7 +1289,7 @@ static void SendNameAndColor2(void) { INT32 secondplaya; - if ((!splitscreen || !splitscreen3 || !splitscreen4) && !botingame) + if (!(splitscreen || splitscreen3 || splitscreen4) && !botingame) return; // can happen if skin2/color2/name2 changed if (secondarydisplayplayer != consoleplayer) @@ -1381,8 +1386,8 @@ static void SendNameAndColor3(void) { INT32 thirdplaya; - if ((!splitscreen3 || !splitscreen4) && !botingame) - return; // can happen if skin2/color2/name2 changed + if (!(splitscreen3 || splitscreen4)) + return; // can happen if skin3/color3/name3 changed if (thirddisplayplayer != consoleplayer) thirdplaya = thirddisplayplayer; @@ -1414,15 +1419,7 @@ static void SendNameAndColor3(void) return; // If you're not in a netgame, merely update the skin, color, and name. - if (botingame) - { - players[thirdplaya].skincolor = botcolor; - if (players[thirdplaya].mo) - players[thirdplaya].mo->color = players[thirdplaya].skincolor; - SetPlayerSkinByNum(thirdplaya, botskin-1); - return; - } - else if (!netgame && !modeattacking) + if (!netgame && !modeattacking) { INT32 foundskin; @@ -1445,7 +1442,7 @@ static void SendNameAndColor3(void) { boolean notsame; - cv_skin2.value = foundskin; + cv_skin3.value = foundskin; notsame = (cv_skin3.value != players[thirdplaya].skin); @@ -1478,7 +1475,7 @@ static void SendNameAndColor4(void) { INT32 fourthplaya; - if (!splitscreen4 && !botingame) + if (!splitscreen4) return; // can happen if skin4/color4/name4 changed if (fourthdisplayplayer != consoleplayer) @@ -1586,9 +1583,13 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum) snacpending--; else if (playernum == secondarydisplayplayer) snac2pending--; + else if (playernum == thirddisplayplayer) + snac3pending--; + else if (playernum == fourthdisplayplayer) + snac4pending--; #ifdef PARANOIA - if (snacpending < 0 || snac2pending < 0) + if (snacpending < 0 || snac2pending < 0 || snac3pending < 0 || snac4pending < 0) I_Error("snacpending negative!"); #endif @@ -1606,7 +1607,8 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum) p->mo->color = (UINT8)p->skincolor; // normal player colors - if (server && (p != &players[consoleplayer] && p != &players[secondarydisplayplayer])) + if (server && (p != &players[consoleplayer] && p != &players[secondarydisplayplayer] + && p != &players[thirddisplayplayer] && p != &players[fourthdisplayplayer])) { boolean kick = false; @@ -1645,6 +1647,10 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum) CV_StealthSet(&cv_skin, skins[forcedskin].name); else if (playernum == secondarydisplayplayer) CV_StealthSet(&cv_skin2, skins[forcedskin].name); + else if (playernum == thirddisplayplayer) + CV_StealthSet(&cv_skin3, skins[forcedskin].name); + else if (playernum == fourthdisplayplayer) + CV_StealthSet(&cv_skin4, skins[forcedskin].name); } else SetPlayerSkinByNum(playernum, skin); @@ -2934,6 +2940,10 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) CV_SetValue(&cv_playercolor, NetPacket.packet.newteam + 5); else if (playernum == secondarydisplayplayer) CV_SetValue(&cv_playercolor2, NetPacket.packet.newteam + 5); + else if (playernum == thirddisplayplayer) + CV_SetValue(&cv_playercolor3, NetPacket.packet.newteam + 5); + else if (playernum == fourthdisplayplayer) + CV_SetValue(&cv_playercolor4, NetPacket.packet.newteam + 5); } } @@ -4607,7 +4617,7 @@ static void Skin_OnChange(void) */ static void Skin2_OnChange(void) { - if (!Playing() || (!splitscreen || !splitscreen3 || !splitscreen4)) + if (!Playing() || !(splitscreen || splitscreen3 || splitscreen4)) return; // do whatever you want if (CanChangeSkin(secondarydisplayplayer) && !P_PlayerMoving(secondarydisplayplayer)) @@ -4621,7 +4631,7 @@ static void Skin2_OnChange(void) static void Skin3_OnChange(void) { - if (!Playing() || (!splitscreen3 || !splitscreen4)) + if (!Playing() || !(splitscreen3 || splitscreen4)) return; // do whatever you want if (CanChangeSkin(thirddisplayplayer) && !P_PlayerMoving(thirddisplayplayer)) @@ -4681,7 +4691,7 @@ static void Color_OnChange(void) */ static void Color2_OnChange(void) { - if (!Playing() || (!splitscreen || !splitscreen3 || !splitscreen4)) + if (!Playing() || !(splitscreen || splitscreen3 || splitscreen4)) return; // do whatever you want if (!P_PlayerMoving(secondarydisplayplayer)) @@ -4698,7 +4708,7 @@ static void Color2_OnChange(void) static void Color3_OnChange(void) { - if (!Playing() || (!splitscreen3 || !splitscreen4)) + if (!Playing() || !(splitscreen3 || splitscreen4)) return; // do whatever you want if (!P_PlayerMoving(thirddisplayplayer)) diff --git a/src/dehacked.c b/src/dehacked.c index c4c8fed9..e93ab35a 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8743,6 +8743,12 @@ static inline int lib_getenum(lua_State *L) } else if (fastcmp(word,"splitscreen")) { lua_pushboolean(L, splitscreen); return 1; + } else if (fastcmp(word,"splitscreen3")) { + lua_pushboolean(L, splitscreen3); + return 1; + } else if (fastcmp(word,"splitscreen4")) { + lua_pushboolean(L, splitscreen4); + return 1; } else if (fastcmp(word,"gamecomplete")) { lua_pushboolean(L, gamecomplete); return 1; diff --git a/src/g_game.c b/src/g_game.c index f2fcbc8e..65f80109 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1709,7 +1709,7 @@ static void Analog2_OnChange(void) static void Analog3_OnChange(void) { - if (!((splitscreen3 || splitscreen4) || botingame) || !cv_cam3_dist.string) + if (!(splitscreen3 || splitscreen4) || !cv_cam3_dist.string) return; // cameras are not initialized at this point @@ -1729,7 +1729,7 @@ static void Analog3_OnChange(void) static void Analog4_OnChange(void) { - if (!(splitscreen4 || botingame) || !cv_cam4_dist.string) + if (!(splitscreen4) || !cv_cam4_dist.string) return; // cameras are not initialized at this point @@ -2459,6 +2459,10 @@ void G_PlayerReborn(INT32 player) CV_SetValue(&cv_playercolor, skincolor_redteam); else if (p == &players[secondarydisplayplayer]) CV_SetValue(&cv_playercolor2, skincolor_redteam); + else if (p == &players[thirddisplayplayer]) + CV_SetValue(&cv_playercolor3, skincolor_redteam); + else if (p == &players[fourthdisplayplayer]) + CV_SetValue(&cv_playercolor4, skincolor_redteam); } else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam) { @@ -2466,6 +2470,10 @@ void G_PlayerReborn(INT32 player) CV_SetValue(&cv_playercolor, skincolor_blueteam); else if (p == &players[secondarydisplayplayer]) CV_SetValue(&cv_playercolor2, skincolor_blueteam); + else if (p == &players[thirddisplayplayer]) + CV_SetValue(&cv_playercolor3, skincolor_blueteam); + else if (p == &players[fourthdisplayplayer]) + CV_SetValue(&cv_playercolor4, skincolor_blueteam); } } } diff --git a/src/k_kart.c b/src/k_kart.c index f79b5f1e..47e14ee4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3589,8 +3589,14 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_bootimer] > 0) { - if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) - || (!(player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) + if ((player == &players[displayplayer] + || ((splitscreen || splitscreen3 || splitscreen4) && player == &players[secondarydisplayplayer]) + || ((splitscreen3 || splitscreen4) && player == &players[thirddisplayplayer]) + || (splitscreen4 && player == &players[fourthdisplayplayer])) + || (!(player == &players[displayplayer] + || ((splitscreen || splitscreen3 || splitscreen4) && player == &players[secondarydisplayplayer]) + || ((splitscreen3 || splitscreen4) && player == &players[thirddisplayplayer]) + || (splitscreen4 && player == &players[fourthdisplayplayer])) && (player->kartstuff[k_bootimer] < 1*TICRATE/2 || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) { if (leveltime & 1) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 4679c0c5..47560847 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -381,6 +381,10 @@ static int player_set(lua_State *L) localaiming = plr->aiming; else if (plr == &players[secondarydisplayplayer]) localaiming2 = plr->aiming; + else if (plr == &players[thirddisplayplayer]) + localaiming3 = plr->aiming; + else if (plr == &players[fourthdisplayplayer]) + localaiming4 = plr->aiming; } else if (fastcmp(field,"health")) plr->health = (INT32)luaL_checkinteger(L, 3); diff --git a/src/p_enemy.c b/src/p_enemy.c index 2b010327..46fc973f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4075,7 +4075,7 @@ void A_OverlayThink(mobj_t *actor) if (!actor->target) return; - if (!splitscreen && rendermode != render_soft) + if (!(splitscreen || splitscreen3 || splitscreen4) && rendermode != render_soft) { angle_t viewingangle; diff --git a/src/p_inter.c b/src/p_inter.c index 1f86a869..984eb055 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -62,8 +62,12 @@ void P_ForceConstant(const BasicFF_t *FFInfo) ConstantQuake.Magnitude = FFInfo->Magnitude; if (FFInfo->player == &players[consoleplayer]) I_Tactile(ConstantForce, &ConstantQuake); - else if (splitscreen && FFInfo->player == &players[secondarydisplayplayer]) + else if ((splitscreen || splitscreen3 || splitscreen4) && FFInfo->player == &players[secondarydisplayplayer]) I_Tactile2(ConstantForce, &ConstantQuake); + else if ((splitscreen3 || splitscreen4) && FFInfo->player == &players[thirddisplayplayer]) + I_Tactile3(ConstantForce, &ConstantQuake); + else if (splitscreen4 && FFInfo->player == &players[fourthdisplayplayer]) + I_Tactile4(ConstantForce, &ConstantQuake); } void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End) { @@ -79,8 +83,12 @@ void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End) RampQuake.End = End; if (FFInfo->player == &players[consoleplayer]) I_Tactile(ConstantForce, &RampQuake); - else if (splitscreen && FFInfo->player == &players[secondarydisplayplayer]) + else if ((splitscreen || splitscreen3 || splitscreen4) && FFInfo->player == &players[secondarydisplayplayer]) I_Tactile2(ConstantForce, &RampQuake); + else if ((splitscreen3 || splitscreen4) && FFInfo->player == &players[thirddisplayplayer]) + I_Tactile3(ConstantForce, &RampQuake); + else if (splitscreen4 && FFInfo->player == &players[fourthdisplayplayer]) + I_Tactile4(ConstantForce, &RampQuake); } @@ -2245,6 +2253,10 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) // added : 22-02-98: recenter view for next life... localaiming2 = 0; } + if (target->player == &players[thirddisplayplayer]) + localaiming3 = 0; + if (target->player == &players[fourthdisplayplayer]) + localaiming4 = 0; //tag deaths handled differently in suicide cases. Don't count spectators! if (G_TagGametype() diff --git a/src/p_map.c b/src/p_map.c index 00108372..0e9a6e02 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1351,6 +1351,10 @@ static boolean PIT_CheckThing(mobj_t *thing) localangle = thing->angle; else if (thing->player == &players[secondarydisplayplayer]) localangle2 = thing->angle; + else if (thing->player == &players[thirddisplayplayer]) + localangle3 = thing->angle; + else if (thing->player == &players[fourthdisplayplayer]) + localangle4 = thing->angle; } return true; diff --git a/src/p_mobj.c b/src/p_mobj.c index ee54f3dc..8de54718 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3630,8 +3630,12 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled if (postimg != postimg_none) { - if (splitscreen && player == &players[secondarydisplayplayer]) + if ((splitscreen || splitscreen3 || splitscreen4) && player == &players[secondarydisplayplayer]) postimgtype2 = postimg; + else if ((splitscreen3 || splitscreen4) && player == &players[thirddisplayplayer]) + postimgtype3 = postimg; + else if (splitscreen4 && player == &players[fourthdisplayplayer]) + postimgtype4 = postimg; else postimgtype = postimg; } @@ -3678,6 +3682,10 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled if (player == &players[secondarydisplayplayer]) cam_height = cv_cam2_height.value; + if (player == &players[thirddisplayplayer]) + cam_height = cv_cam3_height.value; + if (player == &players[fourthdisplayplayer]) + cam_height = cv_cam4_height.value; if (thiscam->z > player->mo->z + player->mo->height + FixedMul(cam_height*FRACUNIT + 16*FRACUNIT, player->mo->scale)) { if (!resetcalled) @@ -6502,8 +6510,14 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_bootimer] > 0) { - if ((mobj->target->player == &players[displayplayer] || (splitscreen && mobj->target->player == &players[secondarydisplayplayer])) - || (!(mobj->target->player == &players[displayplayer] || (splitscreen && mobj->target->player == &players[secondarydisplayplayer])) + if ((mobj->target->player == &players[displayplayer] + || ((splitscreen || splitscreen3 || splitscreen4) && mobj->target->player == &players[secondarydisplayplayer]) + || ((splitscreen3 || splitscreen4) && mobj->target->player == &players[thirddisplayplayer]) + || (splitscreen4 && mobj->target->player == &players[fourthdisplayplayer])) + || (!(mobj->target->player == &players[displayplayer] + || ((splitscreen || splitscreen3 || splitscreen4) && mobj->target->player == &players[secondarydisplayplayer]) + || ((splitscreen3 || splitscreen4) && mobj->target->player == &players[thirddisplayplayer]) + || (splitscreen4 && mobj->target->player == &players[fourthdisplayplayer])) && (mobj->target->player->kartstuff[k_bootimer] < 1*TICRATE/2 || mobj->target->player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) { if (leveltime & 1) diff --git a/src/p_setup.c b/src/p_setup.c index 3e817fb1..6086a346 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2365,7 +2365,7 @@ static void P_ForceCharacter(const char *forcecharskin) } else { - if (splitscreen) + if (splitscreen || splitscreen3 || splitscreen4) { SetPlayerSkin(secondarydisplayplayer, forcecharskin); if ((unsigned)cv_playercolor2.value != skins[players[secondarydisplayplayer].skin].prefcolor && !modeattacking) @@ -2375,6 +2375,26 @@ static void P_ForceCharacter(const char *forcecharskin) } } + if (splitscreen3 || splitscreen4) + { + SetPlayerSkin(thirddisplayplayer, forcecharskin); + if ((unsigned)cv_playercolor3.value != skins[players[thirddisplayplayer].skin].prefcolor && !modeattacking) + { + CV_StealthSetValue(&cv_playercolor3, skins[players[thirddisplayplayer].skin].prefcolor); + players[thirddisplayplayer].skincolor = skins[players[thirddisplayplayer].skin].prefcolor; + } + } + + if (splitscreen4) + { + SetPlayerSkin(fourthdisplayplayer, forcecharskin); + if ((unsigned)cv_playercolor4.value != skins[players[fourthdisplayplayer].skin].prefcolor && !modeattacking) + { + CV_StealthSetValue(&cv_playercolor4, skins[players[fourthdisplayplayer].skin].prefcolor); + players[fourthdisplayplayer].skincolor = skins[players[fourthdisplayplayer].skin].prefcolor; + } + } + SetPlayerSkin(consoleplayer, forcecharskin); // normal player colors in single player if ((unsigned)cv_playercolor.value != skins[players[consoleplayer].skin].prefcolor && !modeattacking) diff --git a/src/p_spec.c b/src/p_spec.c index 27c17bde..693cf2b7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2511,7 +2511,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (line->flags & ML_NOCLIMB) { // play the sound from nowhere, but only if display player triggered it - if (mo && mo->player && (mo->player == &players[displayplayer] || mo->player == &players[secondarydisplayplayer])) + if (mo && mo->player && (mo->player == &players[displayplayer] || mo->player == &players[secondarydisplayplayer] + || mo->player == &players[thirddisplayplayer] || mo->player == &players[fourthdisplayplayer])) S_StartSound(NULL, sfxnum); } else if (line->flags & ML_EFFECT4) diff --git a/src/p_user.c b/src/p_user.c index 0ad1c64f..67a89360 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -601,6 +601,10 @@ static void P_DeNightserizePlayer(player_t *player) localaiming = 0; else if (player == &players[secondarydisplayplayer]) localaiming2 = 0; + else if (player == &players[thirddisplayplayer]) + localaiming3 = 0; + else if (player == &players[fourthdisplayplayer]) + localaiming4 = 0; // If you screwed up, kiss your score goodbye. player->marescore = 0; @@ -1392,7 +1396,10 @@ fixed_t P_GetPlayerSpinHeight(player_t *player) // boolean P_IsLocalPlayer(player_t *player) { - return ((splitscreen && player == &players[secondarydisplayplayer]) || player == &players[consoleplayer]); + return ((splitscreen4 && player == &players[fourthdisplayplayer]) + || ((splitscreen3 || splitscreen4) && player == &players[thirddisplayplayer]) + || ((splitscreen || splitscreen3 || splitscreen4) && player == &players[secondarydisplayplayer]) + || player == &players[consoleplayer]); } // @@ -2365,7 +2372,8 @@ static void P_DoPlayerHeadSigns(player_t *player) // If you're "IT", show a big "IT" over your head for others to see. if (player->pflags & PF_TAGIT) { - if (!(player == &players[consoleplayer] || player == &players[secondarydisplayplayer] || player == &players[displayplayer])) // Don't display it on your own view. + if (!(player == &players[consoleplayer] || player == &players[displayplayer] || player == &players[secondarydisplayplayer] + || player == &players[thirddisplayplayer] || player == &players[fourthdisplayplayer])) // Don't display it on your own view. { if (!(player->mo->eflags & MFE_VERTICALFLIP)) P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height, MT_TAG); @@ -6300,6 +6308,10 @@ static void P_NiGHTSMovement(player_t *player) localaiming = movingangle; else if (player == &players[secondarydisplayplayer]) localaiming2 = movingangle; + else if (player == &players[thirddisplayplayer]) + localaiming3 = movingangle; + else if (player == &players[fourthdisplayplayer]) + localaiming4 = movingangle; player->mo->tracer->angle = player->mo->angle; @@ -6791,7 +6803,10 @@ static void P_MovePlayer(player_t *player) S_StartSound(player->mo, sfx_mkdrft); // Ok, we'll stop now. else if ((player->kartstuff[k_drift] == 0) - && (player == &players[consoleplayer] || (splitscreen && player == &players[secondarydisplayplayer]))) + && (player == &players[consoleplayer] + || ((splitscreen || splitscreen3 || splitscreen4) && player == &players[secondarydisplayplayer]) + || ((splitscreen3 || splitscreen4) && player == &players[thirddisplayplayer]) + || (splitscreen4 && player == &players[fourthdisplayplayer]))) S_StopSoundByID(player->mo, sfx_mkdrft); } } @@ -8491,21 +8506,11 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall { dist = camdist; - if (splitscreen) // x1.5 dist for splitscreen + if (splitscreen || splitscreen3 || splitscreen4) // x1.5 dist for splitscreen { dist = FixedMul(dist, 3*FRACUNIT/2); height = FixedMul(height, 3*FRACUNIT/2); } - else if (splitscreen3) // x1.75 dist for 3p - { - dist = FixedMul(dist, 7*FRACUNIT/4); - height = FixedMul(height, 7*FRACUNIT/4); - } - else if (splitscreen4) // x2 dist for 4p - { - dist = FixedMul(dist, 2*FRACUNIT); - height = FixedMul(height, 2*FRACUNIT); - } // x1.2 dist for analog if (P_AnalogMove(player)) @@ -9010,7 +9015,17 @@ static void P_CalcPostImg(player_t *player) pviewheight = player->awayviewmobj->z + 20*FRACUNIT; } - if (splitscreen && player == &players[secondarydisplayplayer]) + if (splitscreen4 && player == &players[fourthdisplayplayer]) + { + type = &postimgtype4; + param = &postimgparam4; + } + else if ((splitscreen3 || splitscreen4) && player == &players[thirddisplayplayer]) + { + type = &postimgtype3; + param = &postimgparam3; + } + else if ((splitscreen || splitscreen3 || splitscreen4) && player == &players[secondarydisplayplayer]) { type = &postimgtype2; param = &postimgparam2; diff --git a/src/r_main.c b/src/r_main.c index 66869145..1c9e8744 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -660,11 +660,11 @@ void R_ExecuteSetViewSize(void) if (splitscreen || splitscreen3 || splitscreen4) viewheight >>= 1; + viewwidth = scaledviewwidth; + if (splitscreen3 || splitscreen4) viewwidth >>= 1; - viewwidth = scaledviewwidth; - centerx = viewwidth/2; centery = viewheight/2; centerxfrac = centerx<prefcolor); else if (playernum == secondarydisplayplayer) CV_StealthSetValue(&cv_playercolor2, skin->prefcolor); + else if (playernum == thirddisplayplayer) + CV_StealthSetValue(&cv_playercolor3, skin->prefcolor); + else if (playernum == fourthdisplayplayer) + CV_StealthSetValue(&cv_playercolor4, skin->prefcolor); player->skincolor = skin->prefcolor; if (player->mo) player->mo->color = player->skincolor; diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 298fa5f0..11da6674 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2566,6 +2566,20 @@ FUNCMATH void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect) (void)FFEffect; } +FUNCMATH void I_Tactile3(FFType pFFType, const JoyFF_t *FFEffect) +{ + // UNUSED. + (void)pFFType; + (void)FFEffect; +} + +FUNCMATH void I_Tactile4(FFType pFFType, const JoyFF_t *FFEffect) +{ + // UNUSED. + (void)pFFType; + (void)FFEffect; +} + /** \brief empty ticcmd for player 1 */ static ticcmd_t emptycmd; diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index 9058cc4d..86ac6e55 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -2727,6 +2727,20 @@ void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect) (void)FFEffect; } +void I_Tactile3(FFType pFFType, const JoyFF_t *FFEffect) +{ + // UNUSED. + (void)pFFType; + (void)FFEffect; +} + +void I_Tactile4(FFType pFFType, const JoyFF_t *FFEffect) +{ + // UNUSED. + (void)pFFType; + (void)FFEffect; +} + /** \brief empty ticcmd for player 1 */ static ticcmd_t emptycmd; @@ -2745,6 +2759,24 @@ ticcmd_t *I_BaseTiccmd2(void) return &emptycmd2; } +/** \brief empty ticcmd for player 3 +*/ +static ticcmd_t emptycmd3; + +ticcmd_t *I_BaseTiccmd3(void) +{ + return &emptycmd3; +} + +/** \brief empty ticcmd for player 4 +*/ +static ticcmd_t emptycmd4; + +ticcmd_t *I_BaseTiccmd4(void) +{ + return &emptycmd4; +} + #if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) static HMODULE winmm = NULL; static DWORD starttickcount = 0; // hack for win2k time bug diff --git a/src/st_stuff.c b/src/st_stuff.c index 3ea045ca..cd774f30 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1993,10 +1993,22 @@ void ST_Drawer(void) stplyr = &players[displayplayer]; ST_overlayDrawer(); - if (splitscreen) + if (splitscreen || splitscreen3 || splitscreen4) { stplyr = &players[secondarydisplayplayer]; ST_overlayDrawer(); } + + if (splitscreen3 || splitscreen4) + { + stplyr = &players[thirddisplayplayer]; + ST_overlayDrawer(); + } + + if (splitscreen4) + { + stplyr = &players[fourthdisplayplayer]; + ST_overlayDrawer(); + } } }