/// Doesn't find a defender at the flag -> Send defenders or capture it void nofAttacker::ContinueAtFlag() { RTTR_Assert(attacked_goal); // Greifen wir grad ein Gebäude an? if(state == STATE_ATTACKING_FIGHTINGVSDEFENDER || (state == STATE_FIGHTING && attacked_goal->GetFlag()->GetPos() == pos)) { // Dann neuen Verteidiger rufen if(attacked_goal->CallDefender(this)) //-V522 { // Verteidiger gefunden --> hinstellen und auf ihn warten SwitchStateAttackingWaitingForDefender(); } else { // check for soldiers of other non-friendly non-owner players to fight if(FindEnemiesNearby(attacked_goal->GetPlayer())) return; // kein Verteidiger gefunden --> ins Gebäude laufen und es erobern state = STATE_ATTACKING_CAPTURINGFIRST; StartWalking(Direction::NORTHWEST); // Normalen Militärgebäuden schonmal Bescheid sagen if(attacked_goal->GetGOT() == GOT_NOB_MILITARY) static_cast<nobMilitary*>(attacked_goal)->PrepareCapturing(); } } else { // weiterlaufen state = STATE_ATTACKING_WALKINGTOGOAL; MissAttackingWalk(); } }
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 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 nofAggressiveDefender::MissAggressiveDefendingWalk() { // Ist evtl. unser Heimatgebäude zerstört? if(!building) { attacker = NULL; // Ziel Bescheid sagen if(attacked_goal) { attacked_goal->UnlinkAggressiveDefender(this); attacked_goal = 0; } // 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 MissionAggressiveDefendingLookForNewAggressor(); return; } // Look for enemies if(FindEnemiesNearby()) // Enemy found -> abort, because nofActiveSoldier handles all things now return; // Calc next walking direction dir = gwg->FindHumanPath(x,y,attacker->GetX(), attacker->GetY(),100,true); if(dir == 0xFF) { // No route found // Look for new attacker MissionAggressiveDefendingLookForNewAggressor(); } else { // Continue walking towards him StartWalking(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)); }