From 3a1a44de347d274050de3177cf2845cefc9b4a7d Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 2 Jul 2021 16:47:02 +0200 Subject: [PATCH] Fix and clean up AddDoppelganger --- Source/monster.cpp | 42 +++++++++++++++++++++++------------------- Source/monster.h | 2 +- Source/player.cpp | 2 +- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 094c46ced..81ea9c35e 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1236,31 +1236,35 @@ int AddMonster(Point position, Direction dir, int mtype, bool InMap) return -1; } -void monster_43C785(int i) +void AddDoppelganger(MonsterStruct &monster) { - int d, j, oi; - Point position = {}; + if (monster.MType == nullptr) { + return; + } - if (monster[i].MType != nullptr) { - for (d = 0; d < 8; d++) { - position = monster[i].position.tile + monster[i]._mdir; - if (!SolidLoc(position)) { - if (dPlayer[position.x][position.y] == 0 && dMonster[position.x][position.y] == 0) { - if (dObject[position.x][position.y] == 0) - break; - oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1); - if (!object[oi]._oSolidFlag) - break; + Point target = { 0, 0 }; + for (int d = 0; d < 8; d++) { + const Point position = monster.position.tile + static_cast(d); + if (!SolidLoc(position)) { + if (dPlayer[position.x][position.y] == 0 && dMonster[position.x][position.y] == 0) { + if (dObject[position.x][position.y] == 0) { + target = position; + break; + } + int oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1); + if (!object[oi]._oSolidFlag) { + target = position; + break; } } } - if (d < 8) { - for (j = 0; j < MAX_LVLMTYPES; j++) { - if (Monsters[j].mtype == monster[i].MType->mtype) - break; + } + if (target != Point { 0, 0 }) { + for (int j = 0; j < MAX_LVLMTYPES; j++) { + if (Monsters[j].mtype == monster.MType->mtype) { + AddMonster(target, monster._mdir, j, true); + break; } - if (j < MAX_LVLMTYPES) - AddMonster(position, monster[i]._mdir, j, true); } } } diff --git a/Source/monster.h b/Source/monster.h index 16b52da80..a8b21db58 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -229,7 +229,7 @@ void InitMonsters(); void SetMapMonsters(const uint16_t *dunData, Point startPosition); void DeleteMonster(int i); int AddMonster(Point position, Direction dir, int mtype, bool InMap); -void monster_43C785(int i); +void AddDoppelganger(MonsterStruct &monster); bool M_Talker(int i); void M_StartStand(int i, Direction md); void M_ClearSquares(int i); diff --git a/Source/player.cpp b/Source/player.cpp index ccfd1a552..55c0ddfd8 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -2379,7 +2379,7 @@ bool PlrHitMonst(int pnum, int m) } if ((player.pDamAcFlags & 0x10) != 0 && monster[m].MType->mtype != MT_DIABLO && monster[m]._uniqtype == 0 && GenerateRnd(100) < 10) { - monster_43C785(m); + AddDoppelganger(monster[m]); } dam <<= 6;