X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=504171d4e52390b2bce42e5fbd34e78d473a3b40;hb=64579b586c89085de93fe02cb56be9751105b67c;hp=686f15692b6a73af4f9c728254ef1948967cba24;hpb=76b68febf6f7d7a3f0a45e47b57606ac8f40a083;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 686f156..504171d 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -31,6 +31,7 @@ type TimeLimit: Word; GoalLimit: Word; WarmupTime: Word; + SpawnInvul: Word; MaxLives: Byte; Options: LongWord; WAD: String; @@ -125,7 +126,7 @@ procedure g_Game_Announce_KillCombo(Param: Integer); procedure g_Game_Announce_BodyKill(SpawnerUID: Word); procedure g_Game_StartVote(Command, Initiator: string); procedure g_Game_CheckVote; -procedure g_TakeScreenShot(Filename: string = ''; StatShot: Boolean = False); +procedure g_TakeScreenShot(Filename: string = ''); procedure g_FatalError(Text: String); procedure g_SimpleError(Text: String); function g_Game_IsTestMap(): Boolean; @@ -178,6 +179,7 @@ const GAME_OPTION_MONSTERS = 16; GAME_OPTION_BOTVSPLAYER = 32; GAME_OPTION_BOTVSMONSTER = 64; + GAME_OPTION_DMKEYS = 128; STATE_NONE = 0; STATE_MENU = 1; @@ -660,30 +662,43 @@ begin AssignFile(s, fname); try Rewrite(s); - // line 1: stats version, datetime, server name, map name, game mode, time limit, score limit, dmflags, game time, number of players + // 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 := ''; map := g_ExtractWadNameNoPath(gMapInfo.Map) + ':/' + g_ExtractFileName(gMapInfo.Map); mode := g_Game_ModeToText(Stat.GameMode); - etime := Format('%d:%.2d:%.2d', [Stat.GameTime div 1000 div 3600, - (Stat.GameTime div 1000 div 60) mod 60, - Stat.GameTime div 1000 mod 60]); + etime := Format('%d:%.2d:%.2d', [ + Stat.GameTime div 1000 div 3600, + (Stat.GameTime div 1000 div 60) mod 60, + Stat.GameTime div 1000 mod 60 + ]); WriteLn(s, 'stats_ver,datetime,server,map,mode,timelimit,scorelimit,dmflags,time,num_players'); - WriteLn(s, - Format('%d,%s,%s,%s,%s,%u,%u,%u,%s,%d', - [STATFILE_VERSION, StatDate, fname, map, mode, gGameSettings.TimeLimit, gGameSettings.GoalLimit, gGameSettings.Options, etime, Length(Stat.PlayerStat)])); + WriteLn(s, Format('%d,%s,%s,%s,%s,%u,%u,%u,%s,%d', [ + STATFILE_VERSION, + StatDate, + dquoteStr(fname), + dquoteStr(map), + mode, + gGameSettings.TimeLimit, + gGameSettings.GoalLimit, + gGameSettings.Options, + etime, + Length(Stat.PlayerStat) + ])); // line 2: game specific shit // if it's a team game: red score, blue score // 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].Goals, Stat.TeamStat[TEAM_BLUE].Goals])) 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])); + WriteLn(s, + Format('mon_killed,mon_total,secrets_found,secrets_total' + LineEnding + '%d,%d,%d,%d',[gCoopMonstersKilled, gTotalMonsters, gCoopSecretsFound, gSecretsCount])); // lines 3-...: team, player name, frags, deaths WriteLn(s, 'team,name,frags,deaths'); for I := Low(Stat.PlayerStat) to High(Stat.PlayerStat) do with Stat.PlayerStat[I] do - WriteLn(s, Format('%d,%s,%d,%d', [Team, Name, Frags, Deaths])); + WriteLn(s, Format('%d,%s,%d,%d', [Team, dquoteStr(Name), Frags, Deaths])); except g_Console_Add(Format(_lc[I_CONSOLE_ERROR_WRITE], [fname])); end; @@ -1049,14 +1064,15 @@ begin SortGameStat(CustomStat.PlayerStat); - if gSaveStats or gScreenshotStats then + if (gSaveStats or gScreenshotStats) and (Length(gPlayers) > 1) then begin t := Now; if g_Game_IsNet then StatFilename := NetServerName else StatFilename := 'local'; StatDate := FormatDateTime('yymmdd_hhnnss', t); StatFilename := StatFilename + '_' + CustomStat.Map + '_' + g_Game_ModeToText(CustomStat.GameMode); StatFilename := sanitizeFilename(StatFilename) + '_' + StatDate; - if gSaveStats then SaveGameStat(CustomStat, FormatDateTime('yyyy"/"mm"/"dd', t)); + if gSaveStats then + SaveGameStat(CustomStat, FormatDateTime('yyyy"/"mm"/"dd', t)); end; StatShotDone := False; @@ -2861,7 +2877,7 @@ begin // HACK: take stats screenshot immediately after the first frame of the stats showing if gScreenshotStats and not StatShotDone then begin - g_TakeScreenShot('stats/' + StatFilename, True); + g_TakeScreenShot('stats/' + StatFilename); StatShotDone := True; end; end; @@ -5539,6 +5555,28 @@ begin if g_Game_IsNet then MH_SEND_GameSettings; end; end + else if (cmd = 'g_dm_keys') and not g_Game_IsClient then + begin + with gGameSettings do + begin + if (Length(P) > 1) and + ((P[1] = '1') or (P[1] = '0')) then + begin + if (P[1][1] = '1') then + Options := Options or GAME_OPTION_DMKEYS + else + Options := Options and (not GAME_OPTION_DMKEYS); + end; + + if (LongBool(Options and GAME_OPTION_DMKEYS)) then + g_Console_Add(_lc[I_MSG_DMKEYS_ON]) + else + g_Console_Add(_lc[I_MSG_DMKEYS_OFF]); + g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); + + if g_Game_IsNet then MH_SEND_GameSettings; + end; + end else if (cmd = 'g_warmuptime') and not g_Game_IsClient then begin if Length(P) > 1 then @@ -5553,6 +5591,20 @@ begin [gGameSettings.WarmupTime])); g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); end + else if (cmd = 'g_spawn_invul') and not g_Game_IsClient then + begin + if Length(P) > 1 then + begin + if StrToIntDef(P[1], gGameSettings.SpawnInvul) = 0 then + gGameSettings.SpawnInvul := 0 + else + gGameSettings.SpawnInvul := StrToIntDef(P[1], gGameSettings.SpawnInvul); + end; + + g_Console_Add(Format(_lc[I_MSG_SPAWNINVUL], + [gGameSettings.SpawnInvul])); + g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); + end else if cmd = 'net_interp' then begin if (Length(P) > 1) then @@ -7299,7 +7351,7 @@ begin end; end; -procedure g_TakeScreenShot(Filename: string = ''; StatShot: Boolean = False); +procedure g_TakeScreenShot(Filename: string = ''); var s: TStream; t: TDateTime; dir, date, name: String; begin if e_NoGraphics then Exit;