index a5c543f78fae840456155cfacf80d7ddc3a14ab9..db552adb8122da64e4441c52811555460bded0b1 100644 (file)
--- a/src/game/g_monsters.pas
+++ b/src/game/g_monsters.pas
SysUtils, Classes,
mempool,
MAPDEF,
- g_base, g_basic, g_phys, g_textures, g_grid,
+ g_base, g_basic, g_phys, g_animations, g_grid,
g_saveload, g_panel, xprofiler;
const
{$ENDIF}
FFirePainTime: Integer;
FFireAttacker: Word;
- vilefire: TAnimState;
+ FVileFireTime: LongWord;
mProxyId: Integer; // node in dyntree or -1
mArrIdx: Integer; // in gMonsters
property StartID: Integer read FStartID;
- property VileFireAnim: TAnimState read vilefire;
+ property VileFireTime: LongWord read FVileFireTime;
property DirAnim: ADirectedAnim read FAnim;
published
ANIM_ATTACK = 4;
ANIM_ATTACK2 = 5;
ANIM_PAIN = 6;
+ ANIM_LAST = ANIM_PAIN;
// Таблица характеристик монстров:
MONSTERTABLE: Array [MONSTER_DEMON..MONSTER_MAN] of
FAnim[a, TDirection.D_RIGHT] := TAnimState.Create(ANIMTABLE[a].loop, MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a], MONSTER_ANIMTABLE[MonsterType].AnimCount[a]);
FAnim[a, TDirection.D_LEFT] := TAnimState.Create(ANIMTABLE[a].loop, MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a], MONSTER_ANIMTABLE[MonsterType].AnimCount[a]);
end;
- if MonsterType = MONSTER_VILE then
- vilefire := TAnimState.Create(True, 2, 8);
+
+ FVileFireTime := gTime;
end;
function TMonster.Damage(aDamage: Word; VelX, VelY: Integer; SpawnerUID: Word; t: Byte): Boolean;
FAnim[a, TDirection.D_RIGHT].Invalidate;
end;
- vilefire.Invalidate;
+ FVileFireTime := 0;
if (mProxyId <> -1) then
begin
SetState(MONSTATE_GO);
end;
-// Если есть анимация огня колдуна - пусть она идет:
- if vilefire.IsValid() then
- vilefire.Update();
-
// Состояние - Умирает и текущая анимация проиграна:
if (FState = MONSTATE_DIE) and
(FAnim[FCurAnim, FDirection].IsValid()) and
SetState(MONSTATE_GO);
end;
-// Если есть анимация огня колдуна - пусть она идет:
- if vilefire.IsValid() then
- vilefire.Update();
-
// Состояние - Умирает и текущая анимация проиграна:
if (FState = MONSTATE_DIE) and
(FAnim[FCurAnim, FDirection].IsValid()) and
ty := o^.Y+o^.Rect.Y;
SetState(MONSTATE_SHOOT);
- vilefire.Reset();
+ FVileFireTime := gTime;
g_Sound_PlayExAt('SOUND_MONSTER_VILE_ATTACK', FObj.X, FObj.Y);
g_Sound_PlayExAt('SOUND_FIRE', o^.X, o^.Y);
i: Integer;
b: Byte;
anim: Boolean;
+ stub: TAnimState;
begin
assert(st <> nil);
// Объект монстра
Obj_SaveState(st, @FObj);
// Есть ли анимация огня колдуна
- anim := (vilefire.IsValid());
+ anim := FMonsterType = MONSTER_VILE;
utils.writeBool(st, anim);
// Если есть - сохраняем:
- if anim then vilefire.SaveState(st, 0, False);
+ if anim then
+ begin
+ stub := TAnimState.Create(true, 2, 8);
+ stub.SaveState(st, 0, False);
+ stub.Invalidate;
+ end;
// Анимации
for i := ANIM_SLEEP to ANIM_PAIN do
begin
i: Integer;
b, alpha: Byte;
anim, blending: Boolean;
+ stub: TAnimState;
begin
assert(st <> nil);
// Если есть - загружаем:
if anim then
begin
- Assert(vilefire.IsValid(), 'TMonster.LoadState: no vilefire anim');
- vilefire.LoadState(st, alpha, blending);
+ stub := TAnimState.Create(true, 2, 8);
+ stub.LoadState(st, alpha, blending);
+ stub.Invalidate;
end;
+ FVileFireTime := gTime;
// Анимации
for i := ANIM_SLEEP to ANIM_PAIN do
begin