void nofGeologist::HandleDerivedEvent(const unsigned int id) { switch(state) { default: break; case STATE_GEOLOGIST_DIG: { // Ressourcen an diesem Punkt untersuchen unsigned char resources = gwg->GetNode(pos).resources; if((resources >= 0x41 && resources <= 0x47) || (resources >= 0x49 && resources <= 0x4F) || (resources >= 0x51 && resources <= 0x57) || (resources >= 0x59 && resources <= 0x5F) || (resources >= 0x21 && resources <= 0x2F)) { // Es wurde was gefunden, erstmal Jubeln state = STATE_GEOLOGIST_CHEER; current_ev = em->AddEvent(this, 15, 1); } else { // leeres Schild hinstecken und ohne Jubel weiterziehen SetSign(resources); GoToNextNode(); /// Punkt wieder freigeben gwg->GetNode(pos).reserved = false;; } } break; case STATE_GEOLOGIST_CHEER: { // Schild reinstecken SetSign(gwg->GetNode(pos).resources); // Und weiterlaufen GoToNextNode(); /// Punkt wieder freigeben gwg->GetNode(pos).reserved = false;; /// Sounds evtl löschen SOUNDMANAGER.WorkingFinished(this); } break; } }
void nofGeologist::HandleDerivedEvent(const unsigned /*id*/) { switch(state) { default: break; case STATE_GEOLOGIST_DIG: { // Check what is here Resource foundRes = gwg->GetNode(pos).resources; // We don't care for fish (and most likely never find it) if(foundRes.getType() == Resource::Fish) foundRes.setType(Resource::Nothing); if(foundRes.getAmount() > 0u) { // Es wurde was gefunden, erstmal Jubeln state = STATE_GEOLOGIST_CHEER; current_ev = GetEvMgr().AddEvent(this, 15, 1); } else { // leeres Schild hinstecken und ohne Jubel weiterziehen SetSign(foundRes); /// Punkt wieder freigeben gwg->SetReserved(pos, false); GoToNextNode(); } } break; case STATE_GEOLOGIST_CHEER: { // Schild reinstecken SetSign(gwg->GetNode(pos).resources); /// Punkt wieder freigeben gwg->SetReserved(pos, false); /// Sounds evtl löschen SOUNDMANAGER.WorkingFinished(this); // Und weiterlaufen GoToNextNode(); } break; } }
void nofGeologist::Walked() { if(state == STATE_GEOLOGIST_GOTONEXTNODE) { // Ist mein Zielpunkt überhaupt noch geeignet zum Graben (kann ja mittlerweile auch was drauf gebaut worden sein) if(!IsNodeGood(node_goal)) { // alten Punkt wieder freigeben gwg->GetNode(node_goal).reserved = false;; // wenn nicht, dann zu einem neuen Punkt gehen GoToNextNode(); return; } // Bin ich am Zielpunkt? if(pos == node_goal) { // anfangen zu graben current_ev = em->AddEvent(this, 100, 1); state = STATE_GEOLOGIST_DIG; } else { // Weg zum nächsten Punkt suchen unsigned char dir = gwg->FindHumanPath(pos, node_goal, 20); // Wenns keinen gibt if(dir == 0xFF) { // alten Punkt wieder freigeben gwg->GetNode(node_goal).reserved = false; // dann neuen Punkt suchen dir = GetNextNode(); // falls es keinen gibt, dann zurück zur Flagge gehen und es übernimmt der andere "Walked"-Zweig if(dir == 0xFF) { state = STATE_GOTOFLAG; Walked(); return; } } StartWalking(dir); } } else if(state == STATE_GOTOFLAG) { GoToFlag(); } }
void nofGeologist::Walked() { if(state == STATE_GEOLOGIST_GOTONEXTNODE) { // Check if the flag still exists (not destroyed) and the goal node is still available (something could be build there) if(!flag || !IsNodeGood(node_goal)) { // alten Punkt wieder freigeben gwg->SetReserved(node_goal, false); // wenn nicht, dann zu einem neuen Punkt gehen GoToNextNode(); return; } // Bin ich am Zielpunkt? if(pos == node_goal) { // anfangen zu graben current_ev = GetEvMgr().AddEvent(this, 100, 1); state = STATE_GEOLOGIST_DIG; } else { // Weg zum nächsten Punkt suchen unsigned char dir = gwg->FindHumanPath(pos, node_goal, 20); // Wenns keinen gibt if(dir == INVALID_DIR) GoToNextNode(); else StartWalking(Direction::fromInt(dir)); } } else if(state == STATE_GOTOFLAG) { GoToFlag(); } }
void nofGeologist::GoalReached() { // An der Flagge angekommen // Geologe muss nun 15 Schildchen aufstellen signs = 15; // Für jeden Ressourcentyp nur einmal eine Post-Nachricht schicken std::fill(resAlreadyFound.begin(), resAlreadyFound.end(), false); // Umgebung absuchen LookForNewNodes(); // ersten Punkt suchen GoToNextNode(); }
void nofGeologist::GoalReached() { // An der Flagge angekommen // Geologe muss nun 15 Schildchen aufstellen signs = 15; // Für jeden Ressourcentyp nur einmal eine Post-Nachricht schicken for(unsigned i = 0; i < 5; ++i) resAlreadyFound[i] = false; // Umgebung absuchen LookForNewNodes(); // ersten Punkt suchen /*dir = GetNextNode();*/ GoToNextNode(); }