diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index 854a15a978ea9dbb3faecef572e6973abaa77ebb..6b1e238f6f7b5928175a440d04d9b73a1923d865 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
GAME_OPTION_BOTVSPLAYER = 32;
GAME_OPTION_BOTVSMONSTER = 64;
GAME_OPTION_DMKEYS = 128;
GAME_OPTION_BOTVSPLAYER = 32;
GAME_OPTION_BOTVSMONSTER = 64;
GAME_OPTION_DMKEYS = 128;
- GAME_OPTION_RESPAWNITEMS = 256;
STATE_NONE = 0;
STATE_MENU = 1;
STATE_NONE = 0;
STATE_MENU = 1;
gMapToDelete: String;
gTempDelete: Boolean = False;
gLastMap: Boolean = False;
gMapToDelete: String;
gTempDelete: Boolean = False;
gLastMap: Boolean = False;
- gWinSizeX, gWinSizeY: Integer;
+ gScreenWidth: Word;
+ gScreenHeight: Word;
gResolutionChange: Boolean = False;
gRC_Width, gRC_Height: Integer;
gRC_FullScreen, gRC_Maximized: Boolean;
gResolutionChange: Boolean = False;
gRC_Width, gRC_Height: Integer;
gRC_FullScreen, gRC_Maximized: Boolean;
SortGameStat(CustomStat.PlayerStat);
SortGameStat(CustomStat.PlayerStat);
- if (gSaveStats or gScreenshotStats) and (Length(gPlayers) > 1) then
+ if (gSaveStats or gScreenshotStats) and (Length(CustomStat.PlayerStat) > 1) then
begin
t := Now;
if g_Game_IsNet then StatFilename := NetServerName else StatFilename := 'local';
begin
t := Now;
if g_Game_IsNet then StatFilename := NetServerName else StatFilename := 'local';
end;
// HACK: take stats screenshot immediately after the first frame of the stats showing
end;
// HACK: take stats screenshot immediately after the first frame of the stats showing
- if gScreenshotStats and not StatShotDone then
+ if gScreenshotStats and (not StatShotDone) and (Length(CustomStat.PlayerStat) > 1) then
begin
g_TakeScreenShot('stats/' + StatFilename);
StatShotDone := True;
begin
g_TakeScreenShot('stats/' + StatFilename);
StatShotDone := True;
end
else
begin
end
else
begin
- glScissor(0, 0, gWinSizeX, gWinSizeY);
+ glScissor(0, 0, gScreenWidth, gScreenHeight);
end;
// no need to clear stencil buffer, light blitting will do it for us... but only for normal scale
if (g_dbg_scale <> 1.0) then glClear(GL_STENCIL_BUFFER_BIT);
end;
// no need to clear stencil buffer, light blitting will do it for us... but only for normal scale
if (g_dbg_scale <> 1.0) then glClear(GL_STENCIL_BUFFER_BIT);
ResName := Map;
end;
ResName := Map;
end;
+ gTime := 0;
+
//writeln('********: gsw=', gGameSettings.WAD, '; rn=', ResName);
result := false;
if (ResName <> '') and (NewWAD <> '') then
//writeln('********: gsw=', gGameSettings.WAD, '; rn=', ResName);
result := false;
if (ResName <> '') and (NewWAD <> '') then
gExit := 0;
gPauseMain := false;
gPauseHolmes := false;
gExit := 0;
gPauseMain := false;
gPauseHolmes := false;
- gTime := 0;
NetTimeToUpdate := 1;
NetTimeToReliable := 0;
NetTimeToMaster := NetMasterRate;
NetTimeToUpdate := 1;
NetTimeToReliable := 0;
NetTimeToMaster := NetMasterRate;
a, b: Integer;
stat: TPlayerStatArray;
cmd, s: string;
a, b: Integer;
stat: TPlayerStatArray;
cmd, s: string;
- config: TConfig;
begin
stat := nil;
cmd := LowerCase(P[0]);
begin
stat := nil;
cmd := LowerCase(P[0]);
if g_Game_IsNet then MH_SEND_GameSettings;
end;
end
if g_Game_IsNet then MH_SEND_GameSettings;
end;
end
- else if (cmd = 'g_respawn_items') 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_RESPAWNITEMS
- else
- Options := Options and (not GAME_OPTION_RESPAWNITEMS);
- end;
-
- if (LongBool(Options and GAME_OPTION_RESPAWNITEMS)) then
- g_Console_Add(_lc[I_MSG_RESPAWNITEMS_ON])
- else
- g_Console_Add(_lc[I_MSG_RESPAWNITEMS_OFF]);
-
- 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
else if (cmd = 'g_warmuptime') and not g_Game_IsClient then
begin
if Length(P) > 1 then
if (Length(P) > 1) then
NetInterpLevel := StrToIntDef(P[1], NetInterpLevel);
g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel));
if (Length(P) > 1) then
NetInterpLevel := StrToIntDef(P[1], NetInterpLevel);
g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel));
- s := e_GetWriteableDir(ConfigDirs);
- if s <> '' then
- begin
- config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
- config.WriteInt('Client', 'InterpolationSteps', NetInterpLevel);
- config.SaveFile(s + '/' + CONFIG_FILENAME);
- config.Free
- end
end
else if cmd = 'net_forceplayerupdate' then
begin
end
else if cmd = 'net_forceplayerupdate' then
begin
g_Console_Add('net_forceplayerupdate = 1')
else
g_Console_Add('net_forceplayerupdate = 0');
g_Console_Add('net_forceplayerupdate = 1')
else
g_Console_Add('net_forceplayerupdate = 0');
-
- s := e_GetWriteableDir(ConfigDirs);
- if s <> '' then
- begin
- config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
- config.WriteBool('Client', 'ForcePlayerUpdate', NetForcePlayerUpdate);
- config.SaveFile(s + '/' + CONFIG_FILENAME);
- config.Free
- end
end
else if cmd = 'net_predictself' then
begin
end
else if cmd = 'net_predictself' then
begin
g_Console_Add('net_predictself = 1')
else
g_Console_Add('net_predictself = 0');
g_Console_Add('net_predictself = 1')
else
g_Console_Add('net_predictself = 0');
-
- s := e_GetWriteableDir(ConfigDirs);
- if s <> '' then
- begin
- config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
- config.WriteBool('Client', 'PredictSelf', NetPredictSelf);
- config.SaveFile(s + '/' + CONFIG_FILENAME);
- config.Free
- end
end
else if cmd = 'sv_name' then
begin
end
else if cmd = 'sv_name' then
begin
end
else if cmd = 'p1_name' then
begin
end
else if cmd = 'p1_name' then
begin
- if (Length(P) > 1) and gGameOn then
+ if (Length(P) > 1) then
begin
begin
+ gPlayer1Settings.Name := b_Text_Unformat(P[1]);
if g_Game_IsClient then
if g_Game_IsClient then
+ MC_SEND_PlayerSettings
+ else if gGameOn and (gPlayer1 <> nil) then
begin
begin
- gPlayer1Settings.Name := b_Text_Unformat(P[1]);
- MC_SEND_PlayerSettings;
- end
- else
- if gPlayer1 <> nil then
- begin
- gPlayer1.Name := b_Text_Unformat(P[1]);
- if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
- end
- else
- gPlayer1Settings.Name := b_Text_Unformat(P[1]);
+ gPlayer1.Name := b_Text_Unformat(P[1]);
+ if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
+ end;
end;
end
else if cmd = 'p2_name' then
begin
end;
end
else if cmd = 'p2_name' then
begin
- if (Length(P) > 1) and gGameOn then
+ if (Length(P) > 1) then
begin
begin
+ gPlayer2Settings.Name := b_Text_Unformat(P[1]);
if g_Game_IsClient then
if g_Game_IsClient then
+ MC_SEND_PlayerSettings
+ else if gGameOn and (gPlayer2 <> nil) then
begin
begin
- gPlayer2Settings.Name := b_Text_Unformat(P[1]);
- MC_SEND_PlayerSettings;
- end
- else
- if gPlayer2 <> nil then
- begin
- gPlayer2.Name := b_Text_Unformat(P[1]);
- if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
- end
- else
- gPlayer2Settings.Name := b_Text_Unformat(P[1]);
+ gPlayer2.Name := b_Text_Unformat(P[1]);
+ if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
+ end;
end;
end
else if cmd = 'p1_color' then
begin
if Length(P) > 3 then
end;
end
else if cmd = 'p1_color' then
begin
if Length(P) > 3 then
+ begin
+ gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
+ EnsureRange(StrToIntDef(P[2], 0), 0, 255),
+ EnsureRange(StrToIntDef(P[3], 0), 0, 255));
if g_Game_IsClient then
if g_Game_IsClient then
+ MC_SEND_PlayerSettings
+ else if gGameOn and (gPlayer1 <> nil) then
begin
begin
- gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
- EnsureRange(StrToIntDef(P[2], 0), 0, 255),
- EnsureRange(StrToIntDef(P[3], 0), 0, 255));
- MC_SEND_PlayerSettings;
- end
- else
- if gPlayer1 <> nil then
- begin
- gPlayer1.Model.SetColor(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
- EnsureRange(StrToIntDef(P[2], 0), 0, 255),
- EnsureRange(StrToIntDef(P[3], 0), 0, 255));
- if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
- end
- else
- gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
- EnsureRange(StrToIntDef(P[2], 0), 0, 255),
- EnsureRange(StrToIntDef(P[3], 0), 0, 255));
+ gPlayer1.SetColor(gPlayer1Settings.Color);
+ if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
+ end;
+ end;
end
end
- else if (cmd = 'p2_color') and not g_Game_IsNet then
+ else if cmd = 'p2_color' then
begin
if Length(P) > 3 then
begin
if Length(P) > 3 then
+ begin
+ gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
+ EnsureRange(StrToIntDef(P[2], 0), 0, 255),
+ EnsureRange(StrToIntDef(P[3], 0), 0, 255));
if g_Game_IsClient then
if g_Game_IsClient then
+ MC_SEND_PlayerSettings
+ else if gGameOn and (gPlayer2 <> nil) then
begin
begin
- gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
- EnsureRange(StrToIntDef(P[2], 0), 0, 255),
- EnsureRange(StrToIntDef(P[3], 0), 0, 255));
- MC_SEND_PlayerSettings;
- end
- else
- if gPlayer2 <> nil then
- begin
- gPlayer2.Model.SetColor(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
- EnsureRange(StrToIntDef(P[2], 0), 0, 255),
- EnsureRange(StrToIntDef(P[3], 0), 0, 255));
- if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
- end
- else
- gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
- EnsureRange(StrToIntDef(P[2], 0), 0, 255),
- EnsureRange(StrToIntDef(P[3], 0), 0, 255));
+ gPlayer2.SetColor(gPlayer2Settings.Color);
+ if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
+ end;
+ end;
end
end
- else if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then
+ else if cmd = 'p1_model' then
begin
begin
- if cmd = 'r_showscore' then
+ if (Length(P) > 1) then
begin
begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- gShowGoals := (P[1][1] = '1');
-
- if gShowGoals then
- g_Console_Add(_lc[I_MSG_SCORE_ON])
- else
- g_Console_Add(_lc[I_MSG_SCORE_OFF]);
- end
- else if cmd = 'r_showstat' then
+ gPlayer1Settings.Model := P[1];
+ if g_Game_IsClient then
+ MC_SEND_PlayerSettings
+ else if gGameOn and (gPlayer1 <> nil) then
+ begin
+ gPlayer1.FActualModelName := gPlayer1Settings.Model;
+ gPlayer1.SetModel(gPlayer1Settings.Model);
+ if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
+ end;
+ end;
+ end
+ else if cmd = 'p2_model' then
+ begin
+ if (Length(P) > 1) then
begin
begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- gShowStat := (P[1][1] = '1');
+ gPlayer2Settings.Model := P[1];
+ if g_Game_IsClient then
+ MC_SEND_PlayerSettings
+ else if gGameOn and (gPlayer2 <> nil) then
+ begin
+ gPlayer2.FActualModelName := gPlayer2Settings.Model;
+ gPlayer2.SetModel(gPlayer2Settings.Model);
+ if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
+ end;
+ end;
+ end
+ else if cmd = 'r_showscore' then
+ begin
+ if (Length(P) > 1) and
+ ((P[1] = '1') or (P[1] = '0')) then
+ gShowGoals := (P[1][1] = '1');
- if gShowStat then
- g_Console_Add(_lc[I_MSG_STATS_ON])
- else
- g_Console_Add(_lc[I_MSG_STATS_OFF]);
- end
- else if cmd = 'r_showkillmsg' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- gShowKillMsg := (P[1][1] = '1');
+ if gShowGoals then
+ g_Console_Add(_lc[I_MSG_SCORE_ON])
+ else
+ g_Console_Add(_lc[I_MSG_SCORE_OFF]);
+ end
+ else if cmd = 'r_showstat' then
+ begin
+ if (Length(P) > 1) and
+ ((P[1] = '1') or (P[1] = '0')) then
+ gShowStat := (P[1][1] = '1');
- if gShowKillMsg then
- g_Console_Add(_lc[I_MSG_KILL_MSGS_ON])
- else
- g_Console_Add(_lc[I_MSG_KILL_MSGS_OFF]);
- end
- else if cmd = 'r_showlives' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- gShowLives := (P[1][1] = '1');
+ if gShowStat then
+ g_Console_Add(_lc[I_MSG_STATS_ON])
+ else
+ g_Console_Add(_lc[I_MSG_STATS_OFF]);
+ end
+ else if cmd = 'r_showkillmsg' then
+ begin
+ if (Length(P) > 1) and
+ ((P[1] = '1') or (P[1] = '0')) then
+ gShowKillMsg := (P[1][1] = '1');
- if gShowLives then
- g_Console_Add(_lc[I_MSG_LIVES_ON])
- else
- g_Console_Add(_lc[I_MSG_LIVES_OFF]);
- end
- else if cmd = 'r_showspect' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- gSpectHUD := (P[1][1] = '1');
+ if gShowKillMsg then
+ g_Console_Add(_lc[I_MSG_KILL_MSGS_ON])
+ else
+ g_Console_Add(_lc[I_MSG_KILL_MSGS_OFF]);
+ end
+ else if cmd = 'r_showlives' then
+ begin
+ if (Length(P) > 1) and
+ ((P[1] = '1') or (P[1] = '0')) then
+ gShowLives := (P[1][1] = '1');
- if gSpectHUD then
- g_Console_Add(_lc[I_MSG_SPECT_HUD_ON])
- else
- g_Console_Add(_lc[I_MSG_SPECT_HUD_OFF]);
- end
- else if cmd = 'r_showping' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- gShowPing := (P[1][1] = '1');
+ if gShowLives then
+ g_Console_Add(_lc[I_MSG_LIVES_ON])
+ else
+ g_Console_Add(_lc[I_MSG_LIVES_OFF]);
+ end
+ else if cmd = 'r_showspect' then
+ begin
+ if (Length(P) > 1) and
+ ((P[1] = '1') or (P[1] = '0')) then
+ gSpectHUD := (P[1][1] = '1');
- if gShowPing then
- g_Console_Add(_lc[I_MSG_PING_ON])
- else
- g_Console_Add(_lc[I_MSG_PING_OFF]);
- end
- else if (cmd = 'g_scorelimit') and not g_Game_IsClient then
- begin
- if Length(P) > 1 then
- begin
- if StrToIntDef(P[1], gGameSettings.GoalLimit) = 0 then
- gGameSettings.GoalLimit := 0
- else
- begin
- b := 0;
-
- if gGameSettings.GameMode = GM_DM then
- begin // DM
- stat := g_Player_GetStats();
- if stat <> nil then
- for a := 0 to High(stat) do
- if stat[a].Frags > b then
- b := stat[a].Frags;
- end
- else // TDM/CTF
- b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals);
+ if gSpectHUD then
+ g_Console_Add(_lc[I_MSG_SPECT_HUD_ON])
+ else
+ g_Console_Add(_lc[I_MSG_SPECT_HUD_OFF]);
+ end
+ else if cmd = 'r_showping' then
+ begin
+ if (Length(P) > 1) and
+ ((P[1] = '1') or (P[1] = '0')) then
+ gShowPing := (P[1][1] = '1');
- gGameSettings.GoalLimit := Max(StrToIntDef(P[1], gGameSettings.GoalLimit), b);
- end;
+ if gShowPing then
+ g_Console_Add(_lc[I_MSG_PING_ON])
+ else
+ g_Console_Add(_lc[I_MSG_PING_OFF]);
+ end
+ else if (cmd = 'g_scorelimit') and not g_Game_IsClient then
+ begin
+ if Length(P) > 1 then
+ begin
+ if StrToIntDef(P[1], gGameSettings.GoalLimit) = 0 then
+ gGameSettings.GoalLimit := 0
+ else
+ begin
+ b := 0;
- if g_Game_IsNet then MH_SEND_GameSettings;
- end;
+ if gGameSettings.GameMode = GM_DM then
+ begin // DM
+ stat := g_Player_GetStats();
+ if stat <> nil then
+ for a := 0 to High(stat) do
+ if stat[a].Frags > b then
+ b := stat[a].Frags;
+ end
+ else // TDM/CTF
+ b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals);
- g_Console_Add(Format(_lc[I_MSG_SCORE_LIMIT], [gGameSettings.GoalLimit]));
- end
- else if (cmd = 'g_timelimit') and not g_Game_IsClient then
- begin
- if (Length(P) > 1) and (StrToIntDef(P[1], -1) >= 0) then
- gGameSettings.TimeLimit := StrToIntDef(P[1], -1);
+ gGameSettings.GoalLimit := Max(StrToIntDef(P[1], gGameSettings.GoalLimit), b);
+ end;
- g_Console_Add(Format(_lc[I_MSG_TIME_LIMIT],
- [gGameSettings.TimeLimit div 3600,
- (gGameSettings.TimeLimit div 60) mod 60,
- gGameSettings.TimeLimit mod 60]));
if g_Game_IsNet then MH_SEND_GameSettings;
if g_Game_IsNet then MH_SEND_GameSettings;
- end
- else if (cmd = 'g_maxlives') and not g_Game_IsClient then
+ end;
+
+ g_Console_Add(Format(_lc[I_MSG_SCORE_LIMIT], [gGameSettings.GoalLimit]));
+ end
+ else if (cmd = 'g_timelimit') and not g_Game_IsClient then
+ begin
+ if (Length(P) > 1) and (StrToIntDef(P[1], -1) >= 0) then
+ gGameSettings.TimeLimit := StrToIntDef(P[1], -1);
+
+ g_Console_Add(Format(_lc[I_MSG_TIME_LIMIT],
+ [gGameSettings.TimeLimit div 3600,
+ (gGameSettings.TimeLimit div 60) mod 60,
+ gGameSettings.TimeLimit mod 60]));
+ if g_Game_IsNet then MH_SEND_GameSettings;
+ end
+ else if (cmd = 'g_maxlives') and not g_Game_IsClient then
+ begin
+ if Length(P) > 1 then
begin
begin
- if Length(P) > 1 then
+ if StrToIntDef(P[1], gGameSettings.MaxLives) = 0 then
+ gGameSettings.MaxLives := 0
+ else
begin
begin
- if StrToIntDef(P[1], gGameSettings.MaxLives) = 0 then
- gGameSettings.MaxLives := 0
- else
- begin
- b := 0;
- stat := g_Player_GetStats();
- if stat <> nil then
- for a := 0 to High(stat) do
- if stat[a].Lives > b then
- b := stat[a].Lives;
- gGameSettings.MaxLives :=
- Max(StrToIntDef(P[1], gGameSettings.MaxLives), b);
- end;
+ b := 0;
+ stat := g_Player_GetStats();
+ if stat <> nil then
+ for a := 0 to High(stat) do
+ if stat[a].Lives > b then
+ b := stat[a].Lives;
+ gGameSettings.MaxLives :=
+ Max(StrToIntDef(P[1], gGameSettings.MaxLives), b);
end;
end;
-
- g_Console_Add(Format(_lc[I_MSG_LIVES],
- [gGameSettings.MaxLives]));
- if g_Game_IsNet then MH_SEND_GameSettings;
end;
end;
+
+ g_Console_Add(Format(_lc[I_MSG_LIVES],
+ [gGameSettings.MaxLives]));
+ if g_Game_IsNet then MH_SEND_GameSettings;
end;
end;
end;
end;
if cmd = 'd_window' then
begin
g_Console_Add(Format('gScreenWidth = %d, gScreenHeight = %d', [gScreenWidth, gScreenHeight]));
if cmd = 'd_window' then
begin
g_Console_Add(Format('gScreenWidth = %d, gScreenHeight = %d', [gScreenWidth, gScreenHeight]));
- g_Console_Add(Format('gWinSizeX = %d, gWinSizeY = %d', [gWinSizeX, gWinSizeY]));
+ g_Console_Add(Format('gScreenWidth = %d, gScreenHeight = %d', [gScreenWidth, gScreenHeight]));
end
else if cmd = 'd_sounds' then
begin
end
else if cmd = 'd_sounds' then
begin
conRegVar('dbg_ignore_level_bounds', @g_dbg_ignore_bounds, 'ignore level bounds', '', false);
conRegVar('r_scale', @g_dbg_scale, 0.01, 100.0, 'render scale', '', false);
conRegVar('dbg_ignore_level_bounds', @g_dbg_ignore_bounds, 'ignore level bounds', '', false);
conRegVar('r_scale', @g_dbg_scale, 0.01, 100.0, 'render scale', '', false);
+ conRegVar('r_resolution_scale', @r_pixel_scale, 0.01, 100.0, 'upscale factor', '', false);
conRegVar('light_enabled', @gwin_k8_enable_light_experiments, 'enable/disable dynamic lighting', 'lighting');
conRegVar('light_player_halo', @g_playerLight, 'enable/disable player halo', 'player light halo');
conRegVar('light_enabled', @gwin_k8_enable_light_experiments, 'enable/disable dynamic lighting', 'lighting');
conRegVar('light_player_halo', @g_playerLight, 'enable/disable player halo', 'player light halo');