X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=cde1aad4dff139c91b8ffdf65997fa9ce4ba1a3e;hb=e706b4fd119a5f468477a139daa7a1ae87a9cd7e;hp=fb8ee7cf6205107d6d17a161030b83645f62f145;hpb=ac201b02f10ef558087d50f6b03b4519ab567558;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index fb8ee7c..cde1aad 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -1,3 +1,18 @@ +(* Copyright (C) DooM 2D:Forever Developers + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) {$MODE DELPHI} unit g_monsters; @@ -49,6 +64,7 @@ type FPain: Integer; FSleep: Integer; FPainSound: Boolean; + FPainTicks: Integer; FWaitAttackAnim: Boolean; FChainFire: Boolean; tx, ty: Integer; @@ -295,9 +311,9 @@ const 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, 0, 3); //CYBER - AnimDeltaRight: ((X: 2; Y: -6), (X: 2; Y: -6), (X: -3; Y: -4), (X: -3; Y: -4), (X: 25; Y: -6), (X: 25; 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:-26; Y: -3), (X: 1; Y: -3))), + (LeftAnim: True; wX: 70; wY: 73; AnimSpeed:(3, 3, 3, 3, 3, 4, 3); //CYBER + 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 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)); @@ -643,6 +659,8 @@ begin g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_PAIN_L', GameWAD+':MTEXTURES\CYBER_PAIN_L', 128, 128, 1); 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_SetLoadingText(_lc[I_LOAD_MONSTER_SOUNDS], 0, False); @@ -859,6 +877,8 @@ begin 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'); @@ -1249,6 +1269,7 @@ begin Exit; FPainSound := True; + FPainTicks := 20; case FMonsterType of MONSTER_IMP, MONSTER_ZOMBY, MONSTER_SERG, @@ -1256,7 +1277,7 @@ begin g_Sound_PlayExAt('SOUND_MONSTER_PAIN', FObj.X, FObj.Y); MONSTER_SOUL, MONSTER_BARON, MONSTER_CACO, MONSTER_KNIGHT, MONSTER_DEMON, MONSTER_SPIDER, - MONSTER_CYBER: + MONSTER_BSP, MONSTER_CYBER: g_Sound_PlayExAt('SOUND_MONSTER_PAIN2', FObj.X, FObj.Y); MONSTER_VILE: g_Sound_PlayExAt('SOUND_MONSTER_VILE_PAIN', FObj.X, FObj.Y); @@ -1996,7 +2017,10 @@ begin Exit; end; - FPainSound := False; + if FPainTicks > 0 then + Dec(FPainTicks) + else + FPainSound := False; // Äâèãàåìñÿ: st := g_Obj_Move(@FObj, fall, True, True); @@ -2119,6 +2143,8 @@ begin FPain := MONSTERTABLE[FMonsterType].Pain; if gSoundEffectsDF then PainSound(); end; + if (not gSoundEffectsDF) and (FPain >= MONSTERTABLE[FMonsterType].MinPain) then + PainSound(); // Ñíèæàåì áîëü ñî âðåìåíåì: FPain := FPain - 5; @@ -2243,8 +2269,11 @@ begin if g_Obj_Collide(@FObj, @o) and (FTargetUID <> 0) then begin FTargetTime := 0; - if kick(@o) then - goto _end; + if (FMonsterType <> MONSTER_CYBER) or (Random(2) = 0) then + begin + if kick(@o) then + goto _end; + end; end; // Ðàññòîÿíèå äî öåëè: @@ -2703,13 +2732,13 @@ _end: if g_Weapon_Hit(@FObj, 10, FUID, HIT_SOME) <> 0 then g_Sound_PlayExAt('SOUND_MONSTER_FISH_ATTACK', FObj.X, FObj.Y); - MONSTER_SKEL, MONSTER_ROBO: - // Ðîáîò èëè ñêåëåò ñèëüíî ïèíàþòñÿ: + MONSTER_SKEL, MONSTER_ROBO, MONSTER_CYBER: + // Ðîáîò, êèáåð èëè ñêåëåò ñèëüíî ïèíàþòñÿ: if FCurAnim = ANIM_ATTACK2 then begin o := FObj; - o.Vel.X := IfThen(FDirection = D_RIGHT, 1, -1)*50; - if g_Weapon_Hit(@o, 50, FUID, HIT_SOME) <> 0 then + o.Vel.X := IfThen(FDirection = D_RIGHT, 1, -1)*IfThen(FMonsterType = MONSTER_CYBER, 60, 50); + if g_Weapon_Hit(@o, IfThen(FMonsterType = MONSTER_CYBER, 33, 50), FUID, HIT_SOME) <> 0 then g_Sound_PlayExAt('SOUND_MONSTER_SKEL_HIT', FObj.X, FObj.Y); end; @@ -2926,7 +2955,10 @@ begin Exit; end; - FPainSound := False; + if FPainTicks > 0 then + Dec(FPainTicks) + else + FPainSound := False; // Äâèãàåìñÿ: st := g_Obj_Move(@FObj, fall, True, True); @@ -3031,8 +3063,10 @@ begin if FPain >= MONSTERTABLE[FMonsterType].Pain then begin FPain := MONSTERTABLE[FMonsterType].Pain; - PainSound(); + if gSoundEffectsDF then PainSound(); end; + if (not gSoundEffectsDF) and (FPain >= MONSTERTABLE[FMonsterType].MinPain) then + PainSound(); // Ñíèæàåì áîëü ñî âðåìåíåì: FPain := FPain - 5; @@ -3456,13 +3490,13 @@ _end: MONSTER_FISH: g_Weapon_Hit(@FObj, 10, FUID, HIT_SOME); - MONSTER_SKEL, MONSTER_ROBO: - // Ðîáîò èëè ñêåëåò ñèëüíî ïèíàþòñÿ: + MONSTER_SKEL, MONSTER_ROBO, MONSTER_CYBER: + // Ðîáîò, êèáåð èëè ñêåëåò ñèëüíî ïèíàþòñÿ: if FCurAnim = ANIM_ATTACK2 then begin o := FObj; - o.Vel.X := IfThen(FDirection = D_RIGHT, 1, -1)*50; - g_Weapon_Hit(@o, 50, FUID, HIT_SOME); + o.Vel.X := IfThen(FDirection = D_RIGHT, 1, -1)*IfThen(FMonsterType = MONSTER_CYBER, 60, 50); + g_Weapon_Hit(@o, IfThen(FMonsterType = MONSTER_CYBER, 33, 50), FUID, HIT_SOME); end; MONSTER_VILE: @@ -3753,13 +3787,7 @@ begin g_Sound_PlayExAt('SOUND_MONSTER_IMP_ATTACK', FObj.X, FObj.Y); Result := True; end; - MONSTER_SKEL: - begin - SetState(STATE_ATTACK, ANIM_ATTACK2); - g_Sound_PlayExAt('SOUND_MONSTER_SKEL_ATTACK', FObj.X, FObj.Y); - Result := True; - end; - MONSTER_ROBO: + MONSTER_SKEL, MONSTER_ROBO, MONSTER_CYBER: begin SetState(STATE_ATTACK, ANIM_ATTACK2); g_Sound_PlayExAt('SOUND_MONSTER_SKEL_ATTACK', FObj.X, FObj.Y);