X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=5fa50114660f43d7a5df764ce662a16ab4b11b0f;hb=a2ba3b4f4ea42350560a7670f3be97a55f6d3ab5;hp=a5c543f78fae840456155cfacf80d7ddc3a14ab9;hpb=67a536daf73aa6f586896b521dd4029a1068df27;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index a5c543f..5fa5011 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -23,7 +23,7 @@ uses 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 @@ -93,7 +93,7 @@ type {$ENDIF} FFirePainTime: Integer; FFireAttacker: Word; - vilefire: TAnimState; + FVileFireTime: LongWord; mProxyId: Integer; // node in dyntree or -1 mArrIdx: Integer; // in gMonsters @@ -198,7 +198,7 @@ type property StartID: Integer read FStartID; - property VileFireAnim: TAnimState read vilefire; + property VileFireTime: LongWord read FVileFireTime; property DirAnim: ADirectedAnim read FAnim; published @@ -328,6 +328,7 @@ var ANIM_ATTACK = 4; ANIM_ATTACK2 = 5; ANIM_PAIN = 6; + ANIM_LAST = ANIM_PAIN; // Таблица характеристик монстров: MONSTERTABLE: Array [MONSTER_DEMON..MONSTER_MAN] of @@ -541,7 +542,7 @@ uses g_corpses, {$ENDIF} e_log, g_sound, g_player, g_game, - g_weapons, g_triggers, g_items, g_options, + g_weapons, g_triggers, g_items, g_options, g_window, g_console, g_map, Math, wadreader, g_language, g_netmsg, idpool, utils, xstreams; @@ -895,10 +896,6 @@ end; procedure g_Monsters_LoadData(); begin e_WriteLog('Loading monsters data...', TMsgType.Notify); - - g_Game_SetLoadingText(_lc[I_LOAD_MONSTER_TEXTURES], 133, False); - g_Game_StepLoading(133); - g_Game_SetLoadingText(_lc[I_LOAD_MONSTER_SOUNDS], 0, False); g_Sound_CreateWADEx('SOUND_MONSTER_BARREL_DIE', GameWAD+':MSOUNDS\BARREL_DIE'); @@ -1684,8 +1681,8 @@ begin 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; @@ -1882,7 +1879,7 @@ begin FAnim[a, TDirection.D_RIGHT].Invalidate; end; - vilefire.Invalidate; + FVileFireTime := 0; if (mProxyId <> -1) then begin @@ -2776,10 +2773,6 @@ _end: SetState(MONSTATE_GO); end; -// Если есть анимация огня колдуна - пусть она идет: - if vilefire.IsValid() then - vilefire.Update(); - // Состояние - Умирает и текущая анимация проиграна: if (FState = MONSTATE_DIE) and (FAnim[FCurAnim, FDirection].IsValid()) and @@ -3639,10 +3632,6 @@ _end: SetState(MONSTATE_GO); end; -// Если есть анимация огня колдуна - пусть она идет: - if vilefire.IsValid() then - vilefire.Update(); - // Состояние - Умирает и текущая анимация проиграна: if (FState = MONSTATE_DIE) and (FAnim[FCurAnim, FDirection].IsValid()) and @@ -4114,7 +4103,7 @@ begin 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); @@ -4177,6 +4166,7 @@ var i: Integer; b: Byte; anim: Boolean; + stub: TAnimState; begin assert(st <> nil); @@ -4226,10 +4216,15 @@ begin // Объект монстра 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 @@ -4252,6 +4247,7 @@ var i: Integer; b, alpha: Byte; anim, blending: Boolean; + stub: TAnimState; begin assert(st <> nil); @@ -4310,9 +4306,11 @@ begin // Если есть - загружаем: 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