Browse Source

♻️ Apply point types to missiles

pull/1681/head
Anders Jenbo 5 years ago
parent
commit
98cd435fba
  1. 6
      Source/controls/plrctrls.cpp
  2. 36
      Source/cursor.cpp
  3. 42
      Source/loadsave.cpp
  4. 795
      Source/missiles.cpp
  5. 24
      Source/missiles.h
  6. 6
      Source/monster.cpp
  7. 6
      Source/portal.cpp
  8. 6
      Source/scrollrt.cpp

6
Source/controls/plrctrls.cpp

@ -386,8 +386,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]._mix;
int miy = missile[mi]._miy;
int mix = missile[mi].position.current.x;
int miy = missile[mi].position.current.y;
const int newDdistance = GetDistance(mix, miy, 2);
if (newDdistance == 0)
continue;
@ -1243,7 +1243,7 @@ void PerformSecondaryAction()
} else if (pcursobj != -1) {
NetSendCmdLocParam1(true, CMD_OPOBJXY, cursmx, cursmy, pcursobj);
} else if (pcursmissile != -1) {
MakePlrPath(myplr, missile[pcursmissile]._mix, missile[pcursmissile]._miy, true);
MakePlrPath(myplr, missile[pcursmissile].position.current.x, missile[pcursmissile].position.current.y, true);
plr[myplr].destAction = ACTION_WALK;
} else if (pcurstrig != -1) {
MakePlrPath(myplr, trigs[pcurstrig]._tx, trigs[pcurstrig]._ty, true);

36
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]._mix - 1 && cursmy == missile[mx]._miy)
|| (cursmx == missile[mx]._mix && cursmy == missile[mx]._miy - 1)
|| (cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 1)
|| (cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 1)
|| (cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 2)
|| (cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 2)
|| (cursmx == missile[mx]._mix && cursmy == missile[mx]._miy)) {
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)) {
trigflag = true;
ClearPanel();
strcpy(infostr, "Town Portal");
sprintf(tempstr, "from %s", plr[missile[mx]._misource]._pName);
AddPanelString(tempstr, true);
cursmx = missile[mx]._mix;
cursmy = missile[mx]._miy;
cursmx = missile[mx].position.current.x;
cursmy = missile[mx].position.current.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]._mix - 1 && cursmy == missile[mx]._miy)
|| (cursmx == missile[mx]._mix && cursmy == missile[mx]._miy - 1)
|| (cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 1)
|| (cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 1)
|| (cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 2)
|| (cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 2)
|| (cursmx == missile[mx]._mix && cursmy == missile[mx]._miy)) {
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)) {
trigflag = true;
ClearPanel();
strcpy(infostr, "Portal to");
@ -209,8 +209,8 @@ void CheckRportal()
else
strcpy(tempstr, "level 15");
AddPanelString(tempstr, true);
cursmx = missile[mx]._mix;
cursmy = missile[mx]._miy;
cursmx = missile[mx].position.current.x;
cursmy = missile[mx].position.current.y;
}
}
}

42
Source/loadsave.cpp

@ -642,16 +642,16 @@ static void LoadMissile(LoadHelper *file, int i)
MissileStruct *pMissile = &missile[i];
pMissile->_mitype = file->nextLE<int32_t>();
pMissile->_mix = file->nextLE<int32_t>();
pMissile->_miy = file->nextLE<int32_t>();
pMissile->_mixoff = file->nextLE<int32_t>();
pMissile->_miyoff = file->nextLE<int32_t>();
pMissile->_mixvel = file->nextLE<int32_t>();
pMissile->_miyvel = file->nextLE<int32_t>();
pMissile->_misx = file->nextLE<int32_t>();
pMissile->_misy = file->nextLE<int32_t>();
pMissile->_mitxoff = file->nextLE<int32_t>();
pMissile->_mityoff = file->nextLE<int32_t>();
pMissile->position.current.x = file->nextLE<int32_t>();
pMissile->position.current.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>();
pMissile->position.velocity.y = file->nextLE<int32_t>();
pMissile->position.start.x = file->nextLE<int32_t>();
pMissile->position.start.y = file->nextLE<int32_t>();
pMissile->position.traveled.x = file->nextLE<int32_t>();
pMissile->position.traveled.y = file->nextLE<int32_t>();
pMissile->_mimfnum = file->nextLE<int32_t>();
pMissile->_mispllvl = file->nextLE<int32_t>();
pMissile->_miDelFlag = file->nextBool32();
@ -685,7 +685,7 @@ static void LoadMissile(LoadHelper *file, int i)
pMissile->_miVar5 = file->nextLE<int32_t>();
pMissile->_miVar6 = file->nextLE<int32_t>();
pMissile->_miVar7 = file->nextLE<int32_t>();
pMissile->_miVar8 = file->nextLE<int32_t>();
pMissile->_miVar8 = file->nextBool32();
}
static void LoadObject(LoadHelper *file, int i)
@ -1601,16 +1601,16 @@ static void SaveMissile(SaveHelper *file, int i)
MissileStruct *pMissile = &missile[i];
file->writeLE<int32_t>(pMissile->_mitype);
file->writeLE<int32_t>(pMissile->_mix);
file->writeLE<int32_t>(pMissile->_miy);
file->writeLE<int32_t>(pMissile->_mixoff);
file->writeLE<int32_t>(pMissile->_miyoff);
file->writeLE<int32_t>(pMissile->_mixvel);
file->writeLE<int32_t>(pMissile->_miyvel);
file->writeLE<int32_t>(pMissile->_misx);
file->writeLE<int32_t>(pMissile->_misy);
file->writeLE<int32_t>(pMissile->_mitxoff);
file->writeLE<int32_t>(pMissile->_mityoff);
file->writeLE<int32_t>(pMissile->position.current.x);
file->writeLE<int32_t>(pMissile->position.current.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);
file->writeLE<int32_t>(pMissile->position.velocity.y);
file->writeLE<int32_t>(pMissile->position.start.x);
file->writeLE<int32_t>(pMissile->position.start.y);
file->writeLE<int32_t>(pMissile->position.traveled.x);
file->writeLE<int32_t>(pMissile->position.traveled.y);
file->writeLE<int32_t>(pMissile->_mimfnum);
file->writeLE<int32_t>(pMissile->_mispllvl);
file->writeLE<uint32_t>(pMissile->_miDelFlag);

