Browse Source

Re merge FireballUpdate and MI_Fireball

pull/2678/head
Anders Jenbo 5 years ago
parent
commit
652573a8ce
  1. 115
      Source/missiles.cpp

115
Source/missiles.cpp

@ -674,66 +674,6 @@ bool GuardianTryFireAt(MissileStruct &missile, Point target)
return true;
}
void FireballUpdate(MissileStruct &missile, Displacement offset, bool alwaysDelete)
{
missile._mirange--;
int id = missile._misource;
Point p = (missile._micaster == TARGET_MONSTERS) ? Players[id].position.tile : Monsters[id].position.tile;
if (missile._miAnimType == MFILE_BIGEXP) {
if (missile._mirange == 0) {
missile._miDelFlag = true;
AddUnLight(missile._mlid);
}
} else {
int dam = missile._midam;
missile.position.traveled += offset;
UpdateMissilePos(missile);
if (missile.position.tile != missile.position.start)
CheckMissileCol(missile, dam, dam, false, missile.position.tile, false);
if (missile._mirange == 0) {
Point m = missile.position.tile;
ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame);
constexpr Displacement Pattern[] = { { 0, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 }, { 1, -1 }, { 1, 1 }, { -1, 0 }, { -1, 1 }, { -1, -1 } };
for (auto shift : Pattern) {
if (!CheckBlock(p, m + shift))
CheckMissileCol(missile, dam, dam, false, m + shift, true);
}
if (!TransList[dTransVal[m.x][m.y]]
|| (missile.position.velocity.deltaX < 0 && ((TransList[dTransVal[m.x][m.y + 1]] && nSolidTable[dPiece[m.x][m.y + 1]]) || (TransList[dTransVal[m.x][m.y - 1]] && nSolidTable[dPiece[m.x][m.y - 1]])))) {
missile.position.tile.x++;
missile.position.tile.y++;
missile.position.offset.deltaY -= 32;
}
if (missile.position.velocity.deltaY > 0
&& ((TransList[dTransVal[m.x + 1][m.y]] && nSolidTable[dPiece[m.x + 1][m.y]])
|| (TransList[dTransVal[m.x - 1][m.y]] && nSolidTable[dPiece[m.x - 1][m.y]]))) {
missile.position.offset.deltaY -= 32;
}
if (missile.position.velocity.deltaX > 0
&& ((TransList[dTransVal[m.x][m.y + 1]] && nSolidTable[dPiece[m.x][m.y + 1]])
|| (TransList[dTransVal[m.x][m.y - 1]] && nSolidTable[dPiece[m.x][m.y - 1]]))) {
missile.position.offset.deltaX -= 32;
}
missile._mimfnum = 0;
SetMissAnim(missile, MFILE_BIGEXP);
missile._mirange = missile._miAnimLen - 1;
missile.position.velocity = {};
} else if (missile.position.tile.x != missile._miVar1 || missile.position.tile.y != missile._miVar2) {
missile._miVar1 = missile.position.tile.x;
missile._miVar2 = missile.position.tile.y;
ChangeLight(missile._mlid, missile.position.tile, 8);
}
if (alwaysDelete)
missile._miDelFlag = true;
}
PutMissile(missile);
}
bool GrowWall(int playerId, Point position, Point target, missile_id type, int spellLevel, int damage)
{
int dp = dPiece[position.x][position.y];
@ -3212,7 +3152,60 @@ void MI_Firewall(MissileStruct &missile)
void MI_Fireball(MissileStruct &missile)
{
FireballUpdate(missile, missile.position.velocity, false);
missile._mirange--;
int id = missile._misource;
Point p = (missile._micaster == TARGET_MONSTERS) ? Players[id].position.tile : Monsters[id].position.tile;
if (missile._miAnimType == MFILE_BIGEXP) {
if (missile._mirange == 0) {
missile._miDelFlag = true;
AddUnLight(missile._mlid);
}
} else {
int dam = missile._midam;
missile.position.traveled += missile.position.velocity;
UpdateMissilePos(missile);
if (missile.position.tile != missile.position.start)
CheckMissileCol(missile, dam, dam, false, missile.position.tile, false);
if (missile._mirange == 0) {
Point m = missile.position.tile;
ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame);
constexpr Displacement Pattern[] = { { 0, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 }, { 1, -1 }, { 1, 1 }, { -1, 0 }, { -1, 1 }, { -1, -1 } };
for (auto shift : Pattern) {
if (!CheckBlock(p, m + shift))
CheckMissileCol(missile, dam, dam, false, m + shift, true);
}
if (!TransList[dTransVal[m.x][m.y]]
|| (missile.position.velocity.deltaX < 0 && ((TransList[dTransVal[m.x][m.y + 1]] && nSolidTable[dPiece[m.x][m.y + 1]]) || (TransList[dTransVal[m.x][m.y - 1]] && nSolidTable[dPiece[m.x][m.y - 1]])))) {
missile.position.tile.x++;
missile.position.tile.y++;
missile.position.offset.deltaY -= 32;
}
if (missile.position.velocity.deltaY > 0
&& ((TransList[dTransVal[m.x + 1][m.y]] && nSolidTable[dPiece[m.x + 1][m.y]])
|| (TransList[dTransVal[m.x - 1][m.y]] && nSolidTable[dPiece[m.x - 1][m.y]]))) {
missile.position.offset.deltaY -= 32;
}
if (missile.position.velocity.deltaX > 0
&& ((TransList[dTransVal[m.x][m.y + 1]] && nSolidTable[dPiece[m.x][m.y + 1]])
|| (TransList[dTransVal[m.x][m.y - 1]] && nSolidTable[dPiece[m.x][m.y - 1]]))) {
missile.position.offset.deltaX -= 32;
}
missile._mimfnum = 0;
SetMissAnim(missile, MFILE_BIGEXP);
missile._mirange = missile._miAnimLen - 1;
missile.position.velocity = {};
} else if (missile.position.tile.x != missile._miVar1 || missile.position.tile.y != missile._miVar2) {
missile._miVar1 = missile.position.tile.x;
missile._miVar2 = missile.position.tile.y;
ChangeLight(missile._mlid, missile.position.tile, 8);
}
}
PutMissile(missile);
}
void MI_HorkSpawn(MissileStruct &missile)

Loading…
Cancel
Save