@@ -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
0 commit comments