X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=5fa50114660f43d7a5df764ce662a16ab4b11b0f;hb=a2ba3b4f4ea42350560a7670f3be97a55f6d3ab5;hp=fac6a7b5fe597e937fd30f9e2980ee79d17ca128;hpb=c8d05082e92b7c2c5b722e2b205e96a15a32eec2;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index fac6a7b..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 @@ -52,7 +52,7 @@ const } type - ADirectedAnim = Array of Array [TDirection.D_LEFT..TDirection.D_RIGHT] of TAnimation; + ADirectedAnim = Array of Array [TDirection.D_LEFT..TDirection.D_RIGHT] of TAnimState; PMonster = ^TMonster; TMonster = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} @@ -81,15 +81,19 @@ type tx, ty: Integer; FStartID: Integer; FObj: TObj; - FBloodRed: Byte; - FBloodGreen: Byte; - FBloodBlue: Byte; - FBloodKind: Byte; - FShellTimer: Integer; - FShellType: Byte; + {$IFDEF ENABLE_GFX} + FBloodRed: Byte; + FBloodGreen: Byte; + FBloodBlue: Byte; + FBloodKind: Byte; + {$ENDIF} + {$IFDEF ENABLE_SHELLS} + FShellTimer: Integer; + FShellType: Byte; + {$ENDIF} FFirePainTime: Integer; FFireAttacker: Word; - vilefire: TAnimation; + FVileFireTime: LongWord; mProxyId: Integer; // node in dyntree or -1 mArrIdx: Integer; // in gMonsters @@ -194,7 +198,7 @@ type property StartID: Integer read FStartID; - property VileFireAnim: TAnimation read vilefire; + property VileFireTime: LongWord read FVileFireTime; property DirAnim: ADirectedAnim read FAnim; published @@ -324,6 +328,7 @@ var ANIM_ATTACK = 4; ANIM_ATTACK2 = 5; ANIM_PAIN = 6; + ANIM_LAST = ANIM_PAIN; // Таблица характеристик монстров: MONSTERTABLE: Array [MONSTER_DEMON..MONSTER_MAN] of @@ -402,95 +407,143 @@ var LeftAnim: Boolean; wX, wY: Integer; // Откуда вылетит пуля AnimSpeed: Array [ANIM_SLEEP..ANIM_PAIN] of Byte; + AnimCount: Array [ANIM_SLEEP..ANIM_PAIN] of Byte; AnimDeltaRight: Array [ANIM_SLEEP..ANIM_PAIN] of TDFPoint; AnimDeltaLeft: Array [ANIM_SLEEP..ANIM_PAIN] of TDFPoint; end = // SLEEP GO DIE MESS ATTACK ATTACK2 PAIN ((LeftAnim: False; wX: 54; wY: 32; AnimSpeed:(3, 2, 3, 2, 3, 0, 4); //DEMON + AnimCount: (2, 4, 6, 6, 3, 0, 1); AnimDeltaRight: ((X: 1; Y: 4), (X: 1; Y: 4), (X: 0; Y: 4), (X: 0; Y: 4), (X: 2; Y: 6), (X: 2; Y: 6), (X: 2; Y: 5)); AnimDeltaLeft: ((X: 1; Y: 4), (X: 1; Y: 4), (X: 0; Y: 4), (X: 0; Y: 4), (X: 2; Y: 6), (X: 2; Y: 6), (X: 2; Y: 5))), (LeftAnim: False; wX: 32; wY: 32; AnimSpeed:(3, 2, 3, 2, 3, 0, 4); //IMP + AnimCount: (2, 4, 5, 8, 3, 0, 1); AnimDeltaRight: ((X: 8; Y: -4), (X: 8; Y: -4), (X: -2; Y: -1), (X: 3; Y: -2), (X: 14; Y: -4), (X: 14; Y: -4), (X: -5; Y: -4)); AnimDeltaLeft: ((X: 8; Y: -4), (X: 8; Y: -4), (X: -2; Y: -1), (X: 3; Y: -2), (X: 14; Y: -4), (X: 14; Y: -4), (X: -5; Y: -4))), (LeftAnim: True; wX: 32; wY: 32; AnimSpeed:(3, 2, 3, 2, 3, 0, 4); //ZOMBY + AnimCount: (2, 4, 6, 9, 2, 0, 1); AnimDeltaRight: ((X: 1; Y: -4), (X: 1; Y: -4), (X: 3; Y: -1), (X: 2; Y: -1), (X: 2; Y: -4), (X: 2; Y: -4), (X: 1; Y: -4)); AnimDeltaLeft: ((X: 1; Y: -4), (X: 1; Y: -4), (X: 3; Y: -1), (X: 2; Y: -1), (X: 2; Y: -4), (X: 2; Y: -4), (X: 1; Y: -4))), (LeftAnim: True; wX: 32; wY: 32; AnimSpeed:(3, 2, 3, 2, 3, 0, 4); //SERG + AnimCount: (2, 4, 5, 9, 2, 0, 1); AnimDeltaRight: ((X: 0; Y: -4), (X: 0; Y: -4), (X: -3; Y: -1), (X: -4; Y: -1), (X: 1; Y: -4), (X: 1; Y: -4), (X: 0; Y: -4)); AnimDeltaLeft: ((X: 0; Y: -4), (X: 0; Y: -4), (X: -3; Y: -1), (X: -4; Y: -1), (X: 1; Y: -4), (X: 1; Y: -4), (X: 0; Y: -4))), (LeftAnim: True; wX: 70; wY: 73; AnimSpeed:(3, 3, 3, 3, 3, 4, 3); //CYBER + AnimCount: (2, 4, 9, 9, 2, 2, 1); AnimDeltaRight: ((X: 2; Y: -6), (X: 2; Y: -6), (X: -3; Y: -4), (X: -3; Y: -4), (X: 25; Y: -6), (X: 0; Y: -6), (X: -2; Y: -6)); AnimDeltaLeft: ((X: 3; Y: -3), (X: 3; Y: -3), (X: -3; Y: -4), (X: -3; Y: -4), (X:-26; Y: -3), (X:-1; Y: -3), (X: 1; Y: -3))), (LeftAnim: True; wX: 32; wY: 32; AnimSpeed:(3, 2, 2, 2, 1, 0, 4); //CGUN + AnimCount: (2, 4, 7, 6, 2, 0, 1); AnimDeltaRight: ((X: -1; Y: -2), (X: -1; Y: -2), (X: -2; Y: 0), (X: -2; Y: 0), (X: 0; Y: -3), (X: 0; Y: -3), (X: -1; Y: -2)); AnimDeltaLeft: ((X: -1; Y: -2), (X: -1; Y: -2), (X: -2; Y: 0), (X: -2; Y: 0), (X: -1; Y: -4), (X: -1; Y: -4), (X: 2; Y: -4))), (LeftAnim: True; wX: 64; wY: 64; AnimSpeed:(3, 2, 3, 4, 2, 0, 4); //BARON + AnimCount: (2, 4, 7, 7, 3, 0, 1); AnimDeltaRight: ((X: 4; Y: 0), (X: 2; Y: 0), (X: -1; Y: -1), (X: -1; Y: -1), (X: 1; Y: 0), (X: 1; Y: 0), (X: -1; Y: 0)); AnimDeltaLeft: ((X: 0; Y: 0), (X: 2; Y: 0), (X: -1; Y: -1), (X: -1; Y: -1), (X: -2; Y: 0), (X: -2; Y: 0), (X: 1; Y: 0))), (LeftAnim: True; wX: 64; wY: 64; AnimSpeed:(3, 2, 3, 4, 2, 0, 4); //KNIGHT + AnimCount: (2, 4, 7, 7, 3, 0, 1); AnimDeltaRight: ((X: 4; Y: 0), (X: 2; Y: 0), (X: -1; Y: -1), (X: -1; Y: -1), (X: 1; Y: 0), (X: 1; Y: 0), (X: -1; Y: 0)); AnimDeltaLeft: ((X: 0; Y: 0), (X: 2; Y: 0), (X: -1; Y: -1), (X: -1; Y: -1), (X: -2; Y: 0), (X: -2; Y: 0), (X: 1; Y: 0))), (LeftAnim: False; wX: 88; wY: 69; AnimSpeed:(3, 2, 3, 4, 2, 0, 4); //CACO + AnimCount: (1, 1, 7, 7, 6, 0, 1); AnimDeltaRight: ((X: 0; Y: -4), (X: 0; Y: -4), (X: 0; Y: -5), (X: 0; Y: -5), (X: 0; Y: -4), (X: 0; Y: -4), (X: 0; Y: -4)); AnimDeltaLeft: ((X: 0; Y: -4), (X: 0; Y: -4), (X: 0; Y: -5), (X: 0; Y: -5), (X: 0; Y: -4), (X: 0; Y: -4), (X: 0; Y: -4))), (LeftAnim: False; wX: 32; wY: 32; AnimSpeed:(3, 2, 3, 4, 1, 0, 4); //SOUL + AnimCount: (2, 2, 7, 7, 2, 0, 1); // 10 AnimDeltaRight: ((X: 1; Y:-10), (X: 1; Y:-10), (X:-33; Y:-34), (X:-33; Y:-34), (X:-16; Y:-10), (X:-16; Y:-10), (X: -1; Y: -7)); AnimDeltaLeft: ((X: 1; Y:-10), (X: 1; Y:-10), (X:-33; Y:-34), (X:-33; Y:-34), (X:-16; Y:-10), (X:-16; Y:-10), (X: -1; Y: -7))), (LeftAnim: False; wX: 64; wY: 64; AnimSpeed:(3, 2, 3, 4, 2, 0, 4); //PAIN + AnimCount: (4, 4, 7, 7, 4, 0, 1); AnimDeltaRight: ((X: -1; Y: -3), (X: -1; Y: -3), (X: -3; Y: 0), (X: -3; Y: 0), (X: -1; Y: -3), (X: -1; Y: -3), (X: -1; Y: -4)); AnimDeltaLeft: ((X: -1; Y: -3), (X: -1; Y: -3), (X: -3; Y: 0), (X: -3; Y: 0), (X: -1; Y: -3), (X: -1; Y: -3), (X: -1; Y: -4))), (LeftAnim: True; wX: 128; wY: 64; AnimSpeed:(3, 2, 4, 4, 1, 0, 4); //SPIDER + AnimCount: (2, 6, 10, 10, 2, 0, 1); AnimDeltaRight: ((X: -4; Y: -4), (X: -4; Y: -4), (X: -2; Y: 8), (X: -2; Y: 8), (X: -3; Y: -3), (X: -3; Y: -3), (X: -3; Y: -4)); AnimDeltaLeft: ((X: -4; Y: -4), (X: -4; Y: -4), (X: -2; Y: 8), (X: -2; Y: 8), (X: -3; Y: -3), (X: -3; Y: -3), (X: 18; Y: -5))), (LeftAnim: True; wX: 64; wY: 32; AnimSpeed:(3, 2, 3, 4, 1, 0, 4); //BSP + AnimCount: (2, 6, 7, 7, 2, 0, 1); AnimDeltaRight: ((X: 0; Y: -1), (X: 0; Y: -1), (X: -3; Y: 5), (X: -3; Y: 5), (X: 7; Y: -1), (X: 7; Y: -1), (X: 1; Y: -3)); AnimDeltaLeft: ((X: 0; Y: -1), (X: 0; Y: -1), (X: -3; Y: 5), (X: -3; Y: 5), (X: 7; Y: -1), (X: 7; Y: -1), (X: 6; Y: -3))), (LeftAnim: False; wX: 64; wY: 64; AnimSpeed:(3, 2, 2, 4, 2, 0, 4); //MANCUB + AnimCount: (2, 6, 10, 10, 3, 0, 1); AnimDeltaRight: ((X: -2; Y: -7), (X: -2; Y: -7), (X: -4; Y: -2), (X: -4; Y: -2), (X: -4; Y: -7), (X: -4; Y: -7), (X:-14; Y: -7)); AnimDeltaLeft: ((X: -2; Y: -7), (X: -2; Y: -7), (X: -4; Y: -2), (X: -4; Y: -2), (X: -4; Y: -7), (X: -4; Y: -7), (X:-14; Y: -7))), (LeftAnim: True; wX: 64; wY: 32; AnimSpeed:(3, 3, 3, 3, 3, 3, 3); //SKEL + AnimCount: (2, 6, 5, 5, 2, 2, 1); AnimDeltaRight: ((X: -1; Y: 4), (X: -1; Y: 4), (X: -2; Y: 4), (X: -2; Y: 4), (X: -1; Y: 4), (X: 6; Y: 2), (X:-24; Y: 4)); AnimDeltaLeft: ((X: 1; Y: 4), (X: -1; Y: 4), (X: -2; Y: 4), (X: -2; Y: 4), (X: -2; Y: 2), (X: -5; Y: 4), (X: 26; Y: 4))), (LeftAnim: True; wX: 64; wY: 32; AnimSpeed:(3, 3, 3, 3, 3, 3, 3); //VILE + AnimCount: (2, 6, 9, 9, 10, 3, 1); AnimDeltaRight: ((X: 5; Y:-21), (X: 5; Y:-21), (X: 1; Y:-21), (X: 1; Y:-21), (X: 8; Y:-23), (X: -1; Y:-23), (X: 4; Y:-20)); AnimDeltaLeft: ((X: -8; Y:-21), (X: 5; Y:-21), (X: 1; Y:-21), (X: 1; Y:-21), (X:-10; Y:-24), (X: 3; Y:-23), (X: -4; Y:-22))), (LeftAnim: False; wX: 8; wY: 8; AnimSpeed:(2, 2, 2, 2, 3, 0, 1); //FISH + AnimCount: (2, 4, 1, 1, 2, 0, 3); AnimDeltaRight: ((X: -1; Y: 0), (X: -1; Y: 0), (X: -2; Y: -1), (X: -2; Y: -1), (X: -1; Y: -1), (X: -1; Y: -1), (X: -1; Y: -1)); AnimDeltaLeft: ((X: -1; Y: 0), (X: -1; Y: 0), (X: -2; Y: -1), (X: -2; Y: -1), (X: -1; Y: -1), (X: -1; Y: -1), (X: -1; Y: -1 ))), (LeftAnim: False; wX: 32; wY: 32; AnimSpeed:(3, 0, 3, 0, 0, 0, 5); //BARREL + AnimCount: (3, 0, 4, 0, 0, 0, 1); AnimDeltaRight: ((X: 0; Y:-15), (X: 0; Y:-15), (X: -1; Y:-15), (X: -1; Y:-15), (X: 0; Y:-15), (X: 0; Y:-15), (X: 0; Y:-15)); AnimDeltaLeft: ((X: 0; Y:-15), (X: 0; Y:-15), (X: -1; Y:-15), (X: -1; Y:-15), (X: 0; Y:-15), (X: 0; Y:-15), (X: 0; Y:-15))), (LeftAnim: False; wX: 95; wY: 57; AnimSpeed:(1, 2, 1, 0, 1, 1, 0); //ROBO + AnimCount: (1, 12, 1, 0, 2, 4, 0); AnimDeltaRight: ((X: -2; Y:-26), (X: -2; Y:-26), (X: 0; Y:-26), (X: 0; Y:-26), (X: 2; Y:-26), (X: 15; Y:-26), (X: -2; Y:-26)); AnimDeltaLeft: ((X: -2; Y:-26), (X: -2; Y:-26), (X: 0; Y:-26), (X: 0; Y:-26), (X: 2; Y:-26), (X: 15; Y:-26), (X: -2; Y:-26))), (LeftAnim: False; wX: 32; wY: 32; AnimSpeed:(3, 2, 2, 2, 2, 0, 5); //MAN + AnimCount: (2, 4, 7, 9, 2, 0, 1); AnimDeltaRight: ((X: 0; Y: -6), (X: 0; Y: -6), (X: -2; Y: 0), (X: 2; Y: 0), (X: 1; Y: -6), (X: 1; Y: -6), (X: 0; Y: -6)); AnimDeltaLeft: ((X: 0; Y: -6), (X: 0; Y: -6), (X: -2; Y: 0), (X: 2; Y: 0), (X: 1; Y: -6), (X: 1; Y: -6), (X: 0; Y: -6))) ); +// Таблица типов анимации монстров: + ANIMTABLE: Array [ANIM_SLEEP..ANIM_PAIN] of + record + name: String; + loop: Boolean; + end = ((name: 'SLEEP'; loop: True), + (name: 'GO'; loop: True), + (name: 'DIE'; loop: False), + (name: 'MESS'; loop: False), + (name: 'ATTACK'; loop: False), + (name: 'ATTACK2'; loop: False), + (name: 'PAIN'; loop: False)); implementation uses - e_log, g_sound, g_gfx, g_player, g_game, r_textures, r_animations, r_gfx, - g_weapons, g_triggers, g_items, g_options, - g_console, g_map, Math, g_menu, wadreader, + {$IFDEF ENABLE_MENU} + g_menu, + {$ENDIF} + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + {$IFDEF ENABLE_SHELLS} + g_shells, + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_corpses, + {$ENDIF} + e_log, g_sound, g_player, g_game, + g_weapons, g_triggers, g_items, g_options, g_window, + g_console, g_map, Math, wadreader, g_language, g_netmsg, idpool, utils, xstreams; @@ -623,19 +676,6 @@ end; const MONSTER_SIGNATURE = $534E4F4D; // 'MONS' -// Таблица типов анимации монстров: - ANIMTABLE: Array [ANIM_SLEEP..ANIM_PAIN] of - record - name: String; - loop: Boolean; - end = ((name: 'SLEEP'; loop: True), - (name: 'GO'; loop: True), - (name: 'DIE'; loop: False), - (name: 'MESS'; loop: False), - (name: 'ATTACK'; loop: False), - (name: 'ATTACK2'; loop: False), - (name: 'PAIN'; loop: False)); - MAX_ATM = 89; // Время ожидания после потери цели MAX_SOUL = 512; // Ограничение Lost_Soul'ов @@ -856,164 +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_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARREL_SLEEP', GameWAD+':MTEXTURES\BARREL_SLEEP', 64, 64, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARREL_DIE', GameWAD+':MTEXTURES\BARREL_DIE', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARREL_PAIN', GameWAD+':MTEXTURES\BARREL_PAIN', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_SLEEP', GameWAD+':MTEXTURES\ZOMBY_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_GO', GameWAD+':MTEXTURES\ZOMBY_GO', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_DIE', GameWAD+':MTEXTURES\ZOMBY_DIE', 64, 64, 6); - g_Game_StepLoading(6); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_MESS', GameWAD+':MTEXTURES\ZOMBY_MESS', 64, 64, 9); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_ATTACK', GameWAD+':MTEXTURES\ZOMBY_ATTACK', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_ATTACK_L', GameWAD+':MTEXTURES\ZOMBY_ATTACK_L', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ZOMBY_PAIN', GameWAD+':MTEXTURES\ZOMBY_PAIN', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_SLEEP', GameWAD+':MTEXTURES\SERG_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_GO', GameWAD+':MTEXTURES\SERG_GO', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_DIE', GameWAD+':MTEXTURES\SERG_DIE', 64, 64, 5); - g_Game_StepLoading(13); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_MESS', GameWAD+':MTEXTURES\SERG_MESS', 64, 64, 9); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_ATTACK', GameWAD+':MTEXTURES\SERG_ATTACK', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_ATTACK_L', GameWAD+':MTEXTURES\SERG_ATTACK_L', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SERG_PAIN', GameWAD+':MTEXTURES\SERG_PAIN', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MAN_SLEEP', GameWAD+':MTEXTURES\MAN_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MAN_GO', GameWAD+':MTEXTURES\MAN_GO', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MAN_DIE', GameWAD+':MTEXTURES\MAN_DIE', 64, 64, 7); - g_Game_StepLoading(20); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MAN_MESS', GameWAD+':MTEXTURES\MAN_MESS', 64, 64, 9); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MAN_ATTACK', GameWAD+':MTEXTURES\MAN_ATTACK', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MAN_PAIN', GameWAD+':MTEXTURES\MAN_PAIN', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_SLEEP', GameWAD+':MTEXTURES\CGUN_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_SLEEP_L', GameWAD+':MTEXTURES\CGUN_SLEEP_L', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_GO', GameWAD+':MTEXTURES\CGUN_GO', 64, 64, 4); - g_Game_StepLoading(26); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_GO_L', GameWAD+':MTEXTURES\CGUN_GO_L', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_DIE', GameWAD+':MTEXTURES\CGUN_DIE', 64, 64, 7); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_MESS', GameWAD+':MTEXTURES\CGUN_MESS', 64, 64, 6); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_ATTACK', GameWAD+':MTEXTURES\CGUN_ATTACK', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_ATTACK_L', GameWAD+':MTEXTURES\CGUN_ATTACK_L', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_PAIN', GameWAD+':MTEXTURES\CGUN_PAIN', 64, 64, 1); - g_Game_StepLoading(32); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CGUN_PAIN_L', GameWAD+':MTEXTURES\CGUN_PAIN_L', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_IMP_SLEEP', GameWAD+':MTEXTURES\IMP_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_IMP_GO', GameWAD+':MTEXTURES\IMP_GO', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_IMP_DIE', GameWAD+':MTEXTURES\IMP_DIE', 64, 64, 5); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_IMP_MESS', GameWAD+':MTEXTURES\IMP_MESS', 64, 64, 8); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_IMP_ATTACK', GameWAD+':MTEXTURES\IMP_ATTACK', 64, 64, 3); - g_Game_StepLoading(38); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_IMP_PAIN', GameWAD+':MTEXTURES\IMP_PAIN', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_DEMON_SLEEP', GameWAD+':MTEXTURES\DEMON_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_DEMON_GO', GameWAD+':MTEXTURES\DEMON_GO', 64, 64, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_DEMON_DIE', GameWAD+':MTEXTURES\DEMON_DIE', 64, 64, 6); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_DEMON_ATTACK', GameWAD+':MTEXTURES\DEMON_ATTACK', 64, 64, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_DEMON_PAIN', GameWAD+':MTEXTURES\DEMON_PAIN', 64, 64, 1); - g_Game_StepLoading(44); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SOUL_SLEEP', GameWAD+':MTEXTURES\SOUL_SLEEP', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SOUL_GO', GameWAD+':MTEXTURES\SOUL_GO', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SOUL_PAIN', GameWAD+':MTEXTURES\SOUL_PAIN', 64, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SOUL_ATTACK', GameWAD+':MTEXTURES\SOUL_ATTACK', 64, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SOUL_DIE', GameWAD+':MTEXTURES\SOUL_DIE', 128, 128, 7); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_FISH_SLEEP', GameWAD+':MTEXTURES\FISH_SLEEP', 32, 32, 2); - g_Game_StepLoading(50); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_FISH_GO', GameWAD+':MTEXTURES\FISH_GO', 32, 32, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_FISH_PAIN', GameWAD+':MTEXTURES\FISH_PAIN', 32, 32, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_FISH_ATTACK', GameWAD+':MTEXTURES\FISH_ATTACK', 32, 32, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_FISH_DIE', GameWAD+':MTEXTURES\FISH_DIE', 32, 32, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SPIDER_SLEEP', GameWAD+':MTEXTURES\SPIDER_SLEEP', 256, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SPIDER_GO', GameWAD+':MTEXTURES\SPIDER_GO', 256, 128, 6); - g_Game_StepLoading(56); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SPIDER_PAIN', GameWAD+':MTEXTURES\SPIDER_PAIN', 256, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SPIDER_PAIN_L', GameWAD+':MTEXTURES\SPIDER_PAIN_L', 256, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SPIDER_ATTACK', GameWAD+':MTEXTURES\SPIDER_ATTACK', 256, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SPIDER_DIE', GameWAD+':MTEXTURES\SPIDER_DIE', 256, 128, 10); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BSP_SLEEP', GameWAD+':MTEXTURES\BSP_SLEEP', 128, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BSP_GO', GameWAD+':MTEXTURES\BSP_GO', 128, 64, 6); - g_Game_StepLoading(62); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BSP_PAIN', GameWAD+':MTEXTURES\BSP_PAIN', 128, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BSP_PAIN_L', GameWAD+':MTEXTURES\BSP_PAIN_L', 128, 64, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BSP_ATTACK', GameWAD+':MTEXTURES\BSP_ATTACK', 128, 64, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BSP_DIE', GameWAD+':MTEXTURES\BSP_DIE', 128, 64, 7); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CACO_SLEEP', GameWAD+':MTEXTURES\CACO_SLEEP', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CACO_GO', GameWAD+':MTEXTURES\CACO_GO', 128, 128, 1); - g_Game_StepLoading(68); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CACO_PAIN', GameWAD+':MTEXTURES\CACO_PAIN', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CACO_ATTACK', GameWAD+':MTEXTURES\CACO_ATTACK', 128, 128, 6); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CACO_DIE', GameWAD+':MTEXTURES\CACO_DIE', 128, 128, 7); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_PAIN_SLEEP', GameWAD+':MTEXTURES\PAIN_SLEEP', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_PAIN_GO', GameWAD+':MTEXTURES\PAIN_GO', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_PAIN_PAIN', GameWAD+':MTEXTURES\PAIN_PAIN', 128, 128, 1); - g_Game_StepLoading(74); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_PAIN_ATTACK', GameWAD+':MTEXTURES\PAIN_ATTACK', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_PAIN_DIE', GameWAD+':MTEXTURES\PAIN_DIE', 128, 128, 7); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_SLEEP', GameWAD+':MTEXTURES\BARON_SLEEP', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_SLEEP_L', GameWAD+':MTEXTURES\BARON_SLEEP_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_GO', GameWAD+':MTEXTURES\BARON_GO', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_PAIN', GameWAD+':MTEXTURES\BARON_PAIN', 128, 128, 1); - g_Game_StepLoading(80); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_PAIN_L', GameWAD+':MTEXTURES\BARON_PAIN_L', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_ATTACK', GameWAD+':MTEXTURES\BARON_ATTACK', 128, 128, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_ATTACK_L', GameWAD+':MTEXTURES\BARON_ATTACK_L', 128, 128, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARON_DIE', GameWAD+':MTEXTURES\BARON_DIE', 128, 128, 7); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_SLEEP', GameWAD+':MTEXTURES\KNIGHT_SLEEP', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_SLEEP_L', GameWAD+':MTEXTURES\KNIGHT_SLEEP_L', 128, 128, 2); - g_Game_StepLoading(86); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_GO', GameWAD+':MTEXTURES\KNIGHT_GO', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_PAIN', GameWAD+':MTEXTURES\KNIGHT_PAIN', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_PAIN_L', GameWAD+':MTEXTURES\KNIGHT_PAIN_L', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_ATTACK', GameWAD+':MTEXTURES\KNIGHT_ATTACK', 128, 128, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_ATTACK_L', GameWAD+':MTEXTURES\KNIGHT_ATTACK_L', 128, 128, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_KNIGHT_DIE', GameWAD+':MTEXTURES\KNIGHT_DIE', 128, 128, 7); - g_Game_StepLoading(92); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MANCUB_SLEEP', GameWAD+':MTEXTURES\MANCUB_SLEEP', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MANCUB_GO', GameWAD+':MTEXTURES\MANCUB_GO', 128, 128, 6); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MANCUB_PAIN', GameWAD+':MTEXTURES\MANCUB_PAIN', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MANCUB_ATTACK', GameWAD+':MTEXTURES\MANCUB_ATTACK', 128, 128, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_MANCUB_DIE', GameWAD+':MTEXTURES\MANCUB_DIE', 128, 128, 10); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_SLEEP', GameWAD+':MTEXTURES\SKEL_SLEEP', 128, 128, 2); - g_Game_StepLoading(98); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_SLEEP_L', GameWAD+':MTEXTURES\SKEL_SLEEP_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_GO', GameWAD+':MTEXTURES\SKEL_GO', 128, 128, 6); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_PAIN', GameWAD+':MTEXTURES\SKEL_PAIN', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_PAIN_L', GameWAD+':MTEXTURES\SKEL_PAIN_L', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_ATTACK', GameWAD+':MTEXTURES\SKEL_ATTACK', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_ATTACK_L', GameWAD+':MTEXTURES\SKEL_ATTACK_L', 128, 128, 2); - g_Game_StepLoading(104); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_ATTACK2', GameWAD+':MTEXTURES\SKEL_ATTACK2', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_ATTACK2_L', GameWAD+':MTEXTURES\SKEL_ATTACK2_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_SKEL_DIE', GameWAD+':MTEXTURES\SKEL_DIE', 128, 128, 5); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_SLEEP', GameWAD+':MTEXTURES\VILE_SLEEP', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_SLEEP_L', GameWAD+':MTEXTURES\VILE_SLEEP_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_GO', GameWAD+':MTEXTURES\VILE_GO', 128, 128, 6); - g_Game_StepLoading(110); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_PAIN', GameWAD+':MTEXTURES\VILE_PAIN', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_PAIN_L', GameWAD+':MTEXTURES\VILE_PAIN_L', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_ATTACK', GameWAD+':MTEXTURES\VILE_ATTACK', 128, 128, 10); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_ATTACK_L', GameWAD+':MTEXTURES\VILE_ATTACK_L', 128, 128, 10); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_ATTACK2', GameWAD+':MTEXTURES\VILE_ATTACK2', 128, 128, 3); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_ATTACK2_L', GameWAD+':MTEXTURES\VILE_ATTACK2_L', 128, 128, 3); - g_Game_StepLoading(116); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_VILE_DIE', GameWAD+':MTEXTURES\VILE_DIE', 128, 128, 9); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ROBO_SLEEP', GameWAD+':MTEXTURES\ROBO_SLEEP', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ROBO_GO', GameWAD+':MTEXTURES\ROBO_GO', 128, 128, 12); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ROBO_ATTACK', GameWAD+':MTEXTURES\ROBO_ATTACK', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ROBO_ATTACK2', GameWAD+':MTEXTURES\ROBO_ATTACK2', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_ROBO_DIE', GameWAD+':MTEXTURES\ROBO_DIE', 128, 128, 1); - g_Game_StepLoading(122); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_SLEEP', GameWAD+':MTEXTURES\CYBER_SLEEP', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_SLEEP_L', GameWAD+':MTEXTURES\CYBER_SLEEP_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_GO', GameWAD+':MTEXTURES\CYBER_GO', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_GO_L', GameWAD+':MTEXTURES\CYBER_GO_L', 128, 128, 4); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_PAIN', GameWAD+':MTEXTURES\CYBER_PAIN', 128, 128, 1); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_PAIN_L', GameWAD+':MTEXTURES\CYBER_PAIN_L', 128, 128, 1); - g_Game_StepLoading(128); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_ATTACK', GameWAD+':MTEXTURES\CYBER_ATTACK', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_ATTACK_L', GameWAD+':MTEXTURES\CYBER_ATTACK_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_ATTACK2', GameWAD+':MTEXTURES\CYBER_ATTACK2', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_ATTACK2_L', GameWAD+':MTEXTURES\CYBER_ATTACK2_L', 128, 128, 2); - g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_DIE', GameWAD+':MTEXTURES\CYBER_DIE', 128, 128, 9); - 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'); @@ -1105,140 +987,6 @@ procedure g_Monsters_FreeData(); begin e_WriteLog('Releasing monsters data...', TMsgType.Notify); - g_Frames_DeleteByName('FRAMES_MONSTER_BARREL_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARREL_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARREL_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_MESS'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_ZOMBY_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_MESS'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_SERG_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_MAN_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_MAN_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_MAN_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_MAN_MESS'); - g_Frames_DeleteByName('FRAMES_MONSTER_MAN_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_MAN_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_SLEEP_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_GO_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_MESS'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_CGUN_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_IMP_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_IMP_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_IMP_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_IMP_MESS'); - g_Frames_DeleteByName('FRAMES_MONSTER_IMP_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_IMP_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_DEMON_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_DEMON_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_DEMON_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_DEMON_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_DEMON_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_SOUL_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_SOUL_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_SOUL_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_SOUL_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_SOUL_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_FISH_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_FISH_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_FISH_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_FISH_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_FISH_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_SPIDER_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_SPIDER_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_SPIDER_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_SPIDER_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_SPIDER_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_SPIDER_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_BSP_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_BSP_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_BSP_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_BSP_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_BSP_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_BSP_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_CACO_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_CACO_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_CACO_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_CACO_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_CACO_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_PAIN_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_PAIN_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_PAIN_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_PAIN_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_PAIN_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_SLEEP_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_BARON_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_SLEEP_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_KNIGHT_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_MANCUB_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_MANCUB_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_MANCUB_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_MANCUB_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_MANCUB_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_SLEEP_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_ATTACK2'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_ATTACK2_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_SKEL_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_SLEEP_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_ATTACK2'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_ATTACK2_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_VILE_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_ROBO_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_ROBO_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_ROBO_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_ROBO_ATTACK2'); - g_Frames_DeleteByName('FRAMES_MONSTER_ROBO_DIE'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_SLEEP'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_SLEEP_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_GO'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_GO_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_PAIN'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_PAIN_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_ATTACK'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_ATTACK_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_ATTACK2'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_ATTACK2_L'); - g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_DIE'); - g_Sound_Delete('SOUND_MONSTER_BARREL_DIE'); g_Sound_Delete('SOUND_MONSTER_PAIN'); @@ -1848,7 +1596,9 @@ begin FDieTriggers := nil; FWaitAttackAnim := False; FChainFire := False; - FShellTimer := -1; + {$IFDEF ENABLE_SHELLS} + FShellTimer := -1; + {$ENDIF} FState := MONSTATE_SLEEP; FCurAnim := ANIM_SLEEP; @@ -1863,11 +1613,7 @@ begin end; constructor TMonster.Create(MonsterType: Byte; aID: Integer; ForcedUID: Integer = -1); -var - a: Integer; - FramesID: DWORD = 0; - s: String; - res: Boolean; + var a: Integer; begin if ForcedUID < 0 then FUID := g_CreateUID(UID_MONSTER) @@ -1889,7 +1635,9 @@ begin FChainFire := False; FStartID := aID; FNoRespawn := False; - FShellTimer := -1; + {$IFDEF ENABLE_SHELLS} + FShellTimer := -1; + {$ENDIF} FBehaviour := BH_NORMAL; FFireTime := 0; FFirePainTime := 0; @@ -1902,6 +1650,7 @@ begin mplatCheckFrameId := 0; mNeedSend := false; +{$IFDEF ENABLE_GFX} if FMonsterType in [MONSTER_ROBO, MONSTER_BARREL] then FBloodKind := BLOOD_SPARKS else @@ -1924,69 +1673,16 @@ begin FBloodGreen := 0; FBloodBlue := 0; end; +{$ENDIF} SetLength(FAnim, Length(ANIMTABLE)); - - for a := 0 to High(FAnim) do + for a := ANIM_SLEEP to ANIM_PAIN do begin - FAnim[a, TDirection.D_LEFT] := nil; - FAnim[a, TDirection.D_RIGHT] := nil; + 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; - for a := ANIM_SLEEP to ANIM_PAIN do - if (ANIMTABLE[a].name <> '') and - (MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a] <> 0) then - begin - s := 'FRAMES_MONSTER_'+MONSTERTABLE[MonsterType].Name+ - '_'+ANIMTABLE[a].name; - - res := g_Frames_Exists(s); - - if res then - res := g_Frames_Get(FramesID, s); - - // Если нет такой анимации, то пробуем заменить ее на анимацию смерти: - if (not res) then - begin - // Заменяем только ANIM_MESS на ANIM_DIE: - if a <> ANIM_MESS then - Continue; - - if g_Frames_Get(FramesID, 'FRAMES_MONSTER_'+MONSTERTABLE[MonsterType].Name+ - '_'+ANIMTABLE[ANIM_DIE].name) then - begin - FAnim[a, TDirection.D_RIGHT] := TAnimation.Create(FramesID, ANIMTABLE[ANIM_DIE].loop, - MONSTER_ANIMTABLE[MonsterType].AnimSpeed[ANIM_DIE]); - FAnim[a, TDirection.D_LEFT] := TAnimation.Create(FramesID, ANIMTABLE[ANIM_DIE].loop, - MONSTER_ANIMTABLE[MonsterType].AnimSpeed[ANIM_DIE]); - Continue; - end; - end; - - FAnim[a, TDirection.D_RIGHT] := TAnimation.Create(FramesID, ANIMTABLE[a].loop, - MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a]); - - // Если есть отдельная левая анимация - загружаем: - if MONSTER_ANIMTABLE[MonsterType].LeftAnim then - begin - s := 'FRAMES_MONSTER_'+MONSTERTABLE[MonsterType].Name+ - '_'+ANIMTABLE[a].name+'_L'; - if g_Frames_Exists(s) then - g_Frames_Get(FramesID, s); - end; - - FAnim[a, TDirection.D_LEFT] := TAnimation.Create(FramesID, ANIMTABLE[a].loop, - MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a]); - end; - -// Для колдуна загружаем также анимацию огня: - if MonsterType = MONSTER_VILE then - begin - g_Frames_Get(FramesID, 'FRAMES_FIRE'); - vilefire := TAnimation.Create(FramesID, True, 2); - end - else - vilefire := nil; + FVileFireTime := gTime; end; function TMonster.Damage(aDamage: Word; VelX, VelY: Integer; SpawnerUID: Word; t: Byte): Boolean; @@ -2179,11 +1875,11 @@ var begin for a := 0 to High(FAnim) do begin - FAnim[a, TDirection.D_LEFT].Free(); - FAnim[a, TDirection.D_RIGHT].Free(); + FAnim[a, TDirection.D_LEFT].Invalidate; + FAnim[a, TDirection.D_RIGHT].Invalidate; end; - vilefire.Free(); + FVileFireTime := 0; if (mProxyId <> -1) then begin @@ -2211,6 +1907,7 @@ end; 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), @@ -2219,14 +1916,17 @@ begin 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); @@ -2286,7 +1986,7 @@ begin // Если анимация новая - перезапускаем её: if FCurAnim <> Anim then - if FAnim[Anim, FDirection] <> nil then + if FAnim[Anim, FDirection].IsValid() then begin FAnim[Anim, FDirection].Reset(); FCurAnim := Anim; @@ -2310,12 +2010,13 @@ begin if not silent then begin g_Sound_PlayExAt('SOUND_GAME_TELEPORT', Obj.X, Obj.Y); - r_GFX_OnceAnim( +{$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, @@ -2345,12 +2046,13 @@ begin // Эффект телепорта в точке назначения: if not silent then begin - r_GFX_OnceAnim( +{$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, @@ -2368,14 +2070,20 @@ begin end; procedure TMonster.Update(); -var - a, b, sx, sy, wx, wy, oldvelx: Integer; - st: Word; - o, co: TObj; - fall, bubbles: Boolean; - mon: TMonster; - mit: PMonster; - it: TMonsterGrid.Iter; + {$IFDEF ENABLE_CORPSES} + var co: TObj; + {$ENDIF} + {$IF DEFINED(ENABLE_GIBS) OR DEFINED(ENABLE_CORPSES)} + var b: Integer; + {$ENDIF} + var + a, sx, sy, wx, wy, oldvelx: Integer; + st: Word; + o: TObj; + fall, bubbles: Boolean; + mon: TMonster; + mit: PMonster; + it: TMonsterGrid.Iter; label _end; begin @@ -2480,18 +2188,20 @@ begin // Возможно, создаем пузырьки в воде: if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then begin - case FMonsterType of - MONSTER_FISH: - if Random(4) <> 0 then bubbles := False else + {$IFDEF ENABLE_GFX} + case FMonsterType of + MONSTER_FISH: + if Random(4) <> 0 then bubbles := False else + g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width), + FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0); + 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); - 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 - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4), - FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4); - end; + else + g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4), + FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4); + end; + {$ENDIF} if bubbles then if Random(2) = 0 then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y) else g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y); @@ -2523,25 +2233,35 @@ begin // Таймер - ждем после потери цели: FTargetTime := FTargetTime + 1; -// Гильзы +{$IFDEF ENABLE_SHELLS} + // Гильзы if FShellTimer > -1 then + begin if FShellTimer = 0 then begin if FShellType = SHELL_SHELL then - g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), + begin + g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), GameVelX, GameVelY-2, SHELL_SHELL) + end else if FShellType = SHELL_DBLSHELL then begin - g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), + g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), GameVelX-1, GameVelY-2, SHELL_SHELL); - g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), + g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), GameVelX+1, GameVelY-2, SHELL_SHELL); end; FShellTimer := -1; - end else Dec(FShellTimer); + end + else + begin + Dec(FShellTimer); + end; + end; +{$ENDIF} // Пробуем увернуться от летящей пули: if fall then @@ -2806,48 +2526,52 @@ begin 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)); // направо - end; - end; - end; - end; - // Боссы могут пинать трупы: - if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and - (FObj.Vel.X <> 0) and (gCorpses <> nil) then - begin - b := Abs(FObj.Vel.X); - if b > 1 then b := b * (Random(8 div b) + 1); - for a := 0 to High(gCorpses) do - if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then - begin - co := gCorpses[a].Obj; - if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, - FObj.Rect.Width, 8, @co) and (Random(3) = 0) then - // Пинаем трупы + // Пинаем куски if FObj.Vel.X < 0 then - gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево + end else - gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо + end; + end; end; - end; + end; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + // Боссы могут пинать трупы: + if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and + (FObj.Vel.X <> 0) and (gCorpses <> nil) then + begin + b := Abs(FObj.Vel.X); + if b > 1 then b := b * (Random(8 div b) + 1); + for a := 0 to High(gCorpses) do + if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then + begin + co := gCorpses[a].Obj; + if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, + FObj.Rect.Width, 8, @co) and (Random(3) = 0) then + // Пинаем трупы + if FObj.Vel.X < 0 then + gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево + else + gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо + end; + end; + {$ENDIF} // Если цель высоко, то, возможно, прыгаем: if sy < -40 then if g_Obj_CollideLevel(@FObj, 0, 1) or g_Obj_StayOnStep(@FObj) then @@ -3049,13 +2773,9 @@ _end: SetState(MONSTATE_GO); end; -// Если есть анимация огня колдуна - пусть она идет: - if vilefire <> nil then - vilefire.Update(); - // Состояние - Умирает и текущая анимация проиграна: if (FState = MONSTATE_DIE) and - (FAnim[FCurAnim, FDirection] <> nil) and + (FAnim[FCurAnim, FDirection].IsValid()) and (FAnim[FCurAnim, FDirection].Played) then begin // Умер: @@ -3106,7 +2826,7 @@ _end: // Совершение атаки и стрельбы: if (FState = MONSTATE_ATTACK) or (FState = MONSTATE_SHOOT) then - if (FAnim[FCurAnim, FDirection] <> nil) then + if (FAnim[FCurAnim, FDirection].IsValid()) then // Анимация атаки есть - можно атаковать if (FAnim[FCurAnim, FDirection].Played) then begin // Анимация атаки закончилась => переходим на шаг @@ -3220,20 +2940,26 @@ _end: begin g_Sound_PlayExAt('SOUND_WEAPON_FIREPISTOL', wx, wy); g_Weapon_gun(wx, wy, tx, ty, 1, 3, FUID, True); - g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET); + {$IFDEF ENABLE_SHELLS} + g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET); + {$ENDIF} end; MONSTER_SERG: begin g_Weapon_shotgun(wx, wy, tx, ty, FUID); if not gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', wx, wy); - FShellTimer := 10; - FShellType := SHELL_SHELL; + {$IFDEF ENABLE_SHELLS} + FShellTimer := 10; + FShellType := SHELL_SHELL; + {$ENDIF} end; MONSTER_MAN: begin g_Weapon_dshotgun(wx, wy, tx, ty, FUID); - FShellTimer := 13; - FShellType := SHELL_DBLSHELL; + {$IFDEF ENABLE_SHELLS} + FShellTimer := 13; + FShellType := SHELL_DBLSHELL; + {$ENDIF} FAmmo := -36; end; MONSTER_CYBER: @@ -3247,13 +2973,17 @@ _end: begin g_Weapon_mgun(wx, wy, tx, ty, FUID); if not gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', wx, wy); - g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET); + {$IFDEF ENABLE_SHELLS} + g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET); + {$ENDIF} end; MONSTER_SPIDER: begin g_Weapon_mgun(wx, wy, tx, ty, FUID); if not gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', wx, wy); - g_Player_CreateShell(wx, wy, 0, -2, SHELL_SHELL); + {$IFDEF ENABLE_SHELLS} + g_Shells_Create(wx, wy, 0, -2, SHELL_SHELL); + {$ENDIF} end; MONSTER_BSP: g_Weapon_aplasma(wx, wy, tx, ty, FUID); @@ -3337,7 +3067,7 @@ _end: FObj.Vel.X := oldvelx; // Если есть анимация, то пусть она идет: - if FAnim[FCurAnim, FDirection] <> nil then + if FAnim[FCurAnim, FDirection].IsValid() then FAnim[FCurAnim, FDirection].Update(); end; @@ -3363,11 +3093,14 @@ begin end; procedure TMonster.ClientUpdate(); -var - a, b, sx, sy, oldvelx: Integer; - st: Word; - o, co: TObj; - fall, bubbles: Boolean; + {$IFDEF ENABLE_CORPSES} + var a, b: Integer; co: TObj; + {$ENDIF} + var + sx, sy, oldvelx: Integer; + st: Word; + o: TObj; + fall, bubbles: Boolean; label _end; begin @@ -3442,18 +3175,20 @@ begin // Возможно, создаем пузырьки в воде: if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then begin - case FMonsterType of - MONSTER_FISH: - if Random(4) <> 0 then bubbles := False else + {$IFDEF ENABLE_GFX} + case FMonsterType of + MONSTER_FISH: + if Random(4) <> 0 then bubbles := False else + g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width), + FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0); + 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); - 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 - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4), - FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4); - end; + else + g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4), + FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4); + end; + {$ENDIF} if bubbles then if Random(2) = 0 then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y) else g_Sound_PlayExAt('SOUND_GAME_BUBBLE2', FObj.X, FObj.Y); @@ -3485,24 +3220,34 @@ begin // Таймер - ждем после потери цели: FTargetTime := FTargetTime + 1; +{$IFDEF ENABLE_SHELLS} if FShellTimer > -1 then + begin if FShellTimer = 0 then begin if FShellType = SHELL_SHELL then - g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), + begin + g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), GameVelX, GameVelY-2, SHELL_SHELL) + end else if FShellType = SHELL_DBLSHELL then begin - g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), + g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), GameVelX-1, GameVelY-2, SHELL_SHELL); - g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), + g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), GameVelX+1, GameVelY-2, SHELL_SHELL); end; FShellTimer := -1; - end else Dec(FShellTimer); + end + else + begin + Dec(FShellTimer); + end; + end; +{$ENDIF} // Пробуем увернуться от летящей пули: if fall then @@ -3656,49 +3401,53 @@ begin 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 - 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)); // направо - end; - positionChanged(); // this updates spatial accelerators - end; - end; - end; - // Боссы могут пинать трупы: - if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and - (FObj.Vel.X <> 0) and (gCorpses <> nil) then - begin - b := Abs(FObj.Vel.X); - if b > 1 then b := b * (Random(8 div b) + 1); - for a := 0 to High(gCorpses) do - if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then - begin - co := gCorpses[a].Obj; - if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, - FObj.Rect.Width, 8, @co) and (Random(3) = 0) then - // Пинаем трупы + // Пинаем куски if FObj.Vel.X < 0 then - gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево + end else - gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо + end; + positionChanged(); // this updates spatial accelerators + end; end; - end; + end; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + // Боссы могут пинать трупы: + if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and + (FObj.Vel.X <> 0) and (gCorpses <> nil) then + begin + b := Abs(FObj.Vel.X); + if b > 1 then b := b * (Random(8 div b) + 1); + for a := 0 to High(gCorpses) do + if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then + begin + co := gCorpses[a].Obj; + if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, + FObj.Rect.Width, 8, @co) and (Random(3) = 0) then + // Пинаем трупы + if FObj.Vel.X < 0 then + gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево + else + gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо + end; + end; + {$ENDIF} end; FSleep := FSleep + 1; @@ -3883,13 +3632,9 @@ _end: SetState(MONSTATE_GO); end; -// Если есть анимация огня колдуна - пусть она идет: - if vilefire <> nil then - vilefire.Update(); - // Состояние - Умирает и текущая анимация проиграна: if (FState = MONSTATE_DIE) and - (FAnim[FCurAnim, FDirection] <> nil) and + (FAnim[FCurAnim, FDirection].IsValid()) and (FAnim[FCurAnim, FDirection].Played) then begin // Умер: @@ -3906,7 +3651,7 @@ _end: // Совершение атаки и стрельбы: if (FState = MONSTATE_ATTACK) or (FState = MONSTATE_SHOOT) then - if (FAnim[FCurAnim, FDirection] <> nil) then + if (FAnim[FCurAnim, FDirection].IsValid()) then // Анимация атаки есть - можно атаковать if (FAnim[FCurAnim, FDirection].Played) then begin // Анимация атаки закончилась => переходим на шаг @@ -4032,7 +3777,7 @@ _end: FObj.Vel.X := oldvelx; // Если есть анимация, то пусть она идет: - if FAnim[FCurAnim, FDirection] <> nil then + if FAnim[FCurAnim, FDirection].IsValid() then FAnim[FCurAnim, FDirection].Update(); end; @@ -4042,24 +3787,32 @@ begin MONSTER_ZOMBY: begin g_Sound_PlayExAt('SOUND_WEAPON_FIREPISTOL', wx, wy); - g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET); + {$IFDEF ENABLE_SHELLS} + g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET); + {$ENDIF} end; MONSTER_SERG: begin g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', wx, wy); - FShellTimer := 10; - FShellType := SHELL_SHELL; + {$IFDEF ENABLE_SHELLS} + FShellTimer := 10; + FShellType := SHELL_SHELL; + {$ENDIF} end; MONSTER_MAN: begin g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN2', wx, wy); - FShellTimer := 13; - FShellType := SHELL_DBLSHELL; + {$IFDEF ENABLE_SHELLS} + FShellTimer := 13; + FShellType := SHELL_DBLSHELL; + {$ENDIF} end; MONSTER_CGUN, MONSTER_SPIDER: begin g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', wx, wy); - g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET); + {$IFDEF ENABLE_SHELLS} + g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET); + {$ENDIF} end; MONSTER_IMP: g_Weapon_ball1(wx, wy, atx, aty, FUID); @@ -4350,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); @@ -4413,6 +4166,7 @@ var i: Integer; b: Byte; anim: Boolean; + stub: TAnimState; begin assert(st <> nil); @@ -4462,23 +4216,28 @@ begin // Объект монстра Obj_SaveState(st, @FObj); // Есть ли анимация огня колдуна - anim := (vilefire <> nil); + anim := FMonsterType = MONSTER_VILE; utils.writeBool(st, anim); // Если есть - сохраняем: - if anim then vilefire.SaveState(st); + 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 // Есть ли левая анимация - anim := (FAnim[i, TDirection.D_LEFT] <> nil); + anim := (FAnim[i, TDirection.D_LEFT].IsValid()); utils.writeBool(st, anim); // Если есть - сохраняем - if anim then FAnim[i, TDirection.D_LEFT].SaveState(st); + if anim then FAnim[i, TDirection.D_LEFT].SaveState(st, 0, False); // Есть ли правая анимация - anim := (FAnim[i, TDirection.D_RIGHT] <> nil); + anim := (FAnim[i, TDirection.D_RIGHT].IsValid()); utils.writeBool(st, anim); // Если есть - сохраняем - if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st); + if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st, 0, False); end; end; @@ -4486,8 +4245,9 @@ end; procedure TMonster.LoadState (st: TStream); var i: Integer; - b: Byte; - anim: Boolean; + b, alpha: Byte; + anim, blending: Boolean; + stub: TAnimState; begin assert(st <> nil); @@ -4546,9 +4306,11 @@ begin // Если есть - загружаем: if anim then begin - Assert(vilefire <> nil, 'TMonster.LoadState: no vilefire anim'); - vilefire.LoadState(st); + 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 @@ -4557,16 +4319,16 @@ begin // Если есть - загружаем if anim then begin - Assert(FAnim[i, TDirection.D_LEFT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_left anim'); - FAnim[i, TDirection.D_LEFT].LoadState(st); + Assert(FAnim[i, TDirection.D_LEFT].IsValid(), 'TMonster.LoadState: no '+IntToStr(i)+'_left anim'); + FAnim[i, TDirection.D_LEFT].LoadState(st, alpha, blending); end; // Есть ли правая анимация anim := utils.readBool(st); // Если есть - загружаем if anim then begin - Assert(FAnim[i, TDirection.D_RIGHT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_right anim'); - FAnim[i, TDirection.D_RIGHT].LoadState(st); + Assert(FAnim[i, TDirection.D_RIGHT].IsValid(), 'TMonster.LoadState: no '+IntToStr(i)+'_right anim'); + FAnim[i, TDirection.D_RIGHT].LoadState(st, alpha, blending); end; end; // update cache @@ -4614,17 +4376,20 @@ begin 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); - r_GFX_OnceAnim(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;