bool IsPointOK_RoadPath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char /*dir*/, const void* param) { const Param_RoadPath* prp = static_cast<const Param_RoadPath*>(param); // Auch auf unserem Territorium? if(!gwb.IsPlayerTerritory(pt)) return false; // Feld bebaubar? if(!gwb.IsRoadAvailable(prp->boat_road, pt)) return false; return true; }
/// Abbruch-Bedingungen für freien Pfad für Menschen bool IsPointOK_TradePath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char dir, const void* param) { // Feld passierbar? noBase::BlockingManner bm = gwb.GetNO(pt)->GetBM(); if(bm != noBase::BM_NOTBLOCKING && bm != noBase::BM_TREE && bm != noBase::BM_FLAG) return false; unsigned char player = gwb.GetNode(pt).owner; // Ally or no player? Then ok if(player == 0 || gwb.GetPlayer(*((unsigned char*)param)).IsAlly(player - 1)) return true; else return false; }
/// Abbruch-Bedingungen für Straßenbau-Pathfinding for comfort road construction with a possible flag every 2 steps bool IsPointOK_RoadPathEvenStep(const GameWorldBase& gwb, const MapPoint pt, const unsigned char /*dir*/, const void* param) { const Param_RoadPath* prp = static_cast<const Param_RoadPath*>(param); // Auch auf unserem Territorium? if(!gwb.IsPlayerTerritory(pt)) return false; // Feld bebaubar? if(!gwb.RoadAvailable(prp->boat_road, pt)) return false; if(!prp->boat_road && (gwb.CalcBQ(pt, gwb.GetNode(pt).owner-1, true, false) != BQ_FLAG)) return false; return true; }
/// Zusätzliche Abbruch-Bedingungen für freien Pfad für Schiffe, die auch bei der letzen Kante /// zum Ziel eingehalten werden müssen bool IsPointToDestOK_ShipPath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char dir, const void* param) { // Der Übergang muss immer aus Wasser sein zu beiden Seiten if(TerrainData::IsUsableByShip(gwb.GetWalkingTerrain1(pt, (dir + 3) % 6)) && TerrainData::IsUsableByShip(gwb.GetWalkingTerrain2(pt, (dir + 3) % 6))) return true; else return false; }
/// Zusätzliche Abbruch-Bedingungen für freien Pfad für Menschen, die auch bei der letzen Kante /// zum Ziel eingehalten werden müssen bool IsPointToDestOK_HumanPath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char dir, const void* param) { // Feld passierbar? // Nicht über Wasser, Lava, Sümpfe gehen if(!gwb.IsNodeToNodeForFigure(pt, (dir + 3) % 6)) return false; return true; }
/// Abbruch-Bedingungen für freien Pfad für Menschen bool IsPointOK_HumanPath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char dir, const void* param) { // Feld passierbar? noBase::BlockingManner bm = gwb.GetNO(pt)->GetBM(); if(bm != noBase::BM_NOTBLOCKING && bm != noBase::BM_TREE && bm != noBase::BM_FLAG) return false; return true; }
/// Abbruch-Bedingungen für freien Pfad für Schiffe bool IsPointOK_ShipPath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char dir, const void* param) { // Ein Meeresfeld? for(unsigned i = 0; i < 6; ++i) { if(!TerrainData::IsUsableByShip(gwb.GetTerrainAround(pt, i))) return false; } return true; }
bool IsPointToDestOK_TradePath(const GameWorldBase& gwb, const MapPoint pt, const unsigned char dir, const void* param) { // Feld passierbar? // Nicht über Wasser, Lava, Sümpfe gehen if(!gwb.IsNodeToNodeForFigure(pt, (dir + 3) % 6)) return false; // Not trough hostile territory? unsigned char old_player = gwb.GetNode(gwb.GetNeighbour(pt, (dir + 3) % 6)).owner, new_player = gwb.GetNode(pt).owner; // Ally or no player? Then ok if(new_player == 0 || gwb.GetPlayer(*((unsigned char*)param)).IsAlly(new_player - 1)) return true; else { // Old player also evil? if(old_player != 0 && !gwb.GetPlayer(*((unsigned char*)param)).IsAlly(old_player - 1)) return true; else return false; } }