795
Source/missiles.cpp

File diff suppressed because it is too large Load Diff

24
Source/missiles.h

@ -22,18 +22,22 @@ struct ChainStruct {
int _mirange;
};
struct MissilePosition {
/** Tile position */
Point current;
/** Sprite's pixel offset from tile. */
Point offset;
/** Pixel velocity while moving */
Point velocity;
/** Start position */
Point start;
/** Start position */
Point traveled;
};
struct MissileStruct {
int _mitype; // Type of projectile (missile_id)
int _mix; // Tile X-position of the missile
int _miy; // Tile Y-position of the missile
int _mixoff; // Sprite pixel X-offset for the missile
int _miyoff; // Sprite pixel Y-offset for the missile
int _mixvel; // Missile tile X-velocity while walking. This gets added onto _mitxoff each game tick
int _miyvel; // Missile tile Y-velocity while walking. This gets added onto _mitxoff each game tick
int _misx; // Initial tile X-position for missile
int _misy; // Initial tile Y-position for missile
int _mitxoff; // How far the missile has travelled in its lifespan along the X-axis. mix/miy/mxoff/myoff get updated every game tick based on this
int _mityoff; // How far the missile has travelled in its lifespan along the Y-axis. mix/miy/mxoff/myoff get updated every game tick based on this
MissilePosition position;
int _mimfnum; // The direction of the missile (direction enum)
int _mispllvl;
bool _miDelFlag; // Indicate whether the missile should be deleted

6
Source/monster.cpp

@ -5101,8 +5101,8 @@ void MissToMonst(int i, int x, int y)
assurance((DWORD)m < MAXMONSTERS, m);
Monst = &monster[m];
oldx = Miss->_mix;
oldy = Miss->_miy;
oldx = Miss->position.current.x;
oldy = Miss->position.current.y;
dMonster[x][y] = m + 1;
Monst->_mdir = static_cast<direction>(Miss->_mimfnum);
Monst->position.current = { x, y };
@ -5193,7 +5193,7 @@ bool monster_posok(int i, int x, int y)
} else {
for (j = 0; j < nummissiles; j++) {
mi = missileactive[j];
if (missile[mi]._mix == x && missile[mi]._miy == y) {
if (missile[mi].position.current.x == x && missile[mi].position.current.y == y) {
if (missile[mi]._mitype == MIS_FIREWALL) {
fire = true;
break;

6
Source/portal.cpp

@ -55,7 +55,7 @@ void AddWarpMissile(int i, int x, int y)
SetMissDir(mi, 1);
if (currlevel != 0)
missile[mi]._mlid = AddLight(missile[mi]._mix, missile[mi]._miy, 15);
missile[mi]._mlid = AddLight(missile[mi].position.current.x, missile[mi].position.current.y, 15);
missiledata[MIS_TOWN].mlSFX = LS_SENTINEL;
}
@ -119,8 +119,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]._mix][missile[mi]._miy] &= ~BFLAG_MISSILE;
dMissile[missile[mi]._mix][missile[mi]._miy] = 0;
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;
if (portal[id].level != 0)
AddUnLight(missile[mi]._mlid);

6
Source/scrollrt.cpp

@ -266,8 +266,8 @@ void DrawMissilePrivate(const CelOutputBuffer &out, MissileStruct *m, int sx, in
SDL_Log("Draw Missile 2: frame %d of %d, missile type==%d", nCel, frames, m->_mitype);
return;
}
int mx = sx + m->_mixoff - m->_miAnimWidth2;
int my = sy + m->_miyoff;
int mx = sx + m->position.offset.x - m->_miAnimWidth2;
int my = sy + m->position.offset.y;
if (m->_miUniqTrans)
Cl2DrawLightTbl(out, mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, m->_miUniqTrans + 3);
else if (m->_miLightFlag)
@ -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->_mix != x || m->_miy != y)
if (m->position.current.x != x || m->position.current.y != y)
continue;
DrawMissilePrivate(out, m, sx, sy, pre);
}

Loading…
Cancel
Save