diff --git a/Source/monster.cpp b/Source/monster.cpp index 12bbfe643..4ac526d7b 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2077,6 +2077,7 @@ missile_id GetMissileType(_mai_id ai) return MIS_ARROW; case AI_SUCC: return MIS_FLARE; + case AI_ACID: case AI_ACIDUNIQ: return MIS_ACID; case AI_FIREBAT: @@ -2091,6 +2092,14 @@ missile_id GetMissileType(_mai_id ai) return MIS_PSYCHORB; case AI_NECROMORB: return MIS_NECROMORB; + case AI_MAGMA: + return MIS_MAGMABALL; + case AI_STORM: + return MIS_LIGHTCTRL2; + case AI_DIABLO: + return MIS_DIABAPOCA; + case AI_BONEDEMON: + return MIS_BONEDEMON; default: return MIS_ARROW; } @@ -2142,7 +2151,7 @@ void AiRanged(int i) } } -void AiRangedAvoidance(int i, missile_id missileType, bool checkdoors, int dam, int lessmissiles) +void AiRangedAvoidance(int i) { assert(i >= 0 && i < MAXMONSTERS); auto &monster = Monsters[i]; @@ -2156,8 +2165,12 @@ void AiRangedAvoidance(int i, missile_id missileType, bool checkdoors, int dam, int mx = monster.position.tile.x - fx; int my = monster.position.tile.y - fy; Direction md = GetDirection(monster.position.tile, monster.position.last); - if (checkdoors && monster._msquelch < UINT8_MAX) + if (IsAnyOf(monster._mAi, AI_MAGMA, AI_STORM, AI_BONEDEMON) && monster._msquelch < UINT8_MAX) + MonstCheckDoors(monster); + int lessmissiles = (monster._mAi == AI_ACID) ? 1 : 0; + int dam = (monster._mAi == AI_DIABLO) ? 40 : 4; + missile_id missileType = GetMissileType(monster._mAi); int v = GenerateRnd(10000); int dist = std::max(abs(mx), abs(my)); if (dist >= 2 && monster._msquelch == UINT8_MAX && dTransVal[monster.position.tile.x][monster.position.tile.y] == dTransVal[fx][fy]) { @@ -2557,11 +2570,6 @@ void FallenAi(int i) SkeletonAi(i); } -void MagmaAi(int i) -{ - AiRangedAvoidance(i, MIS_MAGMABALL, true, 4, 0); -} - void LeoricAi(int i) { assert(i >= 0 && i < MAXMONSTERS); @@ -2803,11 +2811,6 @@ void SneakAi(int i) } } -void StormAi(int i) -{ - AiRangedAvoidance(i, MIS_LIGHTCTRL2, true, 4, 0); -} - void GharbadAi(int i) { assert(i >= 0 && i < MAXMONSTERS); @@ -2855,11 +2858,6 @@ void GharbadAi(int i) monster.CheckStandAnimationIsLoaded(md); } -void AcidAvoidanceAi(int i) -{ - AiRangedAvoidance(i, MIS_ACID, false, 4, 1); -} - void SnotSpilAi(int i) { assert(i >= 0 && i < MAXMONSTERS); @@ -3128,11 +3126,6 @@ void MegaAi(int i) } } -void DiabloAi(int i) -{ - AiRangedAvoidance(i, MIS_DIABAPOCA, false, 40, 0); -} - void LazarusAi(int i) { assert(i >= 0 && i < MAXMONSTERS); @@ -3324,11 +3317,6 @@ void HorkDemonAi(int i) monster.CheckStandAnimationIsLoaded(monster._mdir); } -void BoneDemonAi(int i) -{ - AiRangedAvoidance(i, MIS_BONEDEMON, true, 4, 0); -} - string_view GetMonsterTypeText(const MonsterData &monsterData) { switch (monsterData.mMonstClass) { @@ -3364,17 +3352,17 @@ void (*AiProc[])(int i) = { /*AI_GOATMC */ &GoatAi, /*AI_GOATBOW */ &AiRanged, /*AI_FALLEN */ &FallenAi, - /*AI_MAGMA */ &MagmaAi, + /*AI_MAGMA */ &AiRangedAvoidance, /*AI_SKELKING */ &LeoricAi, /*AI_BAT */ &BatAi, /*AI_GARG */ &GargoyleAi, /*AI_CLEAVER */ &ButcherAi, /*AI_SUCC */ &AiRanged, /*AI_SNEAK */ &SneakAi, - /*AI_STORM */ &StormAi, + /*AI_STORM */ &AiRangedAvoidance, /*AI_FIREMAN */ nullptr, /*AI_GARBUD */ &GharbadAi, - /*AI_ACID */ &AcidAvoidanceAi, + /*AI_ACID */ &AiRangedAvoidance, /*AI_ACIDUNIQ */ &AiRanged, /*AI_GOLUM */ &GolumAi, /*AI_ZHAR */ &ZharAi, @@ -3382,7 +3370,7 @@ void (*AiProc[])(int i) = { /*AI_SNAKE */ &SnakeAi, /*AI_COUNSLR */ &CounselorAi, /*AI_MEGA */ &MegaAi, - /*AI_DIABLO */ &DiabloAi, + /*AI_DIABLO */ &AiRangedAvoidance, /*AI_LAZARUS */ &LazarusAi, /*AI_LAZHELP */ &LazarusMinionAi, /*AI_LACHDAN */ &LachdananAi, @@ -3394,7 +3382,7 @@ void (*AiProc[])(int i) = { /*AI_ARCHLICH */ &AiRanged, /*AI_PSYCHORB */ &AiRanged, /*AI_NECROMORB*/ &AiRanged, - /*AI_BONEDEMON*/ &BoneDemonAi + /*AI_BONEDEMON*/ &AiRangedAvoidance }; bool IsRelativeMoveOK(const Monster &monster, Point position, Direction mdir)