bool PassableFromToTile(const Heroes* hero, const s32 & from, const s32 & to, const Direction::vector_t & direct, const s32 & dst) { const Maps::Tiles & fromTile = world.GetTiles(from); const Maps::Tiles & toTile = world.GetTiles(to); // check start point if(hero && hero->GetIndex() == from) { if(MP2::isActionObject(fromTile.GetObject(false), hero->isShipMaster())) { // check direct from object if(! (direct & fromTile.GetPassable())) return false; } else { // check from tile direct if(! fromTile.isPassable(hero, direct, false)) return false; } } else { if(MP2::isActionObject(fromTile.GetObject(), (hero ? hero->isShipMaster() : false))) { // check direct from object if(! (direct & fromTile.GetPassable())) return false; } else { // check from tile direct if(! fromTile.isPassable(hero, direct, false)) return false; } } return PassableToTile(hero, toTile, direct, dst); }
bool PassableFromToTile(const Heroes & hero, s32 from, const s32 & to, int direct, s32 dst) { const Maps::Tiles & fromTile = world.GetTiles(from); const Maps::Tiles & toTile = world.GetTiles(to); // check start point if(hero.GetIndex() == from) { if(MP2::isActionObject(fromTile.GetObject(false), hero.isShipMaster())) { // check direct from object if(! (direct & fromTile.GetPassable())) return false; } else { // check from tile direct if(! fromTile.isPassable(&hero, direct, (hero.isControlAI() ? AI::HeroesSkipFog() : false))) return false; } } else { if(MP2::isActionObject(fromTile.GetObject(), hero.isShipMaster())) { // check direct from object if(! (direct & fromTile.GetPassable())) return false; } else { // check from tile direct if(! fromTile.isPassable(&hero, direct, (hero.isControlAI() ? AI::HeroesSkipFog() : false))) return false; } } if(fromTile.isWater() && !toTile.isWater()) { switch(toTile.GetObject()) { case MP2::OBJ_BOAT: case MP2::OBJ_MONSTER: case MP2::OBJ_HEROES: return false; case MP2::OBJ_COAST: return toTile.GetIndex() == dst; default: break; } } else if(!fromTile.isWater() && toTile.isWater()) { switch(toTile.GetObject()) { case MP2::OBJ_BOAT: return true; case MP2::OBJ_HEROES: return toTile.GetIndex() == dst; default: break; } } // check corner water/coast if(hero.isShipMaster() && (direct & (Direction::TOP_LEFT | Direction::TOP_RIGHT | Direction::BOTTOM_RIGHT | Direction::BOTTOM_LEFT))) { switch(direct) { case Direction::TOP_LEFT: if((Maps::isValidDirection(from, Direction::TOP) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::TOP)).isWater()) || (Maps::isValidDirection(from, Direction::LEFT) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::LEFT)).isWater())) return false; break; case Direction::TOP_RIGHT: if((Maps::isValidDirection(from, Direction::TOP) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::TOP)).isWater()) || (Maps::isValidDirection(from, Direction::RIGHT) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::RIGHT)).isWater())) return false; break; case Direction::BOTTOM_RIGHT: if((Maps::isValidDirection(from, Direction::BOTTOM) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::BOTTOM)).isWater()) || (Maps::isValidDirection(from, Direction::RIGHT) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::RIGHT)).isWater())) return false; break; case Direction::BOTTOM_LEFT: if((Maps::isValidDirection(from, Direction::BOTTOM) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::BOTTOM)).isWater()) || (Maps::isValidDirection(from, Direction::LEFT) && ! world.GetTiles(Maps::GetDirectionIndex(from, Direction::LEFT)).isWater())) return false; break; default: break; } } return PassableToTile(hero, toTile, direct, dst); }