Clean up id normalization

This commit is contained in:
Anders Jenbo 2021-11-07 22:20:59 +01:00
commit 56170b3372
7 changed files with 47 additions and 77 deletions

View file

@ -159,7 +159,7 @@ void FindItemOrObject()
for (int yy = -1; yy < 2; yy++) {
if (dObject[mx + xx][my + yy] == 0)
continue;
int o = dObject[mx + xx][my + yy] > 0 ? dObject[mx + xx][my + yy] - 1 : -(dObject[mx + xx][my + yy] + 1);
int o = abs(dObject[mx + xx][my + yy]) - 1;
if (Objects[o]._oSelFlag == 0)
continue;
if (xx == 0 && yy == 0 && Objects[o]._oDoorFlag)
@ -290,7 +290,7 @@ void FindMeleeTarget()
visited[dx][dy] = true;
if (dMonster[dx][dy] != 0) {
const int mi = dMonster[dx][dy] > 0 ? dMonster[dx][dy] - 1 : -(dMonster[dx][dy] + 1);
const int mi = abs(dMonster[dx][dy]) - 1;
const auto &monster = Monsters[mi];
if (CanTargetMonster(monster)) {
const bool newCanTalk = CanTalkToMonst(monster);

View file

@ -401,49 +401,49 @@ void CheckCursMove()
if (leveltype != DTYPE_TOWN) {
if (pcurstemp != -1) {
if (!flipflag && mx + 2 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 2][my + 1] != 0 && IsTileLit({ mx + 2, my + 1 })) {
int mi = dMonster[mx + 2][my + 1] > 0 ? dMonster[mx + 2][my + 1] - 1 : -(dMonster[mx + 2][my + 1] + 1);
int mi = abs(dMonster[mx + 2][my + 1]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursPosition = Point { mx, my } + Displacement { 2, 1 };
pcursmonst = mi;
}
}
if (flipflag && mx + 1 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 1][my + 2] != 0 && IsTileLit({ mx + 1, my + 2 })) {
int mi = dMonster[mx + 1][my + 2] > 0 ? dMonster[mx + 1][my + 2] - 1 : -(dMonster[mx + 1][my + 2] + 1);
int mi = abs(dMonster[mx + 1][my + 2]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 2 };
pcursmonst = mi;
}
}
if (mx + 2 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 2][my + 2] != 0 && IsTileLit({ mx + 2, my + 2 })) {
int mi = dMonster[mx + 2][my + 2] > 0 ? dMonster[mx + 2][my + 2] - 1 : -(dMonster[mx + 2][my + 2] + 1);
int mi = abs(dMonster[mx + 2][my + 2]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursPosition = Point { mx, my } + Displacement { 2, 2 };
pcursmonst = mi;
}
}
if (mx + 1 < MAXDUNX && !flipflag && dMonster[mx + 1][my] != 0 && IsTileLit({ mx + 1, my })) {
int mi = dMonster[mx + 1][my] > 0 ? dMonster[mx + 1][my] - 1 : -(dMonster[mx + 1][my] + 1);
int mi = abs(dMonster[mx + 1][my]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 0 };
pcursmonst = mi;
}
}
if (my + 1 < MAXDUNY && flipflag && dMonster[mx][my + 1] != 0 && IsTileLit({ mx, my + 1 })) {
int mi = dMonster[mx][my + 1] > 0 ? dMonster[mx][my + 1] - 1 : -(dMonster[mx][my + 1] + 1);
int mi = abs(dMonster[mx][my + 1]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursPosition = Point { mx, my } + Displacement { 0, 1 };
pcursmonst = mi;
}
}
if (dMonster[mx][my] != 0 && IsTileLit({ mx, my })) {
int mi = dMonster[mx][my] > 0 ? dMonster[mx][my] - 1 : -(dMonster[mx][my] + 1);
int mi = abs(dMonster[mx][my]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 1) != 0) {
cursPosition = { mx, my };
pcursmonst = mi;
}
}
if (mx + 1 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 1][my + 1] != 0 && IsTileLit({ mx + 1, my + 1 })) {
int mi = dMonster[mx + 1][my + 1] > 0 ? dMonster[mx + 1][my + 1] - 1 : -(dMonster[mx + 1][my + 1] + 1);
int mi = abs(dMonster[mx + 1][my + 1]) - 1;
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 1 };
pcursmonst = mi;
@ -461,49 +461,49 @@ void CheckCursMove()
}
}
if (!flipflag && mx + 2 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 2][my + 1] != 0 && IsTileLit({ mx + 2, my + 1 })) {
int mi = dMonster[mx + 2][my + 1] > 0 ? dMonster[mx + 2][my + 1] - 1 : -(dMonster[mx + 2][my + 1] + 1);
int mi = abs(dMonster[mx + 2][my + 1]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursPosition = Point { mx, my } + Displacement { 2, 1 };
pcursmonst = mi;
}
}
if (flipflag && mx + 1 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 1][my + 2] != 0 && IsTileLit({ mx + 1, my + 2 })) {
int mi = dMonster[mx + 1][my + 2] > 0 ? dMonster[mx + 1][my + 2] - 1 : -(dMonster[mx + 1][my + 2] + 1);
int mi = abs(dMonster[mx + 1][my + 2]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 2 };
pcursmonst = mi;
}
}
if (mx + 2 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 2][my + 2] != 0 && IsTileLit({ mx + 2, my + 2 })) {
int mi = dMonster[mx + 2][my + 2] > 0 ? dMonster[mx + 2][my + 2] - 1 : -(dMonster[mx + 2][my + 2] + 1);
int mi = abs(dMonster[mx + 2][my + 2]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursPosition = Point { mx, my } + Displacement { 2, 2 };
pcursmonst = mi;
}
}
if (!flipflag && mx + 1 < MAXDUNX && dMonster[mx + 1][my] != 0 && IsTileLit({ mx + 1, my })) {
int mi = dMonster[mx + 1][my] > 0 ? dMonster[mx + 1][my] - 1 : -(dMonster[mx + 1][my] + 1);
int mi = abs(dMonster[mx + 1][my]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 0 };
pcursmonst = mi;
}
}
if (flipflag && my + 1 < MAXDUNY && dMonster[mx][my + 1] != 0 && IsTileLit({ mx, my + 1 })) {
int mi = dMonster[mx][my + 1] > 0 ? dMonster[mx][my + 1] - 1 : -(dMonster[mx][my + 1] + 1);
int mi = abs(dMonster[mx][my + 1]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursPosition = Point { mx, my } + Displacement { 0, 1 };
pcursmonst = mi;
}
}
if (dMonster[mx][my] != 0 && IsTileLit({ mx, my })) {
int mi = dMonster[mx][my] > 0 ? dMonster[mx][my] - 1 : -(dMonster[mx][my] + 1);
int mi = abs(dMonster[mx][my]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 1) != 0) {
cursPosition = { mx, my };
pcursmonst = mi;
}
}
if (mx + 1 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 1][my + 1] != 0 && IsTileLit({ mx + 1, my + 1 })) {
int mi = dMonster[mx + 1][my + 1] > 0 ? dMonster[mx + 1][my + 1] - 1 : -(dMonster[mx + 1][my + 1] + 1);
int mi = abs(dMonster[mx + 1][my + 1]) - 1;
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 1 };
pcursmonst = mi;
@ -537,21 +537,21 @@ void CheckCursMove()
if (pcursmonst == -1) {
if (!flipflag && mx + 1 < MAXDUNX && dPlayer[mx + 1][my] != 0) {
int8_t bv = dPlayer[mx + 1][my] > 0 ? dPlayer[mx + 1][my] - 1 : -(dPlayer[mx + 1][my] + 1);
int8_t bv = abs(dPlayer[mx + 1][my]) - 1;
if (bv != MyPlayerId && Players[bv]._pHitPoints != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 0 };
pcursplr = bv;
}
}
if (flipflag && my + 1 < MAXDUNY && dPlayer[mx][my + 1] != 0) {
int8_t bv = dPlayer[mx][my + 1] > 0 ? dPlayer[mx][my + 1] - 1 : -(dPlayer[mx][my + 1] + 1);
int8_t bv = abs(dPlayer[mx][my + 1]) - 1;
if (bv != MyPlayerId && Players[bv]._pHitPoints != 0) {
cursPosition = Point { mx, my } + Displacement { 0, 1 };
pcursplr = bv;
}
}
if (dPlayer[mx][my] != 0) {
int8_t bv = dPlayer[mx][my] > 0 ? dPlayer[mx][my] - 1 : -(dPlayer[mx][my] + 1);
int8_t bv = abs(dPlayer[mx][my]) - 1;
if (bv != MyPlayerId) {
cursPosition = { mx, my };
pcursplr = bv;
@ -580,7 +580,7 @@ void CheckCursMove()
}
}
if (mx + 1 < MAXDUNX && my + 1 < MAXDUNY && dPlayer[mx + 1][my + 1] != 0) {
int8_t bv = dPlayer[mx + 1][my + 1] > 0 ? dPlayer[mx + 1][my + 1] - 1 : -(dPlayer[mx + 1][my + 1] + 1);
int8_t bv = abs(dPlayer[mx + 1][my + 1]) - 1;
if (bv != MyPlayerId && Players[bv]._pHitPoints != 0) {
cursPosition = Point { mx, my } + Displacement { 1, 1 };
pcursplr = bv;
@ -589,28 +589,28 @@ void CheckCursMove()
}
if (pcursmonst == -1 && pcursplr == -1) {
if (!flipflag && mx + 1 < MAXDUNX && dObject[mx + 1][my] != 0) {
int8_t bv = dObject[mx + 1][my] > 0 ? dObject[mx + 1][my] - 1 : -(dObject[mx + 1][my] + 1);
int8_t bv = abs(dObject[mx + 1][my]) - 1;
if (Objects[bv]._oSelFlag >= 2) {
cursPosition = Point { mx, my } + Displacement { 1, 0 };
pcursobj = bv;
}
}
if (flipflag && my + 1 < MAXDUNY && dObject[mx][my + 1] != 0) {
int8_t bv = dObject[mx][my + 1] > 0 ? dObject[mx][my + 1] - 1 : -(dObject[mx][my + 1] + 1);
int8_t bv = abs(dObject[mx][my + 1]) - 1;
if (Objects[bv]._oSelFlag >= 2) {
cursPosition = Point { mx, my } + Displacement { 0, 1 };
pcursobj = bv;
}
}
if (dObject[mx][my] != 0) {
int8_t bv = dObject[mx][my] > 0 ? dObject[mx][my] - 1 : -(dObject[mx][my] + 1);
int8_t bv = abs(dObject[mx][my]) - 1;
if (Objects[bv]._oSelFlag == 1 || Objects[bv]._oSelFlag == 3) {
cursPosition = { mx, my };
pcursobj = bv;
}
}
if (mx + 1 < MAXDUNX && my + 1 < MAXDUNY && dObject[mx + 1][my + 1] != 0) {
int8_t bv = dObject[mx + 1][my + 1] > 0 ? dObject[mx + 1][my + 1] - 1 : -(dObject[mx + 1][my + 1] + 1);
int8_t bv = abs(dObject[mx + 1][my + 1]) - 1;
if (Objects[bv]._oSelFlag >= 2) {
cursPosition = Point { mx, my } + Displacement { 1, 1 };
pcursobj = bv;

View file

@ -782,9 +782,7 @@ void GetDebugMonster()
if (mi1 == -1) {
int mi2 = dMonster[cursPosition.x][cursPosition.y];
if (mi2 != 0) {
mi1 = mi2 - 1;
if (mi2 <= 0)
mi1 = -(mi2 + 1);
mi1 = abs(mi2) - 1;
} else {
mi1 = DebugMonsterId;
}
@ -863,8 +861,7 @@ bool GetDebugGridText(Point dungeonCoords, char *debugGridTextBuffer)
info = 0;
int objectIndex = dObject[dungeonCoords.x][dungeonCoords.y];
if (objectIndex != 0 && DebugIndexToObjectID.find(objectIndex) != DebugIndexToObjectID.end()) {
objectIndex = objectIndex > 0 ? objectIndex - 1 : -(objectIndex + 1);
info = DebugIndexToObjectID[objectIndex];
info = DebugIndexToObjectID[abs(objectIndex) - 1];
}
break;
}

View file

@ -1768,24 +1768,18 @@ bool CanPut(Point position)
return false;
if (nSolidTable[dPiece[position.x][position.y]])
return false;
if (dObject[position.x][position.y] != 0 && Objects[abs(dObject[position.x][position.y]) - 1]._oSolidFlag)
return false;
if (dObject[position.x][position.y] != 0) {
if (Objects[dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1)]._oSolidFlag)
if (dObject[position.x + 1][position.y + 1] != 0) {
int8_t oi = abs(dObject[position.x + 1][position.y + 1]) - 1;
if (Objects[oi]._oSelFlag != 0) {
return false;
}
int8_t oi = dObject[position.x + 1][position.y + 1];
if (oi > 0 && Objects[oi - 1]._oSelFlag != 0) {
return false;
}
if (oi < 0 && Objects[-(oi + 1)]._oSelFlag != 0) {
return false;
}
oi = dObject[position.x + 1][position.y];
if (oi > 0) {
int8_t oi2 = dObject[position.x][position.y + 1];
if (oi2 > 0 && Objects[oi - 1]._oSelFlag != 0 && Objects[oi2 - 1]._oSelFlag != 0)
if (dObject[position.x + 1][position.y] > 0 && dObject[position.x][position.y + 1] > 0) {
if (Objects[dObject[position.x + 1][position.y] - 1]._oSelFlag != 0 && Objects[dObject[position.x][position.y + 1] - 1]._oSelFlag != 0)
return false;
}

View file

@ -3194,7 +3194,7 @@ bool ItemSpaceOk(Point position)
return false;
if (dObject[position.x][position.y] != 0) {
int oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1);
int oi = abs(dObject[position.x][position.y]) - 1;
if (Objects[oi]._oSolidFlag)
return false;
}

View file

@ -443,26 +443,10 @@ void CheckMissileCol(Missile &missile, int mindam, int maxdam, bool shift, Point
if (missile._micaster != TARGET_BOTH && missile._misource != -1) {
if (missile._micaster == TARGET_MONSTERS) {
int mid = dMonster[mx][my];
if (mid > 0) {
mid -= 1;
if (mid != 0 && (mid > 0 || Monsters[mid]._mmode == MonsterMode::Petrified)) {
if (MonsterMHit(
missile._misource,
mid,
mindam,
maxdam,
missile._midist,
missile._mitype,
shift)) {
if (!nodel)
missile._mirange = 0;
missile._miHitFlag = true;
}
} else if (mid < 0) {
mid = -(mid + 1);
if (Monsters[mid]._mmode == MonsterMode::Petrified
&& MonsterMHit(
missile._misource,
mid,
abs(mid) - 1,
mindam,
maxdam,
missile._midist,
@ -564,7 +548,7 @@ void CheckMissileCol(Missile &missile, int mindam, int maxdam, bool shift, Point
}
}
if (dObject[mx][my] != 0) {
int oi = dObject[mx][my] > 0 ? dObject[mx][my] - 1 : -(dObject[mx][my] + 1);
int oi = abs(dObject[mx][my]) - 1;
if (!Objects[oi]._oMissFlag) {
if (Objects[oi]._oBreak == 1)
BreakObject(-1, oi);
@ -3178,20 +3162,17 @@ void MI_Rune(Missile &missile)
{
Point position = missile.position.tile;
int mid = dMonster[position.x][position.y];
int8_t pid = dPlayer[position.x][position.y];
int pid = dPlayer[position.x][position.y];
if (mid != 0 || pid != 0) {
Direction dir;
if (mid != 0) {
mid = (mid > 0) ? (mid - 1) : -(mid + 1);
dir = GetDirection(position, Monsters[mid].position.tile);
} else {
pid = (pid > 0) ? (pid - 1) : -(pid + 1);
dir = GetDirection(position, Players[pid].position.tile);
}
Point targetPosition = mid != 0 ? Monsters[abs(mid) - 1].position.tile : Players[abs(pid) - 1].position.tile;
Direction dir = GetDirection(position, targetPosition);
missile._miDelFlag = true;
AddUnLight(missile._mlid);
AddMissile(position, position, dir, static_cast<missile_id>(missile.var1), TARGET_BOTH, missile._misource, missile._midam, missile._mispllvl);
}
PutMissile(missile);
}

View file

@ -107,7 +107,7 @@ bool CouldMissileCollide(Point tile, bool checkPlayerAndMonster)
}
int oid = dObject[tile.x][tile.y];
if (oid != 0) {
oid = oid > 0 ? oid - 1 : -(oid + 1);
oid = abs(oid) - 1;
if (!Objects[oid]._oMissFlag)
return true;
}
@ -744,8 +744,7 @@ void DrawItem(const Surface &out, Point tilePosition, Point targetBufferPosition
*/
void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBufferPosition)
{
int mi = dMonster[tilePosition.x][tilePosition.y];
mi = mi > 0 ? mi - 1 : -(mi + 1);
int mi = abs(dMonster[tilePosition.x][tilePosition.y]) - 1;
if (leveltype == DTYPE_TOWN) {
auto &towner = Towners[mi];
@ -799,8 +798,7 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe
*/
void DrawPlayerHelper(const Surface &out, Point tilePosition, Point targetBufferPosition)
{
int8_t p = dPlayer[tilePosition.x][tilePosition.y];
p = p > 0 ? p - 1 : -(p + 1);
int8_t p = abs(dPlayer[tilePosition.x][tilePosition.y]) - 1;
if (p < 0 || p >= MAX_PLRS) {
Log("draw player: tried to draw illegal player {}", p);