Browse Source

Refactor GroupUnity

pull/2424/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
a677a61f13
  1. 67
      Source/monster.cpp

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

Loading…
Cancel
Save