diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index 9aa72a832c3c6d2cf52adfdb1ac70adcee3565cf..a7afb5c9d17116a2ed8a5624ec881c62124056c7 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
function getNextWeaponIndex (): Byte; // return 255 for "no switch"
procedure resetWeaponQueue ();
function hasAmmoForWeapon (weapon: Byte): Boolean;
function getNextWeaponIndex (): Byte; // return 255 for "no switch"
procedure resetWeaponQueue ();
function hasAmmoForWeapon (weapon: Byte): Boolean;
+ function hasAmmoForShooting (weapon: Byte): Boolean;
+ function shouldSwitch (weapon: Byte; hadWeapon: Boolean) : Boolean;
procedure doDamage (v: Integer);
procedure doDamage (v: Integer);
FReloading: Array [WP_FIRST..WP_LAST] of Word;
FTime: Array [T_RESPAWN..T_FLAGCAP] of DWORD;
FKeys: Array [KEY_LEFT..KEY_CHAT] of TKeyState;
FReloading: Array [WP_FIRST..WP_LAST] of Word;
FTime: Array [T_RESPAWN..T_FLAGCAP] of DWORD;
FKeys: Array [KEY_LEFT..KEY_CHAT] of TKeyState;
+ FWeapSwitchMode: Byte;
+ FWeapPreferences: Array [WP_FIRST .. WP_LAST+1] of Byte;
+ FSwitchToEmpty: Byte;
+ FSkipFist: Byte;
FColor: TRGB;
FPreferredTeam: Byte;
FSpectator: Boolean;
FColor: TRGB;
FPreferredTeam: Byte;
FSpectator: Boolean;
function IsKeyPressed(K: Byte): Boolean;
function GetKeys(): Byte;
function PickItem(ItemType: Byte; arespawn: Boolean; var remove: Boolean): Boolean; virtual;
function IsKeyPressed(K: Byte): Boolean;
function GetKeys(): Byte;
function PickItem(ItemType: Byte; arespawn: Boolean; var remove: Boolean): Boolean; virtual;
+ procedure SetWeaponPrefs(Prefs: Array of Byte);
+ procedure SetWeaponPref(Weapon, Pref: Byte);
+ function GetWeaponPref(Weapon: Byte) : Byte;
+ function GetMorePrefered() : Byte;
+ function MaySwitch(Weapon: Byte) : Boolean;
function Collide(X, Y: Integer; Width, Height: Word): Boolean; overload;
function Collide(Panel: TPanel): Boolean; overload;
function Collide(X, Y: Integer): Boolean; overload;
function Collide(X, Y: Integer; Width, Height: Word): Boolean; overload;
function Collide(Panel: TPanel): Boolean; overload;
function Collide(X, Y: Integer): Boolean; overload;
property Death: Integer read FDeath write FDeath;
property Kills: Integer read FKills write FKills;
property CurrWeap: Byte read FCurrWeap write FCurrWeap;
property Death: Integer read FDeath write FDeath;
property Kills: Integer read FKills write FKills;
property CurrWeap: Byte read FCurrWeap write FCurrWeap;
+ property WeapSwitchMode: Byte read FWeapSwitchMode write FWeapSwitchMode;
+ property SwitchToEmpty: Byte read FSwitchToEmpty write FSwitchToEmpty;
+ property SkipFist: Byte read FSkipFist write FSkipFist;
property MonsterKills: Integer read FMonsterKills write FMonsterKills;
property Secrets: Integer read FSecrets;
property GodMode: Boolean read FGodMode write FGodMode;
property MonsterKills: Integer read FMonsterKills write FMonsterKills;
property Secrets: Integer read FSecrets;
property GodMode: Boolean read FGodMode write FGodMode;
TTeamStat = Array [TEAM_RED..TEAM_BLUE] of
record
TTeamStat = Array [TEAM_RED..TEAM_BLUE] of
record
- Goals: SmallInt;
+ Score: SmallInt;
end;
var
end;
var
function g_Gibs_GetMax(): Word;
procedure g_Corpses_SetMax(Count: Word);
function g_Corpses_GetMax(): Word;
function g_Gibs_GetMax(): Word;
procedure g_Corpses_SetMax(Count: Word);
function g_Corpses_GetMax(): Word;
+procedure g_Force_Model_Set(Mode: Word);
+function g_Force_Model_Get(): Word;
+procedure g_Forced_Model_SetName(Model: String);
+function g_Forced_Model_GetName(): String;
procedure g_Shells_SetMax(Count: Word);
function g_Shells_GetMax(): Word;
procedure g_Shells_SetMax(Count: Word);
function g_Shells_GetMax(): Word;
procedure g_Bot_AddList(Team: Byte; lname: ShortString; num: Integer = -1; Handicap: Integer = 100);
procedure g_Bot_MixNames();
procedure g_Bot_RemoveAll();
procedure g_Bot_AddList(Team: Byte; lname: ShortString; num: Integer = -1; Handicap: Integer = 100);
procedure g_Bot_MixNames();
procedure g_Bot_RemoveAll();
+function g_Bot_GetCount(): Integer;
implementation
implementation
MaxGibs: Word = 150;
MaxCorpses: Word = 20;
MaxShells: Word = 300;
MaxGibs: Word = 150;
MaxCorpses: Word = 20;
MaxShells: Word = 300;
+ ForceModel: Word = 0;
+ ForcedModelName: String = STD_PLAYER_MODEL;
CurrentGib: Integer = 0;
CurrentShell: Integer = 0;
BotNames: Array of String;
CurrentGib: Integer = 0;
CurrentShell: Integer = 0;
BotNames: Array of String;
Result := MaxCorpses;
end;
Result := MaxCorpses;
end;
+procedure g_Force_Model_Set(Mode: Word);
+begin
+ ForceModel := Mode;
+end;
+
+function g_Force_Model_Get(): Word;
+begin
+ Result := ForceModel;
+end;
+
+procedure g_Forced_Model_SetName(Model: String);
+begin
+ ForcedModelName := Model;
+end;
+
+function g_Forced_Model_GetName(): String;
+begin
+ Result := ForcedModelName;
+end;
+
function g_Player_Create(ModelName: String; Color: TRGB; Team: Byte; Bot: Boolean): Word;
var
a: Integer;
function g_Player_Create(ModelName: String; Color: TRGB; Team: Byte; Bot: Boolean): Word;
var
a: Integer;
gPlayers[a].FActualModelName := ModelName;
gPlayers[a].SetModel(ModelName);
gPlayers[a].FActualModelName := ModelName;
gPlayers[a].SetModel(ModelName);
+ if Bot and (g_Force_Model_Get() <> 0) then
+ gPlayers[a].SetModel(g_Forced_Model_GetName());
// Íåò ìîäåëè - ñîçäàíèå íå âîçìîæíî:
if gPlayers[a].FModel = nil then
// Íåò ìîäåëè - ñîçäàíèå íå âîçìîæíî:
if gPlayers[a].FModel = nil then
// create entity and load state
if Bot then
// create entity and load state
if Bot then
- gPlayers[a] := TBot.Create()
+ begin
+ gPlayers[a] := TBot.Create();
+ if (g_Force_Model_Get() <> 0) then
+ gPlayers[a].SetModel(g_Forced_Model_GetName());
+ end
else
gPlayers[a] := TPlayer.Create();
gPlayers[a].FPhysics := True; // ???
else
gPlayers[a] := TPlayer.Create();
gPlayers[a].FPhysics := True; // ???
begin
if not g_Game_IsServer then Exit;
begin
if not g_Game_IsServer then Exit;
+// Íå äîáàâëÿåì áîòîâ åñëè ëèìèò óæå äîñòèãíóò
+ if (g_Bot_GetCount() >= gMaxBots) then Exit;
+
// Ñïèñîê íàçâàíèé ìîäåëåé:
m := g_PlayerModel_GetNames();
if m = nil then
// Ñïèñîê íàçâàíèé ìîäåëåé:
m := g_PlayerModel_GetNames();
if m = nil then
begin
if not g_Game_IsServer then Exit;
begin
if not g_Game_IsServer then Exit;
+// Íå äîáàâëÿåì áîòîâ åñëè ëèìèò óæå äîñòèãíóò
+ if (g_Bot_GetCount() >= gMaxBots) then Exit;
+
// Ñïèñîê íàçâàíèé ìîäåëåé:
m := g_PlayerModel_GetNames();
if m = nil then
// Ñïèñîê íàçâàíèé ìîäåëåé:
m := g_PlayerModel_GetNames();
if m = nil then
Result := Result + 1;
end;
Result := Result + 1;
end;
+function g_Bot_GetCount(): Integer;
+var
+ a: Integer;
+begin
+ Result := 0;
+
+ if gPlayers = nil then
+ Exit;
+
+ for a := 0 to High(gPlayers) do
+ if (gPlayers[a] <> nil) and (gPlayers[a] is TBot) then
+ Result := Result + 1;
+end;
+
function g_Player_GetStats(): TPlayerStatArray;
var
a: Integer;
function g_Player_GetStats(): TPlayerStatArray;
var
a: Integer;
var
i: Integer;
begin
var
i: Integer;
begin
- gTeamStat[TEAM_RED].Goals := 0;
- gTeamStat[TEAM_BLUE].Goals := 0;
+ gTeamStat[TEAM_RED].Score := 0;
+ gTeamStat[TEAM_BLUE].Score := 0;
if gPlayers <> nil then
for i := 0 to High(gPlayers) do
if gPlayers <> nil then
for i := 0 to High(gPlayers) do
if FModel <> nil then FModel.Color := Color;
end;
if FModel <> nil then FModel.Color := Color;
end;
+
+
function TPlayer.GetColor(): TRGB;
begin
result := FModel.Color;
end;
function TPlayer.GetColor(): TRGB;
begin
result := FModel.Color;
end;
+procedure TPlayer.SetWeaponPrefs(Prefs: Array of Byte);
+var
+ i: Integer;
+begin
+ for i := WP_FIRST to WP_LAST + 1 do
+ begin
+ if (Prefs[i] > WP_LAST + 1) then
+ FWeapPreferences[i] := 0
+ else
+ FWeapPreferences[i] := Prefs[i];
+ end;
+end;
+
+procedure TPlayer.SetWeaponPref(Weapon, Pref: Byte);
+begin
+ if (Weapon > WP_LAST + 1) then
+ exit
+ else if (Pref <= WP_LAST + 1) and (Weapon <= WP_LAST + 1) then
+ FWeapPreferences[Weapon] := Pref
+ else if (Weapon <= WP_LAST + 1) and (Pref > WP_LAST + 1) then
+ FWeapPreferences[Weapon] := 0;
+end;
+
+function TPlayer.GetWeaponPref(Weapon: Byte) : Byte;
+begin
+ if (Weapon > WP_LAST + 1) then
+ result := 0
+ else if (FWeapPreferences[Weapon] > WP_LAST + 1) then
+ result := 0
+ else
+ result := FWeapPreferences[Weapon];
+end;
+
+function TPlayer.GetMorePrefered() : Byte;
+var
+ testedWeap, i: Byte;
+begin
+ testedWeap := FCurrWeap;
+ for i := WP_FIRST to WP_LAST do
+ if FWeapon[i] and maySwitch(i) and (FWeapPreferences[i] > FWeapPreferences[testedWeap]) then
+ testedWeap := i;
+ if (R_BERSERK in FRulez) and (FWeapPreferences[WP_LAST + 1] > FWeapPreferences[testedWeap]) then
+ testedWeap := WEAPON_KASTET;
+ result := testedWeap;
+end;
+
+function TPlayer.maySwitch(Weapon: Byte) : Boolean;
+begin
+ result := true;
+ if (Weapon = WEAPON_KASTET) and (FSkipFist <> 0) then
+ begin
+ if (FSkipFist = 1) and (not (R_BERSERK in FRulez)) then
+ result := false;
+ end
+ else if (FSwitchToEmpty = 0) and (not hasAmmoForShooting(Weapon)) then
+ result := false;
+end;
+
procedure TPlayer.SwitchTeam;
begin
if g_Game_IsClient then
procedure TPlayer.SwitchTeam;
begin
if g_Game_IsClient then
end;
if t = HIT_WATER then
end;
if t = HIT_WATER then
+ begin
g_GFX_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
FObj.Y+PLAYER_RECT.Y-4, value div 2, 8, 4);
g_GFX_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
FObj.Y+PLAYER_RECT.Y-4, value div 2, 8, 4);
+ if Random(2) = 0
+ then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
+ else g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y);
+ end;
end;
// Áóôåð óðîíà:
end;
// Áóôåð óðîíà:
SY := gPlayerScreenSize.Y;
Y := 0;
SY := gPlayerScreenSize.Y;
Y := 0;
- if gShowGoals and (gGameSettings.GameMode in [GM_TDM, GM_CTF]) then
+ if gShowScore and (gGameSettings.GameMode in [GM_TDM, GM_CTF]) then
begin
if gGameSettings.GameMode = GM_CTF then
a := 32 + 8
begin
if gGameSettings.GameMode = GM_CTF then
a := 32 + 8
e_Draw(ID, X-16-32, 240-72-4, 0, True, False);
end;
e_Draw(ID, X-16-32, 240-72-4, 0, True, False);
end;
- s := IntToStr(gTeamStat[TEAM_RED].Goals);
+ s := IntToStr(gTeamStat[TEAM_RED].Score);
e_CharFont_GetSize(gMenuFont, s, tw, th);
e_CharFont_PrintEx(gMenuFont, X-16-a-tw, 240-72-4, s, TEAMCOLOR[TEAM_RED]);
e_CharFont_GetSize(gMenuFont, s, tw, th);
e_CharFont_PrintEx(gMenuFont, X-16-a-tw, 240-72-4, s, TEAMCOLOR[TEAM_RED]);
e_Draw(ID, X-16-32, 240-32-4, 0, True, False);
end;
e_Draw(ID, X-16-32, 240-32-4, 0, True, False);
end;
- s := IntToStr(gTeamStat[TEAM_BLUE].Goals);
+ s := IntToStr(gTeamStat[TEAM_BLUE].Score);
e_CharFont_GetSize(gMenuFont, s, tw, th);
e_CharFont_PrintEx(gMenuFont, X-16-a-tw, 240-32-4, s, TEAMCOLOR[TEAM_BLUE]);
end;
e_CharFont_GetSize(gMenuFont, s, tw, th);
e_CharFont_PrintEx(gMenuFont, X-16-a-tw, 240-32-4, s, TEAMCOLOR[TEAM_BLUE]);
end;
if SpawnerUID = FUID then
begin // Ñàìîóáèëñÿ
if SpawnerUID = FUID then
begin // Ñàìîóáèëñÿ
- if Srv and (gGameSettings.GameMode = GM_TDM) then
- Dec(gTeamStat[FTeam].Goals);
+ if Srv then
begin
begin
- Dec(FFrags);
- FLastFrag := 0;
+ if gGameSettings.GameMode = GM_TDM then
+ Dec(gTeamStat[FTeam].Score);
+ if DoFrags or (gGameSettings.GameMode = GM_TDM) then
+ begin
+ Dec(FFrags);
+ FLastFrag := 0;
+ end;
end;
g_Console_Add(Format(_lc[I_PLAYER_KILL_SELF], [FName]), True);
end
end;
g_Console_Add(Format(_lc[I_PLAYER_KILL_SELF], [FName]), True);
end
end;
if (gGameSettings.GameMode = GM_TDM) and DoFrags then
end;
if (gGameSettings.GameMode = GM_TDM) and DoFrags then
- Inc(gTeamStat[KP.Team].Goals,
+ Inc(gTeamStat[KP.Team].Score,
IfThen(SameTeam(FUID, SpawnerUID), -1, 1));
if netsrv then MH_SEND_PlayerStats(SpawnerUID);
IfThen(SameTeam(FUID, SpawnerUID), -1, 1));
if netsrv then MH_SEND_PlayerStats(SpawnerUID);
g_Game_Message(Format(_lc[I_MESSAGE_TLMS_WIN], [AnsiUpperCase(_lc[I_GAME_TEAM_RED])]), 144);
if Netsrv then
MH_SEND_GameEvent(NET_EV_TLMS_WIN, TEAM_RED);
g_Game_Message(Format(_lc[I_MESSAGE_TLMS_WIN], [AnsiUpperCase(_lc[I_GAME_TEAM_RED])]), 144);
if Netsrv then
MH_SEND_GameEvent(NET_EV_TLMS_WIN, TEAM_RED);
- Inc(gTeamStat[TEAM_RED].Goals);
+ Inc(gTeamStat[TEAM_RED].Score);
gLMSRespawn := LMS_RESPAWN_FINAL;
gLMSRespawnTime := gTime + 5000;
end
gLMSRespawn := LMS_RESPAWN_FINAL;
gLMSRespawnTime := gTime + 5000;
end
g_Game_Message(Format(_lc[I_MESSAGE_TLMS_WIN], [AnsiUpperCase(_lc[I_GAME_TEAM_BLUE])]), 144);
if Netsrv then
MH_SEND_GameEvent(NET_EV_TLMS_WIN, TEAM_BLUE);
g_Game_Message(Format(_lc[I_MESSAGE_TLMS_WIN], [AnsiUpperCase(_lc[I_GAME_TEAM_BLUE])]), 144);
if Netsrv then
MH_SEND_GameEvent(NET_EV_TLMS_WIN, TEAM_BLUE);
- Inc(gTeamStat[TEAM_BLUE].Goals);
+ Inc(gTeamStat[TEAM_BLUE].Score);
gLMSRespawn := LMS_RESPAWN_FINAL;
gLMSRespawnTime := gTime + 5000;
end
gLMSRespawn := LMS_RESPAWN_FINAL;
gLMSRespawnTime := gTime + 5000;
end
end;
end;
end;
end;
+function TPlayer.hasAmmoForShooting (weapon: Byte): Boolean;
+begin
+ result := false;
+ case weapon of
+ WEAPON_KASTET, WEAPON_SAW: result := true;
+ WEAPON_SHOTGUN1, WEAPON_SUPERPULEMET: result := (FAmmo[A_SHELLS] > 0);
+ WEAPON_SHOTGUN2: result := (FAmmo[A_SHELLS] > 1);
+ WEAPON_PISTOL, WEAPON_CHAINGUN: result := (FAmmo[A_BULLETS] > 0);
+ WEAPON_ROCKETLAUNCHER: result := (FAmmo[A_ROCKETS] > 0);
+ WEAPON_PLASMA: result := (FAmmo[A_CELLS] > 0);
+ WEAPON_BFG: result := (FAmmo[A_CELLS] >= 40);
+ WEAPON_FLAMETHROWER: result := (FAmmo[A_FUEL] > 0);
+ else result := (weapon < length(FWeapon));
+ end;
+end;
+
+function TPlayer.shouldSwitch (weapon: Byte; hadWeapon: Boolean): Boolean;
+begin
+ result := false;
+ if (weapon > WP_LAST + 1) then
+ begin
+ result := false;
+ exit;
+ end;
+ if (FWeapSwitchMode = 1) and not hadWeapon then
+ result := true
+ else if (FWeapSwitchMode = 2) then
+ result := (FWeapPreferences[weapon] > FWeapPreferences[FCurrWeap]);
+end;
+
// return 255 for "no switch"
function TPlayer.getNextWeaponIndex (): Byte;
var
// return 255 for "no switch"
function TPlayer.getNextWeaponIndex (): Byte;
var
dir, cwi: Integer;
begin
result := 255; // default result: "no switch"
dir, cwi: Integer;
begin
result := 255; // default result: "no switch"
+ //e_LogWriteFln('FSWITCHTOEMPTY: %s', [FSwitchToEmpty], TMsgType.Notify);
// had weapon cycling on previous frame? remove that flag
if (FNextWeap and $2000) <> 0 then
begin
// had weapon cycling on previous frame? remove that flag
if (FNextWeap and $2000) <> 0 then
begin
for i := 0 to High(FWeapon) do
begin
cwi := (cwi+length(FWeapon)+dir) mod length(FWeapon);
for i := 0 to High(FWeapon) do
begin
cwi := (cwi+length(FWeapon)+dir) mod length(FWeapon);
- if FWeapon[cwi] then
+ if FWeapon[cwi] and maySwitch(cwi) then
begin
begin
- //e_WriteLog(Format(' SWITCH: cur=%d; new=%d', [FCurrWeap, cwi]), MSG_WARNING);
+ //e_LogWriteFln(' SWITCH: cur=%d; new=%d %s %s', [FCurrWeap, cwi, FSwitchToEmpty, hasAmmoForWeapon(cwi)], TMsgType.Notify);
result := Byte(cwi);
FNextWeapDelay := WEAPON_DELAY;
exit;
result := Byte(cwi);
FNextWeapDelay := WEAPON_DELAY;
exit;
wantThisWeapon[i] := true;
Inc(wwc);
end;
wantThisWeapon[i] := true;
Inc(wwc);
end;
+
// exclude currently selected weapon from the set
wantThisWeapon[FCurrWeap] := false;
// slow down alterations a little
// exclude currently selected weapon from the set
wantThisWeapon[FCurrWeap] := false;
// slow down alterations a little
result := Byte(i);
resetWeaponQueue();
FNextWeapDelay := WEAPON_DELAY * 2; // anyway, 'cause why not
result := Byte(i);
resetWeaponQueue();
FNextWeapDelay := WEAPON_DELAY * 2; // anyway, 'cause why not
+ //e_LogWriteFln('FOUND %s %s %s', [result, FSwitchToEmpty, hasAmmoForWeapon(i)], TMsgType.Notify);
exit;
end;
end;
exit;
end;
end;
end;
nw := getNextWeaponIndex();
end;
nw := getNextWeaponIndex();
+ //
if nw = 255 then exit; // don't reset anything here
if nw > High(FWeapon) then
begin
if nw = 255 then exit; // don't reset anything here
if nw > High(FWeapon) then
begin
end;
function TPlayer.PickItem(ItemType: Byte; arespawn: Boolean; var remove: Boolean): Boolean;
end;
function TPlayer.PickItem(ItemType: Byte; arespawn: Boolean; var remove: Boolean): Boolean;
-
- function allowBerserkSwitching (): Boolean;
- begin
- if (FBFGFireCounter <> -1) then begin result := false; exit; end;
- result := true;
- if gBerserkAutoswitch then exit;
- if not conIsCheatsEnabled then exit;
- result := false;
- end;
-
var
a: Boolean;
var
a: Boolean;
- switchWeapon: Byte;
- hadWeapon: Boolean;
+ switchWeapon: Byte = 255;
+ hadWeapon: Boolean = False;
begin
Result := False;
if g_Game_IsClient then Exit;
begin
Result := False;
if g_Game_IsClient then Exit;
if not (R_BERSERK in FRulez) then
begin
Include(FRulez, R_BERSERK);
if not (R_BERSERK in FRulez) then
begin
Include(FRulez, R_BERSERK);
- (*
- if allowBerserkSwitching then
+ if (FBFGFireCounter = -1) then
begin
FCurrWeap := WEAPON_KASTET;
resetWeaponQueue();
FModel.SetWeapon(WEAPON_KASTET);
begin
FCurrWeap := WEAPON_KASTET;
resetWeaponQueue();
FModel.SetWeapon(WEAPON_KASTET);
- end; *)
- if ( (g_Game_IsNet = False) or (NetMode = NET_SERVER) ) and ( ( (Self = gPlayer1) and (gPlayer1Settings.WeaponSwitch <> 0) ) or ( (gPlayer2 <> nil) and (Self = gPlayer2) and (gPlayer2Settings.WeaponSwitch <> 0) )) then
- begin
- if (Self = gPlayer1) then
- begin
- if (gPlayer1Settings.WeaponSwitch = 1) or ( (gPlayer1Settings.WeaponSwitch = 2) and (gPlayer1Settings.WeaponPreferences[WP_LAST+1] > gPlayer1Settings.WeaponPreferences[FCurrWeap]) ) then
- begin
- FCurrWeap := WEAPON_KASTET;
- resetWeaponQueue();
- FModel.SetWeapon(WEAPON_KASTET);
- end;
- end
- else
- begin
- if (gPlayer2Settings.WeaponSwitch = 1) or ( (gPlayer2Settings.WeaponSwitch = 2) and (gPlayer2Settings.WeaponPreferences[WP_LAST+1] > gPlayer2Settings.WeaponPreferences[FCurrWeap]) ) then
- begin
- FCurrWeap := WEAPON_KASTET;
- resetWeaponQueue();
- FModel.SetWeapon(WEAPON_KASTET);
- end;
- end;
end;
if gFlash <> 0 then
begin
end;
if gFlash <> 0 then
begin
if gFlash = 2 then Inc(FPickup, 5);
end;
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
end;
- if ( (g_Game_IsNet = False) or (NetMode = NET_SERVER) ) and ( ( (Self = gPlayer1) and (gPlayer1Settings.WeaponSwitch <> 0) ) or ( (gPlayer2 <> nil) and (Self = gPlayer2) and (gPlayer2Settings.WeaponSwitch <> 0) )) then
- begin
- if (hadWeapon = False) then
- begin
- if (Self = gPlayer1) and ( (gPlayer1Settings.WeaponSwitch = 1) or ( (gPlayer1Settings.WeaponSwitch = 2)
- and (gPlayer1Settings.WeaponPreferences[switchWeapon] > gPlayer1Settings.WeaponPreferences[FCurrWeap]) ) ) then
- begin
- FCurrWeap := switchWeapon;
- resetWeaponQueue();
- FModel.SetWeapon(switchWeapon);
- end
- else if (Self = gPlayer2) and ( (gPlayer2Settings.WeaponSwitch = 1) or ( (gPlayer2Settings.WeaponSwitch = 2)
- and (gPlayer2Settings.WeaponPreferences[switchWeapon] > gPlayer2Settings.WeaponPreferences[FCurrWeap]) ) ) then
- begin
- FCurrWeap := switchWeapon;
- resetWeaponQueue();
- FModel.SetWeapon(switchWeapon);
- end;
- end;
- end;
+
+ if (shouldSwitch(switchWeapon, hadWeapon)) then
+ QueueWeaponSwitch(switchWeapon);
end;
procedure TPlayer.Touch();
end;
procedure TPlayer.Touch();
else if (FAir mod 31 = 0) and not blockmon then
begin
g_GFX_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2), FObj.Y+PLAYER_RECT.Y-4, 5+Random(6), 8, 4);
else if (FAir mod 31 = 0) and not blockmon then
begin
g_GFX_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2), FObj.Y+PLAYER_RECT.Y-4, 5+Random(6), 8, 4);
- if Random(2) = 0 then
- g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
- else
- g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y);
+ if Random(2) = 0
+ then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
+ else g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y);
end;
end else if FAir < AIR_DEF then
FAir := AIR_DEF;
end;
end else if FAir < AIR_DEF then
FAir := AIR_DEF;
procedure TPlayer.NetFire(Wpn: Byte; X, Y, AX, AY: Integer; WID: Integer = -1);
var
locObj: TObj;
procedure TPlayer.NetFire(Wpn: Byte; X, Y, AX, AY: Integer; WID: Integer = -1);
var
locObj: TObj;
- F: Boolean;
+ visible: Boolean = True;
WX, WY, XD, YD: Integer;
begin
WX, WY, XD, YD: Integer;
begin
- F := False;
WX := X;
WY := Y;
XD := AX;
WX := X;
WY := Y;
XD := AX;
case FCurrWeap of
WEAPON_KASTET:
begin
case FCurrWeap of
WEAPON_KASTET:
begin
+ visible := False;
DoPunch();
if R_BERSERK in FRulez then
begin
DoPunch();
if R_BERSERK in FRulez then
begin
FSawSoundSelect.Stop();
FSawSound.PlayAt(FObj.X, FObj.Y);
end;
FSawSoundSelect.Stop();
FSawSound.PlayAt(FObj.X, FObj.Y);
end;
- f := True;
end;
WEAPON_PISTOL:
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIREPISTOL', GameX, Gamey);
FFireAngle := FAngle;
end;
WEAPON_PISTOL:
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIREPISTOL', GameX, Gamey);
FFireAngle := FAngle;
- f := True;
g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX,
GameVelX, GameVelY-2, SHELL_BULLET);
end;
g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX,
GameVelX, GameVelY-2, SHELL_BULLET);
end;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', Gamex, Gamey);
FFireAngle := FAngle;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', Gamex, Gamey);
FFireAngle := FAngle;
- f := True;
FShellTimer := 10;
FShellType := SHELL_SHELL;
end;
FShellTimer := 10;
FShellType := SHELL_SHELL;
end;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN2', Gamex, Gamey);
FFireAngle := FAngle;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN2', Gamex, Gamey);
FFireAngle := FAngle;
- f := True;
FShellTimer := 13;
FShellType := SHELL_DBLSHELL;
end;
FShellTimer := 13;
FShellType := SHELL_DBLSHELL;
end;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', Gamex, Gamey);
FFireAngle := FAngle;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', Gamex, Gamey);
FFireAngle := FAngle;
- f := True;
g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX,
GameVelX, GameVelY-2, SHELL_BULLET);
end;
g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX,
GameVelX, GameVelY-2, SHELL_BULLET);
end;
begin
g_Weapon_Rocket(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
begin
g_Weapon_Rocket(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
- f := True;
end;
WEAPON_PLASMA:
begin
g_Weapon_Plasma(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
end;
WEAPON_PLASMA:
begin
g_Weapon_Plasma(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
- f := True;
end;
WEAPON_BFG:
begin
g_Weapon_BFGShot(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
end;
WEAPON_BFG:
begin
g_Weapon_BFGShot(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
- f := True;
end;
WEAPON_SUPERPULEMET:
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', Gamex, Gamey);
FFireAngle := FAngle;
end;
WEAPON_SUPERPULEMET:
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', Gamex, Gamey);
FFireAngle := FAngle;
- f := True;
g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX,
GameVelX, GameVelY-2, SHELL_SHELL);
end;
g_Player_CreateShell(GameX+PLAYER_RECT_CX, GameY+PLAYER_RECT_CX,
GameVelX, GameVelY-2, SHELL_SHELL);
end;
g_Weapon_flame(wx, wy, xd, yd, FUID, WID);
FlamerOn;
FFireAngle := FAngle;
g_Weapon_flame(wx, wy, xd, yd, FUID, WID);
FlamerOn;
FFireAngle := FAngle;
- f := True;
end;
end;
end;
end;
- if not f then Exit;
+ if not visible then Exit;
if (FAngle = 0) or (FAngle = 180) then SetAction(A_ATTACK)
else if (FAngle = ANGLE_LEFTDOWN) or (FAngle = ANGLE_RIGHTDOWN) then SetAction(A_ATTACKDOWN)
if (FAngle = 0) or (FAngle = 180) then SetAction(A_ATTACK)
else if (FAngle = ANGLE_LEFTDOWN) or (FAngle = ANGLE_RIGHTDOWN) then SetAction(A_ATTACKDOWN)
if not sound_cap_flag[a].IsPlaying() then
sound_cap_flag[a].Play();
if not sound_cap_flag[a].IsPlaying() then
sound_cap_flag[a].Play();
- gTeamStat[FTeam].Goals := gTeamStat[FTeam].Goals + 1;
+ gTeamStat[FTeam].Score += 1;
Result := True;
if g_Game_IsNet then
Result := True;
if g_Game_IsNet then
begin
g_GFX_Bubbles(Obj.X+Obj.Rect.X+(Obj.Rect.Width div 2)+Random(3)-1,
Obj.Y+Obj.Rect.Height+8, 1, 8, 4);
begin
g_GFX_Bubbles(Obj.X+Obj.Rect.X+(Obj.Rect.Width div 2)+Random(3)-1,
Obj.Y+Obj.Rect.Height+8, 1, 8, 4);
- if Random(2) = 0 then
- g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
- else
- g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y);
+ if Random(2) = 0
+ then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
+ else g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y);
Exit;
end;
Exit;
end;
begin
begin
- conRegVar('cheat_berserk_autoswitch', @gBerserkAutoswitch, 'autoswitch to fist when berserk pack taken', '', true, true);
conRegVar('player_indicator', @gPlayerIndicator, 'Draw indicator only for current player, also for teammates, or not at all', 'Draw indicator only for current player, also for teammates, or not at all');
conRegVar('player_indicator_style', @gPlayerIndicatorStyle, 'Visual appearance of indicator', 'Visual appearance of indicator');
end.
conRegVar('player_indicator', @gPlayerIndicator, 'Draw indicator only for current player, also for teammates, or not at all', 'Draw indicator only for current player, also for teammates, or not at all');
conRegVar('player_indicator_style', @gPlayerIndicatorStyle, 'Visual appearance of indicator', 'Visual appearance of indicator');
end.