Well, as far as I can see, the fix would be the following in CDbRoom::ExpandExplosion:
wTileNo = GetFSquare(wX,wY);
for (UINT o = 0; o < ORIENTATION_COUNT; ++o)
{
if (o == NO_ORIENTATION) continue;
const int oX = nGetOX(o);
const int oY = nGetOY(o);
if ((oBlastX == 0 || (oBlastX * oX) > 0) &&
(oBlastY == 0 || (oBlastY * oY) > 0))
{
//Valid direction. Check if arrow blocks it
if (bIsArrow(wTileNo) && bIsArrowObstacle(wTileNo, o)) continue;
//Otherwise, add to list.
cs.Push(wX + oX, wY + oY);
}
}
We should probably do something about the old fix (which was the addition of a Range 1 check after the BOMB_RADIUS check), but it can't just be outright removed - it's what's currently making sure Fegundo explosions obey the force arrows. Of course, if we let Fegundos have their own check in CPhoenix::Explode:
CDbRoom& room = *(this->pCurrentGame->pRoom);
UINT wTileNo = room.GetFSquare(this->wX,this->wY);
for (int y = -1; y <= 1; ++y)
for (int x = -1; x <= 1; ++x)
{
//Make sure we obey Force Arrows
if (bIsArrow(wTileNo) && bIsArrowObstacle(wTileNo,nGetO(x,y))) continue;
this->pCurrentGame->pRoom->ExpandExplosion(CueEvents, coords, this->wX, this->wY,
this->wX + x, this->wY + y, bombs, explosion);
}
But that might be complicating the issue... unsure.
I've tested both changes quickly, and I'm not seeing any problems... though some things have a rather nasty way of hiding in rather complex interactions. The logic seems sound though.