X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=f4d7e4280877354457ee0438a773135ae03861fa;hb=c4a4cd2a79cf488baac50e99b6c796d1ede4c7fc;hp=15790197f17980f45913930944a37349e8bec432;hpb=dfd3e97bffa213f5b21206b8a292b80180bab948;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 1579019..f4d7e42 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -1,3 +1,19 @@ +(* 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; interface @@ -158,7 +174,7 @@ implementation uses e_log, g_main, g_sound, g_gfx, g_player, g_game, g_weapons, g_triggers, MAPDEF, g_items, g_options, - g_console, g_map, Math, SysUtils, g_menu, WADEDITOR, + g_console, g_map, Math, SysUtils, g_menu, wadreader, g_language, g_netmsg; const @@ -220,7 +236,7 @@ const (Name:'SERG'; Rect:(X:15; Y:8; Width:34; Height:52); Health:20; RunVel: 3; MinPain: 0; Pain: 10; Jump: 10), - + (Name:'CYBER'; Rect:(X:24; Y:9; Width:80; Height:110); Health:500; RunVel: 5; MinPain: 50; Pain: 70; Jump: 10), @@ -294,7 +310,7 @@ 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 + (LeftAnim: True; wX: 70; wY: 73; AnimSpeed:(3, 3, 3, 3, 3, 3, 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))), @@ -642,6 +658,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_KICK', 128, 128, 2); + g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_CYBER_ATTACK2_L', GameWAD+':MTEXTURES\CYBER_KICK_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); @@ -858,6 +876,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_KICK'); + g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_KICK_L'); g_Frames_DeleteByName('FRAMES_MONSTER_CYBER_DIE'); g_Sound_Delete('SOUND_MONSTER_BARREL_DIE'); @@ -1051,7 +1071,7 @@ begin gMonsters[a].Update(); end else - begin + begin gMonsters[a].Free(); gMonsters[a] := nil; end; @@ -1416,7 +1436,7 @@ begin FWaitAttackAnim := False; FChainFire := False; FShellTimer := -1; - + FState := STATE_SLEEP; FCurAnim := ANIM_SLEEP; @@ -1790,7 +1810,7 @@ begin // Ýòî çíà÷èò: dX := -frameWidth - animDeltaX + hitX + hitWidth + hitX end; end - else // Ïðàâàÿ àíèìàöèÿ + else // Ïðàâàÿ àíèìàöèÿ begin dx := MONSTER_ANIMTABLE[FMonsterType].AnimDeltaRight[FCurAnim].X; dy := MONSTER_ANIMTABLE[FMonsterType].AnimDeltaRight[FCurAnim].Y; @@ -1876,7 +1896,7 @@ begin FObj.Rect := MONSTERTABLE[FMonsterType].Rect; FHealth := MONSTERTABLE[FMonsterType].Health; - FAmmo := 0; + FAmmo := 0; FPain := 0; end; else Exit; @@ -1886,7 +1906,7 @@ begin if ForceAnim <> 255 then Anim := ForceAnim; -// Åñëè àíèìàöèÿ íîâàÿ - ïåðåçàïóñêàåì å¸: +// Åñëè àíèìàöèÿ íîâàÿ - ïåðåçàïóñêàåì å¸: if FCurAnim <> Anim then if FAnim[Anim, FDirection] <> nil then begin @@ -2272,7 +2292,7 @@ begin FDirection := D_LEFT else FDirection := D_RIGHT; - + goto _end; end; @@ -2675,7 +2695,7 @@ _end: FWaitAttackAnim := False; end - + else // Àíèìàöèÿ àòàêè åùå èäåò (èñêëþ÷åíèå - Lost_Soul): if (FMonsterType = MONSTER_SOUL) or ( (not FWaitAttackAnim) and @@ -2702,13 +2722,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 + 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; @@ -3430,7 +3450,7 @@ _end: FWaitAttackAnim := False; end - + else // Àíèìàöèÿ àòàêè åùå èäåò (èñêëþ÷åíèå - Lost_Soul): if (FMonsterType = MONSTER_SOUL) or ( (not FWaitAttackAnim) and @@ -3451,17 +3471,17 @@ _end: // Lost_Soul óêóñèë êîãî-òî => ïåðåõîäèò íà øàã: if FMonsterType = MONSTER_SOUL then SetState(STATE_GO); - + 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); + g_Weapon_Hit(@o, IfThen(FMonsterType = MONSTER_CYBER, 33, 50), FUID, HIT_SOME); end; MONSTER_VILE: @@ -3528,7 +3548,7 @@ _end: if g_Obj_CollidePanel(@FObj, 0, 0, PANEL_LIFTLEFT or PANEL_LIFTRIGHT) and not ((FState = STATE_DEAD) or (FState = STATE_DIE)) then FObj.Vel.X := oldvelx; - + // Åñëè åñòü àíèìàöèÿ, òî ïóñòü îíà èäåò: if FAnim[FCurAnim, FDirection] <> nil then FAnim[FCurAnim, FDirection].Update(); @@ -3752,13 +3772,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);