diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index affc870bddbdb010228895f4b25277a4af62d0e9..47251204f2b021a78262a60f265d830d63308bda 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
Model: String;
Color: TRGB;
Team: Byte;
Model: String;
Color: TRGB;
Team: Byte;
+ // ones below are sent only to the server
+ WeaponSwitch: Byte;
+ WeaponPreferences: Array[WP_FIRST..WP_LAST+1] of Byte;
+ SwitchToEmpty: Byte;
+ SkipFist: Byte;
end;
TMegaWADInfo = record
end;
TMegaWADInfo = record
procedure g_Game_LoadData();
procedure g_Game_FreeData();
procedure g_Game_Update();
procedure g_Game_LoadData();
procedure g_Game_FreeData();
procedure g_Game_Update();
+procedure g_Game_PreUpdate();
procedure g_Game_Draw();
procedure g_Game_Quit();
procedure g_Game_SetupScreenSize();
procedure g_Game_Draw();
procedure g_Game_Quit();
procedure g_Game_SetupScreenSize();
EXIT_ENDLEVELSINGLE = 4;
EXIT_ENDLEVELCUSTOM = 5;
EXIT_ENDLEVELSINGLE = 4;
EXIT_ENDLEVELCUSTOM = 5;
- GAME_OPTION_RESERVED = 1;
- GAME_OPTION_TEAMDAMAGE = 2;
- GAME_OPTION_ALLOWEXIT = 4;
- GAME_OPTION_WEAPONSTAY = 8;
- GAME_OPTION_MONSTERS = 16;
- GAME_OPTION_BOTVSPLAYER = 32;
- GAME_OPTION_BOTVSMONSTER = 64;
- GAME_OPTION_DMKEYS = 128;
+ GAME_OPTION_RESERVED = 1;
+ GAME_OPTION_TEAMDAMAGE = 2;
+ GAME_OPTION_ALLOWEXIT = 4;
+ GAME_OPTION_WEAPONSTAY = 8;
+ GAME_OPTION_MONSTERS = 16;
+ GAME_OPTION_BOTVSPLAYER = 32;
+ GAME_OPTION_BOTVSMONSTER = 64;
+ GAME_OPTION_DMKEYS = 128;
+ GAME_OPTION_TEAMHITTRACE = 256;
+ GAME_OPTION_TEAMHITPROJECTILE = 512;
+ GAME_OPTION_TEAMABSORBDAMAGE = 1024;
+ GAME_OPTION_ALLOWDROPFLAG = 2048;
+ GAME_OPTION_THROWFLAG = 4096;
STATE_NONE = 0;
STATE_MENU = 1;
STATE_NONE = 0;
STATE_MENU = 1;
gPlayer2: TPlayer = nil;
gPlayerDrawn: TPlayer = nil;
gTime: LongWord;
gPlayer2: TPlayer = nil;
gPlayerDrawn: TPlayer = nil;
gTime: LongWord;
+ gLerpFactor: Single = 1.0;
gSwitchGameMode: Byte = GM_DM;
gHearPoint1, gHearPoint2: THearPoint;
gSoundEffectsDF: Boolean = False;
gSwitchGameMode: Byte = GM_DM;
gHearPoint1, gHearPoint2: THearPoint;
gSoundEffectsDF: Boolean = False;
gShowFPS: Boolean = False;
gShowGoals: Boolean = True;
gShowStat: Boolean = True;
gShowFPS: Boolean = False;
gShowGoals: Boolean = True;
gShowStat: Boolean = True;
+ gShowPIDs: Boolean = False;
gShowKillMsg: Boolean = True;
gShowLives: Boolean = True;
gShowPing: Boolean = False;
gShowKillMsg: Boolean = True;
gShowLives: Boolean = True;
gShowPing: Boolean = False;
gDelayedEvents: Array of TDelayedEvent;
gUseChatSounds: Boolean = True;
gChatSounds: Array of TChatSound;
gDelayedEvents: Array of TDelayedEvent;
gUseChatSounds: Boolean = True;
gChatSounds: Array of TChatSound;
+ 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;
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
g_dbg_ignore_bounds: Boolean = false;
r_smallmap_h: Integer = 0; // 0: left; 1: center; 2: right
e_input, e_log, g_console, g_items, g_map, g_panel,
g_playermodel, g_gfx, g_options, Math,
g_triggers, g_monsters, e_sound, CONFIG,
e_input, e_log, g_console, g_items, g_map, g_panel,
g_playermodel, g_gfx, g_options, Math,
g_triggers, g_monsters, e_sound, CONFIG,
- g_language, g_net, g_main,
+ g_language, g_net, g_main, g_phys,
ENet, e_msg, g_netmsg, g_netmaster,
sfs, wadreader, g_system;
ENet, e_msg, g_netmsg, g_netmaster,
sfs, wadreader, g_system;
stat: TPlayerStatArray;
wad, map: string;
mapstr: string;
stat: TPlayerStatArray;
wad, map: string;
mapstr: string;
+ namestr: string;
begin
s1 := '';
s2 := '';
begin
s1 := '';
s2 := '';
gg := g;
bb := b;
end;
gg := g;
bb := b;
end;
+ if gShowPIDs then
+ namestr := Format('[%5d] %s', [UID, Name])
+ else
+ namestr := Name;
// Èìÿ
// Èìÿ
- e_TextureFontPrintEx(x+16, _y, Name, gStdFont, rr, gg, bb, 1);
+ e_TextureFontPrintEx(x+16, _y, namestr, gStdFont, rr, gg, bb, 1);
// Ïèíã/ïîòåðè
e_TextureFontPrintEx(x+w1+16, _y, Format(_lc[I_GAME_PING_MS], [Ping, Loss]), gStdFont, rr, gg, bb, 1);
// Ôðàãè
// Ïèíã/ïîòåðè
e_TextureFontPrintEx(x+w1+16, _y, Format(_lc[I_GAME_PING_MS], [Ping, Loss]), gStdFont, rr, gg, bb, 1);
// Ôðàãè
r := 255;
g := 127;
end;
r := 255;
g := 127;
end;
+ if gShowPIDs then
+ namestr := Format('[%5d] %s', [UID, Name])
+ else
+ namestr := Name;
// Öâåò èãðîêà
e_DrawFillQuad(x+16, _y+4, x+32-1, _y+16+4-1, Color.R, Color.G, Color.B, 0);
e_DrawQuad(x+16, _y+4, x+32-1, _y+16+4-1, 192, 192, 192);
// Èìÿ
// Öâåò èãðîêà
e_DrawFillQuad(x+16, _y+4, x+32-1, _y+16+4-1, Color.R, Color.G, Color.B, 0);
e_DrawQuad(x+16, _y+4, x+32-1, _y+16+4-1, 192, 192, 192);
// Èìÿ
- e_TextureFontPrintEx(x+16+16+8, _y+4, Name, gStdFont, r, g, 0, 1);
+ e_TextureFontPrintEx(x+16+16+8, _y+4, namestr, gStdFont, r, g, 0, 1);
// Ïèíã/ïîòåðè
e_TextureFontPrintEx(x+w1+16, _y+4, Format(_lc[I_GAME_PING_MS], [Ping, Loss]), gStdFont, r, g, 0, 1);
// Ôðàãè
// Ïèíã/ïîòåðè
e_TextureFontPrintEx(x+w1+16, _y+4, Format(_lc[I_GAME_PING_MS], [Ping, Loss]), gStdFont, r, g, 0, 1);
// Ôðàãè
if gPlayerAction[p, ACTION_LOOKUP] then plr.PressKey(KEY_UP, time);
if gPlayerAction[p, ACTION_LOOKDOWN] then plr.PressKey(KEY_DOWN, time);
if gPlayerAction[p, ACTION_ATTACK] then plr.PressKey(KEY_FIRE);
if gPlayerAction[p, ACTION_LOOKUP] then plr.PressKey(KEY_UP, time);
if gPlayerAction[p, ACTION_LOOKDOWN] then plr.PressKey(KEY_DOWN, time);
if gPlayerAction[p, ACTION_ATTACK] then plr.PressKey(KEY_FIRE);
- if gPlayerAction[p, ACTION_WEAPNEXT] then plr.PressKey(KEY_NEXTWEAPON);
- if gPlayerAction[p, ACTION_WEAPPREV] then plr.PressKey(KEY_PREVWEAPON);
if gPlayerAction[p, ACTION_ACTIVATE] then plr.PressKey(KEY_OPEN);
if gPlayerAction[p, ACTION_ACTIVATE] then plr.PressKey(KEY_OPEN);
- gPlayerAction[p, ACTION_WEAPNEXT] := False; // HACK, remove after readyweaon&pendinweapon implementation
- gPlayerAction[p, ACTION_WEAPPREV] := False; // HACK, remove after readyweaon&pendinweapon implementation
+ for i := WP_FACT to WP_LACT do
+ begin
+ if gWeaponAction[p, i] then
+ begin
+ plr.ProcessWeaponAction(i);
+ gWeaponAction[p, i] := False
+ end
+ end;
for i := WP_FIRST to WP_LAST do
begin
for i := WP_FIRST to WP_LAST do
begin
MC_SEND_CheatRequest(NET_CHEAT_READY);
end;
MC_SEND_CheatRequest(NET_CHEAT_READY);
end;
+procedure g_Game_PreUpdate();
+begin
+ // these are in separate PreUpdate functions because they can interact during Update()
+ // and are synced over the net
+ // we don't care that much about corpses and gibs
+ g_Player_PreUpdate();
+ g_Monsters_PreUpdate();
+ g_Items_PreUpdate();
+ g_Weapon_PreUpdate();
+end;
+
procedure g_Game_Update();
var
Msg: g_gui.TMessage;
procedure g_Game_Update();
var
Msg: g_gui.TMessage;
if mon.gncNeedSend then MH_SEND_MonsterPos(mon.UID);
end;
if mon.gncNeedSend then MH_SEND_MonsterPos(mon.UID);
end;
+ function sendItemPos (it: PItem): Boolean;
+ begin
+ result := false; // don't stop
+ if it.needSend then
+ begin
+ MH_SEND_ItemPos(it.myId);
+ it.needSend := False;
+ end;
+ end;
+
var
reliableUpdate: Boolean;
begin
var
reliableUpdate: Boolean;
begin
// Çàêîí÷èëñÿ óðîâåíü â Ñâîåé èãðå:
if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then
begin
// Çàêîí÷èëñÿ óðîâåíü â Ñâîåé èãðå:
if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then
begin
+ gState := STATE_INTERCUSTOM;
InterReadyTime := -1;
if gLastMap and (gGameSettings.GameMode = GM_COOP) then
begin
InterReadyTime := -1;
if gLastMap and (gGameSettings.GameMode = GM_COOP) then
begin
end
else
gMusic.SetByName('MUSIC_ROUNDMUS');
end
else
gMusic.SetByName('MUSIC_ROUNDMUS');
-
gMusic.Play();
gMusic.Play();
- gState := STATE_INTERCUSTOM;
e_UnpressAllKeys();
end
else // Çàêîí÷èëàñü ïîñëåäíÿÿ êàðòà â Îäèíî÷íîé èãðå
e_UnpressAllKeys();
end
else // Çàêîí÷èëàñü ïîñëåäíÿÿ êàðòà â Îäèíî÷íîé èãðå
gSpectY := Max(gSpectY - gSpectStep, 0);
if gPlayerAction[0, ACTION_LOOKDOWN] then
gSpectY := Min(gSpectY + gSpectStep, gMapInfo.Height - gScreenHeight);
gSpectY := Max(gSpectY - gSpectStep, 0);
if gPlayerAction[0, ACTION_LOOKDOWN] then
gSpectY := Min(gSpectY + gSpectStep, gMapInfo.Height - gScreenHeight);
- if gPlayerAction[0, ACTION_WEAPPREV] then
+ if gWeaponAction[0, WP_PREV] then
begin
// decrease step
if gSpectStep > 4 then gSpectStep := gSpectStep shr 1;
begin
// decrease step
if gSpectStep > 4 then gSpectStep := gSpectStep shr 1;
- gSpectKeyPress := True;
+ gWeaponAction[0, WP_PREV] := False;
end;
end;
- if gPlayerAction[0, ACTION_WEAPNEXT] then
+ if gWeaponAction[0, WP_NEXT] then
begin
// increase step
if gSpectStep < 64 then gSpectStep := gSpectStep shl 1;
begin
// increase step
if gSpectStep < 64 then gSpectStep := gSpectStep shl 1;
- gSpectKeyPress := True;
+ gWeaponAction[0, WP_NEXT] := False;
end;
end;
if (gSpectMode = SPECT_PLAYERS)
end;
end;
if (gSpectMode = SPECT_PLAYERS)
gSpectPID1 := GetActivePlayerID_Next(gSpectPID1);
gSpectKeyPress := True;
end;
gSpectPID1 := GetActivePlayerID_Next(gSpectPID1);
gSpectKeyPress := True;
end;
- if gPlayerAction[0, ACTION_WEAPPREV] then
+ if gWeaponAction[0, WP_PREV] then
begin
// prev player (view 2)
gSpectPID2 := GetActivePlayerID_Prev(gSpectPID2);
begin
// prev player (view 2)
gSpectPID2 := GetActivePlayerID_Prev(gSpectPID2);
- gSpectKeyPress := True;
+ gWeaponAction[0, WP_PREV] := False;
end;
end;
- if gPlayerAction[0, ACTION_WEAPNEXT] then
+ if gWeaponAction[0, WP_NEXT] then
begin
// next player (view 2)
gSpectPID2 := GetActivePlayerID_Next(gSpectPID2);
begin
// next player (view 2)
gSpectPID2 := GetActivePlayerID_Next(gSpectPID2);
- gSpectKeyPress := True;
+ gWeaponAction[0, WP_NEXT] := False;
end;
end;
if gPlayerAction[0, ACTION_ATTACK] then
end;
end;
if gPlayerAction[0, ACTION_ATTACK] then
(not gPlayerAction[0, ACTION_MOVELEFT]) and
(not gPlayerAction[0, ACTION_MOVERIGHT]) and
(not gPlayerAction[0, ACTION_LOOKUP]) and
(not gPlayerAction[0, ACTION_MOVELEFT]) and
(not gPlayerAction[0, ACTION_MOVERIGHT]) and
(not gPlayerAction[0, ACTION_LOOKUP]) and
- (not gPlayerAction[0, ACTION_LOOKDOWN]) and
- (not gPlayerAction[0, ACTION_WEAPPREV]) and
- (not gPlayerAction[0, ACTION_WEAPNEXT]) then
+ (not gPlayerAction[0, ACTION_LOOKDOWN]) then
gSpectKeyPress := False;
if gSpectAuto then
gSpectKeyPress := False;
if gSpectAuto then
g_Mons_ForEach(sendMonsPos);
g_Mons_ForEach(sendMonsPos);
+ // update flags that aren't stationary
+ if gGameSettings.GameMode = GM_CTF then
+ for I := FLAG_RED to FLAG_BLUE do
+ if gFlags[I].NeedSend then
+ begin
+ gFlags[I].NeedSend := False;
+ MH_SEND_FlagPos(I);
+ end;
+
+ // update items that aren't stationary
+ g_Items_ForEachAlive(sendItemPos);
+
if reliableUpdate then
begin
NetTimeToReliable := 0;
if reliableUpdate then
begin
NetTimeToReliable := 0;
procedure DrawPlayer(p: TPlayer);
var
procedure DrawPlayer(p: TPlayer);
var
- px, py, a, b, c, d, i: Integer;
+ px, py, a, b, c, d, i, fX, fY: Integer;
+ camObj: TObj;
//R: TRect;
begin
if (p = nil) or (p.FDummy) then
//R: TRect;
begin
if (p = nil) or (p.FDummy) then
glPushMatrix();
glPushMatrix();
- px := p.GameX + PLAYER_RECT_CX;
- py := p.GameY + PLAYER_RECT_CY+p.Obj.slopeUpLeft;
+ camObj := p.getCameraObj();
+ camObj.lerp(gLerpFactor, fX, fY);
+ px := fX + PLAYER_RECT_CX;
+ py := fY + PLAYER_RECT_CY+nlerp(p.SlopeOld, camObj.slopeUpLeft, gLerpFactor);
if (g_dbg_scale = 1.0) and (not g_dbg_ignore_bounds) then
begin
if (g_dbg_scale = 1.0) and (not g_dbg_ignore_bounds) then
begin
p.IncCam := nclamp(p.IncCam, min(0, -120 - i), 0);
end;
p.IncCam := nclamp(p.IncCam, min(0, -120 - i), 0);
end;
- sY := sY - p.IncCam;
+ sY := sY - nlerp(p.IncCamOld, p.IncCam, gLerpFactor);
if (not g_dbg_ignore_bounds) then
begin
if (not g_dbg_ignore_bounds) then
begin
FPSTime := Time;
end;
FPSTime := Time;
end;
+ e_SetRendertarget(True);
+ e_SetViewPort(0, 0, gScreenWidth, gScreenHeight);
+
if gGameOn or (gState = STATE_FOLD) then
begin
if (gPlayer1 <> nil) and (gPlayer2 <> nil) then
if gGameOn or (gState = STATE_FOLD) then
begin
if (gPlayer1 <> nil) and (gPlayer2 <> nil) then
Round(gScreenHeight / 2.75)-(h div 2), MessageText);
end;
Round(gScreenHeight / 2.75)-(h div 2), MessageText);
end;
- if IsDrawStat or (gSpectMode = 1) then DrawStat();
+ if IsDrawStat or (gSpectMode = SPECT_STATS) then
+ DrawStat();
if gSpectHUD and (not gChatShow) and (gSpectMode <> SPECT_NONE) and (not gSpectAuto) then
begin
if gSpectHUD and (not gChatShow) and (gSpectMode <> SPECT_NONE) and (not gSpectAuto) then
begin
if gGameOn then drawProfilers();
if gGameOn then drawProfilers();
+ // TODO: draw this after the FBO and remap mouse click coordinates
+
{$IFDEF ENABLE_HOLMES}
g_Holmes_DrawUI();
{$ENDIF}
{$IFDEF ENABLE_HOLMES}
g_Holmes_DrawUI();
{$ENDIF}
+ // blit framebuffer to screen
+
+ e_SetRendertarget(False);
+ e_SetViewPort(0, 0, gWinSizeX, gWinSizeY);
+ e_BlitFramebuffer(gWinSizeX, gWinSizeY);
+
+ // draw the overlay stuff on top of it
+
g_Touch_Draw;
end;
g_Touch_Draw;
end;
e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), TMsgType.Warning);
gExit := EXIT_SIMPLE;
e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), TMsgType.Warning);
gExit := EXIT_SIMPLE;
+ if gGameOn then EndGame;
end;
procedure g_SimpleError(Text: String);
end;
procedure g_SimpleError(Text: String);
else
begin
gPlayer1.Name := gPlayer1Settings.Name;
else
begin
gPlayer1.Name := gPlayer1Settings.Name;
+ gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
+ gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
+ gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
+ gPlayer1.SkipFist := gPlayer1Settings.SkipFist;
g_Console_Add(Format(_lc[I_PLAYER_JOIN], [gPlayer1.Name]), True);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer1.UID);
g_Console_Add(Format(_lc[I_PLAYER_JOIN], [gPlayer1.Name]), True);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer1.UID);
else
begin
gPlayer2.Name := gPlayer2Settings.Name;
else
begin
gPlayer2.Name := gPlayer2Settings.Name;
+ gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch;
+ gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences);
+ gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty;
+ gPlayer2.SkipFist := gPlayer2Settings.SkipFist;
g_Console_Add(Format(_lc[I_PLAYER_JOIN], [gPlayer2.Name]), True);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer2.UID);
g_Console_Add(Format(_lc[I_PLAYER_JOIN], [gPlayer2.Name]), True);
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_PlayerCreate(gPlayer2.UID);
gGameSettings.Options := gGameSettings.Options + GAME_OPTION_ALLOWEXIT;
gGameSettings.Options := gGameSettings.Options + GAME_OPTION_MONSTERS;
gGameSettings.Options := gGameSettings.Options + GAME_OPTION_BOTVSMONSTER;
gGameSettings.Options := gGameSettings.Options + GAME_OPTION_ALLOWEXIT;
gGameSettings.Options := gGameSettings.Options + GAME_OPTION_MONSTERS;
gGameSettings.Options := gGameSettings.Options + GAME_OPTION_BOTVSMONSTER;
+ gGameSettings.Options := gGameSettings.Options + GAME_OPTION_TEAMHITPROJECTILE;
+ gGameSettings.Options := gGameSettings.Options + GAME_OPTION_TEAMHITTRACE;
gSwitchGameMode := GM_SINGLE;
gLMSRespawn := LMS_RESPAWN_NONE;
gSwitchGameMode := GM_SINGLE;
gLMSRespawn := LMS_RESPAWN_NONE;
end;
gPlayer1.Name := gPlayer1Settings.Name;
end;
gPlayer1.Name := gPlayer1Settings.Name;
+ gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
+ gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
+ gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
+ gPlayer1.SkipFist := gPlayer1Settings.SkipFist;
nPl := 1;
// Ñîçäàíèå âòîðîãî èãðîêà, åñëè åñòü:
nPl := 1;
// Ñîçäàíèå âòîðîãî èãðîêà, åñëè åñòü:
end;
gPlayer2.Name := gPlayer2Settings.Name;
end;
gPlayer2.Name := gPlayer2Settings.Name;
+ gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch;
+ gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences);
+ gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty;
+ gPlayer2.SkipFist := gPlayer2Settings.SkipFist;
Inc(nPl);
end;
Inc(nPl);
end;
end;
gPlayer1.Name := gPlayer1Settings.Name;
end;
gPlayer1.Name := gPlayer1Settings.Name;
+ gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
+ gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
+ gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
+ gPlayer1.SkipFist := gPlayer1Settings.SkipFist;
Inc(nPl);
end;
Inc(nPl);
end;
end;
gPlayer2.Name := gPlayer2Settings.Name;
end;
gPlayer2.Name := gPlayer2Settings.Name;
+ gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch;
+ gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences);
+ gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty;
+ gPlayer2.SkipFist := gPlayer2Settings.SkipFist;
Inc(nPl);
end;
Inc(nPl);
end;
end;
gPlayer1.Name := gPlayer1Settings.Name;
end;
gPlayer1.Name := gPlayer1Settings.Name;
+ gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
+ gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
+ gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
+ gPlayer1.SkipFist := gPlayer1Settings.SkipFist;
end;
if nPlayers >= 2 then
end;
if nPlayers >= 2 then
end;
gPlayer2.Name := gPlayer2Settings.Name;
end;
gPlayer2.Name := gPlayer2Settings.Name;
+ gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch;
+ gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences);
+ gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty;
+ gPlayer2.SkipFist := gPlayer2Settings.SkipFist;
end;
g_Game_SetLoadingText(_lc[I_LOAD_HOST], 0, False);
end;
g_Game_SetLoadingText(_lc[I_LOAD_HOST], 0, False);
end;
gPlayer1.Name := gPlayer1Settings.Name;
end;
gPlayer1.Name := gPlayer1Settings.Name;
+ gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
+ gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
+ gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
+ gPlayer1.SkipFist := gPlayer1Settings.SkipFist;
gPlayer1.UID := NetPlrUID1;
gPlayer1.Reset(True);
gPlayer1.UID := NetPlrUID1;
gPlayer1.Reset(True);
begin
ParseGameFlag(GAME_OPTION_TEAMDAMAGE, I_MSG_FRIENDLY_FIRE_OFF, I_MSG_FRIENDLY_FIRE_ON);
end
begin
ParseGameFlag(GAME_OPTION_TEAMDAMAGE, I_MSG_FRIENDLY_FIRE_OFF, I_MSG_FRIENDLY_FIRE_ON);
end
+ else if cmd = 'g_friendly_absorb_damage' then
+ begin
+ ParseGameFlag(GAME_OPTION_TEAMABSORBDAMAGE, I_MSG_FRIENDLY_ABSORB_DAMAGE_OFF, I_MSG_FRIENDLY_ABSORB_DAMAGE_ON);
+ end
+ else if cmd = 'g_friendly_hit_trace' then
+ begin
+ ParseGameFlag(GAME_OPTION_TEAMHITTRACE, I_MSG_FRIENDLY_HIT_TRACE_OFF, I_MSG_FRIENDLY_HIT_TRACE_ON);
+ end
+ else if cmd = 'g_friendly_hit_projectile' then
+ begin
+ ParseGameFlag(GAME_OPTION_TEAMHITPROJECTILE, I_MSG_FRIENDLY_PROJECT_TRACE_OFF, I_MSG_FRIENDLY_PROJECT_TRACE_ON);
+ end
else if cmd = 'g_weaponstay' then
begin
ParseGameFlag(GAME_OPTION_WEAPONSTAY, I_MSG_WEAPONSTAY_OFF, I_MSG_WEAPONSTAY_ON);
else if cmd = 'g_weaponstay' then
begin
ParseGameFlag(GAME_OPTION_WEAPONSTAY, I_MSG_WEAPONSTAY_OFF, I_MSG_WEAPONSTAY_ON);
begin
ParseGameFlag(GAME_OPTION_MONSTERS, I_MSG_ALLOWMON_OFF, I_MSG_ALLOWMON_ON, True);
end
begin
ParseGameFlag(GAME_OPTION_MONSTERS, I_MSG_ALLOWMON_OFF, I_MSG_ALLOWMON_ON, True);
end
+ else if cmd = 'g_allow_dropflag' then
+ begin
+ ParseGameFlag(GAME_OPTION_ALLOWDROPFLAG, I_MSG_ALLOWDROPFLAG_OFF, I_MSG_ALLOWDROPFLAG_ON);
+ end
+ else if cmd = 'g_throw_flag' then
+ begin
+ ParseGameFlag(GAME_OPTION_THROWFLAG, I_MSG_THROWFLAG_OFF, I_MSG_THROWFLAG_ON);
+ end
else if cmd = 'g_bot_vsplayers' then
begin
ParseGameFlag(GAME_OPTION_BOTVSPLAYER, I_MSG_BOTSVSPLAYERS_OFF, I_MSG_BOTSVSPLAYERS_ON);
else if cmd = 'g_bot_vsplayers' then
begin
ParseGameFlag(GAME_OPTION_BOTVSPLAYER, I_MSG_BOTSVSPLAYERS_OFF, I_MSG_BOTSVSPLAYERS_ON);
begin
if Length(p) = 2 then
begin
begin
if Length(p) = 2 then
begin
- a := Max(0, StrToInt(p[1]));
+ a := Max(0, StrToIntDef(p[1], 0));
g_GFX_SetMax(a)
end
else if Length(p) = 1 then
g_GFX_SetMax(a)
end
else if Length(p) = 1 then
begin
if Length(p) = 2 then
begin
begin
if Length(p) = 2 then
begin
- a := Max(0, StrToInt(p[1]));
+ a := Max(0, StrToIntDef(p[1], 0));
g_Shells_SetMax(a)
end
else if Length(p) = 1 then
g_Shells_SetMax(a)
end
else if Length(p) = 1 then
begin
if Length(p) = 2 then
begin
begin
if Length(p) = 2 then
begin
- a := Max(0, StrToInt(p[1]));
+ a := Max(0, StrToIntDef(p[1], 0));
g_Gibs_SetMax(a)
end
else if Length(p) = 1 then
g_Gibs_SetMax(a)
end
else if Length(p) = 1 then
begin
if Length(p) = 2 then
begin
begin
if Length(p) = 2 then
begin
- a := Max(0, StrToInt(p[1]));
+ a := Max(0, StrToIntDef(p[1], 0));
g_Corpses_SetMax(a)
end
else if Length(p) = 1 then
g_Corpses_SetMax(a)
end
else if Length(p) = 1 then
(gsTimeLimit div 60) mod 60,
gsTimeLimit mod 60]));
end
(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
else if cmd = 'g_maxlives' then
begin
if Length(P) > 1 then
procedure PlayerSettingsCVars(P: SSArray);
var
cmd: string;
procedure PlayerSettingsCVars(P: SSArray);
var
cmd: string;
+ team: Byte;
+
+ function ParseTeam(s: string): Byte;
+ begin
+ result := 0;
+ case s of
+ 'red', '1': result := TEAM_RED;
+ 'blue', '2': result := TEAM_BLUE;
+ else result := TEAM_NONE;
+ end;
+ end;
begin
cmd := LowerCase(P[0]);
case cmd of
begin
cmd := LowerCase(P[0]);
case cmd of
end;
end;
end;
end;
end;
end;
+ 'p1_team':
+ begin
+ // TODO: switch teams if in game or store this separately
+ if (Length(P) > 1) then
+ begin
+ team := ParseTeam(P[1]);
+ if team = TEAM_NONE then
+ g_Console_Add('expected ''red'', ''blue'', 1 or 2')
+ else if not gGameOn and not g_Game_IsNet then
+ gPlayer1Settings.Team := team
+ else
+ g_Console_Add(_lc[I_MSG_ONMAPCHANGE]);
+ end;
+ end;
+ 'p2_team':
+ begin
+ // TODO: switch teams if in game or store this separately
+ if (Length(P) > 1) then
+ begin
+ team := ParseTeam(P[1]);
+ if team = TEAM_NONE then
+ g_Console_Add('expected ''red'', ''blue'', 1 or 2')
+ else if not gGameOn and not g_Game_IsNet then
+ gPlayer2Settings.Team := team
+ else
+ g_Console_Add(_lc[I_MSG_ONMAPCHANGE]);
+ end;
+ end;
+ 'p1_autoswitch':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponSwitch := EnsureRange(StrTointDef(P[1], 0), 0, 2);
+ end;
+ 'p2_autoswitch':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponSwitch := EnsureRange(StrTointDef(P[1], 0), 0, 2);
+ end;
+ 'p1_switch_empty':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.SwitchToEmpty := EnsureRange(StrTointDef(P[1], 0), 0, 1);
+ end;
+ 'p2_switch_empty':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.SwitchToEmpty := EnsureRange(StrTointDef(P[1], 0), 0, 1);
+ end;
+ 'p1_skip_fist':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.SkipFist := EnsureRange(StrTointDef(P[1], 0), 0, 1);
+ end;
+ 'p2_skip_fist':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.SkipFist := EnsureRange(StrTointDef(P[1], 0), 0, 1);
+ end;
+ 'p1_priority_kastet':
+ begin
+ if (Length(P) = 2) then
+ 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;
+ 'p1_priority_saw':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_SAW] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_saw':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_SAW] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_pistol':
+ begin
+ if (Length(P) = 2) then
+ 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;
+ 'p1_priority_shotgun1':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_SHOTGUN1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_shotgun1':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_SHOTGUN1] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_shotgun2':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_SHOTGUN2] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_shotgun2':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_SHOTGUN2] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_chaingun':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_CHAINGUN] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_chaingun':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_CHAINGUN] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_rocketlauncher':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_ROCKETLAUNCHER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_rocketlauncher':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_ROCKETLAUNCHER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_plasma':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_PLASMA] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_plasma':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_PLASMA] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_bfg':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_BFG] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_bfg':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_BFG] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_super':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_SUPERPULEMET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_super':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_SUPERPULEMET] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p1_priority_flamethrower':
+ begin
+ if (Length(P) = 2) then
+ gPlayer1Settings.WeaponPreferences[WEAPON_FLAMETHROWER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ end;
+ 'p2_priority_flamethrower':
+ begin
+ if (Length(P) = 2) then
+ gPlayer2Settings.WeaponPreferences[WEAPON_FLAMETHROWER] := EnsureRange(StrToIntDef(P[1], WP_FIRST), WP_FIRST, WP_LAST+1);
+ 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);
+ 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;
end;
end;
end;
end;
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
+ else if cmd = 'kick_pid' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('kick_pid <player ID>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('kick_pid <player ID>');
+ Exit;
+ end;
+
+ 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);
+ enet_peer_disconnect(pl^.Peer, 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();
+ end;
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
else if cmd = 'ban' then
begin
if g_Game_IsServer and g_Game_IsNet then
else if cmd = 'ban' then
begin
if g_Game_IsServer and g_Game_IsNet then
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
+ else if cmd = 'ban_pid' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('ban_pid <player ID>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('ban_pid <player ID>');
+ Exit;
+ end;
+
+ 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;
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
else if cmd = 'permban' then
begin
if g_Game_IsServer and g_Game_IsNet then
else if cmd = 'permban' then
begin
if g_Game_IsServer and g_Game_IsNet then
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
+ else if cmd = 'permban_pid' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('permban_pid <player ID>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('permban_pid <player ID>');
+ Exit;
+ end;
+
+ 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;
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
+ else if cmd = 'permban_ip' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('permban_ip <IP address>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('permban_ip <IP address>');
+ Exit;
+ end;
+
+ g_Net_BanHost(P[1]);
+ g_Net_SaveBanList();
+ g_Console_Add(Format(_lc[I_PLAYER_BAN], [P[1]]));
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
else if cmd = 'unban' then
begin
if g_Game_IsServer and g_Game_IsNet then
else if cmd = 'unban' then
begin
if g_Game_IsServer and g_Game_IsNet then
end else
g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
end
end else
g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
end
+ else if (cmd = 'an') or (cmd = 'announce') then
+ begin
+ if g_Game_IsNet then
+ begin
+ if Length(P) > 1 then
+ begin
+ for a := 1 to High(P) do
+ chstr := chstr + P[a] + ' ';
+
+ if Length(chstr) > 200 then SetLength(chstr, 200);
+
+ if Length(chstr) < 1 then
+ begin
+ g_Console_Add('announce <text>');
+ Exit;
+ end;
+
+ chstr := 'centerprint 100 ' + b_Text_Format(chstr);
+ if g_Game_IsClient then
+ MC_SEND_RCONCommand(chstr)
+ else
+ g_Console_Process(chstr, True);
+ end
+ else
+ g_Console_Add('announce <text>');
+ end else
+ g_Console_Add(_lc[I_MSG_GM_UNAVAIL]);
+ end
else if cmd = 'game' then
begin
if gGameSettings.GameType <> GT_NONE then
else if cmd = 'game' then
begin
if gGameSettings.GameType <> GT_NONE then
g_Game_Free();
with gGameSettings do
begin
g_Game_Free();
with gGameSettings do
begin
+ Options := gsGameFlags;
GameMode := g_Game_TextToMode(gsGameMode);
if gSwitchGameMode <> GM_NONE then
GameMode := gSwitchGameMode;
GameMode := g_Game_TextToMode(gsGameMode);
if gSwitchGameMode <> GM_NONE then
GameMode := gSwitchGameMode;
g_Game_Free();
with gGameSettings do
begin
g_Game_Free();
with gGameSettings do
begin
+ Options := gsGameFlags;
GameMode := g_Game_TextToMode(gsGameMode);
if gSwitchGameMode <> GM_NONE then GameMode := gSwitchGameMode;
if GameMode = GM_NONE then GameMode := GM_DM;
GameMode := g_Game_TextToMode(gsGameMode);
if gSwitchGameMode <> GM_NONE then GameMode := gSwitchGameMode;
if GameMode = GM_NONE then GameMode := GM_DM;
begin
g_TakeScreenShot()
end
begin
g_TakeScreenShot()
end
+ else if (cmd = 'weapnext') or (cmd = 'weapprev') then
+ begin
+ a := 1 - (ord(cmd[5]) - ord('n'));
+ if a = -1 then
+ gWeaponAction[0, WP_PREV] := True;
+ if a = 1 then
+ gWeaponAction[0, WP_NEXT] := True;
+ end
else if cmd = 'weapon' then
begin
if Length(p) = 2 then
begin
else if cmd = 'weapon' then
begin
if Length(p) = 2 then
begin
- a := WP_FIRST + StrToInt(p[1]) - 1;
+ a := WP_FIRST + StrToIntDef(p[1], 0) - 1;
if (a >= WP_FIRST) and (a <= WP_LAST) then
gSelectWeapon[0, a] := True
end
end
if (a >= WP_FIRST) and (a <= WP_LAST) then
gSelectWeapon[0, a] := True
end
end
+ else if (cmd = 'p1_weapnext') or (cmd = 'p1_weapprev')
+ or (cmd = 'p2_weapnext') or (cmd = 'p2_weapprev') then
+ begin
+ a := 1 - (ord(cmd[8]) - ord('n'));
+ b := ord(cmd[2]) - ord('1');
+ if a = -1 then
+ gWeaponAction[b, WP_PREV] := True;
+ if a = 1 then
+ gWeaponAction[b, WP_NEXT] := True;
+ end
else if (cmd = 'p1_weapon') or (cmd = 'p2_weapon') then
begin
if Length(p) = 2 then
begin
else if (cmd = 'p1_weapon') or (cmd = 'p2_weapon') then
begin
if Length(p) = 2 then
begin
- a := WP_FIRST + StrToInt(p[1]) - 1;
+ a := WP_FIRST + StrToIntDef(p[1], 0) - 1;
b := ord(cmd[2]) - ord('1');
if (a >= WP_FIRST) and (a <= WP_LAST) then
gSelectWeapon[b, a] := True
end
end
b := ord(cmd[2]) - ord('1');
if (a >= WP_FIRST) and (a <= WP_LAST) then
gSelectWeapon[b, a] := True
end
end
+ else if (cmd = 'p1_weapbest') or (cmd = 'p2_weapbest') then
+ begin
+ b := ord(cmd[2]) - ord('1');
+ if b = 0 then
+ gSelectWeapon[b, gPlayer1.GetMorePrefered()] := True
+ else
+ gSelectWeapon[b, gPlayer2.GetMorePrefered()] := True;
+ end
+ else if (cmd = 'dropflag') then
+ begin
+ if g_Game_IsServer then
+ begin
+ if gPlayer2 <> nil then gPlayer2.TryDropFlag();
+ if gPlayer1 <> nil then gPlayer1.TryDropFlag();
+ end
+ else
+ MC_SEND_CheatRequest(NET_CHEAT_DROPFLAG);
+ end
+ else if (cmd = 'p1_dropflag') or (cmd = 'p2_dropflag') then
+ begin
+ b := ord(cmd[2]) - ord('1');
+ if g_Game_IsServer then
+ begin
+ if (b = 1) and (gPlayer2 <> nil) then gPlayer2.TryDropFlag()
+ else if (b = 0) and (gPlayer1 <> nil) then gPlayer1.TryDropFlag();
+ end
+ else
+ MC_SEND_CheatRequest(NET_CHEAT_DROPFLAG);
+ end
// Êîìàíäû Ñâîåé èãðû:
else if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then
begin
// Êîìàíäû Ñâîåé èãðû:
else if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then
begin
end;
'r_reset':
begin
end;
'r_reset':
begin
- sys_EnableVSync(gVSync);
gRC_Width := Max(1, gRC_Width);
gRC_Height := Max(1, gRC_Height);
gBPP := Max(1, gBPP);
gRC_Width := Max(1, gRC_Width);
gRC_Height := Max(1, gRC_Height);
gBPP := Max(1, gBPP);
e_LogWriteln('resolution changed')
else
e_LogWriteln('resolution not changed');
e_LogWriteln('resolution changed')
else
e_LogWriteln('resolution not changed');
+ sys_EnableVSync(gVSync);
+ end;
+ 'r_maxfps':
+ begin
+ if Length(p) = 2 then
+ begin
+ gMaxFPS := StrToIntDef(p[1], gMaxFPS);
+ if gMaxFPS > 0 then
+ gFrameTime := 1000 div gMaxFPS
+ else
+ gFrameTime := 0;
+ end;
+ e_LogWritefln('r_maxfps %d', [gMaxFPS]);
end;
'g_language':
begin
end;
'g_language':
begin
name := e_CatPath(dir, Filename + '.png');
s := createDiskFile(name);
try
name := e_CatPath(dir, Filename + '.png');
s := createDiskFile(name);
try
- e_MakeScreenshot(s, gScreenWidth, gScreenHeight);
+ e_MakeScreenshot(s, gWinSizeX, gWinSizeY);
s.Free;
g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name]))
except
s.Free;
g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name]))
except
case gAnnouncer of
ANNOUNCE_NONE:
Exit;
case gAnnouncer of
ANNOUNCE_NONE:
Exit;
- ANNOUNCE_ME,
- ANNOUNCE_MEPLUS:
+ ANNOUNCE_ME:
if not g_Game_IsWatchedPlayer(SpawnerUID) then
Exit;
end;
if not g_Game_IsWatchedPlayer(SpawnerUID) then
Exit;
end;
while i <= ParamCount do
begin
s := ParamStr(i);
while i <= ParamCount do
begin
s := ParamStr(i);
- if (s[1] = '-') and (Length(s) > 1) then
+ if (Length(s) > 1) and (s[1] = '-') then
begin
begin
- if (s[2] = '-') and (Length(s) > 2) then
+ if (Length(s) > 2) and (s[2] = '-') then
begin // Îäèíî÷íûé ïàðàìåòð
SetLength(pars, Length(pars) + 1);
with pars[High(pars)] do
begin // Îäèíî÷íûé ïàðàìåòð
SetLength(pars, Length(pars) + 1);
with pars[High(pars)] do
// Options:
s := Find_Param_Value(pars, '-opt');
if (s = '') then
// Options:
s := Find_Param_Value(pars, '-opt');
if (s = '') then
- Opt := GAME_OPTION_ALLOWEXIT or GAME_OPTION_BOTVSPLAYER or
- GAME_OPTION_BOTVSMONSTER or GAME_OPTION_DMKEYS
+ Opt := gsGameFlags
else
Opt := StrToIntDef(s, 0);
else
Opt := StrToIntDef(s, 0);
conRegVar('r_showlives', @gShowLives, 'show lives', 'show lives');
conRegVar('r_showspect', @gSpectHUD, 'show spectator hud', 'show spectator hud');
conRegVar('r_showstat', @gShowStat, 'show stats', 'show stats');
conRegVar('r_showlives', @gShowLives, 'show lives', 'show lives');
conRegVar('r_showspect', @gSpectHUD, 'show spectator hud', 'show spectator hud');
conRegVar('r_showstat', @gShowStat, 'show stats', 'show stats');
+ conRegVar('r_showpids', @gShowPIDs, 'show PIDs', 'show PIDs');
end.
end.