X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=0cca55387e1b518016faab9f0925fbc2b88c2b41;hb=3fb071dcefe7c3d8081e5a3906c1983d02b5ccd0;hp=34a387ab255c4a9fb8eefee58216c06dfca0a291;hpb=fededec33cfb9690510025c63def9e6fd972ac2d;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 34a387a..0cca553 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -131,6 +131,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 = ''); @@ -667,7 +668,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; @@ -709,7 +710,7 @@ 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, + 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, @@ -728,6 +729,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 := ''; @@ -774,19 +786,6 @@ end; function g_Game_IsNet(): Boolean; begin Result := (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]); - - if gGameSettings.GameType in [GT_SERVER, GT_CLIENT] then - begin - // set debug options to false to avoid cheaters - 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; - Exit; - end; end; function g_Game_IsServer(): Boolean; @@ -4686,6 +4685,8 @@ begin g_Game_ClearLoading(); + ClearDebugCvars(); + // Íàñòðîéêè èãðû: gGameSettings.GameType := GT_SERVER; gGameSettings.GameMode := GameMode; @@ -4819,6 +4820,8 @@ begin g_Game_ClearLoading(); + ClearDebugCvars(); + // Íàñòðîéêè èãðû: gGameSettings.GameType := GT_CLIENT; @@ -5192,7 +5195,7 @@ begin end; end; - g_Net_UnbanNonPermHosts(); + g_Net_UnbanNonPerm(); end; if gLastMap then @@ -5855,7 +5858,7 @@ begin // if someone has a higher score, set it to that instead gsScoreLimit := max(gsScoreLimit, b); gGameSettings.ScoreLimit := gsScoreLimit; - + if g_Game_IsNet then MH_SEND_GameSettings; end; end; @@ -6068,13 +6071,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 @@ -6088,13 +6091,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 @@ -6174,17 +6177,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; @@ -6557,6 +6560,7 @@ var nm: Boolean; listen: LongWord; found: Boolean; + t: Byte; begin // Îáùèå êîìàíäû: cmd := LowerCase(P[0]); @@ -6601,7 +6605,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(); @@ -6645,7 +6649,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(); @@ -6674,7 +6678,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(); @@ -6699,14 +6703,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]); @@ -6729,14 +6727,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 @@ -6758,14 +6749,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 @@ -6786,15 +6770,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]); @@ -6817,15 +6794,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 @@ -6847,15 +6816,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 @@ -6874,7 +6835,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 @@ -6895,7 +6856,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(); @@ -6975,23 +6936,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 @@ -7209,6 +7176,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 @@ -7336,6 +7307,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; @@ -7876,7 +7851,7 @@ begin DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t); Filename := 'screenshot-' + date; end; - + name := e_CatPath(dir, Filename + '.png'); s := createDiskFile(name); try @@ -8228,6 +8203,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;