X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=7c499d4958f690958daecda3d5fd070d97fd67c3;hb=6af04febaefa3715e0dd42083a781df9b7f5e54e;hp=6049b9062b623b4ecbee540b685c17f6aca9e1c2;hpb=89165e554041bc31dc609a23991bcb277a7e6556;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 6049b90..7c499d4 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -29,10 +29,11 @@ type GameType: Byte; GameMode: Byte; TimeLimit: Word; - GoalLimit: Word; + ScoreLimit: Word; WarmupTime: Word; SpawnInvul: Word; ItemRespawnTime: Word; + RulezTimeMultiplier: Word; MaxLives: Byte; Options: LongWord; WAD: String; @@ -103,8 +104,8 @@ procedure g_Game_RemovePlayer(); procedure g_Game_Spectate(); procedure g_Game_SpectateCenterView(); procedure g_Game_StartSingle(Map: String; TwoPlayers: Boolean; nPlayers: Byte); -procedure g_Game_StartCustom(Map: String; GameMode: Byte; TimeLimit, GoalLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte); -procedure g_Game_StartServer(Map: String; GameMode: Byte; TimeLimit, GoalLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte; IPAddr: LongWord; Port: Word); +procedure g_Game_StartCustom(Map: String; GameMode: Byte; TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte); +procedure g_Game_StartServer(Map: String; GameMode: Byte; TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte; IPAddr: LongWord; Port: Word); procedure g_Game_StartClient(Addr: String; Port: Word; PW: String); procedure g_Game_Restart(); procedure g_Game_RestartLevel(); @@ -131,6 +132,7 @@ procedure g_Game_ChatSound(Text: String; Taunt: Boolean = True); procedure g_Game_Announce_GoodShot(SpawnerUID: Word); procedure g_Game_Announce_KillCombo(Param: Integer); procedure g_Game_Announce_BodyKill(SpawnerUID: Word); +procedure g_Game_Effect_Bubbles(fX, fY: Integer; count: Word; devX, devY: Byte; Silent: Boolean = False); procedure g_Game_StartVote(Command, Initiator: string); procedure g_Game_CheckVote; procedure g_TakeScreenShot(Filename: string = ''); @@ -194,6 +196,7 @@ const GAME_OPTION_TEAMABSORBDAMAGE = 1024; GAME_OPTION_ALLOWDROPFLAG = 2048; GAME_OPTION_THROWFLAG = 4096; + GAME_OPTION_RULEZRANDOM = 8192; STATE_NONE = 0; STATE_MENU = 1; @@ -275,7 +278,7 @@ var gPauseHolmes: Boolean = false; gShowTime: Boolean = False; gShowFPS: Boolean = False; - gShowGoals: Boolean = True; + gShowScore: Boolean = True; gShowStat: Boolean = True; gShowPIDs: Boolean = False; gShowKillMsg: Boolean = True; @@ -350,6 +353,7 @@ var gWeaponAction: Array [0..1, WP_FACT..WP_LACT] of Boolean; // [player, weapon_action] gSelectWeapon: Array [0..1, WP_FIRST..WP_LAST] of Boolean; // [player, weapon] gInterReadyCount: Integer = 0; + gMaxBots: Integer = 127; g_dbg_ignore_bounds: Boolean = false; r_smallmap_h: Integer = 0; // 0: left; 1: center; 2: right @@ -666,7 +670,7 @@ end; // saves a shitty CSV containing the game stats passed to it procedure SaveGameStat(Stat: TEndCustomGameStat; Path: string); -var +var s: TextFile; dir, fname, map, mode, etime: String; I: Integer; @@ -679,6 +683,7 @@ begin fname := e_CatPath(fname, StatFilename + '.csv'); AssignFile(s, fname); try + SetTextCodePage(s, CP_UTF8); Rewrite(s); // line 1: stats ver, datetime, server name, map name, game mode, time limit, score limit, dmflags, game time, num players if g_Game_IsNet then fname := NetServerName else fname := ''; @@ -697,7 +702,7 @@ begin dquoteStr(map), mode, gGameSettings.TimeLimit, - gGameSettings.GoalLimit, + gGameSettings.ScoreLimit, gGameSettings.Options, etime, Length(Stat.PlayerStat) @@ -707,8 +712,8 @@ begin // if it's a coop game: monsters killed, monsters total, secrets found, secrets total // otherwise nothing if Stat.GameMode in [GM_TDM, GM_CTF] then - WriteLn(s, - Format('red_score,blue_score' + LineEnding + '%d,%d', [Stat.TeamStat[TEAM_RED].Goals, Stat.TeamStat[TEAM_BLUE].Goals])) + WriteLn(s, + Format('red_score,blue_score' + LineEnding + '%d,%d', [Stat.TeamStat[TEAM_RED].Score, Stat.TeamStat[TEAM_BLUE].Score])) else if Stat.GameMode in [GM_COOP, GM_SINGLE] then WriteLn(s, Format('mon_killed,mon_total,secrets_found,secrets_total' + LineEnding + '%d,%d,%d,%d',[gCoopMonstersKilled, gTotalMonsters, gCoopSecretsFound, gSecretsCount])); @@ -726,6 +731,17 @@ begin CloseFile(s); end; +procedure ClearDebugCvars(); +begin + g_debug_Sounds := False; + g_debug_Frames := False; + g_debug_WinMsgs := False; + g_debug_MonsterOff := False; + g_debug_BotAIOff := 0; + g_debug_HealthBar := False; + g_Debug_Player := False; +end; + function g_Game_ModeToText(Mode: Byte): string; begin Result := ''; @@ -1206,7 +1222,7 @@ begin s1 := _lc[I_GAME_DM] else s1 := _lc[I_GAME_LMS]; - s2 := Format(_lc[I_GAME_FRAG_LIMIT], [gGameSettings.GoalLimit]); + s2 := Format(_lc[I_GAME_FRAG_LIMIT], [gGameSettings.ScoreLimit]); s3 := Format(_lc[I_GAME_TIME_LIMIT], [gGameSettings.TimeLimit div 3600, (gGameSettings.TimeLimit div 60) mod 60, gGameSettings.TimeLimit mod 60]); end; @@ -1216,14 +1232,14 @@ begin s1 := _lc[I_GAME_TDM] else s1 := _lc[I_GAME_TLMS]; - s2 := Format(_lc[I_GAME_FRAG_LIMIT], [gGameSettings.GoalLimit]); + s2 := Format(_lc[I_GAME_FRAG_LIMIT], [gGameSettings.ScoreLimit]); s3 := Format(_lc[I_GAME_TIME_LIMIT], [gGameSettings.TimeLimit div 3600, (gGameSettings.TimeLimit div 60) mod 60, gGameSettings.TimeLimit mod 60]); end; GM_CTF: begin s1 := _lc[I_GAME_CTF]; - s2 := Format(_lc[I_GAME_SCORE_LIMIT], [gGameSettings.GoalLimit]); + s2 := Format(_lc[I_GAME_SCORE_LIMIT], [gGameSettings.ScoreLimit]); s3 := Format(_lc[I_GAME_TIME_LIMIT], [gGameSettings.TimeLimit div 3600, (gGameSettings.TimeLimit div 60) mod 60, gGameSettings.TimeLimit mod 60]); end; @@ -1293,7 +1309,7 @@ begin end; e_TextureFontPrintEx(x+16, _y, s1, gStdFont, r, g, b, 1); - e_TextureFontPrintEx(x+w1+16, _y, IntToStr(gTeamStat[a].Goals), + e_TextureFontPrintEx(x+w1+16, _y, IntToStr(gTeamStat[a].Score), gStdFont, r, g, b, 1); _y := _y+ch+(ch div 4); @@ -2009,7 +2025,7 @@ begin gFlags[FLAG_BLUE].CaptureTime := gFlags[FLAG_BLUE].CaptureTime + GAME_TICK; // Áûë çàäàí ëèìèò ïîáåä: - if (gGameSettings.GoalLimit > 0) then + if (gGameSettings.ScoreLimit > 0) then begin b := 0; @@ -2023,11 +2039,11 @@ begin else if gGameSettings.GameMode in [GM_TDM, GM_CTF] then begin //  CTF/TDM âûáèðàåì êîìàíäó ñ íàèáîëüøèì ñ÷åòîì - b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals); + b := Max(gTeamStat[TEAM_RED].Score, gTeamStat[TEAM_BLUE].Score); end; // Ëèìèò ïîáåä íàáðàí => êîíåö óðîâíÿ: - if b >= gGameSettings.GoalLimit then + if b >= gGameSettings.ScoreLimit then begin g_Game_NextLevel(); Exit; @@ -2846,8 +2862,8 @@ begin _y := _y+16+16; with CustomStat do - if TeamStat[TEAM_RED].Goals > TeamStat[TEAM_BLUE].Goals then s1 := _lc[I_GAME_WIN_RED] - else if TeamStat[TEAM_BLUE].Goals > TeamStat[TEAM_RED].Goals then s1 := _lc[I_GAME_WIN_BLUE] + if TeamStat[TEAM_RED].Score > TeamStat[TEAM_BLUE].Score then s1 := _lc[I_GAME_WIN_RED] + else if TeamStat[TEAM_BLUE].Score > TeamStat[TEAM_RED].Score then s1 := _lc[I_GAME_WIN_BLUE] else s1 := _lc[I_GAME_WIN_DRAW]; e_TextureFontPrintEx(x+8+(w div 2)-(Length(s1)*ww2 div 2), _y, s1, gStdFont, 255, 255, 255, 1); @@ -2859,7 +2875,7 @@ begin begin e_TextureFontPrintEx(x+8, _y, _lc[I_GAME_TEAM_RED], gStdFont, 255, 0, 0, 1); - e_TextureFontPrintEx(x+w1+8, _y, IntToStr(CustomStat.TeamStat[TEAM_RED].Goals), + e_TextureFontPrintEx(x+w1+8, _y, IntToStr(CustomStat.TeamStat[TEAM_RED].Score), gStdFont, 255, 0, 0, 1); r := 255; g := 0; @@ -2869,7 +2885,7 @@ begin begin e_TextureFontPrintEx(x+8, _y, _lc[I_GAME_TEAM_BLUE], gStdFont, 0, 0, 255, 1); - e_TextureFontPrintEx(x+w1+8, _y, IntToStr(CustomStat.TeamStat[TEAM_BLUE].Goals), + e_TextureFontPrintEx(x+w1+8, _y, IntToStr(CustomStat.TeamStat[TEAM_BLUE].Score), gStdFont, 0, 0, 255, 1); r := 0; g := 0; @@ -4481,6 +4497,7 @@ begin gGameSettings.Options := gGameSettings.Options + GAME_OPTION_BOTVSMONSTER; gGameSettings.Options := gGameSettings.Options + GAME_OPTION_TEAMHITPROJECTILE; gGameSettings.Options := gGameSettings.Options + GAME_OPTION_TEAMHITTRACE; + gGameSettings.Options := gGameSettings.Options + GAME_OPTION_RULEZRANDOM; gSwitchGameMode := GM_SINGLE; gLMSRespawn := LMS_RESPAWN_NONE; @@ -4547,7 +4564,7 @@ begin end; procedure g_Game_StartCustom(Map: String; GameMode: Byte; - TimeLimit, GoalLimit: Word; + TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte); var @@ -4564,7 +4581,7 @@ begin gGameSettings.GameMode := GameMode; gSwitchGameMode := GameMode; gGameSettings.TimeLimit := TimeLimit; - gGameSettings.GoalLimit := GoalLimit; + gGameSettings.ScoreLimit := ScoreLimit; gGameSettings.MaxLives := IfThen(GameMode = GM_CTF, 0, MaxLives); gGameSettings.Options := Options; @@ -4660,7 +4677,7 @@ begin end; procedure g_Game_StartServer(Map: String; GameMode: Byte; - TimeLimit, GoalLimit: Word; MaxLives: Byte; + TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte; IPAddr: LongWord; Port: Word); begin @@ -4671,12 +4688,14 @@ begin g_Game_ClearLoading(); + ClearDebugCvars(); + // Íàñòðîéêè èãðû: gGameSettings.GameType := GT_SERVER; gGameSettings.GameMode := GameMode; gSwitchGameMode := GameMode; gGameSettings.TimeLimit := TimeLimit; - gGameSettings.GoalLimit := GoalLimit; + gGameSettings.ScoreLimit := ScoreLimit; gGameSettings.MaxLives := IfThen(GameMode = GM_CTF, 0, MaxLives); gGameSettings.Options := Options; @@ -4804,6 +4823,8 @@ begin g_Game_ClearLoading(); + ClearDebugCvars(); + // Íàñòðîéêè èãðû: gGameSettings.GameType := GT_CLIENT; @@ -4853,12 +4874,6 @@ begin begin if (NetEvent.kind = ENET_EVENT_TYPE_RECEIVE) then begin - if (NetEvent.channelID = NET_CHAN_DOWNLOAD_EX) then - begin - // ignore all download packets, they're processed by separate code - enet_packet_destroy(NetEvent.packet); - continue; - end; Ptr := NetEvent.packet^.data; if not InMsg.Init(Ptr, NetEvent.packet^.dataLength, True) then begin @@ -4881,7 +4896,7 @@ begin gGameSettings.GameMode := InMsg.ReadByte(); gSwitchGameMode := gGameSettings.GameMode; - gGameSettings.GoalLimit := InMsg.ReadWord(); + gGameSettings.ScoreLimit := InMsg.ReadWord(); gGameSettings.TimeLimit := InMsg.ReadWord(); gGameSettings.MaxLives := InMsg.ReadByte(); gGameSettings.Options := InMsg.ReadLongWord(); @@ -4958,8 +4973,7 @@ begin end; end; - ProcessLoading(true); - + ProcessLoading(True); if g_Net_UserRequestExit() then begin State := 0; @@ -5162,6 +5176,11 @@ begin if NetMode = NET_SERVER then begin + // reset full state flags + if NetClients <> nil then + for I := 0 to High(NetClients) do + NetClients[I].FullUpdateSent := False; + MH_SEND_GameEvent(NET_EV_MAPSTART, gGameSettings.GameMode, Map); // Ìàñòåðñåðâåð @@ -5179,7 +5198,7 @@ begin end; end; - g_Net_UnbanNonPermHosts(); + g_Net_UnbanNonPerm(); end; if gLastMap then @@ -5515,6 +5534,7 @@ var a, b: Integer; stat: TPlayerStatArray; cmd: string; + it: PItem; procedure ParseGameFlag(Flag: LongWord; OffMsg, OnMsg: TStrings_Locale; OnMapChange: Boolean = False); var @@ -5594,6 +5614,10 @@ begin begin ParseGameFlag(GAME_OPTION_TEAMHITPROJECTILE, I_MSG_FRIENDLY_PROJECT_TRACE_OFF, I_MSG_FRIENDLY_PROJECT_TRACE_ON); end + else if cmd = 'g_powerup_randomize_respawn' then + begin + ParseGameFlag(GAME_OPTION_RULEZRANDOM, I_MSG_RULEZ_RANDOM_OFF, I_MSG_RULEZ_RANDOM_ON, False); + end else if cmd = 'g_weaponstay' then begin ParseGameFlag(GAME_OPTION_WEAPONSTAY, I_MSG_WEAPONSTAY_OFF, I_MSG_WEAPONSTAY_ON); @@ -5690,6 +5714,21 @@ begin g_Console_Add(Format('%s %d', [cmd, Integer(gsItemRespawnTime)])); if g_Game_IsServer then g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); end + else if cmd = 'g_powerup_time_multiplier' then + begin + if Length(P) > 1 then + begin + gsRulezTimeMultiplier := nclamp(StrToIntDef(P[1], gsRulezTimeMultiplier), 0, $FFFF); + if g_Game_IsServer then + begin + gGameSettings.RulezTimeMultiplier := gsRulezTimeMultiplier; + if g_Game_IsNet then MH_SEND_GameSettings; + end; + end; + + g_Console_Add(Format('%s %d', [cmd, Integer(gsRulezTimeMultiplier)])); + if g_Game_IsServer then g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); + end else if cmd = 'sv_intertime' then begin if (Length(P) > 1) then @@ -5761,11 +5800,69 @@ begin e_LogWritefln('usage: %s ', [cmd]) end end + else if cmd = 'g_force_model' then + begin + if Length(p) = 2 then + begin + a := StrToIntDef(p[1], 0); + g_Force_Model_Set(a); + if (g_Force_Model_Get() <> 0) and (gPlayers <> nil) then + begin + for a := Low(gPlayers) to High(gPlayers) do + begin + if (gPlayers[a] <> nil) then + begin + if (gPlayers[a].UID = gPlayer1.UID) then + continue + else if (gPlayer2 <> nil) and (gPlayers[a].UID = gPlayer2.UID) then + continue; + gPlayers[a].setModel(g_Forced_Model_GetName()); + end; + end + end + else if (g_Force_Model_Get() = 0) and (gPlayers <> nil) then + begin + for a := Low(gPlayers) to High(gPlayers) do + begin + if (gPlayers[a] <> nil) then + begin + if (gPlayers[a].UID = gPlayer1.UID) then + continue + else if (gPlayer2 <> nil) and (gPlayers[a].UID = gPlayer2.UID) then + continue; + gPlayers[a].setModel(gPlayers[a].FActualModelName); + end; + end + end + end + end + else if cmd = 'g_force_model_name' then + begin + if (Length(P) > 1) then + begin + cmd := b_Text_Unformat(P[1]); + g_Forced_Model_SetName(cmd); + if (g_Force_Model_Get() <> 0) and (gPlayers <> nil) then + begin + for a := Low(gPlayers) to High(gPlayers) do + begin + if (gPlayers[a] <> nil) then + begin + if (gPlayers[a].UID = gPlayer1.UID) then + continue + else if (gPlayer2 <> nil) and (gPlayers[a].UID = gPlayer2.UID) then + continue; + gPlayers[a].setModel(g_Forced_Model_GetName()); + end; + end + end + end + end else if cmd = 'g_scorelimit' then begin if Length(P) > 1 then begin - gsGoalLimit := nclamp(StrToIntDef(P[1], gsGoalLimit), 0, $FFFF); + gsScoreLimit := nclamp(StrToIntDef(P[1], gsScoreLimit), 0, $FFFF); if g_Game_IsServer then begin @@ -5779,17 +5876,17 @@ begin b := stat[a].Frags; end else // TDM/CTF - b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals); + b := Max(gTeamStat[TEAM_RED].Score, gTeamStat[TEAM_BLUE].Score); // if someone has a higher score, set it to that instead - gsGoalLimit := max(gsGoalLimit, b); - gGameSettings.GoalLimit := gsGoalLimit; - + gsScoreLimit := max(gsScoreLimit, b); + gGameSettings.ScoreLimit := gsScoreLimit; + if g_Game_IsNet then MH_SEND_GameSettings; end; end; - g_Console_Add(Format(_lc[I_MSG_SCORE_LIMIT], [Integer(gsGoalLimit)])); + g_Console_Add(Format(_lc[I_MSG_SCORE_LIMIT], [Integer(gsScoreLimit)])); end else if cmd = 'g_timelimit' then begin @@ -5807,6 +5904,12 @@ begin (gsTimeLimit div 60) mod 60, gsTimeLimit mod 60])); end + else if cmd = 'g_max_bots' then + begin + if Length(P) > 1 then + gMaxBots := nclamp(StrToIntDef(P[1], gMaxBots), 0, 127); + g_Console_Add('g_max_bots = ' + IntToStr(gMaxBots)); + end else if cmd = 'g_maxlives' then begin if Length(P) > 1 then @@ -5991,13 +6094,13 @@ begin 'p1_priority_kastet': begin if (Length(P) = 2) then - gPlayer1Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + gPlayer1Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); end; 'p2_priority_kastet': begin if (Length(P) = 2) then - gPlayer2Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); - end; + gPlayer2Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; 'p1_priority_saw': begin if (Length(P) = 2) then @@ -6011,13 +6114,13 @@ begin 'p1_priority_pistol': begin if (Length(P) = 2) then - gPlayer1Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + gPlayer1Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); end; 'p2_priority_pistol': begin if (Length(P) = 2) then - gPlayer2Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); - end; + gPlayer2Settings.WeaponPreferences[WEAPON_KASTET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; 'p1_priority_shotgun1': begin if (Length(P) = 2) then @@ -6097,17 +6200,17 @@ begin begin if (Length(P) = 2) then gPlayer2Settings.WeaponPreferences[WEAPON_FLAMETHROWER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); - end; + end; 'p1_priority_berserk': begin if (Length(P) = 2) then - gPlayer1Settings.WeaponPreferences[WP_LAST+1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + gPlayer1Settings.WeaponPreferences[WP_LAST+1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); end; 'p2_priority_berserk': begin if (Length(P) = 2) then - gPlayer2Settings.WeaponPreferences[WP_LAST+1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); - end; + gPlayer2Settings.WeaponPreferences[WP_LAST+1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1); + end; end; end; @@ -6480,6 +6583,7 @@ var nm: Boolean; listen: LongWord; found: Boolean; + t: Byte; begin // Îáùèå êîìàíäû: cmd := LowerCase(P[0]); @@ -6524,7 +6628,7 @@ begin if (pl <> nil) then begin s := g_Net_ClientName_ByID(pl^.ID); - enet_peer_disconnect(pl^.Peer, NET_DISC_KICK); + g_Net_Host_Kick(pl^.ID, NET_DISC_KICK); g_Console_Add(Format(_lc[I_PLAYER_KICK], [s])); MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s); g_Net_Slist_ServerPlayerLeaves(); @@ -6568,7 +6672,7 @@ begin if NetClients[a].Used and (NetClients[a].Peer <> nil) then begin s := g_Net_ClientName_ByID(NetClients[a].ID); - enet_peer_disconnect(NetClients[a].Peer, NET_DISC_KICK); + g_Net_Host_Kick(NetClients[a].ID, NET_DISC_KICK); g_Console_Add(Format(_lc[I_PLAYER_KICK], [s])); MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s); g_Net_Slist_ServerPlayerLeaves(); @@ -6597,7 +6701,7 @@ begin if (pl <> nil) and pl^.Used and (pl^.Peer <> nil) then begin s := g_Net_ClientName_ByID(pl^.ID); - enet_peer_disconnect(pl^.Peer, NET_DISC_KICK); + g_Net_Host_Kick(pl^.ID, NET_DISC_KICK); g_Console_Add(Format(_lc[I_PLAYER_KICK], [s])); MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s); g_Net_Slist_ServerPlayerLeaves(); @@ -6622,14 +6726,8 @@ begin pl := g_Net_Client_ByName(P[1]); if (pl <> nil) then - begin - s := g_Net_ClientName_ByID(pl^.ID); - g_Net_BanHost(pl^.Peer^.address.host, False); - enet_peer_disconnect(pl^.Peer, NET_DISC_TEMPBAN); - g_Console_Add(Format(_lc[I_PLAYER_BAN], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s); - g_Net_Slist_ServerPlayerLeaves(); - end else + g_Net_Host_Ban(pl, False) + else g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]])); end else g_Console_Add(_lc[I_MSG_SERVERONLY]); @@ -6652,14 +6750,7 @@ begin a := StrToIntDef(P[1], 0); if (NetClients <> nil) and (a <= High(NetClients)) then if NetClients[a].Used and (NetClients[a].Peer <> nil) then - begin - s := g_Net_ClientName_ByID(NetClients[a].ID); - g_Net_BanHost(NetClients[a].Peer^.address.host, False); - enet_peer_disconnect(NetClients[a].Peer, NET_DISC_TEMPBAN); - g_Console_Add(Format(_lc[I_PLAYER_BAN], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s); - g_Net_Slist_ServerPlayerLeaves(); - end; + g_Net_Host_Ban(pl, False); end else g_Console_Add(_lc[I_MSG_SERVERONLY]); end @@ -6681,14 +6772,7 @@ begin a := StrToIntDef(P[1], 0); pl := g_Net_Client_ByPlayer(a); if (pl <> nil) and pl^.Used and (pl^.Peer <> nil) then - begin - s := g_Net_ClientName_ByID(pl^.ID); - g_Net_BanHost(pl^.Peer^.address.host, False); - enet_peer_disconnect(pl^.Peer, NET_DISC_TEMPBAN); - g_Console_Add(Format(_lc[I_PLAYER_BAN], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s); - g_Net_Slist_ServerPlayerLeaves(); - end; + g_Net_Host_Ban(pl, False); end else g_Console_Add(_lc[I_MSG_SERVERONLY]); end @@ -6709,15 +6793,8 @@ begin pl := g_Net_Client_ByName(P[1]); if (pl <> nil) then - begin - s := g_Net_ClientName_ByID(pl^.ID); - g_Net_BanHost(pl^.Peer^.address.host); - enet_peer_disconnect(pl^.Peer, NET_DISC_BAN); - g_Net_SaveBanList(); - g_Console_Add(Format(_lc[I_PLAYER_BAN], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s); - g_Net_Slist_ServerPlayerLeaves(); - end else + g_Net_Host_Ban(pl, True) + else g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]])); end else g_Console_Add(_lc[I_MSG_SERVERONLY]); @@ -6740,15 +6817,7 @@ begin a := StrToIntDef(P[1], 0); if (NetClients <> nil) and (a <= High(NetClients)) then if NetClients[a].Used and (NetClients[a].Peer <> nil) then - begin - s := g_Net_ClientName_ByID(NetClients[a].ID); - g_Net_BanHost(NetClients[a].Peer^.address.host); - enet_peer_disconnect(NetClients[a].Peer, NET_DISC_BAN); - g_Net_SaveBanList(); - g_Console_Add(Format(_lc[I_PLAYER_BAN], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s); - g_Net_Slist_ServerPlayerLeaves(); - end; + g_Net_Host_Ban(@NetClients[a], True); end else g_Console_Add(_lc[I_MSG_SERVERONLY]); end @@ -6770,15 +6839,7 @@ begin a := StrToIntDef(P[1], 0); pl := g_Net_Client_ByPlayer(a); if (pl <> nil) and pl^.Used and (pl^.Peer <> nil) then - begin - s := g_Net_ClientName_ByID(pl^.ID); - g_Net_BanHost(pl^.Peer^.address.host); - enet_peer_disconnect(pl^.Peer, NET_DISC_BAN); - g_Net_SaveBanList(); - g_Console_Add(Format(_lc[I_PLAYER_BAN], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s); - g_Net_Slist_ServerPlayerLeaves(); - end; + g_Net_Host_Ban(pl, True); end else g_Console_Add(_lc[I_MSG_SERVERONLY]); end @@ -6797,7 +6858,7 @@ begin Exit; end; - g_Net_BanHost(P[1]); + g_Net_BanAddress(P[1]); g_Net_SaveBanList(); g_Console_Add(Format(_lc[I_PLAYER_BAN], [P[1]])); end else @@ -6818,7 +6879,7 @@ begin Exit; end; - if g_Net_UnbanHost(P[1]) then + if g_Net_UnbanAddress(P[1]) then begin g_Console_Add(Format(_lc[I_MSG_UNBAN_OK], [P[1]])); g_Net_SaveBanList(); @@ -6898,23 +6959,29 @@ begin else if (cmd = 'addbot') or (cmd = 'bot_add') then begin - if Length(P) > 2 then - g_Bot_Add(TEAM_NONE, StrToIntDef(P[1], 2), StrToIntDef(P[2], 100)) - else if Length(P) > 1 then - g_Bot_Add(TEAM_NONE, StrToIntDef(P[1], 2)) + case Length(P) of + 1: g_Bot_Add(TEAM_NONE, 2); + 2: g_Bot_Add(TEAM_NONE, StrToIntDef(P[1], 2)); else - g_Bot_Add(TEAM_NONE, 2); + g_Bot_Add(TEAM_NONE, StrToIntDef(P[1], 2), StrToIntDef(P[2], 100)); + end; end else if cmd = 'bot_addlist' then begin - if Length(P) > 1 then - begin - if Length(P) = 2 then - g_Bot_AddList(TEAM_NONE, P[1], StrToIntDef(P[1], -1)) - else if Length(P) = 3 then - g_Bot_AddList(TEAM_NONE, P[1], StrToIntDef(P[1], -1), StrToIntDef(P[2], 100)) + case Length(P) of + 1: g_Bot_AddList(TEAM_NONE, ''); + 2: g_Bot_AddList(TEAM_NONE, P[1], StrToIntDef(P[1], -1)); + else + if P[2] = 'red' then + t := TEAM_RED + else if P[2] = 'blue' then + t := TEAM_BLUE else - g_Bot_AddList(IfThen(P[2] = 'red', TEAM_RED, TEAM_BLUE), P[1], StrToIntDef(P[1], -1)); + t := TEAM_NONE; + + if Length(P) = 3 + then g_Bot_AddList(t, P[1], StrToIntDef(P[1], -1)) + else g_Bot_AddList(t, P[1], StrToIntDef(P[1], -1), StrToIntDef(P[3], 100)); end; end else if cmd = 'bot_removeall' then @@ -6976,7 +7043,7 @@ begin end else g_Console_Add(_lc[I_MSG_GM_UNAVAIL]); end - else if cmd = 'announce' then + else if (cmd = 'an') or (cmd = 'announce') then begin if g_Game_IsNet then begin @@ -7049,7 +7116,7 @@ begin if Length(P) >= 4 then b := StrToIntDef(P[3], 1); g_Game_StartCustom(s, GameMode, TimeLimit, - GoalLimit, MaxLives, Options, b); + ScoreLimit, MaxLives, Options, b); end; end else @@ -7102,7 +7169,7 @@ begin b := 0; if Length(P) >= 6 then b := StrToIntDef(P[5], 0); - g_Game_StartServer(s, GameMode, TimeLimit, GoalLimit, MaxLives, Options, b, listen, prt) + g_Game_StartServer(s, GameMode, TimeLimit, ScoreLimit, MaxLives, Options, b, listen, prt) end end else @@ -7132,6 +7199,10 @@ begin g_Console_Add(_lc[I_MSG_GM_UNAVAIL]) end end + else if not e_IsValidResourceName(P[1]) then + begin + g_Console_Add('wad name must not be absolute or relative'); + end else begin if g_Game_IsServer and (gGameSettings.GameType <> GT_SINGLE) then @@ -7259,6 +7330,10 @@ begin g_Console_Add(_lc[I_MSG_GM_UNAVAIL]); end; end + else if not e_IsValidResourceName(P[1]) then + begin + g_Console_Add('wad name must not be absolute or relative'); + end else begin nm := False; @@ -7799,11 +7874,11 @@ begin DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t); Filename := 'screenshot-' + date; end; - + name := e_CatPath(dir, Filename + '.png'); s := createDiskFile(name); try - e_MakeScreenshot(s, gWinSizeX, gWinSizeX); + e_MakeScreenshot(s, gWinSizeX, gWinSizeY); s.Free; g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name])) except @@ -8151,6 +8226,14 @@ begin hahasnd[Random(3)].Play(); end; +procedure g_Game_Effect_Bubbles (fX, fY: Integer; count: Word; devX, devY: Byte; Silent: Boolean); +begin + g_GFX_Bubbles(fX, fY, count, devX, devY); + if not Silent then if Random(2) = 0 + then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', fX, fY) + else g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', fX, fY); +end; + procedure g_Game_StartVote(Command, Initiator: string); var Need: Integer; @@ -8296,8 +8379,7 @@ begin end; g_ActiveWindow := nil; - - ProcessLoading(true); + ProcessLoading(True); end; procedure g_Game_StepLoading(Value: Integer = -1); @@ -8311,10 +8393,11 @@ begin end else CurValue := Value; + if (ShowCount > LOADING_SHOW_STEP) or (Value > -1) then begin ShowCount := 0; - ProcessLoading(); + ProcessLoading(False); end; end; end; @@ -8458,7 +8541,7 @@ begin if LimT < 0 then LimT := 0; - // Goal limit: + // Score limit: s := Find_Param_Value(pars, '-lims'); if (s = '') or (not TryStrToInt(s, LimS)) then LimS := 0; @@ -8601,7 +8684,7 @@ begin conRegVar('r_showfps', @gShowFPS, 'draw fps counter', 'draw fps counter'); conRegVar('r_showtime', @gShowTime, 'show game time', 'show game time'); conRegVar('r_showping', @gShowPing, 'show ping', 'show ping'); - conRegVar('r_showscore', @gShowGoals, 'show score', 'show score'); + conRegVar('r_showscore', @gShowScore, 'show score', 'show score'); conRegVar('r_showkillmsg', @gShowKillMsg, 'show kill log', 'show kill log'); conRegVar('r_showlives', @gShowLives, 'show lives', 'show lives'); conRegVar('r_showspect', @gSpectHUD, 'show spectator hud', 'show spectator hud');