From 2bd13451a1c8e29fcaf41b07db1b69333442be30 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 25 Apr 2021 01:25:48 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8FApply=20point=20positioning?= =?UTF-8?q?=20to=20all=20remaning=20entities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/automap.cpp | 8 +- Source/controls/plrctrls.cpp | 35 ++- Source/cursor.cpp | 40 +-- Source/debug.cpp | 4 +- Source/diablo.cpp | 12 +- Source/drlg_l1.cpp | 3 +- Source/drlg_l4.cpp | 3 +- Source/effects.cpp | 6 +- Source/engine.h | 5 +- Source/interfac.cpp | 2 +- Source/inv.cpp | 59 ++-- Source/items.cpp | 38 +-- Source/items.h | 5 +- Source/lighting.cpp | 71 ++--- Source/lighting.h | 18 +- Source/loadsave.cpp | 88 +++--- Source/missiles.cpp | 550 +++++++++++++++++------------------ Source/missiles.h | 5 +- Source/monster.cpp | 542 +++++++++++++++++----------------- Source/msg.cpp | 57 ++-- Source/multi.cpp | 26 +- Source/objects.cpp | 359 ++++++++++++----------- Source/objects.h | 3 +- Source/pack.cpp | 10 +- Source/path.cpp | 29 +- Source/path.h | 5 +- Source/player.cpp | 283 +++++++++--------- Source/portal.cpp | 20 +- Source/portal.h | 3 +- Source/qol.cpp | 4 +- Source/quests.cpp | 46 ++- Source/quests.h | 3 +- Source/scrollrt.cpp | 8 +- Source/setmaps.cpp | 2 +- Source/spells.cpp | 12 +- Source/sync.cpp | 22 +- Source/themes.cpp | 2 +- Source/towners.cpp | 37 ++- Source/towners.h | 4 +- Source/trigs.cpp | 214 ++++++-------- Source/trigs.h | 4 +- test/effects_test.cpp | 10 +- test/writehero_test.cpp | 4 +- 43 files changed, 1286 insertions(+), 1375 deletions(-) diff --git a/Source/automap.cpp b/Source/automap.cpp index 0abcbb0de..28fb77350 100644 --- a/Source/automap.cpp +++ b/Source/automap.cpp @@ -246,8 +246,8 @@ void DrawAutomapItem(const CelOutputBuffer &out, int x, int y, uint8_t color) void SearchAutomapItem(const CelOutputBuffer &out) { - int x = plr[myplr].position.current.x; - int y = plr[myplr].position.current.y; + int x = plr[myplr].position.tile.x; + int y = plr[myplr].position.tile.y; if (plr[myplr]._pmode == PM_WALK3) { x = plr[myplr].position.future.x; y = plr[myplr].position.future.y; @@ -303,8 +303,8 @@ void DrawAutomapPlr(const CelOutputBuffer &out, int pnum) else y++; } else { - x = plr[pnum].position.current.x; - y = plr[pnum].position.current.y; + x = plr[pnum].position.tile.x; + y = plr[pnum].position.tile.y; } int px = x - 2 * AutoMapXOfs - ViewX; int py = y - 2 * AutoMapYOfs - ViewY; diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 1371e678f..051f43051 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -167,7 +167,7 @@ void FindItemOrObject() void CheckTownersNearby() { for (int i = 0; i < 16; i++) { - int distance = GetDistance(towners[i]._tx, towners[i]._ty, 2); + int distance = GetDistance(towners[i].position.x, towners[i].position.y, 2); if (distance == 0) continue; pcursmonst = i; @@ -194,8 +194,8 @@ bool CanTargetMonster(int mi) if (monst._mhitpoints >> 6 <= 0) // dead return false; - const int mx = monst.position.current.x; - const int my = monst.position.current.y; + const int mx = monst.position.tile.x; + const int my = monst.position.tile.y; if ((dFlags[mx][my] & BFLAG_LIT) == 0) // not visible return false; if (dMonster[mx][my] == 0) @@ -296,8 +296,7 @@ void FindMeleeTarget() } PATHNODE pPath; - pPath.x = node.x; - pPath.y = node.y; + pPath.position = { node.x, node.y }; if (path_solid_pieces(&pPath, dx, dy)) { queue.push_back({ dx, dy, node.steps + 1 }); @@ -386,8 +385,8 @@ void FindTrigger() for (int i = 0; i < nummissiles; i++) { int mi = missileactive[i]; if (missile[mi]._mitype == MIS_TOWN || missile[mi]._mitype == MIS_RPORTAL) { - int mix = missile[mi].position.current.x; - int miy = missile[mi].position.current.y; + int mix = missile[mi].position.tile.x; + int miy = missile[mi].position.tile.y; const int newDdistance = GetDistance(mix, miy, 2); if (newDdistance == 0) continue; @@ -406,8 +405,8 @@ void FindTrigger() if (pcursmissile == -1) { for (int i = 0; i < numtrigs; i++) { - int tx = trigs[i]._tx; - int ty = trigs[i]._ty; + int tx = trigs[i].position.x; + int ty = trigs[i].position.y; if (trigs[i]._tlvl == 13) ty -= 1; const int newDdistance = GetDistance(tx, ty, 2); @@ -422,11 +421,11 @@ void FindTrigger() for (int i = 0; i < MAXQUESTS; i++) { if (i == Q_BETRAYER || currlevel != quests[i]._qlevel || quests[i]._qslvl == 0) continue; - const int newDdistance = GetDistance(quests[i]._qtx, quests[i]._qty, 2); + const int newDdistance = GetDistance(quests[i].position.x, quests[i].position.y, 2); if (newDdistance == 0) continue; - cursmx = quests[i]._qtx; - cursmy = quests[i]._qty; + cursmx = quests[i].position.x; + cursmy = quests[i].position.y; pcursquest = i; } } @@ -443,7 +442,7 @@ void FindTrigger() void Interact() { if (leveltype == DTYPE_TOWN && pcursmonst != -1) { - NetSendCmdLocParam1(true, CMD_TALKXY, towners[pcursmonst]._tx, towners[pcursmonst]._ty, pcursmonst); + NetSendCmdLocParam1(true, CMD_TALKXY, towners[pcursmonst].position.x, towners[pcursmonst].position.y, pcursmonst); } else if (pcursmonst != -1) { if (plr[myplr]._pwtype != WT_RANGED || CanTalkToMonst(pcursmonst)) { NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); @@ -1129,8 +1128,8 @@ bool SpellHasActorTarget() return false; if (spl == SPL_FIREWALL && pcursmonst != -1) { - cursmx = monster[pcursmonst].position.current.x; - cursmy = monster[pcursmonst].position.current.y; + cursmx = monster[pcursmonst].position.tile.x; + cursmy = monster[pcursmonst].position.tile.y; } return pcursplr != -1 || pcursmonst != -1; @@ -1243,13 +1242,13 @@ void PerformSecondaryAction() } else if (pcursobj != -1) { NetSendCmdLocParam1(true, CMD_OPOBJXY, cursmx, cursmy, pcursobj); } else if (pcursmissile != -1) { - MakePlrPath(myplr, missile[pcursmissile].position.current.x, missile[pcursmissile].position.current.y, true); + MakePlrPath(myplr, missile[pcursmissile].position.tile.x, missile[pcursmissile].position.tile.y, true); plr[myplr].destAction = ACTION_WALK; } else if (pcurstrig != -1) { - MakePlrPath(myplr, trigs[pcurstrig]._tx, trigs[pcurstrig]._ty, true); + MakePlrPath(myplr, trigs[pcurstrig].position.x, trigs[pcurstrig].position.y, true); plr[myplr].destAction = ACTION_WALK; } else if (pcursquest != -1) { - MakePlrPath(myplr, quests[pcursquest]._qtx, quests[pcursquest]._qty, true); + MakePlrPath(myplr, quests[pcursquest].position.x, quests[pcursquest].position.y, true); plr[myplr].destAction = ACTION_WALK; } } diff --git a/Source/cursor.cpp b/Source/cursor.cpp index d110b140b..bbb9772e2 100644 --- a/Source/cursor.cpp +++ b/Source/cursor.cpp @@ -168,20 +168,20 @@ void CheckTown() for (i = 0; i < nummissiles; i++) { mx = missileactive[i]; if (missile[mx]._mitype == MIS_TOWN) { - if ((cursmx == missile[mx].position.current.x - 1 && cursmy == missile[mx].position.current.y) - || (cursmx == missile[mx].position.current.x && cursmy == missile[mx].position.current.y - 1) - || (cursmx == missile[mx].position.current.x - 1 && cursmy == missile[mx].position.current.y - 1) - || (cursmx == missile[mx].position.current.x - 2 && cursmy == missile[mx].position.current.y - 1) - || (cursmx == missile[mx].position.current.x - 2 && cursmy == missile[mx].position.current.y - 2) - || (cursmx == missile[mx].position.current.x - 1 && cursmy == missile[mx].position.current.y - 2) - || (cursmx == missile[mx].position.current.x && cursmy == missile[mx].position.current.y)) { + if ((cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y) + || (cursmx == missile[mx].position.tile.x && cursmy == missile[mx].position.tile.y - 1) + || (cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y - 1) + || (cursmx == missile[mx].position.tile.x - 2 && cursmy == missile[mx].position.tile.y - 1) + || (cursmx == missile[mx].position.tile.x - 2 && cursmy == missile[mx].position.tile.y - 2) + || (cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y - 2) + || (cursmx == missile[mx].position.tile.x && cursmy == missile[mx].position.tile.y)) { trigflag = true; ClearPanel(); strcpy(infostr, "Town Portal"); sprintf(tempstr, "from %s", plr[missile[mx]._misource]._pName); AddPanelString(tempstr, true); - cursmx = missile[mx].position.current.x; - cursmy = missile[mx].position.current.y; + cursmx = missile[mx].position.tile.x; + cursmy = missile[mx].position.tile.y; } } } @@ -194,13 +194,13 @@ void CheckRportal() for (i = 0; i < nummissiles; i++) { mx = missileactive[i]; if (missile[mx]._mitype == MIS_RPORTAL) { - if ((cursmx == missile[mx].position.current.x - 1 && cursmy == missile[mx].position.current.y) - || (cursmx == missile[mx].position.current.x && cursmy == missile[mx].position.current.y - 1) - || (cursmx == missile[mx].position.current.x - 1 && cursmy == missile[mx].position.current.y - 1) - || (cursmx == missile[mx].position.current.x - 2 && cursmy == missile[mx].position.current.y - 1) - || (cursmx == missile[mx].position.current.x - 2 && cursmy == missile[mx].position.current.y - 2) - || (cursmx == missile[mx].position.current.x - 1 && cursmy == missile[mx].position.current.y - 2) - || (cursmx == missile[mx].position.current.x && cursmy == missile[mx].position.current.y)) { + if ((cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y) + || (cursmx == missile[mx].position.tile.x && cursmy == missile[mx].position.tile.y - 1) + || (cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y - 1) + || (cursmx == missile[mx].position.tile.x - 2 && cursmy == missile[mx].position.tile.y - 1) + || (cursmx == missile[mx].position.tile.x - 2 && cursmy == missile[mx].position.tile.y - 2) + || (cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y - 2) + || (cursmx == missile[mx].position.tile.x && cursmy == missile[mx].position.tile.y)) { trigflag = true; ClearPanel(); strcpy(infostr, "Portal to"); @@ -209,8 +209,8 @@ void CheckRportal() else strcpy(tempstr, "level 15"); AddPanelString(tempstr, true); - cursmx = missile[mx].position.current.x; - cursmy = missile[mx].position.current.y; + cursmx = missile[mx].position.tile.x; + cursmy = missile[mx].position.tile.y; } } } @@ -546,7 +546,7 @@ void CheckCursMove() } if ((dFlags[mx][my] & BFLAG_DEAD_PLAYER) != 0) { for (i = 0; i < MAX_PLRS; i++) { - if (plr[i].position.current.x == mx && plr[i].position.current.y == my && i != myplr) { + if (plr[i].position.tile.x == mx && plr[i].position.tile.y == my && i != myplr) { cursmx = mx; cursmy = my; pcursplr = i; @@ -558,7 +558,7 @@ void CheckCursMove() for (yy = -1; yy < 2; yy++) { if (mx + xx < MAXDUNX && my + yy < MAXDUNY && dFlags[mx + xx][my + yy] & BFLAG_DEAD_PLAYER) { for (i = 0; i < MAX_PLRS; i++) { - if (plr[i].position.current.x == mx + xx && plr[i].position.current.y == my + yy && i != myplr) { + if (plr[i].position.tile.x == mx + xx && plr[i].position.tile.y == my + yy && i != myplr) { cursmx = mx + xx; cursmy = my + yy; pcursplr = i; diff --git a/Source/debug.cpp b/Source/debug.cpp index faa910e92..67bfae771 100644 --- a/Source/debug.cpp +++ b/Source/debug.cpp @@ -146,7 +146,7 @@ void PrintDebugPlayer(bool bNextPlayer) sprintf(dstr, " Lvl = %i : Change = %i", plr[dbgplr].plrlevel, plr[dbgplr]._pLvlChanging); NetSendCmdString(1 << myplr, dstr); const Point target = plr[dbgplr].GetTargetPosition(); - sprintf(dstr, " x = %i, y = %i : tx = %i, ty = %i", plr[dbgplr].position.current.x, plr[dbgplr].position.current.y, target.x, target.y); + sprintf(dstr, " x = %i, y = %i : tx = %i, ty = %i", plr[dbgplr].position.tile.x, plr[dbgplr].position.tile.y, target.x, target.y); NetSendCmdString(1 << myplr, dstr); sprintf(dstr, " mode = %i : daction = %i : walk[0] = %i", plr[dbgplr]._pmode, plr[dbgplr].destAction, plr[dbgplr].walkpath[0]); NetSendCmdString(1 << myplr, dstr); @@ -177,7 +177,7 @@ void PrintDebugMonster(int m) sprintf(dstr, "Monster %i = %s", m, monster[m].mName); NetSendCmdString(1 << myplr, dstr); - sprintf(dstr, "X = %i, Y = %i", monster[m].position.current.x, monster[m].position.current.y); + sprintf(dstr, "X = %i, Y = %i", monster[m].position.tile.x, monster[m].position.tile.y); NetSendCmdString(1 << myplr, dstr); sprintf(dstr, "Enemy = %i, HP = %i", monster[m]._menemy, monster[m]._mhitpoints); NetSendCmdString(1 << myplr, dstr); diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 1b08dc94c..e2eb6bd42 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -712,7 +712,7 @@ static bool LeftMouseCmd(bool bShift) if (pcursitem == -1 && pcursmonst == -1 && pcursplr == -1) return true; } else { - bNear = abs(plr[myplr].position.current.x - cursmx) < 2 && abs(plr[myplr].position.current.y - cursmy) < 2; + bNear = abs(plr[myplr].position.tile.x - cursmx) < 2 && abs(plr[myplr].position.tile.y - cursmy) < 2; if (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) { NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursmx, cursmy, pcursitem); } else if (pcursobj != -1 && (!objectIsDisabled(pcursobj)) && (!bShift || (bNear && object[pcursobj]._oBreak == 1))) { @@ -1520,7 +1520,7 @@ static void PressChar(WPARAM vkey) case 'T': case 't': if (debug_mode_key_inverted_v) { - sprintf(tempstr, "PX = %i PY = %i", plr[myplr].position.current.x, plr[myplr].position.current.y); + sprintf(tempstr, "PX = %i PY = %i", plr[myplr].position.tile.x, plr[myplr].position.tile.y); NetSendCmdString(1 << myplr, tempstr); sprintf(tempstr, "CX = %i CY = %i DP = %i", cursmx, cursmy, dungeon[cursmx][cursmy]); NetSendCmdString(1 << myplr, tempstr); @@ -1798,8 +1798,8 @@ static void UpdateMonsterLights() } LightListStruct *lid = &LightList[mon->mlid]; - if (mon->position.current.x != lid->_lx || mon->position.current.y != lid->_ly) { - ChangeLightXY(mon->mlid, mon->position.current.x, mon->position.current.y); + if (mon->position.tile.x != lid->position.tile.x || mon->position.tile.y != lid->position.tile.y) { + ChangeLightXY(mon->mlid, mon->position.tile.x, mon->position.tile.y); } } } @@ -1996,11 +1996,11 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) if (plr[i].plractive && plr[i].plrlevel == currlevel && (!plr[i]._pLvlChanging || i == myplr)) { if (plr[i]._pHitPoints > 0) { if (!gbIsMultiplayer) - dPlayer[plr[i].position.current.x][plr[i].position.current.y] = i + 1; + dPlayer[plr[i].position.tile.x][plr[i].position.tile.y] = i + 1; else SyncInitPlrPos(i); } else { - dFlags[plr[i].position.current.x][plr[i].position.current.y] |= BFLAG_DEAD_PLAYER; + dFlags[plr[i].position.tile.x][plr[i].position.tile.y] |= BFLAG_DEAD_PLAYER; } } } diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index 8b70becb7..9b280a10f 100644 --- a/Source/drlg_l1.cpp +++ b/Source/drlg_l1.cpp @@ -1028,8 +1028,7 @@ static int DRLG_PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, in DRLG_MRectTrans(sx, sy + 2, sx + 5, sy + 4); TransVal = t; - quests[Q_PWATER]._qtx = 2 * sx + 21; - quests[Q_PWATER]._qty = 2 * sy + 22; + quests[Q_PWATER].position = { 2 * sx + 21, 2 * sy + 22 }; } if (setview) { diff --git a/Source/drlg_l4.cpp b/Source/drlg_l4.cpp index e7d2ca60c..7d2ffd4a3 100644 --- a/Source/drlg_l4.cpp +++ b/Source/drlg_l4.cpp @@ -1387,8 +1387,7 @@ static bool DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, } if (currlevel == 15 && quests[Q_BETRAYER]._qactive >= QUEST_ACTIVE) { /// Lazarus staff skip bug fixed - quests[Q_BETRAYER]._qtx = sx + 1; - quests[Q_BETRAYER]._qty = sy + 1; + quests[Q_BETRAYER].position = { sx + 1, sy + 1 }; } if (setview) { ViewX = 2 * sx + 21; diff --git a/Source/effects.cpp b/Source/effects.cpp index e1c2f737a..d8fdaedcc 100644 --- a/Source/effects.cpp +++ b/Source/effects.cpp @@ -1168,8 +1168,8 @@ bool calc_snd_position(int x, int y, int *plVolume, int *plPan) { int pan, volume; - x -= plr[myplr].position.current.x; - y -= plr[myplr].position.current.y; + x -= plr[myplr].position.tile.x; + y -= plr[myplr].position.tile.y; pan = (x - y) * 256; *plPan = pan; @@ -1242,7 +1242,7 @@ void PlayEffect(int i, int mode) return; } - if (!calc_snd_position(monster[i].position.current.x, monster[i].position.current.y, &lVolume, &lPan)) + if (!calc_snd_position(monster[i].position.tile.x, monster[i].position.tile.y, &lVolume, &lPan)) return; snd_play_snd(snd, lVolume, lPan); diff --git a/Source/engine.h b/Source/engine.h index 01a6c065b..cf6f4523b 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -63,15 +63,14 @@ struct Point { }; struct ActorPosition { - /** Tile position */ - Point current; + Point tile; /** Future tile position. Set at start of walking animation. */ Point future; /** Tile position of player. Set via network on player input. */ Point last; /** Most recent position in dPlayer. */ Point old; - /** Player sprite's pixel offset from tile. */ + /** Pixel offset from tile. */ Point offset; /** Same as offset but contains the value in a higher range */ Point offset2; diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 2d377cc34..f0e0e07a4 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -385,7 +385,7 @@ void ShowProgress(interface_mode uMsg) saveProc = SetWindowProc(saveProc); assert(saveProc == DisableInputWndProc); - NetSendCmdLocParam1(true, CMD_PLAYER_JOINLEVEL, plr[myplr].position.current.x, plr[myplr].position.current.y, plr[myplr].plrlevel); + NetSendCmdLocParam1(true, CMD_PLAYER_JOINLEVEL, plr[myplr].position.tile.x, plr[myplr].position.tile.y, plr[myplr].plrlevel); plrmsg_delay(false); ResetPal(); diff --git a/Source/inv.cpp b/Source/inv.cpp index b30aee382..064ba5200 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1681,13 +1681,12 @@ void CheckQuestItem(int pnum) void CleanupItems(ItemStruct *item, int ii) { - dItem[item->_ix][item->_iy] = 0; + dItem[item->position.x][item->position.y] = 0; - if (currlevel == 21 && item->_ix == CornerStone.x && item->_iy == CornerStone.y) { + if (currlevel == 21 && item->position.x == CornerStone.x && item->position.y == CornerStone.y) { CornerStone.item._itype = ITYPE_NONE; CornerStone.item._iSelFlag = 0; - CornerStone.item._ix = 0; - CornerStone.item._iy = 0; + CornerStone.item.position = { 0, 0 }; CornerStone.item._iAnimFlag = false; CornerStone.item._iIdentified = false; CornerStone.item._iPostDraw = false; @@ -1712,11 +1711,11 @@ void InvGetItem(int pnum, ItemStruct *item, int ii) dropGoldValue = 0; } - if (dItem[item->_ix][item->_iy] == 0) + if (dItem[item->position.x][item->position.y] == 0) return; if (myplr == pnum && pcurs >= CURSOR_FIRSTITEM) - NetSendCmdPItem(true, CMD_SYNCPUTITEM, plr[myplr].position.current.x, plr[myplr].position.current.y); + NetSendCmdPItem(true, CMD_SYNCPUTITEM, plr[myplr].position.tile.x, plr[myplr].position.tile.y); item->_iCreateInfo &= ~CF_PREGEN; plr[pnum].HoldItem = *item; @@ -1745,7 +1744,7 @@ void AutoGetItem(int pnum, ItemStruct *item, int ii) dropGoldValue = 0; } - if (dItem[item->_ix][item->_iy] == 0) + if (dItem[item->position.x][item->position.y] == 0) return; item->_iCreateInfo &= ~CF_PREGEN; @@ -1780,7 +1779,7 @@ void AutoGetItem(int pnum, ItemStruct *item, int ii) } plr[pnum].HoldItem = *item; RespawnItem(item, true); - NetSendCmdPItem(true, CMD_RESPAWNITEM, item->_ix, item->_iy); + NetSendCmdPItem(true, CMD_RESPAWNITEM, item->position.x, item->position.y); plr[pnum].HoldItem._itype = ITYPE_NONE; } @@ -1871,22 +1870,22 @@ bool TryInvPut() if (numitems >= MAXITEMS) return false; - direction dir = GetDirection(plr[myplr].position.current.x, plr[myplr].position.current.y, cursmx, cursmy); - if (CanPut(plr[myplr].position.current.x + offset_x[dir], plr[myplr].position.current.y + offset_y[dir])) { + direction dir = GetDirection(plr[myplr].position.tile.x, plr[myplr].position.tile.y, cursmx, cursmy); + if (CanPut(plr[myplr].position.tile.x + offset_x[dir], plr[myplr].position.tile.y + offset_y[dir])) { return true; } direction dirLeft = left[dir]; - if (CanPut(plr[myplr].position.current.x + offset_x[dirLeft], plr[myplr].position.current.y + offset_y[dirLeft])) { + if (CanPut(plr[myplr].position.tile.x + offset_x[dirLeft], plr[myplr].position.tile.y + offset_y[dirLeft])) { return true; } direction dirRight = right[dir]; - if (CanPut(plr[myplr].position.current.x + offset_x[dirRight], plr[myplr].position.current.y + offset_y[dirRight])) { + if (CanPut(plr[myplr].position.tile.x + offset_x[dirRight], plr[myplr].position.tile.y + offset_y[dirRight])) { return true; } - return CanPut(plr[myplr].position.current.x, plr[myplr].position.current.y); + return CanPut(plr[myplr].position.tile.x, plr[myplr].position.tile.y); } void DrawInvMsg(const char *msg) @@ -1905,35 +1904,35 @@ static int PutItem(int pnum, int &x, int &y) if (numitems >= MAXITEMS) return false; - int xx = x - plr[pnum].position.current.x; - int yy = y - plr[pnum].position.current.y; + int xx = x - plr[pnum].position.tile.x; + int yy = y - plr[pnum].position.tile.y; - direction d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, x, y); + direction d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, x, y); if (abs(xx) > 1 || abs(yy) > 1) { - x = plr[pnum].position.current.x + offset_x[d]; - y = plr[pnum].position.current.y + offset_y[d]; + x = plr[pnum].position.tile.x + offset_x[d]; + y = plr[pnum].position.tile.y + offset_y[d]; } if (CanPut(x, y)) return true; direction dLeft = left[d]; - x = plr[pnum].position.current.x + offset_x[dLeft]; - y = plr[pnum].position.current.y + offset_y[dLeft]; + x = plr[pnum].position.tile.x + offset_x[dLeft]; + y = plr[pnum].position.tile.y + offset_y[dLeft]; if (CanPut(x, y)) return true; direction dRight = right[d]; - x = plr[pnum].position.current.x + offset_x[dRight]; - y = plr[pnum].position.current.y + offset_y[dRight]; + x = plr[pnum].position.tile.x + offset_x[dRight]; + y = plr[pnum].position.tile.y + offset_y[dRight]; if (CanPut(x, y)) return true; for (int l = 1; l < 50; l++) { for (int j = -l; j <= l; j++) { - int yp = j + plr[pnum].position.current.y; + int yp = j + plr[pnum].position.tile.y; for (int i = -l; i <= l; i++) { - int xp = i + plr[pnum].position.current.x; + int xp = i + plr[pnum].position.tile.x; if (!CanPut(xp, yp)) continue; @@ -1949,8 +1948,8 @@ static int PutItem(int pnum, int &x, int &y) int InvPutItem(int pnum, int x, int y) { - int xx = x - plr[pnum].position.current.x; - int yy = y - plr[pnum].position.current.y; + int xx = x - plr[pnum].position.tile.x; + int yy = y - plr[pnum].position.tile.y; if (!PutItem(pnum, x, y)) return -1; @@ -1959,7 +1958,7 @@ int InvPutItem(int pnum, int x, int y) int yp = cursmy; int xp = cursmx; if (plr[pnum].HoldItem._iCurs == ICURS_RUNE_BOMB && xp >= 79 && xp <= 82 && yp >= 61 && yp <= 64) { - NetSendCmdLocParam2(false, CMD_OPENHIVE, plr[pnum].position.current.x, plr[pnum].position.current.y, xx, yy); + NetSendCmdLocParam2(false, CMD_OPENHIVE, plr[pnum].position.tile.x, plr[pnum].position.tile.y, xx, yy); quests[Q_FARMER]._qactive = QUEST_DONE; if (gbIsMultiplayer) { NetSendCmdQuest(true, Q_FARMER); @@ -1983,8 +1982,7 @@ int InvPutItem(int pnum, int x, int y) dItem[x][y] = ii + 1; items[ii] = plr[pnum].HoldItem; - items[ii]._ix = x; - items[ii]._iy = y; + items[ii].position = { x, y }; RespawnItem(&items[ii], true); if (currlevel == 21 && x == CornerStone.x && y == CornerStone.y) { @@ -2028,8 +2026,7 @@ int SyncPutItem(int pnum, int x, int y, int idx, WORD icreateinfo, int iseed, in items[ii].dwBuff = ibuff; } - items[ii]._ix = x; - items[ii]._iy = y; + items[ii].position = { x, y }; RespawnItem(&items[ii], true); if (currlevel == 21 && x == CornerStone.x && y == CornerStone.y) { diff --git a/Source/items.cpp b/Source/items.cpp index 574cdab77..523bd37ce 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -445,8 +445,7 @@ void AddInitItems() x = GenerateRnd(80) + 16; y = GenerateRnd(80) + 16; } - items[ii]._ix = x; - items[ii]._iy = y; + items[ii].position = { x, y }; dItem[x][y] = ii + 1; @@ -503,8 +502,7 @@ void InitItems() for (i = 0; i < MAXITEMS; i++) { items[i]._itype = ITYPE_NONE; - items[i]._ix = 0; - items[i]._iy = 0; + items[i].position = { 0, 0 }; items[i]._iAnimFlag = false; items[i]._iSelFlag = 0; items[i]._iIdentified = false; @@ -1385,8 +1383,7 @@ static bool GetItemSpace(int x, int y, int8_t inum) xx += x - 1; yy += y - 1; - items[inum]._ix = xx; - items[inum]._iy = yy; + items[inum].position = { xx, yy }; dItem[xx][yy] = inum + 1; return true; @@ -1413,8 +1410,7 @@ static void GetSuperItemSpace(int x, int y, int8_t inum) for (int i = -k; i <= k; i++) { int xx = i + x; if (ItemSpaceOk(xx, yy)) { - items[inum]._ix = xx; - items[inum]._iy = yy; + items[inum].position = { xx, yy }; dItem[xx][yy] = inum + 1; return; } @@ -2851,8 +2847,7 @@ void items_427ABA(int x, int y) dItem[x][y] = ii + 1; UnPackItem(&PkSItem, &items[ii], (PkSItem.dwBuff & CF_HELLFIRE) != 0); - items[ii]._ix = x; - items[ii]._iy = y; + items[ii].position = { x, y }; RespawnItem(&items[ii], false); CornerStone.item = items[ii]; } @@ -2885,8 +2880,7 @@ void SpawnQuestItem(int itemid, int x, int y, int randarea, int selflag) int ii = AllocateItem(); - items[ii]._ix = x; - items[ii]._iy = y; + items[ii].position = { x, y }; dItem[x][y] = ii + 1; @@ -2919,11 +2913,10 @@ void SpawnRock() int ii = AllocateItem(); - int xx = object[oi]._ox; - int yy = object[oi]._oy; - items[ii]._ix = xx; - items[ii]._iy = yy; - dItem[xx][items[ii]._iy] = ii + 1; + int xx = object[oi].position.x; + int yy = object[oi].position.y; + items[ii].position = { xx, yy }; + dItem[xx][items[ii].position.y] = ii + 1; int curlv = items_get_currlevel(); GetItemAttrs(ii, IDI_ROCK, curlv); SetupItem(ii); @@ -2939,8 +2932,7 @@ void SpawnRewardItem(int itemid, int xx, int yy) int ii = AllocateItem(); - items[ii]._ix = xx; - items[ii]._iy = yy; + items[ii].position = { xx, yy }; dItem[xx][yy] = ii + 1; int curlv = items_get_currlevel(); GetItemAttrs(ii, itemid, curlv); @@ -2990,7 +2982,7 @@ void RespawnItem(ItemStruct *item, bool FlipFlag) if (item->_iCurs == ICURS_MAGIC_ROCK) { item->_iSelFlag = 1; - PlaySfxLoc(ItemDropSnds[it], item->_ix, item->_iy); + PlaySfxLoc(ItemDropSnds[it], item->position.x, item->position.y); } if (item->_iCurs == ICURS_TAVERN_SIGN) item->_iSelFlag = 1; @@ -3015,7 +3007,7 @@ void ItemDoppel() for (idoppelx = 16; idoppelx < 96; idoppelx++) { if (dItem[idoppelx][idoppely]) { i = &items[dItem[idoppelx][idoppely] - 1]; - if (i->_ix != idoppelx || i->_iy != idoppely) + if (i->position.x != idoppelx || i->position.y != idoppely) dItem[idoppelx][idoppely] = 0; } } @@ -3040,7 +3032,7 @@ void ProcessItems() items[ii]._iAnimFrame = 11; } else { if (items[ii]._iAnimFrame == items[ii]._iAnimLen / 2) - PlaySfxLoc(ItemDropSnds[ItemCAnimTbl[items[ii]._iCurs]], items[ii]._ix, items[ii]._iy); + PlaySfxLoc(ItemDropSnds[ItemCAnimTbl[items[ii]._iCurs]], items[ii].position.x, items[ii].position.y); if (items[ii]._iAnimFrame >= items[ii]._iAnimLen) { items[ii]._iAnimFrame = items[ii]._iAnimLen; @@ -3131,7 +3123,7 @@ void DoRepair(int pnum, int cii) ItemStruct *pi; p = &plr[pnum]; - PlaySfxLoc(IS_REPAIR, p->position.current.x, p->position.current.y); + PlaySfxLoc(IS_REPAIR, p->position.tile.x, p->position.tile.y); if (cii >= NUM_INVLOC) { pi = &p->InvList[cii - NUM_INVLOC]; diff --git a/Source/items.h b/Source/items.h index 7d86bc2cd..20a1b067c 100644 --- a/Source/items.h +++ b/Source/items.h @@ -166,15 +166,14 @@ struct ItemStruct { int32_t _iSeed; uint16_t _iCreateInfo; enum item_type _itype; - int16_t _ix; - int16_t _iy; + Point position; bool _iAnimFlag; uint8_t *_iAnimData; // PSX name -> ItemFrame uint8_t _iAnimLen; // Number of frames in current animation uint8_t _iAnimFrame; // Current frame of animation. int _iAnimWidth; int _iAnimWidth2; // width 2? - bool _iDelFlag; // set when item is flagged for deletion, deprecated in 1.02 + bool _iDelFlag; // set when item is flagged for deletion, deprecated in 1.02 uint8_t _iSelFlag; bool _iPostDraw; bool _iIdentified; diff --git a/Source/lighting.cpp b/Source/lighting.cpp index 28e9eed54..791363814 100644 --- a/Source/lighting.cpp +++ b/Source/lighting.cpp @@ -506,8 +506,8 @@ void DoLighting(int nXPos, int nYPos, int nRadius, int Lnum) block_y = 0; if (Lnum >= 0) { - xoff = LightList[Lnum]._xoff; - yoff = LightList[Lnum]._yoff; + xoff = LightList[Lnum].position.offset.x; + yoff = LightList[Lnum].position.offset.y; if (xoff < 0) { xoff += 8; nXPos--; @@ -994,7 +994,7 @@ void ToggleLighting() memcpy(dLight, dPreLight, sizeof(dLight)); for (i = 0; i < MAX_PLRS; i++) { if (plr[i].plractive && plr[i].plrlevel == currlevel) { - DoLighting(plr[i].position.current.x, plr[i].position.current.y, plr[i]._pLightRad, -1); + DoLighting(plr[i].position.tile.x, plr[i].position.tile.y, plr[i]._pLightRad, -1); } } } @@ -1035,11 +1035,9 @@ int AddLight(int x, int y, int r) if (numlights < MAXLIGHTS) { lid = lightactive[numlights++]; - LightList[lid]._lx = x; - LightList[lid]._ly = y; + LightList[lid].position.tile = { x, y }; LightList[lid]._lradius = r; - LightList[lid]._xoff = 0; - LightList[lid]._yoff = 0; + LightList[lid].position.offset = { 0, 0 }; LightList[lid]._ldel = false; LightList[lid]._lunflag = false; dolighting = true; @@ -1065,9 +1063,8 @@ void ChangeLightRadius(int i, int r) } LightList[i]._lunflag = true; - LightList[i]._lunx = LightList[i]._lx; - LightList[i]._luny = LightList[i]._ly; - LightList[i]._lunr = LightList[i]._lradius; + LightList[i].position.old = LightList[i].position.tile; + LightList[i].oldRadious = LightList[i]._lradius; LightList[i]._lradius = r; dolighting = true; } @@ -1079,11 +1076,9 @@ void ChangeLightXY(int i, int x, int y) } LightList[i]._lunflag = true; - LightList[i]._lunx = LightList[i]._lx; - LightList[i]._luny = LightList[i]._ly; - LightList[i]._lunr = LightList[i]._lradius; - LightList[i]._lx = x; - LightList[i]._ly = y; + LightList[i].position.old = LightList[i].position.tile; + LightList[i].oldRadious = LightList[i]._lradius; + LightList[i].position.tile = { x, y }; dolighting = true; } @@ -1094,11 +1089,9 @@ void ChangeLightOff(int i, int x, int y) } LightList[i]._lunflag = true; - LightList[i]._lunx = LightList[i]._lx; - LightList[i]._luny = LightList[i]._ly; - LightList[i]._lunr = LightList[i]._lradius; - LightList[i]._xoff = x; - LightList[i]._yoff = y; + LightList[i].position.old = LightList[i].position.tile; + LightList[i].oldRadious = LightList[i]._lradius; + LightList[i].position.offset = { x, y }; dolighting = true; } @@ -1109,11 +1102,9 @@ void ChangeLight(int i, int x, int y, int r) } LightList[i]._lunflag = true; - LightList[i]._lunx = LightList[i]._lx; - LightList[i]._luny = LightList[i]._ly; - LightList[i]._lunr = LightList[i]._lradius; - LightList[i]._lx = x; - LightList[i]._ly = y; + LightList[i].position.old = LightList[i].position.tile; + LightList[i].oldRadious = LightList[i]._lradius; + LightList[i].position.tile = { x, y }; LightList[i]._lradius = r; dolighting = true; } @@ -1131,17 +1122,17 @@ void ProcessLightList() for (i = 0; i < numlights; i++) { j = lightactive[i]; if (LightList[j]._ldel) { - DoUnLight(LightList[j]._lx, LightList[j]._ly, LightList[j]._lradius); + DoUnLight(LightList[j].position.tile.x, LightList[j].position.tile.y, LightList[j]._lradius); } if (LightList[j]._lunflag) { - DoUnLight(LightList[j]._lunx, LightList[j]._luny, LightList[j]._lunr); + DoUnLight(LightList[j].position.old.x, LightList[j].position.old.y, LightList[j].oldRadious); LightList[j]._lunflag = false; } } for (i = 0; i < numlights; i++) { j = lightactive[i]; if (!LightList[j]._ldel) { - DoLighting(LightList[j]._lx, LightList[j]._ly, LightList[j]._lradius, j); + DoLighting(LightList[j].position.tile.x, LightList[j].position.tile.y, LightList[j]._lradius, j); } } i = 0; @@ -1183,8 +1174,7 @@ int AddVision(int x, int y, int r, bool mine) int vid = -1; // BUGFIX: if numvision >= MAXVISION behavior is undefined (fixed) if (numvision < MAXVISION) { - VisionList[numvision]._lx = x; - VisionList[numvision]._ly = y; + VisionList[numvision].position.tile = { x, y }; VisionList[numvision]._lradius = r; vid = visionid++; VisionList[numvision]._lid = vid; @@ -1205,9 +1195,8 @@ void ChangeVisionRadius(int id, int r) for (i = 0; i < numvision; i++) { if (VisionList[i]._lid == id) { VisionList[i]._lunflag = true; - VisionList[i]._lunx = VisionList[i]._lx; - VisionList[i]._luny = VisionList[i]._ly; - VisionList[i]._lunr = VisionList[i]._lradius; + VisionList[i].position.old = VisionList[i].position.tile; + VisionList[i].oldRadious = VisionList[i]._lradius; VisionList[i]._lradius = r; dovision = true; } @@ -1221,11 +1210,9 @@ void ChangeVisionXY(int id, int x, int y) for (i = 0; i < numvision; i++) { if (VisionList[i]._lid == id) { VisionList[i]._lunflag = true; - VisionList[i]._lunx = VisionList[i]._lx; - VisionList[i]._luny = VisionList[i]._ly; - VisionList[i]._lunr = VisionList[i]._lradius; - VisionList[i]._lx = x; - VisionList[i]._ly = y; + VisionList[i].position.old = VisionList[i].position.tile; + VisionList[i].oldRadious = VisionList[i]._lradius; + VisionList[i].position.tile = { x, y }; dovision = true; } } @@ -1239,10 +1226,10 @@ void ProcessVisionList() if (dovision) { for (i = 0; i < numvision; i++) { if (VisionList[i]._ldel) { - DoUnVision(VisionList[i]._lx, VisionList[i]._ly, VisionList[i]._lradius); + DoUnVision(VisionList[i].position.tile.x, VisionList[i].position.tile.y, VisionList[i]._lradius); } if (VisionList[i]._lunflag) { - DoUnVision(VisionList[i]._lunx, VisionList[i]._luny, VisionList[i]._lunr); + DoUnVision(VisionList[i].position.old.x, VisionList[i].position.old.y, VisionList[i].oldRadious); VisionList[i]._lunflag = false; } } @@ -1252,8 +1239,8 @@ void ProcessVisionList() for (i = 0; i < numvision; i++) { if (!VisionList[i]._ldel) { DoVision( - VisionList[i]._lx, - VisionList[i]._ly, + VisionList[i].position.tile.x, + VisionList[i].position.tile.y, VisionList[i]._lradius, VisionList[i]._lflags, VisionList[i]._lflags); diff --git a/Source/lighting.h b/Source/lighting.h index 493335b1b..afc674ade 100644 --- a/Source/lighting.h +++ b/Source/lighting.h @@ -5,6 +5,7 @@ */ #pragma once +#include "engine.h" #include "miniwin/miniwin.h" namespace devilution { @@ -14,18 +15,21 @@ namespace devilution { #define LIGHTSIZE (27 * 256) #define NO_LIGHT -1 +struct LightPosition { + Point tile; + /** Pixel offset from tile. */ + Point offset; + /** Prevous position. */ + Point old; +}; + struct LightListStruct { - int _lx; - int _ly; + LightPosition position; int _lradius; int _lid; bool _ldel; bool _lunflag; - int _lunx; - int _luny; - int _lunr; - int _xoff; - int _yoff; + int oldRadious; bool _lflags; }; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 54840536e..b28405156 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -219,8 +219,8 @@ static void LoadItemData(LoadHelper *file, ItemStruct *pItem) pItem->_iCreateInfo = file->nextLE(); file->skip(2); // Alignment pItem->_itype = static_cast(file->nextLE()); - pItem->_ix = file->nextLE(); - pItem->_iy = file->nextLE(); + pItem->position.x = file->nextLE(); + pItem->position.y = file->nextLE(); pItem->_iAnimFlag = file->nextBool32(); file->skip(4); // Skip pointer _iAnimData pItem->_iAnimLen = file->nextLE(); @@ -324,8 +324,8 @@ static void LoadPlayer(LoadHelper *file, int p) pPlayer->destParam3 = static_cast(file->nextLE()); pPlayer->destParam4 = file->nextLE(); pPlayer->plrlevel = file->nextLE(); - pPlayer->position.current.x = file->nextLE(); - pPlayer->position.current.y = file->nextLE(); + pPlayer->position.tile.x = file->nextLE(); + pPlayer->position.tile.y = file->nextLE(); pPlayer->position.future.x = file->nextLE(); pPlayer->position.future.y = file->nextLE(); file->skip(8); // Skip _ptargx and _ptargy @@ -549,8 +549,8 @@ static void LoadMonster(LoadHelper *file, int i) file->skip(4); // Unused pMonster->_pathcount = file->nextLE(); file->skip(3); // Alignment - pMonster->position.current.x = file->nextLE(); - pMonster->position.current.y = file->nextLE(); + pMonster->position.tile.x = file->nextLE(); + pMonster->position.tile.y = file->nextLE(); pMonster->position.future.x = file->nextLE(); pMonster->position.future.y = file->nextLE(); pMonster->position.old.x = file->nextLE(); @@ -642,8 +642,8 @@ static void LoadMissile(LoadHelper *file, int i) MissileStruct *pMissile = &missile[i]; pMissile->_mitype = file->nextLE(); - pMissile->position.current.x = file->nextLE(); - pMissile->position.current.y = file->nextLE(); + pMissile->position.tile.x = file->nextLE(); + pMissile->position.tile.y = file->nextLE(); pMissile->position.offset.x = file->nextLE(); pMissile->position.offset.y = file->nextLE(); pMissile->position.velocity.x = file->nextLE(); @@ -693,8 +693,8 @@ static void LoadObject(LoadHelper *file, int i) ObjectStruct *pObject = &object[i]; pObject->_otype = static_cast<_object_id>(file->nextLE()); - pObject->_ox = file->nextLE(); - pObject->_oy = file->nextLE(); + pObject->position.x = file->nextLE(); + pObject->position.y = file->nextLE(); pObject->_oLight = file->nextBool32(); pObject->_oAnimFlag = file->nextLE(); file->skip(4); // Skip pointer _oAnimData @@ -746,8 +746,8 @@ static void LoadQuest(LoadHelper *file, int i) pQuest->_qtype = file->nextLE(); pQuest->_qactive = static_cast(file->nextLE()); pQuest->_qlvltype = static_cast(file->nextLE()); - pQuest->_qtx = file->nextLE(); - pQuest->_qty = file->nextLE(); + pQuest->position.x = file->nextLE(); + pQuest->position.y = file->nextLE(); pQuest->_qslvl = static_cast<_setlevels>(file->nextLE()); pQuest->_qidx = file->nextLE(); if (gbIsHellfireSaveGame) { @@ -772,18 +772,18 @@ static void LoadQuest(LoadHelper *file, int i) static void LoadLighting(LoadHelper *file, LightListStruct *pLight) { - pLight->_lx = file->nextLE(); - pLight->_ly = file->nextLE(); + pLight->position.tile.x = file->nextLE(); + pLight->position.tile.y = file->nextLE(); pLight->_lradius = file->nextLE(); pLight->_lid = file->nextLE(); pLight->_ldel = file->nextBool32(); pLight->_lunflag = file->nextBool32(); file->skip(4); // Unused - pLight->_lunx = file->nextLE(); - pLight->_luny = file->nextLE(); - pLight->_lunr = file->nextLE(); - pLight->_xoff = file->nextLE(); - pLight->_yoff = file->nextLE(); + pLight->position.old.x = file->nextLE(); + pLight->position.old.y = file->nextLE(); + pLight->oldRadious = file->nextLE(); + pLight->position.offset.x = file->nextLE(); + pLight->position.offset.y = file->nextLE(); pLight->_lflags = file->nextBool32(); } @@ -792,8 +792,8 @@ static void LoadPortal(LoadHelper *file, int i) PortalStruct *pPortal = &portal[i]; pPortal->open = file->nextBool32(); - pPortal->x = file->nextLE(); - pPortal->y = file->nextLE(); + pPortal->position.x = file->nextLE(); + pPortal->position.y = file->nextLE(); pPortal->level = file->nextLE(); pPortal->ltype = static_cast(file->nextLE()); pPortal->setlvl = file->nextBool32(); @@ -981,7 +981,7 @@ void RemoveEmptyLevelItems() for (int i = numitems; i > 0; i--) { int ii = itemactive[i]; if (items[ii].isEmpty()) { - dItem[items[ii]._ix][items[ii]._iy] = 0; + dItem[items[ii].position.x][items[ii].position.y] = 0; DeleteItem(ii, i); } } @@ -1204,8 +1204,8 @@ static void SaveItem(SaveHelper *file, ItemStruct *pItem) file->writeLE(pItem->_iCreateInfo); file->skip(2); // Alignment file->writeLE(iType); - file->writeLE(pItem->_ix); - file->writeLE(pItem->_iy); + file->writeLE(pItem->position.x); + file->writeLE(pItem->position.y); file->writeLE(pItem->_iAnimFlag); file->skip(4); // Skip pointer _iAnimData file->writeLE(pItem->_iAnimLen); @@ -1300,8 +1300,8 @@ static void SavePlayer(SaveHelper *file, int p) file->writeLE(pPlayer->destParam3); file->writeLE(pPlayer->destParam4); file->writeLE(pPlayer->plrlevel); - file->writeLE(pPlayer->position.current.x); - file->writeLE(pPlayer->position.current.y); + file->writeLE(pPlayer->position.tile.x); + file->writeLE(pPlayer->position.tile.y); file->writeLE(pPlayer->position.future.x); file->writeLE(pPlayer->position.future.y); @@ -1518,8 +1518,8 @@ static void SaveMonster(SaveHelper *file, int i) file->skip(4); // Unused file->writeLE(pMonster->_pathcount); file->skip(3); // Alignment - file->writeLE(pMonster->position.current.x); - file->writeLE(pMonster->position.current.y); + file->writeLE(pMonster->position.tile.x); + file->writeLE(pMonster->position.tile.y); file->writeLE(pMonster->position.future.x); file->writeLE(pMonster->position.future.y); file->writeLE(pMonster->position.old.x); @@ -1601,8 +1601,8 @@ static void SaveMissile(SaveHelper *file, int i) MissileStruct *pMissile = &missile[i]; file->writeLE(pMissile->_mitype); - file->writeLE(pMissile->position.current.x); - file->writeLE(pMissile->position.current.y); + file->writeLE(pMissile->position.tile.x); + file->writeLE(pMissile->position.tile.y); file->writeLE(pMissile->position.offset.x); file->writeLE(pMissile->position.offset.y); file->writeLE(pMissile->position.velocity.x); @@ -1652,8 +1652,8 @@ static void SaveObject(SaveHelper *file, int i) ObjectStruct *pObject = &object[i]; file->writeLE(pObject->_otype); - file->writeLE(pObject->_ox); - file->writeLE(pObject->_oy); + file->writeLE(pObject->position.x); + file->writeLE(pObject->position.y); file->writeLE(pObject->_oLight); file->writeLE(pObject->_oAnimFlag); file->skip(4); // Skip pointer _oAnimData @@ -1699,8 +1699,8 @@ static void SaveQuest(SaveHelper *file, int i) file->writeLE(pQuest->_qtype); file->writeLE(pQuest->_qactive); file->writeLE(pQuest->_qlvltype); - file->writeLE(pQuest->_qtx); - file->writeLE(pQuest->_qty); + file->writeLE(pQuest->position.x); + file->writeLE(pQuest->position.y); file->writeLE(pQuest->_qslvl); file->writeLE(pQuest->_qidx); if (gbIsHellfire) { @@ -1725,18 +1725,18 @@ static void SaveQuest(SaveHelper *file, int i) static void SaveLighting(SaveHelper *file, LightListStruct *pLight) { - file->writeLE(pLight->_lx); - file->writeLE(pLight->_ly); + file->writeLE(pLight->position.tile.x); + file->writeLE(pLight->position.tile.y); file->writeLE(pLight->_lradius); file->writeLE(pLight->_lid); file->writeLE(pLight->_ldel); file->writeLE(pLight->_lunflag); file->skip(4); // Unused - file->writeLE(pLight->_lunx); - file->writeLE(pLight->_luny); - file->writeLE(pLight->_lunr); - file->writeLE(pLight->_xoff); - file->writeLE(pLight->_yoff); + file->writeLE(pLight->position.old.x); + file->writeLE(pLight->position.old.y); + file->writeLE(pLight->oldRadious); + file->writeLE(pLight->position.offset.x); + file->writeLE(pLight->position.offset.y); file->writeLE(pLight->_lflags); } @@ -1745,8 +1745,8 @@ static void SavePortal(SaveHelper *file, int i) PortalStruct *pPortal = &portal[i]; file->writeLE(pPortal->open); - file->writeLE(pPortal->x); - file->writeLE(pPortal->y); + file->writeLE(pPortal->position.x); + file->writeLE(pPortal->position.y); file->writeLE(pPortal->level); file->writeLE(pPortal->ltype); file->writeLE(pPortal->setlvl); @@ -1933,7 +1933,7 @@ void SaveLevel() { PFileScopedArchiveWriter scoped_writer; - DoUnVision(plr[myplr].position.current.x, plr[myplr].position.current.y, plr[myplr]._pLightRad); // fix for vision staying on the level + DoUnVision(plr[myplr].position.tile.x, plr[myplr].position.tile.y, plr[myplr]._pLightRad); // fix for vision staying on the level if (currlevel == 0) glSeedTbl[0] = AdvanceRndSeed(); diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 75f5b578b..628518432 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -386,8 +386,8 @@ void PutMissile(int i) { int x, y; - x = missile[i].position.current.x; - y = missile[i].position.current.y; + x = missile[i].position.tile.x; + y = missile[i].position.tile.y; if (x <= 0 || y <= 0 || x >= MAXDUNX || y >= MAXDUNY) missile[i]._miDelFlag = true; if (!missile[i]._miDelFlag) { @@ -423,8 +423,8 @@ void GetMissilePos(int i) ly = dy / 8; dy = dy / 64; } - missile[i].position.current.x = dx + missile[i].position.start.x; - missile[i].position.current.y = dy + missile[i].position.start.y; + missile[i].position.tile.x = dx + missile[i].position.start.x; + missile[i].position.tile.y = dy + missile[i].position.start.y; missile[i].position.offset.x = mx + (dy * 32) - (dx * 32); missile[i].position.offset.y = my - (dx * 16) - (dy * 16); ChangeLightOff(missile[i]._mlid, lx - (dx * 8), ly - (dy * 8)); @@ -468,11 +468,11 @@ void MoveMissilePos(int i) dy = 1; break; } - x = missile[i].position.current.x + dx; - y = missile[i].position.current.y + dy; + x = missile[i].position.tile.x + dx; + y = missile[i].position.tile.y + dy; if (PosOkMonst(missile[i]._misource, x, y)) { - missile[i].position.current.x += dx; - missile[i].position.current.y += dy; + missile[i].position.tile.x += dx; + missile[i].position.tile.y += dy; missile[i].position.offset.x += (dy * 32) - (dx * 32); missile[i].position.offset.y -= (dy * 16) + (dx * 16); } @@ -676,7 +676,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool if (monster[m]._msquelch == 0) { monster[m]._msquelch = UCHAR_MAX; - monster[m].position.last = plr[pnum].position.current; + monster[m].position.last = plr[pnum].position.tile; } return true; } @@ -796,7 +796,7 @@ bool PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, bool s if ((resper <= 0 || gbIsHellfire) && blk < blkper) { direction dir = plr[pnum]._pdir; if (m != -1) { - dir = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, monster[m].position.current.x, monster[m].position.current.y); + dir = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, monster[m].position.tile.x, monster[m].position.tile.y); } *blocked = true; StartPlrBlock(pnum, dir); @@ -924,7 +924,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, b return true; } if (blkper < blk) { - StartPlrBlock(p, GetDirection(plr[p].position.current.x, plr[p].position.current.y, plr[pnum].position.current.x, plr[pnum].position.current.y)); + StartPlrBlock(p, GetDirection(plr[p].position.tile.x, plr[p].position.tile.y, plr[pnum].position.tile.x, plr[pnum].position.tile.y)); *blocked = true; } else { if (pnum == myplr) @@ -1103,7 +1103,7 @@ void CheckMissileCol(int i, int mindam, int maxdam, bool shift, int mx, int my, missile[i]._miHitFlag = false; } if (missile[i]._mirange == 0 && missiledata[missile[i]._mitype].miSFX != -1) - PlaySfxLoc(missiledata[missile[i]._mitype].miSFX, missile[i].position.current.x, missile[i].position.current.y); + PlaySfxLoc(missiledata[missile[i]._mitype].miSFX, missile[i].position.tile.x, missile[i].position.tile.y); } void SetMissAnim(int mi, int animtype) @@ -1288,7 +1288,7 @@ static bool missiles_found_target(int mi, int *x, int *y, int rad) if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { dp = dPiece[tx][ty]; if (!nSolidTable[dp] && dObject[tx][ty] == 0 && dMissile[tx][ty] == 0) { - missile[mi].position.current = { tx, ty }; + missile[mi].position.tile = { tx, ty }; *x = tx; *y = ty; found = true; @@ -1431,7 +1431,7 @@ void AddBerserk(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienem r = 3; else r = 9; - monster[dm].mlid = AddLight(monster[dm].position.current.x, monster[dm].position.current.y, r); + monster[dm].mlid = AddLight(monster[dm].position.tile.x, monster[dm].position.tile.y, r); UseMana(id, SPL_BERSERK); break; } @@ -1640,8 +1640,8 @@ void AddWarp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, dist = INT_MAX; if (id >= 0) { - sx = plr[id].position.current.x; - sy = plr[id].position.current.y; + sx = plr[id].position.tile.x; + sy = plr[id].position.tile.y; } tx = sx; ty = sy; @@ -1650,11 +1650,11 @@ void AddWarp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, trg = &trigs[i]; if (trg->_tmsg == 1032 || trg->_tmsg == 1027 || trg->_tmsg == 1026 || trg->_tmsg == 1028) { if ((leveltype == 1 || leveltype == 2) && (trg->_tmsg == 1026 || trg->_tmsg == 1027 || trg->_tmsg == 1028)) { - fx = trg->_tx; - fy = trg->_ty + 1; + fx = trg->position.x; + fy = trg->position.y + 1; } else { - fx = trg->_tx + 1; - fy = trg->_ty; + fx = trg->position.x + 1; + fy = trg->position.y; } int dify = (sy - fy); int difx = (sx - fx); @@ -1668,7 +1668,7 @@ void AddWarp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, } missile[mi]._mirange = 2; missile[mi]._miVar1 = 0; - missile[mi].position.current = { tx, ty }; + missile[mi].position.tile = { tx, ty }; if (mienemy == TARGET_MONSTERS) UseMana(id, SPL_WARP); } @@ -1683,8 +1683,8 @@ void AddLightningWall(int mi, int sx, int sy, int dx, int dy, int midir, int8_t missile[mi]._miVar1 = sx; missile[mi]._miVar2 = sy; } else { - missile[mi]._miVar1 = plr[id].position.current.x; - missile[mi]._miVar2 = plr[id].position.current.y; + missile[mi]._miVar1 = plr[id].position.tile.x; + missile[mi]._miVar2 = plr[id].position.tile.y; } } @@ -1699,15 +1699,15 @@ void AddRuneExplosion(int mi, int sx, int sy, int dx, int dy, int midir, int8_t } dmg = missile[mi]._midam; - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x - 1, missile[mi].position.current.y - 1, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x, missile[mi].position.current.y - 1, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x + 1, missile[mi].position.current.y - 1, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x - 1, missile[mi].position.current.y, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x, missile[mi].position.current.y, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x + 1, missile[mi].position.current.y, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x - 1, missile[mi].position.current.y + 1, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x, missile[mi].position.current.y + 1, true); - CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.current.x + 1, missile[mi].position.current.y + 1, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x - 1, missile[mi].position.tile.y - 1, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x, missile[mi].position.tile.y - 1, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x + 1, missile[mi].position.tile.y - 1, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x - 1, missile[mi].position.tile.y, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x, missile[mi].position.tile.y, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x + 1, missile[mi].position.tile.y, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x - 1, missile[mi].position.tile.y + 1, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x, missile[mi].position.tile.y + 1, true); + CheckMissileCol(mi, dmg, dmg, false, missile[mi].position.tile.x + 1, missile[mi].position.tile.y + 1, true); } missile[mi]._mlid = AddLight(sx, sy, 8); SetMissDir(mi, 0); @@ -1788,8 +1788,8 @@ void AddLightningArrow(int mi, int sx, int sy, int dx, int dy, int midir, int8_t missile[mi]._miVar1 = sx; missile[mi]._miVar2 = sy; } else { - missile[mi]._miVar1 = plr[id].position.current.x; - missile[mi]._miVar2 = plr[id].position.current.y; + missile[mi]._miVar1 = plr[id].position.tile.x; + missile[mi]._miVar2 = plr[id].position.tile.y; } missile[mi]._midam <<= 6; } @@ -1993,13 +1993,13 @@ void GetVileMissPos(int mi, int dx, int dy) for (i = -k; i <= k; i++) { xx = i + dx; if (PosOkPlayer(myplr, xx, yy)) { - missile[mi].position.current = { xx, yy }; + missile[mi].position.tile = { xx, yy }; return; } } } } - missile[mi].position.current = { dx, dy }; + missile[mi].position.tile = { dx, dy }; } void AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) @@ -2031,14 +2031,14 @@ void AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mi missile[mi]._mirange = 2; missile[mi]._miVar1 = 0; if (!setlevel || setlvlnum != SL_VILEBETRAYER) { - missile[mi].position.current = { r1, r2 }; + missile[mi].position.tile = { r1, r2 }; if (mienemy == TARGET_MONSTERS) UseMana(id, SPL_RNDTELEPORT); } else { pn = dObject[dx][dy] - 1; // BUGFIX: should only run magic circle check if dObject[dx][dy] is non-zero. if (object[pn]._otype == OBJ_MCIRCLE1 || object[pn]._otype == OBJ_MCIRCLE2) { - missile[mi].position.current = { dx, dy }; + missile[mi].position.tile = { dx, dy }; if (!PosOkPlayer(myplr, dx, dy)) GetVileMissPos(mi, dx, dy); } @@ -2116,7 +2116,7 @@ void AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, int8_t miene ty = dy + CrawlTable[pn]; if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) { if ((nSolidTable[dPiece[tx][ty]] | dMonster[tx][ty] | dObject[tx][ty] | dPlayer[tx][ty]) == 0) { - missile[mi].position.current = { tx, ty }; + missile[mi].position.tile = { tx, ty }; missile[mi].position.start = { tx, ty }; missile[mi]._miDelFlag = false; i = 6; @@ -2143,8 +2143,8 @@ void AddLightball(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mien missile[mi]._miVar1 = sx; missile[mi]._miVar2 = sy; } else { - missile[mi]._miVar1 = plr[id].position.current.x; - missile[mi]._miVar2 = plr[id].position.current.y; + missile[mi]._miVar1 = plr[id].position.tile.x; + missile[mi]._miVar2 = plr[id].position.tile.y; } } @@ -2228,7 +2228,7 @@ void AddLightning(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mien } else { missile[mi]._mirange = (missile[mi]._mispllvl / 2) + 6; } - missile[mi]._mlid = AddLight(missile[mi].position.current.x, missile[mi].position.current.y, 4); + missile[mi]._mlid = AddLight(missile[mi].position.tile.x, missile[mi].position.tile.y, 4); } void AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) @@ -2252,7 +2252,7 @@ void AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy } } - missile[mi].position.current = missile[dx].position.current; + missile[mi].position.tile = missile[dx].position.tile; missile[mi].position.start = missile[dx].position.start; missile[mi].position.offset = missile[dx].position.offset; missile[mi].position.traveled = missile[dx].position.traveled; @@ -2263,7 +2263,7 @@ void AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy void AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) { - missile[mi].position.current = { sx, sy }; + missile[mi].position.tile = { sx, sy }; missile[mi].position.start = { sx, sy }; missile[mi].position.velocity = { 0, 0 }; missile[mi]._miVar1 = 0; @@ -2281,7 +2281,7 @@ bool CheckIfTrig(int x, int y) int i; for (i = 0; i < numtrigs; i++) { - if ((x == trigs[i]._tx && y == trigs[i]._ty) || (abs(trigs[i]._tx - x) < 2 && abs(trigs[i]._ty - y) < 2)) + if ((x == trigs[i].position.x && y == trigs[i].position.y) || (abs(trigs[i].position.x - x) < 2 && abs(trigs[i].position.y - y) < 2)) return true; } return false; @@ -2302,7 +2302,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, dp = dPiece[tx][ty]; if ((dMissile[tx][ty] | nSolidTable[dp] | nMissileTable[dp] | dObject[tx][ty] | dPlayer[tx][ty]) == 0) { if (!CheckIfTrig(tx, ty)) { - missile[mi].position.current = { tx, ty }; + missile[mi].position.tile = { tx, ty }; missile[mi].position.start = { tx, ty }; missile[mi]._miDelFlag = false; j = 6; @@ -2316,7 +2316,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, } else { tx = dx; ty = dy; - missile[mi].position.current = { tx, ty }; + missile[mi].position.tile = { tx, ty }; missile[mi].position.start = { tx, ty }; missile[mi]._miDelFlag = false; } @@ -2401,8 +2401,8 @@ void AddFiremove(int mi, int sx, int sy, int dx, int dy, int midir, int8_t miene missile[mi]._mirange = 255; missile[mi]._miVar1 = 0; missile[mi]._miVar2 = 0; - missile[mi].position.current.x++; - missile[mi].position.current.y++; + missile[mi].position.tile.x++; + missile[mi].position.tile.y++; missile[mi].position.offset.y -= 32; } @@ -2426,7 +2426,7 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, int8_t miene if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { if (LineClearMissile(sx, sy, tx, ty)) { if ((dMonster[tx][ty] | nSolidTable[pn] | nMissileTable[pn] | dObject[tx][ty] | dMissile[tx][ty]) == 0) { - missile[mi].position.current = { tx, ty }; + missile[mi].position.tile = { tx, ty }; missile[mi].position.start = { tx, ty }; missile[mi]._miDelFlag = false; UseMana(id, SPL_GUARDIAN); @@ -2441,7 +2441,7 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, int8_t miene if (!missile[mi]._miDelFlag) { missile[mi]._misource = id; - missile[mi]._mlid = AddLight(missile[mi].position.current.x, missile[mi].position.current.y, 1); + missile[mi]._mlid = AddLight(missile[mi].position.tile.x, missile[mi].position.tile.y, 1); missile[mi]._mirange = missile[mi]._mispllvl + (plr[id]._pLevel / 2); missile[mi]._mirange += (missile[mi]._mirange * plr[id]._pISplDur) / 128; @@ -2549,7 +2549,7 @@ void AddFireman(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienem if (monster[id]._uniqtype != 0) missile[mi]._miUniqTrans = monster[id]._uniqtrans + 1; mon = &monster[id]; - dMonster[mon->position.current.x][mon->position.current.y] = 0; + dMonster[mon->position.tile.x][mon->position.tile.y] = 0; missile[mi]._mirange = 256; PutMissile(mi); } @@ -2653,8 +2653,8 @@ void AddStone(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, if (j != -99) { missile[mi]._miDelFlag = true; } else { - missile[mi].position.current = { tx, ty }; - missile[mi].position.start = missile[mi].position.current; + missile[mi].position.tile = { tx, ty }; + missile[mi].position.start = missile[mi].position.tile; missile[mi]._mirange = missile[mi]._mispllvl + 6; missile[mi]._mirange += (missile[mi]._mirange * plr[id]._pISplDur) / 128; @@ -2684,7 +2684,7 @@ void AddGolem(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, missile[mi]._miVar2 = sy; missile[mi]._miVar4 = dx; missile[mi]._miVar5 = dy; - if ((monster[id].position.current.x != 1 || monster[id].position.current.y) && id == myplr) + if ((monster[id].position.tile.x != 1 || monster[id].position.tile.y) && id == myplr) M_StartKill(id, id); UseMana(id, SPL_GOLEM); } @@ -2712,7 +2712,7 @@ void AddDummy(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, void AddBlodbur(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) { missile[mi]._midam = dam; - missile[mi].position.current = { sx, sy }; + missile[mi].position.tile = { sx, sy }; missile[mi].position.start = { sx, sy }; missile[mi]._misource = id; if (dam == 1) @@ -2725,7 +2725,7 @@ void AddBlodbur(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienem void AddBoom(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) { - missile[mi].position.current = { dx, dy }; + missile[mi].position.tile = { dx, dy }; missile[mi].position.start = { dx, dy }; missile[mi].position.velocity = { 0, 0 }; missile[mi]._midam = dam; @@ -3103,8 +3103,8 @@ void AddResurrect(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mien void AddResurrectBeam(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) { - missile[mi].position.current = { dx, dy }; - missile[mi].position.start = missile[mi].position.current; + missile[mi].position.tile = { dx, dy }; + missile[mi].position.start = missile[mi].position.tile; missile[mi].position.velocity = { 0, 0 }; missile[mi]._mirange = misfiledata[MFILE_RESSUR1].mAnimLen[0]; } @@ -3141,7 +3141,7 @@ void AddBoneSpirit(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mie void AddRportal(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mienemy, int id, int dam) { - missile[mi].position.current = { sx, sy }; + missile[mi].position.tile = { sx, sy }; missile[mi].position.start = { sx, sy }; missile[mi]._mirange = 100; missile[mi]._miVar1 = 100 - missile[mi]._miAnimLen; @@ -3203,7 +3203,7 @@ int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, int8_t mic else SetMissDir(mi, midir); - missile[mi].position.current = { sx, sy }; + missile[mi].position.tile = { sx, sy }; missile[mi].position.offset = { 0, 0 }; missile[mi].position.start = { sx, sy }; missile[mi].position.traveled = { 0, 0 }; @@ -3230,11 +3230,11 @@ int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, int8_t mic int Sentfire(int i, int sx, int sy) { int ex = 0; - if (LineClearMissile(missile[i].position.current.x, missile[i].position.current.y, sx, sy)) { + if (LineClearMissile(missile[i].position.tile.x, missile[i].position.tile.y, sx, sy)) { if (dMonster[sx][sy] > 0 && monster[dMonster[sx][sy] - 1]._mhitpoints >> 6 > 0 && dMonster[sx][sy] - 1 > MAX_PLRS - 1) { - direction dir = GetDirection(missile[i].position.current.x, missile[i].position.current.y, sx, sy); + direction dir = GetDirection(missile[i].position.tile.x, missile[i].position.tile.y, sx, sy); missile[i]._miVar3 = missileavail[0]; - AddMissile(missile[i].position.current.x, missile[i].position.current.y, sx, sy, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile[i]._misource, missile[i]._midam, GetSpellLevel(missile[i]._misource, SPL_FIREBOLT)); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, sx, sy, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile[i]._misource, missile[i]._midam, GetSpellLevel(missile[i]._misource, SPL_FIREBOLT)); ex = -1; } } @@ -3257,7 +3257,7 @@ void MI_Golem(int i) const char *ct; src = missile[i]._misource; - if (monster[src].position.current.x == 1 && monster[src].position.current.y == 0) { + if (monster[src].position.tile.x == 1 && monster[src].position.tile.y == 0) { for (l = 0; l < 6; l++) { k = CrawlNum[l]; tid = k + 2; @@ -3289,7 +3289,7 @@ void MI_LArrow(int i) missile[i]._mirange--; p = missile[i]._misource; if (missile[i]._miAnimType == MFILE_MINILTNG || missile[i]._miAnimType == MFILE_MAGBLOS) { - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, missile[i]._miAnimFrame + 5); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, missile[i]._miAnimFrame + 5); missile_resistance rst = missiledata[missile[i]._mitype].mResist; if (missile[i]._mitype == MIS_LARROW) { if (p != -1) { @@ -3300,7 +3300,7 @@ void MI_LArrow(int i) maxd = GenerateRnd(10) + 1 + currlevel * 2; } missiledata[MIS_LARROW].mResist = MISR_LIGHTNING; - CheckMissileCol(i, mind, maxd, false, missile[i].position.current.x, missile[i].position.current.y, true); + CheckMissileCol(i, mind, maxd, false, missile[i].position.tile.x, missile[i].position.tile.y, true); } if (missile[i]._mitype == MIS_FARROW) { if (p != -1) { @@ -3311,7 +3311,7 @@ void MI_LArrow(int i) maxd = GenerateRnd(10) + 1 + currlevel * 2; } missiledata[MIS_FARROW].mResist = MISR_FIRE; - CheckMissileCol(i, mind, maxd, false, missile[i].position.current.x, missile[i].position.current.y, true); + CheckMissileCol(i, mind, maxd, false, missile[i].position.tile.x, missile[i].position.tile.y, true); } missiledata[missile[i]._mitype].mResist = rst; } else { @@ -3333,10 +3333,10 @@ void MI_LArrow(int i) maxd = GenerateRnd(10) + 1 + currlevel * 2; } - if (missile[i].position.current.x != missile[i].position.start.x || missile[i].position.current.y != missile[i].position.start.y) { + if (missile[i].position.tile.x != missile[i].position.start.x || missile[i].position.tile.y != missile[i].position.start.y) { missile_resistance rst = missiledata[missile[i]._mitype].mResist; missiledata[missile[i]._mitype].mResist = MISR_NONE; - CheckMissileCol(i, mind, maxd, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, mind, maxd, false, missile[i].position.tile.x, missile[i].position.tile.y, false); missiledata[missile[i]._mitype].mResist = rst; } if (missile[i]._mirange == 0) { @@ -3350,9 +3350,9 @@ void MI_LArrow(int i) SetMissAnim(i, MFILE_MAGBLOS); missile[i]._mirange = missile[i]._miAnimLen - 1; } else { - if (missile[i].position.current.x != missile[i]._miVar1 || missile[i].position.current.y != missile[i]._miVar2) { - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + if (missile[i].position.tile.x != missile[i]._miVar1 || missile[i].position.tile.y != missile[i]._miVar2) { + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; ChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 5); } } @@ -3386,8 +3386,8 @@ void MI_Arrow(int i) mind = currlevel; maxd = 2 * currlevel; } - if (missile[i].position.current.x != missile[i].position.start.x || missile[i].position.current.y != missile[i].position.start.y) - CheckMissileCol(i, mind, maxd, false, missile[i].position.current.x, missile[i].position.current.y, false); + if (missile[i].position.tile.x != missile[i].position.start.x || missile[i].position.tile.y != missile[i].position.start.y) + CheckMissileCol(i, mind, maxd, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._mirange == 0) missile[i]._miDelFlag = true; PutMissile(i); @@ -3425,8 +3425,8 @@ void MI_Firebolt(int i) } else { d = currlevel + GenerateRnd(2 * currlevel); } - if (missile[i].position.current.x != missile[i].position.start.x || missile[i].position.current.y != missile[i].position.start.y) { - CheckMissileCol(i, d, d, false, missile[i].position.current.x, missile[i].position.current.y, false); + if (missile[i].position.tile.x != missile[i].position.start.x || missile[i].position.tile.y != missile[i].position.start.y) { + CheckMissileCol(i, d, d, false, missile[i].position.tile.x, missile[i].position.tile.y, false); } if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; @@ -3435,13 +3435,13 @@ void MI_Firebolt(int i) switch (missile[i]._mitype) { case MIS_FIREBOLT: case MIS_MAGMABALL: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_MISEXP, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_MISEXP, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_FLARE: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_MISEXP2, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_MISEXP2, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_ACID: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_MISEXP3, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_MISEXP3, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_BONESPIRIT: SetMissDir(i, DIR_OMNI); @@ -3450,28 +3450,28 @@ void MI_Firebolt(int i) PutMissile(i); return; case MIS_LICH: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_EXORA1, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_EXORA1, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_PSYCHORB: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_EXBL2, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_EXBL2, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_NECROMORB: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_EXRED3, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_EXRED3, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_ARCHLICH: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_EXYEL2, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_EXYEL2, missile[i]._micaster, missile[i]._misource, 0, 0); break; case MIS_BONEDEMON: - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_EXBL3, missile[i]._micaster, missile[i]._misource, 0, 0); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_EXBL3, missile[i]._micaster, missile[i]._misource, 0, 0); break; } if (missile[i]._mlid != NO_LIGHT) AddUnLight(missile[i]._mlid); PutMissile(i); } else { - if (missile[i].position.current.x != missile[i]._miVar1 || missile[i].position.current.y != missile[i]._miVar2) { - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + if (missile[i].position.tile.x != missile[i]._miVar1 || missile[i].position.tile.y != missile[i]._miVar2) { + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; if (missile[i]._mlid != NO_LIGHT) ChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8); } @@ -3481,7 +3481,7 @@ void MI_Firebolt(int i) if (missile[i]._mlid != NO_LIGHT) AddUnLight(missile[i]._mlid); missile[i]._miDelFlag = true; - PlaySfxLoc(LS_BSIMPCT, missile[i].position.current.x, missile[i].position.current.y); + PlaySfxLoc(LS_BSIMPCT, missile[i].position.tile.x, missile[i].position.tile.y); PutMissile(i); } else PutMissile(i); @@ -3499,11 +3499,11 @@ void MI_Lightball(int i) missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); j = missile[i]._mirange; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._miHitFlag) missile[i]._mirange = j; obj = dObject[tx][ty]; - if (obj && tx == missile[i].position.current.x && ty == missile[i].position.current.y) { + if (obj && tx == missile[i].position.tile.x && ty == missile[i].position.tile.y) { if (obj > 0) { oi = obj - 1; } else { @@ -3523,7 +3523,7 @@ void MI_Krull(int i) missile[i].position.traveled.x += missile[i].position.velocity.x; missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._mirange == 0) missile[i]._miDelFlag = true; PutMissile(i); @@ -3535,7 +3535,7 @@ void MI_Acidpud(int i) missile[i]._mirange--; range = missile[i]._mirange; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y, false); missile[i]._mirange = range; if (range == 0) { if (missile[i]._mimfnum != 0) { @@ -3562,15 +3562,15 @@ void MI_Firewall(int i) missile[i]._miAnimFrame = 13; missile[i]._miAnimAdd = -1; } - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y, true); if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; AddUnLight(missile[i]._mlid); } if (missile[i]._mimfnum != 0 && missile[i]._mirange != 0 && missile[i]._miAnimAdd != -1 && missile[i]._miVar2 < 12) { if (missile[i]._miVar2 == 0) - missile[i]._mlid = AddLight(missile[i].position.current.x, missile[i].position.current.y, ExpLight[0]); - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, ExpLight[missile[i]._miVar2]); + missile[i]._mlid = AddLight(missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[0]); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[missile[i]._miVar2]); missile[i]._miVar2++; } PutMissile(i); @@ -3583,11 +3583,11 @@ void FireballUpdate(int i, int xof, int yof, bool alwaysDelete) int px, py; int id = missile[i]._misource; if (missile[i]._micaster == TARGET_MONSTERS) { - px = plr[id].position.current.x; - py = plr[id].position.current.y; + px = plr[id].position.tile.x; + py = plr[id].position.tile.y; } else { - px = monster[id].position.current.x; - py = monster[id].position.current.y; + px = monster[id].position.tile.x; + py = monster[id].position.tile.y; } if (missile[i]._miAnimType == MFILE_BIGEXP) { @@ -3600,12 +3600,12 @@ void FireballUpdate(int i, int xof, int yof, bool alwaysDelete) missile[i].position.traveled.x += xof; missile[i].position.traveled.y += yof; GetMissilePos(i); - if (missile[i].position.current.x != missile[i].position.start.x || missile[i].position.current.y != missile[i].position.start.y) - CheckMissileCol(i, dam, dam, false, missile[i].position.current.x, missile[i].position.current.y, false); + if (missile[i].position.tile.x != missile[i].position.start.x || missile[i].position.tile.y != missile[i].position.start.y) + CheckMissileCol(i, dam, dam, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._mirange == 0) { - int mx = missile[i].position.current.x; - int my = missile[i].position.current.y; - ChangeLight(missile[i]._mlid, missile[i].position.current.x, my, missile[i]._miAnimFrame); + int mx = missile[i].position.tile.x; + int my = missile[i].position.tile.y; + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, my, missile[i]._miAnimFrame); if (!CheckBlock(px, py, mx, my)) CheckMissileCol(i, dam, dam, false, mx, my, true); if (!CheckBlock(px, py, mx, my + 1)) @@ -3626,8 +3626,8 @@ void FireballUpdate(int i, int xof, int yof, bool alwaysDelete) CheckMissileCol(i, dam, dam, false, mx - 1, my - 1, true); if (!TransList[dTransVal[mx][my]] || (missile[i].position.velocity.x < 0 && ((TransList[dTransVal[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]) || (TransList[dTransVal[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])))) { - missile[i].position.current.x++; - missile[i].position.current.y++; + missile[i].position.tile.x++; + missile[i].position.tile.y++; missile[i].position.offset.y -= 32; } if (missile[i].position.velocity.y > 0 @@ -3643,9 +3643,9 @@ void FireballUpdate(int i, int xof, int yof, bool alwaysDelete) missile[i]._mimfnum = 0; SetMissAnim(i, MFILE_BIGEXP); missile[i]._mirange = missile[i]._miAnimLen - 1; - } else if (missile[i].position.current.x != missile[i]._miVar1 || missile[i].position.current.y != missile[i]._miVar2) { - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + } else if (missile[i].position.tile.x != missile[i]._miVar1 || missile[i].position.tile.y != missile[i]._miVar2) { + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; ChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8); } if (alwaysDelete) @@ -3665,14 +3665,14 @@ void MI_HorkSpawn(int i) int t, j, k, tx, ty, dp; missile[i]._mirange--; - CheckMissileCol(i, 0, 0, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, 0, 0, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._mirange <= 0) { missile[i]._miDelFlag = true; for (j = 0; j < 2; j++) { k = CrawlNum[j] + 2; for (t = CrawlTable[CrawlNum[j]]; t > 0; t--, k += 2) { - tx = missile[i].position.current.x + CrawlTable[k - 1]; - ty = missile[i].position.current.y + CrawlTable[k]; + tx = missile[i].position.tile.x + CrawlTable[k - 1]; + ty = missile[i].position.tile.y + CrawlTable[k]; if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { dp = dPiece[tx][ty]; if (!nSolidTable[dp] && dMonster[tx][ty] == 0 && dPlayer[tx][ty] == 0 && dObject[tx][ty] == 0) { @@ -3699,8 +3699,8 @@ void MI_Rune(int i) int mid, pid, mx, my; direction dir; - mx = missile[i].position.current.x; - my = missile[i].position.current.y; + mx = missile[i].position.tile.x; + my = missile[i].position.tile.y; mid = dMonster[mx][my]; pid = dPlayer[mx][my]; if (mid != 0 || pid != 0) { @@ -3709,13 +3709,13 @@ void MI_Rune(int i) mid = mid - 1; else mid = -(mid + 1); - dir = GetDirection(missile[i].position.current.x, missile[i].position.current.y, monster[mid].position.current.x, monster[mid].position.current.y); + dir = GetDirection(missile[i].position.tile.x, missile[i].position.tile.y, monster[mid].position.tile.x, monster[mid].position.tile.y); } else { if (pid > 0) pid = pid - 1; else pid = -(pid + 1); - dir = GetDirection(missile[i].position.current.x, missile[i].position.current.y, plr[pid].position.current.x, plr[pid].position.current.y); + dir = GetDirection(missile[i].position.tile.x, missile[i].position.tile.y, plr[pid].position.tile.x, plr[pid].position.tile.y); } missile[i]._miDelFlag = true; AddUnLight(missile[i]._mlid); @@ -3730,7 +3730,7 @@ void MI_LightningWall(int i) missile[i]._mirange--; range = missile[i]._mirange; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._miHitFlag) missile[i]._mirange = range; if (missile[i]._mirange == 0) @@ -3787,8 +3787,8 @@ void MI_LightningArrow(int i) missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - mx = missile[i].position.current.x; - my = missile[i].position.current.y; + mx = missile[i].position.tile.x; + my = missile[i].position.tile.y; assert((DWORD)mx < MAXDUNX); assert((DWORD)my < MAXDUNY); pn = dPiece[mx][my]; @@ -3809,8 +3809,8 @@ void MI_LightningArrow(int i) && monster[missile[i]._misource].MType->mtype >= MT_STORM && monster[missile[i]._misource].MType->mtype <= MT_MAEL) { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -3821,8 +3821,8 @@ void MI_LightningArrow(int i) missile[i]._mispllvl); } else { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -3834,8 +3834,8 @@ void MI_LightningArrow(int i) } } else { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -3845,8 +3845,8 @@ void MI_LightningArrow(int i) missile[i]._midam, missile[i]._mispllvl); } - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; } } @@ -3859,7 +3859,7 @@ void MI_FlashFront(int i) { int src = missile[i]._misource; if (missile[i]._micaster == TARGET_MONSTERS && src != -1) { - missile[i].position.current = plr[src].position.current; + missile[i].position.tile = plr[src].position.tile; missile[i].position.traveled.x = plr[src].position.offset.x << 16; missile[i].position.traveled.y = plr[src].position.offset.y << 16; } @@ -3879,7 +3879,7 @@ void MI_FlashBack(int i) { if (missile[i]._micaster == TARGET_MONSTERS) { if (missile[i]._misource != -1) { - missile[i].position.current = plr[missile[i]._misource].position.future; + missile[i].position.tile = plr[missile[i]._misource].position.future; } } missile[i]._mirange--; @@ -3899,15 +3899,15 @@ void MI_Reflect(int i) missile[i].position.start.x = plr[src].position.future.x + 2; missile[i].position.start.y = plr[src].position.future.y - 1; } else { - missile[i].position.start.x = plr[src].position.current.x + 2; - missile[i].position.start.y = plr[src].position.current.y - 1; + missile[i].position.start.x = plr[src].position.tile.x + 2; + missile[i].position.start.y = plr[src].position.tile.y - 1; } GetMissilePos(i); if (plr[src]._pmode == PM_WALK3) { if (plr[src]._pdir == DIR_W) - missile[i].position.current.x++; + missile[i].position.tile.x++; else - missile[i].position.current.y++; + missile[i].position.tile.y++; } if (src != myplr && currlevel != plr[src].plrlevel) missile[i]._miDelFlag = true; @@ -3938,7 +3938,7 @@ void MI_FireRing(int i) if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { dp = dPiece[tx][ty]; if (!nSolidTable[dp] && dObject[tx][ty] == 0) { - if (LineClearMissile(missile[i].position.current.x, missile[i].position.current.y, tx, ty)) { + if (LineClearMissile(missile[i].position.tile.x, missile[i].position.tile.y, tx, ty)) { if (nMissileTable[dp] || missile[i]._miVar8) missile[i]._miVar8 = 1; else @@ -3969,7 +3969,7 @@ void MI_LightningRing(int i) if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { dp = dPiece[tx][ty]; if (!nSolidTable[dp] && dObject[tx][ty] == 0) { - if (LineClearMissile(missile[i].position.current.x, missile[i].position.current.y, tx, ty)) { + if (LineClearMissile(missile[i].position.tile.x, missile[i].position.tile.y, tx, ty)) { if (nMissileTable[dp] || missile[i]._miVar8) missile[i]._miVar8 = 1; else @@ -3985,7 +3985,7 @@ void MI_Search(int i) missile[i]._mirange--; if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; - PlaySfxLoc(IS_CAST7, plr[missile[i]._miVar1].position.current.x, plr[missile[i]._miVar1].position.current.y); + PlaySfxLoc(IS_CAST7, plr[missile[i]._miVar1].position.tile.x, plr[missile[i]._miVar1].position.tile.y); AutoMapShowItems = false; } } @@ -4032,8 +4032,8 @@ void MI_FireNova(int i) int sy1 = 0; int id = missile[i]._misource; int dam = missile[i]._midam; - int sx = missile[i].position.current.x; - int sy = missile[i].position.current.y; + int sx = missile[i].position.tile.x; + int sy = missile[i].position.tile.y; direction dir = DIR_S; mienemy_type en = TARGET_PLAYERS; if (id != -1) { @@ -4059,8 +4059,8 @@ void MI_SpecArrow(int i) { int src = missile[i]._misource; int dam = missile[i]._midam; - int sx = missile[i].position.current.x; - int sy = missile[i].position.current.y; + int sx = missile[i].position.tile.x; + int sy = missile[i].position.tile.y; int dx = missile[i]._miVar1; int dy = missile[i]._miVar2; int spllvl = missile[i]._miVar3; @@ -4118,8 +4118,8 @@ void MI_Lightctrl(int i) missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - mx = missile[i].position.current.x; - my = missile[i].position.current.y; + mx = missile[i].position.tile.x; + my = missile[i].position.tile.y; assert((DWORD)mx < MAXDUNX); assert((DWORD)my < MAXDUNY); pn = dPiece[mx][my]; @@ -4139,8 +4139,8 @@ void MI_Lightctrl(int i) && monster[missile[i]._misource].MType->mtype >= MT_STORM && monster[missile[i]._misource].MType->mtype <= MT_MAEL) { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -4151,8 +4151,8 @@ void MI_Lightctrl(int i) missile[i]._mispllvl); } else { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -4164,8 +4164,8 @@ void MI_Lightctrl(int i) } } else { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -4175,8 +4175,8 @@ void MI_Lightctrl(int i) dam, missile[i]._mispllvl); } - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; } } if (missile[i]._mirange == 0 || mx <= 0 || my <= 0 || mx >= MAXDUNX || my > MAXDUNY) { @@ -4190,8 +4190,8 @@ void MI_Lightning(int i) missile[i]._mirange--; j = missile[i]._mirange; - if (missile[i].position.current.x != missile[i].position.start.x || missile[i].position.current.y != missile[i].position.start.y) - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y, false); + if (missile[i].position.tile.x != missile[i].position.start.x || missile[i].position.tile.y != missile[i].position.start.y) + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._miHitFlag) missile[i]._mirange = j; if (missile[i]._mirange == 0) { @@ -4212,13 +4212,13 @@ void MI_Town(int i) SetMissDir(i, 1); if (currlevel != 0 && missile[i]._mimfnum != 1 && missile[i]._mirange != 0) { if (missile[i]._miVar2 == 0) - missile[i]._mlid = AddLight(missile[i].position.current.x, missile[i].position.current.y, 1); - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, ExpLight[missile[i]._miVar2]); + missile[i]._mlid = AddLight(missile[i].position.tile.x, missile[i].position.tile.y, 1); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[missile[i]._miVar2]); missile[i]._miVar2++; } for (p = 0; p < MAX_PLRS; p++) { - if (plr[p].plractive && currlevel == plr[p].plrlevel && !plr[p]._pLvlChanging && plr[p]._pmode == PM_STAND && plr[p].position.current.x == missile[i].position.current.x && plr[p].position.current.y == missile[i].position.current.y) { + if (plr[p].plractive && currlevel == plr[p].plrlevel && !plr[p]._pLvlChanging && plr[p]._pmode == PM_STAND && plr[p].position.tile.x == missile[i].position.tile.x && plr[p].position.tile.y == missile[i].position.tile.y) { ClrPlrPath(p); if (p == myplr) { NetSendCmdParam1(true, CMD_WARP, missile[i]._misource); @@ -4241,12 +4241,12 @@ void MI_Flash(int i) plr[missile[i]._misource]._pInvincible = true; } missile[i]._mirange--; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x - 1, missile[i].position.current.y, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x + 1, missile[i].position.current.y, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x - 1, missile[i].position.current.y + 1, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y + 1, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x + 1, missile[i].position.current.y + 1, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x - 1, missile[i].position.tile.y, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x + 1, missile[i].position.tile.y, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x - 1, missile[i].position.tile.y + 1, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y + 1, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x + 1, missile[i].position.tile.y + 1, true); if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; if (missile[i]._micaster == TARGET_MONSTERS) { @@ -4264,9 +4264,9 @@ void MI_Flash2(int i) plr[missile[i]._misource]._pInvincible = true; } missile[i]._mirange--; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x - 1, missile[i].position.current.y - 1, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y - 1, true); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x + 1, missile[i].position.current.y - 1, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x - 1, missile[i].position.tile.y - 1, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y - 1, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x + 1, missile[i].position.tile.y - 1, true); if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; if (missile[i]._micaster == TARGET_MONSTERS) { @@ -4282,22 +4282,20 @@ void MI_Manashield(int i) int id; id = missile[i]._misource; - missile[i].position.current = plr[id].position.current; + missile[i].position.tile = plr[id].position.tile; missile[i].position.traveled.x = plr[id].position.offset.x << 16; missile[i].position.traveled.y = plr[id].position.offset.y << 16; if (plr[id]._pmode == PM_WALK3) { - missile[i].position.start.x = plr[id].position.future.x; - missile[i].position.start.y = plr[id].position.future.y; + missile[i].position.start = plr[id].position.future; } else { - missile[i].position.start.x = plr[id].position.current.x; - missile[i].position.start.y = plr[id].position.current.y; + missile[i].position.start = plr[id].position.tile; } GetMissilePos(i); if (plr[id]._pmode == PM_WALK3) { if (plr[id]._pdir == DIR_W) - missile[i].position.current.x++; + missile[i].position.tile.x++; else - missile[i].position.current.y++; + missile[i].position.tile.y++; } if (id != myplr) { if (currlevel != plr[id].plrlevel) @@ -4320,20 +4318,20 @@ void MI_Etherealize(int i) missile[i]._mirange--; src = missile[i]._misource; - missile[i].position.current = plr[src].position.current; + missile[i].position.tile = plr[src].position.tile; missile[i].position.traveled.x = plr[src].position.offset.x << 16; missile[i].position.traveled.y = plr[src].position.offset.y << 16; if (plr[src]._pmode == PM_WALK3) { missile[i].position.start = plr[src].position.future; } else { - missile[i].position.start = plr[src].position.current; + missile[i].position.start = plr[src].position.tile; } GetMissilePos(i); if (plr[src]._pmode == PM_WALK3) { if (plr[src]._pdir == DIR_W) - missile[i].position.current.x++; + missile[i].position.tile.x++; else - missile[i].position.current.y++; + missile[i].position.tile.y++; } plr[src]._pSpellFlags |= 1; if (missile[i]._mirange == 0 || plr[src]._pHitPoints <= 0) { @@ -4348,8 +4346,8 @@ void MI_Firemove(int i) int j; int ExpLight[14] = { 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12 }; - missile[i].position.current.x--; - missile[i].position.current.y--; + missile[i].position.tile.x--; + missile[i].position.tile.y--; missile[i].position.offset.y += 32; missile[i]._miVar1++; if (missile[i]._miVar1 == missile[i]._miAnimLen) { @@ -4360,7 +4358,7 @@ void MI_Firemove(int i) missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); j = missile[i]._mirange; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._miHitFlag) missile[i]._mirange = j; if (missile[i]._mirange == 0) { @@ -4368,19 +4366,19 @@ void MI_Firemove(int i) AddUnLight(missile[i]._mlid); } if (missile[i]._mimfnum != 0 || missile[i]._mirange == 0) { - if (missile[i].position.current.x != missile[i]._miVar3 || missile[i].position.current.y != missile[i]._miVar4) { - missile[i]._miVar3 = missile[i].position.current.x; - missile[i]._miVar4 = missile[i].position.current.y; + if (missile[i].position.tile.x != missile[i]._miVar3 || missile[i].position.tile.y != missile[i]._miVar4) { + missile[i]._miVar3 = missile[i].position.tile.x; + missile[i]._miVar4 = missile[i].position.tile.y; ChangeLight(missile[i]._mlid, missile[i]._miVar3, missile[i]._miVar4, 8); } } else { if (missile[i]._miVar2 == 0) - missile[i]._mlid = AddLight(missile[i].position.current.x, missile[i].position.current.y, ExpLight[0]); - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, ExpLight[missile[i]._miVar2]); + missile[i]._mlid = AddLight(missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[0]); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[missile[i]._miVar2]); missile[i]._miVar2++; } - missile[i].position.current.x++; - missile[i].position.current.y++; + missile[i].position.tile.x++; + missile[i].position.tile.y++; missile[i].position.offset.y -= 32; PutMissile(i); } @@ -4409,26 +4407,26 @@ void MI_Guardian(int i) if (sx1 == vCrawlTable[j][k] && sy1 == vCrawlTable[j][k + 1]) { continue; } - sx = missile[i].position.current.x + vCrawlTable[j][k]; - sy = missile[i].position.current.y + vCrawlTable[j][k + 1]; + sx = missile[i].position.tile.x + vCrawlTable[j][k]; + sy = missile[i].position.tile.y + vCrawlTable[j][k + 1]; ex = Sentfire(i, sx, sy); if (ex == -1) { break; } - sx = missile[i].position.current.x - vCrawlTable[j][k]; - sy = missile[i].position.current.y - vCrawlTable[j][k + 1]; + sx = missile[i].position.tile.x - vCrawlTable[j][k]; + sy = missile[i].position.tile.y - vCrawlTable[j][k + 1]; ex = Sentfire(i, sx, sy); if (ex == -1) { break; } - sx = missile[i].position.current.x + vCrawlTable[j][k]; - sy = missile[i].position.current.y - vCrawlTable[j][k + 1]; + sx = missile[i].position.tile.x + vCrawlTable[j][k]; + sy = missile[i].position.tile.y - vCrawlTable[j][k + 1]; ex = Sentfire(i, sx, sy); if (ex == -1) { break; } - sx = missile[i].position.current.x - vCrawlTable[j][k]; - sy = missile[i].position.current.y + vCrawlTable[j][k + 1]; + sx = missile[i].position.tile.x - vCrawlTable[j][k]; + sy = missile[i].position.tile.y + vCrawlTable[j][k + 1]; ex = Sentfire(i, sx, sy); if (ex == -1) { break; @@ -4450,7 +4448,7 @@ void MI_Guardian(int i) if (missile[i]._miVar3 > 15) { missile[i]._miVar3 = 15; } else if (missile[i]._miVar3 > 0) { - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, missile[i]._miVar3); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, missile[i]._miVar3); } if (missile[i]._mirange == 0) { @@ -4466,8 +4464,8 @@ void MI_Chain(int i) int sx, sy, id, l, n, m, k, rad, tx, ty; id = missile[i]._misource; - sx = missile[i].position.current.x; - sy = missile[i].position.current.y; + sx = missile[i].position.tile.x; + sy = missile[i].position.tile.y; direction dir = GetDirection(sx, sy, missile[i]._miVar1, missile[i]._miVar2); AddMissile(sx, sy, missile[i]._miVar1, missile[i]._miVar2, dir, MIS_LIGHTCTRL, TARGET_MONSTERS, id, 1, missile[i]._mispllvl); rad = missile[i]._mispllvl + 3; @@ -4517,12 +4515,12 @@ void MI_Weapexp(int i) maxd = plr[id]._pILMaxDam; missiledata[missile[i]._mitype].mResist = MISR_LIGHTNING; } - CheckMissileCol(i, mind, maxd, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, mind, maxd, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._miVar1 == 0) { - missile[i]._mlid = AddLight(missile[i].position.current.x, missile[i].position.current.y, 9); + missile[i]._mlid = AddLight(missile[i].position.tile.x, missile[i].position.tile.y, 9); } else { if (missile[i]._mirange != 0) - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, ExpLight[missile[i]._miVar1]); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[missile[i]._miVar1]); } missile[i]._miVar1++; if (missile[i]._mirange == 0) { @@ -4543,9 +4541,9 @@ void MI_Misexp(int i) AddUnLight(missile[i]._mlid); } else { if (missile[i]._miVar1 == 0) - missile[i]._mlid = AddLight(missile[i].position.current.x, missile[i].position.current.y, 9); + missile[i]._mlid = AddLight(missile[i].position.tile.x, missile[i].position.tile.y, 9); else - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, ExpLight[missile[i]._miVar1]); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[missile[i]._miVar1]); missile[i]._miVar1++; PutMissile(i); } @@ -4556,8 +4554,8 @@ void MI_Acidsplat(int i) int monst, dam; if (missile[i]._mirange == missile[i]._miAnimLen) { - missile[i].position.current.x++; - missile[i].position.current.y++; + missile[i].position.tile.x++; + missile[i].position.tile.y++; missile[i].position.offset.y -= 32; } missile[i]._mirange--; @@ -4565,7 +4563,7 @@ void MI_Acidsplat(int i) missile[i]._miDelFlag = true; monst = missile[i]._misource; dam = (monster[monst].MData->mLevel >= 2 ? 2 : 1); - AddMissile(missile[i].position.current.x, missile[i].position.current.y, i, 0, missile[i]._mimfnum, MIS_ACIDPUD, TARGET_PLAYERS, monst, dam, missile[i]._mispllvl); + AddMissile(missile[i].position.tile.x, missile[i].position.tile.y, i, 0, missile[i]._mimfnum, MIS_ACIDPUD, TARGET_PLAYERS, monst, dam, missile[i]._mispllvl); } else { PutMissile(i); } @@ -4580,21 +4578,21 @@ void MI_Teleport(int i) if (missile[i]._mirange <= 0) { missile[i]._miDelFlag = true; } else { - dPlayer[plr[id].position.current.x][plr[id].position.current.y] = 0; - PlrClrTrans(plr[id].position.current.x, plr[id].position.current.y); - plr[id].position.current = { missile[i].position.current.x, missile[i].position.current.y }; - plr[id].position.future = plr[id].position.current; - plr[id].position.old = plr[id].position.current; - PlrDoTrans(plr[id].position.current.x, plr[id].position.current.y); + dPlayer[plr[id].position.tile.x][plr[id].position.tile.y] = 0; + PlrClrTrans(plr[id].position.tile.x, plr[id].position.tile.y); + plr[id].position.tile = { missile[i].position.tile.x, missile[i].position.tile.y }; + plr[id].position.future = plr[id].position.tile; + plr[id].position.old = plr[id].position.tile; + PlrDoTrans(plr[id].position.tile.x, plr[id].position.tile.y); missile[i]._miVar1 = 1; - dPlayer[plr[id].position.current.x][plr[id].position.current.y] = id + 1; + dPlayer[plr[id].position.tile.x][plr[id].position.tile.y] = id + 1; if (leveltype != DTYPE_TOWN) { - ChangeLightXY(plr[id]._plid, plr[id].position.current.x, plr[id].position.current.y); - ChangeVisionXY(plr[id]._pvid, plr[id].position.current.x, plr[id].position.current.y); + ChangeLightXY(plr[id]._plid, plr[id].position.tile.x, plr[id].position.tile.y); + ChangeVisionXY(plr[id]._pvid, plr[id].position.tile.x, plr[id].position.tile.y); } if (id == myplr) { - ViewX = plr[id].position.current.x - ScrollInfo.tile.x; - ViewY = plr[id].position.current.y - ScrollInfo.tile.y; + ViewX = plr[id].position.tile.x - ScrollInfo.tile.x; + ViewY = plr[id].position.tile.y - ScrollInfo.tile.y; } } } @@ -4621,7 +4619,7 @@ void MI_Stone(int i) if (monster[m]._mhitpoints > 0) monster[m]._mmode = (MON_MODE)missile[i]._miVar1; else - AddDead(monster[m].position.current.x, monster[m].position.current.y, stonendx, monster[m]._mdir); + AddDead(monster[m].position.tile.x, monster[m].position.tile.y, stonendx, monster[m]._mdir); } if (missile[i]._miAnimType == MFILE_SHATTER1) PutMissile(i); @@ -4631,7 +4629,7 @@ void MI_Boom(int i) { missile[i]._mirange--; if (missile[i]._miVar1 == 0) - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.current.x, missile[i].position.current.y, true); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.tile.x, missile[i].position.tile.y, true); if (missile[i]._miHitFlag) missile[i]._miVar1 = 1; if (missile[i]._mirange == 0) @@ -4649,15 +4647,15 @@ void MI_Rhino(int i) return; } GetMissilePos(i); - mix = missile[i].position.current.x; - miy = missile[i].position.current.y; + mix = missile[i].position.tile.x; + miy = missile[i].position.tile.y; dMonster[mix][miy] = 0; if (monster[monst]._mAi == AI_SNAKE) { missile[i].position.traveled.x += 2 * missile[i].position.velocity.x; missile[i].position.traveled.y += 2 * missile[i].position.velocity.y; GetMissilePos(i); - mix2 = missile[i].position.current.x; - miy2 = missile[i].position.current.y; + mix2 = missile[i].position.tile.x; + miy2 = missile[i].position.tile.y; missile[i].position.traveled.x -= missile[i].position.velocity.x; missile[i].position.traveled.y -= missile[i].position.velocity.y; } else { @@ -4665,16 +4663,16 @@ void MI_Rhino(int i) missile[i].position.traveled.y += missile[i].position.velocity.y; } GetMissilePos(i); - omx = missile[i].position.current.x; - omy = missile[i].position.current.y; - if (!PosOkMonst(monst, missile[i].position.current.x, missile[i].position.current.y) || (monster[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, mix2, miy2))) { + omx = missile[i].position.tile.x; + omy = missile[i].position.tile.y; + if (!PosOkMonst(monst, missile[i].position.tile.x, missile[i].position.tile.y) || (monster[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, mix2, miy2))) { MissToMonst(i, mix, miy); missile[i]._miDelFlag = true; return; } monster[monst].position.future = { omx, omy }; monster[monst].position.old = { omx, omy }; - monster[monst].position.current = { omx, omy }; + monster[monst].position.tile = { omx, omy }; dMonster[omx][omy] = -(monst + 1); if (monster[monst]._uniqtype != 0) ChangeLightXY(missile[i]._mlid, omx, omy); @@ -4687,21 +4685,21 @@ void MI_Fireman(int i) int src, enemy, ax, ay, bx, by, cx, cy, j; GetMissilePos(i); - ax = missile[i].position.current.x; - ay = missile[i].position.current.y; + ax = missile[i].position.tile.x; + ay = missile[i].position.tile.y; missile[i].position.traveled.x += missile[i].position.velocity.x; missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); src = missile[i]._misource; - bx = missile[i].position.current.x; - by = missile[i].position.current.y; + bx = missile[i].position.tile.x; + by = missile[i].position.tile.y; enemy = monster[src]._menemy; if ((monster[src]._mFlags & MFLAG_TARGETS_MONSTER) == 0) { - cx = plr[enemy].position.current.x; - cy = plr[enemy].position.current.y; + cx = plr[enemy].position.tile.x; + cy = plr[enemy].position.tile.y; } else { - cx = monster[enemy].position.current.x; - cy = monster[enemy].position.current.y; + cx = monster[enemy].position.tile.x; + cy = monster[enemy].position.tile.y; } if ((bx != ax || by != ay) && ((missile[i]._miVar1 & 1 && (abs(ax - cx) >= 4 || abs(ay - cy) >= 4)) || missile[i]._miVar2 > 1) && PosOkMonst(missile[i]._misource, ax, ay)) { MissToMonst(i, ax, ay); @@ -4775,7 +4773,7 @@ void MI_Apoca(int i) for (j = missile[i]._miVar2; j < missile[i]._miVar3 && !exit; j++) { for (k = missile[i]._miVar4; k < missile[i]._miVar5 && !exit; k++) { if (dMonster[k][j] > MAX_PLRS - 1 && !nSolidTable[dPiece[k][j]]) { - if (!gbIsHellfire || LineClearMissile(missile[i].position.current.x, missile[i].position.current.y, k, j)) { + if (!gbIsHellfire || LineClearMissile(missile[i].position.tile.x, missile[i].position.tile.y, k, j)) { AddMissile(k, j, k, j, plr[id]._pdir, MIS_BOOM, TARGET_MONSTERS, id, missile[i]._midam, 0); exit = true; } @@ -4806,8 +4804,8 @@ void MI_Wave(int i) assert((DWORD)i < MAXMISSILES); id = missile[i]._misource; - sx = missile[i].position.current.x; - sy = missile[i].position.current.y; + sx = missile[i].position.tile.x; + sy = missile[i].position.tile.y; v1 = missile[i]._miVar1; v2 = missile[i]._miVar2; direction sd = GetDirection(sx, sy, v1, v2); @@ -4855,8 +4853,8 @@ void MI_Nova(int i) int sy1 = 0; int id = missile[i]._misource; int dam = missile[i]._midam; - int sx = missile[i].position.current.x; - int sy = missile[i].position.current.y; + int sx = missile[i].position.tile.x; + int sy = missile[i].position.tile.y; direction dir = DIR_S; mienemy_type en = TARGET_PLAYERS; if (id != -1) { @@ -4916,7 +4914,7 @@ void MI_Flame(int i) missile[i]._mirange--; missile[i]._miVar2--; k = missile[i]._mirange; - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, true, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._mirange == 0 && missile[i]._miHitFlag) missile[i]._mirange = k; if (missile[i]._miVar2 == 0) @@ -4925,7 +4923,7 @@ void MI_Flame(int i) k = missile[i]._miAnimFrame; if (k > 11) k = 24 - k; - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, k); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, k); } if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; @@ -4944,12 +4942,12 @@ void MI_Flamec(int i) missile[i].position.traveled.x += missile[i].position.velocity.x; missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - if (missile[i].position.current.x != missile[i]._miVar1 || missile[i].position.current.y != missile[i]._miVar2) { - id = dPiece[missile[i].position.current.x][missile[i].position.current.y]; + if (missile[i].position.tile.x != missile[i]._miVar1 || missile[i].position.tile.y != missile[i]._miVar2) { + id = dPiece[missile[i].position.tile.x][missile[i].position.tile.y]; if (!nMissileTable[id]) { AddMissile( - missile[i].position.current.x, - missile[i].position.current.y, + missile[i].position.tile.x, + missile[i].position.tile.y, missile[i].position.start.x, missile[i].position.start.y, i, @@ -4961,8 +4959,8 @@ void MI_Flamec(int i) } else { missile[i]._mirange = 0; } - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; missile[i]._miVar3++; } if (missile[i]._mirange == 0 || missile[i]._miVar3 == 3) @@ -4979,7 +4977,7 @@ void MI_Cbolt(int i) if (missile[i]._miVar3 == 0) { md = (missile[i]._miVar2 + bpath[missile[i]._mirnd]) & 7; missile[i]._mirnd = (missile[i]._mirnd + 1) & 0xF; - GetMissileVel(i, missile[i].position.current.x, missile[i].position.current.y, missile[i].position.current.x + XDirAdd[md], missile[i].position.current.y + YDirAdd[md], 8); + GetMissileVel(i, missile[i].position.tile.x, missile[i].position.tile.y, missile[i].position.tile.x + XDirAdd[md], missile[i].position.tile.y + YDirAdd[md], 8); missile[i]._miVar3 = 16; } else { missile[i]._miVar3--; @@ -4987,7 +4985,7 @@ void MI_Cbolt(int i) missile[i].position.traveled.x += missile[i].position.velocity.x; missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.current.x, missile[i].position.current.y, false); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, false, missile[i].position.tile.x, missile[i].position.tile.y, false); if (missile[i]._miHitFlag) { missile[i]._miVar1 = 8; missile[i]._mimfnum = 0; @@ -4996,7 +4994,7 @@ void MI_Cbolt(int i) missile[i]._mirange = missile[i]._miAnimLen; GetMissilePos(i); } - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, missile[i]._miVar1); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, missile[i]._miVar1); } if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; @@ -5015,8 +5013,8 @@ void MI_Hbolt(int i) missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); dam = missile[i]._midam; - if (missile[i].position.current.x != missile[i].position.start.x || missile[i].position.current.y != missile[i].position.start.y) { - CheckMissileCol(i, dam, dam, false, missile[i].position.current.x, missile[i].position.current.y, false); + if (missile[i].position.tile.x != missile[i].position.start.x || missile[i].position.tile.y != missile[i].position.start.y) { + CheckMissileCol(i, dam, dam, false, missile[i].position.tile.x, missile[i].position.tile.y, false); } if (missile[i]._mirange == 0) { missile[i].position.traveled.x -= missile[i].position.velocity.x; @@ -5026,14 +5024,14 @@ void MI_Hbolt(int i) SetMissAnim(i, MFILE_HOLYEXPL); missile[i]._mirange = missile[i]._miAnimLen - 1; } else { - if (missile[i].position.current.x != missile[i]._miVar1 || missile[i].position.current.y != missile[i]._miVar2) { - missile[i]._miVar1 = missile[i].position.current.x; - missile[i]._miVar2 = missile[i].position.current.y; + if (missile[i].position.tile.x != missile[i]._miVar1 || missile[i].position.tile.y != missile[i]._miVar2) { + missile[i]._miVar1 = missile[i].position.tile.x; + missile[i]._miVar2 = missile[i].position.tile.y; ChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8); } } } else { - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, missile[i]._miAnimFrame + 7); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, missile[i]._miAnimFrame + 7); if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; AddUnLight(missile[i]._mlid); @@ -5050,10 +5048,10 @@ void MI_Element(int i) dam = missile[i]._midam; id = missile[i]._misource; if (missile[i]._miAnimType == MFILE_BIGEXP) { - cx = missile[i].position.current.x; - cy = missile[i].position.current.y; - px = plr[id].position.current.x; - py = plr[id].position.current.y; + cx = missile[i].position.tile.x; + cy = missile[i].position.tile.y; + px = plr[id].position.tile.x; + py = plr[id].position.tile.y; ChangeLight(missile[i]._mlid, cx, cy, missile[i]._miAnimFrame); if (!CheckBlock(px, py, cx, cy)) CheckMissileCol(i, dam, dam, true, cx, cy, true); @@ -5081,8 +5079,8 @@ void MI_Element(int i) missile[i].position.traveled.x += missile[i].position.velocity.x; missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - cx = missile[i].position.current.x; - cy = missile[i].position.current.y; + cx = missile[i].position.tile.x; + cy = missile[i].position.tile.y; CheckMissileCol(i, dam, dam, false, cx, cy, false); if (missile[i]._miVar3 == 0 && cx == missile[i]._miVar4 && cy == missile[i]._miVar5) missile[i]._miVar3 = 1; @@ -5091,9 +5089,9 @@ void MI_Element(int i) missile[i]._mirange = 255; mid = FindClosest(cx, cy, 19); if (mid > 0) { - direction sd = GetDirection(cx, cy, monster[mid].position.current.x, monster[mid].position.current.y); + direction sd = GetDirection(cx, cy, monster[mid].position.tile.x, monster[mid].position.tile.y); SetMissDir(i, sd); - GetMissileVel(i, cx, cy, monster[mid].position.current.x, monster[mid].position.current.y, 16); + GetMissileVel(i, cx, cy, monster[mid].position.tile.x, monster[mid].position.tile.y, 16); } else { direction sd = plr[id]._pdir; SetMissDir(i, sd); @@ -5123,7 +5121,7 @@ void MI_Bonespirit(int i) dam = missile[i]._midam; id = missile[i]._misource; if (missile[i]._mimfnum == DIR_OMNI) { - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, missile[i]._miAnimFrame); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, missile[i]._miAnimFrame); if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; AddUnLight(missile[i]._mlid); @@ -5133,8 +5131,8 @@ void MI_Bonespirit(int i) missile[i].position.traveled.x += missile[i].position.velocity.x; missile[i].position.traveled.y += missile[i].position.velocity.y; GetMissilePos(i); - cx = missile[i].position.current.x; - cy = missile[i].position.current.y; + cx = missile[i].position.tile.x; + cy = missile[i].position.tile.y; CheckMissileCol(i, dam, dam, false, cx, cy, false); if (missile[i]._miVar3 == 0 && cx == missile[i]._miVar4 && cy == missile[i]._miVar5) missile[i]._miVar3 = 1; @@ -5144,8 +5142,8 @@ void MI_Bonespirit(int i) mid = FindClosest(cx, cy, 19); if (mid > 0) { missile[i]._midam = monster[mid]._mhitpoints >> 7; - SetMissDir(i, GetDirection(cx, cy, monster[mid].position.current.x, monster[mid].position.current.y)); - GetMissileVel(i, cx, cy, monster[mid].position.current.x, monster[mid].position.current.y, 16); + SetMissDir(i, GetDirection(cx, cy, monster[mid].position.tile.x, monster[mid].position.tile.y)); + GetMissileVel(i, cx, cy, monster[mid].position.tile.x, monster[mid].position.tile.y, 16); } else { direction sd = plr[id]._pdir; SetMissDir(i, sd); @@ -5184,8 +5182,8 @@ void MI_Rportal(int i) if (currlevel != 0 && missile[i]._mimfnum != 1 && missile[i]._mirange != 0) { if (missile[i]._miVar2 == 0) - missile[i]._mlid = AddLight(missile[i].position.current.x, missile[i].position.current.y, 1); - ChangeLight(missile[i]._mlid, missile[i].position.current.x, missile[i].position.current.y, ExpLight[missile[i]._miVar2]); + missile[i]._mlid = AddLight(missile[i].position.tile.x, missile[i].position.tile.y, 1); + ChangeLight(missile[i]._mlid, missile[i].position.tile.x, missile[i].position.tile.y, ExpLight[missile[i]._miVar2]); missile[i]._miVar2++; } if (missile[i]._mirange == 0) { @@ -5200,9 +5198,9 @@ void ProcessMissiles() int i, mi; for (i = 0; i < nummissiles; i++) { - dFlags[missile[missileactive[i]].position.current.x][missile[missileactive[i]].position.current.y] &= ~BFLAG_MISSILE; - dMissile[missile[missileactive[i]].position.current.x][missile[missileactive[i]].position.current.y] = 0; - if (missile[missileactive[i]].position.current.x < 0 || missile[missileactive[i]].position.current.x >= MAXDUNX - 1 || missile[missileactive[i]].position.current.y < 0 || missile[missileactive[i]].position.current.y >= MAXDUNY - 1) + dFlags[missile[missileactive[i]].position.tile.x][missile[missileactive[i]].position.tile.y] &= ~BFLAG_MISSILE; + dMissile[missile[missileactive[i]].position.tile.x][missile[missileactive[i]].position.tile.y] = 0; + if (missile[missileactive[i]].position.tile.x < 0 || missile[missileactive[i]].position.tile.x >= MAXDUNX - 1 || missile[missileactive[i]].position.tile.y < 0 || missile[missileactive[i]].position.tile.y >= MAXDUNY - 1) missile[missileactive[i]]._miDelFlag = true; } @@ -5273,8 +5271,8 @@ void missiles_process_charge() void ClearMissileSpot(int mi) { - dFlags[missile[mi].position.current.x][missile[mi].position.current.y] &= ~BFLAG_MISSILE; - dMissile[missile[mi].position.current.x][missile[mi].position.current.y] = 0; + dFlags[missile[mi].position.tile.x][missile[mi].position.tile.y] &= ~BFLAG_MISSILE; + dMissile[missile[mi].position.tile.x][missile[mi].position.tile.y] = 0; } } // namespace devilution diff --git a/Source/missiles.h b/Source/missiles.h index 627c2d2ba..40963f04c 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -23,8 +23,7 @@ struct ChainStruct { }; struct MissilePosition { - /** Tile position */ - Point current; + Point tile; /** Sprite's pixel offset from tile. */ Point offset; /** Pixel velocity while moving */ @@ -36,7 +35,7 @@ struct MissilePosition { }; struct MissileStruct { - int _mitype; // Type of projectile (missile_id) + int _mitype; // Type of projectile (missile_id) MissilePosition position; int _mimfnum; // The direction of the missile (direction enum) int _mispllvl; diff --git a/Source/monster.cpp b/Source/monster.cpp index 018b168e1..edb490a49 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -475,7 +475,7 @@ void InitMonster(int i, direction rd, int mtype, int x, int y) CMonster *monst = &Monsters[mtype]; monster[i]._mdir = rd; - monster[i].position.current = { x, y }; + monster[i].position.tile = { x, y }; monster[i].position.future = { x, y }; monster[i].position.old = { x, y }; monster[i]._mMTidx = mtype; @@ -588,7 +588,7 @@ void ClrAllMonsters() Monst->_mmode = MM_STAND; Monst->_mVar1 = 0; Monst->_mVar2 = 0; - Monst->position.current = { 0, 0 }; + Monst->position.tile = { 0, 0 }; Monst->position.future = { 0, 0 }; Monst->position.old = { 0, 0 }; Monst->_mdir = static_cast(GenerateRnd(8)); @@ -812,7 +812,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) if (uniqindex == UMT_HORKDMN) Monst->mlid = NO_LIGHT; // BUGFIX monsters initial light id should be -1 (fixed) else - Monst->mlid = AddLight(Monst->position.current.x, Monst->position.current.y, 3); + Monst->mlid = AddLight(Monst->position.tile.x, Monst->position.tile.y, 3); if (gbIsMultiplayer) { if (Monst->_mAi == AI_LAZHELP) @@ -1026,13 +1026,13 @@ void PlaceGroup(int mtype, int num, int leaderf, int leader) while (placed) { nummonsters--; placed--; - dMonster[monster[nummonsters].position.current.x][monster[nummonsters].position.current.y] = 0; + dMonster[monster[nummonsters].position.tile.x][monster[nummonsters].position.tile.y] = 0; } if (leaderf & 1) { int offset = GenerateRnd(8); - x1 = xp = monster[leader].position.current.x + offset_x[offset]; - y1 = yp = monster[leader].position.current.y + offset_y[offset]; + x1 = xp = monster[leader].position.tile.x + offset_x[offset]; + y1 = yp = monster[leader].position.tile.y + offset_y[offset]; } else { do { x1 = xp = GenerateRnd(80) + 16; @@ -1135,7 +1135,7 @@ void InitMonsters() for (i = 0; i < nt; i++) { for (s = -2; s < 2; s++) { for (t = -2; t < 2; t++) - DoVision(s + trigs[i]._tx, t + trigs[i]._ty, 15, false, false); + DoVision(s + trigs[i].position.x, t + trigs[i].position.y, 15, false, false); } } if (!gbIsSpawn) @@ -1176,7 +1176,7 @@ void InitMonsters() for (i = 0; i < nt; i++) { for (s = -2; s < 2; s++) { for (t = -2; t < 2; t++) - DoUnVision(s + trigs[i]._tx, t + trigs[i]._ty, 15); + DoUnVision(s + trigs[i].position.x, t + trigs[i].position.y, 15); } } } @@ -1248,8 +1248,8 @@ void monster_43C785(int i) int x, y, d, j, oi, mx, my; if (monster[i].MType) { - mx = monster[i].position.current.x; - my = monster[i].position.current.y; + mx = monster[i].position.tile.x; + my = monster[i].position.tile.y; direction dir = monster[i]._mdir; for (d = 0; d < 8; d++) { x = mx + offset_x[d]; @@ -1324,8 +1324,8 @@ void M_Enemy(int i) if (!plr[pnum].plractive || currlevel != plr[pnum].plrlevel || plr[pnum]._pLvlChanging || (((plr[pnum]._pHitPoints >> 6) == 0) && gbIsMultiplayer)) continue; - sameroom = (dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[plr[pnum].position.current.x][plr[pnum].position.current.y]); - dist = std::max(abs(Monst->position.current.x - plr[pnum].position.current.x), abs(Monst->position.current.y - plr[pnum].position.current.y)); + sameroom = (dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[plr[pnum].position.tile.x][plr[pnum].position.tile.y]); + dist = std::max(abs(Monst->position.tile.x - plr[pnum].position.tile.x), abs(Monst->position.tile.y - plr[pnum].position.tile.y)); if ((sameroom && !bestsameroom) || ((sameroom || !bestsameroom) && dist < best_dist) || (_menemy == -1)) { @@ -1344,14 +1344,14 @@ void M_Enemy(int i) continue; if (!((monster[mi]._mhitpoints >> 6) > 0)) continue; - if (monster[mi].position.current.x == 1 && monster[mi].position.current.y == 0) + if (monster[mi].position.tile.x == 1 && monster[mi].position.tile.y == 0) continue; if (M_Talker(mi) && monster[mi].mtalkmsg) continue; if ((Monst->_mFlags & MFLAG_GOLEM) && (monster[mi]._mFlags & MFLAG_GOLEM)) // prevent golems from fighting each other continue; - dist = std::max(abs(monster[mi].position.current.x - Monst->position.current.x), abs(monster[mi].position.current.y - Monst->position.current.y)); + dist = std::max(abs(monster[mi].position.tile.x - Monst->position.tile.x), abs(monster[mi].position.tile.y - Monst->position.tile.y)); if ((!(Monst->_mFlags & MFLAG_GOLEM) && !(Monst->_mFlags & MFLAG_BERSERK) && dist >= 2 @@ -1361,7 +1361,7 @@ void M_Enemy(int i) && !(monster[mi]._mFlags & MFLAG_GOLEM))) { continue; } - sameroom = dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[monster[mi].position.current.x][monster[mi].position.current.y]; + sameroom = dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[monster[mi].position.tile.x][monster[mi].position.tile.y]; if ((sameroom && !bestsameroom) || ((sameroom || !bestsameroom) && dist < best_dist) || (_menemy == -1)) { @@ -1384,7 +1384,7 @@ void M_Enemy(int i) direction M_GetDir(int i) { - return GetDirection(monster[i].position.current.x, monster[i].position.current.y, monster[i].enemyPosition.x, monster[i].enemyPosition.y); + return GetDirection(monster[i].position.tile.x, monster[i].position.tile.y, monster[i].enemyPosition.x, monster[i].enemyPosition.y); } void M_StartStand(int i, direction md) @@ -1398,8 +1398,8 @@ void M_StartStand(int i, direction md) monster[i]._mVar2 = 0; monster[i]._mmode = MM_STAND; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; M_Enemy(i); } @@ -1421,19 +1421,19 @@ void M_StartSpStand(int i, direction md) NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md); monster[i]._mmode = MM_SPSTAND; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; } void M_StartWalk(int i, int xvel, int yvel, int xadd, int yadd, direction EndDir) { - int fx = xadd + monster[i].position.current.x; - int fy = yadd + monster[i].position.current.y; + int fx = xadd + monster[i].position.tile.x; + int fy = yadd + monster[i].position.tile.y; dMonster[fx][fy] = -(i + 1); monster[i]._mmode = MM_WALK; - monster[i].position.old = monster[i].position.current; + monster[i].position.old = monster[i].position.tile; monster[i].position.future = { fx, fy }; monster[i].position.velocity = { xvel, yvel }; monster[i]._mVar1 = xadd; @@ -1447,18 +1447,18 @@ void M_StartWalk(int i, int xvel, int yvel, int xadd, int yadd, direction EndDir void M_StartWalk2(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, direction EndDir) { - int fx = xadd + monster[i].position.current.x; - int fy = yadd + monster[i].position.current.y; + int fx = xadd + monster[i].position.tile.x; + int fy = yadd + monster[i].position.tile.y; - dMonster[monster[i].position.current.x][monster[i].position.current.y] = -(i + 1); - monster[i]._mVar1 = monster[i].position.current.x; - monster[i]._mVar2 = monster[i].position.current.y; - monster[i].position.old = monster[i].position.current; - monster[i].position.current = { fx, fy }; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = -(i + 1); + monster[i]._mVar1 = monster[i].position.tile.x; + monster[i]._mVar2 = monster[i].position.tile.y; + monster[i].position.old = monster[i].position.tile; + monster[i].position.tile = { fx, fy }; monster[i].position.future = { fx, fy }; dMonster[fx][fy] = i + 1; if (monster[i].mlid != NO_LIGHT) - ChangeLightXY(monster[i].mlid, monster[i].position.current.x, monster[i].position.current.y); + ChangeLightXY(monster[i].mlid, monster[i].position.tile.x, monster[i].position.tile.y); monster[i].position.offset = { xoff, yoff }; monster[i]._mmode = MM_WALK2; monster[i].position.velocity = { xvel, yvel }; @@ -1471,19 +1471,19 @@ void M_StartWalk2(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int y void M_StartWalk3(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int mapx, int mapy, direction EndDir) { - int fx = xadd + monster[i].position.current.x; - int fy = yadd + monster[i].position.current.y; - int x = mapx + monster[i].position.current.x; - int y = mapy + monster[i].position.current.y; + int fx = xadd + monster[i].position.tile.x; + int fy = yadd + monster[i].position.tile.y; + int x = mapx + monster[i].position.tile.x; + int y = mapy + monster[i].position.tile.y; if (monster[i].mlid != NO_LIGHT) ChangeLightXY(monster[i].mlid, x, y); - dMonster[monster[i].position.current.x][monster[i].position.current.y] = -(i + 1); + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = -(i + 1); dMonster[fx][fy] = -(i + 1); monster[i].position.temp = { x, y }; dFlags[x][y] |= BFLAG_MONSTLR; - monster[i].position.old = monster[i].position.current; + monster[i].position.old = monster[i].position.tile; monster[i].position.future = { fx, fy }; monster[i].position.offset = { xoff, yoff }; monster[i]._mmode = MM_WALK3; @@ -1503,8 +1503,8 @@ void M_StartAttack(int i) NewMonsterAnim(i, &monster[i].MType->Anims[MA_ATTACK], md); monster[i]._mmode = MM_ATTACK; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; } @@ -1516,8 +1516,8 @@ void M_StartRAttack(int i, int missile_type, int dam) monster[i]._mVar1 = missile_type; monster[i]._mVar2 = dam; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; } @@ -1530,8 +1530,8 @@ void M_StartRSpAttack(int i, int missile_type, int dam) monster[i]._mVar2 = 0; monster[i]._mVar3 = dam; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; } @@ -1541,8 +1541,8 @@ void M_StartSpAttack(int i) NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md); monster[i]._mmode = MM_SATTACK; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; } @@ -1551,8 +1551,8 @@ void M_StartEat(int i) NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], monster[i]._mdir); monster[i]._mmode = MM_SATTACK; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; } void M_ClearSquares(int i) @@ -1589,10 +1589,10 @@ void M_GetKnockback(int i) NewMonsterAnim(i, &monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir); monster[i]._mmode = MM_GOTHIT; monster[i].position.offset = { 0, 0 }; - monster[i].position.current = monster[i].position.old; - monster[i].position.future = monster[i].position.current; + monster[i].position.tile = monster[i].position.old; + monster[i].position.future = monster[i].position.tile; M_ClearSquares(i); - dMonster[monster[i].position.current.x][monster[i].position.current.y] = i + 1; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; } } @@ -1624,10 +1624,10 @@ void M_StartHit(int i, int pnum, int dam) NewMonsterAnim(i, &monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir); monster[i]._mmode = MM_GOTHIT; monster[i].position.offset = { 0, 0 }; - monster[i].position.current = monster[i].position.old; + monster[i].position.tile = monster[i].position.old; monster[i].position.future = monster[i].position.old; M_ClearSquares(i); - dMonster[monster[i].position.current.x][monster[i].position.current.y] = i + 1; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; } } } @@ -1654,20 +1654,20 @@ void M_DiabloDeath(int i, bool sendmsg) monster[k]._mmode = MM_DEATH; monster[k].position.offset = { 0, 0 }; monster[k]._mVar1 = 0; - monster[k].position.current = monster[k].position.old; - monster[k].position.future = monster[k].position.current; + monster[k].position.tile = monster[k].position.old; + monster[k].position.future = monster[k].position.tile; M_ClearSquares(k); - dMonster[monster[k].position.current.x][monster[k].position.current.y] = k + 1; + dMonster[monster[k].position.tile.x][monster[k].position.tile.y] = k + 1; } - AddLight(Monst->position.current.x, Monst->position.current.y, 8); - DoVision(Monst->position.current.x, Monst->position.current.y, 8, false, true); - dist = std::max(abs(ViewX - Monst->position.current.x), abs(ViewY - Monst->position.current.y)); + AddLight(Monst->position.tile.x, Monst->position.tile.y, 8); + DoVision(Monst->position.tile.x, Monst->position.tile.y, 8, false, true); + dist = std::max(abs(ViewX - Monst->position.tile.x), abs(ViewY - Monst->position.tile.y)); if (dist > 20) dist = 20; Monst->_mVar3 = ViewX << 16; Monst->position.temp.x = ViewY << 16; - Monst->position.temp.y = (int)((Monst->_mVar3 - (Monst->position.current.x << 16)) / (double)dist); - Monst->position.offset2.x = (int)((Monst->position.temp.x - (Monst->position.current.y << 16)) / (double)dist); + Monst->position.temp.y = (int)((Monst->_mVar3 - (Monst->position.tile.x << 16)) / (double)dist); + Monst->position.offset2.x = (int)((Monst->position.temp.x - (Monst->position.tile.y << 16)) / (double)dist); } void SpawnLoot(int i, bool sendmsg) @@ -1677,17 +1677,17 @@ void SpawnLoot(int i, bool sendmsg) Monst = &monster[i]; if (QuestStatus(Q_GARBUD) && Monst->_uniqtype - 1 == UMT_GARBUD) { - CreateTypeItem(Monst->position.current.x + 1, Monst->position.current.y + 1, true, ITYPE_MACE, IMISC_NONE, true, false); + CreateTypeItem(Monst->position.tile.x + 1, Monst->position.tile.y + 1, true, ITYPE_MACE, IMISC_NONE, true, false); } else if (Monst->_uniqtype - 1 == UMT_DEFILER) { if (effect_is_playing(USFX_DEFILER8)) stream_stop(); quests[Q_DEFILER]._qlog = false; - SpawnMapOfDoom(Monst->position.current.x, Monst->position.current.y); + SpawnMapOfDoom(Monst->position.tile.x, Monst->position.tile.y); } else if (Monst->_uniqtype - 1 == UMT_HORKDMN) { if (sgGameInitInfo.bTheoQuest) { - SpawnTheodore(Monst->position.current.x, Monst->position.current.y); + SpawnTheodore(Monst->position.tile.x, Monst->position.tile.y); } else { - CreateAmulet(Monst->position.current.x, Monst->position.current.y, 13, false, true); + CreateAmulet(Monst->position.tile.x, Monst->position.tile.y, 13, false, true); } } else if (Monst->MType->mtype == MT_HORKSPWN) { } else if (Monst->MType->mtype == MT_NAKRUL) { @@ -1698,12 +1698,12 @@ void SpawnLoot(int i, bool sendmsg) stream_stop(); quests[Q_NAKRUL]._qlog = false; UberDiabloMonsterIndex = -2; - CreateMagicWeapon(Monst->position.current.x, Monst->position.current.y, ITYPE_SWORD, ICURS_GREAT_SWORD, false, true); - CreateMagicWeapon(Monst->position.current.x, Monst->position.current.y, ITYPE_STAFF, ICURS_WAR_STAFF, false, true); - CreateMagicWeapon(Monst->position.current.x, Monst->position.current.y, ITYPE_BOW, ICURS_LONG_WAR_BOW, false, true); - CreateSpellBook(Monst->position.current.x, Monst->position.current.y, SPL_APOCA, false, true); + CreateMagicWeapon(Monst->position.tile.x, Monst->position.tile.y, ITYPE_SWORD, ICURS_GREAT_SWORD, false, true); + CreateMagicWeapon(Monst->position.tile.x, Monst->position.tile.y, ITYPE_STAFF, ICURS_WAR_STAFF, false, true); + CreateMagicWeapon(Monst->position.tile.x, Monst->position.tile.y, ITYPE_BOW, ICURS_LONG_WAR_BOW, false, true); + CreateSpellBook(Monst->position.tile.x, Monst->position.tile.y, SPL_APOCA, false, true); } else if (i > MAX_PLRS - 1) { // Golems should not spawn loot - SpawnItem(i, Monst->position.current.x, Monst->position.current.y, sendmsg); + SpawnItem(i, Monst->position.tile.x, Monst->position.tile.y, sendmsg); } } @@ -1739,10 +1739,10 @@ void M2MStartHit(int mid, int i, int dam) } monster[mid].position.offset = { 0, 0 }; - monster[mid].position.current = monster[mid].position.old; + monster[mid].position.tile = monster[mid].position.old; monster[mid].position.future = monster[mid].position.old; M_ClearSquares(mid); - dMonster[monster[mid].position.current.x][monster[mid].position.current.y] = mid + 1; + dMonster[monster[mid].position.tile.x][monster[mid].position.tile.y] = mid + 1; } } } @@ -1776,14 +1776,14 @@ void MonstStartKill(int i, int pnum, bool sendmsg) Monst->_mgoal = MGOAL_NONE; Monst->position.offset = { 0, 0 }; Monst->_mVar1 = 0; - Monst->position.current = Monst->position.old; + Monst->position.tile = Monst->position.old; Monst->position.future = Monst->position.old; M_ClearSquares(i); - dMonster[Monst->position.current.x][Monst->position.current.y] = i + 1; + dMonster[Monst->position.tile.x][Monst->position.tile.y] = i + 1; CheckQuestKill(i, sendmsg); - M_FallenFear(Monst->position.current.x, Monst->position.current.y); + M_FallenFear(Monst->position.tile.x, Monst->position.tile.y); if ((Monst->MType->mtype >= MT_NACID && Monst->MType->mtype <= MT_XACID) || Monst->MType->mtype == MT_SPIDLORD) - AddMissile(Monst->position.current.x, Monst->position.current.y, 0, 0, 0, MIS_ACIDPUD, TARGET_PLAYERS, i, Monst->_mint + 1, 0); + AddMissile(Monst->position.tile.x, Monst->position.tile.y, 0, 0, 0, MIS_ACIDPUD, TARGET_PLAYERS, i, Monst->_mint + 1, 0); } void M2MStartKill(int i, int mid) @@ -1792,8 +1792,8 @@ void M2MStartKill(int i, int mid) assurance((DWORD)mid < MAXMONSTERS, mid); assurance(monster[mid].MType != nullptr, mid); /// BUGFIX: should check `mid` (fixed) - delta_kill_monster(mid, monster[mid].position.current.x, monster[mid].position.current.y, currlevel); - NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster[mid].position.current.x, monster[mid].position.current.y, mid); + delta_kill_monster(mid, monster[mid].position.tile.x, monster[mid].position.tile.y, currlevel); + NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster[mid].position.tile.x, monster[mid].position.tile.y, mid); if (i < MAX_PLRS) { monster[mid].mWhoHit |= 1 << i; @@ -1820,14 +1820,14 @@ void M2MStartKill(int i, int mid) NewMonsterAnim(mid, &monster[mid].MType->Anims[MA_DEATH], md); monster[mid]._mmode = MM_DEATH; monster[mid].position.offset = { 0, 0 }; - monster[mid].position.current = monster[mid].position.old; + monster[mid].position.tile = monster[mid].position.old; monster[mid].position.future = monster[mid].position.old; M_ClearSquares(mid); - dMonster[monster[mid].position.current.x][monster[mid].position.current.y] = mid + 1; + dMonster[monster[mid].position.tile.x][monster[mid].position.tile.y] = mid + 1; CheckQuestKill(mid, true); - M_FallenFear(monster[mid].position.current.x, monster[mid].position.current.y); + M_FallenFear(monster[mid].position.tile.x, monster[mid].position.tile.y); if (monster[mid].MType->mtype >= MT_NACID && monster[mid].MType->mtype <= MT_XACID) - AddMissile(monster[mid].position.current.x, monster[mid].position.current.y, 0, 0, 0, MIS_ACIDPUD, TARGET_PLAYERS, mid, monster[mid]._mint + 1, 0); + AddMissile(monster[mid].position.tile.x, monster[mid].position.tile.y, 0, 0, 0, MIS_ACIDPUD, TARGET_PLAYERS, mid, monster[mid]._mint + 1, 0); if (gbIsHellfire) M_StartStand(i, monster[i]._mdir); @@ -1838,11 +1838,11 @@ void M_StartKill(int i, int pnum) assurance((DWORD)i < MAXMONSTERS, i); if (myplr == pnum) { - delta_kill_monster(i, monster[i].position.current.x, monster[i].position.current.y, currlevel); + delta_kill_monster(i, monster[i].position.tile.x, monster[i].position.tile.y, currlevel); if (i != pnum) { - NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster[i].position.current.x, monster[i].position.current.y, i); + NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster[i].position.tile.x, monster[i].position.tile.y, i); } else { - NetSendCmdLocParam1(false, CMD_KILLGOLEM, monster[i].position.current.x, monster[i].position.current.y, currlevel); + NetSendCmdLocParam1(false, CMD_KILLGOLEM, monster[i].position.tile.x, monster[i].position.tile.y, currlevel); } } @@ -1859,7 +1859,7 @@ void M_SyncStartKill(int i, int x, int y, int pnum) if (dMonster[x][y] == 0) { M_ClearSquares(i); - monster[i].position.current = { x, y }; + monster[i].position.tile = { x, y }; monster[i].position.old = { x, y }; } @@ -1879,8 +1879,8 @@ void M_StartFadein(int i, direction md, bool backwards) NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md); monster[i]._mmode = MM_FADEIN; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; monster[i]._mFlags &= ~MFLAG_HIDDEN; if (backwards) { @@ -1898,8 +1898,8 @@ void M_StartFadeout(int i, direction md, bool backwards) NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md); monster[i]._mmode = MM_FADEOUT; monster[i].position.offset = { 0, 0 }; - monster[i].position.future = monster[i].position.current; - monster[i].position.old = monster[i].position.current; + monster[i].position.future = monster[i].position.tile; + monster[i].position.old = monster[i].position.tile; monster[i]._mdir = md; if (backwards) { monster[i]._mFlags |= MFLAG_LOCK_ANIMATION; @@ -1986,23 +1986,23 @@ bool M_DoWalk(int i, int variant) if (monster[i].actionFrame == monster[i].MType->Anims[MA_WALK].Frames) { switch (variant) { case MM_WALK: - dMonster[monster[i].position.current.x][monster[i].position.current.y] = 0; - monster[i].position.current.x += monster[i]._mVar1; - monster[i].position.current.y += monster[i]._mVar2; - dMonster[monster[i].position.current.x][monster[i].position.current.y] = i + 1; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = 0; + monster[i].position.tile.x += monster[i]._mVar1; + monster[i].position.tile.y += monster[i]._mVar2; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; break; case MM_WALK2: dMonster[monster[i]._mVar1][monster[i]._mVar2] = 0; break; case MM_WALK3: - dMonster[monster[i].position.current.x][monster[i].position.current.y] = 0; - monster[i].position.current = { monster[i]._mVar1, monster[i]._mVar2 }; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = 0; + monster[i].position.tile = { monster[i]._mVar1, monster[i]._mVar2 }; dFlags[monster[i].position.temp.x][monster[i].position.temp.y] &= ~BFLAG_MONSTLR; - dMonster[monster[i].position.current.x][monster[i].position.current.y] = i + 1; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; break; } if (monster[i].mlid != NO_LIGHT) - ChangeLightXY(monster[i].mlid, monster[i].position.current.x, monster[i].position.current.y); + ChangeLightXY(monster[i].mlid, monster[i].position.tile.x, monster[i].position.tile.y); M_StartStand(i, monster[i]._mdir); returnValue = true; } else { //We didn't reach new tile so update monster's "sub-tile" position @@ -2073,8 +2073,8 @@ void M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam) } if (plr[pnum]._pHitPoints >> 6 <= 0 || plr[pnum]._pInvincible || plr[pnum]._pSpellFlags & 1) return; - dx = abs(monster[i].position.current.x - plr[pnum].position.current.x); - dy = abs(monster[i].position.current.y - plr[pnum].position.current.y); + dx = abs(monster[i].position.tile.x - plr[pnum].position.tile.x); + dy = abs(monster[i].position.tile.y - plr[pnum].position.tile.y); if (dx >= 2 || dy >= 2) return; @@ -2117,7 +2117,7 @@ void M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam) if (hper >= hit) return; if (blkper < blk) { - direction dir = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, monster[i].position.current.x, monster[i].position.current.y); + direction dir = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, monster[i].position.tile.x, monster[i].position.tile.y); StartPlrBlock(pnum, dir); if (pnum == myplr && plr[pnum].wReflections > 0) { plr[pnum].wReflections--; @@ -2201,10 +2201,10 @@ void M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam) if (monster[i]._mFlags & MFLAG_KNOCKBACK) { if (plr[pnum]._pmode != PM_GOTHIT) StartPlrHit(pnum, 0, true); - newx = plr[pnum].position.current.x + offset_x[monster[i]._mdir]; - newy = plr[pnum].position.current.y + offset_y[monster[i]._mdir]; + newx = plr[pnum].position.tile.x + offset_x[monster[i]._mdir]; + newy = plr[pnum].position.tile.y + offset_y[monster[i]._mdir]; if (PosOkPlayer(pnum, newx, newy)) { - plr[pnum].position.current = { newx, newy }; + plr[pnum].position.tile = { newx, newy }; FixPlayerLocation(pnum, plr[pnum]._pdir); FixPlrWalkTags(pnum); dPlayer[newx][newy] = pnum + 1; @@ -2261,8 +2261,8 @@ bool M_DoRAttack(int i) multimissiles = 1; for (mi = 0; mi < multimissiles; mi++) { AddMissile( - monster[i].position.current.x + (gbIsHellfire ? offset_x[monster[i]._mdir] : 0), - monster[i].position.current.y + (gbIsHellfire ? offset_y[monster[i]._mdir] : 0), + monster[i].position.tile.x + (gbIsHellfire ? offset_x[monster[i]._mdir] : 0), + monster[i].position.tile.y + (gbIsHellfire ? offset_y[monster[i]._mdir] : 0), monster[i].enemyPosition.x, monster[i].enemyPosition.y, monster[i]._mdir, @@ -2292,8 +2292,8 @@ bool M_DoRSpAttack(int i) if (monster[i]._mAnimFrame == monster[i].MData->mAFNum2 && monster[i]._mAnimCnt == 0) { AddMissile( - monster[i].position.current.x + (gbIsHellfire ? offset_x[monster[i]._mdir] : 0), - monster[i].position.current.y + (gbIsHellfire ? offset_y[monster[i]._mdir] : 0), + monster[i].position.tile.x + (gbIsHellfire ? offset_x[monster[i]._mdir] : 0), + monster[i].position.tile.y + (gbIsHellfire ? offset_y[monster[i]._mdir] : 0), monster[i].enemyPosition.x, monster[i].enemyPosition.y, monster[i]._mdir, @@ -2422,7 +2422,7 @@ bool M_DoTalk(int i) quests[Q_GARBUD]._qlog = true; // BUGFIX: (?) for other quests qactive and qlog go together, maybe this should actually go into the if above (fixed) } if (monster[i].mtalkmsg == TEXT_GARBUD2 && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) { - SpawnItem(i, monster[i].position.current.x + 1, monster[i].position.current.y + 1, true); + SpawnItem(i, monster[i].position.tile.x + 1, monster[i].position.tile.y + 1, true); monster[i]._mFlags |= MFLAG_QUEST_COMPLETE; } } @@ -2431,7 +2431,7 @@ bool M_DoTalk(int i) && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) { quests[Q_ZHAR]._qactive = QUEST_ACTIVE; quests[Q_ZHAR]._qlog = true; - CreateTypeItem(monster[i].position.current.x + 1, monster[i].position.current.y + 1, false, ITYPE_MISC, IMISC_BOOK, true, false); + CreateTypeItem(monster[i].position.tile.x + 1, monster[i].position.tile.y + 1, false, ITYPE_MISC, IMISC_BOOK, true, false); monster[i]._mFlags |= MFLAG_QUEST_COMPLETE; } if (monster[i]._uniqtype - 1 == UMT_SNOTSPIL) { @@ -2456,7 +2456,7 @@ bool M_DoTalk(int i) quests[Q_VEIL]._qlog = true; } if (monster[i].mtalkmsg == TEXT_VEIL11 && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) { - SpawnUnique(UITEM_STEELVEIL, monster[i].position.current.x + 1, monster[i].position.current.y + 1); + SpawnUnique(UITEM_STEELVEIL, monster[i].position.tile.x + 1, monster[i].position.tile.y + 1); monster[i]._mFlags |= MFLAG_QUEST_COMPLETE; } } @@ -2495,7 +2495,7 @@ void M_Teleport(int i) if (j != 0 || k != 0) { x = _mx + rx * j; y = _my + ry * k; - if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX && x != Monst->position.current.x && y != Monst->position.current.y) { + if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX && x != Monst->position.tile.x && y != Monst->position.tile.y) { if (PosOkMonst(i, x, y)) done = true; } @@ -2505,7 +2505,7 @@ void M_Teleport(int i) if (done) { M_ClearSquares(i); - dMonster[Monst->position.current.x][Monst->position.current.y] = 0; + dMonster[Monst->position.tile.x][Monst->position.tile.y] = 0; dMonster[x][y] = i + 1; Monst->position.old = { x, y }; Monst->_mdir = M_GetDir(i); @@ -2618,14 +2618,14 @@ bool M_DoDeath(int i) monster[i]._mVar1++; if (monster[i].MType->mtype == MT_DIABLO) { - x = monster[i].position.current.x - ViewX; + x = monster[i].position.tile.x - ViewX; if (x < 0) x = -1; else x = x > 0; ViewX += x; - y = monster[i].position.current.y - ViewY; + y = monster[i].position.tile.y - ViewY; if (y < 0) { y = -1; } else { @@ -2637,11 +2637,11 @@ bool M_DoDeath(int i) PrepDoEnding(); } else if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { if (monster[i]._uniqtype == 0) - AddDead(monster[i].position.current.x, monster[i].position.current.y, monster[i].MType->mdeadval, monster[i]._mdir); + AddDead(monster[i].position.tile.x, monster[i].position.tile.y, monster[i].MType->mdeadval, monster[i]._mdir); else - AddDead(monster[i].position.current.x, monster[i].position.current.y, monster[i]._udeadval, monster[i]._mdir); + AddDead(monster[i].position.tile.x, monster[i].position.tile.y, monster[i]._udeadval, monster[i]._mdir); - dMonster[monster[i].position.current.x][monster[i].position.current.y] = 0; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = 0; monster[i]._mDelFlag = true; M_UpdateLeader(i); @@ -2693,7 +2693,7 @@ bool M_DoStone(int i) commitment((DWORD)i < MAXMONSTERS, i); if (!monster[i]._mhitpoints) { - dMonster[monster[i].position.current.x][monster[i].position.current.y] = 0; + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = 0; monster[i]._mDelFlag = true; } @@ -2744,12 +2744,12 @@ void GroupUnity(int i) if (monster[i].leaderflag != 0) { leader = monster[i].leader; - clear = LineClearSolid(monster[i].position.current.x, monster[i].position.current.y, monster[leader].position.future.x, monster[leader].position.future.y); + clear = LineClearSolid(monster[i].position.tile.x, monster[i].position.tile.y, monster[leader].position.future.x, monster[leader].position.future.y); if (clear || monster[i].leaderflag != 1) { if (clear && monster[i].leaderflag == 2 - && abs(monster[i].position.current.x - monster[leader].position.future.x) < 4 - && abs(monster[i].position.current.y - monster[leader].position.future.y) < 4) { + && abs(monster[i].position.tile.x - monster[leader].position.future.x) < 4 + && abs(monster[i].position.tile.y - monster[leader].position.future.y) < 4) { monster[leader].packsize++; monster[i].leaderflag = 1; } @@ -2761,7 +2761,7 @@ void GroupUnity(int i) if (monster[i].leaderflag == 1) { if (monster[i]._msquelch > monster[leader]._msquelch) { - monster[leader].position.last = monster[i].position.current; + monster[leader].position.last = monster[i].position.tile; monster[leader]._msquelch = monster[i]._msquelch - 1; } if (monster[leader]._mAi == AI_GARG) { @@ -2776,7 +2776,7 @@ void GroupUnity(int i) m = monstactive[j]; if (monster[m].leaderflag == 1 && monster[m].leader == i) { if (monster[i]._msquelch > monster[m]._msquelch) { - monster[m].position.last = monster[i].position.current; + monster[m].position.last = monster[i].position.tile; monster[m]._msquelch = monster[i]._msquelch - 1; } if (monster[m]._mAi == AI_GARG) { @@ -2827,7 +2827,7 @@ bool M_PathWalk(int i) if (!(monster[i]._mFlags & MFLAG_CAN_OPEN_DOOR)) Check = PosOkMonst; - if (FindPath(Check, i, monster[i].position.current.x, monster[i].position.current.y, monster[i].enemyPosition.x, monster[i].enemyPosition.y, path)) { + if (FindPath(Check, i, monster[i].position.tile.x, monster[i].position.tile.y, monster[i].enemyPosition.x, monster[i].enemyPosition.y, path)) { M_CallWalk(i, plr2monst[path[0]]); return true; } @@ -2899,8 +2899,8 @@ void MAI_Zombie(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; if (!(dFlags[mx][my] & BFLAG_VISIBLE)) { return; } @@ -2938,8 +2938,8 @@ void MAI_SkelSd(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; x = mx - Monst->enemyPosition.x; y = my - Monst->enemyPosition.y; direction md = GetDirection(mx, my, Monst->position.last.x, Monst->position.last.y); @@ -2977,15 +2977,15 @@ bool MAI_Path(int i) return false; if (Monst->_mgoal != MGOAL_NORMAL && Monst->_mgoal != MGOAL_MOVE && Monst->_mgoal != MGOAL_ATTACK2) return false; - if (Monst->position.current.x == 1 && Monst->position.current.y == 0) + if (Monst->position.tile.x == 1 && Monst->position.tile.y == 0) return false; } clear = LineClear( PosOkMonst2, i, - Monst->position.current.x, - Monst->position.current.y, + Monst->position.tile.x, + Monst->position.tile.y, Monst->enemyPosition.x, Monst->enemyPosition.y); if (!clear || (Monst->_pathcount >= 5 && Monst->_pathcount < 8)) { @@ -3018,15 +3018,15 @@ void MAI_Snake(int i) return; fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); Monst->_mdir = md; if (abs(mx) >= 2 || abs(my) >= 2) { - if (abs(mx) < 3 && abs(my) < 3 && LineClear(PosOkMonst, i, Monst->position.current.x, Monst->position.current.y, fx, fy) && Monst->_mVar1 != MM_CHARGE) { - if (AddMissile(Monst->position.current.x, Monst->position.current.y, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) { + if (abs(mx) < 3 && abs(my) < 3 && LineClear(PosOkMonst, i, Monst->position.tile.x, Monst->position.tile.y, fx, fy) && Monst->_mVar1 != MM_CHARGE) { + if (AddMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) { PlayEffect(i, 0); - dMonster[Monst->position.current.x][Monst->position.current.y] = -(i + 1); + dMonster[Monst->position.tile.x][Monst->position.tile.y] = -(i + 1); Monst->_mmode = MM_CHARGE; } } else if (Monst->_mVar1 == MM_DELAY || GenerateRnd(100) >= 35 - 2 * Monst->_mint) { @@ -3082,9 +3082,9 @@ void MAI_Bat(int i) return; } - xd = Monst->position.current.x - Monst->enemyPosition.x; - yd = Monst->position.current.y - Monst->enemyPosition.y; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + xd = Monst->position.tile.x - Monst->enemyPosition.x; + yd = Monst->position.tile.y - Monst->enemyPosition.y; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); Monst->_mdir = md; v = GenerateRnd(100); if (Monst->_mgoal == MGOAL_RETREAT) { @@ -3106,9 +3106,9 @@ void MAI_Bat(int i) if (Monst->MType->mtype == MT_GLOOM && (abs(xd) >= 5 || abs(yd) >= 5) && v < 4 * Monst->_mint + 33 - && LineClear(PosOkMonst, i, Monst->position.current.x, Monst->position.current.y, fx, fy)) { - if (AddMissile(Monst->position.current.x, Monst->position.current.y, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) { - dMonster[Monst->position.current.x][Monst->position.current.y] = -(i + 1); + && LineClear(PosOkMonst, i, Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { + if (AddMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) { + dMonster[Monst->position.tile.x][Monst->position.tile.y] = -(i + 1); Monst->_mmode = MM_CHARGE; } } else if (abs(xd) >= 2 || abs(yd) >= 2) { @@ -3145,8 +3145,8 @@ void MAI_SkelBow(int i) return; } - mx = Monst->position.current.x - Monst->enemyPosition.x; - my = Monst->position.current.y - Monst->enemyPosition.y; + mx = Monst->position.tile.x - Monst->enemyPosition.x; + my = Monst->position.tile.y - Monst->enemyPosition.y; direction md = M_GetDir(i); Monst->_mdir = md; @@ -3165,7 +3165,7 @@ void MAI_SkelBow(int i) my = Monst->enemyPosition.y; if (!walking) { if (GenerateRnd(100) < 2 * Monst->_mint + 3) { - if (LineClearMissile(Monst->position.current.x, Monst->position.current.y, mx, my)) + if (LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, mx, my)) M_StartRAttack(i, MIS_ARROW, 4); } } @@ -3186,8 +3186,8 @@ void MAI_Fat(int i) return; } - mx = Monst->position.current.x - Monst->enemyPosition.x; - my = Monst->position.current.y - Monst->enemyPosition.y; + mx = Monst->position.tile.x - Monst->enemyPosition.x; + my = Monst->position.tile.y - Monst->enemyPosition.y; direction md = M_GetDir(i); Monst->_mdir = md; v = GenerateRnd(100); @@ -3218,8 +3218,8 @@ void MAI_Sneak(int i) Monst = &monster[i]; if (Monst->_mmode == MM_STAND) { - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; if (dLight[mx][my] != lightmax) { mx -= Monst->enemyPosition.x; my -= Monst->enemyPosition.y; @@ -3237,9 +3237,9 @@ void MAI_Sneak(int i) } if (Monst->_mgoal == MGOAL_RETREAT && !(Monst->_mFlags & MFLAG_NO_ENEMY)) { if (Monst->_mFlags & MFLAG_TARGETS_MONSTER) - md = GetDirection(Monst->position.current.x, Monst->position.current.y, monster[Monst->_menemy].position.current.x, monster[Monst->_menemy].position.current.y); + md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, monster[Monst->_menemy].position.tile.x, monster[Monst->_menemy].position.tile.y); else - md = GetDirection(Monst->position.current.x, Monst->position.current.y, plr[Monst->_menemy].position.last.x, plr[Monst->_menemy].position.last.y); + md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, plr[Monst->_menemy].position.last.x, plr[Monst->_menemy].position.last.y); md = opposite[md]; if (Monst->MType->mtype == MT_UNSEEN) { if (GenerateRnd(2) != 0) @@ -3289,13 +3289,13 @@ void MAI_Fireman(int i) pnum = monster[i]._menemy; fx = monster[i].enemyPosition.x; fy = monster[i].enemyPosition.y; - xd = monster[i].position.current.x - fx; - yd = monster[i].position.current.y - fy; + xd = monster[i].position.tile.x - fx; + yd = monster[i].position.tile.y - fy; direction md = M_GetDir(i); if (Monst->_mgoal == MGOAL_NORMAL) { - if (LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy) - && AddMissile(Monst->position.current.x, Monst->position.current.y, fx, fy, md, MIS_FIREMAN, pnum, i, 0, 0) != -1) { + if (LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy) + && AddMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy, md, MIS_FIREMAN, pnum, i, 0, 0) != -1) { Monst->_mmode = MM_CHARGE; Monst->_mgoal = MGOAL_ATTACK2; Monst->_mgoalvar1 = 0; @@ -3304,7 +3304,7 @@ void MAI_Fireman(int i) if (Monst->_mgoalvar1 == 3) { Monst->_mgoal = MGOAL_NORMAL; M_StartFadeout(i, md, true); - } else if (LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy)) { + } else if (LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { M_StartRAttack(i, MIS_KRULL, 4); Monst->_mgoalvar1++; } else { @@ -3373,8 +3373,8 @@ void MAI_Fallen(int i) rad = 2 * Monst->_mint + 4; for (y = -rad; y <= rad; y++) { for (x = -rad; x <= rad; x++) { - xpos = Monst->position.current.x + x; - ypos = Monst->position.current.y + y; + xpos = Monst->position.tile.x + x; + ypos = Monst->position.tile.y + y; if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { m = dMonster[xpos][ypos]; if (m > 0) { @@ -3390,8 +3390,8 @@ void MAI_Fallen(int i) } else if (Monst->_mgoal == MGOAL_RETREAT) { M_CallWalk(i, Monst->_mdir); } else if (Monst->_mgoal == MGOAL_ATTACK2) { - xpos = Monst->position.current.x - Monst->enemyPosition.x; - ypos = Monst->position.current.y - Monst->enemyPosition.y; + xpos = Monst->position.tile.x - Monst->enemyPosition.x; + ypos = Monst->position.tile.y - Monst->enemyPosition.y; if (abs(xpos) < 2 && abs(ypos) < 2) M_StartAttack(i); else @@ -3412,8 +3412,8 @@ void MAI_Cleaver(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; x = mx - Monst->enemyPosition.x; y = my - Monst->enemyPosition.y; @@ -3441,13 +3441,13 @@ void MAI_Round(int i, bool special) if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { fy = Monst->enemyPosition.y; fx = Monst->enemyPosition.x; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); v = GenerateRnd(100); - if ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[fx][fy]) { + if ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[fx][fy]) { if (Monst->_mgoal == MGOAL_MOVE || ((abs(mx) >= 4 || abs(my) >= 4) && GenerateRnd(4) == 0)) { if (Monst->_mgoal != MGOAL_MOVE) { Monst->_mgoalvar1 = 0; @@ -3458,7 +3458,7 @@ void MAI_Round(int i, bool special) dist = abs(mx); else dist = abs(my); - if ((Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) || dTransVal[Monst->position.current.x][Monst->position.current.y] != dTransVal[fx][fy]) { + if ((Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) || dTransVal[Monst->position.tile.x][Monst->position.tile.y] != dTransVal[fx][fy]) { Monst->_mgoal = MGOAL_NORMAL; } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) { M_StartDelay(i, GenerateRnd(10) + 10); @@ -3507,8 +3507,8 @@ void MAI_Ranged(int i, int missile_type, bool special) if (Monst->_msquelch == UCHAR_MAX || Monst->_mFlags & MFLAG_TARGETS_MONSTER) { fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; direction md = M_GetDir(i); if (Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); @@ -3520,7 +3520,7 @@ void MAI_Ranged(int i, int missile_type, bool special) M_CallWalk(i, opposite[md]); } if (Monst->_mmode == MM_STAND) { - if (LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy)) { + if (LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { if (special) M_StartRSpAttack(i, missile_type, 4); else @@ -3532,7 +3532,7 @@ void MAI_Ranged(int i, int missile_type, bool special) } else if (Monst->_msquelch != 0) { fx = Monst->position.last.x; fy = Monst->position.last.y; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, fx, fy); + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, fx, fy); M_CallWalk(i, md); } } @@ -3603,7 +3603,7 @@ void MAI_Scav(int i) } if (Monst->_mgoal == MGOAL_HEALING && Monst->_mgoalvar3 != 0) { Monst->_mgoalvar3--; - if (dDead[Monst->position.current.x][Monst->position.current.y] != 0) { + if (dDead[Monst->position.tile.x][Monst->position.tile.y] != 0) { M_StartEat(i); if (!(Monst->_mFlags & MFLAG_NOHEAL)) { if (gbIsHellfire) { @@ -3612,7 +3612,7 @@ void MAI_Scav(int i) if (Monst->_mhitpoints > Monst->_mmaxhp) Monst->_mhitpoints = Monst->_mmaxhp; if (Monst->_mgoalvar3 <= 0 || Monst->_mhitpoints == Monst->_mmaxhp) - dDead[Monst->position.current.x][Monst->position.current.y] = 0; + dDead[Monst->position.tile.x][Monst->position.tile.y] = 0; } else { Monst->_mhitpoints += 64; } @@ -3633,12 +3633,12 @@ void MAI_Scav(int i) // BUGFIX: incorrect check of offset against limits of the dungeon if (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX) continue; - done = dDead[Monst->position.current.x + x][Monst->position.current.y + y] != 0 + done = dDead[Monst->position.tile.x + x][Monst->position.tile.y + y] != 0 && LineClearSolid( - Monst->position.current.x, - Monst->position.current.y, - Monst->position.current.x + x, - Monst->position.current.y + y); + Monst->position.tile.x, + Monst->position.tile.y, + Monst->position.tile.x + x, + Monst->position.tile.y + y); } } x--; @@ -3649,26 +3649,26 @@ void MAI_Scav(int i) // BUGFIX: incorrect check of offset against limits of the dungeon if (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX) continue; - done = dDead[Monst->position.current.x + x][Monst->position.current.y + y] != 0 + done = dDead[Monst->position.tile.x + x][Monst->position.tile.y + y] != 0 && LineClearSolid( - Monst->position.current.x, - Monst->position.current.y, - Monst->position.current.x + x, - Monst->position.current.y + y); + Monst->position.tile.x, + Monst->position.tile.y, + Monst->position.tile.x + x, + Monst->position.tile.y + y); } } x++; y++; } if (done) { - Monst->_mgoalvar1 = x + Monst->position.current.x + 1; - Monst->_mgoalvar2 = y + Monst->position.current.y + 1; + Monst->_mgoalvar1 = x + Monst->position.tile.x + 1; + Monst->_mgoalvar2 = y + Monst->position.tile.y + 1; } } if (Monst->_mgoalvar1) { x = Monst->_mgoalvar1 - 1; y = Monst->_mgoalvar2 - 1; - Monst->_mdir = GetDirection(Monst->position.current.x, Monst->position.current.y, x, y); + Monst->_mdir = GetDirection(Monst->position.tile.x, Monst->position.tile.y, x, y); M_CallWalk(i, Monst->_mdir); } } @@ -3686,13 +3686,13 @@ void MAI_Garg(int i) assurance((DWORD)i < MAXMONSTERS, i); Monst = &monster[i]; - dx = Monst->position.current.x - Monst->position.last.x; - dy = Monst->position.current.y - Monst->position.last.y; + dx = Monst->position.tile.x - Monst->position.last.x; + dy = Monst->position.tile.y - Monst->position.last.y; direction md = M_GetDir(i); if (Monst->_msquelch != 0 && Monst->_mFlags & MFLAG_ALLOW_SPECIAL) { M_Enemy(i); - mx = Monst->position.current.x - Monst->enemyPosition.x; - my = Monst->position.current.y - Monst->enemyPosition.y; + mx = Monst->position.tile.x - Monst->enemyPosition.x; + my = Monst->position.tile.y - Monst->enemyPosition.y; if (abs(mx) < Monst->_mint + 2 && abs(my) < Monst->_mint + 2) { Monst->_mFlags &= ~MFLAG_ALLOW_SPECIAL; } @@ -3729,14 +3729,14 @@ void MAI_RoundRanged(int i, int missile_type, bool checkdoors, int dam, int less if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (checkdoors && Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); v = GenerateRnd(10000); dist = std::max(abs(mx), abs(my)); - if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[fx][fy]) { + if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[fx][fy]) { if (Monst->_mgoal == MGOAL_MOVE || (dist >= 3 && GenerateRnd(4 << lessmissiles) == 0)) { if (Monst->_mgoal != MGOAL_MOVE) { Monst->_mgoalvar1 = 0; @@ -3746,7 +3746,7 @@ void MAI_RoundRanged(int i, int missile_type, bool checkdoors, int dam, int less if (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) { Monst->_mgoal = MGOAL_NORMAL; } else if (v < (500 * (Monst->_mint + 1) >> lessmissiles) - && (LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy))) { + && (LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy))) { M_StartRSpAttack(i, missile_type, dam); } else { M_RoundWalk(i, md, &Monst->_mgoalvar2); @@ -3758,7 +3758,7 @@ void MAI_RoundRanged(int i, int missile_type, bool checkdoors, int dam, int less if (Monst->_mgoal == MGOAL_NORMAL) { if (((dist >= 3 && v < ((500 * (Monst->_mint + 2)) >> lessmissiles)) || v < ((500 * (Monst->_mint + 1)) >> lessmissiles)) - && LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy)) { + && LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { M_StartRSpAttack(i, missile_type, dam); } else if (dist >= 2) { v = GenerateRnd(100); @@ -3811,8 +3811,8 @@ void MAI_RR2(int i, int mistype, int dam) assurance((DWORD)i < MAXMONSTERS, i); Monst = &monster[i]; - mx = Monst->position.current.x - Monst->enemyPosition.x; - my = Monst->position.current.y - Monst->enemyPosition.y; + mx = Monst->position.tile.x - Monst->enemyPosition.x; + my = Monst->position.tile.y - Monst->enemyPosition.y; if (abs(mx) >= 5 || abs(my) >= 5) { MAI_SkelSd(i); return; @@ -3821,14 +3821,14 @@ void MAI_RR2(int i, int mistype, int dam) if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); v = GenerateRnd(100); dist = std::max(abs(mx), abs(my)); - if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[fx][fy]) { + if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[fx][fy]) { if (Monst->_mgoal == MGOAL_MOVE || dist >= 3) { if (Monst->_mgoal != MGOAL_MOVE) { Monst->_mgoalvar1 = 0; @@ -3845,7 +3845,7 @@ void MAI_RR2(int i, int mistype, int dam) } else Monst->_mgoal = MGOAL_NORMAL; if (Monst->_mgoal == MGOAL_NORMAL) { - if (((dist >= 3 && v < 5 * (Monst->_mint + 2)) || v < 5 * (Monst->_mint + 1) || Monst->_mgoalvar3 == 4) && LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy)) { + if (((dist >= 3 && v < 5 * (Monst->_mint + 2)) || v < 5 * (Monst->_mint + 1) || Monst->_mgoalvar3 == 4) && LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { M_StartRSpAttack(i, mistype, dam); } else if (dist >= 2) { v = GenerateRnd(100); @@ -3887,7 +3887,7 @@ void MAI_Golum(int i) assurance((DWORD)i < MAXMONSTERS, i); Monst = &monster[i]; - if (Monst->position.current.x == 1 && Monst->position.current.y == 0) { + if (Monst->position.tile.x == 1 && Monst->position.tile.y == 0) { return; } @@ -3908,21 +3908,21 @@ void MAI_Golum(int i) _menemy = monster[i]._menemy; - mx = monster[i].position.current.x; - my = monster[i].position.current.y; + mx = monster[i].position.tile.x; + my = monster[i].position.tile.y; _mex = mx - monster[_menemy].position.future.x; _mey = my - monster[_menemy].position.future.y; - direction md = GetDirection(mx, my, monster[_menemy].position.current.x, monster[_menemy].position.current.y); + direction md = GetDirection(mx, my, monster[_menemy].position.tile.x, monster[_menemy].position.tile.y); monster[i]._mdir = md; if (abs(_mex) < 2 && abs(_mey) < 2 && have_enemy) { _menemy = monster[i]._menemy; - monster[i].enemyPosition = monster[_menemy].position.current; + monster[i].enemyPosition = monster[_menemy].position.tile; if (monster[_menemy]._msquelch == 0) { monster[_menemy]._msquelch = UCHAR_MAX; - monster[monster[i]._menemy].position.last = monster[i].position.current; + monster[monster[i]._menemy].position.last = monster[i].position.tile; for (j = 0; j < 5; j++) { for (k = 0; k < 5; k++) { - _menemy = dMonster[monster[i].position.current.x + k - 2][monster[i].position.current.y + j - 2]; + _menemy = dMonster[monster[i].position.tile.x + k - 2][monster[i].position.tile.y + j - 2]; if (_menemy > 0) monster[_menemy - 1]._msquelch = UCHAR_MAX; // BUGFIX: should be `monster[_menemy-1]`, not monster[_menemy]. (fixed) } @@ -3963,21 +3963,21 @@ void MAI_SkelKing(int i) if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); v = GenerateRnd(100); dist = std::max(abs(mx), abs(my)); - if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[fx][fy]) { + if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[fx][fy]) { if (Monst->_mgoal == MGOAL_MOVE || ((abs(mx) >= 3 || abs(my) >= 3) && GenerateRnd(4) == 0)) { if (Monst->_mgoal != MGOAL_MOVE) { Monst->_mgoalvar1 = 0; Monst->_mgoalvar2 = GenerateRnd(2); } Monst->_mgoal = MGOAL_MOVE; - if ((Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) || dTransVal[Monst->position.current.x][Monst->position.current.y] != dTransVal[fx][fy]) { + if ((Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) || dTransVal[Monst->position.tile.x][Monst->position.tile.y] != dTransVal[fx][fy]) { Monst->_mgoal = MGOAL_NORMAL; } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) { M_StartDelay(i, GenerateRnd(10) + 10); @@ -3988,9 +3988,9 @@ void MAI_SkelKing(int i) if (Monst->_mgoal == MGOAL_NORMAL) { if (!gbIsMultiplayer && ((dist >= 3 && v < 4 * Monst->_mint + 35) || v < 6) - && LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy)) { - nx = Monst->position.current.x + offset_x[md]; - ny = Monst->position.current.y + offset_y[md]; + && LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { + nx = Monst->position.tile.x + offset_x[md]; + ny = Monst->position.tile.y + offset_y[md]; if (PosOkMonst(i, nx, ny) && nummonsters < MAXMONSTERS) { M_SpawnSkel(nx, ny, md); M_StartSpStand(i, md); @@ -4026,9 +4026,9 @@ void MAI_Rhino(int i) if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); v = GenerateRnd(100); @@ -4040,7 +4040,7 @@ void MAI_Rhino(int i) Monst->_mgoalvar2 = GenerateRnd(2); } Monst->_mgoal = MGOAL_MOVE; - if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->position.current.x][Monst->position.current.y] != dTransVal[fx][fy]) { + if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->position.tile.x][Monst->position.tile.y] != dTransVal[fx][fy]) { Monst->_mgoal = MGOAL_NORMAL; } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) { M_StartDelay(i, GenerateRnd(10) + 10); @@ -4051,11 +4051,11 @@ void MAI_Rhino(int i) if (Monst->_mgoal == MGOAL_NORMAL) { if (dist >= 5 && v < 2 * Monst->_mint + 43 - && LineClear(PosOkMonst, i, Monst->position.current.x, Monst->position.current.y, fx, fy)) { - if (AddMissile(Monst->position.current.x, Monst->position.current.y, fx, fy, md, MIS_RHINO, Monst->_menemy, i, 0, 0) != -1) { + && LineClear(PosOkMonst, i, Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { + if (AddMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy, md, MIS_RHINO, Monst->_menemy, i, 0, 0) != -1) { if (Monst->MData->snd_special) PlayEffect(i, 3); - dMonster[Monst->position.current.x][Monst->position.current.y] = -(i + 1); + dMonster[Monst->position.tile.x][Monst->position.tile.y] = -(i + 1); Monst->_mmode = MM_CHARGE; } } else { @@ -4096,9 +4096,9 @@ void MAI_HorkDemon(int i) fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (Monst->_msquelch < 255) { MonstCheckDoors(i); @@ -4119,7 +4119,7 @@ void MAI_HorkDemon(int i) } else { dist = abs(my); } - if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->position.current.x][Monst->position.current.y] != dTransVal[fx][fy]) { + if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->position.tile.x][Monst->position.tile.y] != dTransVal[fx][fy]) { Monst->_mgoal = MGOAL_NORMAL; } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) { M_StartDelay(i, GenerateRnd(10) + 10); @@ -4128,7 +4128,7 @@ void MAI_HorkDemon(int i) if (Monst->_mgoal == 1) { if ((abs(mx) >= 3 || abs(my) >= 3) && v < 2 * Monst->_mint + 43) { - if (PosOkMonst(i, Monst->position.current.x + offset_x[Monst->_mdir], Monst->position.current.y + offset_y[Monst->_mdir]) && nummonsters < MAXMONSTERS) { + if (PosOkMonst(i, Monst->position.tile.x + offset_x[Monst->_mdir], Monst->position.tile.y + offset_y[Monst->_mdir]) && nummonsters < MAXMONSTERS) { M_StartRSpAttack(i, MIS_HORKDMN, 0); } } else if (abs(mx) < 2 && abs(my) < 2) { @@ -4163,9 +4163,9 @@ void MAI_Counselor(int i) if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { fx = Monst->enemyPosition.x; fy = Monst->enemyPosition.y; - mx = Monst->position.current.x - fx; - my = Monst->position.current.y - fy; - direction md = GetDirection(Monst->position.current.x, Monst->position.current.y, Monst->position.last.x, Monst->position.last.y); + mx = Monst->position.tile.x - fx; + my = Monst->position.tile.y - fy; + direction md = GetDirection(Monst->position.tile.x, Monst->position.tile.y, Monst->position.last.x, Monst->position.last.y); if (Monst->_msquelch < UCHAR_MAX) MonstCheckDoors(i); v = GenerateRnd(100); @@ -4178,7 +4178,7 @@ void MAI_Counselor(int i) } } else if (Monst->_mgoal == MGOAL_MOVE) { dist = std::max(abs(mx), abs(my)); - if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.current.x][Monst->position.current.y] == dTransVal[fx][fy]) { + if (dist >= 2 && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->position.tile.x][Monst->position.tile.y] == dTransVal[fx][fy]) { if (Monst->_mgoalvar1++ < 2 * dist || !DirOK(i, md)) { M_RoundWalk(i, md, &Monst->_mgoalvar2); } else { @@ -4191,7 +4191,7 @@ void MAI_Counselor(int i) } } else if (Monst->_mgoal == MGOAL_NORMAL) { if (abs(mx) >= 2 || abs(my) >= 2) { - if (v < 5 * (Monst->_mint + 10) && LineClearMissile(Monst->position.current.x, Monst->position.current.y, fx, fy)) { + if (v < 5 * (Monst->_mint + 10) && LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) { M_StartRAttack(i, counsmiss[Monst->_mint], Monst->mMinDamage + GenerateRnd(Monst->mMaxDamage - Monst->mMinDamage + 1)); } else if (GenerateRnd(100) < 30) { Monst->_mgoal = MGOAL_MOVE; @@ -4208,8 +4208,8 @@ void MAI_Counselor(int i) } else if (Monst->_mVar1 == MM_DELAY || GenerateRnd(100) < 2 * Monst->_mint + 20) { M_StartRAttack(i, -1, 0); - AddMissile(Monst->position.current.x, Monst->position.current.y, 0, 0, Monst->_mdir, MIS_FLASH, TARGET_PLAYERS, i, 4, 0); - AddMissile(Monst->position.current.x, Monst->position.current.y, 0, 0, Monst->_mdir, MIS_FLASH2, TARGET_PLAYERS, i, 4, 0); + AddMissile(Monst->position.tile.x, Monst->position.tile.y, 0, 0, Monst->_mdir, MIS_FLASH, TARGET_PLAYERS, i, 4, 0); + AddMissile(Monst->position.tile.x, Monst->position.tile.y, 0, 0, Monst->_mdir, MIS_FLASH2, TARGET_PLAYERS, i, 4, 0); } else M_StartDelay(i, GenerateRnd(10) + 2 * (5 - Monst->_mint)); } @@ -4232,8 +4232,8 @@ void MAI_Garbud(int i) return; } - _mx = Monst->position.current.x; - _my = Monst->position.current.y; + _mx = Monst->position.tile.x; + _my = Monst->position.tile.y; direction md = M_GetDir(i); if (Monst->mtalkmsg >= TEXT_GARBUD1 @@ -4285,8 +4285,8 @@ void MAI_Zhar(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; direction md = M_GetDir(i); if (Monst->mtalkmsg == TEXT_ZHAR1 && !(dFlags[mx][my] & BFLAG_VISIBLE) && Monst->_mgoal == MGOAL_TALKING) { Monst->mtalkmsg = TEXT_ZHAR2; @@ -4324,8 +4324,8 @@ void MAI_SnotSpil(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; direction md = M_GetDir(i); if (Monst->mtalkmsg == TEXT_BANNER10 && !(dFlags[mx][my] & BFLAG_VISIBLE) && Monst->_mgoal == MGOAL_TALKING) { @@ -4373,12 +4373,12 @@ void MAI_Lazurus(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; direction md = M_GetDir(i); if (dFlags[mx][my] & BFLAG_VISIBLE) { if (!gbIsMultiplayer) { - if (Monst->mtalkmsg == TEXT_VILE13 && Monst->_mgoal == MGOAL_INQUIRING && plr[myplr].position.current.x == 35 && plr[myplr].position.current.y == 46) { + if (Monst->mtalkmsg == TEXT_VILE13 && Monst->_mgoal == MGOAL_INQUIRING && plr[myplr].position.tile.x == 35 && plr[myplr].position.tile.y == 46) { PlayInGameMovie("gendata\\fprst3.smk"); Monst->_mmode = MM_TALK; quests[Q_BETRAYER]._qvar1 = 5; @@ -4425,8 +4425,8 @@ void MAI_Lazhelp(int i) return; Monst = &monster[i]; - _mx = Monst->position.current.x; - _my = Monst->position.current.y; + _mx = Monst->position.tile.x; + _my = Monst->position.tile.y; direction md = M_GetDir(i); if (dFlags[_mx][_my] & BFLAG_VISIBLE) { @@ -4459,8 +4459,8 @@ void MAI_Lachdanan(int i) return; } - _mx = Monst->position.current.x; - _my = Monst->position.current.y; + _mx = Monst->position.tile.x; + _my = Monst->position.tile.y; direction md = M_GetDir(i); if (Monst->mtalkmsg == TEXT_VEIL9 && !(dFlags[_mx][_my] & BFLAG_VISIBLE) && monster[i]._mgoal == MGOAL_TALKING) { @@ -4496,8 +4496,8 @@ void MAI_Warlord(int i) return; } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; direction md = M_GetDir(i); if (dFlags[mx][my] & BFLAG_VISIBLE) { if (Monst->mtalkmsg == TEXT_WARLRD9 && Monst->_mgoal == MGOAL_INQUIRING) @@ -4523,7 +4523,7 @@ void DeleteMonsterList() int i; for (i = 0; i < MAX_PLRS; i++) { if (monster[i]._mDelFlag) { - monster[i].position.current = { 1, 0 }; + monster[i].position.tile = { 1, 0 }; monster[i].position.future = { 0, 0 }; monster[i].position.old = { 0, 0 }; monster[i]._mDelFlag = false; @@ -4565,8 +4565,8 @@ void ProcessMonsters() Monst->_mhitpoints += Monst->mLevel; } } - mx = Monst->position.current.x; - my = Monst->position.current.y; + mx = Monst->position.tile.x; + my = Monst->position.tile.y; if (dFlags[mx][my] & BFLAG_VISIBLE && Monst->_msquelch == 0) { if (Monst->MType->mtype == MT_CLEAVER) { @@ -4711,8 +4711,8 @@ bool DirOK(int i, direction mdir) int mcount, mi; commitment((DWORD)i < MAXMONSTERS, i); - fx = monster[i].position.current.x + offset_x[mdir]; - fy = monster[i].position.current.y + offset_y[mdir]; + fx = monster[i].position.tile.x + offset_x[mdir]; + fy = monster[i].position.tile.y + offset_y[mdir]; if (fy < 0 || fy >= MAXDUNY || fx < 0 || fx >= MAXDUNX || !PosOkMonst(i, fx, fy)) return false; if (mdir == DIR_E) { @@ -4951,12 +4951,12 @@ void M_FallenFear(int x, int y) continue; } if (m->_mAi == AI_FALLEN - && abs(x - m->position.current.x) < 5 - && abs(y - m->position.current.y) < 5 + && abs(x - m->position.tile.x) < 5 + && abs(y - m->position.tile.y) < 5 && m->_mhitpoints >> 6 > 0) { m->_mgoal = MGOAL_RETREAT; m->_mgoalvar1 = rundist; - m->_mdir = GetDirection(x, y, m->position.current.x, m->position.current.y); + m->_mdir = GetDirection(x, y, m->position.tile.x, m->position.tile.y); } } } @@ -5101,11 +5101,11 @@ void MissToMonst(int i, int x, int y) assurance((DWORD)m < MAXMONSTERS, m); Monst = &monster[m]; - oldx = Miss->position.current.x; - oldy = Miss->position.current.y; + oldx = Miss->position.tile.x; + oldy = Miss->position.tile.y; dMonster[x][y] = m + 1; Monst->_mdir = static_cast(Miss->_mimfnum); - Monst->position.current = { x, y }; + Monst->position.tile = { x, y }; M_StartStand(m, Monst->_mdir); if (Monst->MType->mtype < MT_INCIN || Monst->MType->mtype > MT_HELLBURN) { if (!(Monst->_mFlags & MFLAG_TARGETS_MONSTER)) @@ -5127,7 +5127,7 @@ void MissToMonst(int i, int x, int y) newx = oldx + offset_x[Monst->_mdir]; newy = oldy + offset_y[Monst->_mdir]; if (PosOkPlayer(pnum, newx, newy)) { - plr[pnum].position.current = { newx, newy }; + plr[pnum].position.tile = { newx, newy }; FixPlayerLocation(pnum, plr[pnum]._pdir); FixPlrWalkTags(pnum); dPlayer[newx][newy] = pnum + 1; @@ -5148,7 +5148,7 @@ void MissToMonst(int i, int x, int y) dMonster[newx][newy] = m; dMonster[oldx][oldy] = 0; m--; - monster[m].position.current = { newx, newy }; + monster[m].position.tile = { newx, newy }; monster[m].position.future = { newx, newy }; } } @@ -5193,7 +5193,7 @@ bool monster_posok(int i, int x, int y) } else { for (j = 0; j < nummissiles; j++) { mi = missileactive[j]; - if (missile[mi].position.current.x == x && missile[mi].position.current.y == y) { + if (missile[mi].position.tile.x == x && missile[mi].position.tile.y == y) { if (missile[mi]._mitype == MIS_FIREWALL) { fire = true; break; @@ -5301,7 +5301,7 @@ int M_SpawnSkel(int x, int y, direction dir) void ActivateSpawn(int i, int x, int y, direction dir) { dMonster[x][y] = i + 1; - monster[i].position.current = { x, y }; + monster[i].position.tile = { x, y }; monster[i].position.future = { x, y }; monster[i].position.old = { x, y }; M_StartSpStand(i, dir); @@ -5422,7 +5422,7 @@ void SpawnGolum(int i, int x, int y, int mi) assurance((DWORD)i < MAXMONSTERS, i); dMonster[x][y] = i + 1; - monster[i].position.current = { x, y }; + monster[i].position.tile = { x, y }; monster[i].position.future = { x, y }; monster[i].position.old = { x, y }; monster[i]._pathcount = 0; @@ -5437,8 +5437,8 @@ void SpawnGolum(int i, int x, int y, int mi) M_Enemy(i); if (i == myplr) { NetSendCmdGolem( - monster[i].position.current.x, - monster[i].position.current.y, + monster[i].position.tile.x, + monster[i].position.tile.y, monster[i]._mdir, monster[i]._menemy, monster[i]._mhitpoints, diff --git a/Source/msg.cpp b/Source/msg.cpp index 4ad3f40d4..a69631d7f 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -510,8 +510,8 @@ void delta_leave_sync(BYTE bLevel) continue; sgbDeltaChanged = true; DMonsterStr *pD = &sgLevels[bLevel].monster[ma]; - pD->_mx = monster[ma].position.current.x; - pD->_my = monster[ma].position.current.y; + pD->_mx = monster[ma].position.tile.x; + pD->_my = monster[ma].position.tile.y; pD->_mdir = monster[ma]._mdir; pD->_menemy = encode_enemy(ma); pD->_mhitpoints = monster[ma]._mhitpoints; @@ -656,8 +656,8 @@ void DeltaAddItem(int ii) if (pD->bCmd == 0xFF) { sgbDeltaChanged = true; pD->bCmd = CMD_STAND; - pD->x = items[ii]._ix; - pD->y = items[ii]._iy; + pD->x = items[ii].position.x; + pD->y = items[ii].position.y; pD->wIndx = items[ii].IDidx; pD->wCI = items[ii]._iCreateInfo; pD->dwSeed = items[ii]._iSeed; @@ -709,29 +709,27 @@ void DeltaLoadLevel() M_ClearSquares(i); x = sgLevels[currlevel].monster[i]._mx; y = sgLevels[currlevel].monster[i]._my; - monster[i].position.current = { x, y }; + monster[i].position.tile = { x, y }; monster[i].position.old = { x, y }; monster[i].position.future = { x, y }; if (sgLevels[currlevel].monster[i]._mhitpoints != -1) monster[i]._mhitpoints = sgLevels[currlevel].monster[i]._mhitpoints; if (sgLevels[currlevel].monster[i]._mhitpoints == 0) { - monster[i].position.old.x = sgLevels[currlevel].monster[i]._mx; // CODEFIX: useless assignment - monster[i].position.old.y = sgLevels[currlevel].monster[i]._my; // CODEFIX: useless assignment M_ClearSquares(i); if (monster[i]._mAi != AI_DIABLO) { if (monster[i]._uniqtype == 0) { assert(monster[i].MType != nullptr); - AddDead(monster[i].position.current.x, monster[i].position.current.y, monster[i].MType->mdeadval, monster[i]._mdir); + AddDead(monster[i].position.tile.x, monster[i].position.tile.y, monster[i].MType->mdeadval, monster[i]._mdir); } else { - AddDead(monster[i].position.current.x, monster[i].position.current.y, monster[i]._udeadval, monster[i]._mdir); + AddDead(monster[i].position.tile.x, monster[i].position.tile.y, monster[i]._udeadval, monster[i]._mdir); } } monster[i]._mDelFlag = true; M_UpdateLeader(i); } else { decode_enemy(i, sgLevels[currlevel].monster[i]._menemy); - if ((monster[i].position.current.x && monster[i].position.current.x != 1) || monster[i].position.current.y) - dMonster[monster[i].position.current.x][monster[i].position.current.y] = i + 1; + if ((monster[i].position.tile.x && monster[i].position.tile.x != 1) || monster[i].position.tile.y) + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; if (i < MAX_PLRS) { MAI_Golum(i); monster[i]._mFlags |= (MFLAG_TARGETS_MONSTER | MFLAG_GOLEM); @@ -753,8 +751,8 @@ void DeltaLoadLevel() sgLevels[currlevel].item[i].wCI, sgLevels[currlevel].item[i].dwSeed); if (ii != -1) { - if (dItem[items[ii]._ix][items[ii]._iy] == ii + 1) - dItem[items[ii]._ix][items[ii]._iy] = 0; + if (dItem[items[ii].position.x][items[ii].position.y] == ii + 1) + dItem[items[ii].position.x][items[ii].position.y] = 0; DeleteItem(ii, i); } } @@ -813,9 +811,8 @@ void DeltaLoadLevel() } } } - items[ii]._ix = x; - items[ii]._iy = y; - dItem[items[ii]._ix][items[ii]._iy] = ii + 1; + items[ii].position = { x, y }; + dItem[items[ii].position.x][items[ii].position.y] = ii + 1; RespawnItem(&items[ii], false); } } @@ -994,8 +991,8 @@ void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii) cmd.bLevel = currlevel; cmd.bCursitem = ii; cmd.dwTime = 0; - cmd.x = items[ii]._ix; - cmd.y = items[ii]._iy; + cmd.x = items[ii].position.x; + cmd.y = items[ii].position.y; cmd.wIndx = items[ii].IDidx; if (items[ii].IDidx == IDI_EAR) { @@ -1165,8 +1162,8 @@ void NetSendCmdDItem(bool bHiPri, int ii) TCmdPItem cmd; cmd.bCmd = CMD_DROPITEM; - cmd.x = items[ii]._ix; - cmd.y = items[ii]._iy; + cmd.x = items[ii].position.x; + cmd.y = items[ii].position.y; cmd.wIndx = items[ii].IDidx; if (items[ii].IDidx == IDI_EAR) { @@ -1439,7 +1436,7 @@ static DWORD On_GETITEM(TCmd *pCmd, int pnum) if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) { if (p->bPnum == myplr) { if (currlevel != p->bLevel) { - ii = SyncPutItem(myplr, plr[myplr].position.current.x, plr[myplr].position.current.y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + ii = SyncPutItem(myplr, plr[myplr].position.tile.x, plr[myplr].position.tile.y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); if (ii != -1) InvGetItem(myplr, &items[ii], ii); } else @@ -1501,7 +1498,7 @@ static DWORD On_AGETITEM(TCmd *pCmd, int pnum) if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) { if (p->bPnum == myplr) { if (currlevel != p->bLevel) { - int ii = SyncPutItem(myplr, plr[myplr].position.current.x, plr[myplr].position.current.y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + int ii = SyncPutItem(myplr, plr[myplr].position.tile.x, plr[myplr].position.tile.y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); if (ii != -1) AutoGetItem(myplr, &items[ii], ii); } else @@ -1545,7 +1542,7 @@ static DWORD On_PUTITEM(TCmd *pCmd, int pnum) ii = SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); if (ii != -1) { PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, items[ii]._ix, items[ii]._iy, plr[pnum].plrlevel); + delta_put_item(p, items[ii].position.x, items[ii].position.y, plr[pnum].plrlevel); check_update_plr(pnum); } return sizeof(*p); @@ -1568,7 +1565,7 @@ static DWORD On_SYNCPUTITEM(TCmd *pCmd, int pnum) int ii = SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); if (ii != -1) { PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, items[ii]._ix, items[ii]._iy, plr[pnum].plrlevel); + delta_put_item(p, items[ii].position.x, items[ii].position.y, plr[pnum].plrlevel); check_update_plr(pnum); } return sizeof(*p); @@ -1756,8 +1753,8 @@ static DWORD On_ATTACKID(TCmd *pCmd, int pnum) auto *p = (TCmdParam1 *)pCmd; if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - int distx = abs(plr[pnum].position.current.x - monster[p->wParam1].position.future.x); - int disty = abs(plr[pnum].position.current.y - monster[p->wParam1].position.future.y); + int distx = abs(plr[pnum].position.tile.x - monster[p->wParam1].position.future.x); + int disty = abs(plr[pnum].position.tile.y - monster[p->wParam1].position.future.y); if (distx > 1 || disty > 1) MakePlrPath(pnum, monster[p->wParam1].position.future.x, monster[p->wParam1].position.future.y, false); plr[pnum].destAction = ACTION_ATTACKMON; @@ -2014,7 +2011,7 @@ static DWORD On_AWAKEGOLEM(TCmd *pCmd, int pnum) } } if (addGolem) - AddMissile(plr[pnum].position.current.x, plr[pnum].position.current.y, p->_mx, p->_my, p->_mdir, MIS_GOLEM, TARGET_MONSTERS, pnum, 0, 1); + AddMissile(plr[pnum].position.tile.x, plr[pnum].position.tile.y, p->_mx, p->_my, p->_mdir, MIS_GOLEM, TARGET_MONSTERS, pnum, 0, 1); } return sizeof(*p); @@ -2224,7 +2221,7 @@ static DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum) } if (plr[pnum].plractive && myplr != pnum) { - plr[pnum].position.current = { p->x, p->y }; + plr[pnum].position.tile = { p->x, p->y }; plr[pnum].plrlevel = p->wParam1; plr[pnum]._pGFXLoad = 0; if (currlevel == plr[pnum].plrlevel) { @@ -2239,10 +2236,10 @@ static DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum) NewPlrAnim(pnum, plr[pnum]._pDAnim[DIR_S], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth); plr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1; plr[pnum].actionFrame = plr[pnum]._pAnimLen * 2; - dFlags[plr[pnum].position.current.x][plr[pnum].position.current.y] |= BFLAG_DEAD_PLAYER; + dFlags[plr[pnum].position.tile.x][plr[pnum].position.tile.y] |= BFLAG_DEAD_PLAYER; } - plr[pnum]._pvid = AddVision(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum]._pLightRad, pnum == myplr); + plr[pnum]._pvid = AddVision(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum]._pLightRad, pnum == myplr); plr[pnum]._plid = NO_LIGHT; } } diff --git a/Source/multi.cpp b/Source/multi.cpp index 309cd8627..6cba54f38 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -119,8 +119,8 @@ static void NetRecvPlrData(TPkt *pkt) const Point target = plr[myplr].GetTargetPosition(); pkt->hdr.wCheck = LOAD_BE32("\0\0ip"); - pkt->hdr.px = plr[myplr].position.current.x; - pkt->hdr.py = plr[myplr].position.current.y; + pkt->hdr.px = plr[myplr].position.tile.x; + pkt->hdr.py = plr[myplr].position.tile.y; pkt->hdr.targx = target.x; pkt->hdr.targy = target.y; pkt->hdr.php = plr[myplr]._pHitPoints; @@ -486,24 +486,24 @@ void multi_process_network_packets() plr[dwID]._pBaseDex = pkt->bdex; if (!cond && plr[dwID].plractive && plr[dwID]._pHitPoints != 0) { if (currlevel == plr[dwID].plrlevel && !plr[dwID]._pLvlChanging) { - dx = abs(plr[dwID].position.current.x - pkt->px); - dy = abs(plr[dwID].position.current.y - pkt->py); + dx = abs(plr[dwID].position.tile.x - pkt->px); + dy = abs(plr[dwID].position.tile.y - pkt->py); if ((dx > 3 || dy > 3) && dPlayer[pkt->px][pkt->py] == 0) { FixPlrWalkTags(dwID); - plr[dwID].position.old = plr[dwID].position.current; + plr[dwID].position.old = plr[dwID].position.tile; FixPlrWalkTags(dwID); - plr[dwID].position.current = { pkt->px, pkt->py }; + plr[dwID].position.tile = { pkt->px, pkt->py }; plr[dwID].position.future = { pkt->px, pkt->py }; - dPlayer[plr[dwID].position.current.x][plr[dwID].position.current.y] = dwID + 1; + dPlayer[plr[dwID].position.tile.x][plr[dwID].position.tile.y] = dwID + 1; } - dx = abs(plr[dwID].position.future.x - plr[dwID].position.current.x); - dy = abs(plr[dwID].position.future.y - plr[dwID].position.current.y); + dx = abs(plr[dwID].position.future.x - plr[dwID].position.tile.x); + dy = abs(plr[dwID].position.future.y - plr[dwID].position.tile.y); if (dx > 1 || dy > 1) { - plr[dwID].position.future = plr[dwID].position.current; + plr[dwID].position.future = plr[dwID].position.tile; } MakePlrPath(dwID, pkt->targx, pkt->targy, true); } else { - plr[dwID].position.current = { pkt->px, pkt->py }; + plr[dwID].position.tile = { pkt->px, pkt->py }; plr[dwID].position.future = { pkt->px, pkt->py }; } } @@ -626,7 +626,7 @@ static void SetupLocalCoords() #endif x += plrxoff[myplr]; y += plryoff[myplr]; - plr[myplr].position.current = { x, y }; + plr[myplr].position.tile = { x, y }; plr[myplr].position.future = { x, y }; plr[myplr].plrlevel = currlevel; plr[myplr]._pLvlChanging = true; @@ -881,7 +881,7 @@ void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, bool recv) NewPlrAnim(pnum, plr[pnum]._pDAnim[DIR_S], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth); plr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1; plr[pnum].actionFrame = 2 * plr[pnum]._pAnimLen; - dFlags[plr[pnum].position.current.x][plr[pnum].position.current.y] |= BFLAG_DEAD_PLAYER; + dFlags[plr[pnum].position.tile.x][plr[pnum].position.tile.y] |= BFLAG_DEAD_PLAYER; } } } diff --git a/Source/objects.cpp b/Source/objects.cpp index 8d70080b3..dd1dc8707 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -481,8 +481,8 @@ void AddCandles() { int tx, ty; - tx = quests[Q_PWATER]._qtx; - ty = quests[Q_PWATER]._qty; + tx = quests[Q_PWATER].position.x; + ty = quests[Q_PWATER].position.y; AddObject(OBJ_STORYCANDLE, tx - 2, ty + 1); AddObject(OBJ_STORYCANDLE, tx + 3, ty + 1); AddObject(OBJ_STORYCANDLE, tx - 1, ty + 2); @@ -1261,8 +1261,8 @@ void DeleteObject_(int oi, int i) { int ox, oy; - ox = object[oi]._ox; - oy = object[oi]._oy; + ox = object[oi].position.x; + oy = object[oi].position.y; dObject[ox][oy] = 0; objectavail[-nobjects + MAXOBJECTS] = oi; nobjects--; @@ -1274,8 +1274,7 @@ void SetupObject(int i, int x, int y, _object_id ot) { object[i]._otype = ot; object_graphic_id ofi = AllObjects[ot].ofindex; - object[i]._ox = x; - object[i]._oy = y; + object[i].position = { x, y }; int j = 0; while (ObjFileList[j] != ofi) { j++; @@ -1398,7 +1397,7 @@ void AddL3Door(int i, int x, int y, int ot) void AddSarc(int i) { - dObject[object[i]._ox][object[i]._oy - 1] = -(i + 1); + dObject[object[i].position.x][object[i].position.y - 1] = -(i + 1); object[i]._oVar1 = GenerateRnd(10); object[i]._oRndSeed = AdvanceRndSeed(); if (object[i]._oVar1 >= 8) @@ -1443,7 +1442,7 @@ void AddTrap(int i) void AddObjLight(int i, int r) { if (InitObjFlag) { - DoLighting(object[i]._ox, object[i]._oy, r, -1); + DoLighting(object[i].position.x, object[i].position.y, r, -1); object[i]._oVar1 = -1; } else { object[i]._oVar1 = 0; @@ -1509,8 +1508,8 @@ void AddPurifyingFountain(int i) { int ox, oy; - ox = object[i]._ox; - oy = object[i]._oy; + ox = object[i].position.x; + oy = object[i].position.y; dObject[ox][oy - 1] = -(i + 1); dObject[ox - 1][oy] = -(i + 1); dObject[ox - 1][oy - 1] = -(i + 1); @@ -1541,8 +1540,8 @@ void AddMurkyFountain(int i) { int ox, oy; - ox = object[i]._ox; - oy = object[i]._oy; + ox = object[i].position.x; + oy = object[i].position.y; dObject[ox][oy - 1] = -(i + 1); dObject[ox - 1][oy] = -(i + 1); dObject[ox - 1][oy - 1] = -(i + 1); @@ -1915,15 +1914,15 @@ void Obj_Light(int i, int lr) turnon = false; if (object[i]._oVar1 != -1) { - ox = object[i]._ox; - oy = object[i]._oy; + ox = object[i].position.x; + oy = object[i].position.y; tr = lr + 10; if (!lightflag) { for (p = 0; p < MAX_PLRS && !turnon; p++) { if (plr[p].plractive) { if (currlevel == plr[p].plrlevel) { - dx = abs(plr[p].position.current.x - ox); - dy = abs(plr[p].position.current.y - oy); + dx = abs(plr[p].position.tile.x - ox); + dy = abs(plr[p].position.tile.y - oy); if (dx < tr && dy < tr) turnon = true; } @@ -1946,10 +1945,10 @@ void Obj_Circle(int i) { int ox, oy, wx, wy; - ox = object[i]._ox; - oy = object[i]._oy; - wx = plr[myplr].position.current.x; - wy = plr[myplr].position.current.y; + ox = object[i].position.x; + oy = object[i].position.y; + wx = plr[myplr].position.tile.x; + wy = plr[myplr].position.tile.y; if (wx == ox && wy == oy) { if (object[i]._otype == OBJ_MCIRCLE1) object[i]._oAnimFrame = 2; @@ -1967,7 +1966,7 @@ void Obj_Circle(int i) ObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4); if (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE && quests[Q_BETRAYER]._qvar1 <= 4) // BUGFIX stepping on the circle again will break the quest state (fixed) quests[Q_BETRAYER]._qvar1 = 4; - AddMissile(plr[myplr].position.current.x, plr[myplr].position.current.y, 35, 46, plr[myplr]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, myplr, 0, 0); + AddMissile(plr[myplr].position.tile.x, plr[myplr].position.tile.y, 35, 46, plr[myplr]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, myplr, 0, 0); track_repeat_walk(false); sgbMouseDown = CLICK_NONE; ClrPlrPath(myplr); @@ -1999,8 +1998,8 @@ void Obj_Door(int i) object[i]._oSelFlag = 3; object[i]._oMissFlag = false; } else { - dx = object[i]._ox; - dy = object[i]._oy; + dx = object[i].position.x; + dy = object[i].position.y; dok = dMonster[dx][dy] == 0; dok = dok && dItem[dx][dy] == 0; dok = dok && dDead[dx][dy] == 0; @@ -2027,7 +2026,7 @@ void ActivateTrapLine(int ttype, int tid) object[oi]._oVar4 = 1; object[oi]._oAnimFlag = 1; object[oi]._oAnimDelay = 1; - object[oi]._olid = AddLight(object[oi]._ox, object[oi]._oy, 1); + object[oi]._olid = AddLight(object[oi].position.x, object[oi].position.y, 1); } } } @@ -2049,16 +2048,16 @@ void Obj_FlameTrap(int i) } } else if (object[i]._oVar4 == 0) { if (object[i]._oVar3 == 2) { - x = object[i]._ox - 2; - y = object[i]._oy; + x = object[i].position.x - 2; + y = object[i].position.y; for (j = 0; j < 5; j++) { if (dPlayer[x][y] != 0 || dMonster[x][y] != 0) object[i]._oVar4 = 1; x++; } } else { - x = object[i]._ox; - y = object[i]._oy - 2; + x = object[i].position.x; + y = object[i].position.y - 2; for (k = 0; k < 5; k++) { if (dPlayer[x][y] != 0 || dMonster[x][y] != 0) object[i]._oVar4 = 1; @@ -2073,8 +2072,8 @@ void Obj_FlameTrap(int i) int mindam = damage[leveltype - 1]; int maxdam = mindam * 2; - x = object[i]._ox; - y = object[i]._oy; + x = object[i].position.x; + y = object[i].position.y; if (dMonster[x][y] > 0) MonsterTrapHit(dMonster[x][y] - 1, mindam / 2, maxdam / 2, 0, MIS_FIREWALLC, false); if (dPlayer[x][y] > 0) { @@ -2119,12 +2118,12 @@ void Obj_Trap(int i) } object[i]._oVar4 = 1; - int sx = object[i]._ox; - int sy = object[i]._oy; - int dx = object[oti]._ox; - int dy = object[oti]._oy; - for (int y = dy - 1; y <= object[oti]._oy + 1; y++) { - for (int x = object[oti]._ox - 1; x <= object[oti]._ox + 1; x++) { + int sx = object[i].position.x; + int sy = object[i].position.y; + int dx = object[oti].position.x; + int dy = object[oti].position.y; + for (int y = dy - 1; y <= object[oti].position.y + 1; y++) { + for (int x = object[oti].position.x - 1; x <= object[oti].position.x + 1; x++) { if (dPlayer[x][y] != 0) { dx = x; dy = y; @@ -2134,7 +2133,7 @@ void Obj_Trap(int i) if (!deltaload) { direction dir = GetDirection(sx, sy, dx, dy); AddMissile(sx, sy, dx, dy, dir, object[i]._oVar3, TARGET_PLAYERS, -1, 0, 0); - PlaySfxLoc(IS_TRAP, object[oti]._ox, object[oti]._oy); + PlaySfxLoc(IS_TRAP, object[oti].position.x, object[oti].position.y); } object[oti]._oTrapFlag = false; } @@ -2151,7 +2150,7 @@ void Obj_BCrossDamage(int i) if (fire_resist > 0) damage[leveltype - 1] -= fire_resist * damage[leveltype - 1] / 100; - if (plr[myplr].position.current.x != object[i]._ox || plr[myplr].position.current.y != object[i]._oy - 1) + if (plr[myplr].position.tile.x != object[i].position.x || plr[myplr].position.tile.y != object[i].position.y - 1) return; ApplyPlrDamage(myplr, 0, 0, damage[leveltype - 1]); @@ -2460,7 +2459,7 @@ void RedoPlayerVision() for (p = 0; p < MAX_PLRS; p++) { if (plr[p].plractive && currlevel == plr[p].plrlevel) { - ChangeVisionXY(plr[p]._pvid, plr[p].position.current.x, plr[p].position.current.y); + ChangeVisionXY(plr[p]._pvid, plr[p].position.tile.x, plr[p].position.tile.y); } } } @@ -2471,22 +2470,22 @@ void OperateL1RDoor(int pnum, int oi, bool sendflag) if (object[oi]._oVar4 == 2) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, object[oi].position.y); return; } - xp = object[oi]._ox; - yp = object[oi]._oy; + xp = object[oi].position.x; + yp = object[oi].position.y; if (object[oi]._oVar4 == 0) { if (pnum == myplr && sendflag) NetSendCmdParam1(true, CMD_OPENDOOR, oi); if (currlevel < 21) { if (!deltaload) - PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOOROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 395); } else { if (!deltaload) - PlaySfxLoc(IS_CROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_CROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 209); } if (currlevel < 17) { @@ -2506,10 +2505,10 @@ void OperateL1RDoor(int pnum, int oi, bool sendflag) if (currlevel < 21) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, xp, object[oi].position.y); } else { if (!deltaload) - PlaySfxLoc(IS_CRCLOS, xp, object[oi]._oy); + PlaySfxLoc(IS_CRCLOS, xp, object[oi].position.y); } if (!deltaload && dDead[xp][yp] == 0 && dMonster[xp][yp] == 0 && dItem[xp][yp] == 0) { if (pnum == myplr && sendflag) @@ -2551,25 +2550,25 @@ void OperateL1LDoor(int pnum, int oi, bool sendflag) if (object[oi]._oVar4 == 2) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, object[oi].position.y); return; } - xp = object[oi]._ox; - yp = object[oi]._oy; + xp = object[oi].position.x; + yp = object[oi].position.y; if (object[oi]._oVar4 == 0) { if (pnum == myplr && sendflag) NetSendCmdParam1(true, CMD_OPENDOOR, oi); if (currlevel < 21) { if (!deltaload) - PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOOROPEN, object[oi].position.x, object[oi].position.y); if (object[oi]._oVar1 == 214) ObjSetMicro(xp, yp, 408); else ObjSetMicro(xp, yp, 393); } else { if (!deltaload) - PlaySfxLoc(IS_CROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_CROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 206); } if (currlevel < 17) { @@ -2589,10 +2588,10 @@ void OperateL1LDoor(int pnum, int oi, bool sendflag) if (currlevel < 21) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, xp, object[oi].position.y); } else { if (!deltaload) - PlaySfxLoc(IS_CRCLOS, xp, object[oi]._oy); + PlaySfxLoc(IS_CRCLOS, xp, object[oi].position.y); } if (dDead[xp][yp] == 0 && dMonster[xp][yp] == 0 && dItem[xp][yp] == 0) { if (pnum == myplr && sendflag) @@ -2635,16 +2634,16 @@ void OperateL2RDoor(int pnum, int oi, bool sendflag) if (object[oi]._oVar4 == 2) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, object[oi].position.y); return; } - xp = object[oi]._ox; - yp = object[oi]._oy; + xp = object[oi].position.x; + yp = object[oi].position.y; if (object[oi]._oVar4 == 0) { if (pnum == myplr && sendflag) NetSendCmdParam1(true, CMD_OPENDOOR, oi); if (!deltaload) - PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOOROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 17); dSpecial[xp][yp] = 6; object[oi]._oAnimFrame += 2; @@ -2656,7 +2655,7 @@ void OperateL2RDoor(int pnum, int oi, bool sendflag) } if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, yp); dok = dMonster[xp][yp] == 0; dok = dok && dItem[xp][yp] == 0; dok = dok && dDead[xp][yp] == 0; @@ -2682,16 +2681,16 @@ void OperateL2LDoor(int pnum, int oi, bool sendflag) if (object[oi]._oVar4 == 2) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, object[oi].position.y); return; } - xp = object[oi]._ox; - yp = object[oi]._oy; + xp = object[oi].position.x; + yp = object[oi].position.y; if (object[oi]._oVar4 == 0) { if (pnum == myplr && sendflag) NetSendCmdParam1(true, CMD_OPENDOOR, oi); if (!deltaload) - PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOOROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 13); dSpecial[xp][yp] = 5; object[oi]._oAnimFrame += 2; @@ -2703,7 +2702,7 @@ void OperateL2LDoor(int pnum, int oi, bool sendflag) } if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, yp); dok = dMonster[xp][yp] == 0; dok = dok && dItem[xp][yp] == 0; dok = dok && dDead[xp][yp] == 0; @@ -2729,17 +2728,17 @@ void OperateL3RDoor(int pnum, int oi, bool sendflag) if (object[oi]._oVar4 == 2) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, object[oi].position.y); return; } - xp = object[oi]._ox; - yp = object[oi]._oy; + xp = object[oi].position.x; + yp = object[oi].position.y; if (object[oi]._oVar4 == 0) { if (pnum == myplr && sendflag) NetSendCmdParam1(true, CMD_OPENDOOR, oi); if (!deltaload) - PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOOROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 541); object[oi]._oAnimFrame += 2; object[oi]._oPreFlag = true; @@ -2750,7 +2749,7 @@ void OperateL3RDoor(int pnum, int oi, bool sendflag) } if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, yp); dok = dMonster[xp][yp] == 0; dok = dok && dItem[xp][yp] == 0; dok = dok && dDead[xp][yp] == 0; @@ -2775,17 +2774,17 @@ void OperateL3LDoor(int pnum, int oi, bool sendflag) if (object[oi]._oVar4 == 2) { if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, object[oi].position.y); return; } - xp = object[oi]._ox; - yp = object[oi]._oy; + xp = object[oi].position.x; + yp = object[oi].position.y; if (object[oi]._oVar4 == 0) { if (pnum == myplr && sendflag) NetSendCmdParam1(true, CMD_OPENDOOR, oi); if (!deltaload) - PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy); + PlaySfxLoc(IS_DOOROPEN, object[oi].position.x, object[oi].position.y); ObjSetMicro(xp, yp, 538); object[oi]._oAnimFrame += 2; object[oi]._oPreFlag = true; @@ -2796,7 +2795,7 @@ void OperateL3LDoor(int pnum, int oi, bool sendflag) } if (!deltaload) - PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp); + PlaySfxLoc(IS_DOORCLOS, object[oi].position.x, yp); dok = dMonster[xp][yp] == 0; dok = dok && dItem[xp][yp] == 0; dok = dok && dDead[xp][yp] == 0; @@ -2819,8 +2818,8 @@ void MonstCheckDoors(int m) int i, oi; int dpx, dpy, mx, my; - mx = monster[m].position.current.x; - my = monster[m].position.current.y; + mx = monster[m].position.tile.x; + my = monster[m].position.tile.y; if (dObject[mx - 1][my - 1] != 0 || dObject[mx][my - 1] != 0 || dObject[mx + 1][my - 1] != 0 @@ -2832,24 +2831,24 @@ void MonstCheckDoors(int m) for (i = 0; i < nobjects; ++i) { oi = objectactive[i]; if ((object[oi]._otype == OBJ_L1LDOOR || object[oi]._otype == OBJ_L1RDOOR) && object[oi]._oVar4 == 0) { - dpx = abs(object[oi]._ox - mx); - dpy = abs(object[oi]._oy - my); + dpx = abs(object[oi].position.x - mx); + dpy = abs(object[oi].position.y - my); if (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L1LDOOR) OperateL1LDoor(myplr, oi, true); if (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L1RDOOR) OperateL1RDoor(myplr, oi, true); } if ((object[oi]._otype == OBJ_L2LDOOR || object[oi]._otype == OBJ_L2RDOOR) && object[oi]._oVar4 == 0) { - dpx = abs(object[oi]._ox - mx); - dpy = abs(object[oi]._oy - my); + dpx = abs(object[oi].position.x - mx); + dpy = abs(object[oi].position.y - my); if (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L2LDOOR) OperateL2LDoor(myplr, oi, true); if (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L2RDOOR) OperateL2RDoor(myplr, oi, true); } if ((object[oi]._otype == OBJ_L3LDOOR || object[oi]._otype == OBJ_L3RDOOR) && object[oi]._oVar4 == 0) { - dpx = abs(object[oi]._ox - mx); - dpy = abs(object[oi]._oy - my); + dpx = abs(object[oi].position.x - mx); + dpy = abs(object[oi].position.y - my); if (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L3RDOOR) OperateL3RDoor(myplr, oi, true); if (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L3LDOOR) @@ -2901,8 +2900,8 @@ void OperateL1Door(int pnum, int i, bool sendflag) { int dpx, dpy; - dpx = abs(object[i]._ox - plr[pnum].position.current.x); - dpy = abs(object[i]._oy - plr[pnum].position.current.y); + dpx = abs(object[i].position.x - plr[pnum].position.tile.x); + dpy = abs(object[i].position.y - plr[pnum].position.tile.y); if (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L1LDOOR) OperateL1LDoor(pnum, i, sendflag); if (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L1RDOOR) @@ -2916,7 +2915,7 @@ void OperateLever(int pnum, int i) if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_LEVER, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; object[i]._oAnimFrame++; mapflag = true; @@ -2972,7 +2971,7 @@ void OperateBook(int pnum, int i) } if (do_add_missile) { object[dObject[35][36] - 1]._oVar5++; - AddMissile(plr[pnum].position.current.x, plr[pnum].position.current.y, dx, dy, plr[pnum]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 0); + AddMissile(plr[pnum].position.tile.x, plr[pnum].position.tile.y, dx, dy, plr[pnum]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 0); missile_added = true; do_add_missile = false; } @@ -2991,13 +2990,13 @@ void OperateBook(int pnum, int i) plr[pnum]._pSplLvl[SPL_GUARDIAN]++; quests[Q_SCHAMB]._qactive = QUEST_DONE; if (!deltaload) - PlaySfxLoc(IS_QUESTDN, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_QUESTDN, object[i].position.x, object[i].position.y); InitDiabloMsg(EMSG_BONECHAMB); AddMissile( - plr[pnum].position.current.x, - plr[pnum].position.current.y, - object[i]._ox - 2, - object[i]._oy - 4, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, + object[i].position.x - 2, + object[i].position.y - 4, plr[pnum]._pdir, MIS_GUARDIAN, TARGET_MONSTERS, @@ -3109,25 +3108,25 @@ void OperateChest(int pnum, int i, bool sendmsg) if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_CHEST, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; object[i]._oAnimFrame += 2; if (!deltaload) { SetRndSeed(object[i]._oRndSeed); if (setlevel) { for (j = 0; j < object[i]._oVar1; j++) { - CreateRndItem(object[i]._ox, object[i]._oy, true, sendmsg, false); + CreateRndItem(object[i].position.x, object[i].position.y, true, sendmsg, false); } } else { for (j = 0; j < object[i]._oVar1; j++) { if (object[i]._oVar2 != 0) - CreateRndItem(object[i]._ox, object[i]._oy, false, sendmsg, false); + CreateRndItem(object[i].position.x, object[i].position.y, false, sendmsg, false); else - CreateRndUseful(object[i]._ox, object[i]._oy, sendmsg); + CreateRndUseful(object[i].position.x, object[i].position.y, sendmsg); } } if (object[i]._oTrapFlag && object[i]._otype >= OBJ_TCHEST1 && object[i]._otype <= OBJ_TCHEST3) { - direction mdir = GetDirection(object[i]._ox, object[i]._oy, plr[pnum].position.current.x, plr[pnum].position.current.y); + direction mdir = GetDirection(object[i].position.x, object[i].position.y, plr[pnum].position.tile.x, plr[pnum].position.tile.y); switch (object[i]._oVar4) { case 0: mtype = MIS_ARROW; @@ -3150,7 +3149,7 @@ void OperateChest(int pnum, int i, bool sendmsg) default: mtype = MIS_ARROW; } - AddMissile(object[i]._ox, object[i]._oy, plr[pnum].position.current.x, plr[pnum].position.current.y, mdir, mtype, TARGET_PLAYERS, -1, 0, 0); + AddMissile(object[i].position.x, object[i].position.y, plr[pnum].position.tile.x, plr[pnum].position.tile.y, mdir, mtype, TARGET_PLAYERS, -1, 0, 0); object[i]._oTrapFlag = false; } if (pnum == myplr) @@ -3175,11 +3174,11 @@ void OperateMushPatch(int pnum, int i) } else { if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_CHEST, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; object[i]._oAnimFrame++; if (!deltaload) { - GetSuperItemLoc(object[i]._ox, object[i]._oy, &x, &y); + GetSuperItemLoc(object[i].position.x, object[i].position.y, &x, &y); SpawnQuestItem(IDI_MUSHROOM, x, y, 0, false); quests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED; } @@ -3202,11 +3201,11 @@ void OperateInnSignChest(int pnum, int i) } else { if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_CHEST, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; object[i]._oAnimFrame += 2; if (!deltaload) { - GetSuperItemLoc(object[i]._ox, object[i]._oy, &x, &y); + GetSuperItemLoc(object[i].position.x, object[i].position.y, &x, &y); SpawnQuestItem(IDI_BANNER, x, y, 0, false); } } @@ -3219,17 +3218,17 @@ void OperateSlainHero(int pnum, int i) object[i]._oSelFlag = 0; if (!deltaload) { if (plr[pnum]._pClass == HeroClass::Warrior) { - CreateMagicArmor(object[i]._ox, object[i]._oy, ITYPE_HARMOR, ICURS_BREAST_PLATE, false, true); + CreateMagicArmor(object[i].position.x, object[i].position.y, ITYPE_HARMOR, ICURS_BREAST_PLATE, false, true); } else if (plr[pnum]._pClass == HeroClass::Rogue) { - CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_BOW, ICURS_LONG_WAR_BOW, false, true); + CreateMagicWeapon(object[i].position.x, object[i].position.y, ITYPE_BOW, ICURS_LONG_WAR_BOW, false, true); } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - CreateSpellBook(object[i]._ox, object[i]._oy, SPL_LIGHTNING, false, true); + CreateSpellBook(object[i].position.x, object[i].position.y, SPL_LIGHTNING, false, true); } else if (plr[pnum]._pClass == HeroClass::Monk) { - CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_STAFF, ICURS_WAR_STAFF, false, true); + CreateMagicWeapon(object[i].position.x, object[i].position.y, ITYPE_STAFF, ICURS_WAR_STAFF, false, true); } else if (plr[pnum]._pClass == HeroClass::Bard) { - CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_SWORD, ICURS_BASTARD_SWORD, false, true); + CreateMagicWeapon(object[i].position.x, object[i].position.y, ITYPE_SWORD, ICURS_BASTARD_SWORD, false, true); } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_AXE, ICURS_BATTLE_AXE, false, true); + CreateMagicWeapon(object[i].position.x, object[i].position.y, ITYPE_AXE, ICURS_BATTLE_AXE, false, true); } plr[myplr].PlaySpeach(9); if (pnum == myplr) @@ -3246,7 +3245,7 @@ void OperateTrapLvr(int i) j = 0; if (!deltaload) - PlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_LEVER, object[i].position.x, object[i].position.y); if (frame == 1) { object[i]._oAnimFrame = 2; @@ -3275,7 +3274,7 @@ void OperateSarc(int pnum, int i, bool sendmsg) { if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_SARC, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_SARC, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; if (deltaload) { object[i]._oAnimFrame = object[i]._oAnimLen; @@ -3284,9 +3283,9 @@ void OperateSarc(int pnum, int i, bool sendmsg) object[i]._oAnimDelay = 3; SetRndSeed(object[i]._oRndSeed); if (object[i]._oVar1 <= 2) - CreateRndItem(object[i]._ox, object[i]._oy, false, sendmsg, false); + CreateRndItem(object[i].position.x, object[i].position.y, false, sendmsg, false); if (object[i]._oVar1 >= 8) - SpawnSkeleton(object[i]._oVar2, object[i]._ox, object[i]._oy); + SpawnSkeleton(object[i]._oVar2, object[i].position.x, object[i].position.y); if (pnum == myplr) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); } @@ -3297,8 +3296,8 @@ void OperateL2Door(int pnum, int i, bool sendflag) { int dpx, dpy; - dpx = abs(object[i]._ox - plr[pnum].position.current.x); - dpy = abs(object[i]._oy - plr[pnum].position.current.y); + dpx = abs(object[i].position.x - plr[pnum].position.tile.x); + dpy = abs(object[i].position.y - plr[pnum].position.tile.y); if (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L2LDOOR) OperateL2LDoor(pnum, i, sendflag); if (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L2RDOOR) @@ -3309,8 +3308,8 @@ void OperateL3Door(int pnum, int i, bool sendflag) { int dpx, dpy; - dpx = abs(object[i]._ox - plr[pnum].position.current.x); - dpy = abs(object[i]._oy - plr[pnum].position.current.y); + dpx = abs(object[i].position.x - plr[pnum].position.tile.x); + dpy = abs(object[i].position.y - plr[pnum].position.tile.y); if (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L3RDOOR) OperateL3RDoor(pnum, i, sendflag); if (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L3LDOOR) @@ -3332,19 +3331,19 @@ void OperatePedistal(int pnum, int i) object[i]._oVar6++; if (object[i]._oVar6 == 1) { if (!deltaload) - PlaySfxLoc(LS_PUDDLE, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_PUDDLE, object[i].position.x, object[i].position.y); ObjChangeMap(setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7); SpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 19, 2 * setpc_y + 26, 0, true); } if (object[i]._oVar6 == 2) { if (!deltaload) - PlaySfxLoc(LS_PUDDLE, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_PUDDLE, object[i].position.x, object[i].position.y); ObjChangeMap(setpc_x + 6, setpc_y + 3, setpc_x + setpc_w, setpc_y + 7); SpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 31, 2 * setpc_y + 26, 0, true); } if (object[i]._oVar6 == 3) { if (!deltaload) - PlaySfxLoc(LS_BLODSTAR, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_BLODSTAR, object[i].position.x, object[i].position.y); ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4); mem = LoadFileInMem("Levels\\L2Data\\Blood2.DUN", nullptr); LoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y); @@ -3577,10 +3576,10 @@ bool OperateShrineMagical(int pnum) return false; AddMissile( - plr[pnum].position.current.x, - plr[pnum].position.current.y, - plr[pnum].position.current.x, - plr[pnum].position.current.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, plr[pnum]._pdir, MIS_MANASHIELD, -1, @@ -3747,10 +3746,10 @@ bool OperateShrineCryptic(int pnum) return false; AddMissile( - plr[pnum].position.current.x, - plr[pnum].position.current.y, - plr[pnum].position.current.x, - plr[pnum].position.current.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, plr[pnum]._pdir, MIS_NOVA, -1, @@ -3876,7 +3875,7 @@ bool OperateShrineHoly(int pnum) break; } while (nSolidTable[lv] || dObject[xx][yy] != 0 || dMonster[xx][yy] != 0); - AddMissile(plr[pnum].position.current.x, plr[pnum].position.current.y, xx, yy, plr[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype); + AddMissile(plr[pnum].position.tile.x, plr[pnum].position.tile.y, xx, yy, plr[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype); if (pnum != myplr) return false; @@ -4156,8 +4155,8 @@ bool OperateShrineOily(int pnum, int x, int y) AddMissile( x, y, - plr[myplr].position.current.x, - plr[myplr].position.current.y, + plr[myplr].position.tile.x, + plr[myplr].position.tile.y, plr[myplr]._pdir, MIS_FIREWALL, TARGET_PLAYERS, @@ -4228,8 +4227,8 @@ bool OperateShrineSparkling(int pnum, int x, int y) AddMissile( x, y, - plr[myplr].position.current.x, - plr[myplr].position.current.y, + plr[myplr].position.tile.x, + plr[myplr].position.tile.y, plr[myplr]._pdir, MIS_FLASH, TARGET_PLAYERS, @@ -4254,8 +4253,8 @@ bool OperateShrineTown(int pnum, int x, int y) AddMissile( x, y, - plr[myplr].position.current.x, - plr[myplr].position.current.y, + plr[myplr].position.tile.x, + plr[myplr].position.tile.y, plr[myplr]._pdir, MIS_TOWN, TARGET_PLAYERS, @@ -4355,7 +4354,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) object[i]._oSelFlag = 0; if (!deltaload) { - PlaySfxLoc(sType, object[i]._ox, object[i]._oy); + PlaySfxLoc(sType, object[i].position.x, object[i].position.y); object[i]._oAnimFlag = 1; object[i]._oAnimDelay = 1; } else { @@ -4418,7 +4417,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) return; break; case SHRINE_DIVINE: - if (!OperateShrineDivine(pnum, object[i]._ox, object[i]._oy)) + if (!OperateShrineDivine(pnum, object[i].position.x, object[i].position.y)) return; break; case SHRINE_HOLY: @@ -4466,7 +4465,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) return; break; case SHRINE_OILY: - if (!OperateShrineOily(pnum, object[i]._ox, object[i]._oy)) + if (!OperateShrineOily(pnum, object[i].position.x, object[i].position.y)) return; break; case SHRINE_GLOWING: @@ -4478,11 +4477,11 @@ void OperateShrine(int pnum, int i, _sfx_id sType) return; break; case SHRINE_SPARKLING: - if (!OperateShrineSparkling(pnum, object[i]._ox, object[i]._oy)) + if (!OperateShrineSparkling(pnum, object[i].position.x, object[i].position.y)) return; break; case SHRINE_TOWN: - if (!OperateShrineTown(pnum, object[i]._ox, object[i]._oy)) + if (!OperateShrineTown(pnum, object[i].position.x, object[i].position.y)) return; break; case SHRINE_SHIMMERING: @@ -4510,15 +4509,15 @@ void OperateSkelBook(int pnum, int i, bool sendmsg) { if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_ISCROL, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; object[i]._oAnimFrame += 2; if (!deltaload) { SetRndSeed(object[i]._oRndSeed); if (GenerateRnd(5) != 0) - CreateTypeItem(object[i]._ox, object[i]._oy, false, ITYPE_MISC, IMISC_SCROLL, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, false, ITYPE_MISC, IMISC_SCROLL, sendmsg, false); else - CreateTypeItem(object[i]._ox, object[i]._oy, false, ITYPE_MISC, IMISC_BOOK, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, false, ITYPE_MISC, IMISC_BOOK, sendmsg, false); if (pnum == myplr) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); } @@ -4529,12 +4528,12 @@ void OperateBookCase(int pnum, int i, bool sendmsg) { if (object[i]._oSelFlag != 0) { if (!deltaload) - PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_ISCROL, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; object[i]._oAnimFrame -= 2; if (!deltaload) { SetRndSeed(object[i]._oRndSeed); - CreateTypeItem(object[i]._ox, object[i]._oy, false, ITYPE_MISC, IMISC_BOOK, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, false, ITYPE_MISC, IMISC_BOOK, sendmsg, false); if (QuestStatus(Q_ZHAR) && monster[MAX_PLRS]._mmode == MM_STAND // prevents playing the "angry" message for the second time if zhar got aggroed by losing vision and talking again && monster[MAX_PLRS]._uniqtype - 1 == UMT_ZHAR @@ -4557,7 +4556,7 @@ void OperateDecap(int pnum, int i, bool sendmsg) object[i]._oSelFlag = 0; if (!deltaload) { SetRndSeed(object[i]._oRndSeed); - CreateRndItem(object[i]._ox, object[i]._oy, false, sendmsg, false); + CreateRndItem(object[i].position.x, object[i].position.y, false, sendmsg, false); if (pnum == myplr) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); } @@ -4575,15 +4574,15 @@ void OperateArmorStand(int pnum, int i, bool sendmsg) SetRndSeed(object[i]._oRndSeed); uniqueRnd = (GenerateRnd(2) != 0); if (currlevel <= 5) { - CreateTypeItem(object[i]._ox, object[i]._oy, true, ITYPE_LARMOR, IMISC_NONE, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, true, ITYPE_LARMOR, IMISC_NONE, sendmsg, false); } else if (currlevel >= 6 && currlevel <= 9) { - CreateTypeItem(object[i]._ox, object[i]._oy, uniqueRnd, ITYPE_MARMOR, IMISC_NONE, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, uniqueRnd, ITYPE_MARMOR, IMISC_NONE, sendmsg, false); } else if (currlevel >= 10 && currlevel <= 12) { - CreateTypeItem(object[i]._ox, object[i]._oy, false, ITYPE_HARMOR, IMISC_NONE, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, false, ITYPE_HARMOR, IMISC_NONE, sendmsg, false); } else if (currlevel >= 13 && currlevel <= 16) { - CreateTypeItem(object[i]._ox, object[i]._oy, true, ITYPE_HARMOR, IMISC_NONE, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, true, ITYPE_HARMOR, IMISC_NONE, sendmsg, false); } else if (currlevel >= 17) { - CreateTypeItem(object[i]._ox, object[i]._oy, true, ITYPE_HARMOR, IMISC_NONE, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, true, ITYPE_HARMOR, IMISC_NONE, sendmsg, false); } if (pnum == myplr) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); @@ -4657,7 +4656,7 @@ bool OperateFountains(int pnum, int i) return false; if (plr[pnum]._pHitPoints < plr[pnum]._pMaxHP) { - PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_FOUNTAIN, object[i].position.x, object[i].position.y); plr[pnum]._pHitPoints += 64; plr[pnum]._pHPBase += 64; if (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) { @@ -4666,7 +4665,7 @@ bool OperateFountains(int pnum, int i) } applied = true; } else - PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_FOUNTAIN, object[i].position.x, object[i].position.y); break; case OBJ_PURIFYINGFTN: if (deltaload) @@ -4675,7 +4674,7 @@ bool OperateFountains(int pnum, int i) return false; if (plr[pnum]._pMana < plr[pnum]._pMaxMana) { - PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_FOUNTAIN, object[i].position.x, object[i].position.y); plr[pnum]._pMana += 64; plr[pnum]._pManaBase += 64; @@ -4686,21 +4685,21 @@ bool OperateFountains(int pnum, int i) applied = true; } else - PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_FOUNTAIN, object[i].position.x, object[i].position.y); break; case OBJ_MURKYFTN: if (object[i]._oSelFlag == 0) break; if (!deltaload) - PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_FOUNTAIN, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; if (deltaload) return false; AddMissile( - plr[pnum].position.current.x, - plr[pnum].position.current.y, - plr[pnum].position.current.x, - plr[pnum].position.current.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, plr[pnum]._pdir, MIS_INFRA, -1, @@ -4719,7 +4718,7 @@ bool OperateFountains(int pnum, int i) done = false; cnt = 0; if (!deltaload) - PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy); + PlaySfxLoc(LS_FOUNTAIN, object[i].position.x, object[i].position.y); object[i]._oSelFlag = 0; if (deltaload) return false; @@ -4791,7 +4790,7 @@ void OperateWeaponRack(int pnum, int i, bool sendmsg) if (deltaload) return; - CreateTypeItem(object[i]._ox, object[i]._oy, leveltype > 1, weaponType, IMISC_NONE, sendmsg, false); + CreateTypeItem(object[i].position.x, object[i].position.y, leveltype > 1, weaponType, IMISC_NONE, sendmsg, false); if (pnum == myplr) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); @@ -4801,7 +4800,7 @@ void OperateStoryBook(int pnum, int i) { if (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) { object[i]._oAnimFrame = object[i]._oVar4; - PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_ISCROL, object[i].position.x, object[i].position.y); if (object[i]._oVar8 != 0 && currlevel == 24) { if (IsUberLeverActivated != 1 && quests[Q_NAKRUL]._qactive != QUEST_DONE && objects_lv_24_454B04(object[i]._oVar8)) { NetSendCmd(false, CMD_NAKRUL); @@ -4828,7 +4827,7 @@ void OperateLazStand(int pnum, int i) if (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) { object[i]._oAnimFrame++; object[i]._oSelFlag = 0; - GetSuperItemLoc(object[i]._ox, object[i]._oy, &xx, &yy); + GetSuperItemLoc(object[i].position.x, object[i].position.y, &xx, &yy); SpawnQuestItem(IDI_LAZSTAFF, xx, yy, 0, false); } } @@ -5152,7 +5151,7 @@ void BreakCrux(int i) if (!triggered) return; if (!deltaload) - PlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_LEVER, object[i].position.x, object[i].position.y); ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4); } @@ -5174,7 +5173,7 @@ void BreakBarrel(int pnum, int i, int dam, bool forcebreak, bool sendmsg) if (deltaload) return; - PlaySfxLoc(IS_IBOW, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_IBOW, object[i].position.x, object[i].position.y); return; } @@ -5196,13 +5195,13 @@ void BreakBarrel(int pnum, int i, int dam, bool forcebreak, bool sendmsg) if (object[i]._otype == OBJ_BARRELEX) { if (currlevel >= 21 && currlevel <= 24) - PlaySfxLoc(IS_POPPOP3, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_POPPOP3, object[i].position.x, object[i].position.y); else if (currlevel >= 17 && currlevel <= 20) - PlaySfxLoc(IS_POPPOP8, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_POPPOP8, object[i].position.x, object[i].position.y); else - PlaySfxLoc(IS_BARLFIRE, object[i]._ox, object[i]._oy); - for (yp = object[i]._oy - 1; yp <= object[i]._oy + 1; yp++) { - for (xp = object[i]._ox - 1; xp <= object[i]._ox + 1; xp++) { + PlaySfxLoc(IS_BARLFIRE, object[i].position.x, object[i].position.y); + for (yp = object[i].position.y - 1; yp <= object[i].position.y + 1; yp++) { + for (xp = object[i].position.x - 1; xp <= object[i].position.x + 1; xp++) { if (dMonster[xp][yp] > 0) MonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, MIS_FIREBOLT, false); bool unused; @@ -5217,20 +5216,20 @@ void BreakBarrel(int pnum, int i, int dam, bool forcebreak, bool sendmsg) } } else { if (currlevel >= 21 && currlevel <= 24) - PlaySfxLoc(IS_POPPOP2, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_POPPOP2, object[i].position.x, object[i].position.y); else if (currlevel >= 17 && currlevel <= 20) - PlaySfxLoc(IS_POPPOP5, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_POPPOP5, object[i].position.x, object[i].position.y); else - PlaySfxLoc(IS_BARREL, object[i]._ox, object[i]._oy); + PlaySfxLoc(IS_BARREL, object[i].position.x, object[i].position.y); SetRndSeed(object[i]._oRndSeed); if (object[i]._oVar2 <= 1) { if (object[i]._oVar3 == 0) - CreateRndUseful(object[i]._ox, object[i]._oy, sendmsg); + CreateRndUseful(object[i].position.x, object[i].position.y, sendmsg); else - CreateRndItem(object[i]._ox, object[i]._oy, false, sendmsg, false); + CreateRndItem(object[i].position.x, object[i].position.y, false, sendmsg, false); } if (object[i]._oVar2 >= 8) - SpawnSkeleton(object[i]._oVar4, object[i]._ox, object[i]._oy); + SpawnSkeleton(object[i]._oVar4, object[i].position.x, object[i].position.y); } if (pnum == myplr) NetSendCmdParam2(false, CMD_BREAKOBJ, pnum, i); @@ -5280,8 +5279,8 @@ void SyncL1Doors(int i) object[i]._oMissFlag = true; - x = object[i]._ox; - y = object[i]._oy; + x = object[i].position.x; + y = object[i].position.y; object[i]._oSelFlag = 2; if (currlevel < 17) { if (object[i]._otype == OBJ_L1LDOOR) { @@ -5380,8 +5379,8 @@ void SyncL2Doors(int i) object[i]._oMissFlag = false; else object[i]._oMissFlag = true; - x = object[i]._ox; - y = object[i]._oy; + x = object[i].position.x; + y = object[i].position.y; object[i]._oSelFlag = 2; if (object[i]._otype == OBJ_L2LDOOR && object[i]._oVar4 == 0) { ObjSetMicro(x, y, 538); @@ -5403,8 +5402,8 @@ void SyncL3Doors(int i) int x, y; object[i]._oMissFlag = true; - x = object[i]._ox; - y = object[i]._oy; + x = object[i].position.x; + y = object[i].position.y; object[i]._oSelFlag = 2; if (object[i]._otype == OBJ_L3LDOOR && object[i]._oVar4 == 0) { ObjSetMicro(x, y, 531); diff --git a/Source/objects.h b/Source/objects.h index fd1699446..7861f019d 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -17,8 +17,7 @@ namespace devilution { struct ObjectStruct { _object_id _otype; - int _ox; - int _oy; + Point position; bool _oLight; uint32_t _oAnimFlag; unsigned char *_oAnimData; diff --git a/Source/pack.cpp b/Source/pack.cpp index 44e83f3a2..227df6074 100644 --- a/Source/pack.cpp +++ b/Source/pack.cpp @@ -60,11 +60,11 @@ void PackPlayer(PkPlayerStruct *pPack, int pnum, bool manashield) pPack->destParam1 = pPlayer->destParam1; pPack->destParam2 = pPlayer->destParam2; pPack->plrlevel = pPlayer->plrlevel; - pPack->px = pPlayer->position.current.x; - pPack->py = pPlayer->position.current.y; + pPack->px = pPlayer->position.tile.x; + pPack->py = pPlayer->position.tile.y; if (gbVanilla) { - pPack->targx = pPlayer->position.current.x; - pPack->targy = pPlayer->position.current.y; + pPack->targx = pPlayer->position.tile.x; + pPack->targy = pPlayer->position.tile.y; } strcpy(pPack->pName, pPlayer->_pName); pPack->pClass = static_cast(pPlayer->_pClass); @@ -213,7 +213,7 @@ void UnPackPlayer(PkPlayerStruct *pPack, int pnum, bool netSync) PkItemStruct *pki; pPlayer = &plr[pnum]; - pPlayer->position.current = { pPack->px, pPack->py }; + pPlayer->position.tile = { pPack->px, pPack->py }; pPlayer->position.future = { pPack->px, pPack->py }; pPlayer->plrlevel = pPack->plrlevel; ClrPlrPath(pnum); diff --git a/Source/path.cpp b/Source/path.cpp index 0c4efd0cc..290ba6a59 100644 --- a/Source/path.cpp +++ b/Source/path.cpp @@ -64,20 +64,20 @@ int FindPath(bool (*PosOk)(int, int, int), int PosOkArg, int sx, int sy, int dx, path_start = path_new_step(); path_start->g = 0; path_start->h = path_get_h_cost(sx, sy, dx, dy); - path_start->x = sx; + path_start->position.x = sx; path_start->f = path_start->h + path_start->g; - path_start->y = sy; + path_start->position.y = sy; path_2_nodes->NextNode = path_start; // A* search until we find (dx,dy) or fail while ((next_node = GetNextPath())) { // reached the end, success! - if (next_node->x == dx && next_node->y == dy) { + if (next_node->position.x == dx && next_node->position.y == dy) { current = next_node; path_length = 0; while (current->Parent != nullptr) { if (path_length >= MAX_PATH_LENGTH) break; - pnode_vals[path_length++] = path_directions[3 * (current->y - current->Parent->y) - current->Parent->x + 4 + current->x]; + pnode_vals[path_length++] = path_directions[3 * (current->position.y - current->Parent->position.y) - current->Parent->position.x + 4 + current->position.x]; current = current->Parent; } if (path_length != MAX_PATH_LENGTH) { @@ -119,7 +119,7 @@ int path_get_h_cost(int sx, int sy, int dx, int dy) */ int path_check_equal(PATHNODE *pPath, int dx, int dy) { - if (pPath->x == dx || pPath->y == dy) + if (pPath->position.x == dx || pPath->position.y == dy) return 2; return 3; @@ -156,7 +156,7 @@ PATHNODE *GetNextPath() bool path_solid_pieces(PATHNODE *pPath, int dx, int dy) { bool rv = true; - switch (path_directions[3 * (dy - pPath->y) + 3 - pPath->x + 1 + dx]) { + switch (path_directions[3 * (dy - pPath->position.y) + 3 - pPath->position.x + 1 + dx]) { case 5: rv = !nSolidTable[dPiece[dx][dy + 1]] && !nSolidTable[dPiece[dx + 1][dy]]; break; @@ -185,8 +185,8 @@ bool path_get_path(bool (*PosOk)(int, int, int), int PosOkArg, PATHNODE *pPath, bool ok; for (i = 0; i < 8; i++) { - dx = pPath->x + pathxdir[i]; - dy = pPath->y + pathydir[i]; + dx = pPath->position.x + pathxdir[i]; + dy = pPath->position.y + pathydir[i]; ok = PosOk(PosOkArg, dx, dy); if ((ok && path_solid_pieces(pPath, dx, dy)) || (!ok && dx == x && dy == y)) { if (!path_parent_path(pPath, dx, dy, x, y)) @@ -253,8 +253,7 @@ bool path_parent_path(PATHNODE *pPath, int dx, int dy, int sx, int sy) dxdy->g = next_g; dxdy->h = path_get_h_cost(dx, dy, sx, sy); dxdy->f = next_g + dxdy->h; - dxdy->x = dx; - dxdy->y = dy; + dxdy->position = {dx,dy}; // add it to the frontier path_next_node(dxdy); @@ -275,7 +274,7 @@ PATHNODE *path_get_node1(int dx, int dy) { PATHNODE *result = path_2_nodes->NextNode; while (result != nullptr) { - if (result->x == dx && result->y == dy) + if (result->position.x == dx && result->position.y == dy) return result; result = result->NextNode; } @@ -289,7 +288,7 @@ PATHNODE *path_get_node2(int dx, int dy) { PATHNODE *result = pnode_ptr->NextNode; while (result != nullptr) { - if (result->x == dx && result->y == dy) + if (result->position.x == dx && result->position.y == dy) return result; result = result->NextNode; } @@ -337,10 +336,10 @@ void path_set_coords(PATHNODE *pPath) if (PathAct == nullptr) break; - if (PathOld->g + path_check_equal(PathOld, PathAct->x, PathAct->y) < PathAct->g) { - if (path_solid_pieces(PathOld, PathAct->x, PathAct->y)) { + if (PathOld->g + path_check_equal(PathOld, PathAct->position.x, PathAct->position.y) < PathAct->g) { + if (path_solid_pieces(PathOld, PathAct->position.x, PathAct->position.y)) { PathAct->Parent = PathOld; - PathAct->g = PathOld->g + path_check_equal(PathOld, PathAct->x, PathAct->y); + PathAct->g = PathOld->g + path_check_equal(PathOld, PathAct->position.x, PathAct->position.y); PathAct->f = PathAct->g + PathAct->h; path_push_active_step(PathAct); } diff --git a/Source/path.h b/Source/path.h index 787006681..1479318af 100644 --- a/Source/path.h +++ b/Source/path.h @@ -7,6 +7,8 @@ #include +#include "engine.h" + namespace devilution { #define MAX_PATH_LENGTH 25 @@ -15,8 +17,7 @@ struct PATHNODE { uint8_t f; uint8_t h; uint8_t g; - int x; - int y; + Point position; struct PATHNODE *Parent; struct PATHNODE *Child[8]; struct PATHNODE *NextNode; diff --git a/Source/player.cpp b/Source/player.cpp index 1d282a519..211bd6cf1 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -274,7 +274,7 @@ void PlayerStruct::PlaySpeach(int speachId) const { _sfx_id soundEffect = herosounds[static_cast(_pClass)][speachId - 1]; - PlaySfxLoc(soundEffect, position.current.x, position.current.y); + PlaySfxLoc(soundEffect, position.tile.x, position.tile.y); } void PlayerStruct::PlaySpecificSpeach(int speachId) const @@ -284,7 +284,7 @@ void PlayerStruct::PlaySpecificSpeach(int speachId) const if (effect_is_playing(soundEffect)) return; - PlaySfxLoc(soundEffect, position.current.x, position.current.y, false); + PlaySfxLoc(soundEffect, position.tile.x, position.tile.y, false); } void PlayerStruct::PlaySpeach(int speachId, int delay) const @@ -1156,26 +1156,26 @@ void InitPlayer(int pnum, bool FirstTime) if (pnum == myplr) { if (!FirstTime || currlevel != 0) { - plr[pnum].position.current = { ViewX, ViewY }; + plr[pnum].position.tile = { ViewX, ViewY }; } } else { - for (i = 0; i < 8 && !PosOkPlayer(pnum, plrxoff2[i] + plr[pnum].position.current.x, plryoff2[i] + plr[pnum].position.current.y); i++) + for (i = 0; i < 8 && !PosOkPlayer(pnum, plrxoff2[i] + plr[pnum].position.tile.x, plryoff2[i] + plr[pnum].position.tile.y); i++) ; - plr[pnum].position.current.x += plrxoff2[i]; - plr[pnum].position.current.y += plryoff2[i]; + plr[pnum].position.tile.x += plrxoff2[i]; + plr[pnum].position.tile.y += plryoff2[i]; } - plr[pnum].position.future = plr[pnum].position.current; + plr[pnum].position.future = plr[pnum].position.tile; plr[pnum].walkpath[0] = WALK_NONE; plr[pnum].destAction = ACTION_NONE; if (pnum == myplr) { - plr[pnum]._plid = AddLight(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum]._pLightRad); - ChangeLightXY(plr[myplr]._plid, plr[myplr].position.current.x, plr[myplr].position.current.y); // fix for a bug where old light is still visible at the entrance after reentering level + plr[pnum]._plid = AddLight(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum]._pLightRad); + ChangeLightXY(plr[myplr]._plid, plr[myplr].position.tile.x, plr[myplr].position.tile.y); // fix for a bug where old light is still visible at the entrance after reentering level } else { plr[pnum]._plid = NO_LIGHT; } - plr[pnum]._pvid = AddVision(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum]._pLightRad, pnum == myplr); + plr[pnum]._pvid = AddVision(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum]._pLightRad, pnum == myplr); } if (plr[pnum]._pClass == HeroClass::Warrior) { @@ -1221,8 +1221,8 @@ void InitMultiView() app_fatal("InitPlayer: illegal player %d", myplr); } - ViewX = plr[myplr].position.current.x; - ViewY = plr[myplr].position.current.y; + ViewX = plr[myplr].position.tile.x; + ViewY = plr[myplr].position.tile.y; } bool SolidLoc(int x, int y) @@ -1243,8 +1243,8 @@ bool PlrDirOK(int pnum, int dir) app_fatal("PlrDirOK: illegal player %d", pnum); } - px = plr[pnum].position.current.x + offset_x[dir]; - py = plr[pnum].position.current.y + offset_y[dir]; + px = plr[pnum].position.tile.x + offset_x[dir]; + py = plr[pnum].position.tile.y + offset_y[dir]; if (px < 0 || !dPiece[px][py] || !PosOkPlayer(pnum, px, py)) { return false; @@ -1296,7 +1296,7 @@ void SetPlayerOld(int pnum) app_fatal("SetPlayerOld: illegal player %d", pnum); } - plr[pnum].position.old = plr[pnum].position.current; + plr[pnum].position.old = plr[pnum].position.tile; } void FixPlayerLocation(int pnum, direction bDir) @@ -1305,17 +1305,17 @@ void FixPlayerLocation(int pnum, direction bDir) app_fatal("FixPlayerLocation: illegal player %d", pnum); } - plr[pnum].position.future = plr[pnum].position.current; + plr[pnum].position.future = plr[pnum].position.tile; plr[pnum].position.offset = { 0, 0 }; plr[pnum]._pdir = bDir; if (pnum == myplr) { ScrollInfo.offset = { 0, 0 }; ScrollInfo._sdir = SDIR_NONE; - ViewX = plr[pnum].position.current.x; - ViewY = plr[pnum].position.current.y; + ViewX = plr[pnum].position.tile.x; + ViewY = plr[pnum].position.tile.y; } - ChangeLightXY(plr[pnum]._plid, plr[pnum].position.current.x, plr[pnum].position.current.y); - ChangeVisionXY(plr[pnum]._pvid, plr[pnum].position.current.x, plr[pnum].position.current.y); + ChangeLightXY(plr[pnum]._plid, plr[pnum].position.tile.x, plr[pnum].position.tile.y); + ChangeVisionXY(plr[pnum]._pvid, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } void StartStand(int pnum, direction dir) @@ -1333,7 +1333,7 @@ void StartStand(int pnum, direction dir) plr[pnum]._pmode = PM_STAND; FixPlayerLocation(pnum, dir); FixPlrWalkTags(pnum); - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = pnum + 1; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = pnum + 1; SetPlayerOld(pnum); } else { SyncPlrKill(pnum, -1); @@ -1347,25 +1347,19 @@ void StartWalkStand(int pnum) } plr[pnum]._pmode = PM_STAND; - plr[pnum].position.future = plr[pnum].position.current; + plr[pnum].position.future = plr[pnum].position.tile; plr[pnum].position.offset = { 0, 0 }; if (pnum == myplr) { ScrollInfo.offset = { 0, 0 }; ScrollInfo._sdir = SDIR_NONE; - ViewX = plr[pnum].position.current.x; - ViewY = plr[pnum].position.current.y; + ViewX = plr[pnum].position.tile.x; + ViewY = plr[pnum].position.tile.y; } } void PM_ChangeLightOff(int pnum) { - int x, y; - int xmul, ymul; - int lx, ly; - int offx, offy; - const LightListStruct *l; - if ((DWORD)pnum >= MAX_PLRS) { app_fatal("PM_ChangeLightOff: illegal player %d", pnum); } @@ -1373,28 +1367,16 @@ void PM_ChangeLightOff(int pnum) if (plr[pnum]._plid == NO_LIGHT) return; - l = &LightList[plr[pnum]._plid]; - x = 2 * plr[pnum].position.offset.y + plr[pnum].position.offset.x; - y = 2 * plr[pnum].position.offset.y - plr[pnum].position.offset.x; - if (x < 0) { - xmul = -1; - x = -x; - } else { - xmul = 1; - } - if (y < 0) { - ymul = -1; - y = -y; - } else { - ymul = 1; - } + const LightListStruct *l = &LightList[plr[pnum]._plid]; + int x = 2 * plr[pnum].position.offset.y + plr[pnum].position.offset.x; + int y = 2 * plr[pnum].position.offset.y - plr[pnum].position.offset.x; - x = (x / 8) * xmul; - y = (y / 8) * ymul; - lx = x + (l->_lx * 8); - ly = y + (l->_ly * 8); - offx = l->_xoff + (l->_lx * 8); - offy = l->_yoff + (l->_ly * 8); + x = (x / 8) * (x < 0 ? 1 : -1); + y = (y / 8) * (y < 0 ? 1 : -1); + int lx = x + (l->position.tile.x * 8); + int ly = y + (l->position.tile.y * 8); + int offx = l->position.offset.x + (l->position.tile.x * 8); + int offy = l->position.offset.y + (l->position.tile.y * 8); if (abs(lx - offx) < 3 && abs(ly - offy) < 3) return; @@ -1456,14 +1438,14 @@ void StartWalk(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int y } //The player's tile position after finishing this movement action - int px = xadd + plr[pnum].position.current.x; - int py = yadd + plr[pnum].position.current.y; + int px = xadd + plr[pnum].position.tile.x; + int py = yadd + plr[pnum].position.tile.y; plr[pnum].position.future = { px, py }; //If this is the local player then update the camera offset position if (pnum == myplr) { - ScrollInfo.tile.x = plr[pnum].position.current.x - ViewX; - ScrollInfo.tile.y = plr[pnum].position.current.y - ViewY; + ScrollInfo.tile.x = plr[pnum].position.tile.x - ViewX; + ScrollInfo.tile.y = plr[pnum].position.tile.y - ViewY; } switch (variant) { @@ -1478,13 +1460,13 @@ void StartWalk(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int y plr[pnum].position.offset2 = { 0, 0 }; break; case PM_WALK2: - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = -(pnum + 1); - plr[pnum].position.temp = plr[pnum].position.current; - plr[pnum].position.current = { px, py }; // Move player to the next tile to maintain correct render order - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = pnum + 1; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = -(pnum + 1); + plr[pnum].position.temp = plr[pnum].position.tile; + plr[pnum].position.tile = { px, py }; // Move player to the next tile to maintain correct render order + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = pnum + 1; plr[pnum].position.offset = { xoff, yoff }; // Offset player sprite to align with their previous tile position - ChangeLightXY(plr[pnum]._plid, plr[pnum].position.current.x, plr[pnum].position.current.y); + ChangeLightXY(plr[pnum]._plid, plr[pnum].position.tile.x, plr[pnum].position.tile.y); PM_ChangeLightOff(pnum); plr[pnum]._pmode = PM_WALK2; @@ -1493,10 +1475,10 @@ void StartWalk(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int y plr[pnum].tempDirection = EndDir; break; case PM_WALK3: - int x = mapx + plr[pnum].position.current.x; - int y = mapy + plr[pnum].position.current.y; + int x = mapx + plr[pnum].position.tile.x; + int y = mapy + plr[pnum].position.tile.y; - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = -(pnum + 1); + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = -(pnum + 1); dPlayer[px][py] = -(pnum + 1); plr[pnum]._pVar4 = x; plr[pnum]._pVar5 = y; @@ -1617,7 +1599,7 @@ void StartPlrBlock(int pnum, direction dir) return; } - PlaySfxLoc(IS_ISWORD, plr[pnum].position.current.x, plr[pnum].position.current.y); + PlaySfxLoc(IS_ISWORD, plr[pnum].position.tile.x, plr[pnum].position.tile.y); if ((plr[pnum]._pGFXLoad & PFILE_BLOCK) == 0) { LoadPlrGFX(pnum, PFILE_BLOCK); @@ -1668,7 +1650,7 @@ void StartSpell(int pnum, direction d, int cx, int cy) } } - PlaySfxLoc(spelldata[plr[pnum]._pSpell].sSFX, plr[pnum].position.current.x, plr[pnum].position.current.y); + PlaySfxLoc(spelldata[plr[pnum]._pSpell].sSFX, plr[pnum].position.tile.x, plr[pnum].position.tile.y); plr[pnum]._pmode = PM_SPELL; @@ -1779,7 +1761,7 @@ void StartPlrHit(int pnum, int dam, bool forcehit) plr[pnum]._pmode = PM_GOTHIT; FixPlayerLocation(pnum, pd); FixPlrWalkTags(pnum); - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = pnum + 1; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = pnum + 1; SetPlayerOld(pnum); } @@ -1793,8 +1775,7 @@ void RespawnDeadItem(ItemStruct *itm, int x, int y) dItem[x][y] = ii + 1; items[ii] = *itm; - items[ii]._ix = x; - items[ii]._iy = y; + items[ii].position = { x, y }; RespawnItem(&items[ii], true); itm->_itype = ITYPE_NONE; @@ -1812,8 +1793,8 @@ static void PlrDeadItem(int pnum, ItemStruct *itm, int xx, int yy) app_fatal("PlrDeadItem: illegal player %d", pnum); } - x = xx + plr[pnum].position.current.x; - y = yy + plr[pnum].position.current.y; + x = xx + plr[pnum].position.tile.x; + y = yy + plr[pnum].position.tile.y; if ((xx || yy) && ItemSpaceOk(x, y)) { RespawnDeadItem(itm, x, y); plr[pnum].HoldItem = *itm; @@ -1823,9 +1804,9 @@ static void PlrDeadItem(int pnum, ItemStruct *itm, int xx, int yy) for (k = 1; k < 50; k++) { for (j = -k; j <= k; j++) { - y = j + plr[pnum].position.current.y; + y = j + plr[pnum].position.tile.y; for (i = -k; i <= k; i++) { - x = i + plr[pnum].position.current.x; + x = i + plr[pnum].position.tile.x; if (ItemSpaceOk(x, y)) { RespawnDeadItem(itm, x, y); plr[pnum].HoldItem = *itm; @@ -1894,7 +1875,7 @@ StartPlayerKill(int pnum, int earflag) if (plr[pnum].plrlevel == currlevel) { FixPlayerLocation(pnum, p->_pdir); RemovePlrFromMap(pnum); - dFlags[p->position.current.x][p->position.current.y] |= BFLAG_DEAD_PLAYER; + dFlags[p->position.tile.x][p->position.tile.y] |= BFLAG_DEAD_PLAYER; SetPlayerOld(pnum); if (pnum == myplr) { @@ -2152,11 +2133,11 @@ void RemovePlrMissiles(int pnum) int i, am; int mx, my; - if (currlevel != 0 && pnum == myplr && (monster[myplr].position.current.x != 1 || monster[myplr].position.current.y != 0)) { + if (currlevel != 0 && pnum == myplr && (monster[myplr].position.tile.x != 1 || monster[myplr].position.tile.y != 0)) { M_StartKill(myplr, myplr); - AddDead(monster[myplr].position.current.x, monster[myplr].position.current.y, (monster[myplr].MType)->mdeadval, monster[myplr]._mdir); - mx = monster[myplr].position.current.x; - my = monster[myplr].position.current.y; + AddDead(monster[myplr].position.tile.x, monster[myplr].position.tile.y, (monster[myplr].MType)->mdeadval, monster[myplr]._mdir); + mx = monster[myplr].position.tile.x; + my = monster[myplr].position.tile.y; dMonster[mx][my] = 0; monster[myplr]._mDelFlag = true; DeleteMonsterList(); @@ -2189,7 +2170,7 @@ void InitLevelChange(int pnum) RemovePlrFromMap(pnum); SetPlayerOld(pnum); if (pnum == myplr) { - dPlayer[plr[myplr].position.current.x][plr[myplr].position.current.y] = myplr + 1; + dPlayer[plr[myplr].position.tile.x][plr[myplr].position.tile.y] = myplr + 1; } else { plr[pnum]._pLvlVisited[plr[pnum].plrlevel] = true; } @@ -2305,7 +2286,7 @@ bool PM_DoWalk(int pnum, int variant) if (plr[pnum]._pAnimFrame == 3 || (plr[pnum]._pWFrames == 8 && plr[pnum]._pAnimFrame == 7) || (plr[pnum]._pWFrames != 8 && plr[pnum]._pAnimFrame == 4)) { - PlaySfxLoc(PS_WALK1, plr[pnum].position.current.x, plr[pnum].position.current.y); + PlaySfxLoc(PS_WALK1, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } } @@ -2332,32 +2313,32 @@ bool PM_DoWalk(int pnum, int variant) //Update the player's tile position switch (variant) { case PM_WALK: - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = 0; - plr[pnum].position.current.x += plr[pnum].position.temp.x; - plr[pnum].position.current.y += plr[pnum].position.temp.y; - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = pnum + 1; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = 0; + plr[pnum].position.tile.x += plr[pnum].position.temp.x; + plr[pnum].position.tile.y += plr[pnum].position.temp.y; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = pnum + 1; break; case PM_WALK2: dPlayer[plr[pnum].position.temp.x][plr[pnum].position.temp.y] = 0; break; case PM_WALK3: - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = 0; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = 0; dFlags[plr[pnum]._pVar4][plr[pnum]._pVar5] &= ~BFLAG_PLAYERLR; - plr[pnum].position.current = plr[pnum].position.temp; - dPlayer[plr[pnum].position.current.x][plr[pnum].position.current.y] = pnum + 1; + plr[pnum].position.tile = plr[pnum].position.temp; + dPlayer[plr[pnum].position.tile.x][plr[pnum].position.tile.y] = pnum + 1; break; } //Update the coordinates for lighting and vision entries for the player if (leveltype != DTYPE_TOWN) { - ChangeLightXY(plr[pnum]._plid, plr[pnum].position.current.x, plr[pnum].position.current.y); - ChangeVisionXY(plr[pnum]._pvid, plr[pnum].position.current.x, plr[pnum].position.current.y); + ChangeLightXY(plr[pnum]._plid, plr[pnum].position.tile.x, plr[pnum].position.tile.y); + ChangeVisionXY(plr[pnum]._pvid, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } //Update the "camera" tile position if (pnum == myplr && ScrollInfo._sdir) { - ViewX = plr[pnum].position.current.x - ScrollInfo.tile.x; - ViewY = plr[pnum].position.current.y - ScrollInfo.tile.y; + ViewX = plr[pnum].position.tile.x - ScrollInfo.tile.x; + ViewY = plr[pnum].position.tile.y - ScrollInfo.tile.y; } if (plr[pnum].walkpath[0] != WALK_NONE) { @@ -2557,7 +2538,7 @@ bool PlrHitMonst(int pnum, int m) #endif if (plr[pnum]._pIFlags & ISPL_FIREDAM && plr[pnum]._pIFlags & ISPL_LIGHTDAM) { int midam = plr[pnum]._pIFMinDam + GenerateRnd(plr[pnum]._pIFMaxDam - plr[pnum]._pIFMinDam); - AddMissile(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum].position.temp.x, plr[pnum].position.temp.y, plr[pnum]._pdir, MIS_SPECARROW, TARGET_MONSTERS, pnum, midam, 0); + AddMissile(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum].position.temp.x, plr[pnum].position.temp.y, plr[pnum]._pdir, MIS_SPECARROW, TARGET_MONSTERS, pnum, midam, 0); } mind = plr[pnum]._pIMinDam; maxd = plr[pnum]._pIMaxDam; @@ -2765,7 +2746,7 @@ bool PlrHitPlr(int pnum, int8_t p) if (hit < hper) { if (blk < blkper) { - direction dir = GetDirection(plr[p].position.current.x, plr[p].position.current.y, plr[pnum].position.current.x, plr[pnum].position.current.y); + direction dir = GetDirection(plr[p].position.tile.x, plr[p].position.tile.y, plr[pnum].position.tile.x, plr[pnum].position.tile.y); StartPlrBlock(p, dir); } else { mind = plr[pnum]._pIMinDam; @@ -2846,12 +2827,12 @@ bool PM_DoAttack(int pnum) plr[pnum]._pAnimFrame += 2; } if (plr[pnum]._pAnimFrame == plr[pnum]._pAFNum - 1) { - PlaySfxLoc(PS_SWING, plr[pnum].position.current.x, plr[pnum].position.current.y); + PlaySfxLoc(PS_SWING, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } if (plr[pnum]._pAnimFrame == plr[pnum]._pAFNum) { - dx = plr[pnum].position.current.x + offset_x[plr[pnum]._pdir]; - dy = plr[pnum].position.current.y + offset_y[plr[pnum]._pdir]; + dx = plr[pnum].position.tile.x + offset_x[plr[pnum]._pdir]; + dy = plr[pnum].position.tile.y + offset_y[plr[pnum]._pdir]; if (dMonster[dx][dy] != 0) { if (dMonster[dx][dy] > 0) { @@ -2903,15 +2884,15 @@ bool PM_DoAttack(int pnum) || (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) || (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iLoc == ILOC_TWOHAND)) && !(plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD))))) { - dx = plr[pnum].position.current.x + offset_x[(plr[pnum]._pdir + 1) % 8]; - dy = plr[pnum].position.current.y + offset_y[(plr[pnum]._pdir + 1) % 8]; + dx = plr[pnum].position.tile.x + offset_x[(plr[pnum]._pdir + 1) % 8]; + dy = plr[pnum].position.tile.y + offset_y[(plr[pnum]._pdir + 1) % 8]; m = ((dMonster[dx][dy] > 0) ? dMonster[dx][dy] : -dMonster[dx][dy]) - 1; if (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && monster[m].position.old.x == dx && monster[m].position.old.y == dy) { if (PlrHitMonst(-pnum, m)) didhit = true; } - dx = plr[pnum].position.current.x + offset_x[(plr[pnum]._pdir + 7) % 8]; - dy = plr[pnum].position.current.y + offset_y[(plr[pnum]._pdir + 7) % 8]; + dx = plr[pnum].position.tile.x + offset_x[(plr[pnum]._pdir + 7) % 8]; + dy = plr[pnum].position.tile.y + offset_y[(plr[pnum]._pdir + 7) % 8]; m = ((dMonster[dx][dy] > 0) ? dMonster[dx][dy] : -dMonster[dx][dy]) - 1; if (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && monster[m].position.old.x == dx && monster[m].position.old.y == dy) { if (PlrHitMonst(-pnum, m)) @@ -2965,10 +2946,10 @@ bool PM_DoRangeAttack(int pnum) int yoff = 0; if (arrows != 1) { int angle = arrow == 0 ? -1 : 1; - int x = plr[pnum].position.temp.x - plr[pnum].position.current.x; + int x = plr[pnum].position.temp.x - plr[pnum].position.tile.x; if (x != 0) yoff = x < 0 ? angle : -angle; - int y = plr[pnum].position.temp.y - plr[pnum].position.current.y; + int y = plr[pnum].position.temp.y - plr[pnum].position.tile.y; if (y != 0) xoff = y < 0 ? -angle : angle; } @@ -2987,8 +2968,8 @@ bool PM_DoRangeAttack(int pnum) } AddMissile( - plr[pnum].position.current.x, - plr[pnum].position.current.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, plr[pnum].position.temp.x + xoff, plr[pnum].position.temp.y + yoff, plr[pnum]._pdir, @@ -2999,7 +2980,7 @@ bool PM_DoRangeAttack(int pnum) 0); if (arrow == 0 && mistype != MIS_SPECARROW) { - PlaySfxLoc(arrows != 1 ? IS_STING1 : PS_BFIRE, plr[pnum].position.current.x, plr[pnum].position.current.y); + PlaySfxLoc(arrows != 1 ? IS_STING1 : PS_BFIRE, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } if (WeaponDur(pnum, 40)) { @@ -3135,8 +3116,8 @@ bool PM_DoSpell(int pnum) CastSpell( pnum, plr[pnum]._pSpell, - plr[pnum].position.current.x, - plr[pnum].position.current.y, + plr[pnum].position.tile.x, + plr[pnum].position.tile.y, plr[pnum].position.temp.x, plr[pnum].position.temp.y, plr[pnum]._pVar4); @@ -3214,7 +3195,7 @@ bool PM_DoDeath(int pnum) plr[pnum]._pAnimDelay = 10000; plr[pnum]._pAnimFrame = plr[pnum]._pAnimLen; - dFlags[plr[pnum].position.current.x][plr[pnum].position.current.y] |= BFLAG_DEAD_PLAYER; + dFlags[plr[pnum].position.tile.x][plr[pnum].position.tile.y] |= BFLAG_DEAD_PLAYER; } if (plr[pnum].deathFrame < 100) { @@ -3330,13 +3311,13 @@ void CheckNewPath(int pnum) if (plr[pnum]._pmode == PM_STAND) { switch (plr[pnum].destAction) { case ACTION_ATTACK: - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum].destParam1, plr[pnum].destParam2); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum].destParam1, plr[pnum].destParam2); StartAttack(pnum, d); break; case ACTION_ATTACKMON: i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - monster[i].position.future.x); - y = abs(plr[pnum].position.current.y - monster[i].position.future.y); + x = abs(plr[pnum].position.tile.x - monster[i].position.future.x); + y = abs(plr[pnum].position.tile.y - monster[i].position.future.y); if (x <= 1 && y <= 1) { d = GetDirection(plr[pnum].position.future.x, plr[pnum].position.future.y, monster[i].position.future.x, monster[i].position.future.y); if (monster[i].mtalkmsg && monster[i].mtalkmsg != TEXT_VILE14) { @@ -3348,15 +3329,15 @@ void CheckNewPath(int pnum) break; case ACTION_ATTACKPLR: i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - plr[i].position.future.x); - y = abs(plr[pnum].position.current.y - plr[i].position.future.y); + x = abs(plr[pnum].position.tile.x - plr[i].position.future.x); + y = abs(plr[pnum].position.tile.y - plr[i].position.future.y); if (x <= 1 && y <= 1) { d = GetDirection(plr[pnum].position.future.x, plr[pnum].position.future.y, plr[i].position.future.x, plr[i].position.future.y); StartAttack(pnum, d); } break; case ACTION_RATTACK: - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum].destParam1, plr[pnum].destParam2); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum].destParam1, plr[pnum].destParam2); StartRangeAttack(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2); break; case ACTION_RATTACKMON: @@ -3374,7 +3355,7 @@ void CheckNewPath(int pnum) StartRangeAttack(pnum, d, plr[i].position.future.x, plr[i].position.future.y); break; case ACTION_SPELL: - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum].destParam1, plr[pnum].destParam2); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum].destParam1, plr[pnum].destParam2); StartSpell(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2); plr[pnum]._pVar4 = plr[pnum].destParam3; break; @@ -3385,26 +3366,26 @@ void CheckNewPath(int pnum) break; case ACTION_SPELLMON: i = plr[pnum].destParam1; - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, monster[i].position.future.x, monster[i].position.future.y); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, monster[i].position.future.x, monster[i].position.future.y); StartSpell(pnum, d, monster[i].position.future.x, monster[i].position.future.y); plr[pnum]._pVar4 = plr[pnum].destParam2; break; case ACTION_SPELLPLR: i = plr[pnum].destParam1; - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[i].position.future.x, plr[i].position.future.y); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[i].position.future.x, plr[i].position.future.y); StartSpell(pnum, d, plr[i].position.future.x, plr[i].position.future.y); plr[pnum]._pVar4 = plr[pnum].destParam2; break; case ACTION_OPERATE: i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - object[i]._ox); - y = abs(plr[pnum].position.current.y - object[i]._oy); - if (y > 1 && dObject[object[i]._ox][object[i]._oy - 1] == -(i + 1)) { - y = abs(plr[pnum].position.current.y - object[i]._oy + 1); + x = abs(plr[pnum].position.tile.x - object[i].position.x); + y = abs(plr[pnum].position.tile.y - object[i].position.y); + if (y > 1 && dObject[object[i].position.x][object[i].position.y - 1] == -(i + 1)) { + y = abs(plr[pnum].position.tile.y - object[i].position.y + 1); } if (x <= 1 && y <= 1) { if (object[i]._oBreak == 1) { - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, object[i]._ox, object[i]._oy); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, object[i].position.x, object[i].position.y); StartAttack(pnum, d); } else { OperateObject(pnum, i, false); @@ -3413,14 +3394,14 @@ void CheckNewPath(int pnum) break; case ACTION_DISARM: i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - object[i]._ox); - y = abs(plr[pnum].position.current.y - object[i]._oy); - if (y > 1 && dObject[object[i]._ox][object[i]._oy - 1] == -(i + 1)) { - y = abs(plr[pnum].position.current.y - object[i]._oy + 1); + x = abs(plr[pnum].position.tile.x - object[i].position.x); + y = abs(plr[pnum].position.tile.y - object[i].position.y); + if (y > 1 && dObject[object[i].position.x][object[i].position.y - 1] == -(i + 1)) { + y = abs(plr[pnum].position.tile.y - object[i].position.y + 1); } if (x <= 1 && y <= 1) { if (object[i]._oBreak == 1) { - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, object[i]._ox, object[i]._oy); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, object[i].position.x, object[i].position.y); StartAttack(pnum, d); } else { TryDisarm(pnum, i); @@ -3437,8 +3418,8 @@ void CheckNewPath(int pnum) case ACTION_PICKUPITEM: if (pnum == myplr) { i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - items[i]._ix); - y = abs(plr[pnum].position.current.y - items[i]._iy); + x = abs(plr[pnum].position.tile.x - items[i].position.x); + y = abs(plr[pnum].position.tile.y - items[i].position.y); if (x <= 1 && y <= 1 && pcurs == CURSOR_HAND && !items[i]._iRequest) { NetSendCmdGItem(true, CMD_REQUESTGITEM, myplr, myplr, i); items[i]._iRequest = true; @@ -3448,8 +3429,8 @@ void CheckNewPath(int pnum) case ACTION_PICKUPAITEM: if (pnum == myplr) { i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - items[i]._ix); - y = abs(plr[pnum].position.current.y - items[i]._iy); + x = abs(plr[pnum].position.tile.x - items[i].position.x); + y = abs(plr[pnum].position.tile.y - items[i].position.y); if (x <= 1 && y <= 1 && pcurs == CURSOR_HAND) { NetSendCmdGItem(true, CMD_REQUESTAGITEM, myplr, myplr, i); } @@ -3477,8 +3458,8 @@ void CheckNewPath(int pnum) plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_ATTACKMON) { i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - monster[i].position.future.x); - y = abs(plr[pnum].position.current.y - monster[i].position.future.y); + x = abs(plr[pnum].position.tile.x - monster[i].position.future.x); + y = abs(plr[pnum].position.tile.y - monster[i].position.future.y); if (x <= 1 && y <= 1) { d = GetDirection(plr[pnum].position.future.x, plr[pnum].position.future.y, monster[i].position.future.x, monster[i].position.future.y); StartAttack(pnum, d); @@ -3486,8 +3467,8 @@ void CheckNewPath(int pnum) plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_ATTACKPLR) { i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - plr[i].position.future.x); - y = abs(plr[pnum].position.current.y - plr[i].position.future.y); + x = abs(plr[pnum].position.tile.x - plr[i].position.future.x); + y = abs(plr[pnum].position.tile.y - plr[i].position.future.y); if (x <= 1 && y <= 1) { d = GetDirection(plr[pnum].position.future.x, plr[pnum].position.future.y, plr[i].position.future.x, plr[i].position.future.y); StartAttack(pnum, d); @@ -3495,14 +3476,14 @@ void CheckNewPath(int pnum) plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_OPERATE) { i = plr[pnum].destParam1; - x = abs(plr[pnum].position.current.x - object[i]._ox); - y = abs(plr[pnum].position.current.y - object[i]._oy); - if (y > 1 && dObject[object[i]._ox][object[i]._oy - 1] == -(i + 1)) { - y = abs(plr[pnum].position.current.y - object[i]._oy + 1); + x = abs(plr[pnum].position.tile.x - object[i].position.x); + y = abs(plr[pnum].position.tile.y - object[i].position.y); + if (y > 1 && dObject[object[i].position.x][object[i].position.y - 1] == -(i + 1)) { + y = abs(plr[pnum].position.tile.y - object[i].position.y + 1); } if (x <= 1 && y <= 1) { if (object[i]._oBreak == 1) { - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, object[i]._ox, object[i]._oy); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, object[i].position.x, object[i].position.y); StartAttack(pnum, d); } else { OperateObject(pnum, i, false); @@ -3513,17 +3494,17 @@ void CheckNewPath(int pnum) if (plr[pnum]._pmode == PM_RATTACK && plr[pnum]._pAnimFrame > plr[myplr]._pAFNum) { if (plr[pnum].destAction == ACTION_RATTACK) { - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum].destParam1, plr[pnum].destParam2); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum].destParam1, plr[pnum].destParam2); StartRangeAttack(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2); plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_RATTACKMON) { i = plr[pnum].destParam1; - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, monster[i].position.future.x, monster[i].position.future.y); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, monster[i].position.future.x, monster[i].position.future.y); StartRangeAttack(pnum, d, monster[i].position.future.x, monster[i].position.future.y); plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_RATTACKPLR) { i = plr[pnum].destParam1; - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[i].position.future.x, plr[i].position.future.y); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[i].position.future.x, plr[i].position.future.y); StartRangeAttack(pnum, d, plr[i].position.future.x, plr[i].position.future.y); plr[pnum].destAction = ACTION_NONE; } @@ -3531,17 +3512,17 @@ void CheckNewPath(int pnum) if (plr[pnum]._pmode == PM_SPELL && plr[pnum]._pAnimFrame > plr[pnum]._pSFNum) { if (plr[pnum].destAction == ACTION_SPELL) { - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[pnum].destParam1, plr[pnum].destParam2); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[pnum].destParam1, plr[pnum].destParam2); StartSpell(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2); plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_SPELLMON) { i = plr[pnum].destParam1; - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, monster[i].position.future.x, monster[i].position.future.y); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, monster[i].position.future.x, monster[i].position.future.y); StartSpell(pnum, d, monster[i].position.future.x, monster[i].position.future.y); plr[pnum].destAction = ACTION_NONE; } else if (plr[pnum].destAction == ACTION_SPELLPLR) { i = plr[pnum].destParam1; - d = GetDirection(plr[pnum].position.current.x, plr[pnum].position.current.y, plr[i].position.future.x, plr[i].position.future.y); + d = GetDirection(plr[pnum].position.tile.x, plr[pnum].position.tile.y, plr[i].position.future.x, plr[i].position.future.y); StartSpell(pnum, d, plr[i].position.future.x, plr[i].position.future.y); plr[pnum].destAction = ACTION_NONE; } @@ -3969,7 +3950,7 @@ void CheckPlrSpell() if (addflag) { if (plr[myplr]._pRSpell == SPL_FIREWALL || plr[myplr]._pRSpell == SPL_LIGHTWALL) { - direction sd = GetDirection(plr[myplr].position.current.x, plr[myplr].position.current.y, cursmx, cursmy); + direction sd = GetDirection(plr[myplr].position.tile.x, plr[myplr].position.tile.y, cursmx, cursmy); sl = GetSpellLevel(myplr, plr[myplr]._pRSpell); NetSendCmdLocParam3(true, CMD_SPELLXYD, cursmx, cursmy, plr[myplr]._pRSpell, sd, sl); } else if (pcursmonst != -1) { @@ -4057,8 +4038,8 @@ void SyncInitPlrPos(int pnum) } for (i = 0; i < 8; i++) { - x = plr[pnum].position.current.x + plrxoff2[i]; - y = plr[pnum].position.current.y + plryoff2[i]; + x = plr[pnum].position.tile.x + plrxoff2[i]; + y = plr[pnum].position.tile.y + plryoff2[i]; if (PosOkPlayer(pnum, x, y)) { break; } @@ -4068,9 +4049,9 @@ void SyncInitPlrPos(int pnum) posOk = false; for (range = 1; range < 50 && !posOk; range++) { for (yy = -range; yy <= range && !posOk; yy++) { - y = yy + plr[pnum].position.current.y; + y = yy + plr[pnum].position.tile.y; for (xx = -range; xx <= range && !posOk; xx++) { - x = xx + plr[pnum].position.current.x; + x = xx + plr[pnum].position.tile.x; if (PosOkPlayer(pnum, x, y) && !PosOkPortal(currlevel, x, y)) { posOk = true; } @@ -4079,7 +4060,7 @@ void SyncInitPlrPos(int pnum) } } - plr[pnum].position.current = { x, y }; + plr[pnum].position.tile = { x, y }; dPlayer[x][y] = pnum + 1; if (pnum == myplr) { diff --git a/Source/portal.cpp b/Source/portal.cpp index dc2d604ef..c246152bf 100644 --- a/Source/portal.cpp +++ b/Source/portal.cpp @@ -36,8 +36,7 @@ void InitPortals() void SetPortalStats(int i, bool o, int x, int y, int lvl, dungeon_type lvltype) { portal[i].open = o; - portal[i].x = x; - portal[i].y = y; + portal[i].position = { x, y }; portal[i].level = lvl; portal[i].ltype = lvltype; portal[i].setlvl = false; @@ -55,7 +54,7 @@ void AddWarpMissile(int i, int x, int y) SetMissDir(mi, 1); if (currlevel != 0) - missile[mi]._mlid = AddLight(missile[mi].position.current.x, missile[mi].position.current.y, 15); + missile[mi]._mlid = AddLight(missile[mi].position.tile.x, missile[mi].position.tile.y, 15); missiledata[MIS_TOWN].mlSFX = LS_SENTINEL; } @@ -75,7 +74,7 @@ void SyncPortals() if (setlevel) lvl = setlvlnum; if (portal[i].level == lvl && portal[i].setlvl == setlevel) - AddWarpMissile(i, portal[i].x, portal[i].y); + AddWarpMissile(i, portal[i].position.x, portal[i].position.y); } } } @@ -90,8 +89,7 @@ void ActivatePortal(int i, int x, int y, int lvl, dungeon_type lvltype, bool sp) portal[i].open = true; if (lvl != 0) { - portal[i].x = x; - portal[i].y = y; + portal[i].position = { x, y }; portal[i].level = lvl; portal[i].ltype = lvltype; portal[i].setlvl = sp; @@ -119,8 +117,8 @@ void RemovePortalMissile(int id) for (i = 0; i < nummissiles; i++) { mi = missileactive[i]; if (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == id) { - dFlags[missile[mi].position.current.x][missile[mi].position.current.y] &= ~BFLAG_MISSILE; - dMissile[missile[mi].position.current.x][missile[mi].position.current.y] = 0; + dFlags[missile[mi].position.tile.x][missile[mi].position.tile.y] &= ~BFLAG_MISSILE; + dMissile[missile[mi].position.tile.x][missile[mi].position.tile.y] = 0; if (portal[id].level != 0) AddUnLight(missile[mi]._mlid); @@ -168,8 +166,8 @@ void GetPortalLvlPos() ViewX = WarpDropX[portalindex] + 1; ViewY = WarpDropY[portalindex] + 1; } else { - ViewX = portal[portalindex].x; - ViewY = portal[portalindex].y; + ViewX = portal[portalindex].position.x; + ViewY = portal[portalindex].position.y; if (portalindex != myplr) { ViewX++; @@ -183,7 +181,7 @@ bool PosOkPortal(int lvl, int x, int y) int i; for (i = 0; i < MAXPORTAL; i++) { - if (portal[i].open && portal[i].level == lvl && ((portal[i].x == x && portal[i].y == y) || (portal[i].x == x - 1 && portal[i].y == y - 1))) + if (portal[i].open && portal[i].level == lvl && ((portal[i].position.x == x && portal[i].position.y == y) || (portal[i].position.x == x - 1 && portal[i].position.y == y - 1))) return true; } return false; diff --git a/Source/portal.h b/Source/portal.h index 435de9b82..8e154df51 100644 --- a/Source/portal.h +++ b/Source/portal.h @@ -13,8 +13,7 @@ namespace devilution { struct PortalStruct { bool open; - int x; - int y; + Point position; int level; dungeon_type ltype; bool setlvl; diff --git a/Source/qol.cpp b/Source/qol.cpp index 6e83b469d..045244a08 100644 --- a/Source/qol.cpp +++ b/Source/qol.cpp @@ -178,8 +178,8 @@ void AutoGoldPickup(int pnum) return; for (int dir = 0; dir < 8; dir++) { - int x = plr[pnum].position.current.x + pathxdir[dir]; - int y = plr[pnum].position.current.y + pathydir[dir]; + int x = plr[pnum].position.tile.x + pathxdir[dir]; + int y = plr[pnum].position.tile.y + pathydir[dir]; if (dItem[x][y] != 0) { int itemIndex = dItem[x][y] - 1; if (items[itemIndex]._itype == ITYPE_GOLD) { diff --git a/Source/quests.cpp b/Source/quests.cpp index f6643a0cf..934f0b523 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -147,8 +147,7 @@ void InitQuests() } quests[z]._qslvl = questlist[z]._qslvl; - quests[z]._qtx = 0; - quests[z]._qty = 0; + quests[z].position = { 0, 0 }; quests[z]._qidx = z; quests[z]._qlvltype = questlist[z]._qlvlt; quests[z]._qvar2 = 0; @@ -209,10 +208,10 @@ void CheckQuests() && quests[Q_BETRAYER]._qvar1 >= 2 && (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE || quests[Q_BETRAYER]._qactive == QUEST_DONE) && (quests[Q_BETRAYER]._qvar2 == 0 || quests[Q_BETRAYER]._qvar2 == 2)) { - quests[Q_BETRAYER]._qtx = 2 * quests[Q_BETRAYER]._qtx + 16; - quests[Q_BETRAYER]._qty = 2 * quests[Q_BETRAYER]._qty + 16; - rportx = quests[Q_BETRAYER]._qtx; - rporty = quests[Q_BETRAYER]._qty; + quests[Q_BETRAYER].position.x = 2 * quests[Q_BETRAYER].position.x + 16; + quests[Q_BETRAYER].position.y = 2 * quests[Q_BETRAYER].position.y + 16; + rportx = quests[Q_BETRAYER].position.x; + rporty = quests[Q_BETRAYER].position.y; AddMissile(rportx, rporty, rportx, rporty, 0, MIS_RPORTAL, TARGET_MONSTERS, myplr, 0, 0); quests[Q_BETRAYER]._qvar2 = 1; if (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) { @@ -237,7 +236,7 @@ void CheckQuests() && nummonsters == 4 && quests[Q_PWATER]._qactive != QUEST_DONE) { quests[Q_PWATER]._qactive = QUEST_DONE; - PlaySfxLoc(IS_QUESTDN, plr[myplr].position.current.x, plr[myplr].position.current.y); + PlaySfxLoc(IS_QUESTDN, plr[myplr].position.tile.x, plr[myplr].position.tile.y); LoadPalette("Levels\\L3Data\\L3pwater.pal"); WaterDone = 32; } @@ -250,8 +249,8 @@ void CheckQuests() if (currlevel == quests[i]._qlevel && quests[i]._qslvl != 0 && quests[i]._qactive != QUEST_NOTAVAIL - && plr[myplr].position.current.x == quests[i]._qtx - && plr[myplr].position.current.y == quests[i]._qty) { + && plr[myplr].position.tile.x == quests[i].position.x + && plr[myplr].position.tile.y == quests[i].position.y) { if (quests[i]._qlvltype != DTYPE_NONE) { setlvltype = quests[i]._qlvltype; } @@ -276,8 +275,8 @@ bool ForceQuests() if (i != Q_BETRAYER && currlevel == quests[i]._qlevel && quests[i]._qslvl != 0) { ql = quests[quests[i]._qidx]._qslvl - 1; - qx = quests[i]._qtx; - qy = quests[i]._qty; + qx = quests[i].position.x; + qy = quests[i].position.y; for (j = 0; j < 7; j++) { if (qx + questxoff[j] == cursmx && qy + questyoff[j] == cursmy) { @@ -338,8 +337,7 @@ void CheckQuestKill(int m, bool sendmsg) for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 370) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } @@ -375,8 +373,7 @@ void DrawButcher() void DrawSkelKing(int q, int x, int y) { - quests[q]._qtx = 2 * x + 28; - quests[q]._qty = 2 * y + 23; + quests[q].position = { 2 * x + 28, 2 * y + 23 }; } void DrawWarLord(int x, int y) @@ -439,8 +436,7 @@ void DrawSChamber(int q, int x, int y) } xx = 2 * x + 22; yy = 2 * y + 23; - quests[q]._qtx = xx; - quests[q]._qty = yy; + quests[q].position = { xx, yy }; mem_free_dbg(setp); } @@ -559,28 +555,28 @@ void SetReturnLvlPos() { switch (setlvlnum) { case SL_SKELKING: - ReturnLvlX = quests[Q_SKELKING]._qtx + 1; - ReturnLvlY = quests[Q_SKELKING]._qty; + ReturnLvlX = quests[Q_SKELKING].position.x + 1; + ReturnLvlY = quests[Q_SKELKING].position.y; ReturnLvl = quests[Q_SKELKING]._qlevel; ReturnLvlT = DTYPE_CATHEDRAL; break; case SL_BONECHAMB: - ReturnLvlX = quests[Q_SCHAMB]._qtx + 1; - ReturnLvlY = quests[Q_SCHAMB]._qty; + ReturnLvlX = quests[Q_SCHAMB].position.x + 1; + ReturnLvlY = quests[Q_SCHAMB].position.y; ReturnLvl = quests[Q_SCHAMB]._qlevel; ReturnLvlT = DTYPE_CATACOMBS; break; case SL_MAZE: break; case SL_POISONWATER: - ReturnLvlX = quests[Q_PWATER]._qtx; - ReturnLvlY = quests[Q_PWATER]._qty + 1; + ReturnLvlX = quests[Q_PWATER].position.x; + ReturnLvlY = quests[Q_PWATER].position.y + 1; ReturnLvl = quests[Q_PWATER]._qlevel; ReturnLvlT = DTYPE_CATHEDRAL; break; case SL_VILEBETRAYER: - ReturnLvlX = quests[Q_BETRAYER]._qtx + 1; - ReturnLvlY = quests[Q_BETRAYER]._qty - 1; + ReturnLvlX = quests[Q_BETRAYER].position.x + 1; + ReturnLvlY = quests[Q_BETRAYER].position.y - 1; ReturnLvl = quests[Q_BETRAYER]._qlevel; ReturnLvlT = DTYPE_HELL; break; diff --git a/Source/quests.h b/Source/quests.h index 88e940c34..1d43cab11 100644 --- a/Source/quests.h +++ b/Source/quests.h @@ -44,8 +44,7 @@ struct QuestStruct { uint8_t _qtype; quest_state _qactive; dungeon_type _qlvltype; - int _qtx; - int _qty; + Point position; _setlevels _qslvl; uint8_t _qidx; _speech_id _qmsg; diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 131f00052..3cb061ab3 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -302,7 +302,7 @@ void DrawMissile(const CelOutputBuffer &out, int x, int y, int sx, int sy, bool for (i = 0; i < nummissiles; i++) { assert(missileactive[i] < MAXMISSILES); m = &missile[missileactive[i]]; - if (m->position.current.x != x || m->position.current.y != y) + if (m->position.tile.x != x || m->position.tile.y != y) continue; DrawMissilePrivate(out, m, sx, sy, pre); } @@ -484,7 +484,7 @@ void DrawDeadPlayer(const CelOutputBuffer &out, int x, int y, int sx, int sy) for (i = 0; i < MAX_PLRS; i++) { p = &plr[i]; - if (p->plractive && p->_pHitPoints == 0 && p->plrlevel == (BYTE)currlevel && p->position.current.x == x && p->position.current.y == y) { + if (p->plractive && p->_pHitPoints == 0 && p->plrlevel == (BYTE)currlevel && p->position.tile.x == x && p->position.tile.y == y) { dFlags[x][y] |= BFLAG_DEAD_PLAYER; px = sx + p->position.offset.x - p->_pAnimWidth2; py = sy + p->position.offset.y; @@ -519,8 +519,8 @@ static void DrawObject(const CelOutputBuffer &out, int x, int y, int ox, int oy, bv = -(dObject[x][y] + 1); if (object[bv]._oPreFlag != pre) return; - int xx = object[bv]._ox - x; - int yy = object[bv]._oy - y; + int xx = object[bv].position.x - x; + int yy = object[bv].position.y - y; sx = (xx * TILE_WIDTH / 2) + ox - object[bv]._oAnimWidth2 - (yy * TILE_WIDTH / 2); sy = oy + (yy * TILE_HEIGHT / 2) + (xx * TILE_HEIGHT / 2); } diff --git a/Source/setmaps.cpp b/Source/setmaps.cpp index 4aef2ac6e..cfdf494be 100644 --- a/Source/setmaps.cpp +++ b/Source/setmaps.cpp @@ -87,7 +87,7 @@ int ObjIndex(int x, int y) for (i = 0; i < nobjects; i++) { oi = objectactive[i]; - if (object[oi]._ox == x && object[oi]._oy == y) + if (object[oi].position.x == x && object[oi].position.y == y) return oi; } app_fatal("ObjIndex: Active object not found at (%d,%d)", x, y); diff --git a/Source/spells.cpp b/Source/spells.cpp index 70395c920..ac4edc48b 100644 --- a/Source/spells.cpp +++ b/Source/spells.cpp @@ -218,8 +218,8 @@ static void PlacePlayer(int pnum) if (plr[pnum].plrlevel == currlevel) { for (i = 0; i < 8; i++) { - nx = plr[pnum].position.current.x + plrxoff2[i]; - ny = plr[pnum].position.current.y + plryoff2[i]; + nx = plr[pnum].position.tile.x + plrxoff2[i]; + ny = plr[pnum].position.tile.y + plryoff2[i]; if (PosOkPlayer(pnum, nx, ny)) { break; @@ -231,10 +231,10 @@ static void PlacePlayer(int pnum) for (max = 1, min = -1; min > -50 && !done; max++, min--) { for (y = min; y <= max && !done; y++) { - ny = plr[pnum].position.current.y + y; + ny = plr[pnum].position.tile.y + y; for (x = min; x <= max && !done; x++) { - nx = plr[pnum].position.current.x + x; + nx = plr[pnum].position.tile.x + x; if (PosOkPlayer(pnum, nx, ny)) { done = true; @@ -244,7 +244,7 @@ static void PlacePlayer(int pnum) } } - plr[pnum].position.current = { nx, ny }; + plr[pnum].position.tile = { nx, ny }; dPlayer[nx][ny] = pnum + 1; @@ -264,7 +264,7 @@ void DoResurrect(int pnum, int rid) int hp; if ((char)rid != -1) { - AddMissile(plr[rid].position.current.x, plr[rid].position.current.y, plr[rid].position.current.x, plr[rid].position.current.y, 0, MIS_RESURRECTBEAM, TARGET_MONSTERS, pnum, 0, 0); + AddMissile(plr[rid].position.tile.x, plr[rid].position.tile.y, plr[rid].position.tile.x, plr[rid].position.tile.y, 0, MIS_RESURRECTBEAM, TARGET_MONSTERS, pnum, 0, 0); } if (pnum == myplr) { diff --git a/Source/sync.cpp b/Source/sync.cpp index 97d809636..6129b4abd 100644 --- a/Source/sync.cpp +++ b/Source/sync.cpp @@ -26,7 +26,7 @@ static void sync_one_monster() for (i = 0; i < nummonsters; i++) { m = monstactive[i]; - sgnMonsterPriority[m] = abs(plr[myplr].position.current.x - monster[m].position.current.x) + abs(plr[myplr].position.current.y - monster[m].position.current.y); + sgnMonsterPriority[m] = abs(plr[myplr].position.tile.x - monster[m].position.tile.x) + abs(plr[myplr].position.tile.y - monster[m].position.tile.y); if (monster[m]._msquelch == 0) { sgnMonsterPriority[m] += 0x1000; } else if (sgwLRU[m] != 0) { @@ -38,8 +38,8 @@ static void sync_one_monster() static void sync_monster_pos(TSyncMonster *p, int ndx) { p->_mndx = ndx; - p->_mx = monster[ndx].position.current.x; - p->_my = monster[ndx].position.current.y; + p->_mx = monster[ndx].position.tile.x; + p->_my = monster[ndx].position.tile.y; p->_menemy = encode_enemy(ndx); p->_mdelta = sgnMonsterPriority[ndx] > 255 ? 255 : sgnMonsterPriority[ndx]; @@ -110,8 +110,8 @@ static void SyncPlrInv(TSyncHeader *pHdr) } ii = itemactive[sgnSyncItem++]; pHdr->bItemI = ii; - pHdr->bItemX = items[ii]._ix; - pHdr->bItemY = items[ii]._iy; + pHdr->bItemX = items[ii].position.x; + pHdr->bItemY = items[ii].position.y; pHdr->wItemIndx = items[ii].IDidx; if (items[ii].IDidx == IDI_EAR) { pHdr->wItemCI = (items[ii]._iName[7] << 8) | items[ii]._iName[8]; @@ -213,7 +213,7 @@ static void sync_monster(int pnum, const TSyncMonster *p) return; } - delta = abs(plr[myplr].position.current.x - monster[ndx].position.current.x) + abs(plr[myplr].position.current.y - monster[ndx].position.current.y); + delta = abs(plr[myplr].position.tile.x - monster[ndx].position.tile.x) + abs(plr[myplr].position.tile.y - monster[ndx].position.tile.y); if (delta > 255) { delta = 255; } @@ -228,14 +228,14 @@ static void sync_monster(int pnum, const TSyncMonster *p) return; } - mdx = abs(monster[ndx].position.current.x - p->_mx); - mdy = abs(monster[ndx].position.current.y - p->_my); + mdx = abs(monster[ndx].position.tile.x - p->_mx); + mdy = abs(monster[ndx].position.tile.y - p->_my); if (mdx <= 2 && mdy <= 2) { if (monster[ndx]._mmode < MM_WALK || monster[ndx]._mmode > MM_WALK3) { - direction md = GetDirection(monster[ndx].position.current.x, monster[ndx].position.current.y, p->_mx, p->_my); + direction md = GetDirection(monster[ndx].position.tile.x, monster[ndx].position.tile.y, p->_mx, p->_my); if (DirOK(ndx, md)) { M_ClearSquares(ndx); - dMonster[monster[ndx].position.current.x][monster[ndx].position.current.y] = ndx + 1; + dMonster[monster[ndx].position.tile.x][monster[ndx].position.tile.y] = ndx + 1; M_WalkDir(ndx, md); monster[ndx]._msquelch = UCHAR_MAX; } @@ -243,7 +243,7 @@ static void sync_monster(int pnum, const TSyncMonster *p) } else if (dMonster[p->_mx][p->_my] == 0) { M_ClearSquares(ndx); dMonster[p->_mx][p->_my] = ndx + 1; - monster[ndx].position.current = { p->_mx, p->_my }; + monster[ndx].position.tile = { p->_mx, p->_my }; decode_enemy(ndx, p->_menemy); direction md = GetDirection(p->_mx, p->_my, monster[ndx].enemyPosition.x, monster[ndx].enemyPosition.y); M_StartStand(ndx, md); diff --git a/Source/themes.cpp b/Source/themes.cpp index ad843c29e..0b6f035f4 100644 --- a/Source/themes.cpp +++ b/Source/themes.cpp @@ -367,7 +367,7 @@ bool CheckThemeRoom(int tv) int i, j, tarea; for (i = 0; i < numtrigs; i++) { - if (dTransVal[trigs[i]._tx][trigs[i]._ty] == tv) + if (dTransVal[trigs[i].position.x][trigs[i].position.y] == tv) return false; } diff --git a/Source/towners.cpp b/Source/towners.cpp index 6c253a27d..3ad541fce 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -157,7 +157,7 @@ void CowSFX(int pnum) } } else { if (sgdwCowClicks >= 8) { - PlaySfxLoc(TSFX_COW1, plr[pnum].position.current.x, plr[pnum].position.current.y + 5); + PlaySfxLoc(TSFX_COW1, plr[pnum].position.tile.x, plr[pnum].position.tile.y + 5); sgdwCowClicks = 4; CowPlaying = snSFX[sgnCowMsg][static_cast(plr[pnum]._pClass)]; /* snSFX is local */ sgnCowMsg++; @@ -168,7 +168,7 @@ void CowSFX(int pnum) } } - PlaySfxLoc(CowPlaying, plr[pnum].position.current.x, plr[pnum].position.current.y); + PlaySfxLoc(CowPlaying, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } int GetActiveTowner(int t) @@ -207,8 +207,7 @@ void InitTownerInfo(int i, int w, bool sel, _talker_id t, int x, int y, int ao) towners[i]._tAnimWidth2 = (w - 64) / 2; towners[i]._tMsgSaid = false; towners[i]._ttype = t; - towners[i]._tx = x; - towners[i]._ty = y; + towners[i].position = { x, y }; dMonster[x][y] = i + 1; towners[i]._tAnimOrder = ao; towners[i]._tSeed = AdvanceRndSeed(); @@ -511,8 +510,8 @@ void TownCtrlMsg(int i) if (towners[i]._tbtcnt) { p = towners[i]._tTalkingToPlayer; - dx = abs(towners[i]._tx - plr[p].position.current.x); - dy = abs(towners[i]._ty - plr[p].position.current.y); + dx = abs(towners[i].position.x - plr[p].position.tile.x); + dy = abs(towners[i].position.y - plr[p].position.tile.y); if (dx >= 2 || dy >= 2) { towners[i]._tbtcnt = false; qtextflag = false; @@ -731,8 +730,8 @@ void TalkToTowner(int p, int t) int qt; bool t2; - dx = abs(plr[p].position.current.x - towners[t]._tx); - dy = abs(plr[p].position.current.y - towners[t]._ty); + dx = abs(plr[p].position.tile.x - towners[t].position.x); + dy = abs(plr[p].position.tile.y - towners[t].position.y); #ifdef _DEBUG if (!debug_mode_key_d) #endif @@ -800,7 +799,7 @@ void TalkToTowner(int p, int t) quests[Q_LTBANNER]._qactive = QUEST_DONE; quests[Q_LTBANNER]._qvar1 = 3; RemoveInvItem(p, i); - SpawnUnique(UITEM_HARCREST, towners[t]._tx, towners[t]._ty + 1); + SpawnUnique(UITEM_HARCREST, towners[t].position.x, towners[t].position.y + 1); towners[t]._tbtcnt = true; towners[t]._tTalkingToPlayer = p; InitQTextMsg(TEXT_BANNER3); @@ -857,7 +856,7 @@ void TalkToTowner(int p, int t) quests[Q_ROCK]._qvar2 = 2; quests[Q_ROCK]._qvar1 = 2; RemoveInvItem(p, i); - SpawnUnique(UITEM_INFRARING, towners[t]._tx, towners[t]._ty + 1); + SpawnUnique(UITEM_INFRARING, towners[t].position.x, towners[t].position.y + 1); towners[t]._tbtcnt = true; towners[t]._tTalkingToPlayer = p; InitQTextMsg(TEXT_INFRA7); @@ -885,7 +884,7 @@ void TalkToTowner(int p, int t) quests[Q_ANVIL]._qvar2 = 2; quests[Q_ANVIL]._qvar1 = 2; RemoveInvItem(p, i); - SpawnUnique(UITEM_GRISWOLD, towners[t]._tx, towners[t]._ty + 1); + SpawnUnique(UITEM_GRISWOLD, towners[t].position.x, towners[t].position.y + 1); towners[t]._tbtcnt = true; towners[t]._tTalkingToPlayer = p; InitQTextMsg(TEXT_ANVIL7); @@ -992,14 +991,14 @@ void TalkToTowner(int p, int t) towners[t]._tbtcnt = true; towners[t]._tTalkingToPlayer = p; InitQTextMsg(TEXT_POISON5); - SpawnUnique(UITEM_TRING, towners[t]._tx, towners[t]._ty + 1); + SpawnUnique(UITEM_TRING, towners[t].position.x, towners[t].position.y + 1); towners[t]._tMsgSaid = true; } } } if (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && quests[Q_MUSHROOM]._qmsg == TEXT_MUSH10 && PlrHasItem(p, IDI_BRAIN, &i) != nullptr) { RemoveInvItem(p, i); - SpawnQuestItem(IDI_SPECELIX, towners[t]._tx, towners[t]._ty + 1, 0, false); + SpawnQuestItem(IDI_SPECELIX, towners[t].position.x, towners[t].position.y + 1, 0, false); InitQTextMsg(TEXT_MUSH4); quests[Q_MUSHROOM]._qvar1 = QS_BRAINGIVEN; Qtalklist[TOWN_HEALER][Q_MUSHROOM] = TEXT_NONE; @@ -1093,7 +1092,7 @@ void TalkToTowner(int p, int t) quests[Q_FARMER]._qvar1 = 1; quests[Q_FARMER]._qlog = true; quests[Q_FARMER]._qmsg = TEXT_FARMER1; - SpawnRuneBomb(towners[t]._tx + 1, towners[t]._ty); + SpawnRuneBomb(towners[t].position.x + 1, towners[t].position.y); t2 = true; break; } @@ -1127,13 +1126,13 @@ void TalkToTowner(int p, int t) quests[Q_FARMER]._qvar1 = 1; quests[Q_FARMER]._qlog = true; quests[Q_FARMER]._qmsg = TEXT_FARMER1; - SpawnRuneBomb(towners[t]._tx + 1, towners[t]._ty); + SpawnRuneBomb(towners[t].position.x + 1, towners[t].position.y); t2 = true; } break; case QUEST_DONE: qt = TEXT_FARMER4; - SpawnRewardItem(IDI_AURIC, towners[t]._tx + 1, towners[t]._ty); + SpawnRewardItem(IDI_AURIC, towners[t].position.x + 1, towners[t].position.y); quests[Q_FARMER]._qactive = QUEST_HIVE_DONE; quests[Q_FARMER]._qlog = false; t2 = true; @@ -1164,7 +1163,7 @@ void TalkToTowner(int p, int t) qt = TEXT_JERSEY7; RemoveInvItem(p, i); } else if (PlrHasItem(p, IDI_BROWNSUIT, &i) != nullptr) { - SpawnUnique(UITEM_BOVINE, towners[t]._tx + 1, towners[t]._ty); + SpawnUnique(UITEM_BOVINE, towners[t].position.x + 1, towners[t].position.y); RemoveInvItem(p, i); qt = TEXT_JERSEY8; quests[Q_JERSEY]._qactive = QUEST_DONE; @@ -1217,7 +1216,7 @@ void TalkToTowner(int p, int t) quests[Q_JERSEY]._qvar1 = 1; quests[Q_JERSEY]._qmsg = TEXT_JERSEY4; quests[Q_JERSEY]._qlog = true; - SpawnRuneBomb(towners[t]._tx + 1, towners[t]._ty); + SpawnRuneBomb(towners[t].position.x + 1, towners[t].position.y); t2 = true; } break; @@ -1274,7 +1273,7 @@ void TalkToTowner(int p, int t) } else { qt = TEXT_GIRL4; RemoveInvItem(p, i); - CreateAmulet(towners[t]._tx, towners[t]._ty, 13, false, true); + CreateAmulet(towners[t].position.x, towners[t].position.y, 13, false, true); quests[Q_GIRL]._qlog = false; quests[Q_GIRL]._qactive = QUEST_DONE; t2 = true; diff --git a/Source/towners.h b/Source/towners.h index c281820b4..51d872fdd 100644 --- a/Source/towners.h +++ b/Source/towners.h @@ -43,8 +43,8 @@ struct TownerStruct { uint8_t *_tNData; uint8_t *_tAnimData; int16_t _tSeed; - int16_t _tx; // Tile X-position of NPC - int16_t _ty; // Tile Y-position of NPC + /** Tile position of NPC */ + Point position; int16_t _tAnimWidth; int16_t _tAnimWidth2; int16_t _tAnimDelay; // Tick length of each frame in the current animation diff --git a/Source/trigs.cpp b/Source/trigs.cpp index 3a6727682..b8ee8b0ea 100644 --- a/Source/trigs.cpp +++ b/Source/trigs.cpp @@ -65,8 +65,7 @@ void InitTownTriggers() { numtrigs = 0; - trigs[numtrigs]._tx = 25; - trigs[numtrigs]._ty = 29; + trigs[numtrigs].position = { 25, 29 }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; @@ -76,8 +75,7 @@ void InitTownTriggers() if (!gbIsSpawn) { if (gbIsMultiplayer || plr[myplr].pTownWarps & 1 || (gbIsHellfire && plr[myplr]._pLevel >= 10)) { townwarps[0] = true; - trigs[numtrigs]._tx = 49; - trigs[numtrigs]._ty = 21; + trigs[numtrigs].position = { 49, 21 }; trigs[numtrigs]._tmsg = WM_DIABTOWNWARP; trigs[numtrigs]._tlvl = 5; #ifdef _DEBUG @@ -88,30 +86,26 @@ void InitTownTriggers() } if (gbIsMultiplayer || plr[myplr].pTownWarps & 2 || (gbIsHellfire && plr[myplr]._pLevel >= 15)) { townwarps[1] = true; - trigs[numtrigs]._tx = 17; - trigs[numtrigs]._ty = 69; + trigs[numtrigs].position = { 17, 69 }; trigs[numtrigs]._tmsg = WM_DIABTOWNWARP; trigs[numtrigs]._tlvl = 9; numtrigs++; } if (gbIsMultiplayer || plr[myplr].pTownWarps & 4 || (gbIsHellfire && plr[myplr]._pLevel >= 20)) { townwarps[2] = true; - trigs[numtrigs]._tx = 41; - trigs[numtrigs]._ty = 80; + trigs[numtrigs].position = { 41, 80 }; trigs[numtrigs]._tmsg = WM_DIABTOWNWARP; trigs[numtrigs]._tlvl = 13; numtrigs++; } } if (gbIsHellfire) { - trigs[numtrigs]._tx = 80; - trigs[numtrigs]._ty = 62; + trigs[numtrigs].position = { 80, 62 }; trigs[numtrigs]._tmsg = WM_DIABTOWNWARP; trigs[numtrigs]._tlvl = 17; numtrigs++; if (gbIsMultiplayer || quests[Q_GRAVE]._qactive == QUEST_DONE) { - trigs[numtrigs]._tx = 36; - trigs[numtrigs]._ty = 24; + trigs[numtrigs].position = { 36, 24 }; trigs[numtrigs]._tmsg = WM_DIABTOWNWARP; trigs[numtrigs]._tlvl = 21; numtrigs++; @@ -130,14 +124,12 @@ void InitL1Triggers() for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 129) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABPREVLVL; numtrigs++; } if (dPiece[i][j] == 115) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } @@ -147,21 +139,18 @@ void InitL1Triggers() for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 184) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABTWARPUP; trigs[numtrigs]._tlvl = 0; numtrigs++; } if (dPiece[i][j] == 158) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABPREVLVL; numtrigs++; } if (dPiece[i][j] == 126) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } @@ -178,24 +167,21 @@ void InitL2Triggers() numtrigs = 0; for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { - if (dPiece[i][j] == 267 && (i != quests[Q_SCHAMB]._qtx || j != quests[Q_SCHAMB]._qty)) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + if (dPiece[i][j] == 267 && (i != quests[Q_SCHAMB].position.x || j != quests[Q_SCHAMB].position.y)) { + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABPREVLVL; numtrigs++; } if (dPiece[i][j] == 559) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABTWARPUP; trigs[numtrigs]._tlvl = 0; numtrigs++; } if (dPiece[i][j] == 271) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } @@ -213,22 +199,19 @@ void InitL3Triggers() for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 171) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABPREVLVL; numtrigs++; } if (dPiece[i][j] == 168) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } if (dPiece[i][j] == 549) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABTWARPUP; numtrigs++; } @@ -239,22 +222,19 @@ void InitL3Triggers() for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 66) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABPREVLVL; numtrigs++; } if (dPiece[i][j] == 63) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } if (dPiece[i][j] == 80) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABTWARPUP; numtrigs++; } @@ -272,23 +252,20 @@ void InitL4Triggers() for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 83) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABPREVLVL; numtrigs++; } if (dPiece[i][j] == 422) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABTWARPUP; trigs[numtrigs]._tlvl = 0; numtrigs++; } if (dPiece[i][j] == 120) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } @@ -298,8 +275,7 @@ void InitL4Triggers() for (j = 0; j < MAXDUNY; j++) { for (i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] == 370 && quests[Q_BETRAYER]._qactive == QUEST_DONE) { - trigs[numtrigs]._tx = i; - trigs[numtrigs]._ty = j; + trigs[numtrigs].position = { i, j }; trigs[numtrigs]._tmsg = WM_DIABNEXTLVL; numtrigs++; } @@ -312,8 +288,7 @@ void InitSKingTriggers() { trigflag = false; numtrigs = 1; - trigs[0]._tx = 82; - trigs[0]._ty = 42; + trigs[0].position = { 82, 42 }; trigs[0]._tmsg = WM_DIABRTNLVL; } @@ -321,8 +296,7 @@ void InitSChambTriggers() { trigflag = false; numtrigs = 1; - trigs[0]._tx = 70; - trigs[0]._ty = 39; + trigs[0].position = { 70, 39 }; trigs[0]._tmsg = WM_DIABRTNLVL; } @@ -330,8 +304,7 @@ void InitPWaterTriggers() { trigflag = false; numtrigs = 1; - trigs[0]._tx = 30; - trigs[0]._ty = 83; + trigs[0].position = { 30, 83 }; trigs[0]._tmsg = WM_DIABRTNLVL; } @@ -339,8 +312,7 @@ void InitVPTriggers() { trigflag = false; numtrigs = 1; - trigs[0]._tx = 35; - trigs[0]._ty = 32; + trigs[0].position = { 35, 32 }; trigs[0]._tmsg = WM_DIABRTNLVL; } @@ -426,8 +398,8 @@ bool ForceL1Trig() strcpy(infostr, "Up to town"); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABPREVLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -438,8 +410,8 @@ bool ForceL1Trig() sprintf(infostr, "Down to level %i", currlevel + 1); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -451,8 +423,8 @@ bool ForceL1Trig() sprintf(infostr, "Up to Crypt level %i", currlevel - 21); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABPREVLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -467,8 +439,8 @@ bool ForceL1Trig() sprintf(infostr, "Down to Crypt level %i", currlevel - 19); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -479,12 +451,12 @@ bool ForceL1Trig() if (dPiece[cursmx][cursmy] == L5TWarpUpList[i]) { for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABTWARPUP) { - dx = abs(trigs[j]._tx - cursmx); - dy = abs(trigs[j]._ty - cursmy); + dx = abs(trigs[j].position.x - cursmx); + dy = abs(trigs[j].position.y - cursmy); if (dx < 4 && dy < 4) { strcpy(infostr, "Up to town"); - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -505,12 +477,12 @@ bool ForceL2Trig() if (dPiece[cursmx][cursmy] == L2UpList[i]) { for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABPREVLVL) { - dx = abs(trigs[j]._tx - cursmx); - dy = abs(trigs[j]._ty - cursmy); + dx = abs(trigs[j].position.x - cursmx); + dy = abs(trigs[j].position.y - cursmy); if (dx < 4 && dy < 4) { sprintf(infostr, "Up to level %i", currlevel - 1); - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -523,8 +495,8 @@ bool ForceL2Trig() sprintf(infostr, "Down to level %i", currlevel + 1); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -536,12 +508,12 @@ bool ForceL2Trig() if (dPiece[cursmx][cursmy] == L2TWarpUpList[i]) { for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABTWARPUP) { - dx = abs(trigs[j]._tx - cursmx); - dy = abs(trigs[j]._ty - cursmy); + dx = abs(trigs[j].position.x - cursmx); + dy = abs(trigs[j].position.y - cursmy); if (dx < 4 && dy < 4) { strcpy(infostr, "Up to town"); - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -563,8 +535,8 @@ bool ForceL3Trig() sprintf(infostr, "Up to level %i", currlevel - 1); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABPREVLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -577,8 +549,8 @@ bool ForceL3Trig() sprintf(infostr, "Down to level %i", currlevel + 1); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -590,8 +562,8 @@ bool ForceL3Trig() sprintf(infostr, "Up to Nest level %i", currlevel - 17); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABPREVLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -604,8 +576,8 @@ bool ForceL3Trig() sprintf(infostr, "Down to level %i", currlevel - 15); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -618,12 +590,12 @@ bool ForceL3Trig() if (dPiece[cursmx][cursmy] == L3TWarpUpList[i]) { for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABTWARPUP) { - dx = abs(trigs[j]._tx - cursmx); - dy = abs(trigs[j]._ty - cursmy); + dx = abs(trigs[j].position.x - cursmx); + dy = abs(trigs[j].position.y - cursmy); if (dx < 4 && dy < 4) { strcpy(infostr, "Up to town"); - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -636,12 +608,12 @@ bool ForceL3Trig() if (dPiece[cursmx][cursmy] == L6TWarpUpList[i]) { for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABTWARPUP) { - dx = abs(trigs[j]._tx - cursmx); - dy = abs(trigs[j]._ty - cursmy); + dx = abs(trigs[j].position.x - cursmx); + dy = abs(trigs[j].position.y - cursmy); if (dx < 4 && dy < 4) { strcpy(infostr, "Up to town"); - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -662,8 +634,8 @@ bool ForceL4Trig() sprintf(infostr, "Up to level %i", currlevel - 1); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABPREVLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -675,8 +647,8 @@ bool ForceL4Trig() sprintf(infostr, "Down to level %i", currlevel + 1); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -688,12 +660,12 @@ bool ForceL4Trig() if (dPiece[cursmx][cursmy] == L4TWarpUpList[i]) { for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABTWARPUP) { - dx = abs(trigs[j]._tx - cursmx); - dy = abs(trigs[j]._ty - cursmy); + dx = abs(trigs[j].position.x - cursmx); + dy = abs(trigs[j].position.y - cursmy); if (dx < 4 && dy < 4) { strcpy(infostr, "Up to town"); - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -708,8 +680,8 @@ bool ForceL4Trig() strcpy(infostr, "Down to Diablo"); for (j = 0; j < numtrigs; j++) { if (trigs[j]._tmsg == WM_DIABNEXTLVL) { - cursmx = trigs[j]._tx; - cursmy = trigs[j]._ty; + cursmx = trigs[j].position.x; + cursmy = trigs[j].position.y; return true; } } @@ -725,8 +697,8 @@ void Freeupstairs() int i, tx, ty, xx, yy; for (i = 0; i < numtrigs; i++) { - tx = trigs[i]._tx; - ty = trigs[i]._ty; + tx = trigs[i].position.x; + ty = trigs[i].position.y; for (yy = -2; yy <= 2; yy++) { for (xx = -2; xx <= 2; xx++) { @@ -743,8 +715,8 @@ bool ForceSKingTrig() for (i = 0; L1UpList[i] != -1; i++) { if (dPiece[cursmx][cursmy] == L1UpList[i]) { sprintf(infostr, "Back to Level %i", quests[Q_SKELKING]._qlevel); - cursmx = trigs[0]._tx; - cursmy = trigs[0]._ty; + cursmx = trigs[0].position.x; + cursmy = trigs[0].position.y; return true; } @@ -760,8 +732,8 @@ bool ForceSChambTrig() for (i = 0; L2DownList[i] != -1; i++) { if (dPiece[cursmx][cursmy] == L2DownList[i]) { sprintf(infostr, "Back to Level %i", quests[Q_SCHAMB]._qlevel); - cursmx = trigs[0]._tx; - cursmy = trigs[0]._ty; + cursmx = trigs[0].position.x; + cursmy = trigs[0].position.y; return true; } @@ -777,8 +749,8 @@ bool ForcePWaterTrig() for (i = 0; L3DownList[i] != -1; i++) { if (dPiece[cursmx][cursmy] == L3DownList[i]) { sprintf(infostr, "Back to Level %i", quests[Q_PWATER]._qlevel); - cursmx = trigs[0]._tx; - cursmy = trigs[0]._ty; + cursmx = trigs[0].position.x; + cursmy = trigs[0].position.y; return true; } @@ -845,14 +817,14 @@ void CheckTriggers() return; for (int i = 0; i < numtrigs; i++) { - if (plr[myplr].position.current.x != trigs[i]._tx || plr[myplr].position.current.y != trigs[i]._ty) { + if (plr[myplr].position.tile.x != trigs[i].position.x || plr[myplr].position.tile.y != trigs[i].position.y) { continue; } switch (trigs[i]._tmsg) { case WM_DIABNEXTLVL: if (gbIsSpawn && currlevel >= 2) { - NetSendCmdLoc(myplr, true, CMD_WALKXY, plr[myplr].position.current.x, plr[myplr].position.current.y + 1); + NetSendCmdLoc(myplr, true, CMD_WALKXY, plr[myplr].position.tile.x, plr[myplr].position.tile.y + 1); PlaySFX(PS_WARR18); InitDiabloMsg(EMSG_NOT_IN_SHAREWARE); } else { @@ -873,22 +845,22 @@ void CheckTriggers() if (trigs[i]._tlvl == 5 && plr[myplr]._pLevel < 8) { abort = true; - x = plr[myplr].position.current.x; - y = plr[myplr].position.current.y + 1; + x = plr[myplr].position.tile.x; + y = plr[myplr].position.tile.y + 1; abortflag = EMSG_REQUIRES_LVL_8; } if (trigs[i]._tlvl == 9 && plr[myplr]._pLevel < 13) { abort = true; - x = plr[myplr].position.current.x + 1; - y = plr[myplr].position.current.y; + x = plr[myplr].position.tile.x + 1; + y = plr[myplr].position.tile.y; abortflag = EMSG_REQUIRES_LVL_13; } if (trigs[i]._tlvl == 13 && plr[myplr]._pLevel < 17) { abort = true; - x = plr[myplr].position.current.x; - y = plr[myplr].position.current.y + 1; + x = plr[myplr].position.tile.x; + y = plr[myplr].position.tile.y + 1; abortflag = EMSG_REQUIRES_LVL_17; } diff --git a/Source/trigs.h b/Source/trigs.h index 9008e2504..5df5fbcd0 100644 --- a/Source/trigs.h +++ b/Source/trigs.h @@ -5,6 +5,7 @@ */ #pragma once +#include "engine.h" #include "interfac.h" namespace devilution { @@ -12,8 +13,7 @@ namespace devilution { #define MAXTRIGGERS 7 struct TriggerStruct { - int _tx; - int _ty; + Point position; interface_mode _tmsg; int _tlvl; }; diff --git a/test/effects_test.cpp b/test/effects_test.cpp index 09a1a156c..82a913260 100644 --- a/test/effects_test.cpp +++ b/test/effects_test.cpp @@ -7,7 +7,7 @@ using namespace devilution; TEST(Effects, calc_snd_position_center) { - plr[myplr].position.current = { 50, 50 }; + plr[myplr].position.tile = { 50, 50 }; int plVolume = 0; int plPan = 0; EXPECT_EQ(calc_snd_position(50, 50, &plVolume, &plPan), true); @@ -17,7 +17,7 @@ TEST(Effects, calc_snd_position_center) TEST(Effects, calc_snd_position_near) { - plr[myplr].position.current = { 50, 50 }; + plr[myplr].position.tile = { 50, 50 }; int plVolume = 0; int plPan = 0; EXPECT_EQ(calc_snd_position(55, 50, &plVolume, &plPan), true); @@ -27,7 +27,7 @@ TEST(Effects, calc_snd_position_near) TEST(Effects, calc_snd_position_out_of_range) { - plr[myplr].position.current = { 12, 12 }; + plr[myplr].position.tile = { 12, 12 }; int plVolume = 0; int plPan = 0; EXPECT_EQ(calc_snd_position(112, 112, &plVolume, &plPan), false); @@ -37,7 +37,7 @@ TEST(Effects, calc_snd_position_out_of_range) TEST(Effects, calc_snd_position_extream_right) { - plr[myplr].position.current = { 50, 50 }; + plr[myplr].position.tile = { 50, 50 }; int plVolume = 0; int plPan = 0; EXPECT_EQ(calc_snd_position(76, 50, &plVolume, &plPan), false); @@ -47,7 +47,7 @@ TEST(Effects, calc_snd_position_extream_right) TEST(Effects, calc_snd_position_extream_left) { - plr[myplr].position.current = { 50, 50 }; + plr[myplr].position.tile = { 50, 50 }; int plVolume = 0; int plPan = 0; EXPECT_EQ(calc_snd_position(24, 50, &plVolume, &plPan), false); diff --git a/test/writehero_test.cpp b/test/writehero_test.cpp index 2380b10a7..07411a863 100644 --- a/test/writehero_test.cpp +++ b/test/writehero_test.cpp @@ -251,8 +251,8 @@ static void AssertPlayer(PlayerStruct *pPlayer) ASSERT_EQ(CountItems(pPlayer->SpdList, MAXBELTITEMS), 8); ASSERT_EQ(CountItems(&pPlayer->HoldItem, 1), 1); - ASSERT_EQ(pPlayer->position.current.x, 75); - ASSERT_EQ(pPlayer->position.current.y, 68); + ASSERT_EQ(pPlayer->position.tile.x, 75); + ASSERT_EQ(pPlayer->position.tile.y, 68); ASSERT_EQ(pPlayer->position.future.x, 75); ASSERT_EQ(pPlayer->position.future.y, 68); ASSERT_EQ(pPlayer->plrlevel, 0);