Browse Source

♻️ Change 'PosOkPlayer' to take a 'Point' instead of 2 separate ints

pull/2057/head
Juliano Leal Goncalves 5 years ago committed by Anders Jenbo
parent
commit
dd9e05222d
  1. 6
      Source/controls/plrctrls.cpp
  2. 12
      Source/missiles.cpp
  3. 64
      Source/monster.cpp
  4. 10
      Source/monster.h
  5. 6
      Source/path.cpp
  6. 4
      Source/path.h
  7. 60
      Source/player.cpp
  8. 2
      Source/player.h
  9. 25
      Source/spells.cpp

6
Source/controls/plrctrls.cpp

@ -275,7 +275,7 @@ void FindMeleeTarget()
continue;
}
if (!PosOkPlayer(myplr, dx, dy)) {
if (!PosOkPlayer(myplr, { dx, dy })) {
visited[dx][dy] = true;
if (dMonster[dx][dy] != 0) {
@ -1082,7 +1082,7 @@ bool IsPathBlocked(int x, int y, int dir)
if (!nSolidTable[dPiece[d1x][d1y]] && !nSolidTable[dPiece[d2x][d2y]])
return false;
return !PosOkPlayer(myplr, d1x, d1y) && !PosOkPlayer(myplr, d2x, d2y);
return !PosOkPlayer(myplr, { d1x, d1y }) && !PosOkPlayer(myplr, { d2x, d2y });
}
bool CanChangeDirection(const PlayerStruct &player)
@ -1118,7 +1118,7 @@ void WalkInDir(int playerId, AxisDirection dir)
if (CanChangeDirection(player))
player._pdir = pdir;
if (PosOkPlayer(playerId, dx, dy) && IsPathBlocked(x, y, pdir))
if (PosOkPlayer(playerId, { dx, dy }) && IsPathBlocked(x, y, pdir))
return; // Don't start backtrack around obstacles
NetSendCmdLoc(playerId, true, CMD_WALKXY, { dx, dy });

12
Source/missiles.cpp

@ -470,7 +470,7 @@ void MoveMissilePos(int i)
}
x = missile[i].position.tile.x + dx;
y = missile[i].position.tile.y + dy;
if (PosOkMonst(missile[i]._misource, x, y)) {
if (PosOkMonst(missile[i]._misource, { x, y })) {
missile[i].position.tile.x += dx;
missile[i].position.tile.y += dy;
missile[i].position.offset.x += (dy * 32) - (dx * 32);
@ -1992,7 +1992,7 @@ void GetVileMissPos(int mi, int dx, int dy)
yy = j + dy;
for (i = -k; i <= k; i++) {
xx = i + dx;
if (PosOkPlayer(myplr, xx, yy)) {
if (PosOkPlayer(myplr, { xx, yy })) {
missile[mi].position.tile = { xx, yy };
return;
}
@ -2039,7 +2039,7 @@ void AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, int8_t mi
// BUGFIX: should only run magic circle check if dObject[dx][dy] is non-zero.
if (object[pn]._otype == OBJ_MCIRCLE1 || object[pn]._otype == OBJ_MCIRCLE2) {
missile[mi].position.tile = { dx, dy };
if (!PosOkPlayer(myplr, dx, dy))
if (!PosOkPlayer(myplr, { dx, dy }))
GetVileMissPos(mi, dx, dy);
}
}
@ -4620,7 +4620,7 @@ void MI_Rhino(int i)
GetMissilePos(i);
omx = missile[i].position.tile.x;
omy = missile[i].position.tile.y;
if (!PosOkMonst(monst, missile[i].position.tile.x, missile[i].position.tile.y) || (monster[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, mix2, miy2))) {
if (!PosOkMonst(monst, missile[i].position.tile) || (monster[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, { mix2, miy2 }))) {
MissToMonst(i, mix, miy);
missile[i]._miDelFlag = true;
return;
@ -4655,7 +4655,7 @@ void MI_Fireman(int i)
cx = monster[enemy].position.tile.x;
cy = monster[enemy].position.tile.y;
}
if ((bx != ax || by != ay) && ((missile[i]._miVar1 & 1 && (abs(ax - cx) >= 4 || abs(ay - cy) >= 4)) || missile[i]._miVar2 > 1) && PosOkMonst(missile[i]._misource, ax, ay)) {
if ((bx != ax || by != ay) && ((missile[i]._miVar1 & 1 && (abs(ax - cx) >= 4 || abs(ay - cy) >= 4)) || missile[i]._miVar2 > 1) && PosOkMonst(missile[i]._misource, { ax, ay })) {
MissToMonst(i, ax, ay);
missile[i]._miDelFlag = true;
} else if ((monster[src]._mFlags & MFLAG_TARGETS_MONSTER) == 0) {
@ -4663,7 +4663,7 @@ void MI_Fireman(int i)
} else {
j = dMonster[bx][by];
}
if (!PosOkMissile(0, bx, by) || (j > 0 && !(missile[i]._miVar1 & 1))) {
if (!PosOkMissile(0, { bx, by }) || (j > 0 && !(missile[i]._miVar1 & 1))) {
missile[i].position.velocity.x *= -1;
missile[i].position.velocity.y *= -1;
missile[i]._mimfnum = opposite[missile[i]._mimfnum];

64
Source/monster.cpp

@ -2190,7 +2190,7 @@ void M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam)
StartPlrHit(pnum, 0, true);
Point newPosition = plr[pnum].position.tile + monster[i]._mdir;
if (PosOkPlayer(pnum, newPosition.x, newPosition.y)) {
if (PosOkPlayer(pnum, newPosition)) {
plr[pnum].position.tile = newPosition;
FixPlayerLocation(pnum, plr[pnum]._pdir);
FixPlrWalkTags(pnum);
@ -2493,7 +2493,7 @@ void M_Teleport(int i)
x = _mx + rx * j;
y = _my + ry * k;
if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX && x != Monst->position.tile.x && y != Monst->position.tile.y) {
if (PosOkMonst(i, x, y))
if (PosOkMonst(i, { x, y }))
done = true;
}
}
@ -2813,7 +2813,7 @@ bool M_CallWalk(int i, Direction md)
bool M_PathWalk(int i)
{
int8_t path[MAX_PATH_LENGTH];
bool (*Check)(int, int, int);
bool (*Check)(int, Point);
/** Maps from walking path step to facing direction. */
const Direction plr2monst[9] = { DIR_S, DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_E, DIR_S, DIR_W };
@ -3975,7 +3975,7 @@ void MAI_SkelKing(int i)
&& ((dist >= 3 && v < 4 * Monst->_mint + 35) || v < 6)
&& LineClearMissile(Monst->position.tile.x, Monst->position.tile.y, fx, fy)) {
Point newPosition = Monst->position.tile + md;
if (PosOkMonst(i, newPosition.x, newPosition.y) && nummonsters < MAXMONSTERS) {
if (PosOkMonst(i, newPosition) && nummonsters < MAXMONSTERS) {
M_SpawnSkel(newPosition.x, newPosition.y, md);
M_StartSpStand(i, md);
}
@ -4113,7 +4113,7 @@ void MAI_HorkDemon(int i)
if (Monst->_mgoal == 1) {
if ((abs(mx) >= 3 || abs(my) >= 3) && v < 2 * Monst->_mint + 43) {
Point position = Monst->position.tile + Monst->_mdir;
if (PosOkMonst(i, position.x, position.y) && nummonsters < MAXMONSTERS) {
if (PosOkMonst(i, position) && nummonsters < MAXMONSTERS) {
M_StartRSpAttack(i, MIS_HORKDMN, 0);
}
} else if (abs(mx) < 2 && abs(my) < 2) {
@ -4699,7 +4699,7 @@ bool DirOK(int i, Direction mdir)
commitment((DWORD)i < MAXMONSTERS, i);
Point position = monster[i].position.tile;
Point futurePosition = position + mdir;
if (futurePosition.y < 0 || futurePosition.y >= MAXDUNY || futurePosition.x < 0 || futurePosition.x >= MAXDUNX || !PosOkMonst(i, futurePosition.x, futurePosition.y))
if (futurePosition.y < 0 || futurePosition.y >= MAXDUNY || futurePosition.x < 0 || futurePosition.x >= MAXDUNX || !PosOkMonst(i, futurePosition))
return false;
if (mdir == DIR_E) {
if (SolidLoc(position + DIR_SE) || dFlags[position.x + 1][position.y] & BFLAG_MONSTLR)
@ -4744,14 +4744,14 @@ bool DirOK(int i, Direction mdir)
return mcount == monster[i].packsize;
}
bool PosOkMissile(int entity, int x, int y)
bool PosOkMissile(int entity, Point position)
{
return !nMissileTable[dPiece[x][y]] && !(dFlags[x][y] & BFLAG_MONSTLR);
return !nMissileTable[dPiece[position.x][position.y]] && !(dFlags[position.x][position.y] & BFLAG_MONSTLR);
}
bool CheckNoSolid(int entity, int x, int y)
bool CheckNoSolid(int entity, Point position)
{
return !nSolidTable[dPiece[x][y]];
return !nSolidTable[dPiece[position.x][position.y]];
}
bool LineClearSolid(int x1, int y1, int x2, int y2)
@ -4764,7 +4764,7 @@ bool LineClearMissile(int x1, int y1, int x2, int y2)
return LineClear(PosOkMissile, 0, x1, y1, x2, y2);
}
bool LineClear(bool (*Clear)(int, int, int), int entity, int x1, int y1, int x2, int y2)
bool LineClear(bool (*Clear)(int, Point), int entity, int x1, int y1, int x2, int y2)
{
int dx, dy;
int d;
@ -4807,7 +4807,7 @@ bool LineClear(bool (*Clear)(int, int, int), int entity, int x1, int y1, int x2,
y1 += yincD;
}
x1++;
done = ((x1 != xorg || y1 != yorg) && !Clear(entity, x1, y1));
done = ((x1 != xorg || y1 != yorg) && !Clear(entity, { x1, y1 }));
}
} else {
if (dy < 0) {
@ -4839,7 +4839,7 @@ bool LineClear(bool (*Clear)(int, int, int), int entity, int x1, int y1, int x2,
x1 += xincD;
}
y1++;
done = ((y1 != yorg || x1 != xorg) && !Clear(entity, x1, y1));
done = ((y1 != yorg || x1 != xorg) && !Clear(entity, { x1, y1 }));
}
}
return x1 == x2 && y1 == y2;
@ -5109,7 +5109,7 @@ void MissToMonst(int i, int x, int y)
if (plr[pnum]._pmode != PM_GOTHIT && plr[pnum]._pmode != PM_DEATH)
StartPlrHit(pnum, 0, true);
newPosition = oldPosition + Monst->_mdir;
if (PosOkPlayer(pnum, newPosition.x, newPosition.y)) {
if (PosOkPlayer(pnum, newPosition)) {
plr[pnum].position.tile = newPosition;
FixPlayerLocation(pnum, plr[pnum]._pdir);
FixPlrWalkTags(pnum);
@ -5125,7 +5125,7 @@ void MissToMonst(int i, int x, int y)
M_TryM2MHit(m, dMonster[oldPosition.x][oldPosition.y] - 1, 500, Monst->mMinDamage2, Monst->mMaxDamage2);
if (Monst->MType->mtype < MT_NSNAKE || Monst->MType->mtype > MT_GSNAKE) {
newPosition = oldPosition + Monst->_mdir;
if (PosOkMonst(dMonster[oldPosition.x][oldPosition.y] - 1, newPosition.x, newPosition.y)) {
if (PosOkMonst(dMonster[oldPosition.x][oldPosition.y] - 1, newPosition)) {
m = dMonster[oldPosition.x][oldPosition.y];
dMonster[newPosition.x][newPosition.y] = m;
dMonster[oldPosition.x][oldPosition.y] = 0;
@ -5139,19 +5139,19 @@ void MissToMonst(int i, int x, int y)
}
}
bool PosOkMonst(int i, int x, int y)
bool PosOkMonst(int i, Point position)
{
int oi;
bool ret;
ret = !SolidLoc({ x, y }) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;
if (ret && dObject[x][y] != 0) {
oi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);
ret = !SolidLoc(position) && dPlayer[position.x][position.y] == 0 && dMonster[position.x][position.y] == 0;
if (ret && dObject[position.x][position.y] != 0) {
oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1);
if (object[oi]._oSolidFlag)
ret = false;
}
if (ret)
ret = monster_posok(i, x, y);
ret = monster_posok(i, position.x, position.y);
return ret;
}
@ -5196,24 +5196,24 @@ bool monster_posok(int i, int x, int y)
return ret;
}
bool PosOkMonst2(int i, int x, int y)
bool PosOkMonst2(int i, Point position)
{
int oi;
bool ret;
ret = !SolidLoc({ x, y });
if (ret && dObject[x][y] != 0) {
oi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);
ret = !SolidLoc(position);
if (ret && dObject[position.x][position.y] != 0) {
oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1);
if (object[oi]._oSolidFlag)
ret = false;
}
if (ret)
ret = monster_posok(i, x, y);
ret = monster_posok(i, position.x, position.y);
return ret;
}
bool PosOkMonst3(int i, int x, int y)
bool PosOkMonst3(int i, Point position)
{
int oi, objtype;
bool ret, isdoor;
@ -5221,8 +5221,8 @@ bool PosOkMonst3(int i, int x, int y)
ret = true;
isdoor = false;
if (ret && dObject[x][y] != 0) {
oi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);
if (ret && dObject[position.x][position.y] != 0) {
oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1);
objtype = object[oi]._otype;
isdoor = objtype == OBJ_L1LDOOR || objtype == OBJ_L1RDOOR
|| objtype == OBJ_L2LDOOR || objtype == OBJ_L2RDOOR
@ -5232,10 +5232,10 @@ bool PosOkMonst3(int i, int x, int y)
}
}
if (ret) {
ret = (!SolidLoc({ x, y }) || isdoor) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;
ret = (!SolidLoc(position) || isdoor) && dPlayer[position.x][position.y] == 0 && dMonster[position.x][position.y] == 0;
}
if (ret)
ret = monster_posok(i, x, y);
ret = monster_posok(i, position.x, position.y);
return ret;
}
@ -5298,7 +5298,7 @@ bool SpawnSkeleton(int ii, int x, int y)
if (ii == -1)
return false;
if (PosOkMonst(-1, x, y)) {
if (PosOkMonst(-1, { x, y })) {
Direction dir = GetDirection({ x, y }, { x, y }); // TODO useless calculation
ActivateSpawn(ii, x, y, dir);
return true;
@ -5309,7 +5309,7 @@ bool SpawnSkeleton(int ii, int x, int y)
for (j = y - 1; j <= y + 1; j++) {
xx = 0;
for (k = x - 1; k <= x + 1; k++) {
monstok[xx][yy] = PosOkMonst(-1, k, j);
monstok[xx][yy] = PosOkMonst(-1, { k, j });
savail |= monstok[xx][yy];
xx++;
}

10
Source/monster.h

@ -274,20 +274,20 @@ void DeleteMonsterList();
void ProcessMonsters();
void FreeMonsters();
bool DirOK(int i, Direction mdir);
bool PosOkMissile(int entity, int x, int y);
bool PosOkMissile(int entity, Point position);
bool LineClearSolid(int x1, int y1, int x2, int y2);
bool LineClearMissile(int x1, int y1, int x2, int y2);
bool LineClear(int x1, int y1, int x2, int y2);
bool LineClear(bool (*Clear)(int, int, int), int entity, int x1, int y1, int x2, int y2);
bool LineClear(bool (*Clear)(int, Point), int entity, int x1, int y1, int x2, int y2);
void SyncMonsterAnim(int i);
void M_FallenFear(int x, int y);
void PrintMonstHistory(int mt);
void PrintUniqueHistory();
void MissToMonst(int i, int x, int y);
bool PosOkMonst(int i, int x, int y);
bool PosOkMonst(int i, Point position);
bool monster_posok(int i, int x, int y);
bool PosOkMonst2(int i, int x, int y);
bool PosOkMonst3(int i, int x, int y);
bool PosOkMonst2(int i, Point position);
bool PosOkMonst3(int i, Point position);
bool IsSkel(int mt);
bool IsGoat(int mt);
int M_SpawnSkel(int x, int y, Direction dir);

6
Source/path.cpp

@ -51,7 +51,7 @@ int8_t path_directions[9] = { 5, 1, 6, 2, 0, 3, 8, 4, 7 };
* check that each step is a valid position. Store the step directions (see
* path_directions) in path, which must have room for 24 steps
*/
int FindPath(bool (*PosOk)(int, int, int), int PosOkArg, int sx, int sy, int dx, int dy, int8_t path[MAX_PATH_LENGTH])
int FindPath(bool (*PosOk)(int, Point), int PosOkArg, int sx, int sy, int dx, int dy, int8_t path[MAX_PATH_LENGTH])
{
PATHNODE *path_start, *next_node, *current;
int path_length, i;
@ -178,7 +178,7 @@ bool path_solid_pieces(PATHNODE *pPath, int dx, int dy)
*
* @return false if we ran out of preallocated nodes to use, else true
*/
bool path_get_path(bool (*PosOk)(int, int, int), int PosOkArg, PATHNODE *pPath, int x, int y)
bool path_get_path(bool (*PosOk)(int, Point), int PosOkArg, PATHNODE *pPath, int x, int y)
{
int dx, dy;
int i;
@ -187,7 +187,7 @@ bool path_get_path(bool (*PosOk)(int, int, int), int PosOkArg, PATHNODE *pPath,
for (i = 0; i < 8; i++) {
dx = pPath->position.x + pathxdir[i];
dy = pPath->position.y + pathydir[i];
ok = PosOk(PosOkArg, dx, dy);
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))
return false;

4
Source/path.h

@ -23,11 +23,11 @@ struct PATHNODE {
struct PATHNODE *NextNode;
};
int FindPath(bool (*PosOk)(int, int, int), int PosOkArg, int sx, int sy, int dx, int dy, int8_t path[MAX_PATH_LENGTH]);
int FindPath(bool (*PosOk)(int, Point), int PosOkArg, int sx, int sy, int dx, int dy, int8_t path[MAX_PATH_LENGTH]);
int path_get_h_cost(int sx, int sy, int dx, int dy);
PATHNODE *GetNextPath();
bool path_solid_pieces(PATHNODE *pPath, int dx, int dy);
bool path_get_path(bool (*PosOk)(int, int, int), int PosOkArg, PATHNODE *pPath, int x, int y);
bool path_get_path(bool (*PosOk)(int, Point), int PosOkArg, PATHNODE *pPath, int x, int y);
bool path_parent_path(PATHNODE *pPath, int dx, int dy, int sx, int sy);
PATHNODE *path_get_node1(int dx, int dy);
PATHNODE *path_get_node2(int dx, int dy);

60
Source/player.cpp

@ -1053,7 +1053,7 @@ void InitPlayer(int pnum, bool FirstTime)
player.position.tile = { ViewX, ViewY };
}
} else {
for (i = 0; i < 8 && !PosOkPlayer(pnum, plrxoff2[i] + player.position.tile.x, plryoff2[i] + player.position.tile.y); i++)
for (i = 0; i < 8 && !PosOkPlayer(pnum, Point { plrxoff2[i], plryoff2[i] } + player.position.tile); i++)
;
player.position.tile.x += plrxoff2[i];
player.position.tile.y += plryoff2[i];
@ -1140,7 +1140,7 @@ bool PlrDirOK(int pnum, Direction dir)
Point position = player.position.tile;
Point futurePosition = position + dir;
if (futurePosition.x < 0 || !dPiece[futurePosition.x][futurePosition.y] || !PosOkPlayer(pnum, futurePosition.x, futurePosition.y)) {
if (futurePosition.x < 0 || !dPiece[futurePosition.x][futurePosition.y] || !PosOkPlayer(pnum, futurePosition)) {
return false;
}
@ -3503,21 +3503,21 @@ void ClrPlrPath(PlayerStruct &player)
memset(player.walkpath, WALK_NONE, sizeof(player.walkpath));
}
bool PosOkPlayer(int pnum, int x, int y)
bool PosOkPlayer(int pnum, Point position)
{
int8_t p, bv;
if (x < 0 || x >= MAXDUNX || y < 0 || y >= MAXDUNY)
if (position.x < 0 || position.x >= MAXDUNX || position.y < 0 || position.y >= MAXDUNY)
return false;
if (dPiece[x][y] == 0)
if (dPiece[position.x][position.y] == 0)
return false;
if (SolidLoc({ x, y }))
if (SolidLoc(position))
return false;
if (dPlayer[x][y] != 0) {
if (dPlayer[x][y] > 0) {
p = dPlayer[x][y] - 1;
if (dPlayer[position.x][position.y] != 0) {
if (dPlayer[position.x][position.y] > 0) {
p = dPlayer[position.x][position.y] - 1;
} else {
p = -(dPlayer[x][y] + 1);
p = -(dPlayer[position.x][position.y] + 1);
}
if (p != pnum
&& p >= 0
@ -3527,23 +3527,23 @@ bool PosOkPlayer(int pnum, int x, int y)
}
}
if (dMonster[x][y] != 0) {
if (dMonster[position.x][position.y] != 0) {
if (currlevel == 0) {
return false;
}
if (dMonster[x][y] <= 0) {
if (dMonster[position.x][position.y] <= 0) {
return false;
}
if ((monster[dMonster[x][y] - 1]._mhitpoints >> 6) > 0) {
if ((monster[dMonster[position.x][position.y] - 1]._mhitpoints >> 6) > 0) {
return false;
}
}
if (dObject[x][y] != 0) {
if (dObject[x][y] > 0) {
bv = dObject[x][y] - 1;
if (dObject[position.x][position.y] != 0) {
if (dObject[position.x][position.y] > 0) {
bv = dObject[position.x][position.y] - 1;
} else {
bv = -(dObject[x][y] + 1);
bv = -(dObject[position.x][position.y] + 1);
}
if (object[bv]._oSolidFlag) {
return false;
@ -3712,7 +3712,7 @@ void SyncPlrAnim(int pnum)
void SyncInitPlrPos(int pnum)
{
int x, y, xx, yy, range;
int xx, yy, range;
DWORD i;
bool posOk;
@ -3722,22 +3722,22 @@ void SyncInitPlrPos(int pnum)
return;
}
Point position = {};
for (i = 0; i < 8; i++) {
x = player.position.tile.x + plrxoff2[i];
y = player.position.tile.y + plryoff2[i];
if (PosOkPlayer(pnum, x, y)) {
position = player.position.tile + Point { plrxoff2[i], plryoff2[i] };
if (PosOkPlayer(pnum, position)) {
break;
}
}
if (!PosOkPlayer(pnum, x, y)) {
if (!PosOkPlayer(pnum, position)) {
posOk = false;
for (range = 1; range < 50 && !posOk; range++) {
for (yy = -range; yy <= range && !posOk; yy++) {
y = yy + player.position.tile.y;
position.y = yy + player.position.tile.y;
for (xx = -range; xx <= range && !posOk; xx++) {
x = xx + player.position.tile.x;
if (PosOkPlayer(pnum, x, y) && !PosOkPortal(currlevel, x, y)) {
position.x = xx + player.position.tile.x;
if (PosOkPlayer(pnum, position) && !PosOkPortal(currlevel, position.x, position.y)) {
posOk = true;
}
}
@ -3745,13 +3745,13 @@ void SyncInitPlrPos(int pnum)
}
}
player.position.tile = { x, y };
dPlayer[x][y] = pnum + 1;
player.position.tile = position;
dPlayer[position.x][position.y] = pnum + 1;
if (pnum == myplr) {
player.position.future = { x, y };
ViewX = x;
ViewY = y;
player.position.future = position;
ViewX = position.x;
ViewY = position.y;
}
}

2
Source/player.h

@ -449,7 +449,7 @@ void RestartTownLvl(int pnum);
void StartWarpLvl(int pnum, int pidx);
void ProcessPlayers();
void ClrPlrPath(PlayerStruct &player);
bool PosOkPlayer(int pnum, int x, int y);
bool PosOkPlayer(int pnum, Point position);
void MakePlrPath(int pnum, Point targetPosition, bool endspace);
void CheckPlrSpell();
void SyncPlrAnim(int pnum);

25
Source/spells.cpp

@ -212,31 +212,30 @@ void CastSpell(int id, int spl, int sx, int sy, int dx, int dy, int spllvl)
static void PlacePlayer(int pnum)
{
int nx, ny, max, min, x, y;
int max, min, x, y;
DWORD i;
bool done;
Point newPosition = {};
if (plr[pnum].plrlevel == currlevel) {
for (i = 0; i < 8; i++) {
nx = plr[pnum].position.tile.x + plrxoff2[i];
ny = plr[pnum].position.tile.y + plryoff2[i];
if (PosOkPlayer(pnum, nx, ny)) {
newPosition = plr[pnum].position.tile + Point { plrxoff2[i], plryoff2[i] };
if (PosOkPlayer(pnum, newPosition)) {
break;
}
}
if (!PosOkPlayer(pnum, nx, ny)) {
if (!PosOkPlayer(pnum, newPosition)) {
done = false;
for (max = 1, min = -1; min > -50 && !done; max++, min--) {
for (y = min; y <= max && !done; y++) {
ny = plr[pnum].position.tile.y + y;
newPosition.y = plr[pnum].position.tile.y + y;
for (x = min; x <= max && !done; x++) {
nx = plr[pnum].position.tile.x + x;
newPosition.x = plr[pnum].position.tile.x + x;
if (PosOkPlayer(pnum, nx, ny)) {
if (PosOkPlayer(pnum, newPosition)) {
done = true;
}
}
@ -244,13 +243,13 @@ static void PlacePlayer(int pnum)
}
}
plr[pnum].position.tile = { nx, ny };
plr[pnum].position.tile = newPosition;
dPlayer[nx][ny] = pnum + 1;
dPlayer[newPosition.x][newPosition.y] = pnum + 1;
if (pnum == myplr) {
ViewX = nx;
ViewY = ny;
ViewX = newPosition.x;
ViewY = newPosition.y;
}
}
}

Loading…
Cancel
Save