Browse Source

♻️Apply point positioning to all remaning entities

pull/1689/head
Anders Jenbo 5 years ago
parent
commit
2bd13451a1
  1. 8
      Source/automap.cpp
  2. 35
      Source/controls/plrctrls.cpp
  3. 40
      Source/cursor.cpp
  4. 4
      Source/debug.cpp
  5. 12
      Source/diablo.cpp
  6. 3
      Source/drlg_l1.cpp
  7. 3
      Source/drlg_l4.cpp
  8. 6
      Source/effects.cpp
  9. 5
      Source/engine.h
  10. 2
      Source/interfac.cpp
  11. 59
      Source/inv.cpp
  12. 38
      Source/items.cpp
  13. 5
      Source/items.h
  14. 71
      Source/lighting.cpp
  15. 18
      Source/lighting.h
  16. 88
      Source/loadsave.cpp
  17. 550
      Source/missiles.cpp
  18. 5
      Source/missiles.h
  19. 542
      Source/monster.cpp
  20. 57
      Source/msg.cpp
  21. 26
      Source/multi.cpp
  22. 359
      Source/objects.cpp
  23. 3
      Source/objects.h
  24. 10
      Source/pack.cpp
  25. 29
      Source/path.cpp
  26. 5
      Source/path.h
  27. 283
      Source/player.cpp
  28. 20
      Source/portal.cpp
  29. 3
      Source/portal.h
  30. 4
      Source/qol.cpp
  31. 46
      Source/quests.cpp
  32. 3
      Source/quests.h
  33. 8
      Source/scrollrt.cpp
  34. 2
      Source/setmaps.cpp
  35. 12
      Source/spells.cpp
  36. 22
      Source/sync.cpp
  37. 2
      Source/themes.cpp
  38. 37
      Source/towners.cpp
  39. 4
      Source/towners.h
  40. 214
      Source/trigs.cpp
  41. 4
      Source/trigs.h
  42. 10
      test/effects_test.cpp
  43. 4
      test/writehero_test.cpp

8
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;

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

40
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;

4
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);

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

3
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) {

3
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;

6
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);

5
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;

2
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();

59
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) {

38
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];

5
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;

71
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);

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

88
Source/loadsave.cpp

