diff --git a/Source/monster.cpp b/Source/monster.cpp index 0ab2d955c..6f00178cc 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1949,20 +1949,22 @@ void GroupUnity(int i) assert(i >= 0 && i < MAXMONSTERS); auto &monster = Monsters[i]; + if (monster.leaderflag == MonsterRelation::Individual) + return; + + assert(monster.leader >= 0); + auto &leader = Monsters[monster.leader]; - if (monster.leaderflag != MonsterRelation::Individual) { - bool clear = IsLineNotSolid(monster.position.tile, leader.position.future); - if (clear || monster.leaderflag != MonsterRelation::Minion) { - if (clear - && monster.leaderflag == MonsterRelation::Leader - && monster.position.tile.WalkingDistance(leader.position.future) < 4) { - leader.packsize++; - monster.leaderflag = MonsterRelation::Minion; - } - } else { - leader.packsize--; - monster.leaderflag = MonsterRelation::Leader; + if (IsLineNotSolid(monster.position.tile, leader.position.future)) { + if (monster.leaderflag == MonsterRelation::Leader + && monster.position.tile.WalkingDistance(leader.position.future) < 4) { + // Reunite the separated monster with the pack + leader.packsize++; + monster.leaderflag = MonsterRelation::Minion; } + } else if (monster.leaderflag == MonsterRelation::Minion) { + leader.packsize--; + monster.leaderflag = MonsterRelation::Leader; } if (monster.leaderflag == MonsterRelation::Minion) { @@ -1970,29 +1972,26 @@ void GroupUnity(int i) leader.position.last = monster.position.tile; leader._msquelch = monster._msquelch - 1; } - if (leader._mAi == AI_GARG) { - if ((leader._mFlags & MFLAG_ALLOW_SPECIAL) != 0) { - leader._mFlags &= ~MFLAG_ALLOW_SPECIAL; - leader._mmode = MM_SATTACK; - } + if (leader._mAi == AI_GARG && (leader._mFlags & MFLAG_ALLOW_SPECIAL) != 0) { + leader._mFlags &= ~MFLAG_ALLOW_SPECIAL; + leader._mmode = MM_SATTACK; } - } else if (monster._uniqtype != 0) { - if ((UniqMonst[monster._uniqtype - 1].mUnqAttr & 2) != 0) { - for (int j = 0; j < ActiveMonsterCount; j++) { - auto &minion = Monsters[ActiveMonsters[j]]; - if (minion.leaderflag == MonsterRelation::Minion && minion.leader == i) { - if (monster._msquelch > minion._msquelch) { - minion.position.last = monster.position.tile; - minion._msquelch = monster._msquelch - 1; - } - if (minion._mAi == AI_GARG) { - if ((minion._mFlags & MFLAG_ALLOW_SPECIAL) != 0) { - minion._mFlags &= ~MFLAG_ALLOW_SPECIAL; - minion._mmode = MM_SATTACK; - } - } - } - } + return; + } + + if (monster._uniqtype == 0 || (UniqMonst[monster._uniqtype - 1].mUnqAttr & 2) == 0) + return; + for (int j = 0; j < ActiveMonsterCount; j++) { + auto &minion = Monsters[ActiveMonsters[j]]; + if (minion.leaderflag != MonsterRelation::Minion || minion.leader != i) + continue; + if (monster._msquelch > minion._msquelch) { + minion.position.last = monster.position.tile; + minion._msquelch = monster._msquelch - 1; + } + if (minion._mAi == AI_GARG && (minion._mFlags & MFLAG_ALLOW_SPECIAL) != 0) { + minion._mFlags &= ~MFLAG_ALLOW_SPECIAL; + minion._mmode = MM_SATTACK; } } }