void nofBuildingWorker::TryToWork() { // Wurde die Produktion eingestellt? if(workplace->IsProductionDisabled()) { state = STATE_WAITINGFORWARES_OR_PRODUCTIONSTOPPED; // Nun arbeite ich nich mehr StartNotWorking(); } // Falls man auf Waren wartet, kann man dann anfangen zu arbeiten // (bei Bergwerken müssen zusätzlich noch Rohstoffvorkommen vorhanden sein!) // (bei Brunnen muss ebenfalls auf Wasser geprüft werden!) // Spähturm-Erkunder arbeiten nie! // Charburner doesn't need wares for harvesting! // -> Wares are considered when calling GetPointQuality! else if( (workplace->WaresAvailable() || job == JOB_CHARBURNER) && (job != JOB_MINER || GetResources(workplace->GetBuildingType() - BLD_GRANITEMINE)) && (job != JOB_HELPER || GetResources(4)) && job != JOB_SCOUT) { state = STATE_WAITING1; current_ev = em->AddEvent(this, (GetGOT() == GOT_NOF_CATAPULTMAN) ? CATAPULT_WAIT1_LENGTH : JOB_CONSTS[job].wait1_length, 1); StopNotWorking(); } else { state = STATE_WAITINGFORWARES_OR_PRODUCTIONSTOPPED; // Nun arbeite ich nich mehr StartNotWorking(); } }
void nofBuildingWorker::TryToWork() { // Wurde die Produktion eingestellt? if(workplace->IsProductionDisabled()) { state = STATE_WAITINGFORWARES_OR_PRODUCTIONSTOPPED; // Nun arbeite ich nich mehr StartNotWorking(); } // Falls man auf Waren wartet, kann man dann anfangen zu arbeiten else if(AreWaresAvailable()) { if(ReadyForWork()) { state = STATE_WAITING1; current_ev = em->AddEvent(this, (GetGOT() == GOT_NOF_CATAPULTMAN) ? CATAPULT_WAIT1_LENGTH : JOB_CONSTS[job].wait1_length, 1); StopNotWorking(); }else { state = STATE_WAITINGFORWARES_OR_PRODUCTIONSTOPPED; } } else { state = STATE_WAITINGFORWARES_OR_PRODUCTIONSTOPPED; // Nun arbeite ich nich mehr StartNotWorking(); } }
/// Startet das Laufen zu der Arbeitsstelle, dem Schiff void nofShipWright::StartWalkingToShip(const unsigned char first_dir) { state = STATE_WALKTOWORKPOINT; // Wir arbeiten jetzt workplace->is_working = true; // Waren verbrauchen workplace->ConsumeWares(); // Punkt für uns reservieren gwg->GetNode(dest).reserved = true;; // Anfangen zu laufen (erstmal aus dem Haus raus!) StartWalking(4); StopNotWorking(); }
void nofFarmhand::HandleDerivedEvent(const unsigned int id) { switch(state) { case STATE_WORK: { // fertig mit Arbeiten --> dann müssen die "Folgen des Arbeitens" ausgeführt werden WorkFinished(); // Objekt wieder freigeben gwg->GetNode(pos).reserved = false; // Wieder nach Hause gehen StartWalkingHome(); // Evtl. Sounds löschen if(was_sounding) { SOUNDMANAGER.WorkingFinished(this); was_sounding = false; } } break; case STATE_WAITING1: { // Fertig mit warten --> anfangen zu arbeiten // Die Arbeitsradien der Berufe wie in JobConst.h (ab JOB_WOODCUTTER!) const unsigned char RADIUS[7] = { 6, 7, 6, 0, 8, 2, 2 }; // Additional radius delta r which is used when a point in radius r was found // I.e. looks till radius r + delta r const unsigned ADD_RADIUS_WHEN_FOUND[7] = { 1, 1, 1, 1, 0, 1, 1}; // Anzahl der Radien, wo wir gültige Punkte gefunden haben unsigned radius_count = 0; // Available points: 1st class and 2st class std::vector< MapPoint > available_points[3]; unsigned max_radius = (job_ == JOB_CHARBURNER) ? 3 : RADIUS[job_ - JOB_WOODCUTTER]; unsigned add_radius_when_found = (job_ == JOB_CHARBURNER) ? 1 : ADD_RADIUS_WHEN_FOUND[job_ - JOB_WOODCUTTER]; bool points_found = false; bool wait = false; for(MapCoord tx = gwg->GetXA(pos, 0), r = 1; r <= max_radius; tx = gwg->GetXA(tx, pos.y, 0), ++r) { // Wurde ein Punkt in diesem Radius gefunden? bool found_in_radius = false; MapPoint t2(tx, pos.y); for(unsigned i = 2; i < 8; ++i) { for(MapCoord r2 = 0; r2 < r; t2 = gwg->GetNeighbour(t2, i % 6), ++r2) { if(IsPointAvailable(t2)) { if (!gwg->GetNode(t2).reserved) { available_points[GetPointQuality(t2) - PQ_CLASS1].push_back(MapPoint(t2)); found_in_radius = true; points_found = true; } else if (job_ == JOB_STONEMASON) { // just wait a little bit longer wait = true; } } } } // Nur die zwei ADD_RADIUS_WHEN_FOUND Radien erst einmal nehmen if(found_in_radius) { if( radius_count++ == add_radius_when_found) break; } } // Are there any objects at all? if(points_found) { // Prefer 1st class objects and use only 2nd class objects if there are no more other objects anymore MapPoint p(0, 0); for(unsigned i = 0; i < 3; ++i) { if(!available_points[i].empty()) { p = available_points[i][RANDOM.Rand(__FILE__, __LINE__, GetObjId(), available_points[i].size())]; break; } } // Als neues Ziel nehmen dest = p; state = STATE_WALKTOWORKPOINT; // Wir arbeiten jetzt workplace->is_working = true; // Punkt für uns reservieren gwg->GetNode(dest).reserved = true;; // Anfangen zu laufen (erstmal aus dem Haus raus!) StartWalking(4); StopNotWorking(); WalkingStarted(); } else if (wait) { // We have to wait, since we do not know whether there are any unreachable or reserved points where there's more to get current_ev = em->AddEvent(this, JOB_CONSTS[job_].wait1_length, 1); StartNotWorking(); } else { if(GAMECLIENT.GetPlayerID() == this->player) { if (!OutOfRessourcesMsgSent) { switch(job_) { case JOB_STONEMASON: GAMECLIENT.SendPostMessage( new ImagePostMsgWithLocation(_("No more stones in range"), PMC_GENERAL, pos, workplace->GetBuildingType(), workplace->GetNation())); OutOfRessourcesMsgSent = true; // Produktivitätsanzeige auf 0 setzen workplace->SetProductivityToZero(); break; case JOB_FISHER: GAMECLIENT.SendPostMessage( new ImagePostMsgWithLocation(_("No more fishes in range"), PMC_GENERAL, pos, workplace->GetBuildingType(), workplace->GetNation())); OutOfRessourcesMsgSent = true; // Produktivitätsanzeige auf 0 setzen workplace->SetProductivityToZero(); break; default: break; } } } // KI-Event erzeugen switch(workplace->GetBuildingType()) { case BLD_WOODCUTTER: case BLD_QUARRY: case BLD_FISHERY: GAMECLIENT.SendAIEvent(new AIEvent::Building(AIEvent::NoMoreResourcesReachable, workplace->GetPos(), workplace->GetBuildingType()), player); break; default: break; } // Weiter warten, vielleicht gibts ja später wieder mal was current_ev = em->AddEvent(this, JOB_CONSTS[job_].wait1_length, 1); StartNotWorking(); } } break; default: break; } }
void nofHunter::HandleDerivedEvent(const unsigned int id) { switch(state) { default: break; case STATE_WAITING1: { // Fertig mit warten --> anfangen zu arbeiten // in einem Quadrat um die Hütte (Kreis unnötig, da ja die Tiere sich sowieso bewegen) Tiere suchen // Unter- und Obergrenzen für das Quadrat bzw. Rechteck (nicht über Kartenränder hinauslesen) unsigned short fx,fy,lx,ly; const unsigned short SQUARE_SIZE = 19; if(x > SQUARE_SIZE) fx = x-SQUARE_SIZE; else fx = 0; if(y > SQUARE_SIZE) fy = y-SQUARE_SIZE; else fy = 0; if(x+SQUARE_SIZE < gwg->GetWidth()) lx = x+SQUARE_SIZE; else lx = gwg->GetWidth()-1; if(y+SQUARE_SIZE < gwg->GetHeight()) ly = y+SQUARE_SIZE; else ly = gwg->GetHeight()-1; // Liste mit den gefundenen Tieren list<noAnimal*> available_animals; // Durchgehen und nach Tieren suchen for(unsigned short py = fy;py<=ly;++py) { for(unsigned short px = fx;px<=lx;++px) { // Gibts hier was bewegliches? if(gwg->GetFigures(px,py).size()) { // Dann nach Tieren suchen for(list<noBase*>::iterator it = gwg->GetFigures(px,py).begin();it.valid();++it) { if((*it)->GetType() == NOP_ANIMAL) { // Ist das Tier überhaupt zum Jagen geeignet? if(!static_cast<noAnimal*>(*it)->CanHunted()) continue; // Und komme ich hin? if(gwg->FindHumanPath(x,y,static_cast<noAnimal*>(*it)->GetX(), static_cast<noAnimal*>(*it)->GetY(),MAX_HUNTING_DISTANCE) != 0xFF) // Dann nehmen wir es available_animals.push_back(static_cast<noAnimal*>(*it)); } } } } } // Gibt es überhaupt ein Tier, das ich jagen kann? if(available_animals.size()) { // Ein Tier zufällig heraussuchen animal = *available_animals[RANDOM.Rand(__FILE__,__LINE__,obj_id,available_animals.size())]; // Wir jagen es jetzt state = STATE_HUNTER_CHASING; // Wir arbeiten jetzt workplace->is_working = true; // Tier Bescheid sagen animal->BeginHunting(this); // Anfangen zu laufen (erstmal aus dem Haus raus!) StartWalking(4); StopNotWorking(); } else { // Weiter warten, vielleicht gibts ja später wieder mal was current_ev = em->AddEvent(this,JOB_CONSTS[job].wait1_length,1); //tell the ai that there is nothing left to hunt! GAMECLIENT.SendAIEvent(new AIEvent::Building(AIEvent::NoMoreResourcesReachable, workplace->GetX(), workplace->GetY(),workplace->GetBuildingType()), player); StartNotWorking(); } was_sounding = false; } break; case STATE_HUNTER_SHOOTING: { HandleStateShooting(); } break; case STATE_HUNTER_EVISCERATING: { HandleStateEviscerating(); // Evtl. Sounds löschen if(was_sounding) { SoundManager::inst().WorkingFinished(this); was_sounding = false; } } break; } }