/// 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 nofAggressiveDefender::ReturnHomeMissionAggressiveDefending() { // Zielen Bescheid sagen InformTargetsAboutCancelling(); // Und nach Hause gehen ReturnHome(); }
/// Sea attacker enters harbor and finds no shipping route or no longer has a valid target: set state,target,goal,building to 0 to avoid /// future problems (and add to harbor inventory) void nofAttacker::SeaAttackFailedBeforeLaunch() { InformTargetsAboutCancelling(); RTTR_Assert(!huntingDefender); AbrogateWorkplace(); goal_ = nullptr; state = STATE_FIGUREWORK; }
/// Wenn ein Kampf verloren wurde (Tod) void nofAggressiveDefender::LostFighting() { // Meinem zu Hause Bescheid sagen, dass ich nicht mehr lebe (damit neue Truppen reinkönnen), // falls es noch existiert AbrogateWorkplace(); // Ziel Bescheid sagen, das ich verteidigt hatte InformTargetsAboutCancelling(); }
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))); }
void nofAttacker::ReturnHomeMissionAttacking() { // Zielen Bescheid sagen InformTargetsAboutCancelling(); // Schiffsangreifer? if(ship_obj_id) { state = STATE_SEAATTACKING_RETURNTOSHIP; HandleState_SeaAttack_ReturnToShip(); } else // Und nach Hause gehen ReturnHome(); }
/// Wenn ein Kampf verloren wurde (Tod) void nofAttacker::LostFighting() { // Meinem zu Hause Bescheid sagen, dass ich nicht mehr lebe (damit neue Truppen reinkönnen) // falls das Gebäude noch existiert AbrogateWorkplace(); // Angreifer müssen zusätzlich ihrem Ziel Bescheid sagen InformTargetsAboutCancelling(); // Ggf. Schiff Bescheid sagen if(ship_obj_id) this->CancelAtShip(); }
/// 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(); }
/// Sagt Schiffsangreifern, dass sie mit dem Schiff zurück fahren void nofAttacker::StartReturnViaShip(noShip& ship) { if(pos.isValid()) { // remove us from where we are, so nobody will ever draw us :) gwg->RemoveFigure(pos, this); pos = MapPoint::Invalid(); // Similar to start ship journey // Uns zum Schiff hinzufügen ship.AddReturnedAttacker(this); } else { // If pos is not valid, then we are still on the ship! // This can happen, if the ship cannot reach its target RTTR_Assert(state == STATE_SEAATTACKING_ONSHIP); RTTR_Assert(helpers::contains(ship.GetFigures(), this)); InformTargetsAboutCancelling(); } goal_ = building; state = STATE_FIGUREWORK; fs = FS_GOTOGOAL; on_ship = true; ship_obj_id = 0; }
void nofAggressiveDefender::NeedForHomeDefence() { InformTargetsAboutCancelling(); }
void nofAggressiveDefender::MissAggressiveDefendingWalk() { // Ist evtl. unser Heimatgebäude zerstört? if(!building) { InformTargetsAboutCancelling(); // Rumirren state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Wenns das Zielgebäude nich mehr gibt, gleich nach Hause gehen! if(!attacked_goal) { ReturnHomeMissionAggressiveDefending(); return; } // Does the attacker still exists? if(!attacker) { // Look for a new one MissionAggressiveDefendingLookForNewAggressor(); return; } // Does he still want to fight? if(!attacker->IsReadyForFight()) { // Look for a new one CancelAtAttacker(); MissionAggressiveDefendingLookForNewAggressor(); return; } // Look for enemies if(FindEnemiesNearby()) { // Enemy found -> abort, because nofActiveSoldier handles all things now // Note it is ok, if the enemy is our attacker. // If we win, we will either see, that the attacker is busy or be notified because he did // If we loose, we will tell him later return; } RTTR_Assert(pos != attacker->GetPos()); // If so, why was it not found? // Calc next walking direction unsigned char dir = gwg->FindHumanPath(pos, attacker->GetPos(), 100, true); if(dir == 0xFF) { // No route found // Look for new attacker CancelAtAttacker(); MissionAggressiveDefendingLookForNewAggressor(); } else { // Continue walking towards him StartWalking(Direction(dir)); } }
void nofAttacker::MissAttackingWalk() { // Ist evtl. unser Heimatgebäude zerstört? if(!building) { // 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; } // Gibts das Ziel überhaupt noch? if(!attacked_goal) { ReturnHomeMissionAttacking(); return; } /*// Is it still a hostile destination? // (Could be captured in the meantime) if(!players->getElement(player)->IsPlayerAttackable(attacked_goal->GetPlayer())) { ReturnHomeMissionAttacking(); return; }*/ // Eine Position rund um das Militärgebäude suchen MapPoint goal = attacked_goal->FindAnAttackerPlace(radius, this); // Keinen Platz mehr gefunden? if(!goal.isValid()) { // Dann nach Haus gehen ReturnHomeMissionAttacking(); return; } // Sind wir evtl schon da? if(pos == goal) { ReachedDestination(); return; } // Find all sorts of enemies (attackers, aggressive defenders..) nearby if(FindEnemiesNearby()) // Enemy found -> abort, because nofActiveSoldier handles all things now return; // Haben wir noch keinen Feind? // Könnte mir noch ein neuer Verteidiger entgegenlaufen? TryToOrderAggressiveDefender(); // Ansonsten Weg zum Ziel suchen unsigned char dir = gwg->FindHumanPath(pos, goal, MAX_ATTACKING_RUN_DISTANCE, true); // Keiner gefunden? Nach Hause gehen if(dir == 0xff) { ReturnHomeMissionAttacking(); return; } // Start walking StartWalking(Direction(dir)); }
/// Bricht einen Seeangriff ab void nofAttacker::CancelSeaAttack() { InformTargetsAboutCancelling(); RTTR_Assert(!huntingDefender); Abrogate(); }
/// Bricht einen Seeangriff ab void nofAttacker::CancelSeaAttack() { InformTargetsAboutCancelling(); }