Browse Source

Rename leaderflag to leaderRelation and MonsterRelation to LeaderRelation

pull/2424/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
91c8503ea5
  1. 4
      Source/loadsave.cpp
  2. 32
      Source/monster.cpp
  3. 20
      Source/monster.h

4
Source/loadsave.cpp

@ -619,7 +619,7 @@ void LoadMonster(LoadHelper *file, MonsterStruct &monster)
if (monster.mtalkmsg == TEXT_KING1) // Fix original bad mapping of NONE for monsters
monster.mtalkmsg = TEXT_NONE;
monster.leader = file->NextLE<uint8_t>();
monster.leaderflag = static_cast<MonsterRelation>(file->NextLE<uint8_t>());
monster.leaderRelation = static_cast<LeaderRelation>(file->NextLE<uint8_t>());
monster.packsize = file->NextLE<uint8_t>();
monster.mlid = file->NextLE<int8_t>();
if (monster.mlid == Players[MyPlayerId]._plid)
@ -1275,7 +1275,7 @@ void SaveMonster(SaveHelper *file, MonsterStruct &monster)
file->WriteLE<int32_t>(monster.mtalkmsg == TEXT_NONE ? 0 : monster.mtalkmsg); // Replicate original bad mapping of none for monsters
file->WriteLE<uint8_t>(monster.leader);
file->WriteLE<uint8_t>(static_cast<std::uint8_t>(monster.leaderflag));
file->WriteLE<uint8_t>(static_cast<std::uint8_t>(monster.leaderRelation));
file->WriteLE<uint8_t>(monster.packsize);
file->WriteLE<int8_t>(monster.mlid);

32
Source/monster.cpp

@ -220,7 +220,7 @@ void InitMonster(MonsterStruct &monster, Direction rd, int mtype, Point position
monster.mArmorClass = monsterType.MData->mArmorClass;
monster.mMagicRes = monsterType.MData->mMagicRes;
monster.leader = 0;
monster.leaderflag = MonsterRelation::Individual;
monster.leaderRelation = LeaderRelation::None;
monster._mFlags = monsterType.MData->mFlags;
monster.mtalkmsg = TEXT_NONE;
@ -361,7 +361,7 @@ void PlaceGroup(int mtype, int num, int leaderAttributes, int leaderId)
if ((leaderAttributes & 2) != 0) {
minion.leader = leaderId;
minion.leaderflag = MonsterRelation::Minion;
minion.leaderRelation = LeaderRelation::Leashed;
minion._mAi = leader._mAi;
}
@ -1949,25 +1949,25 @@ void GroupUnity(int i)
assert(i >= 0 && i < MAXMONSTERS);
auto &monster = Monsters[i];
if (monster.leaderflag == MonsterRelation::Individual)
if (monster.leaderRelation == LeaderRelation::None)
return;
assert(monster.leader >= 0);
auto &leader = Monsters[monster.leader];
if (IsLineNotSolid(monster.position.tile, leader.position.future)) {
if (monster.leaderflag == MonsterRelation::Leader
if (monster.leaderRelation == LeaderRelation::Separated
&& monster.position.tile.WalkingDistance(leader.position.future) < 4) {
// Reunite the separated monster with the pack
leader.packsize++;
monster.leaderflag = MonsterRelation::Minion;
monster.leaderRelation = LeaderRelation::Leashed;
}
} else if (monster.leaderflag == MonsterRelation::Minion) {
} else if (monster.leaderRelation == LeaderRelation::Leashed) {
leader.packsize--;
monster.leaderflag = MonsterRelation::Leader;
monster.leaderRelation = LeaderRelation::Separated;
}
if (monster.leaderflag == MonsterRelation::Minion) {
if (monster.leaderRelation == LeaderRelation::Leashed) {
if (monster._msquelch > leader._msquelch) {
leader.position.last = monster.position.tile;
leader._msquelch = monster._msquelch - 1;
@ -1983,7 +1983,7 @@ void GroupUnity(int i)
return;
for (int j = 0; j < ActiveMonsterCount; j++) {
auto &minion = Monsters[ActiveMonsters[j]];
if (minion.leaderflag != MonsterRelation::Minion || minion.leader != i)
if (minion.leaderRelation != LeaderRelation::Leashed || minion.leader != i)
continue;
if (monster._msquelch > minion._msquelch) {
minion.position.last = monster.position.tile;
@ -2497,9 +2497,9 @@ void ScavengerAi(int i)
if (monster._mmode != MM_STAND)
return;
if (monster._mhitpoints < (monster._mmaxhp / 2) && monster._mgoal != MGOAL_HEALING) {
if (monster.leaderflag != MonsterRelation::Individual) {
if (monster.leaderRelation != LeaderRelation::None) {
Monsters[monster.leader].packsize--;
monster.leaderflag = MonsterRelation::Individual;
monster.leaderRelation = LeaderRelation::None;
}
monster._mgoal = MGOAL_HEALING;
monster._mgoalvar3 = 10;
@ -4227,11 +4227,11 @@ void M_UpdateLeader(int i)
for (int j = 0; j < ActiveMonsterCount; j++) {
auto &minion = Monsters[ActiveMonsters[j]];
if (minion.leaderflag == MonsterRelation::Minion && minion.leader == i)
minion.leaderflag = MonsterRelation::Individual;
if (minion.leaderRelation == LeaderRelation::Leashed && minion.leader == i)
minion.leaderRelation = LeaderRelation::None;
}
if (monster.leaderflag == MonsterRelation::Minion) {
if (monster.leaderRelation == LeaderRelation::Leashed) {
Monsters[monster.leader].packsize--;
}
}
@ -4584,7 +4584,7 @@ bool DirOK(int i, Direction mdir)
} else if (mdir == DIR_S)
if (IsTileSolid(position + DIR_SW) || IsTileSolid(position + DIR_SE))
return false;
if (monster.leaderflag == MonsterRelation::Minion) {
if (monster.leaderRelation == LeaderRelation::Leashed) {
return futurePosition.WalkingDistance(Monsters[monster.leader].position.future) < 4;
}
if (monster._uniqtype == 0 || (UniqMonst[monster._uniqtype - 1].mUnqAttr & 2) == 0)
@ -4599,7 +4599,7 @@ bool DirOK(int i, Direction mdir)
continue;
auto &minion = Monsters[(mi < 0) ? -(mi + 1) : (mi - 1)];
if (minion.leaderflag == MonsterRelation::Minion
if (minion.leaderRelation == LeaderRelation::Leashed
&& minion.leader == i
&& minion.position.future == Point { x, y }) {
mcount++;

20
Source/monster.h

@ -115,10 +115,20 @@ enum placeflag : uint8_t {
// clang-format on
};
enum class MonsterRelation : uint8_t {
Individual,
Minion,
Leader,
/**
* @brief Defines the relation of the monster to a monster pack.
* If value is differnt from Individual MonsterStruct.leader must also be set
*/
enum class LeaderRelation : uint8_t {
None,
/**
* @brief Minion that sticks with the leader
*/
Leashed,
/**
* @brief Minion that was separated from leader and acts individual until it reaches the leader again
*/
Separated,
};
struct AnimStruct {
@ -199,7 +209,7 @@ struct MonsterStruct { // note: missing field _mAFNum
uint16_t mMagicRes;
_speech_id mtalkmsg;
uint8_t leader;
MonsterRelation leaderflag;
LeaderRelation leaderRelation;
uint8_t packsize;
int8_t mlid; // BUGFIX -1 is used when not emitting light this should be signed (fixed)
const char *mName;

Loading…
Cancel
Save