/// Eine Figur geht ins Lagerhaus void nobHarborBuilding::AddFigure(noFigure * figure, const bool increase_visual_counts) { // Brauchen wir einen Bauarbeiter für die Expedition? if(figure->GetJobType() == JOB_BUILDER && expedition.active && !expedition.builder) { nobBaseWarehouse::RemoveDependentFigure(figure); em->AddToKillList(figure); expedition.builder = true; // Ggf. ist jetzt alles benötigte da CheckExpeditionReady(); } // Brauchen wir einen Spähter für die Expedition? else if(figure->GetJobType() == JOB_SCOUT && exploration_expedition.active && !IsExplorationExpeditionReady()) { nobBaseWarehouse::RemoveDependentFigure(figure); em->AddToKillList(figure); ++exploration_expedition.scouts; ++goods.people[JOB_SCOUT]; // Ggf. ist jetzt alles benötigte da CheckExplorationExpeditionReady(); } else // ansonsten weiterdelegieren nobBaseWarehouse::AddFigure(figure,increase_visual_counts); }
/// Startet eine Expedition oder stoppt sie, wenn bereits eine stattfindet void nobHarborBuilding::StartExpedition() { // Schon eine Expedition gestartet? if(expedition.active) { StopExpedition(); return; } // Initialisierung expedition.active = true; // In unseren Warenbestand gucken und die erforderlichen Bretter und Steine sowie den // Bauarbeiter holen, falls vorhanden expedition.boards = std::min(unsigned(BUILDING_COSTS[nation][BLD_HARBORBUILDING].boards), inventory[GD_BOARDS]); expedition.stones = std::min(unsigned(BUILDING_COSTS[nation][BLD_HARBORBUILDING].stones), inventory[GD_STONES]); inventory.Remove(GD_BOARDS, expedition.boards); inventory.Remove(GD_STONES, expedition.stones); if(inventory[JOB_BUILDER]) { expedition.builder = true; inventory.Remove(JOB_BUILDER); } else { bool convert = true; expedition.builder = false; //got a builder in ANY storehouse? GameClientPlayer& owner = gwg->GetPlayer(player); for(std::list<nobBaseWarehouse*>::const_iterator it = owner.GetStorehouses().begin(); it != owner.GetStorehouses().end(); ++it) { if((*it)->GetRealFiguresCount(JOB_BUILDER)) { convert = false; break; } } if(convert && inventory[GD_HAMMER] && inventory[JOB_HELPER] > 1) //maybe have a hammer & helper to create our own builder? { inventory.Remove(GD_HAMMER); owner.DecreaseInventoryWare(GD_HAMMER, 1); inventory.Remove(JOB_HELPER); owner.DecreaseInventoryJob(JOB_HELPER, 1); owner.IncreaseInventoryJob(JOB_BUILDER, 1); expedition.builder = true; } // not in harbor, and didnt have to or couldnt convert so order a builder if(!expedition.builder) owner.AddJobWanted(JOB_BUILDER, this); } // Ggf. Waren bestellen, die noch fehlen OrderExpeditionWares(); // Ggf. ist jetzt alles benötigte schon da // Dann Schiff rufen CheckExpeditionReady(); }
/// Startet eine Expedition oder stoppt sie, wenn bereits eine stattfindet void nobHarborBuilding::StartExpedition() { // Schon eine Expedition gestartet? if(expedition.active) { // Dann diese stoppen expedition.active = false; // Waren zurücktransferieren real_goods.goods[GD_BOARDS] += expedition.boards; goods.goods[GD_BOARDS] += expedition.boards; real_goods.goods[GD_STONES] += expedition.stones; goods.goods[GD_STONES] += expedition.stones; if(expedition.builder) { ++real_goods.people[JOB_BUILDER]; ++goods.people[JOB_BUILDER]; // Evtl. Abnehmer für die Figur wieder finden gwg->GetPlayer(player)->FindWarehouseForAllJobs(JOB_BUILDER); } return; } // Initialisierung expedition.active = true; // In unseren Warenbestand gucken und die erforderlichen Bretter und Steine sowie den // Bauarbeiter holen, falls vorhanden expedition.boards = min(unsigned(BUILDING_COSTS[nation][BLD_HARBORBUILDING].boards), real_goods.goods[GD_BOARDS]); expedition.stones = min(unsigned(BUILDING_COSTS[nation][BLD_HARBORBUILDING].stones), real_goods.goods[GD_STONES]); real_goods.goods[GD_BOARDS] -= expedition.boards; goods.goods[GD_BOARDS] -= expedition.boards; real_goods.goods[GD_STONES] -= expedition.stones; goods.goods[GD_STONES] -= expedition.stones; if(real_goods.people[JOB_BUILDER]) { expedition.builder = true; --real_goods.people[JOB_BUILDER]; --goods.people[JOB_BUILDER]; } else { expedition.builder = false; // Bauarbeiter bestellen gwg->GetPlayer(player)->AddJobWanted(JOB_BUILDER,this); } // Ggf. Waren bestellen, die noch fehlen OrderExpeditionWares(); // Ggf. ist jetzt alles benötigte schon da // Dann Schiff rufen CheckExpeditionReady(); }
/// Legt eine Ware im Lagerhaus ab void nobHarborBuilding::AddWare(Ware*& ware) { if(ware->GetGoal() && ware->GetGoal() != this) { // This is not the goal but we have one -> Get new route ware->RecalcRoute(); // Will diese Ware mit dem Schiff irgendwo hin fahren? if(ware->GetNextDir() == SHIP_DIR) { // Dann fügen wir die mal bei uns hinzu AddWareForShip(ware); return; }else if(ware->GetNextDir() != INVALID_DIR) { // Travel on roads -> Carry out RTTR_Assert(ware->GetGoal() != this); AddWaitingWare(ware); return; }else { // Pathfinding failed -> Ware would want to go here RTTR_Assert(ware->GetGoal() == this); // Regular handling below } } // Brauchen wir die Ware? if(expedition.active) { if((ware->type == GD_BOARDS && expedition.boards < BUILDING_COSTS[nation][BLD_HARBORBUILDING].boards) || (ware->type == GD_STONES && expedition.stones < BUILDING_COSTS[nation][BLD_HARBORBUILDING].stones)) { if(ware->type == GD_BOARDS) ++expedition.boards; else ++expedition.stones; // Ware nicht mehr abhängig if(ware->GetGoal()) RemoveDependentWare(ware); // Dann zweigen wir die einfach mal für die Expedition ab gwg->GetPlayer(player).RemoveWare(ware); deletePtr(ware); // Ggf. ist jetzt alles benötigte da CheckExpeditionReady(); return; } } nobBaseWarehouse::AddWare(ware); }
/// Legt eine Ware im Lagerhaus ab void nobHarborBuilding::AddWare(Ware * ware) { if(ware->goal != this) ware->RecalcRoute(); // Will diese Ware mit dem Schiff irgendwo hin fahren? if(ware->GetNextDir() == SHIP_DIR) { // Dann fügen wir die mal bei uns hinzu AddWareForShip(ware); return; } // Brauchen wir die Ware? if(expedition.active) { if((ware->type == GD_BOARDS && expedition.boards < BUILDING_COSTS[nation][BLD_HARBORBUILDING].boards) || (ware->type == GD_STONES && expedition.stones < BUILDING_COSTS[nation][BLD_HARBORBUILDING].stones)) { if(ware->type == GD_BOARDS) ++expedition.boards; else if(ware->type == GD_STONES) ++expedition.stones; // Ware nicht mehr abhängig RemoveDependentWare(ware); // Dann zweigen wir die einfach mal für die Expedition ab gwg->GetPlayer(player)->RemoveWare(ware); delete ware; // Ggf. ist jetzt alles benötigte da CheckExpeditionReady(); return; } } nobBaseWarehouse::AddWare(ware); }