X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=718ff68a3ae6427474ac3faa0f3214cfe5453e15;hb=0361545117c9f1e9c4e719f2250c48f69879de4a;hp=213e264181188a5386926fecb922aadc4418f9d7;hpb=6cdd36d2fb73f13be7b6ea1870a8b3b0817b37f1;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index 213e264..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; @@ -529,6 +531,15 @@ uses {$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_console, g_map, Math, wadreader, @@ -1588,7 +1599,9 @@ begin FDieTriggers := nil; FWaitAttackAnim := False; FChainFire := False; - FShellTimer := -1; + {$IFDEF ENABLE_SHELLS} + FShellTimer := -1; + {$ENDIF} FState := MONSTATE_SLEEP; FCurAnim := ANIM_SLEEP; @@ -1625,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; @@ -2058,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 @@ -2215,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 @@ -2498,48 +2529,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 + 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)+120); // налево - end - else - 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 @@ -2912,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: @@ -2939,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); @@ -3055,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 @@ -3179,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 @@ -3350,49 +3408,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; @@ -3736,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);