Skip to content

Commit 6197988

Browse files
committed
fix visibility and stuff vis-a-vis bigwalls.
1 parent de35cba commit 6197988

2 files changed

Lines changed: 108 additions & 58 deletions

File tree

src/Battlescape/TileEngine.cpp

Lines changed: 107 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1442,23 +1442,23 @@ int TileEngine::horizontalBlockage(Tile *startTile, Tile *endTile, ItemDamageTyp
14421442
if (type == DT_NONE) //this is two-way diagonal visiblity check, used in original game
14431443
{
14441444
block = blockage(startTile, MapData::O_NORTHWALL, type) + blockage(endTile, MapData::O_WESTWALL, type); //up+right
1445-
block += blockage(_save->getTile(startTile->getPosition() + oneTileNorth), MapData::O_OBJECT, type);
1445+
block += blockage(_save->getTile(startTile->getPosition() + oneTileNorth), MapData::O_OBJECT, type, direction);
14461446
if (block == 0) break; //this way is opened
14471447
block = blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_NORTHWALL, type)
14481448
+ blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_WESTWALL, type); //right+up
1449-
block += blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_OBJECT, type);
1449+
block += blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_OBJECT, type, direction);
14501450
}
14511451
else
14521452
{
14531453
block = (blockage(startTile,MapData::O_NORTHWALL, type) + blockage(endTile,MapData::O_WESTWALL, type))/2
14541454
+ (blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_WESTWALL, type)
14551455
+ blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_NORTHWALL, type))/2;
14561456
if (type == DT_HE)
1457-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type) +
1458-
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type))/2;
1457+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type, direction) +
1458+
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type, direction))/2;
14591459
else
1460-
block = (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type) +
1461-
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type)) < 510?0:255;
1460+
block = (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type, direction) +
1461+
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type, direction)) < 510?0:255;
14621462
}
14631463
break;
14641464
case 2: // east
@@ -1469,23 +1469,23 @@ int TileEngine::horizontalBlockage(Tile *startTile, Tile *endTile, ItemDamageTyp
14691469
{
14701470
block = blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_NORTHWALL, type)
14711471
+ blockage(endTile, MapData::O_WESTWALL, type); //down+right
1472-
block += blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_OBJECT, type);
1472+
block += blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_OBJECT, type, direction);
14731473
if (block == 0) break; //this way is opened
14741474
block = blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_WESTWALL, type)
14751475
+ blockage(endTile, MapData::O_NORTHWALL, type); //right+down
1476-
block += blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_OBJECT, type);
1476+
block += blockage(_save->getTile(startTile->getPosition() + oneTileEast), MapData::O_OBJECT, type, direction);
14771477
}
14781478
else
14791479
{
14801480
block = (blockage(endTile,MapData::O_WESTWALL, type) + blockage(endTile,MapData::O_NORTHWALL, type))/2
14811481
+ (blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_WESTWALL, type)
14821482
+ blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_NORTHWALL, type))/2;
14831483
if (type == DT_HE)
1484-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type) +
1485-
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type))/2;
1484+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type, direction) +
1485+
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type, direction))/2;
14861486
else
1487-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type) +
1488-
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type)) < 510?0:255;
1487+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type, direction) +
1488+
blockage(_save->getTile(startTile->getPosition() + oneTileEast),MapData::O_OBJECT, type, direction)) < 510?0:255;
14891489
}
14901490
break;
14911491
case 4: // south
@@ -1496,60 +1496,61 @@ int TileEngine::horizontalBlockage(Tile *startTile, Tile *endTile, ItemDamageTyp
14961496
{
14971497
block = blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_NORTHWALL, type)
14981498
+ blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_WESTWALL, type); //down+left
1499-
block += blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_OBJECT, type);
1499+
block += blockage(_save->getTile(startTile->getPosition() + oneTileSouth), MapData::O_OBJECT, type, direction);
15001500
if (block == 0) break; //this way is opened
15011501
block = blockage(startTile, MapData::O_WESTWALL, type) + blockage(endTile, MapData::O_NORTHWALL, type); //left+down
1502-
block += blockage(_save->getTile(startTile->getPosition() + oneTileWest), MapData::O_OBJECT, type);
1502+
block += blockage(_save->getTile(startTile->getPosition() + oneTileWest), MapData::O_OBJECT, type, direction);
15031503
}
15041504
else
15051505
{
15061506
block = (blockage(endTile,MapData::O_NORTHWALL, type) + blockage(startTile,MapData::O_WESTWALL, type))/2
15071507
+ (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_WESTWALL, type)
15081508
+ blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_NORTHWALL, type))/2;
15091509
if (type == DT_HE)
1510-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type) +
1511-
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type))/2;
1510+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type, direction) +
1511+
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type, direction))/2;
15121512
else
1513-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type) +
1514-
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type)) < 510?0:255;
1513+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileSouth),MapData::O_OBJECT, type, direction) +
1514+
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type, direction)) < 510?0:255;
15151515
}
15161516
break;
15171517
case 6: // west
15181518
block = blockage(startTile,MapData::O_WESTWALL, type);
15191519
break;
15201520
case 7: // north west
1521+
15211522
if (type == DT_NONE)
15221523
{
15231524
block = blockage(startTile, MapData::O_NORTHWALL, type)
15241525
+ blockage(_save->getTile(startTile->getPosition() + oneTileNorth), MapData::O_WESTWALL, type); //up+left
1525-
block += blockage(_save->getTile(startTile->getPosition() + oneTileNorth), MapData::O_OBJECT, type);
1526+
block += blockage(_save->getTile(startTile->getPosition() + oneTileNorth), MapData::O_OBJECT, type, direction);
15261527
if (block == 0) break; //this way is opened
15271528
block = blockage(startTile, MapData::O_WESTWALL, type)
15281529
+ blockage(_save->getTile(startTile->getPosition() + oneTileWest), MapData::O_NORTHWALL, type); //left+up
1529-
block += blockage(_save->getTile(startTile->getPosition() + oneTileWest), MapData::O_OBJECT, type);
1530+
block += blockage(_save->getTile(startTile->getPosition() + oneTileWest), MapData::O_OBJECT, type, direction);
15301531
}
15311532
else
15321533
{
15331534
block = (blockage(startTile,MapData::O_WESTWALL, type) + blockage(startTile,MapData::O_NORTHWALL, type))/2
15341535
+ (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_WESTWALL, type)
15351536
+ blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_NORTHWALL, type))/2;
15361537
if (type == DT_HE)
1537-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type) +
1538-
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type))/2;
1538+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type, direction) +
1539+
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type, direction))/2;
15391540
else
1540-
block += (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type) +
1541-
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type)) < 510?0:255;
1541+
block += (blockage(_save->getTile(startTile->getPosition() + oneTileNorth),MapData::O_OBJECT, type, direction) +
1542+
blockage(_save->getTile(startTile->getPosition() + oneTileWest),MapData::O_OBJECT, type, direction)) < 510?0:255;
15421543
}
15431544
break;
15441545
}
15451546