@ -219,8 +219,8 @@ static void LoadItemData(LoadHelper *file, ItemStruct *pItem)
pItem->_iCreateInfo = file->nextLE<uint16_t>();
file->skip(2); // Alignment
pItem->_itype = static_cast<item_type>(file->nextLE<uint32_t>());
pItem->_ix = file->nextLE<int32_t>();
pItem->_iy = file->nextLE<int32_t>();
pItem->position.x = file->nextLE<int32_t>();
pItem->position.y = file->nextLE<int32_t>();
pItem->_iAnimFlag = file->nextBool32();
file->skip(4); // Skip pointer _iAnimData
pItem->_iAnimLen = file->nextLE<int32_t>();
@ -324,8 +324,8 @@ static void LoadPlayer(LoadHelper *file, int p)
pPlayer->destParam3 = static_cast<direction>(file->nextLE<int32_t>());
pPlayer->destParam4 = file->nextLE<int32_t>();
pPlayer->plrlevel = file->nextLE<int32_t>();
pPlayer->position.current.x = file->nextLE<int32_t>();
pPlayer->position.current.y = file->nextLE<int32_t>();
pPlayer->position.tile.x = file->nextLE<int32_t>();
pPlayer->position.tile.y = file->nextLE<int32_t>();
pPlayer->position.future.x = file->nextLE<int32_t>();
pPlayer->position.future.y = file->nextLE<int32_t>();
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<uint8_t>();
file->skip(3); // Alignment
pMonster->position.current.x = file->nextLE<int32_t>();
pMonster->position.current.y = file->nextLE<int32_t>();
pMonster->position.tile.x = file->nextLE<int32_t>();
pMonster->position.tile.y = file->nextLE<int32_t>();
pMonster->position.future.x = file->nextLE<int32_t>();
pMonster->position.future.y = file->nextLE<int32_t>();
pMonster->position.old.x = file->nextLE<int32_t>();
@ -642,8 +642,8 @@ static void LoadMissile(LoadHelper *file, int i)
MissileStruct *pMissile = &missile[i];
pMissile->_mitype = file->nextLE<int32_t>();
pMissile->position.current.x = file->nextLE<int32_t>();
pMissile->position.current.y = file->nextLE<int32_t>();
pMissile->position.tile.x = file->nextLE<int32_t>();
pMissile->position.tile.y = file->nextLE<int32_t>();
pMissile->position.offset.x = file->nextLE<int32_t>();
pMissile->position.offset.y = file->nextLE<int32_t>();
pMissile->position.velocity.x = file->nextLE<int32_t>();
@ -693,8 +693,8 @@ static void LoadObject(LoadHelper *file, int i)
ObjectStruct *pObject = &object[i];
pObject->_otype = static_cast<_object_id>(file->nextLE<int32_t>());
pObject->_ox = file->nextLE<int32_t>();
pObject->_oy = file->nextLE<int32_t>();
pObject->position.x = file->nextLE<int32_t>();
pObject->position.y = file->nextLE<int32_t>();
pObject->_oLight = file->nextBool32();
pObject->_oAnimFlag = file->nextLE<uint32_t>();
file->skip(4); // Skip pointer _oAnimData
@ -746,8 +746,8 @@ static void LoadQuest(LoadHelper *file, int i)
pQuest->_qtype = file->nextLE<uint8_t>();
pQuest->_qactive = static_cast<quest_state>(file->nextLE<uint8_t>());
pQuest->_qlvltype = static_cast<dungeon_type>(file->nextLE<uint8_t>());
pQuest->_qtx = file->nextLE<int32_t>();
pQuest->_qty = file->nextLE<int32_t>();
pQuest->position.x = file->nextLE<int32_t>();
pQuest->position.y = file->nextLE<int32_t>();
pQuest->_qslvl = static_cast<_setlevels>(file->nextLE<uint8_t>());
pQuest->_qidx = file->nextLE<uint8_t>();
if (gbIsHellfireSaveGame) {
@ -772,18 +772,18 @@ static void LoadQuest(LoadHelper *file, int i)
static void LoadLighting(LoadHelper *file, LightListStruct *pLight)
{
pLight->_lx = file->nextLE<int32_t>();
pLight->_ly = file->nextLE<int32_t>();
pLight->position.tile.x = file->nextLE<int32_t>();
pLight->position.tile.y = file->nextLE<int32_t>();
pLight->_lradius = file->nextLE<int32_t>();
pLight->_lid = file->nextLE<int32_t>();
pLight->_ldel = file->nextBool32();
pLight->_lunflag = file->nextBool32();
file->skip(4); // Unused
pLight->_lunx = file->nextLE<int32_t>();
pLight->_luny = file->nextLE<int32_t>();
pLight->_lunr = file->nextLE<int32_t>();
pLight->_xoff = file->nextLE<int32_t>();
pLight->_yoff = file->nextLE<int32_t>();
pLight->position.old.x = file->nextLE<int32_t>();
pLight->position.old.y = file->nextLE<int32_t>();
pLight->oldRadious = file->nextLE<int32_t>();
pLight->position.offset.x = file->nextLE<int32_t>();
pLight->position.offset.y = file->nextLE<int32_t>();
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<int32_t>();
pPortal->y = file->nextLE<int32_t>();
pPortal->position.x = file->nextLE<int32_t>();
pPortal->position.y = file->nextLE<int32_t>();
pPortal->level = file->nextLE<int32_t>();
pPortal->ltype = static_cast<dungeon_type>(file->nextLE<int32_t>());
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<int16_t>(pItem->_iCreateInfo);
file->skip(2); // Alignment
file->writeLE<int32_t>(iType);
file->writeLE<int32_t>(pItem->_ix);
file->writeLE<int32_t>(pItem->_iy);
file->writeLE<int32_t>(pItem->position.x);
file->writeLE<int32_t>(pItem->position.y);
file->writeLE<uint32_t>(pItem->_iAnimFlag);
file->skip(4); // Skip pointer _iAnimData
file->writeLE<int32_t>(pItem->_iAnimLen);
@ -1300,8 +1300,8 @@ static void SavePlayer(SaveHelper *file, int p)
file->writeLE<int32_t>(pPlayer->destParam3);
file->writeLE<int32_t>(pPlayer->destParam4);
file->writeLE<int32_t>(pPlayer->plrlevel);
file->writeLE<int32_t>(pPlayer->position.current.x);
file->writeLE<int32_t>(pPlayer->position.current.y);
file->writeLE<int32_t>(pPlayer->position.tile.x);
file->writeLE<int32_t>(pPlayer->position.tile.y);
file->writeLE<int32_t>(pPlayer->position.future.x);
file->writeLE<int32_t>(pPlayer->position.future.y);
@ -1518,8 +1518,8 @@ static void SaveMonster(SaveHelper *file, int i)
file->skip(4); // Unused
file->writeLE<uint8_t>(pMonster->_pathcount);
file->skip(3); // Alignment
file->writeLE<int32_t>(pMonster->position.current.x);
file->writeLE<int32_t>(pMonster->position.current.y);
file->writeLE<int32_t>(pMonster->position.tile.x);
file->writeLE<int32_t>(pMonster->position.tile.y);
file->writeLE<int32_t>(pMonster->position.future.x);
file->writeLE<int32_t>(pMonster->position.future.y);
file->writeLE<int32_t>(pMonster->position.old.x);
@ -1601,8 +1601,8 @@ static void SaveMissile(SaveHelper *file, int i)
MissileStruct *pMissile = &missile[i];
file->writeLE<int32_t>(pMissile->_mitype);
file->writeLE<int32_t>(pMissile->position.current.x);
file->writeLE<int32_t>(pMissile->position.current.y);
file->writeLE<int32_t>(pMissile->position.tile.x);
file->writeLE<int32_t>(pMissile->position.tile.y);
file->writeLE<int32_t>(pMissile->position.offset.x);
file->writeLE<int32_t>(pMissile->position.offset.y);
file->writeLE<int32_t>(pMissile->position.velocity.x);
@ -1652,8 +1652,8 @@ static void SaveObject(SaveHelper *file, int i)
ObjectStruct *pObject = &object[i];
file->writeLE<int32_t>(pObject->_otype);
file->writeLE<int32_t>(pObject->_ox);
file->writeLE<int32_t>(pObject->_oy);
file->writeLE<int32_t>(pObject->position.x);
file->writeLE<int32_t>(pObject->position.y);
file->writeLE<uint32_t>(pObject->_oLight);
file->writeLE<uint32_t>(pObject->_oAnimFlag);
file->skip(4); // Skip pointer _oAnimData
@ -1699,8 +1699,8 @@ static void SaveQuest(SaveHelper *file, int i)
file->writeLE<uint8_t>(pQuest->_qtype);
file->writeLE<uint8_t>(pQuest->_qactive);
file->writeLE<uint8_t>(pQuest->_qlvltype);
file->writeLE<int32_t>(pQuest->_qtx);
file->writeLE<int32_t>(pQuest->_qty);
file->writeLE<int32_t>(pQuest->position.x);
file->writeLE<int32_t>(pQuest->position.y);
file->writeLE<uint8_t>(pQuest->_qslvl);
file->writeLE<uint8_t>(pQuest->_qidx);
if (gbIsHellfire) {
@ -1725,18 +1725,18 @@ static void SaveQuest(SaveHelper *file, int i)
static void SaveLighting(SaveHelper *file, LightListStruct *pLight)
{
file->writeLE<int32_t>(pLight->_lx);
file->writeLE<int32_t>(pLight->_ly);
file->writeLE<int32_t>(pLight->position.tile.x);
file->writeLE<int32_t>(pLight->position.tile.y);
file->writeLE<int32_t>(pLight->_lradius);
file->writeLE<int32_t>(pLight->_lid);
file->writeLE<uint32_t>(pLight->_ldel);
file->writeLE<uint32_t>(pLight->_lunflag);
file->skip(4); // Unused
file->writeLE<int32_t>(pLight->_lunx);
file->writeLE<int32_t>(pLight->_luny);
file->writeLE<int32_t>(pLight->_lunr);
file->writeLE<int32_t>(pLight->_xoff);
file->writeLE<int32_t>(pLight->_yoff);
file->writeLE<int32_t>(pLight->position.old.x);
file->writeLE<int32_t>(pLight->position.old.y);
file->writeLE<int32_t>(pLight->oldRadious);
file->writeLE<int32_t>(pLight->position.offset.x);
file->writeLE<int32_t>(pLight->position.offset.y);
file->writeLE<uint32_t>(pLight->_lflags);
}
@ -1745,8 +1745,8 @@ static void SavePortal(SaveHelper *file, int i)
PortalStruct *pPortal = &portal[i];
file->writeLE<uint32_t>(pPortal->open);
file->writeLE<int32_t>(pPortal->x);
file->writeLE<int32_t>(pPortal->y);
file->writeLE<int32_t>(pPortal->position.x);
file->writeLE<int32_t>(pPortal->position.y);
file->writeLE<int32_t>(pPortal->level);
file->writeLE<int32_t>(pPortal->ltype);
file->writeLE<uint32_t>(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();

550
Source/missiles.cpp

File diff suppressed because it is too large Load Diff

5
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;

542
Source/monster.cpp

File diff suppressed because it is too large Load Diff

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

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

359
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);

3
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;

10
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<int8_t>(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);

29
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);
}

5
Source/path.h

@ -7,6 +7,8 @@
#include <SDL.h>
#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;

283
Source/player.cpp

@ -274,7 +274,7 @@ void PlayerStruct::PlaySpeach(int speachId) const
{
_sfx_id soundEffect = herosounds[static_cast<size_t>(_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) {

20
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;

3
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;

4
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) {

46
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;

3
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;

8
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);
}

2
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);

12
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) {

22
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);

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

37
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<std::size_t>(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;

4
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

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

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

10
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);

4
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);

Loading…
Cancel
Save