diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index cc6afb07be47661fa320584d0d6ecb2f80f5df1e..94ca02efbd7372227be18b606ad975f94c2f0673 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
FReady: Boolean;
FDummy: Boolean;
FFireTime: Integer;
FReady: Boolean;
FDummy: Boolean;
FFireTime: Integer;
+ FSpawnInvul: Integer;
FHandicap: Integer;
FWaitForFirstSpawn: Boolean; // set to `true` in server, used to spawn a player on first full state request
FHandicap: Integer;
FWaitForFirstSpawn: Boolean; // set to `true` in server, used to spawn a player on first full state request
gTeamStat: TTeamStat;
gFly: Boolean = False;
gAimLine: Boolean = False;
gTeamStat: TTeamStat;
gFly: Boolean = False;
gAimLine: Boolean = False;
- gChatBubble: Byte = 0;
+ gChatBubble: Integer = 0;
gPlayerIndicator: Integer = 1;
gPlayerIndicatorStyle: Integer = 0;
gNumBots: Word = 0;
gPlayerIndicator: Integer = 1;
gPlayerIndicatorStyle: Integer = 0;
gNumBots: Word = 0;
g_holmes,
{$ENDIF}
e_log, g_map, g_items, g_console, g_gfx, Math,
g_holmes,
{$ENDIF}
e_log, g_map, g_items, g_console, g_gfx, Math,
- g_options, g_triggers, g_menu, g_game, g_grid,
+ g_options, g_triggers, g_menu, g_game, g_grid, e_res,
wadreader, g_main, g_monsters, CONFIG, g_language,
g_net, g_netmsg, g_window,
utils, xstreams;
wadreader, g_main, g_monsters, CONFIG, g_language,
g_net, g_netmsg, g_window,
utils, xstreams;
Break;
end;
Break;
end;
-// Èìåíè íåò, çàäàåì ñëó÷àéíîå:
- if _name = '' then
- repeat
- _name := Format('DFBOT%.2d', [Random(100)]);
- until g_Player_ValidName(_name);
-
// Âûáèðàåì ñëó÷àéíóþ ìîäåëü:
_model := m[Random(Length(m))];
// Âûáèðàåì ñëó÷àéíóþ ìîäåëü:
_model := m[Random(Length(m))];
Min(Random(9)*32, 255)),
Team, True)) as TBot do
begin
Min(Random(9)*32, 255)),
Team, True)) as TBot do
begin
- Name := _name;
+ // Åñëè èìåíè íåò, äåëàåì åãî èç UID áîòà
+ if _name = '' then
+ Name := Format('DFBOT%.5d', [UID])
+ else
+ Name := _name;
case Difficult of
1: FDifficult := DIFFICULT_EASY;
case Difficult of
1: FDifficult := DIFFICULT_EASY;
a, b: Integer;
config: TConfig;
sa: SSArray;
a, b: Integer;
config: TConfig;
sa: SSArray;
+ path: AnsiString;
begin
BotNames := nil;
begin
BotNames := nil;
- if not FileExists(DataDir + BOTNAMES_FILENAME) then
+ path := BOTNAMES_FILENAME;
+ if e_FindResource(DataDirs, path) = false then
Exit;
// ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà:
Exit;
// ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà:
- AssignFile(F, DataDir + BOTNAMES_FILENAME);
+ AssignFile(F, path);
Reset(F);
while not EOF(F) do
Reset(F);
while not EOF(F) do
g_Bot_MixNames();
// ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ:
g_Bot_MixNames();
// ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ:
- config := TConfig.CreateFile(DataDir + BOTLIST_FILENAME);
+ config := TConfig.CreateFile(path);
BotList := nil;
a := 0;
BotList := nil;
a := 0;
FMegaRulez[MR_SUIT] := 0;
FMegaRulez[MR_INVUL] := 0;
FMegaRulez[MR_INVIS] := 0;
FMegaRulez[MR_SUIT] := 0;
FMegaRulez[MR_INVUL] := 0;
FMegaRulez[MR_INVIS] := 0;
+ FSpawnInvul := 0;
FBerserk := 0;
end;
FBerserk := 0;
end;
end;
end;
end;
end;
- if (FMegaRulez[MR_INVUL] > gTime) and (gPlayerDrawn <> Self) then
+ if (FMegaRulez[MR_INVUL] > gTime) and ((gPlayerDrawn <> Self) or (FSpawnInvul >= gTime)) then
if g_Texture_Get('TEXTURE_PLAYER_INVULPENTA', ID) then
begin
e_GetTextureSize(ID, @w, @h);
if g_Texture_Get('TEXTURE_PLAYER_INVULPENTA', ID) then
begin
e_GetTextureSize(ID, @w, @h);
dr: Boolean;
begin
// Ïðè âçÿòèè íåóÿçâèìîñòè ðèñóåòñÿ èíâåðñèîííûé áåëûé ôîí
dr: Boolean;
begin
// Ïðè âçÿòèè íåóÿçâèìîñòè ðèñóåòñÿ èíâåðñèîííûé áåëûé ôîí
- if FMegaRulez[MR_INVUL] >= gTime then
+ if (FMegaRulez[MR_INVUL] >= gTime) and (FSpawnInvul < gTime) then
begin
if (FMegaRulez[MR_INVUL]-gTime) <= 2100 then
dr := not Odd((FMegaRulez[MR_INVUL]-gTime) div 300)
begin
if (FMegaRulez[MR_INVUL]-gTime) <= 2100 then
dr := not Odd((FMegaRulez[MR_INVUL]-gTime) div 300)
PushItem(ITEM_JETPACK);
// Âûáðîñ êëþ÷åé:
PushItem(ITEM_JETPACK);
// Âûáðîñ êëþ÷åé:
- if not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) then
+ if (not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF])) or
+ (not LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS)) then
begin
if R_KEY_RED in FRulez then
PushItem(ITEM_KEY_RED);
begin
if R_KEY_RED in FRulez then
PushItem(ITEM_KEY_RED);
result := false;
case weapon of
WEAPON_KASTET, WEAPON_SAW: result := true;
result := false;
case weapon of
WEAPON_KASTET, WEAPON_SAW: result := true;
- WEAPON_SHOTGUN1, WEAPON_SHOTGUN2: result := (FAmmo[A_SHELLS] > 0);
- WEAPON_PISTOL, WEAPON_CHAINGUN, WEAPON_SUPERPULEMET: result := (FAmmo[A_BULLETS] > 0);
+ WEAPON_SHOTGUN1, WEAPON_SHOTGUN2, WEAPON_SUPERPULEMET: result := (FAmmo[A_SHELLS] > 0);
+ WEAPON_PISTOL, WEAPON_CHAINGUN: result := (FAmmo[A_BULLETS] > 0);
WEAPON_ROCKETLAUNCHER: result := (FAmmo[A_ROCKETS] > 0);
WEAPON_PLASMA, WEAPON_BFG: result := (FAmmo[A_CELLS] > 0);
WEAPON_FLAMETHROWER: result := (FAmmo[A_FUEL] > 0);
WEAPON_ROCKETLAUNCHER: result := (FAmmo[A_ROCKETS] > 0);
WEAPON_PLASMA, WEAPON_BFG: result := (FAmmo[A_CELLS] > 0);
WEAPON_FLAMETHROWER: result := (FAmmo[A_FUEL] > 0);
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
+ FSpawnInvul := 0;
Result := True;
remove := True;
if gFlash = 2 then Inc(FPickup, 5);
Result := True;
remove := True;
if gFlash = 2 then Inc(FPickup, 5);
FMonsterKills := 0;
FDeath := 0;
FSecrets := 0;
FMonsterKills := 0;
FDeath := 0;
FSecrets := 0;
+ FSpawnInvul := 0;
FReady := False;
if FNoRespawn then
begin
FReady := False;
if FNoRespawn then
begin
FShellTimer := -1;
FPain := 0;
FLastHit := 0;
FShellTimer := -1;
FPain := 0;
FLastHit := 0;
+ FSpawnInvul := 0;
if not g_Game_IsServer then
Exit;
if not g_Game_IsServer then
Exit;
FMaxAmmo[A_CELLS] := AmmoLimits[0, A_CELLS];
FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL];
FMaxAmmo[A_CELLS] := AmmoLimits[0, A_CELLS];
FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL];
- if gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF] then
+ if (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) and
+ LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS) then
FRulez := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]
else
FRulez := [];
FRulez := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]
else
FRulez := [];
for a := Low(FMegaRulez) to High(FMegaRulez) do
FMegaRulez[a] := 0;
for a := Low(FMegaRulez) to High(FMegaRulez) do
FMegaRulez[a] := 0;
+// Respawn invulnerability
+ if (gGameSettings.GameType <> GT_SINGLE) and (gGameSettings.SpawnInvul > 0) then
+ begin
+ FMegaRulez[MR_INVUL] := gTime + gGameSettings.SpawnInvul * 1000;
+ FSpawnInvul := FMegaRulez[MR_INVUL];
+ end;
+
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
+ FSpawnInvul := 0;
end;
ITEM_INVIS:
end;
ITEM_INVIS: