Seperated battle finding logic from CitizenMilitary.find_battle_and_fight method

This commit is contained in:
Eriks K 2020-12-01 13:02:10 +02:00
parent b88e7973e8
commit b338ea598a
2 changed files with 51 additions and 40 deletions

View File

@ -1673,9 +1673,8 @@ class CitizenMilitary(CitizenTravel):
def has_battle_contribution(self): def has_battle_contribution(self):
return bool(self.__last_war_update_data.get("citizen_contribution", [])) return bool(self.__last_war_update_data.get("citizen_contribution", []))
def find_battle_and_fight(self): def find_battle_to_fight(self, silent: bool = False) -> Tuple[classes.Battle, classes.BattleDivision, classes.BattleSide]:
if self.should_fight()[0]: self.update_war_info()
self.write_log("Checking for battles to fight in...")
for battle in self.sorted_battles(self.config.sort_battles_time): for battle in self.sorted_battles(self.config.sort_battles_time):
if not isinstance(battle, classes.Battle): if not isinstance(battle, classes.Battle):
continue continue
@ -1687,7 +1686,7 @@ class CitizenMilitary(CitizenTravel):
if self.config.air and div.is_air: if self.config.air and div.is_air:
battle_zone = div battle_zone = div
break break
elif self.config.ground and not div.is_air and (div.div == self.division or self.maverick): elif self.config.ground and not div.is_air and (div.div == self.division or (self.maverick and self.config.maverick)):
battle_zone = div battle_zone = div
break break
else: else:
@ -1705,6 +1704,7 @@ class CitizenMilitary(CitizenTravel):
defender_side = self.details.current_country in battle.defender.allies + [battle.defender.country, ] defender_side = self.details.current_country in battle.defender.allies + [battle.defender.country, ]
side = battle.defender if defender_side else battle.invader side = battle.defender if defender_side else battle.invader
if not silent:
self.write_log(battle) self.write_log(battle)
travel = (self.config.travel_to_fight and self.should_travel_to_fight() or self.config.force_travel) \ travel = (self.config.travel_to_fight and self.should_travel_to_fight() or self.config.force_travel) \
@ -1712,6 +1712,17 @@ class CitizenMilitary(CitizenTravel):
if not travel: if not travel:
continue continue
yield battle, battle_zone, side
def find_battle_and_fight(self):
if self.should_fight()[0]:
self.write_log("Checking for battles to fight in...")
for battle, division, side in self.find_battle_to_fight():
allies = battle.invader.deployed + battle.defender.deployed + [battle.invader.country,
battle.defender.country]
travel_needed = self.details.current_country not in allies
if battle.start > self.now: if battle.start > self.now:
self.sleep(utils.get_sleep_seconds(battle.start)) self.sleep(utils.get_sleep_seconds(battle.start))
@ -1728,9 +1739,9 @@ class CitizenMilitary(CitizenTravel):
if not self.travel_to_battle(battle, countries_to_travel): if not self.travel_to_battle(battle, countries_to_travel):
break break
if self.change_division(battle, battle_zone): if self.change_division(battle, division):
self.set_default_weapon(battle, battle_zone) self.set_default_weapon(battle, division)
self.fight(battle, battle_zone, side) self.fight(battle, division, side)
self.travel_to_residence() self.travel_to_residence()
break break

View File

@ -719,11 +719,11 @@ class BattleSide:
def __repr__(self): def __repr__(self):
side_text = "Defender" if self.is_defender else "Invader " side_text = "Defender" if self.is_defender else "Invader "
return f"<BattleSide: {side_text} {self.country.name}|{self.points:02d}p>" return f"<BattleSide: {side_text} {self.country.name}|{self.points:>2d}p>"
def __str__(self): def __str__(self):
side_text = "Defender" if self.is_defender else "Invader " side_text = "Defender" if self.is_defender else "Invader "
return f"{side_text} {self.country.name} - {self.points:02d} points" return f"{side_text} {self.country.name} - {self.points:>2d} points"
def __format__(self, format_spec): def __format__(self, format_spec):
return self.country.iso return self.country.iso
@ -789,7 +789,7 @@ class BattleDivision:
return constants.TERRAINS[self.terrain] return constants.TERRAINS[self.terrain]
def __str__(self): def __str__(self):
base_name = f"Div #{self.id} d{self.div}" base_name = f"D{self.div} #{self.id}"
if self.terrain: if self.terrain:
base_name += f" ({self.terrain_display})" base_name += f" ({self.terrain_display})"
if self.div_end: if self.div_end:
@ -899,8 +899,8 @@ class Battle:
else: else:
time_part = "-{}".format(self.start - time_now) time_part = "-{}".format(self.start - time_now)
return (f"Battle {self.id} for {self.region_name[:16]} | " return (f"Battle {self.id} for {self.region_name[:16]:16} | "
f"{self.invader} : {self.defender} | Round time {time_part}") f"{self.invader} : {self.defender} | Round time {time_part} | {'R'+str(self.zone_id):>3}")
def __repr__(self): def __repr__(self):
return f"<Battle #{self.id} {self.invader}:{self.defender} R{self.zone_id}>" return f"<Battle #{self.id} {self.invader}:{self.defender} R{self.zone_id}>"