diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index 2ec93df11d2f99501fa7ce1176c5076105436ad7..49cd657bb73ba05a37606ec76588e011be622590 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
MaxAmmo: Array [A_BULLETS..A_HIGH] of Word;
Weapon: Array [WP_FIRST..WP_LAST] of Boolean;
Rulez: Set of R_ITEM_BACKPACK..R_BERSERK;
MaxAmmo: Array [A_BULLETS..A_HIGH] of Word;
Weapon: Array [WP_FIRST..WP_LAST] of Boolean;
Rulez: Set of R_ITEM_BACKPACK..R_BERSERK;
- WaitRecall: Boolean;
+ Used: Boolean;
end;
TKeyState = record
end;
TKeyState = record
FFirePainTime: Integer;
FFireAttacker: Word;
FFirePainTime: Integer;
FFireAttacker: Word;
- FSavedState: TPlayerSavedState;
+ FSavedStateNum: Integer;
FModel: TPlayerModel;
FPunchAnim: TAnimation;
FModel: TPlayerModel;
FPunchAnim: TAnimation;
gPlayerIndicator: Integer = 1;
gPlayerIndicatorStyle: Integer = 0;
gNumBots: Word = 0;
gPlayerIndicator: Integer = 1;
gPlayerIndicatorStyle: Integer = 0;
gNumBots: Word = 0;
- gLMSPID1: Word = 0;
- gLMSPID2: Word = 0;
+ gSpectLatchPID1: Word = 0;
+ gSpectLatchPID2: Word = 0;
MAX_RUNVEL: Integer = 8;
VEL_JUMP: Integer = 10;
SHELL_TIMEOUT: Cardinal = 60000;
MAX_RUNVEL: Integer = 8;
VEL_JUMP: Integer = 10;
SHELL_TIMEOUT: Cardinal = 60000;
CurrentShell: Integer = 0;
BotNames: Array of String;
BotList: Array of TBotProfile;
CurrentShell: Integer = 0;
BotNames: Array of String;
BotList: Array of TBotProfile;
+ SavedStates: Array of TPlayerSavedState;
function Lerp(X, Y, Factor: Integer): Integer;
function Lerp(X, Y, Factor: Integer): Integer;
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;
end;
config.Free();
end;
config.Free();
+ SetLength(SavedStates, 0);
end;
procedure g_Player_Free();
end;
procedure g_Player_Free();
gPlayer1 := nil;
gPlayer2 := nil;
gPlayer1 := nil;
gPlayer2 := nil;
+ SetLength(SavedStates, 0);
end;
procedure g_Player_UpdateAll();
end;
procedure g_Player_UpdateAll();
FClientID := -1;
FPing := 0;
FLoss := 0;
FClientID := -1;
FPing := 0;
FLoss := 0;
- FSavedState.WaitRecall := False;
+ FSavedStateNum := -1;
FShellTimer := -1;
FFireTime := 0;
FFirePainTime := 0;
FShellTimer := -1;
FFireTime := 0;
FFirePainTime := 0;
e_CharFont_PrintEx(gMenuSmallFont, X-16-tw, Y+32, s, _RGB(255, 0, 0));
end;
e_CharFont_PrintEx(gMenuSmallFont, X-16-tw, Y+32, s, _RGB(255, 0, 0));
end;
- if gShowLives and (gGameSettings.MaxLives > 0) then
+ if gLMSRespawn > LMS_RESPAWN_NONE then
+ begin
+ s := _lc[I_GAME_WARMUP];
+ e_CharFont_GetSize(gMenuFont, s, tw, th);
+ s := s + ': ' + IntToStr((gLMSRespawnTime - gTime) div 1000);
+ e_CharFont_PrintEx(gMenuFont, X-64-tw, SY-32, s, _RGB(0, 255, 0));
+ end
+ else if gShowLives and (gGameSettings.MaxLives > 0) then
begin
s := IntToStr(Lives);
e_CharFont_GetSize(gMenuFont, s, tw, th);
begin
s := IntToStr(Lives);
e_CharFont_GetSize(gMenuFont, s, tw, th);
if srv and (OldLR = LMS_RESPAWN_NONE) and (gLMSRespawn > LMS_RESPAWN_NONE) then
begin
if NetMode = NET_SERVER then
if srv and (OldLR = LMS_RESPAWN_NONE) and (gLMSRespawn > LMS_RESPAWN_NONE) then
begin
if NetMode = NET_SERVER then
- MH_SEND_GameEvent(NET_EV_LMS_WARMUP, (gLMSRespawnTime - gTime) div 1000)
+ MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime)
else
g_Console_Add(Format(_lc[I_MSG_WARMUP_START], [(gLMSRespawnTime - gTime) div 1000]), True);
end;
else
g_Console_Add(Format(_lc[I_MSG_WARMUP_START], [(gLMSRespawnTime - gTime) div 1000]), True);
end;
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;
FSpectatePlayer := -1;
FSpawned := True;
FSpectatePlayer := -1;
FSpawned := True;
- if (gPlayer1 = nil) and (gLMSPID1 = FUID) then
+ if (gPlayer1 = nil) and (gSpectLatchPID1 = FUID) then
gPlayer1 := self;
gPlayer1 := self;
- if (gPlayer2 = nil) and (gLMSPID2 = FUID) then
+ if (gPlayer2 = nil) and (gSpectLatchPID2 = FUID) then
gPlayer2 := self;
if g_Game_IsNet then
gPlayer2 := self;
if g_Game_IsNet then
begin
if Self = gPlayer1 then
begin
begin
if Self = gPlayer1 then
begin
- gLMSPID1 := FUID;
+ gSpectLatchPID1 := FUID;
gPlayer1 := nil;
gPlayer1 := nil;
- end;
- if Self = gPlayer2 then
+ end
+ else if Self = gPlayer2 then
begin
begin
- gLMSPID2 := FUID;
+ gSpectLatchPID2 := FUID;
gPlayer2 := nil;
end;
end;
gPlayer2 := nil;
end;
end;
if FDirection = TDirection.D_LEFT then FAngle := ANGLE_LEFTDOWN else FAngle := ANGLE_RIGHTDOWN;
if FDirection = TDirection.D_LEFT then FAngle := ANGLE_LEFTDOWN else FAngle := ANGLE_RIGHTDOWN;
- if FIncCam > -120.0 * g_dbg_scale then DecMin(FIncCam, 5, Integer(-120.0 * g_dbg_scale));
+ if FIncCam > -120 then DecMin(FIncCam, 5, -120);
end;
procedure TPlayer.SeeUp();
end;
procedure TPlayer.SeeUp();
if FDirection = TDirection.D_LEFT then FAngle := ANGLE_LEFTUP else FAngle := ANGLE_RIGHTUP;
if FDirection = TDirection.D_LEFT then FAngle := ANGLE_LEFTUP else FAngle := ANGLE_RIGHTUP;
- if FIncCam < 120.0 * g_dbg_scale then IncMax(FIncCam, 5, Integer(120.0 * g_dbg_scale));
+ if FIncCam < 120 then IncMax(FIncCam, 5, 120);
end;
procedure TPlayer.SetAction(Action: Byte; Force: Boolean = False);
end;
procedure TPlayer.SetAction(Action: Byte; Force: Boolean = False);
procedure TPlayer.RememberState();
var
i: Integer;
procedure TPlayer.RememberState();
var
i: Integer;
-begin
- FSavedState.Health := FHealth;
- FSavedState.Armor := FArmor;
- FSavedState.Air := FAir;
- FSavedState.JetFuel := FJetFuel;
- FSavedState.CurrWeap := FCurrWeap;
- FSavedState.NextWeap := FNextWeap;
- FSavedState.NextWeapDelay := FNextWeapDelay;
-
- for i := 0 to 3 do
- FSavedState.Ammo[i] := FAmmo[i];
- for i := 0 to 3 do
- FSavedState.MaxAmmo[i] := FMaxAmmo[i];
+ SavedState: TPlayerSavedState;
+begin
+ SavedState.Health := FHealth;
+ SavedState.Armor := FArmor;
+ SavedState.Air := FAir;
+ SavedState.JetFuel := FJetFuel;
+ SavedState.CurrWeap := FCurrWeap;
+ SavedState.NextWeap := FNextWeap;
+ SavedState.NextWeapDelay := FNextWeapDelay;
+ for i := Low(FWeapon) to High(FWeapon) do
+ SavedState.Weapon[i] := FWeapon[i];
+ for i := Low(FAmmo) to High(FAmmo) do
+ SavedState.Ammo[i] := FAmmo[i];
+ for i := Low(FMaxAmmo) to High(FMaxAmmo) do
+ SavedState.MaxAmmo[i] := FMaxAmmo[i];
+ SavedState.Rulez := FRulez - [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE];
+
+ FSavedStateNum := -1;
+ for i := Low(SavedStates) to High(SavedStates) do
+ if not SavedStates[i].Used then
+ begin
+ FSavedStateNum := i;
+ break;
+ end;
+ if FSavedStateNum < 0 then
+ begin
+ SetLength(SavedStates, Length(SavedStates) + 1);
+ FSavedStateNum := High(SavedStates);
+ end;
- FSavedState.Rulez := FRulez;
- FSavedState.WaitRecall := True;
+ SavedState.Used := True;
+ SavedStates[FSavedStateNum] := SavedState;
end;
procedure TPlayer.RecallState();
var
i: Integer;
end;
procedure TPlayer.RecallState();
var
i: Integer;
+ SavedState: TPlayerSavedState;
begin
begin
- if not FSavedState.WaitRecall then Exit;
-
- FHealth := FSavedState.Health;
- FArmor := FSavedState.Armor;
- FAir := FSavedState.Air;
- FJetFuel := FSavedState.JetFuel;
- FCurrWeap := FSavedState.CurrWeap;
- FNextWeap := FSavedState.NextWeap;
- FNextWeapDelay := FSavedState.NextWeapDelay;
-
- for i := 0 to 3 do
- FAmmo[i] := FSavedState.Ammo[i];
- for i := 0 to 3 do
- FMaxAmmo[i] := FSavedState.MaxAmmo[i];
+ if(FSavedStateNum < 0) or (FSavedStateNum > High(SavedStates)) then
+ Exit;
- FRulez := FSavedState.Rulez;
- FSavedState.WaitRecall := False;
+ SavedState := SavedStates[FSavedStateNum];
+ SavedStates[FSavedStateNum].Used := False;
+ FSavedStateNum := -1;
+
+ FHealth := SavedState.Health;
+ FArmor := SavedState.Armor;
+ FAir := SavedState.Air;
+ FJetFuel := SavedState.JetFuel;
+ FCurrWeap := SavedState.CurrWeap;
+ FNextWeap := SavedState.NextWeap;
+ FNextWeapDelay := SavedState.NextWeapDelay;
+ for i := Low(FWeapon) to High(FWeapon) do
+ FWeapon[i] := SavedState.Weapon[i];
+ for i := Low(FAmmo) to High(FAmmo) do
+ FAmmo[i] := SavedState.Ammo[i];
+ for i := Low(FMaxAmmo) to High(FMaxAmmo) do
+ FMaxAmmo[i] := SavedState.MaxAmmo[i];
+ FRulez := SavedState.Rulez;
if gGameSettings.GameType = GT_SERVER then
MH_SEND_PlayerStats(FUID);
if gGameSettings.GameType = GT_SERVER then
MH_SEND_PlayerStats(FUID);
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: