diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index f277a4e8ab74fa5ce9992b49c8af0b215c4e5e27..06ae6e50340317cda52f96b1b34228d50c48f18c 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*)
{$INCLUDE ../shared/a_modes.inc}
+{$M+}
unit g_player;
interface
uses
e_graphics, g_playermodel, g_basic, g_textures,
- g_weapons, g_phys, g_sound, g_saveload, MAPSTRUCT,
- BinEditor, g_panel, z_aabbtree;
+ g_weapons, g_phys, g_sound, g_saveload, MAPDEF,
+ BinEditor, g_panel;
const
KEY_LEFT = 1;
FUID: Word;
FName: String;
FTeam: Byte;
- FLive: Boolean;
+ FAlive: Boolean;
FSpawned: Boolean;
FDirection: TDirection;
FHealth: Integer;
procedure resetWeaponQueue ();
function hasAmmoForWeapon (weapon: Byte): Boolean;
- function getMapAABB (): AABB2D;
-
public
FDamageBuffer: Integer;
FDummy: Boolean;
FFireTime: Integer;
+ // debug: viewport offset
+ viewPortX, viewPortY, viewPortW, viewPortH: Integer;
+
+ function isValidViewPort (): Boolean; inline;
+
constructor Create(); virtual;
destructor Destroy(); override;
procedure Respawn(Silent: Boolean; Force: Boolean = False); virtual;
procedure CatchFire(Attacker: Word);
//WARNING! this does nothing for now, but still call it!
- procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+ procedure positionChanged (); //WARNING! call this after entity position was changed, or coldet will not work right!
+ procedure getMapBox (out x, y, w, h: Integer); inline;
+ procedure moveBy (dx, dy: Integer); inline;
+
+ public
+ property Vel: TPoint2i read FObj.Vel;
+ property Obj: TObj read FObj;
+
+ published
property Name: String read FName write FName;
property Model: TPlayerModel read FModel;
property Health: Integer read FHealth write FHealth;
property GodMode: Boolean read FGodMode write FGodMode;
property NoTarget: Boolean read FNoTarget write FNoTarget;
property NoReload: Boolean read FNoReload write FNoReload;
- property Live: Boolean read FLive write FLive;
+ property alive: Boolean read FAlive write FAlive;
property Flag: Byte read FFlag;
property Team: Byte read FTeam write FTeam;
property Direction: TDirection read FDirection;
property GameVelY: Integer read FObj.Vel.Y write FObj.Vel.Y;
property GameAccelX: Integer read FObj.Accel.X write FObj.Accel.X;
property GameAccelY: Integer read FObj.Accel.Y write FObj.Accel.Y;
- property Vel: TPoint2i read FObj.Vel;
- property Obj: TObj read FObj;
property IncCam: Integer read FIncCam write FIncCam;
property UID: Word read FUID write FUID;
property JustTeleported: Boolean read FJustTeleported write FJustTeleported;
property NetTime: LongWord read FNetTime write FNetTime;
-
- property mapAABB: AABB2D read getMapAABB;
end;
TDifficult = record
procedure LoadState(var Mem: TBinMemoryReader); override;
end;
+ PGib = ^TGib;
TGib = record
- Live: Boolean;
+ alive: Boolean;
ID: DWORD;
MaskID: DWORD;
RAngle: Integer;
Color: TRGB;
Obj: TObj;
- procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+ procedure getMapBox (out x, y, w, h: Integer); inline;
+ procedure moveBy (dx, dy: Integer); inline;
+
+ procedure positionChanged (); inline; //WARNING! call this after entity position was changed, or coldet will not work right!
end;
+ PShell = ^TShell;
TShell = record
SpriteID: DWORD;
- Live: Boolean;
+ alive: Boolean;
SType: Byte;
RAngle: Integer;
Timeout: Cardinal;
CX, CY: Integer;
Obj: TObj;
- procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+ procedure getMapBox (out x, y, w, h: Integer); inline;
+ procedure moveBy (dx, dy: Integer); inline;
+
+ procedure positionChanged (); inline; //WARNING! call this after entity position was changed, or coldet will not work right!
end;
TCorpse = class (TObject)
procedure SaveState(var Mem: TBinMemoryWriter);
procedure LoadState(var Mem: TBinMemoryReader);
- procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+ procedure getMapBox (out x, y, w, h: Integer); inline;
+ procedure moveBy (dx, dy: Integer); inline;
+
+ procedure positionChanged (); inline; //WARNING! call this after entity position was changed, or coldet will not work right!
property Obj: TObj read FObj;
property State: Byte read FState;
uses
e_log, g_map, g_items, g_console, SysUtils, g_gfx, Math,
- g_options, g_triggers, g_menu, MAPDEF, g_game,
- wadreader, g_main, g_monsters, CONFIG, g_language, g_net, g_netmsg;
+ g_options, g_triggers, g_menu, g_game, g_grid,
+ wadreader, g_main, g_monsters, CONFIG, g_language,
+ g_net, g_netmsg, g_window, GL, g_holmes;
type
TBotProfile = record
ANGLE_LEFTUP = 125;
ANGLE_LEFTDOWN = -145;
PLAYER_HEADRECT: TRectWH = (X:24; Y:12; Width:20; Height:12);
- WEAPONPOINT: Array [TDirection] of TPoint = ((X:16; Y:32), (X:47; Y:32));
+ WEAPONPOINT: Array [TDirection] of TDFPoint = ((X:16; Y:32), (X:47; Y:32));
BOT_MAXJUMP = 84;
BOT_LONGDIST = 300;
BOT_UNSAFEDIST = 128;
BotList: Array of TBotProfile;
-procedure TGib.positionChanged (); begin end;
-procedure TShell.positionChanged (); begin end;
-
-
function Lerp(X, Y, Factor: Integer): Integer;
begin
Result := X + ((Y - X) div Factor);
gPlayers[a].FModel.Color := Color;
gPlayers[a].FUID := g_CreateUID(UID_PLAYER);
- gPlayers[a].FLive := False;
+ gPlayers[a].FAlive := False;
Result := gPlayers[a].FUID;
end;
Mem.ReadByte(gPlayers[a].FTeam);
gPlayers[a].FPreferredTeam := gPlayers[a].FTeam;
// Æèâ ëè:
- Mem.ReadBoolean(gPlayers[a].FLive);
+ Mem.ReadBoolean(gPlayers[a].FAlive);
// Èçðàñõîäîâàë ëè âñå æèçíè:
Mem.ReadBoolean(gPlayers[a].FNoRespawn);
// Íàïðàâëåíèå:
i: Integer;
begin
for i := Low(gPlayers) to High(gPlayers) do
- if (gPlayers[i] <> nil) and gPlayers[i].Live then
+ if (gPlayers[i] <> nil) and gPlayers[i].alive then
gPlayers[i].RememberState;
end;
find_id: DWORD;
ok: Boolean;
begin
- if Player.Live then
+ if Player.alive then
Exit;
if Player.FObj.Y >= gMapInfo.Height+128 then
Exit;
Obj.Rect.Height := 3;
end;
SType := T;
- Live := True;
+ alive := True;
Obj.X := fX;
Obj.Y := fY;
g_Obj_Push(@Obj, dX + Random(4)-Random(4), dY-Random(4));
Color := fColor;
ID := GibsArray[a].ID;
MaskID := GibsArray[a].MaskID;
- Live := True;
+ alive := True;
g_Obj_Init(@Obj);
Obj.Rect := GibsArray[a].Rect;
Obj.X := fX-GibsArray[a].Rect.X-(GibsArray[a].Rect.Width div 2);
// Êóñêè ìÿñà:
if gGibs <> nil then
for i := 0 to High(gGibs) do
- if gGibs[i].Live then
+ if gGibs[i].alive then
with gGibs[i] do
begin
vel := Obj.Vel;
if WordBool(mr and MOVE_FALLOUT) then
begin
- Live := False;
+ alive := False;
Continue;
end;
// Ãèëüçû:
if gShells <> nil then
for i := 0 to High(gShells) do
- if gShells[i].Live then
+ if gShells[i].alive then
with gShells[i] do
begin
vel := Obj.Vel;
if WordBool(mr and MOVE_FALLOUT) or (gShells[i].Timeout < gTime) then
begin
- Live := False;
+ alive := False;
Continue;
end;
end;
end;
+
+procedure TGib.getMapBox (out x, y, w, h: Integer); inline;
+begin
+ x := Obj.X+Obj.Rect.X;
+ y := Obj.Y+Obj.Rect.Y;
+ w := Obj.Rect.Width;
+ h := Obj.Rect.Height;
+end;
+
+procedure TGib.moveBy (dx, dy: Integer); inline;
+begin
+ if (dx <> 0) or (dy <> 0) then
+ begin
+ Obj.X += dx;
+ Obj.Y += dy;
+ positionChanged();
+ end;
+end;
+
+
+procedure TShell.getMapBox (out x, y, w, h: Integer); inline;
+begin
+ x := Obj.X;
+ y := Obj.Y;
+ w := Obj.Rect.Width;
+ h := Obj.Rect.Height;
+end;
+
+procedure TShell.moveBy (dx, dy: Integer); inline;
+begin
+ if (dx <> 0) or (dy <> 0) then
+ begin
+ Obj.X += dx;
+ Obj.Y += dy;
+ positionChanged();
+ end;
+end;
+
+
+procedure TGib.positionChanged (); inline; begin end;
+procedure TShell.positionChanged (); inline; begin end;
+
+
procedure g_Player_DrawCorpses();
var
i: Integer;
- a: TPoint;
+ a: TDFPoint;
begin
if gGibs <> nil then
for i := 0 to High(gGibs) do
- if gGibs[i].Live then
+ if gGibs[i].alive then
with gGibs[i] do
begin
if not g_Obj_Collide(sX, sY, sWidth, sHeight, @Obj) then
procedure g_Player_DrawShells();
var
i: Integer;
- a: TPoint;
+ a: TDFPoint;
begin
if gShells <> nil then
for i := 0 to High(gShells) do
- if gShells[i].Live then
+ if gShells[i].alive then
with gShells[i] do
begin
if not g_Obj_Collide(sX, sY, sWidth, sHeight, @Obj) then
{ T P l a y e r : }
+function TPlayer.isValidViewPort (): Boolean; inline; begin result := (viewPortW > 0) and (viewPortH > 0); end;
+
procedure TPlayer.BFGHit();
begin
g_Weapon_BFGHit(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
Exit;
if not (gGameSettings.GameMode in [GM_TDM, GM_CTF]) then Exit;
- if gGameOn and FLive then
+ if gGameOn and FAlive then
Kill(K_SIMPLEKILL, FUID, HIT_SELF);
if FTeam = TEAM_RED then
r: Boolean;
begin
if gItems = nil then Exit;
- if not FLive then Exit;
+ if not FAlive then Exit;
for i := 0 to High(gItems) do
with gItems[i] do
begin
- if (ItemType <> ITEM_NONE) and Live then
+ if (ItemType <> ITEM_NONE) and alive then
if g_Obj_Collide(FObj.X+PLAYER_RECT.X, FObj.Y+PLAYER_RECT.Y, PLAYER_RECT.Width,
PLAYER_RECT.Height, @Obj) then
begin
constructor TPlayer.Create();
begin
+ viewPortX := 0;
+ viewPortY := 0;
+ viewPortW := 0;
+ viewPortH := 0;
+
FIamBot := False;
FDummy := False;
FSpawned := False;
resetWeaponQueue();
end;
-procedure TPlayer.positionChanged ();
+procedure TPlayer.positionChanged (); inline;
begin
end;
@@ -2039,7 +2105,7 @@ procedure TPlayer.Damage(value: Word; SpawnerUID: Word; vx, vy: Integer; t: Byte
var
c: Word;
begin
- if (not g_Game_IsClient) and (not FLive) then
+ if (not g_Game_IsClient) and (not FAlive) then
Exit;
FLastHit := t;
end;
// Áóôåð óðîíà:
- if FLive then
+ if FAlive then
Inc(FDamageBuffer, value);
// Âñïûøêà áîëè:
Result := False;
if g_Game_IsClient then
Exit;
- if not FLive then
+ if not FAlive then
Exit;
if Soft and (FHealth < PLAYER_HP_SOFT) then
w, h: Word;
dr: Boolean;
begin
- if FLive then
+ if FAlive then
begin
if (FMegaRulez[MR_INVUL] > gTime) and (gPlayerDrawn <> Self) then
if g_Texture_Get('TEXTURE_PLAYER_INVULPENTA', ID) then
e_GetTextureSize(ID, @w, @h);
if FDirection = D_LEFT then
e_Draw(ID, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-(w div 2)+4,
- FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7, 0, True, False)
+ FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+FObj.slopeUpLeft, 0, True, False)
else
e_Draw(ID, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-(w div 2)-2,
- FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7, 0, True, False);
+ FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+FObj.slopeUpLeft, 0, True, False);
end;
if FMegaRulez[MR_INVIS] > gTime then
else
dr := True;
if dr then
- FModel.Draw(FObj.X, FObj.Y, 200)
+ FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft, 200)
else
- FModel.Draw(FObj.X, FObj.Y);
+ FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft);
end
else
- FModel.Draw(FObj.X, FObj.Y, 254);
+ FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft, 254);
end
else
- FModel.Draw(FObj.X, FObj.Y);
+ FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft);
end;
if g_debug_Frames then
if (gChatBubble > 0) and (FKeys[KEY_CHAT].Pressed) and not FGhost then
DrawBubble();
// e_DrawPoint(5, 335, 288, 255, 0, 0); // DL, UR, DL, UR
- if gAimLine and Live and
+ if gAimLine and alive and
((Self = gPlayer1) or (Self = gPlayer2)) then
DrawAim();
end;
+
procedure TPlayer.DrawAim();
+ procedure drawCast (sz: Integer; ax0, ay0, ax1, ay1: Integer);
+ var
+ ex, ey: Integer;
+ begin
+ if isValidViewPort and (self = gPlayer1) then
+ begin
+ g_Holmes_plrLaser(ax0, ay0, ax1, ay1);
+ end;
+
+ e_DrawLine(sz, ax0, ay0, ax1, ay1, 255, 0, 0, 96);
+ if (g_Map_traceToNearestWall(ax0, ay0, ax1, ay1, @ex, @ey) <> nil) then
+ begin
+ e_DrawLine(sz, ax0, ay0, ex, ey, 0, 255, 0, 96);
+ end
+ else
+ begin
+ e_DrawLine(sz, ax0, ay0, ex, ey, 0, 0, 255, 96);
+ end;
+ end;
+
var
wx, wy, xx, yy: Integer;
angle: SmallInt;
end;
xx := Trunc(Cos(-DegToRad(angle)) * len) + wx;
yy := Trunc(Sin(-DegToRad(angle)) * len) + wy;
+ {$IF DEFINED(D2F_DEBUG)}
+ drawCast(sz, wx, wy, xx, yy);
+ {$ELSE}
e_DrawLine(sz, wx, wy, xx, yy, 255, 0, 0, 96);
+ {$ENDIF}
end;
procedure TPlayer.DrawGUI();
Srv := g_Game_IsServer;
Netsrv := g_Game_IsServer and g_Game_IsNet;
if Srv then FDeath := FDeath + 1;
- if FLive then
+ if FAlive then
begin
if FGhost then
FGhost := False;
if not FPhysics then
FPhysics := True;
- FLive := False;
+ FAlive := False;
end;
FShellTimer := -1;
if mon = nil then
s := '?'
else
- s := g_Monsters_GetKilledBy(mon.MonsterType);
+ s := g_Mons_GetKilledByTypeId(mon.MonsterType);
case KillType of
K_HARDKILL:
procedure TPlayer.Touch();
begin
- if not FLive then
+ if not FAlive then
Exit;
//FModel.PlaySound(MODELSOUND_PAIN, 1, FObj.X, FObj.Y);
if FIamBot then
procedure TPlayer.Reset(Force: Boolean);
begin
if Force then
- FLive := False;
+ FAlive := False;
FSpawned := False;
FTime[T_RESPAWN] := 0;
if Force then
begin
FTime[T_RESPAWN] := 0;
- FLive := False;
+ FAlive := False;
end;
FNetTime := 0;
// if server changes MaxLives we gotta be ready
SetFlag(FLAG_NONE);
// Âîñêðåøåíèå áåç îðóæèÿ:
- if not FLive then
+ if not FAlive then
begin
FHealth := PLAYER_HP_SOFT;
FArmor := 0;
- FLive := True;
+ FAlive := True;
FAir := AIR_DEF;
FJetFuel := 0;
procedure TPlayer.Spectate(NoMove: Boolean = False);
begin
- if FLive then
+ if FAlive then
Kill(K_EXTRAHARDKILL, FUID, HIT_SOME)
else if (not NoMove) then
begin
FXTo := GameX;
FYTo := GameY;
- FLive := False;
+ FAlive := False;
FSpectator := True;
FGhost := True;
FPhysics := False;
procedure TPlayer.SwitchNoClip;
begin
- if not FLive then
+ if not FAlive then
Exit;
FGhost := not FGhost;
FPhysics := not FGhost;
if b > 1 then b := b * (Random(8 div b) + 1);
for a := 0 to High(gGibs) do
begin
- if gGibs[a].Live and
+ if gGibs[a].alive and
g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then
begin
FObj.X := X-PLAYER_RECT.X;
FObj.Y := Y-PLAYER_RECT.Y;
- if FLive and FGhost then
+ if FAlive and FGhost then
begin
FXTo := FObj.X;
FYTo := FObj.Y;
FLoss := 0;
end;
- if FLive and (gFly or FJetpack) then
+ if FAlive and (gFly or FJetpack) then
FlySmoke();
if FDirection = D_LEFT then
else
FAngle := 0;
- if FLive and (not FGhost) then
+ if FAlive and (not FGhost) then
begin
if FKeys[KEY_UP].Pressed then
SeeUp();
end;
// no need to do that each second frame, weapon queue will take care of it
- if FLive and FKeys[KEY_NEXTWEAPON].Pressed and AnyServer then NextWeapon();
- if FLive and FKeys[KEY_PREVWEAPON].Pressed and AnyServer then PrevWeapon();
+ if FAlive and FKeys[KEY_NEXTWEAPON].Pressed and AnyServer then NextWeapon();
+ if FAlive and FKeys[KEY_PREVWEAPON].Pressed and AnyServer then PrevWeapon();
if gTime mod (GAME_TICK*2) <> 0 then
begin
- if (FObj.Vel.X = 0) and FLive then
+ if (FObj.Vel.X = 0) and FAlive then
begin
if FKeys[KEY_LEFT].Pressed then
Run(D_LEFT);
FActionChanged := False;
- if FLive then
+ if FAlive then
begin
// Let alive player do some actions
if FKeys[KEY_LEFT].Pressed then Run(D_LEFT);
Respawn(False)
else // Single
if (FTime[T_RESPAWN] <= gTime) and
- gGameOn and (not FLive) then
+ gGameOn and (not FAlive) then
begin
if (g_Player_GetCount() > 1) then
Respawn(False)
SetSpect := False;
for I := FSpectatePlayer + 1 to High(gPlayers) do
if gPlayers[I] <> nil then
- if gPlayers[I].Live then
+ if gPlayers[I].alive then
if gPlayers[I].UID <> FUID then
begin
FSpectatePlayer := I;
if FSpectator then
if (FSpectatePlayer <= High(gPlayers)) and (FSpectatePlayer >= 0) then
if gPlayers[FSpectatePlayer] <> nil then
- if gPlayers[FSpectatePlayer].Live then
+ if gPlayers[FSpectatePlayer].alive then
begin
FXTo := gPlayers[FSpectatePlayer].GameX;
FYTo := gPlayers[FSpectatePlayer].GameY;
headwater := HeadInLiquid(0, 0);
// Ñîïðîòèâëåíèå âîçäóõà:
- if (not FLive) or not (FKeys[KEY_LEFT].Pressed or FKeys[KEY_RIGHT].Pressed) then
+ if (not FAlive) or not (FKeys[KEY_LEFT].Pressed or FKeys[KEY_RIGHT].Pressed) then
if FObj.Vel.X <> 0 then
FObj.Vel.X := z_dec(FObj.Vel.X, 1);
DecMin(FPain, 5, 0);
DecMin(FPickup, 1, 0);
- if FLive and (FObj.Y > gMapInfo.Height+128) and AnyServer then
+ if FAlive and (FObj.Y > Integer(gMapInfo.Height)+128) and AnyServer then
begin
// Îáíóëèòü äåéñòâèÿ ïðèìî÷åê, ÷òîáû ôîí ïðîïàë
FMegaRulez[MR_SUIT] := 0;
i := 9;
- if FLive then
+ if FAlive then
begin
if FCurrWeap = WEAPON_SAW then
if not (FSawSound.IsPlaying() or FSawSoundHit.IsPlaying() or
else if FHealth > -50 then Kill(K_HARDKILL, FLastSpawnerUID, FLastHit)
else Kill(K_EXTRAHARDKILL, FLastSpawnerUID, FLastHit);
- if FLive then
+ if FAlive then
begin
if FDamageBuffer <= 20 then FModel.PlaySound(MODELSOUND_PAIN, 1, FObj.X, FObj.Y)
else if FDamageBuffer <= 55 then FModel.PlaySound(MODELSOUND_PAIN, 2, FObj.X, FObj.Y)
end;
{CollideItem();}
- end; // if FLive then ...
+ end; // if FAlive then ...
if (FActionAnim = A_PAIN) and (FModel.Animation <> A_PAIN) then
begin
if FKeys[b].Time = 0 then FKeys[b].Pressed := False else Dec(FKeys[b].Time);
end;
-function TPlayer.getMapAABB (): AABB2D; inline;
+
+procedure TPlayer.getMapBox (out x, y, w, h: Integer); inline;
begin
- result := AABB2D.CreateWH(FObj.X+PLAYER_RECT.X, FObj.Y+PLAYER_RECT.Y, PLAYER_RECT.Width, PLAYER_RECT.Height);
+ x := FObj.X+PLAYER_RECT.X;
+ y := FObj.Y+PLAYER_RECT.Y;
+ w := PLAYER_RECT.Width;
+ h := PLAYER_RECT.Height;
end;
+
+procedure TPlayer.moveBy (dx, dy: Integer); inline;
+begin
+ if (dx <> 0) or (dy <> 0) then
+ begin
+ FObj.X += dx;
+ FObj.Y += dy;
+ positionChanged();
+ end;
+end;
+
+
function TPlayer.Collide(X, Y: Integer; Width, Height: Word): Boolean;
begin
Result := g_Collide(FObj.X+PLAYER_RECT.X,
for a := 0 to High(gPlayers) do
if (gPlayers[a] <> nil) and (gPlayers[a] <> Self) and
- gPlayers[a].Live and SameTeam(FUID, gPlayers[a].FUID) and
+ gPlayers[a].alive and SameTeam(FUID, gPlayers[a].FUID) and
g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y,
FObj.Rect.Width, FObj.Rect.Height, @gPlayers[a].FObj) then
begin
// Êîìàíäà:
Mem.WriteByte(FTeam);
// Æèâ ëè:
- Mem.WriteBoolean(FLive);
+ Mem.WriteBoolean(FAlive);
// Èçðàñõîäîâàë ëè âñå æèçíè:
Mem.WriteBoolean(FNoRespawn);
// Íàïðàâëåíèå:
// Êîìàíäà:
Mem.ReadByte(FTeam);
// Æèâ ëè:
- Mem.ReadBoolean(FLive);
+ Mem.ReadBoolean(FAlive);
// Èçðàñõîäîâàë ëè âñå æèçíè:
Mem.ReadBoolean(FNoRespawn);
// Íàïðàâëåíèå:
inherited;
end;
-procedure TCorpse.positionChanged (); begin end;
+procedure TCorpse.positionChanged (); inline; begin end;
+
+procedure TCorpse.moveBy (dx, dy: Integer); inline;
+begin
+ if (dx <> 0) or (dy <> 0) then
+ begin
+ FObj.X += dx;
+ FObj.Y += dy;
+ positionChanged();
+ end;
+end;
+
+
+procedure TCorpse.getMapBox (out x, y, w, h: Integer); inline;
+begin
+ x := FObj.X+PLAYER_CORPSERECT.X;
+ y := FObj.Y+PLAYER_CORPSERECT.Y;
+ w := PLAYER_CORPSERECT.Width;
+ h := PLAYER_CORPSERECT.Height;
+end;
+
procedure TCorpse.Damage(Value: Word; vx, vy: Integer);
var
function monsUpdate (mon: TMonster): Boolean;
begin
result := false; // don't stop
- if mon.Live and (mon.MonsterType <> MONSTER_BARREL) then
+ if mon.alive and (mon.MonsterType <> MONSTER_BARREL) then
begin
if not TargetOnScreen(mon.Obj.X+mon.Obj.Rect.X, mon.Obj.Y+mon.Obj.Rect.Y) then exit;
// Èãðîêè:
if vsPlayer then
for a := 0 to High(gPlayers) do
- if (gPlayers[a] <> nil) and (gPlayers[a].Live) and
+ if (gPlayers[a] <> nil) and (gPlayers[a].alive) and
(gPlayers[a].FUID <> FUID) and
(not SameTeam(FUID, gPlayers[a].FUID)) and
(not gPlayers[a].NoTarget) and
if Target.IsPlayer then
begin // Öåëü - èãðîê
pla := g_Player_Get(Target.UID);
- if (pla = nil) or (not pla.Live) or pla.NoTarget or
+ if (pla = nil) or (not pla.alive) or pla.NoTarget or
(pla.FMegaRulez[MR_INVIS] >= gTime) then
Target.UID := 0; // òî çàáûòü öåëü
end
else
begin // Öåëü - ìîíñòð
mon := g_Monsters_ByUID(Target.UID);
- if (mon = nil) or (not mon.Live) then
+ if (mon = nil) or (not mon.alive) then
Target.UID := 0; // òî çàáûòü öåëü
end;
end;
var
EnableAI: Boolean;
begin
- if not FLive then
+ if not FAlive then
begin // Respawn
ReleaseKeys();
PressKey(KEY_UP);