/// Wenn ein Heimat-Militärgebäude bei Missionseinsätzen zerstört wurde void nofDefender::HomeDestroyed() { building = 0; switch(state) { case STATE_DEFENDING_WAITING: { // Hier muss sofort reagiert werden, da man steht attacker = NULL; // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); } break; case STATE_DEFENDING_WALKINGTO: case STATE_DEFENDING_WALKINGFROM: { attacker = NULL; // Rumirren StartWandering(); state = STATE_FIGUREWORK; } break; case STATE_FIGHTING: { // Die normale Tätigkeit wird erstmal fortgesetzt (Laufen, Kämpfen, wenn er schon an der Fahne ist // wird er auch nicht mehr zurückgehen) } break; default: break; } }
/// Behandelt das Laufen zurück zum Schiff void nofAttacker::HandleState_SeaAttack_ReturnToShip() { // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); // Schiff Bescheid sagen CancelAtShip(); return; } // Sind wir schon im Schiff? if(pos == shipPos) { // Alle Figuren durchgehen for(noBase* figure : gwg->GetFigures(pos)) { if(figure->GetObjId() == ship_obj_id) { StartReturnViaShip(static_cast<noShip&>(*figure)); return; } } RTTR_Assert(false); ship_obj_id = 0; // Kein Schiff gefunden? Das kann eigentlich nich sein! // Dann rumirren StartWandering(); state = STATE_FIGUREWORK; Wander(); return; } unsigned char dir = gwg->FindHumanPath(pos, shipPos, MAX_ATTACKING_RUN_DISTANCE); // oder finden wir gar keinen Weg mehr? if(dir == 0xFF) { // Kein Weg gefunden --> Rumirren StartWandering(); state = STATE_FIGUREWORK; Wander(); // Dem Heimatgebäude Bescheid sagen building->SoldierLost(this); // Und dem Schiff CancelAtShip(); } // oder ist alles ok? :) else { // weiterlaufen StartWalking(Direction(dir)); } }
void nofActiveSoldier::WalkingHome() { // Is our home military building destroyed? if(!building) { // Start wandering around state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Walking home to our military building // Are we already at the flag? if(GetPos() == building->GetFlag()->GetPos()) { // Enter via the door StartWalking(1); return; } // or are have we come into the building? if(GetPos() == building->GetPos()) { // We're there! building->AddActiveSoldier(this); // Remove myself from the map gwg->RemoveFigure(this, pos); return; } unsigned char dir = gwg->FindHumanPath(pos, building->GetFlag()->GetPos(), 100); // Or we don't find a route? if(dir == 0xFF) { // Start wandering around then StartWandering(); state = STATE_FIGUREWORK; Wander(); // Inform our home building that we're not coming anymore building->SoldierLost(this); } // All ok? else { // Find all sorts of enemies (attackers, aggressive defenders..) nearby if(FindEnemiesNearby()) // Enemy found -> abort, because nofActiveSoldier handles all things now (inclusive one walking step) return; // Start walking StartWalking(dir); } }
void noFigure::WanderToFlag() { // Existiert die Flagge überhaupt noch? noBase* no = gwg->GetNO(flagPos_); if(no->GetObjId() != flag_obj_id) { // Wenn nicht, wieder normal weiter rumirren StartWandering(); Wander(); return; } // Sind wir schon da? if(pos == flagPos_) { // Gibts noch nen Weg zu einem Lagerhaus? if(nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse( gwg->GetSpecObj<noRoadNode>(pos), FW::Condition_StoreFigure, 0, true, &job_, false)) { // ja, dann können wir ja hingehen goal_ = wh; cur_rs = 0; rs_pos = 0; fs = FS_GOHOME; wh->AddDependentFigure(this); WalkToGoal(); return; } else { // Wenn nicht, wieder normal weiter rumirren StartWandering(); Wander(); return; } } // Weiter zur Flagge gehen // Gibts noch nen Weg dahin bzw. existiert die Flagge noch? unsigned char dir = gwg->FindHumanPath(pos, flagPos_, 60, false); if(dir != 0xFF) { // weiter hinlaufen StartWalking(dir); } else { // Wenn nicht, wieder normal weiter rumirren StartWandering(); Wander(); } }
/// Geht wieder zurück zur Flagge und dann nach Hause void nofFlagWorker::GoToFlag() { // Zur Flagge zurücklaufen // Bin ich an der Fahne? if(pos == flag->GetPos()) { // nach Hause gehen nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse(*flag, FW::AcceptsFigure(job_), true, false); if(wh) { GoHome(wh); // Vorgaukeln, dass wir ein Stück Straße bereits geschafft haben // damit wir mit WalkToGoal weiter bis zum Ziel laufen können cur_rs = &emulated_wanderroad; rs_pos = 0; WalkToGoal(); } else { // Weg führt nicht mehr zum Lagerhaus, dann rumirren StartWandering(); Wander(); } // Da wir quasi "freiwillig" nach Hause gegangen sind ohne das Abreißen der Flagge, auch manuell wieder // "abmelden" gwg->GetPlayer(player).RemoveFlagWorker(this); state = STATE_FIGUREWORK; flag = NULL; } else { // Weg suchen unsigned char dir = gwg->FindHumanPath(pos, flag->GetPos(), 40); // Wenns keinen gibt, rumirren, ansonsten hinlaufen if(dir == 0xFF) { Abrogate(); StartWandering(); Wander(); state = STATE_FIGUREWORK; flag = NULL; } else { StartWalking(dir); } } }
void nofFarmhand::WalkHome() { // Sind wir zu Hause angekommen? (genauer an der Flagge !!) if(pos == dest) { // Weiteres übernimmt nofBuildingWorker WorkingReady(); return; } unsigned char dir = gwg->FindHumanPath(pos, dest, 40); // Weg suchen und ob wir überhaupt noch nach Hause kommen if(dir == 0xFF) { // Kein Weg führt mehr nach Hause--> Rumirren StartWandering(); Wander(); // Haus Bescheid sagen workplace->WorkerLost(); workplace = 0; } else { // Alles ok, wir können hinlaufen StartWalking(dir); } }
void nofGeologist::GoToNextNode() { // Wenn es keine Flagge mehr gibt, dann gleich rumirren if(!flag) { StartWandering(); Wander(); state = STATE_FIGUREWORK; return; } // ersten Punkt suchen unsigned char dir = GetNextNode(); if(dir != 0xFF) { // Wenn es einen Punkt gibt, dann hingehen state = STATE_GEOLOGIST_GOTONEXTNODE; StartWalking(dir); --signs; } else { // ansonsten zur Flagge zurückgehen state = STATE_GOTOFLAG; Walked(); } }
/// Wenn ein Kampf gewonnen wurde void nofAggressiveDefender::WonFighting() { //addon BattlefieldPromotion active? -> increase rank! if(GAMECLIENT.GetGGS().isEnabled(ADDON_BATTLEFIELD_PROMOTION)) IncreaseRank(); // Angreifer tot attacker = NULL; // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); // Ziel Bescheid sagen if(attacked_goal) attacked_goal->UnlinkAggressiveDefender(this); return; } // Angreifer ist tot, nach anderen suchen, die in meiner Nähe sind und mich evtl noch mit denen kloppen MissionAggressiveDefendingLookForNewAggressor(); }
void nofGeologist::LostWork() { flag = 0; switch(state) { default: break; // Wenn wir noch hingehen, dann zurückgehen case STATE_FIGUREWORK: { GoHome(); } break; case STATE_GOTOFLAG: { // dann sofort rumirren, wenn wir zur Flagge gehen StartWandering(); state = STATE_FIGUREWORK; } break; case STATE_GEOLOGIST_GOTONEXTNODE: case STATE_GEOLOGIST_DIG: case STATE_GEOLOGIST_CHEER: { gwg->GetNode(node_goal).reserved = false;; } break; } }
/// Wenn ein Kampf gewonnen wurde void nofDefender::WonFighting() { //addon BattlefieldPromotion active? -> increase rank! if(GAMECLIENT.GetGGS().isEnabled(ADDON_BATTLEFIELD_PROMOTION)) IncreaseRank(); // Angreifer tot attacker = 0; // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Neuen Angreifer rufen if( (attacker = building->FindAttackerNearBuilding()) ) { // Ein Angreifer gefunden, dann warten wir auf ihn, bis er kommt state = STATE_DEFENDING_WAITING; } else { // Kein Angreifer gefunden, dann gehen wir wieder in unser Gebäude state = STATE_DEFENDING_WALKINGFROM; StartWalking(1); // Angreifer auf 0 setzen, er ist ja tot attacker = 0; } }
void nofGeologist::GoToNextNode() { // Wenn es keine Flagge mehr gibt, dann gleich rumirren if(!flag) { StartWandering(); Wander(); state = STATE_FIGUREWORK; return; } // ersten Punkt suchen unsigned char dir = GetNextNode(); if(dir != INVALID_DIR) { // Wenn es einen Punkt gibt, dann hingehen state = STATE_GEOLOGIST_GOTONEXTNODE; StartWalking(Direction::fromInt(dir)); --signs; } else if(node_goal == pos) { // Already there state = STATE_GEOLOGIST_GOTONEXTNODE; --signs; Walked(); } else { // ansonsten zur Flagge zurückgehen state = STATE_GOTOFLAG; Walked(); } }
void nofHunter::WalkHome() { // Sind wir zu Hause angekommen? (genauer an der Flagge !!) unsigned short flag_x = workplace->GetX()+(workplace->GetY()&1), flag_y = workplace->GetY()+1; if(x == flag_x && y == flag_y) { // Weiteres übernimmt nofBuildingWorker WorkingReady(); } // Weg suchen und ob wir überhaupt noch nach Hause kommen (Toleranz bei dem Weg mit einberechnen, // damit er nicht einfach rumirrt und wegstirbt, wenn er einmal ein paar Felder zu weit gelaufen ist) else if((dir = gwg->FindHumanPath(x,y,flag_x,flag_y,MAX_HUNTING_DISTANCE+MAX_HUNTING_DISTANCE/4)) == 0xFF) { // Kein Weg führt mehr nach Hause--> Rumirren StartWandering(); Wander(); // Haus Bescheid sagen workplace->WorkerLost(); } else { // Alles ok, wir können hinlaufen StartWalking(dir); } }
/// Wenn ein Kampf gewonnen wurde void nofAttacker::WonFighting() { // addon BattlefieldPromotion active? -> increase rank! if(gwg->GetGGS().isEnabled(AddonId::BATTLEFIELD_PROMOTION)) IncreaseRank(); // Ist evtl. unser Heimatgebäude zerstört? if(!building && state != STATE_ATTACKING_FIGHTINGVSDEFENDER) { // Dann dem Ziel Bescheid sagen, falls es existiert (evtl. wurdes zufällig zur selben Zeit zerstört) InformTargetsAboutCancelling(); // Ggf. Schiff Bescheid sagen (Schiffs-Angreifer) if(ship_obj_id) CancelAtShip(); // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Ist evtl. unser Ziel-Gebäude zerstört? if(!attacked_goal) { // Nach Hause gehen ReturnHomeMissionAttacking(); return; } ContinueAtFlag(); }
void nofDefender::HomeDestroyedAtBegin() { building = 0; state = STATE_FIGUREWORK; // Rumirren StartWandering(); StartWalking(RANDOM.Rand(__FILE__, __LINE__, GetObjId(), 6)); }
void nofPassiveSoldier::InBuildingDestroyed() { building = 0; // Auf die Karte setzen gwg->AddFigure(this, pos); // Erstmal in zufällige Richtung rammeln StartWandering(); StartWalking(RANDOM.Rand(__FILE__, __LINE__, obj_id, 6)); }
void nofAggressiveDefender::HomeDestroyedAtBegin() { building = nullptr; // angegriffenem Gebäude Bescheid sagen, dass wir doch nicht mehr kommen InformTargetsAboutCancelling(); state = STATE_FIGUREWORK; // Rumirren StartWandering(); StartWalking(Direction(RANDOM.Rand(__FILE__, __LINE__, GetObjId(), 6))); }
/// wenn man gelaufen ist void nofDefender::Walked() { // Was bestimmtes machen, je nachdem welchen Status wir gerade haben switch(state) { case STATE_DEFENDING_WALKINGTO: { // Mit Angreifer den Kampf beginnen gwg->AddFigure(new noFighting(attacker, this), pos); state = STATE_FIGHTING; attacker->state = STATE_ATTACKING_FIGHTINGVSDEFENDER; } break; case STATE_DEFENDING_WALKINGFROM: { // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Rumirren attacker = 0; state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Zu Hause angekommen // Ist evtl. wieder ein Angreifer in der Zwischenzeit an der Fahne angekommen? if(attacker) { // dann umdrehen und wieder rausgehen state = STATE_DEFENDING_WALKINGTO; StartWalking(4); } else { // mich von der Landkarte tilgen gwg->RemoveFigure(this, pos); // mich zum Gebäude wieder hinzufügen building->AddActiveSoldier(this); // Gebäude Bescheid sagen, dass es nun keinen Verteidiger mehr gibt building->NoDefender(); } } break; default: break; } }
/// wenn man gelaufen ist void nofDefender::Walked() { // Was bestimmtes machen, je nachdem welchen Status wir gerade haben switch(state) { case STATE_DEFENDING_WALKINGTO: { // Mit Angreifer den Kampf beginnen gwg->AddFigure(new noFighting(attacker, this), pos); state = STATE_FIGHTING; attacker->FightVsDefenderStarted(); } break; case STATE_DEFENDING_WALKINGFROM: { // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Rumirren attacker = 0; state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Zu Hause angekommen // Ist evtl. wieder ein Angreifer in der Zwischenzeit an der Fahne angekommen? if(attacker) { // dann umdrehen und wieder rausgehen state = STATE_DEFENDING_WALKINGTO; StartWalking(4); } else { // mich von der Landkarte tilgen gwg->RemoveFigure(this, pos); nobBaseMilitary* bld = building; // mich zum Gebäude wieder hinzufügen RTTR_Assert(bld->GetDefender() == this); // I should be the defender bld->AddActiveSoldier(this); RTTR_Assert(!bld->GetDefender()); // No defender anymore } } break; default: break; } }
void noFigure::GoHome(noRoadNode* goal) { if(on_ship) { // Wir befinden uns gerade an Deck, also einfach goal auf Null setzen und dann sehen wir, was so passiert this->goal_ = NULL; return; } // Nächstes Lagerhaus suchen else if(!goal) { // Wenn wir cur_rs == 0, dann hängen wir wahrscheinlich noch im Lagerhaus in der Warteschlange if(cur_rs == 0) { assert(gwg->GetNO(pos)->GetGOT() == GOT_NOB_HQ || //-V807 gwg->GetNO(pos)->GetGOT() == GOT_NOB_STOREHOUSE || gwg->GetNO(pos)->GetGOT() == GOT_NOB_HARBORBUILDING); gwg->GetSpecObj<nobBaseWarehouse>(pos)->CancelFigure(this); return; } else this->goal_ = gwg->GetPlayer(player).FindWarehouse((rs_dir) ? cur_rs->GetF1() : cur_rs->GetF2(), FW::Condition_StoreFigure, 0, true, &job_, false); } else this->goal_ = goal; if(this->goal_) { fs = FS_GOHOME; // Lagerhaus Bescheid sagen static_cast<nobBaseWarehouse*>(this->goal_)->AddDependentFigure(this); // Wenn wir stehen, zusätzlich noch loslaufen! if(waiting_for_free_node) { waiting_for_free_node = false; WalkToGoal(); // anderen Leuten noch ggf Bescheid sagen gwg->RoadNodeAvailable(this->pos); } } else { // Kein Lagerhaus gefunden --> Rumirren StartWandering(); cur_rs = 0; } }
void nofBuilder::LostWork() { building_site = NULL; if(state == STATE_FIGUREWORK) GoHome(); else { // Event abmelden em->RemoveEvent(current_ev); StartWandering(); Wander(); state = STATE_FIGUREWORK; } }
void nofAggressiveDefender::HomeDestroyedAtBegin() { building = 0; // angegriffenem Gebäude Bescheid sagen, dass wir doch nicht mehr kommen if(attacked_goal) { attacked_goal->UnlinkAggressiveDefender(this); attacked_goal = 0; } state = STATE_FIGUREWORK; // Rumirren StartWandering(); StartWalking(RANDOM.Rand(__FILE__,__LINE__,obj_id,6)); }
/// Boat carrier paddles to the coast after his road was destroyed void nofCarrier::WanderOnWater() { // Are we already there? if(rs_pos == shore_path->size()) { // Start normal wandering at the land state = CARRS_FIGUREWORK; StartWandering(); Wander(); delete shore_path; shore_path = NULL; } else { // Continue paddling to the coast StartWalking(shore_path->at(rs_pos)); ++rs_pos; } }
void nofGeologist::LostWork() { flag = nullptr; switch(state) { default: break; // Wenn wir noch hingehen, dann zurückgehen case STATE_FIGUREWORK: { GoHome(); } break; case STATE_GOTOFLAG: { // dann sofort rumirren, wenn wir zur Flagge gehen StartWandering(); state = STATE_FIGUREWORK; } break; } }
void nofScout_Free::LostWork() { flag = 0; switch(state) { default: break; // Wenn wir noch hingehen, dann zurückgehen case STATE_FIGUREWORK: { GoHome(); } break; case STATE_GOTOFLAG: case STATE_SCOUT_SCOUTING: { // dann sofort rumirren, wenn wir zur Flagge gehen StartWandering(); state = STATE_FIGUREWORK; } break; } }
/// Wenn ein Heimat-Militärgebäude bei Missionseinsätzen zerstört wurde void nofAttacker::HomeDestroyed() { switch(state) { case STATE_ATTACKING_WAITINGAROUNDBUILDING: { // Hier muss sofort reagiert werden, da man steht // Angreifer muss zusätzlich seinem Ziel Bescheid sagen nobBaseMilitary* curGoal = attacked_goal; // attacked_goal gets reset InformTargetsAboutCancelling(); // Ggf. Schiff Bescheid sagen (Schiffs-Angreifer) if(ship_obj_id) CancelAtShip(); // Rumirren building = nullptr; state = STATE_FIGUREWORK; StartWandering(); Wander(); // und evtl einen Nachrücker für diesen Platz suchen curGoal->SendSuccessor(pos, radius); } break; default: { // Wenn wir gerade auf dem Weg dorthin sind (z.B. an Bord eines Schiffs), Ziel löschen if(goal_ == building) goal_ = nullptr; // Die normale Tätigkeit wird erstmal fortgesetzt (Laufen, Kämpfen, wenn er schon an der Fahne ist // wird er auch nicht mehr zurückgehen) building = nullptr; } break; } }
/// Wenn ein Kampf gewonnen wurde void nofAggressiveDefender::WonFighting() { // addon BattlefieldPromotion active? -> increase rank! if(gwg->GetGGS().isEnabled(AddonId::BATTLEFIELD_PROMOTION)) IncreaseRank(); // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Ziel Bescheid sagen InformTargetsAboutCancelling(); // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Continue walking to our attacker MissAggressiveDefendingContinueWalking(); }
/// Wenn ein Kampf gewonnen wurde void nofAggressiveDefender::WonFighting() { // Angreifer tot attacker = NULL; // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); // Ziel Bescheid sagen if(attacked_goal) attacked_goal->UnlinkAggressiveDefender(this); return; } // Angreifer ist tot, nach anderen suchen, die in meiner Nähe sind und mich evtl noch mit denen kloppen MissionAggressiveDefendingLookForNewAggressor(); }
/// Wenn ein Heimat-Militärgebäude bei Missionseinsätzen zerstört wurde void nofAttacker::HomeDestroyed() { switch(state) { case STATE_ATTACKING_WAITINGAROUNDBUILDING: { // Hier muss sofort reagiert werden, da man steht // Angreifer muss zusätzlich seinem Ziel Bescheid sagen attacked_goal->UnlinkAggressor(this); // Ggf. Schiff Bescheid sagen (Schiffs-Angreifer) if(ship_obj_id) CancelAtShip(); // Rumirren building = 0; state = STATE_FIGUREWORK; StartWandering(); Wander(); // und evtl einen Nachrücker für diesen Platz suchen attacked_goal->SendSuccessor(pos, radius, dir); } break; default: { // Die normale Tätigkeit wird erstmal fortgesetzt (Laufen, Kämpfen, wenn er schon an der Fahne ist // wird er auch nicht mehr zurückgehen) building = 0; } break; } }
void nofShipWright::WalkHome() { // Sind wir zu Hause angekommen? (genauer an der Flagge !!) if(pos == dest) { // Weiteres übernimmt nofBuildingWorker WorkingReady(); } // Weg suchen und ob wir überhaupt noch nach Hause kommen else if((dir = gwg->FindHumanPath(pos, dest, SHIPWRIGHT_WALKING_DISTANCE)) == 0xFF) { // Kein Weg führt mehr nach Hause--> Rumirren StartWandering(); Wander(); // Haus Bescheid sagen workplace->WorkerLost(); workplace = 0; } else { // Alles ok, wir können hinlaufen StartWalking(dir); } }
void nofPlaner::LostWork() { building_site = 0; if(state == STATE_FIGUREWORK) GoHome(); else { // Event ggf. abmelden if(state == STATE_PLANING) { em->RemoveEvent(current_ev); /// Sounds abmelden SOUNDMANAGER.WorkingFinished(this); } StartWandering(); // wenn wir schon laufen, nicht nochmal laufen! if(state != STATE_WALKING) Wander(); state = STATE_FIGUREWORK; } }