|
|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|