diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index 1945f94f26be4d2c1a69de7416209db816648a5f..22813f1dfac378f0f37af6fa05e0c3e7c9faaa1c 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
Name: String;
Team: Byte;
Frags: SmallInt;
+ Assists: SmallInt;
Deaths: SmallInt;
Lives: Byte;
Kills: Word;
FKills: Integer;
FMonsterKills: Integer;
FFrags: Integer;
+ FAssists: Integer;
FFragCombo: Byte;
FLastFrag: LongWord;
FComboEvnt: Integer;
property Air: Integer read FAir write FAir;
property JetFuel: Integer read FJetFuel write FJetFuel;
property Frags: Integer read FFrags write FFrags;
+ property Assists: Integer read FAssists write FAssists;
property Death: Integer read FDeath write FDeath;
property Kills: Integer read FKills write FKills;
property CurrWeap: Byte read FCurrWeap write FCurrWeap;
property eAir: Integer read FAir write FAir;
property eJetFuel: Integer read FJetFuel write FJetFuel;
property eFrags: Integer read FFrags write FFrags;
+ property eAssists: Integer read FAssists write FAssists;
property eDeath: Integer read FDeath write FDeath;
property eKills: Integer read FKills write FKills;
property eCurrWeap: Byte read FCurrWeap write FCurrWeap;
TTeamStat = Array [TEAM_RED..TEAM_BLUE] of
record
- Goals: SmallInt;
+ Score: SmallInt;
end;
var
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;
function g_Player_Get(UID: Word): TPlayer;
function g_Player_GetCount(): Byte;
function g_Player_GetStats(): TPlayerStatArray;
-function g_Player_ValidName(Name: String): Boolean;
+function g_Player_ExistingName(Name: String): Boolean;
function g_Player_CreateCorpse(Player: TPlayer): Integer;
procedure g_Player_CreateGibs(fX, fY: Integer; ModelName: String; fColor: TRGB);
procedure g_Player_CreateShell(fX, fY, dX, dY: Integer; T: Byte);
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
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;
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;
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
// 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; // ???
begin
if not g_Game_IsServer then Exit;
+// Íå äîáàâëÿåì áîòîâ åñëè ëèìèò óæå äîñòèãíóò
+ if (g_Bot_GetCount() >= gMaxBots) then Exit;
+
// Ñïèñîê íàçâàíèé ìîäåëåé:
m := g_PlayerModel_GetNames();
if m = nil then
_name := '';
if BotNames <> nil then
for a := 0 to High(BotNames) do
- if g_Player_ValidName(BotNames[a]) then
+ if g_Player_ExistingName(BotNames[a]) then
begin
_name := BotNames[a];
Break;
begin
if not g_Game_IsServer then Exit;
+// Íå äîáàâëÿåì áîòîâ åñëè ëèìèò óæå äîñòèãíóò
+ if (g_Bot_GetCount() >= gMaxBots) then Exit;
+
// Ñïèñîê íàçâàíèé ìîäåëåé:
m := g_PlayerModel_GetNames();
if m = nil then
Team := BotList[num].team; // CTF / TDM
// Âûáèðàåì íàñòðîéêè áîòà èç ñïèñêà ïî íîìåðó èëè èìåíè:
- lName := AnsiLowerCase(lName);
- if (num < 0) or (num > Length(BotList)-1) then
- num := -1;
- if (num = -1) and (lName <> '') and (BotList <> nil) then
- for a := 0 to High(BotList) do
- if AnsiLowerCase(BotList[a].name) = lName then
- begin
- num := a;
- Break;
- end;
- if num = -1 then
- Exit;
+ if lName = '' then
+ num := Random(Length(BotList))
+ else
+ begin
+ if (num < 0) or (num > Length(BotList)-1) then
+ num := -1;
+ if (num = -1) and (BotList <> nil) then
+ lName := AnsiLowerCase(lName);
+ for a := 0 to High(BotList) do
+ if AnsiLowerCase(BotList[a].name) = lName then
+ begin
+ num := a;
+ Break;
+ end;
+ if num = -1 then
+ Exit;
+ end;
// Èìÿ áîòà:
_name := BotList[num].name;
-// Çàíÿòî - âûáèðàåì ñëó÷àéíîå:
- if not g_Player_ValidName(_name) then
- repeat
- _name := Format('DFBOT%.2d', [Random(100)]);
- until g_Player_ValidName(_name);
+ if (_name = '') and (BotNames <> nil) then
+ for a := 0 to High(BotNames) do
+ if g_Player_ExistingName(BotNames[a]) then
+ begin
+ _name := BotNames[a];
+ Break;
+ end;
// Ìîäåëü:
_model := BotList[num].model;
// Ñîçäàåì áîòà:
with g_Player_Get(g_Player_Create(_model, BotList[num].color, Team, True)) as TBot do
begin
- Name := _name;
+ // Åñëè èìåíè íåò, äåëàåì åãî èç UID áîòà
+ if _name = ''
+ then Name := Format('DFBOT%.5d', [UID])
+ else Name := _name;
FDifficult.DiagFire := BotList[num].diag_fire;
FDifficult.InvisFire := BotList[num].invis_fire;
path: AnsiString;
begin
BotNames := nil;
+ BotList := nil;
path := BOTNAMES_FILENAME;
- if e_FindResource(DataDirs, path) = false then
- Exit;
-
-// ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà:
- AssignFile(F, path);
- Reset(F);
-
- while not EOF(F) do
+ if e_FindResource(DataDirs, path) then
begin
- ReadLn(F, s);
+ // ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà:
+ AssignFile(F, path);
+ Reset(F);
- s := Trim(s);
- if s = '' then
- Continue;
+ while not EOF(F) do
+ begin
+ ReadLn(F, s);
- SetLength(BotNames, Length(BotNames)+1);
- BotNames[High(BotNames)] := s;
- end;
+ s := Trim(s);
+ if s = '' then
+ Continue;
- CloseFile(F);
+ SetLength(BotNames, Length(BotNames)+1);
+ BotNames[High(BotNames)] := s;
+ end;
-// Ïåðåìåøèâàåì èõ:
- g_Bot_MixNames();
+ CloseFile(F);
-// ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ:
- config := TConfig.CreateFile(path);
- BotList := nil;
- a := 0;
+ // Ïåðåìåøèâàåì èõ:
+ g_Bot_MixNames();
+ end;
- while config.SectionExists(IntToStr(a)) do
+ path := BOTLIST_FILENAME;
+ if e_FindResource(DataDirs, path) then
begin
- SetLength(BotList, Length(BotList)+1);
+ // ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ:
+ config := TConfig.CreateFile(path);
+ a := 0;
- with BotList[High(BotList)] do
+ while config.SectionExists(IntToStr(a)) do
begin
- // Èìÿ áîòà:
- name := config.ReadStr(IntToStr(a), 'name', '');
- // Ìîäåëü:
- model := config.ReadStr(IntToStr(a), 'model', '');
- // Êîìàíäà:
- if config.ReadStr(IntToStr(a), 'team', 'red') = 'red' then
- team := TEAM_RED
- else
- team := TEAM_BLUE;
- // Öâåò ìîäåëè:
- sa := parse(config.ReadStr(IntToStr(a), 'color', ''));
- color.R := StrToIntDef(sa[0], 0);
- color.G := StrToIntDef(sa[1], 0);
- color.B := StrToIntDef(sa[2], 0);
- // Âåðîÿòíîñòü ñòðåëüáû ïîä óãëîì:
- diag_fire := config.ReadInt(IntToStr(a), 'diag_fire', 0);
- // Âåðîÿòíîñòü îòâåòíîãî îãíÿ ïî íåâèäèìîìó ñîïåðíèêó:
- invis_fire := config.ReadInt(IntToStr(a), 'invis_fire', 0);
- // Òî÷íîñòü ñòðåëüáû ïîä óãëîì:
- diag_precision := config.ReadInt(IntToStr(a), 'diag_precision', 0);
- // Òî÷íîñòü ñòðåëüáû â ïîëåòå:
- fly_precision := config.ReadInt(IntToStr(a), 'fly_precision', 0);
- // Òî÷íîñòü óêëîíåíèÿ îò ñíàðÿäîâ:
- cover := config.ReadInt(IntToStr(a), 'cover', 0);
- // Âåðîÿòíîñòü ïðûæêà ïðè ïðèáëèæåíèè ñîïåðíèêà:
- close_jump := config.ReadInt(IntToStr(a), 'close_jump', 0);
- // Ïðèîðèòåòû îðóæèÿ äëÿ äàëüíåãî áîÿ:
- sa := parse(config.ReadStr(IntToStr(a), 'w_prior1', ''));
- if Length(sa) = 10 then
- for b := 0 to 9 do
- w_prior1[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
- // Ïðèîðèòåòû îðóæèÿ äëÿ áëèæíåãî áîÿ:
- sa := parse(config.ReadStr(IntToStr(a), 'w_prior2', ''));
- if Length(sa) = 10 then
- for b := 0 to 9 do
- w_prior2[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
-
- {sa := parse(config.ReadStr(IntToStr(a), 'w_prior3', ''));
- if Length(sa) = 10 then
- for b := 0 to 9 do
- w_prior3[b] := EnsureRange(StrToInt(sa[b]), 0, 9);}
+ SetLength(BotList, Length(BotList)+1);
+
+ with BotList[High(BotList)] do
+ begin
+ name := config.ReadStr(IntToStr(a), 'name', ''); // Èìÿ áîòà
+ model := config.ReadStr(IntToStr(a), 'model', ''); // Ìîäåëü
+
+ // Êîìàíäà
+ s := config.ReadStr(IntToStr(a), 'team', '');
+ if s = 'red' then
+ team := TEAM_RED
+ else if s = 'blue' then
+ team := TEAM_BLUE
+ else
+ team := TEAM_NONE;
+
+ // Öâåò ìîäåëè
+ sa := parse(config.ReadStr(IntToStr(a), 'color', ''));
+ SetLength(sa, 3);
+ color.R := StrToIntDef(sa[0], 0);
+ color.G := StrToIntDef(sa[1], 0);
+ color.B := StrToIntDef(sa[2], 0);
+
+ diag_fire := config.ReadInt(IntToStr(a), 'diag_fire', 0); // Âåðîÿòíîñòü ñòðåëüáû ïîä óãëîì
+ invis_fire := config.ReadInt(IntToStr(a), 'invis_fire', 0); // Âåðîÿòíîñòü îòâåòíîãî îãíÿ ïî íåâèäèìîìó ñîïåðíèêó
+ diag_precision := config.ReadInt(IntToStr(a), 'diag_precision', 0); // Òî÷íîñòü ñòðåëüáû ïîä óãëîì
+ fly_precision := config.ReadInt(IntToStr(a), 'fly_precision', 0); // Òî÷íîñòü ñòðåëüáû â ïîëåòå
+ cover := config.ReadInt(IntToStr(a), 'cover', 0); // Òî÷íîñòü óêëîíåíèÿ îò ñíàðÿäîâ
+ close_jump := config.ReadInt(IntToStr(a), 'close_jump', 0); // Âåðîÿòíîñòü ïðûæêà ïðè ïðèáëèæåíèè ñîïåðíèêà
+
+ // Ïðèîðèòåòû îðóæèÿ äëÿ äàëüíåãî áîÿ
+ sa := parse(config.ReadStr(IntToStr(a), 'w_prior1', ''));
+ if Length(sa) = 10 then
+ for b := 0 to 9 do
+ w_prior1[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
+
+ // Ïðèîðèòåòû îðóæèÿ äëÿ áëèæíåãî áîÿ
+ sa := parse(config.ReadStr(IntToStr(a), 'w_prior2', ''));
+ if Length(sa) = 10 then
+ for b := 0 to 9 do
+ w_prior2[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
+
+ {sa := parse(config.ReadStr(IntToStr(a), 'w_prior3', ''));
+ if Length(sa) = 10 then
+ for b := 0 to 9 do
+ w_prior3[b] := EnsureRange(StrToInt(sa[b]), 0, 9);}
+ end;
+
+ a += 1;
end;
- a := a + 1;
+ config.Free();
end;
- config.Free();
SetLength(SavedStates, 0);
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;
Name := gPlayers[a].FName;
Team := gPlayers[a].FTeam;
Frags := gPlayers[a].FFrags;
+ Assists := gPlayers[a].FAssists;
Deaths := gPlayers[a].FDeath;
Kills := gPlayers[a].FKills;
Color := gPlayers[a].FModel.Color;
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
begin
testedWeap := FCurrWeap;
for i := WP_FIRST to WP_LAST do
- if FWeapon[i] and (FWeapPreferences[i] > FWeapPreferences[testedWeap]) then
+ 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;
end;
if t = HIT_WATER then
- 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_Game_Effect_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
+ FObj.Y+PLAYER_RECT.Y-4, value div 2, 8, 4);
end;
// Áóôåð óðîíà:
X, Y, SY, a, p, m: Integer;
tw, th: Word;
cw, ch: Byte;
- s: string;
+ s, t: string;
stat: TPlayerStatArray;
begin
X := gPlayerScreenSize.X;
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
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_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;
if gShowStat then
begin
s := IntToStr(Frags);
+ t := IntToStr(Assists);
e_CharFont_GetSize(gMenuFont, s, tw, th);
e_CharFont_PrintEx(gMenuFont, X-16-tw, Y, s, _RGB(255, 0, 0));
s := '';
+ t := '';
p := 1;
m := 0;
stat := g_Player_GetStats();
end;
end;
+ // FRAGS
s := IntToStr(p)+' / '+IntToStr(Length(stat))+' ';
if Frags >= m then s := s+'+' else s := s+'-';
s := s+IntToStr(Abs(Frags-m));
+ // ASSISTS
+ t := IntToStr(p)+' / '+IntToStr(Length(stat))+' ';
+ if Assists >= m then t := t+'+' else t := t+'-';
+ t := t+IntToStr(Abs(Assists-m));
+
e_CharFont_GetSize(gMenuSmallFont, s, tw, th);
e_CharFont_PrintEx(gMenuSmallFont, X-16-tw, Y+32, s, _RGB(255, 0, 0));
end;
if Srv then
begin
if gGameSettings.GameMode = GM_TDM then
- Dec(gTeamStat[FTeam].Goals);
+ Dec(gTeamStat[FTeam].Score);
if DoFrags or (gGameSettings.GameMode = GM_TDM) then
begin
Dec(FFrags);
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);
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
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
FNextWeapDelay := 0;
end;
+
+// Assists block
+{procedure TPlayer.Assist(KillType: Byte; SpawnerUID: Word);
+var
+ DoAssists: Boolean;
+ AP: TPlayer;
+
+ procedure Accumulate(FDamage: Byte;);
+ begin
+
+ end;
+
+
+begin
+ DoAssists := (gGameSettings.GameMode = GM_TDM) or (gGameSettings.GameMode = GM_CTF);
+ if DoAssists then
+ begin
+ if (FAccumulatedDamage >= 65) then
+ begin
+ Inc(AP.FAssists);
+ end;
+ end;
+end;}
+
+
function TPlayer.hasAmmoForWeapon (weapon: Byte): Boolean;
begin
result := false;
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;
switchWeapon: Byte = 255;
if not (R_BERSERK in FRulez) then
begin
Include(FRulez, R_BERSERK);
- if (shouldSwitch(WP_LAST + 1, false)) then
- QueueWeaponSwitch(WEAPON_KASTET);
+ if (FBFGFireCounter = -1) then
+ begin
+ FCurrWeap := WEAPON_KASTET;
+ resetWeaponQueue();
+ FModel.SetWeapon(WEAPON_KASTET);
+ end;
if gFlash <> 0 then
begin
Inc(FPain, 100);
FNoTarget := False;
FNoReload := False;
FFrags := 0;
+ FAssists := 0;
FLastFrag := 0;
FComboEvnt := -1;
FKills := 0;
FAir := 0;
end
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);
- end;
+ g_Game_Effect_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
+ FObj.Y+PLAYER_RECT.Y-4, 5+Random(6), 8, 4);
end else if FAir < AIR_DEF then
FAir := AIR_DEF;
(y >= 0) and (y <= PLAYER_RECT.Height);
end;
-function g_Player_ValidName(Name: string): Boolean;
+function g_Player_ExistingName(Name: string): Boolean;
var
a: Integer;
begin
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
- F := False;
WX := X;
WY := Y;
XD := AX;
case FCurrWeap of
WEAPON_KASTET:
begin
+ visible := False;
DoPunch();
if R_BERSERK in FRulez then
begin
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;
- f := True;
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;
- f := True;
FShellTimer := 10;
FShellType := SHELL_SHELL;
end;
begin
g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN2', Gamex, Gamey);
FFireAngle := FAngle;
- f := True;
FShellTimer := 13;
FShellType := SHELL_DBLSHELL;
end;
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;
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;
- f := True;
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;
- f := True;
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;
- f := True;
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 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
utils.writeInt(st, LongInt(FMonsterKills));
// Ôðàãîâ
utils.writeInt(st, LongInt(FFrags));
+ // Àññèñòîâ
+ utils.writeInt(st, LongInt(FAssists));
// Ôðàãîâ ïîäðÿä
utils.writeInt(st, Byte(FFragCombo));
// Âðåìÿ ïîñëåäíåãî ôðàãà
FMonsterKills := utils.readLongInt(st);
// Ôðàãîâ
FFrags := utils.readLongInt(st);
+ // Àññèñòîâ
+ FAssists := utils.readLongInt(st);
// Ôðàãîâ ïîäðÿä
FFragCombo := utils.readByte(st);
// Âðåìÿ ïîñëåäíåãî ôðàãà
if BodyInLiquid(0, 0) 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);
- 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);
+ g_Game_Effect_Bubbles(Obj.X+Obj.Rect.X+(Obj.Rect.Width div 2)+Random(3)-1,
+ Obj.Y+Obj.Rect.Height+8, 1, 8, 4);
Exit;
end;
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.