Skip to content

Instantly share code, notes, and snippets.

@klawx3
Created November 12, 2025 01:51
Show Gist options
  • Select an option

  • Save klawx3/91131a628b5e5e612f50adbf1ec03eaf to your computer and use it in GitHub Desktop.

Select an option

Save klawx3/91131a628b5e5e612f50adbf1ec03eaf to your computer and use it in GitHub Desktop.
arc riders mini lab
from enum import Enum
class ShieldType(Enum):
NONE = 0
LIGHT = 1
MEDIUM = 2
HEAVY = 3
class RiderHealth:
#None is no shield
light_shield_health = 40 # 0
medium_shield_health = 70 # 1
high_shield_health = 80 # 2
def __init__(self, selected_shield: ShieldType):
self.selected_shield = selected_shield
self.reset_health()
def reset_health(self):
self._heal = 100
self._shield = self._get_shield_health()
self._total_hits = 0
self._history = []
def get_selected_shield(self):
return self.selected_shield
def get_health_status(self):
return (self._heal, self._shield)
def _get_shield_health(self) -> int:
if self.selected_shield == ShieldType.NONE:
return 0
elif self.selected_shield == ShieldType.LIGHT:
return self.light_shield_health
elif self.selected_shield == ShieldType.MEDIUM:
return self.medium_shield_health
elif self.selected_shield == ShieldType.HEAVY:
return self.high_shield_health
def _get_shield_migation(self) -> float:
if self.selected_shield == ShieldType.NONE:
return 0
elif self.selected_shield == ShieldType.LIGHT:
return 0.4
elif self.selected_shield == ShieldType.MEDIUM:
return 0.425
elif self.selected_shield == ShieldType.HEAVY:
return 0.525
def hit(self,damage:int):
self._pre_hit_history()
self._total_hits += 1
if self._shield == 0:
self._heal -= damage
else:
self._heal -= (1 - self._get_shield_migation()) * damage
damage_to_shield = damage
if (self._shield - damage_to_shield) < 0: # destroyed shield
self._shield = 0
else:
self._shield -= damage_to_shield
self._post_hit_history()
#self._heal -= additional_health_damage
def _pre_hit_history(self):
pass
def _post_hit_history(self):
pass
def alive(self) -> bool:
return self._heal > 0
def shield_up(self) -> bool:
return self._shield > 0
def get_total_hits(self):
return self._total_hits
class RiderLab:
def __init__(self):
self.reload_all_lab()
def reload_all_lab(self):
self.rider_none = RiderHealth(selected_shield=ShieldType.NONE)
self.rider_light = RiderHealth(selected_shield=ShieldType.LIGHT)
self.rider_medium = RiderHealth(selected_shield=ShieldType.MEDIUM)
self.rider_heavy = RiderHealth(selected_shield=ShieldType.HEAVY)
self.all_specimens = []
self.all_specimens.append(self.rider_none)
self.all_specimens.append(self.rider_light)
self.all_specimens.append(self.rider_medium)
self.all_specimens.append(self.rider_heavy)
def hit_until_die(self, damage:int , verbose=False):
for rider in self.all_specimens:
while rider.alive():
health_before_hit , shield_before_hit = rider.get_health_status()
rider.hit(damage)
health_after_hit , shield_after_hit = rider.get_health_status()
if verbose:
print(f"Rider with shield {rider.get_selected_shield()}: Health : {health_before_hit} -> {health_after_hit}\t Shield: {shield_before_hit} -> {shield_after_hit}")
if not rider.alive():
print(f"Rider with shield {rider.get_selected_shield()}: is dead with {rider.get_total_hits()}hits if damage is {damage}\n")
if __name__ == "__main__":
lab = RiderLab()
lab.hit_until_die(6 * 2.5,verbose=True) # this is an example of bobcat dmg with headshoot mult
Rider with shield ShieldType.NONE: Health : 100 -> 85.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: Health : 85.0 -> 70.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: Health : 70.0 -> 55.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: Health : 55.0 -> 40.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: Health : 40.0 -> 25.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: Health : 25.0 -> 10.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: Health : 10.0 -> -5.0 Shield: 0 -> 0
Rider with shield ShieldType.NONE: is dead with 7hits if damage is 15.0
Rider with shield ShieldType.LIGHT: Health : 100 -> 91.0 Shield: 40 -> 25.0
Rider with shield ShieldType.LIGHT: Health : 91.0 -> 82.0 Shield: 25.0 -> 10.0
Rider with shield ShieldType.LIGHT: Health : 82.0 -> 73.0 Shield: 10.0 -> 0
Rider with shield ShieldType.LIGHT: Health : 73.0 -> 58.0 Shield: 0 -> 0
Rider with shield ShieldType.LIGHT: Health : 58.0 -> 43.0 Shield: 0 -> 0
Rider with shield ShieldType.LIGHT: Health : 43.0 -> 28.0 Shield: 0 -> 0
Rider with shield ShieldType.LIGHT: Health : 28.0 -> 13.0 Shield: 0 -> 0
Rider with shield ShieldType.LIGHT: Health : 13.0 -> -2.0 Shield: 0 -> 0
Rider with shield ShieldType.LIGHT: is dead with 8hits if damage is 15.0
Rider with shield ShieldType.MEDIUM: Health : 100 -> 91.375 Shield: 70 -> 55.0
Rider with shield ShieldType.MEDIUM: Health : 91.375 -> 82.75 Shield: 55.0 -> 40.0
Rider with shield ShieldType.MEDIUM: Health : 82.75 -> 74.125 Shield: 40.0 -> 25.0
Rider with shield ShieldType.MEDIUM: Health : 74.125 -> 65.5 Shield: 25.0 -> 10.0
Rider with shield ShieldType.MEDIUM: Health : 65.5 -> 56.875 Shield: 10.0 -> 0
Rider with shield ShieldType.MEDIUM: Health : 56.875 -> 41.875 Shield: 0 -> 0
Rider with shield ShieldType.MEDIUM: Health : 41.875 -> 26.875 Shield: 0 -> 0
Rider with shield ShieldType.MEDIUM: Health : 26.875 -> 11.875 Shield: 0 -> 0
Rider with shield ShieldType.MEDIUM: Health : 11.875 -> -3.125 Shield: 0 -> 0
Rider with shield ShieldType.MEDIUM: is dead with 9hits if damage is 15.0
Rider with shield ShieldType.HEAVY: Health : 100 -> 92.875 Shield: 80 -> 65.0
Rider with shield ShieldType.HEAVY: Health : 92.875 -> 85.75 Shield: 65.0 -> 50.0
Rider with shield ShieldType.HEAVY: Health : 85.75 -> 78.625 Shield: 50.0 -> 35.0
Rider with shield ShieldType.HEAVY: Health : 78.625 -> 71.5 Shield: 35.0 -> 20.0
Rider with shield ShieldType.HEAVY: Health : 71.5 -> 64.375 Shield: 20.0 -> 5.0
Rider with shield ShieldType.HEAVY: Health : 64.375 -> 57.25 Shield: 5.0 -> 0
Rider with shield ShieldType.HEAVY: Health : 57.25 -> 42.25 Shield: 0 -> 0
Rider with shield ShieldType.HEAVY: Health : 42.25 -> 27.25 Shield: 0 -> 0
Rider with shield ShieldType.HEAVY: Health : 27.25 -> 12.25 Shield: 0 -> 0
Rider with shield ShieldType.HEAVY: Health : 12.25 -> -2.75 Shield: 0 -> 0
Rider with shield ShieldType.HEAVY: is dead with 10hits if damage is 15.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment