X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=718ff68a3ae6427474ac3faa0f3214cfe5453e15;hb=483304f6afb4ad7d8b16624ce835cbae9a60bb3a;hp=5369b9c9c6d4cbbc887539714cbc067c0c9553fa;hpb=abed90e42988669146ac1f2ecf2f9eef74f336c1;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 5369b9c..718ff68 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -87,8 +87,10 @@ type FBloodBlue: Byte; FBloodKind: Byte; {$ENDIF} - FShellTimer: Integer; - FShellType: Byte; + {$IFDEF ENABLE_SHELLS} + FShellTimer: Integer; + FShellType: Byte; + {$ENDIF} FFirePainTime: Integer; FFireAttacker: Word; vilefire: TAnimationState; @@ -532,6 +534,12 @@ uses {$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_console, g_map, Math, wadreader, @@ -1591,7 +1599,9 @@ begin FDieTriggers := nil; FWaitAttackAnim := False; FChainFire := False; - FShellTimer := -1; + {$IFDEF ENABLE_SHELLS} + FShellTimer := -1; + {$ENDIF} FState := MONSTATE_SLEEP; FCurAnim := ANIM_SLEEP; @@ -1628,7 +1638,9 @@ begin FChainFire := False; FStartID := aID; FNoRespawn := False; - FShellTimer := -1; + {$IFDEF ENABLE_SHELLS} + FShellTimer := -1; + {$ENDIF} FBehaviour := BH_NORMAL; FFireTime := 0; FFirePainTime := 0; @@ -2061,14 +2073,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 @@ -2218,25 +2236,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 @@ -2526,25 +2554,27 @@ begin end; end; {$ENDIF} - // Боссы могут пинать трупы: - 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; + {$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 @@ -2917,20 +2947,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: @@ -2944,13 +2980,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); @@ -3060,11 +3100,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 @@ -3184,24 +3227,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 @@ -3381,25 +3434,27 @@ begin end; end; {$ENDIF} - // Боссы могут пинать трупы: - 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; + {$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; @@ -3743,24 +3798,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);