void nofShipWright::WalkToWorkpoint() { // Sind wir am Ziel angekommen? if(pos == dest) { // Anfangen zu arbeiten state = STATE_WORK; current_ev = GetEvMgr().AddEvent(this, WORKING_TIME_SHIPS, 1); return; } unsigned char dir = gwg->FindHumanPath(pos, dest, 20); // Weg suchen und gucken ob der Punkt noch in Ordnung ist if(dir == 0xFF || (!IsPointGood(dest) && gwg->GetGOT(dest) != GOT_SHIPBUILDINGSITE)) { // Punkt freigeben gwg->SetReserved(dest, false); // Kein Weg führt mehr zum Ziel oder Punkt ist nich mehr in Ordnung --> wieder nach Hause gehen StartWalkingHome(); } else { // Alles ok, wir können hinlaufen StartWalking(dir); } }
void nofShipWright::WalkToWorkpoint() { // Sind wir am Ziel angekommen? if(x == dest_x && y == dest_y) { // Anfangen zu arbeiten state = STATE_WORK; current_ev = em->AddEvent(this,WORKING_TIME_SHIPS,1); } // Weg suchen und gucken ob der Punkt noch in Ordnung ist else if((dir = gwg->FindHumanPath(x,y,dest_x,dest_y,20)) == 0xFF || (!IsPointGood(dest_x,dest_y) && gwg->GetGOT(dest_x,dest_y) != GOT_SHIPBUILDINGSITE)) { // Punkt freigeben gwg->GetNode(dest_x,dest_y).reserved = false;; // Kein Weg führt mehr zum Ziel oder Punkt ist nich mehr in Ordnung --> wieder nach Hause gehen StartWalkingHome(); } else { // Alles ok, wir können hinlaufen StartWalking(dir); } }
void nofShipWright::HandleDerivedEvent(const unsigned int id) { switch(state) { case STATE_WAITING1: { // Herausfinden, was der Schiffsbauer als nächstes bauen soll if(dynamic_cast<nobShipYard*>(workplace)->GetMode() == nobShipYard::BOATS) // in Handwerksmanier Boote herstellen nofWorkman::HandleStateWaiting1(); else { // Verfügbare Punkte, die geeignete Plätze darstellen würden std::vector<ShipPoint> available_points; // Wege müssen immer von der Flagge aus berechnet werden MapPoint flagPos = gwg->GetNeighbour(pos, 4); for(MapCoord tx = gwg->GetXA(pos, 0), r = 1; r <= SHIPWRIGHT_RADIUS; tx = gwg->GetXA(tx, pos.y, 0), ++r) { 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) { // Besitze ich noch ein Schiff, was gebaut werden muss? noBase* obj = gwg->GetNode(t2).obj; if(!obj) continue; // Schiff? if(obj->GetGOT() == GOT_SHIPBUILDINGSITE) { // Platz noch nicht reserviert und gehört das Schiff auch mir? unsigned char first_dir = 0xFF; if(!gwg->GetNode(pos).reserved && static_cast<noShipBuildingSite*>(obj)->GetPlayer() == player && (first_dir = gwg->FindHumanPath(flagPos, t2, SHIPWRIGHT_WALKING_DISTANCE)) != 0xFF) { available_points.push_back(ShipPoint(t2, first_dir)); } } } } } // Kein Schiff im Bau gefunden? Dann Plätzchen für ein neues Schiff suchen if(available_points.empty()) { for(MapCoord tx = gwg->GetXA(pos, 0), r = 1; r <= SHIPWRIGHT_RADIUS; tx = gwg->GetXA(tx, pos.y, 0), ++r) { 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) { // Dieser Punkt geeignet? if(IsPointGood(t2)) { // Weg dorthin finden unsigned char first_dir = gwg->FindHumanPath(flagPos, t2, SHIPWRIGHT_WALKING_DISTANCE); if(first_dir != 0xFF) { available_points.push_back(ShipPoint(t2, first_dir)); } } } } } } // Punkte gefunden? if(!available_points.empty()) { // Einen Punkt zufällig auswählen und dorthin laufen ShipPoint p = available_points[RANDOM.Rand(__FILE__, __LINE__, obj_id, available_points.size())]; dest = p.pos; StartWalkingToShip(p.first_dir); } else { // Nichts zu arbeiten gefunden StartNotWorking(); // Weiter warten, vielleicht gibts ja später wieder mal was current_ev = em->AddEvent(this, JOB_CONSTS[job].wait1_length, 1); } } } break; case STATE_WORK: { // Sind wir an unserem Arbeitsplatz (dem Gebäude), wenn wir die Arbeit beendet haben, bauen wir nur Boote, // ansonsten sind wir an unserem Schiff und bauen große Schiffe if(workplace->GetPos() == pos) // Boote bauen nofWorkman::HandleStateWork(); else { // 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_WAITING2: { // Hier ist die Sache klar, dieser State kann nur bei Handwerkern vorkommen nofWorkman::HandleStateWaiting2(); } break; default: break; } }