15461547
if (type != DT_NONE)
15471548
{
1548-
block += blockage(endTile,MapData::O_OBJECT, type);
1549+
block += blockage(endTile,MapData::O_OBJECT, type, direction);
15491550
}
15501551
else
15511552
{
1552-
block += blockage(startTile,MapData::O_OBJECT, type);
1553+
block += blockage(startTile,MapData::O_OBJECT, type, direction);
15531554
}
15541555

15551556
return block;
@@ -1564,42 +1565,91 @@ int TileEngine::horizontalBlockage(Tile *startTile, Tile *endTile, ItemDamageTyp
15641565
* @param type The type of power/damage.
15651566
* @return amount of blockage
15661567
*/
1567-
int TileEngine::blockage(Tile *tile, const int part, ItemDamageType type)
1568+
int TileEngine::blockage(Tile *tile, const int part, ItemDamageType type, int direction)
15681569
{
15691570
int blockage = 0;
15701571

15711572
if (tile == 0) return 0; // probably outside the map here
1572-
bool gotPart = tile->getMapData(part);
1573-
if (!gotPart && part == MapData::O_WESTWALL)
1574-
{
1575-
if (tile->getMapData(MapData::O_OBJECT) &&
1576-
tile->getMapData(MapData::O_OBJECT)->getBigWall() == Pathfinding::BIGWALLWEST)
1577-
blockage += tile->getMapData(MapData::O_OBJECT)->getBlock(type);
1578-
Tile *tileWest = _save->getTile(tile->getPosition() + Position(-1, 0, 0));
1579-
if (tileWest->getMapData(MapData::O_OBJECT) &&
1580-
(tileWest->getMapData(MapData::O_OBJECT)->getBigWall() == Pathfinding::BIGWALLEAST ||
1581-
tileWest->getMapData(MapData::O_OBJECT)->getBigWall() == Pathfinding::BIGWALLEASTANDSOUTH))
1582-
blockage += tileWest->getMapData(MapData::O_OBJECT)->getBlock(type);
1583-
}
1584-
if (!gotPart && part == MapData::O_NORTHWALL)
1585-
{
1586-
if (tile->getMapData(MapData::O_OBJECT) &&
1587-
tile->getMapData(MapData::O_OBJECT)->getBigWall() == Pathfinding::BIGWALLNORTH)
1588-
blockage += tile->getMapData(MapData::O_OBJECT)->getBlock(type);
1589-
Tile *tileNorth = _save->getTile(tile->getPosition() + Position(0, -1, 0));
1590-
if (tileNorth->getMapData(MapData::O_OBJECT) &&
1591-
(tileNorth->getMapData(MapData::O_OBJECT)->getBigWall() == Pathfinding::BIGWALLSOUTH ||
1592-
tileNorth->getMapData(MapData::O_OBJECT)->getBigWall() == Pathfinding::BIGWALLEASTANDSOUTH))
1593-
blockage += tileNorth->getMapData(MapData::O_OBJECT)->getBlock(type);
1594-
}
1595-
if (gotPart && part == MapData::O_OBJECT)
1596-
{
1597-
if (tile->getMapData(MapData::O_OBJECT)->getBigWall() <= Pathfinding::BIGWALLNWSE)
1598-
blockage += tile->getMapData(MapData::O_OBJECT)->getBlock(type);
1599-
}
1600-
else if (gotPart)
1573+
if (tile->getMapData(part))
16011574
{
1602-
blockage += tile->getMapData(part)->getBlock(type);
1575+
bool check = true;
1576+
if (direction != -1)
1577+
{
1578+
int wall = tile->getMapData(MapData::O_OBJECT)->getBigWall();
1579+
switch (direction)
1580+
{
1581+
case 0: // north
1582+
if (wall == Pathfinding::BIGWALLWEST ||
1583+
wall == Pathfinding::BIGWALLEAST ||
1584+
wall == Pathfinding::BIGWALLSOUTH ||
1585+
wall == Pathfinding::BIGWALLEASTANDSOUTH)
1586+
{
1587+
check = false;
1588+
}
1589+
break;
1590+
case 1: // north east
1591+
if (wall == Pathfinding::BIGWALLWEST ||
1592+
wall == Pathfinding::BIGWALLSOUTH)
1593+
{
1594+
check = false;
1595+
}
1596+
break;
1597+
case 2: // east
1598+
if (wall == Pathfinding::BIGWALLNORTH ||
1599+
wall == Pathfinding::BIGWALLSOUTH ||
1600+
wall == Pathfinding::BIGWALLWEST)
1601+
{
1602+
check = false;
1603+
}
1604+
break;
1605+
case 3: // south east
1606+
if (wall == Pathfinding::BIGWALLNORTH ||
1607+
wall == Pathfinding::BIGWALLWEST)
1608+
{
1609+
check = false;
1610+
}
1611+
break;
1612+
case 4: // south
1613+
if (wall == Pathfinding::BIGWALLWEST ||
1614+
wall == Pathfinding::BIGWALLEAST ||
1615+
wall == Pathfinding::BIGWALLNORTH)
1616+
{
1617+
check = false;
1618+
}
1619+
break;
1620+
case 5: // south west
1621+
if (wall == Pathfinding::BIGWALLNORTH ||
1622+
wall == Pathfinding::BIGWALLEAST)
1623+
{
1624+
check = false;
1625+
}
1626+
break;
1627+
case 6: // west
1628+
if (wall == Pathfinding::BIGWALLNORTH ||
1629+
wall == Pathfinding::BIGWALLSOUTH ||
1630+
wall == Pathfinding::BIGWALLEAST ||
1631+
wall == Pathfinding::BIGWALLEASTANDSOUTH)
1632+
{
1633+
check = false;
1634+
}
1635+
break;
1636+
case 7: // north east
1637+
if (wall == Pathfinding::BIGWALLSOUTH ||
1638+
wall == Pathfinding::BIGWALLWEST ||
1639+
wall == Pathfinding::BIGWALLEASTANDSOUTH)
1640+
{
1641+
check = false;
1642+
}
1643+
break;
1644+
default:
1645+
break;
1646+
}
1647+
}
1648+
1649+
if (check)
1650+
{
1651+
blockage += tile->getMapData(part)->getBlock(type);
1652+
}
16031653
}
16041654

16051655
// open ufo doors are actually still closed behind the scenes

src/Battlescape/TileEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class TileEngine
4747
std::vector<Uint16> *_voxelData;
4848
static const int heightFromCenter[11];
4949
void addLight(const Position &center, int power, int layer);
50-
int blockage(Tile *tile, const int part, ItemDamageType type);
50+
int blockage(Tile *tile, const int part, ItemDamageType type, int direction = -1);
5151
int vectorToDirection(const Position &vector);
5252
bool _personalLighting;
5353
public:

0 commit comments

Comments
 (0)