diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index e7f3fee964a6f24df74675de530d0b8d3255312b..db438329dd146c0de2d43eb20ec662bc99002c09 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
g_base, g_playermodel, g_basic, g_textures,
g_weapons, g_phys, g_sound, g_saveload, MAPDEF,
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
g_base, g_playermodel, g_basic, g_textures,
g_weapons, g_phys, g_sound, g_saveload, MAPDEF,
- g_panel, r_playermodel;
+ g_panel;
const
KEY_LEFT = 1;
const
KEY_LEFT = 1;
PShell = ^TShell;
TShell = record
PShell = ^TShell;
TShell = record
- SpriteID: DWORD;
- alive: Boolean;
+ alive: Boolean;
SType: Byte;
RAngle: Integer;
Timeout: Cardinal;
SType: Byte;
RAngle: Integer;
Timeout: Cardinal;
- CX, CY: Integer;
Obj: TObj;
procedure getMapBox (out x, y, w, h: Integer); inline;
Obj: TObj;
procedure getMapBox (out x, y, w, h: Integer); inline;
implementation
uses
implementation
uses
-{$IFDEF ENABLE_HOLMES}
- g_holmes,
-{$ENDIF}
- e_log, g_map, g_items, g_console, g_gfx, Math, r_textures, r_animations, r_gfx,
- g_options, g_triggers, g_menu, g_game, g_grid, e_res,
+ {$IFDEF ENABLE_HOLMES}
+ g_holmes,
+ {$ENDIF}
+ {$IFDEF ENABLE_MENU}
+ g_menu,
+ {$ENDIF}
+ {$IFNDEF HEADLESS}
+ r_render,
+ {$ENDIF}
+ {$IFDEF ENABLE_GFX}
+ g_gfx,
+ {$ENDIF}
+ e_log, g_map, g_items, g_console, Math,
+ g_options, g_triggers, g_game, g_grid, e_res,
wadreader, g_monsters, CONFIG, g_language,
g_net, g_netmsg,
utils, xstreams;
wadreader, g_monsters, CONFIG, g_language,
g_net, g_netmsg,
utils, xstreams;
end;
procedure g_Player_CreateShell(fX, fY, dX, dY: Integer; T: Byte);
end;
procedure g_Player_CreateShell(fX, fY, dX, dY: Integer; T: Byte);
-var
- SID: DWORD;
begin
if (gShells = nil) or (Length(gShells) = 0) then
Exit;
with gShells[CurrentShell] do
begin
begin
if (gShells = nil) or (Length(gShells) = 0) then
Exit;
with gShells[CurrentShell] do
begin
- SpriteID := 0;
g_Obj_Init(@Obj);
Obj.Rect.X := 0;
Obj.Rect.Y := 0;
if T = SHELL_BULLET then
begin
g_Obj_Init(@Obj);
Obj.Rect.X := 0;
Obj.Rect.Y := 0;
if T = SHELL_BULLET then
begin
- if g_Texture_Get('TEXTURE_SHELL_BULLET', SID) then
- SpriteID := SID;
- CX := 2;
- CY := 1;
Obj.Rect.Width := 4;
Obj.Rect.Height := 2;
end
else
begin
Obj.Rect.Width := 4;
Obj.Rect.Height := 2;
end
else
begin
- if g_Texture_Get('TEXTURE_SHELL_SHELL', SID) then
- SpriteID := SID;
- CX := 4;
- CY := 2;
Obj.Rect.Width := 7;
Obj.Rect.Height := 3;
end;
Obj.Rect.Width := 7;
Obj.Rect.Height := 3;
end;
var
a: Integer;
GibsArray: TGibsArray;
var
a: Integer;
GibsArray: TGibsArray;
- Blood: TModelBlood;
+ {$IFDEF ENABLE_GFX}
+ Blood: TModelBlood;
+ {$ENDIF}
begin
if mid = -1 then
Exit;
begin
if mid = -1 then
Exit;
Exit;
if not g_PlayerModel_GetGibs(mid, GibsArray) then
Exit;
Exit;
if not g_PlayerModel_GetGibs(mid, GibsArray) then
Exit;
- Blood := PlayerModelsArray[mid].Blood;
+
+ {$IFDEF ENABLE_GFX}
+ Blood := PlayerModelsArray[mid].Blood;
+ {$ENDIF}
for a := 0 to High(GibsArray) do
with gGibs[CurrentGib] do
for a := 0 to High(GibsArray) do
with gGibs[CurrentGib] do
Color := fColor;
alive := True;
g_Obj_Init(@Obj);
Color := fColor;
alive := True;
g_Obj_Init(@Obj);
- Obj.Rect := r_PlayerModel_GetGibRect(ModelID, GibID);
+ {$IFNDEF HEADLESS}
+ Obj.Rect := r_Render_GetGibRect(ModelID, GibID);
+ {$ELSE}
+ Obj.Rect.X := 16;
+ Obj.Rect.Y := 16;
+ Obj.Rect.Width := 16;
+ Obj.Rect.Height := 16;
+ {$ENDIF}
Obj.X := fX - Obj.Rect.X - (Obj.Rect.Width div 2);
Obj.Y := fY - Obj.Rect.Y - (Obj.Rect.Height div 2);
g_Obj_PushA(@Obj, 25 + Random(10), Random(361));
positionChanged(); // this updates spatial accelerators
RAngle := Random(360);
Obj.X := fX - Obj.Rect.X - (Obj.Rect.Width div 2);
Obj.Y := fY - Obj.Rect.Y - (Obj.Rect.Height div 2);
g_Obj_PushA(@Obj, 25 + Random(10), Random(361));
positionChanged(); // this updates spatial accelerators
RAngle := Random(360);
- if gBloodCount > 0 then
- g_GFX_Blood(fX, fY, 16*gBloodCount+Random(5*gBloodCount), -16+Random(33), -16+Random(33),
- Random(48), Random(48), Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$IFDEF ENABLE_GFX}
+ if gBloodCount > 0 then
+ begin
+ g_GFX_Blood(
+ fX,
+ fY,
+ 16 * gBloodCount + Random(5 * gBloodCount),
+ -16 + Random(33),
+ -16 + Random(33),
+ Random(48),
+ Random(48),
+ Blood.R,
+ Blood.G,
+ Blood.B,
+ Blood.Kind
+ );
+ end;
+ {$ENDIF}
if CurrentGib >= High(gGibs) then
CurrentGib := 0
if CurrentGib >= High(gGibs) then
CurrentGib := 0
HIT_BFG, HIT_ROCKET, HIT_SOME: MakeBloodVector(c, vx, vy);
end;
HIT_BFG, HIT_ROCKET, HIT_SOME: MakeBloodVector(c, vx, vy);
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);
+ {$IFDEF ENABLE_GFX}
+ if t = HIT_WATER then
+ begin
+ g_GFX_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
+ FObj.Y+PLAYER_RECT.Y-4, value div 2, 8, 4);
+ end;
+ {$ENDIF}
end;
// Буфер урона:
end;
// Буфер урона:
end;
procedure TPlayer.MakeBloodSimple(Count: Word);
end;
procedure TPlayer.MakeBloodSimple(Count: Word);
- var Blood: TModelBlood;
-begin
- Blood := SELF.FModel.GetBlood();
- g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)+8,
- FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
- Count div 2, 3, -1, 16, (PLAYER_RECT.Height*2 div 3),
- Blood.R, Blood.G, Blood.B, Blood.Kind);
- g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-8,
- FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
- Count div 2, -3, -1, 16, (PLAYER_RECT.Height*2) div 3,
- Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$IFDEF ENABLE_GFX}
+ var Blood: TModelBlood;
+ {$ENDIF}
+begin
+ {$IFDEF ENABLE_GFX}
+ Blood := SELF.FModel.GetBlood();
+ g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)+8,
+ FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
+ Count div 2, 3, -1, 16, (PLAYER_RECT.Height*2 div 3),
+ Blood.R, Blood.G, Blood.B, Blood.Kind);
+ g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-8,
+ FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
+ Count div 2, -3, -1, 16, (PLAYER_RECT.Height*2) div 3,
+ Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$ENDIF}
end;
procedure TPlayer.MakeBloodVector(Count: Word; VelX, VelY: Integer);
end;
procedure TPlayer.MakeBloodVector(Count: Word; VelX, VelY: Integer);
- var Blood: TModelBlood;
+ {$IFDEF ENABLE_GFX}
+ var Blood: TModelBlood;
+ {$ENDIF}
begin
begin
- Blood := SELF.FModel.GetBlood();
- g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
- FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
- Count, VelX, VelY, 16, (PLAYER_RECT.Height*2) div 3,
- Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$IFDEF ENABLE_GFX}
+ Blood := SELF.FModel.GetBlood();
+ g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
+ FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
+ Count, VelX, VelY, 16, (PLAYER_RECT.Height*2) div 3,
+ Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$ENDIF}
end;
procedure TPlayer.QueueWeaponSwitch(Weapon: Byte);
end;
procedure TPlayer.QueueWeaponSwitch(Weapon: Byte);
FFirePainTime := 0;
FFireAttacker := 0;
FFirePainTime := 0;
FFireAttacker := 0;
-// Анимация возрождения:
- if (not gLoadGameMode) and (not Silent) then
- r_GFX_OnceAnim(
- R_GFX_TELEPORT_FAST,
- FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
- FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32
- );
+ {$IFDEF ENABLE_GFX}
+ // Анимация возрождения:
+ if (not gLoadGameMode) and (not Silent) then
+ begin
+ g_GFX_QueueEffect(
+ R_GFX_TELEPORT_FAST,
+ FObj.X + PLAYER_RECT.X + (PLAYER_RECT.Width div 2) - 32,
+ FObj.Y + PLAYER_RECT.Y + (PLAYER_RECT.Height div 2) - 32
+ );
+ end;
+ {$ENDIF}
FSpectator := False;
FGhost := False;
FSpectator := False;
FGhost := False;
if not silent then
begin
g_Sound_PlayExAt('SOUND_GAME_TELEPORT', FObj.X, FObj.Y);
if not silent then
begin
g_Sound_PlayExAt('SOUND_GAME_TELEPORT', FObj.X, FObj.Y);
- r_GFX_OnceAnim(
- R_GFX_TELEPORT_FAST,
- FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
- FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32
- );
+ {$IFDEF ENABLE_GFX}
+ g_GFX_QueueEffect(
+ R_GFX_TELEPORT_FAST,
+ FObj.X + PLAYER_RECT.X + (PLAYER_RECT.Width div 2) - 32,
+ FObj.Y + PLAYER_RECT.Y + (PLAYER_RECT.Height div 2) - 32
+ );
+ {$ENDIF}
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_Effect(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32, 1,
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_Effect(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32, 1,
if not silent then
begin
if not silent then
begin
- r_GFX_OnceAnim(
- R_GFX_TELEPORT_FAST,
- FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
- FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32
- );
+ {$IFDEF ENABLE_GFX}
+ g_GFX_QueueEffect(
+ R_GFX_TELEPORT_FAST,
+ FObj.X + PLAYER_RECT.X + (PLAYER_RECT.Width div 2) - 32,
+ FObj.Y + PLAYER_RECT.Y + (PLAYER_RECT.Height div 2) - 32
+ );
+ {$ENDIF}
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_Effect(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32, 0,
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_Effect(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-32,
FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2)-32, 0,
end
else if (FAir mod 31 = 0) and not blockmon then
begin
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);
+ {$IFDEF ENABLE_GFX}
+ g_GFX_Bubbles(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2), FObj.Y+PLAYER_RECT.Y-4, 5+Random(6), 8, 4);
+ {$ENDIF}
if Random(2) = 0 then
g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
else
if Random(2) = 0 then
g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
else
if BodyInLiquid(0, 0) then
begin
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);
+ {$IFDEF ENABLE_GFX}
+ 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);
+ {$ENDIF}
if Random(2) = 0 then
g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
else
if Random(2) = 0 then
g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
else
for i := 1 to Times do
begin
for i := 1 to Times do
begin
- r_GFX_OnceAnim(
- R_GFX_SMOKE_TRANS,
- Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(R_GFX_SMOKE_WIDTH div 2),
- Obj.Y+Obj.Rect.Height-4+Random(8+Times*2)
- );
+ {$IFDEF ENABLE_GFX}
+ g_GFX_QueueEffect(
+ R_GFX_SMOKE_TRANS,
+ Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(R_GFX_SMOKE_WIDTH div 2),
+ Obj.Y+Obj.Rect.Height-4+Random(8+Times*2)
+ );
+ {$ENDIF}
end;
end;
end;
end;
for i := 1 to Times do
begin
for i := 1 to Times do
begin
- r_GFX_OnceAnim(
- R_GFX_FLAME,
- Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(R_GFX_FLAME_WIDTH div 2),
- Obj.Y+8+Random(8+Times*2)
- );
+ {$IFDEF ENABLE_GFX}
+ g_GFX_QueueEffect(
+ R_GFX_FLAME,
+ Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(R_GFX_FLAME_WIDTH div 2),
+ Obj.Y+8+Random(8+Times*2)
+ );
+ {$ENDIF}
end;
end;
end;
end;
procedure TCorpse.Damage(Value: Word; SpawnerUID: Word; vx, vy: Integer);
procedure TCorpse.Damage(Value: Word; SpawnerUID: Word; vx, vy: Integer);
- var Blood: TModelBlood;
+ {$IFDEF ENABLE_GFX}
+ var Blood: TModelBlood;
+ {$ENDIF}
begin
if FState = CORPSE_STATE_REMOVEME then
Exit;
begin
if FState = CORPSE_STATE_REMOVEME then
Exit;
end
else
begin
end
else
begin
- Blood := FModel.GetBlood();
FObj.Vel.X := FObj.Vel.X + vx;
FObj.Vel.Y := FObj.Vel.Y + vy;
FObj.Vel.X := FObj.Vel.X + vx;
FObj.Vel.Y := FObj.Vel.Y + vy;
- g_GFX_Blood(FObj.X+PLAYER_CORPSERECT.X+(PLAYER_CORPSERECT.Width div 2),
- FObj.Y+PLAYER_CORPSERECT.Y+(PLAYER_CORPSERECT.Height div 2),
- Value, vx, vy, 16, (PLAYER_CORPSERECT.Height*2) div 3,
- Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$IFDEF ENABLE_GFX}
+ Blood := FModel.GetBlood();
+ g_GFX_Blood(FObj.X+PLAYER_CORPSERECT.X+(PLAYER_CORPSERECT.Width div 2),
+ FObj.Y+PLAYER_CORPSERECT.Y+(PLAYER_CORPSERECT.Height div 2),
+ Value, vx, vy, 16, (PLAYER_CORPSERECT.Height*2) div 3,
+ Blood.R, Blood.G, Blood.B, Blood.Kind);
+ {$ENDIF}
end;
end;
end;
end;
// animation
anim := (FModel <> nil);
utils.writeBool(st, anim);
// animation
anim := (FModel <> nil);
utils.writeBool(st, anim);
- if anim then FModel.AnimState.SaveState(st);
+ if anim then FModel.AnimState.SaveState(st, 0, False);
// animation for mask (same as animation, compat with older saves)
anim := (FModel <> nil);
utils.writeBool(st, anim);
// animation for mask (same as animation, compat with older saves)
anim := (FModel <> nil);
utils.writeBool(st, anim);
- if anim then FModel.AnimState.SaveState(st);
+ if anim then FModel.AnimState.SaveState(st, 0, False);
end;
procedure TCorpse.LoadState (st: TStream);
end;
procedure TCorpse.LoadState (st: TStream);
- var anim: Boolean; r, g, b: Byte; stub: TAnimationState;
+ var anim, blending: Boolean; r, g, b, alpha: Byte; stub: TAnimationState;
begin
assert(st <> nil);
begin
assert(st <> nil);
anim := utils.readBool(st);
if anim then
begin
anim := utils.readBool(st);
if anim then
begin
- stub.LoadState(st);
+ stub.LoadState(st, alpha, blending);
FModel.AnimState.CurrentFrame := Min(stub.CurrentFrame, FModel.AnimState.Length);
end
else
FModel.AnimState.CurrentFrame := Min(stub.CurrentFrame, FModel.AnimState.Length);
end
else
end;
// animation for mask (same as animation, compat with older saves)
anim := utils.readBool(st);
end;
// animation for mask (same as animation, compat with older saves)
anim := utils.readBool(st);
- if anim then stub.LoadState(st);
+ if anim then stub.LoadState(st, alpha, blending);
stub.Free;
end;
stub.Free;
end;