/// Erhält die Waren von einem Schiff und nimmt diese in den Warenbestand auf void nobHarborBuilding::ReceiveGoodsFromShip(std::list<noFigure*>& figures, std::list<Ware*>& wares) { // Menschen zur Ausgehliste hinzufügen for(std::list<noFigure*>::const_iterator it = figures.begin(); it != figures.end(); ++it) { (*it)->ArrivedByShip(pos); // Wenn es kein Ziel mehr hat, sprich keinen weiteren Weg, kann es direkt hier gelagert werden if((*it)->GetGoal() == this) (*it)->SetGoalToNULL(); else if(!(*it)->HasNoGoal()) { unsigned char nextDir; MapPoint next_harbor = (*it)->ExamineRouteBeforeShipping(nextDir); if (nextDir == 4) { // Increase visual count if((*it)->GetJobType() == JOB_BOATCARRIER) { inventory.visual.Add(JOB_HELPER); inventory.visual.Add(GD_BOAT); } else inventory.visual.Add((*it)->GetJobType()); AddLeavingFigure(*it); (*it)->ShipJourneyEnded(); } else if (nextDir == SHIP_DIR) { AddFigureForShip(*it, next_harbor); }else { // No or invalid path -> Store here RTTR_Assert(nextDir == 0xFF); (*it)->SetGoalToNULL(); AddDependentFigure(*it); } }else AddDependentFigure(*it); // No goal? We take it if ((*it)->HasNoGoal()) AddFigure(*it, true); } figures.clear(); // Waren zur Warteliste hinzufügen for(std::list<Ware*>::iterator it = wares.begin(); it != wares.end(); ++it) { (*it)->ShipJorneyEnded(this); AddWare(*it); } wares.clear(); }
/// Dasselbe für Menschen bool nobHarborBuilding::UseFigureAtOnce(noFigure * fig, noRoadNode* const goal) { // Evtl. muss die Ware gleich das Schiff nehmen -> // dann zum Schiffsreservoir hinzufügen Point<MapCoord> next_harbor; if(gwg->FindHumanPathOnRoads(this,goal,NULL,&next_harbor) == SHIP_DIR) { // Reduce figure count because figues don't go through the house leaving process // And therefore the visual count reducement goods.people[fig->GetJobType()]--; // Dann fügen wir die mal bei uns hinzu AddFigureForShip(fig,next_harbor); return true; } return false; }
/// Dasselbe für Menschen bool nobHarborBuilding::UseFigureAtOnce(noFigure* fig, noRoadNode& goal) { // If the figure needs to take a ship, add it to the ships inventory // If the goal is this building don't handle it if(this == &goal) return false; MapPoint next_harbor; if(gwg->FindHumanPathOnRoads(*this, goal, NULL, &next_harbor) == SHIP_DIR) { // Reduce figure count because figues don't go through the house leaving process // And therefore the visual count reducement inventory.visual.Remove(fig->GetJobType()); // Dann fügen wir die mal bei uns hinzu AddFigureForShip(fig, next_harbor); return true; } return false; }
/// Erhält die Waren von einem Schiff und nimmt diese in den Warenbestand auf void nobHarborBuilding::ReceiveGoodsFromShip(const std::list<noFigure*> figures, const std::list<Ware*> wares) { // Menschen zur Ausgehliste hinzufügen for(std::list<noFigure*>::const_iterator it = figures.begin();it!=figures.end();++it) { if((*it)->GetJobType() == JOB_BOATCARRIER) { ++goods.people[JOB_HELPER]; ++goods.goods[GD_BOAT]; } else ++goods.people[(*it)->GetJobType()]; // Wenn es kein Ziel mehr hat, sprich keinen weiteren Weg, kann es direkt hier gelagert // werden if ((*it)->HasNoGoal() || ((*it)->GetGoal() == this)) { AddFigure(*it, false); } else { Point<MapCoord> next_harbor = (*it)->ExamineRouteBeforeShipping(); unsigned char next_dir = (*it)->GetDir(); if (next_dir == 4) { AddLeavingFigure(*it); (*it)->ShipJourneyEnded(); } else if (next_dir == SHIP_DIR) { AddFigureForShip(*it, next_harbor); } else { AddFigure(*it, false); } } } // Waren zur Warteliste hinzufügen for(std::list<Ware*>::const_iterator it = wares.begin();it!=wares.end();++it) { // Optische Warenwerte entsprechend erhöhen ++goods.goods[ConvertShields((*it)->type)]; if((*it)->ShipJorneyEnded(this)) { // Ware will die weitere Reise antreten, also muss sie zur Liste der rausgetragenen Waren // hinzugefügt werden waiting_wares.push_back(*it); } else { // Ansonsten fügen wir die Ware einfach zu unserem Inventar dazu RemoveDependentWare(*it); ++real_goods.goods[ConvertShields((*it)->type)]; players->getElement(player)->RemoveWare(*it); delete *it; } } // Ggf. neues Rausgeh-Event anmelden, was notwendig ist, wenn z.B. nur Waren zur Liste hinzugefügt wurden AddLeavingEvent(); }