void nofBuilder::GoalReached() { goal_ = NULL; // an der Baustelle normal anfangen zu arbeiten state = STATE_WAITINGFREEWALK; // Sind jetzt an der Baustelle rel_x = rel_y = 0; // Anfangen um die Baustelle herumzulaufen StartFreewalk(); }
void nofBuilder::HandleDerivedEvent(const unsigned int id) { switch(state) { case STATE_WAITINGFREEWALK: { // Platz einnehmen rel_x = next_rel_x; rel_y = next_rel_y; // Ware aufnehmen, falls es eine gibt if(ChooseWare()) state = STATE_BUILDFREEWALK; // Weiter drumrumlaufen StartFreewalk(); } break; case STATE_BUILDFREEWALK: { // Platz einnehmen rel_x = next_rel_x; rel_y = next_rel_y; // Gibts noch was zu bauen? if(building_steps_available) { // dann mal schön bauen current_ev = em->AddEvent(this, 40, 1); state = STATE_BUILD; } else if(building_site->IsBuildingComplete()) { // fertig mit Bauen! // Baustelle abreißen und Gebäude hinsetzen // Gebäudetyp merken und das Volk des Gebäudes BuildingType building_type = building_site->GetBuildingType(); Nation building_nation = building_site->GetNation(); state = STATE_FIGUREWORK; // Baustelle abmelden GameClientPlayer& owner = gwg->GetPlayer(player); owner.RemoveBuildingSite(building_site); // ggf. Baustellenfenster schließen gwg->ImportantObjectDestroyed(building_site->GetPos()); // Baustelle kommt in den Bytehimmel gwg->SetNO(NULL, building_site->GetPos()); delete building_site; // KI-Event schicken GAMECLIENT.SendAIEvent(new AIEvent::Building(AIEvent::BuildingFinished, pos, building_type), player); noBuilding* bld = BuildingFactory::CreateBuilding(gwg, building_type, pos, player, building_nation); // Special handling for storehouses and harbours if(building_type == BLD_STOREHOUSE || building_type == BLD_HARBORBUILDING){ nobBaseWarehouse* wh = static_cast<nobBaseWarehouse*>(bld); // Mich dort gleich einquartieren und nicht erst zurücklaufen wh->AddFigure(this); gwg->RemoveFigure(this, pos); // Evtl Träger aus dem HQ wieder verwenden owner.FindWarehouseForAllRoads(); owner.FindWarehouseForAllJobs(JOB_HELPER); // Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen owner.FindClientForLostWares(); return; } // Nach Hause laufen bzw. auch rumirren rs_pos = 0; rs_dir = true; cur_rs = gwg->GetSpecObj<noRoadNode>(pos)->routes[4]; building_site = 0; GoHome(); StartWalking(4); } else { // Brauchen neues Material // Ware aufnehmen, falls es eine gibt if(!ChooseWare()) state = STATE_WAITINGFREEWALK; // Weiter drumrumlaufen StartFreewalk(); } } break; case STATE_BUILD: { // Sounds abmelden SOUNDMANAGER.WorkingFinished(this); // ein Bauschritt weniger, Haus um eins höher --building_steps_available; ++building_site->build_progress; // Fertig mit dem Bauschritt, dann an nächste Position gehen state = STATE_BUILDFREEWALK; StartFreewalk(); } break; default: break; } }