index b6e68b511a3fe8c3ed8ed613081c4a0393494c77..78ae1a409ab05f1c629a6fb5d3cbdd9d63b79a3e 100644 (file)
--- a/src/game/g_monsters.pas
+++ b/src/game/g_monsters.pas
tx, ty: Integer;
FStartID: Integer;
FObj: TObj;
- FBloodRed: Byte;
- FBloodGreen: Byte;
- FBloodBlue: Byte;
- FBloodKind: Byte;
+ {$IFDEF ENABLE_GFX}
+ FBloodRed: Byte;
+ FBloodGreen: Byte;
+ FBloodBlue: Byte;
+ FBloodKind: Byte;
+ {$ENDIF}
FShellTimer: Integer;
FShellType: Byte;
FFirePainTime: Integer;
implementation
uses
- {$IFNDEF HEADLESS}
+ {$IFDEF ENABLE_MENU}
g_menu,
{$ENDIF}
- e_log, g_sound, g_gfx, g_player, g_game,
+ {$IFDEF ENABLE_GFX}
+ g_gfx,
+ {$ENDIF}
+ {$IFDEF ENABLE_GIBS}
+ g_gibs,
+ {$ENDIF}
+ e_log, g_sound, g_player, g_game,
g_weapons, g_triggers, g_items, g_options,
g_console, g_map, Math, wadreader,
g_language, g_netmsg, idpool, utils, xstreams;
mplatCheckFrameId := 0;
mNeedSend := false;
+{$IFDEF ENABLE_GFX}
if FMonsterType in [MONSTER_ROBO, MONSTER_BARREL] then
FBloodKind := BLOOD_SPARKS
else
FBloodGreen := 0;
FBloodBlue := 0;
end;
+{$ENDIF}
SetLength(FAnim, Length(ANIMTABLE));
for a := ANIM_SLEEP to ANIM_PAIN do
FAnim[a, TDirection.D_LEFT] := TAnimationState.Create(ANIMTABLE[a].loop, MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a], MONSTER_ANIMTABLE[MonsterType].AnimCount[a]);
end;
if MonsterType = MONSTER_VILE then
- vilefire := TAnimationState.Create(True, 2, 0); // !!! len
+ vilefire := TAnimationState.Create(True, 2, 8);
end;
function TMonster.Damage(aDamage: Word; VelX, VelY: Integer; SpawnerUID: Word; t: Byte): Boolean;
procedure TMonster.MakeBloodSimple(Count: Word);
begin
+{$IFDEF ENABLE_GFX}
g_GFX_Blood(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)+8,
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
Count div 2, 3, -1, 16, (FObj.Rect.Height*2 div 3),
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
Count div 2, -3, -1, 16, (FObj.Rect.Height*2) div 3,
FBloodRed, FBloodGreen, FBloodBlue, FBloodKind);
+{$ENDIF}
end;
procedure TMonster.MakeBloodVector(Count: Word; VelX, VelY: Integer);
begin
+{$IFDEF ENABLE_GFX}
g_GFX_Blood(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
Count, VelX, VelY, 16, (FObj.Rect.Height*2) div 3,
FBloodRed, FBloodGreen, FBloodBlue, FBloodKind);
+{$ENDIF}
end;
procedure TMonster.Push(vx, vy: Integer);
if not silent then
begin
g_Sound_PlayExAt('SOUND_GAME_TELEPORT', Obj.X, Obj.Y);
+{$IFDEF ENABLE_GFX}
g_GFX_QueueEffect(
R_GFX_TELEPORT,
FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32
);
-
+{$ENDIF}
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_Effect(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32, 1,
// Эффект телепорта в точке назначения:
if not silent then
begin
+{$IFDEF ENABLE_GFX}
g_GFX_QueueEffect(
R_GFX_TELEPORT,
FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32
);
-
+{$ENDIF}
if g_Game_IsServer and g_Game_IsNet then
MH_SEND_Effect(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32, 0,
if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then
case FMonsterType of
MONSTER_FISH:
- if Random(4) = 0 then
- g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
- FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
+ begin
+ {$IFDEF ENABLE_GFX}
+ if Random(4) = 0 then
+ begin
+ g_GFX_Bubbles(
+ FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+ FObj.Y + FObj.Rect.Y + Random(4),
+ 1,
+ 0,
+ 0
+ );
+ end;
+ {$ENDIF}
+ end;
MONSTER_ROBO, MONSTER_BARREL:
- g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
- FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
- else begin
- g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4),
- FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4);
+ begin
+ {$IFDEF ENABLE_GFX}
+ g_GFX_Bubbles(
+ FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+ FObj.Y + FObj.Rect.Y + Random(4),
+ 1,
+ 0,
+ 0
+ );
+ {$ENDIF}
+ end;
+ else
+ begin
+ {$IFDEF ENABLE_GFX}
+ g_GFX_Bubbles(
+ FObj.X + FObj.Rect.X + Random(FObj.Rect.Width - 4),
+ FObj.Y+FObj.Rect.Y + Random(4),
+ 5,
+ 4,
+ 4
+ );
+ {$ENDIF}
if Random(2) = 0 then
g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
else
end
else // "Наземные" монстры
begin
- // Возможно, пинаем куски:
- if (FObj.Vel.X <> 0) and (gGibs <> nil) then
- begin
- b := Abs(FObj.Vel.X);
- if b > 1 then b := b * (Random(8 div b) + 1);
- for a := 0 to High(gGibs) do
+ {$IFDEF ENABLE_GIBS}
+ // Возможно, пинаем куски:
+ if (FObj.Vel.X <> 0) and (gGibs <> nil) then
begin
- 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
+ b := Abs(FObj.Vel.X);
+ if b > 1 then b := b * (Random(8 div b) + 1);
+ for a := 0 to High(gGibs) do
begin
- // Пинаем куски
- if FObj.Vel.X < 0 then
- begin
- g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
- end
- else
+ 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
- g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо
+ // Пинаем куски
+ if FObj.Vel.X < 0 then
+ begin
+ g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
+ end
+ else
+ begin
+ g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо
+ end;
end;
end;
end;
- end;
+ {$ENDIF}
// Боссы могут пинать трупы:
if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
(FObj.Vel.X <> 0) and (gCorpses <> nil) then
if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then
case FMonsterType of
MONSTER_FISH:
- if Random(4) = 0 then
- g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
- FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
+ begin
+ {$IFDEF ENABLE_GFX}
+ if Random(4) = 0 then
+ begin
+ g_GFX_Bubbles(
+ FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+ FObj.Y + FObj.Rect.Y + Random(4),
+ 1,
+ 0,
+ 0
+ );
+ end;
+ {$ENDIF}
+ end;
MONSTER_ROBO, MONSTER_BARREL:
- g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
- FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
- else begin
- g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4),
- FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4);
+ begin
+ {$IFDEF ENABLE_GFX}
+ g_GFX_Bubbles(
+ FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+ FObj.Y + FObj.Rect.Y + Random(4),
+ 1,
+ 0,
+ 0
+ );
+ {$ENDIF}
+ end;
+ else
+ begin
+ {$IFDEF ENABLE_GFX}
+ g_GFX_Bubbles(
+ FObj.X + FObj.Rect.X + Random(FObj.Rect.Width - 4),
+ FObj.Y + FObj.Rect.Y + Random(4),
+ 5,
+ 4,
+ 4
+ );
+ {$ENDIF}
if Random(2) = 0 then
g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
else
end
else // "Наземные" монстры
begin
- // Возможно, пинаем куски:
- if (FObj.Vel.X <> 0) and (gGibs <> nil) then
- begin
- b := Abs(FObj.Vel.X);
- if b > 1 then b := b * (Random(8 div b) + 1);
- for a := 0 to High(gGibs) do
+ {$IFDEF ENBALE_GIBS}
+ // Возможно, пинаем куски:
+ if (FObj.Vel.X <> 0) and (gGibs <> nil) then
begin
- 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
+ b := Abs(FObj.Vel.X);
+ if b > 1 then b := b * (Random(8 div b) + 1);
+ for a := 0 to High(gGibs) do
begin
- // Пинаем куски
- if FObj.Vel.X < 0 then
+ 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
- g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
- end
- else
- begin
- g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо
+ // Пинаем куски
+ if FObj.Vel.X < 0 then
+ begin
+ g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
+ end
+ else
+ begin
+ g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо
+ end;
+ positionChanged(); // this updates spatial accelerators
end;
- positionChanged(); // this updates spatial accelerators
end;
end;
- end;
+ {$ENDIF}
// Боссы могут пинать трупы:
if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
(FObj.Vel.X <> 0) and (gCorpses <> nil) then
end;
procedure TMonster.OnFireFlame(Times: DWORD = 1);
- var i: DWORD; x, y: Integer;
+ {$IFDEF ENABLE_GFX}
+ var i: DWORD; x, y: Integer;
+ {$ENDIF}
begin
- if (Random(10) = 1) and (Times = 1) then
- Exit;
-
- for i := 1 to Times do
- begin
- x := Obj.X + Obj.Rect.X + Random(Obj.Rect.Width + Times * 2) - (R_GFX_FLAME_WIDTH div 2);
- y := Obj.Y + 8 + Random(8 + Times * 2) + IfThen(FState = MONSTATE_DEAD, 16, 0);
- g_GFX_QueueEffect(R_GFX_FLAME, x, y);
- end;
+ {$IFDEF ENABLE_GFX}
+ if (Random(10) = 1) and (Times = 1) then
+ Exit;
+ for i := 1 to Times do
+ begin
+ x := Obj.X + Obj.Rect.X + Random(Obj.Rect.Width + Times * 2) - (R_GFX_FLAME_WIDTH div 2);
+ y := Obj.Y + 8 + Random(8 + Times * 2) + IfThen(FState = MONSTATE_DEAD, 16, 0);
+ g_GFX_QueueEffect(R_GFX_FLAME, x, y);
+ end;
+ {$ENDIF}
end;