diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index d9dd8871a953815a003809dbeacb6d231539f1e7..fe38642843d48311e9169bb13b93973c9fcfa0b5 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;
- WaitRecall: Boolean;
+ Used: Boolean;
end;
TKeyState = record
FFirePainTime: Integer;
FFireAttacker: Word;
- FSavedState: TPlayerSavedState;
+ FSavedStateNum: Integer;
FModel: TPlayerModel;
FPunchAnim: TAnimation;
CurrentShell: Integer = 0;
BotNames: Array of String;
BotList: Array of TBotProfile;
+ SavedStates: Array of TPlayerSavedState;
function Lerp(X, Y, Factor: Integer): Integer;
end;
config.Free();
+ SetLength(SavedStates, 0);
end;
procedure g_Player_Free();
gPlayer1 := nil;
gPlayer2 := nil;
+ SetLength(SavedStates, 0);
end;
procedure g_Player_UpdateAll();
FClientID := -1;
FPing := 0;
FLoss := 0;
- FSavedState.WaitRecall := False;
+ FSavedStateNum := -1;
FShellTimer := -1;
FFireTime := 0;
FFirePainTime := 0;
e_CharFont_PrintEx(gMenuSmallFont, X-16-tw, Y+32, s, _RGB(255, 0, 0));
end;
- if gLMSRespawn = LMS_RESPAWN_WARMUP then
+ if gLMSRespawn > LMS_RESPAWN_NONE then
begin
s := _lc[I_GAME_WARMUP];
e_CharFont_GetSize(gMenuFont, s, tw, th);
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;
+ 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];
+
+ if FSavedStateNum < 0 then
+ begin
+ 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;
+ end;
- for i := 0 to 3 do
- FSavedState.Ammo[i] := FAmmo[i];
- for i := 0 to 3 do
- FSavedState.MaxAmmo[i] := FMaxAmmo[i];
- FSavedState.Rulez := FRulez;
- FSavedState.WaitRecall := True;
+ SavedState.Used := True;
+ SavedStates[i] := SavedState;
end;
procedure TPlayer.RecallState();
var
i: Integer;
+ SavedState: TPlayerSavedState;
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);