Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
95a78b6e7e | |||
b338ea598a | |||
b88e7973e8 | |||
c671425531 |
@ -4,7 +4,7 @@
|
||||
|
||||
__author__ = """Eriks Karls"""
|
||||
__email__ = 'eriks@72.lv'
|
||||
__version__ = '0.23.1'
|
||||
__version__ = '0.23.1.2'
|
||||
|
||||
from erepublik import classes, utils, constants
|
||||
from erepublik.citizen import Citizen
|
||||
|
@ -1673,46 +1673,57 @@ class CitizenMilitary(CitizenTravel):
|
||||
def has_battle_contribution(self):
|
||||
return bool(self.__last_war_update_data.get("citizen_contribution", []))
|
||||
|
||||
def find_battle_to_fight(self, silent: bool = False) -> Tuple[classes.Battle, classes.BattleDivision, classes.BattleSide]:
|
||||
self.update_war_info()
|
||||
for battle in self.sorted_battles(self.config.sort_battles_time):
|
||||
if not isinstance(battle, classes.Battle):
|
||||
continue
|
||||
battle_zone: Optional[classes.BattleDivision] = None
|
||||
for div in battle.div.values():
|
||||
if div.terrain == 0:
|
||||
if div.div_end:
|
||||
continue
|
||||
if self.config.air and div.is_air:
|
||||
battle_zone = div
|
||||
break
|
||||
elif self.config.ground and not div.is_air and (div.div == self.division or (self.maverick and self.config.maverick)):
|
||||
battle_zone = div
|
||||
break
|
||||
else:
|
||||
continue
|
||||
if not battle_zone:
|
||||
continue
|
||||
allies = battle.invader.deployed + battle.defender.deployed + [battle.invader.country,
|
||||
battle.defender.country]
|
||||
|
||||
travel_needed = self.details.current_country not in allies
|
||||
|
||||
if battle.is_rw:
|
||||
side = battle.defender if self.config.rw_def_side else battle.invader
|
||||
else:
|
||||
defender_side = self.details.current_country in battle.defender.allies + [battle.defender.country, ]
|
||||
side = battle.defender if defender_side else battle.invader
|
||||
|
||||
if not silent:
|
||||
self.write_log(battle)
|
||||
|
||||
travel = (self.config.travel_to_fight and self.should_travel_to_fight() or self.config.force_travel) \
|
||||
if travel_needed else True
|
||||
|
||||
if not travel:
|
||||
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 in self.sorted_battles(self.config.sort_battles_time):
|
||||
if not isinstance(battle, classes.Battle):
|
||||
continue
|
||||
battle_zone: Optional[classes.BattleDivision] = None
|
||||
for div in battle.div.values():
|
||||
if div.terrain == 0:
|
||||
if div.div_end:
|
||||
continue
|
||||
if self.config.air and div.is_air:
|
||||
battle_zone = div
|
||||
break
|
||||
elif self.config.ground and not div.is_air and (div.div == self.division or self.maverick):
|
||||
battle_zone = div
|
||||
break
|
||||
else:
|
||||
continue
|
||||
if not battle_zone:
|
||||
continue
|
||||
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.is_rw:
|
||||
side = battle.defender if self.config.rw_def_side else battle.invader
|
||||
else:
|
||||
defender_side = self.details.current_country in battle.defender.allies + [battle.defender.country, ]
|
||||
side = battle.defender if defender_side else battle.invader
|
||||
|
||||
self.write_log(battle)
|
||||
|
||||
travel = (self.config.travel_to_fight and self.should_travel_to_fight() or self.config.force_travel) \
|
||||
if travel_needed else True
|
||||
|
||||
if not travel:
|
||||
continue
|
||||
|
||||
if battle.start > self.now:
|
||||
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):
|
||||
break
|
||||
if self.change_division(battle, battle_zone):
|
||||
self.set_default_weapon(battle, battle_zone)
|
||||
self.fight(battle, battle_zone, side)
|
||||
if self.change_division(battle, division):
|
||||
self.set_default_weapon(battle, division)
|
||||
self.fight(battle, division, side)
|
||||
self.travel_to_residence()
|
||||
break
|
||||
|
||||
|
@ -719,11 +719,11 @@ class BattleSide:
|
||||
|
||||
def __repr__(self):
|
||||
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):
|
||||
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):
|
||||
return self.country.iso
|
||||
@ -789,7 +789,7 @@ class BattleDivision:
|
||||
return constants.TERRAINS[self.terrain]
|
||||
|
||||
def __str__(self):
|
||||
base_name = f"Div #{self.id} d{self.div}"
|
||||
base_name = f"D{self.div} #{self.id}"
|
||||
if self.terrain:
|
||||
base_name += f" ({self.terrain_display})"
|
||||
if self.div_end:
|
||||
@ -899,8 +899,8 @@ class Battle:
|
||||
else:
|
||||
time_part = "-{}".format(self.start - time_now)
|
||||
|
||||
return (f"Battle {self.id} for {self.region_name[:16]} | "
|
||||
f"{self.invader} : {self.defender} | Round time {time_part}")
|
||||
return (f"Battle {self.id} for {self.region_name[:16]:16} | "
|
||||
f"{self.invader} : {self.defender} | Round time {time_part} | {'R'+str(self.zone_id):>3}")
|
||||
|
||||
def __repr__(self):
|
||||
return f"<Battle #{self.id} {self.invader}:{self.defender} R{self.zone_id}>"
|
||||
|
@ -338,17 +338,8 @@ def calculate_hit(strength: float, rang: int, tp: bool, elite: bool, ne: bool, b
|
||||
base_wpn = (1 + Decimal(str(weapon / 100)))
|
||||
dmg = 10 * base_str * base_rnk * base_wpn
|
||||
|
||||
if elite:
|
||||
dmg = dmg * 11 / 10
|
||||
|
||||
if tp and rang >= 70:
|
||||
dmg = dmg * (1 + Decimal((rang - 69) / 10))
|
||||
|
||||
dmg = dmg * (100 + booster) / 100
|
||||
|
||||
if ne:
|
||||
dmg = dmg * 11 / 10
|
||||
return round(dmg, dec)
|
||||
dmg = get_final_hit_dmg(dmg, rang, tp=tp, elite=elite, ne=ne, booster=booster)
|
||||
return Decimal(round(dmg, dec))
|
||||
|
||||
|
||||
def get_ground_hit_dmg_value(citizen_id: int, natural_enemy: bool = False, true_patriot: bool = False,
|
||||
@ -371,6 +362,19 @@ def get_air_hit_dmg_value(citizen_id: int, natural_enemy: bool = False, true_pat
|
||||
return calculate_hit(0, rang, true_patriot, elite, natural_enemy, booster, weapon_power)
|
||||
|
||||
|
||||
def get_final_hit_dmg(base_dmg: Union[Decimal, float, str], rang: int,
|
||||
tp: bool = False, elite: bool = False, ne: bool = False, booster: int = 0) -> Decimal:
|
||||
dmg = Decimal(str(base_dmg))
|
||||
|
||||
if elite:
|
||||
dmg = dmg * 11 / 10
|
||||
if tp and rang >= 70:
|
||||
dmg = dmg * (1 + Decimal((rang - 69) / 10))
|
||||
dmg = dmg * (100 + booster) / 100
|
||||
if ne:
|
||||
dmg = dmg * 11 / 10
|
||||
return Decimal(dmg)
|
||||
|
||||
# def _clear_up_battle_memory(battle):
|
||||
# del battle.invader._battle, battle.defender._battle
|
||||
# for div_id, division in battle.div.items():
|
||||
|
@ -1,5 +1,5 @@
|
||||
[bumpversion]
|
||||
current_version = 0.23.1
|
||||
current_version = 0.23.1.2
|
||||
commit = True
|
||||
tag = True
|
||||
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\.?(?P<dev>\d+)?
|
||||
|
Reference in New Issue
Block a user