def test_recover_time(): cof: ConeOfFire = ConeOfFire( max_angle=2.0, min_angle=1.0, bloom=0.1, recovery_rate=10.0, recovery_delay=100, multiplier=1.0, moving_multiplier=2.0, pellet_spread=0.0, ) assert cof.recover_time(current=2.0) == 200 cof: ConeOfFire = ConeOfFire( max_angle=2.0, min_angle=1.0, bloom=0.1, recovery_rate=0.0, recovery_delay=100, multiplier=1.0, moving_multiplier=2.0, pellet_spread=0.0, ) assert cof.recover_time(current=2.0) == -1
def test_min_cof_angle(): cof: ConeOfFire = ConeOfFire( max_angle=2.0, min_angle=1.0, bloom=0.1, recovery_rate=10.0, recovery_delay=100, multiplier=2.0, moving_multiplier=2.0, pellet_spread=0.0, ) assert cof.min_cof_angle(moving=False) == 2.0 assert cof.min_cof_angle(moving=True) == 4.0
def test_apply_bloom(): cof: ConeOfFire = ConeOfFire( max_angle=2.0, min_angle=1.0, bloom=0.1, recovery_rate=10.0, recovery_delay=100, multiplier=2.0, moving_multiplier=2.0, pellet_spread=0.0, ) assert cof.apply_bloom(current=1.0, moving=False) == 1.1 assert cof.apply_bloom(current=2.0, moving=False) == 2.1 assert cof.apply_bloom(current=3.9, moving=False) == 4.0 assert cof.apply_bloom(current=4.0, moving=False) == 4.0 assert cof.apply_bloom(current=4.1, moving=False) == 4.0
def test_real_time_to_kill(): ft: FireTiming = FireTiming( is_automatic=True, refire_time=100, fire_duration=0, delay=0, charge_up_time=0, chamber_time=0, ) rc: Recoil = Recoil( max_angle=0.0, min_angle=0.0, max_vertical=0.0, min_vertical=0.0, vertical_increase=0.0, vertical_crouched_increase=0.0, max_horizontal=0.0, min_horizontal=0.0, horizontal_tolerance=0.0, max_horizontal_increase=0.0, min_horizontal_increase=0.0, recovery_acceleration=0.0, recovery_delay=0.0, recovery_rate=0.0, first_shot_multiplier=1.0, ) am: Ammo = Ammo( clip_size=10, total_capacity=100, ammo_per_shot=1, short_reload_time=700, reload_chamber_time=300, ) ddp: DamageProfile = DamageProfile( max_damage=1000, max_damage_range=10, min_damage=0, min_damage_range=20, pellets_count=1, resist_type=ResistType.SMALL_ARM, ) cof: ConeOfFire = ConeOfFire( max_angle=0.0, min_angle=0.0, bloom=0.0, recovery_rate=20, recovery_delay=100, multiplier=1.0, moving_multiplier=1.5, pellet_spread=0.0, ) fm: FireMode = FireMode( fire_mode_id=0, fire_mode_type=FireModeType.IRON_SIGHT, description="", is_ads=True, detect_range=30.0, move_multiplier=1.0, turn_multiplier=1.0, direct_damage_profile=ddp, zoom=1.5, ammo=am, fire_timing=ft, recoil=rc, player_state_cone_of_fire={PlayerState.STANDING: cof}, ) assert fm.real_time_to_kill(distance=1.0, runs=10)[0] == 0 assert fm.real_time_to_kill(distance=10.0, runs=10)[0] == 0 assert fm.real_time_to_kill(distance=11.0, runs=10)[0] == 100 assert fm.real_time_to_kill(distance=15.0, runs=10)[0] == 100 assert fm.real_time_to_kill(distance=16.0, runs=10)[0] == 200 assert fm.real_time_to_kill(distance=20.0, runs=10)[0] == -1
def test_no_fire_modes_attributes(): # Fire timing fit_1: FireTiming = FireTiming( is_automatic=True, refire_time=0, fire_duration=0, delay=0, charge_up_time=0, ) fit_2: FireTiming = FireTiming( is_automatic=True, refire_time=100, fire_duration=0, delay=0, charge_up_time=0, ) # Recoil rec_1: Recoil = Recoil( max_angle=0.0, min_angle=0.0, max_vertical=0.0, min_vertical=0.0, vertical_increase=0.0, vertical_crouched_increase=0.0, max_horizontal=0.0, min_horizontal=0.0, horizontal_tolerance=0.0, max_horizontal_increase=0.0, min_horizontal_increase=0.0, recovery_acceleration=0.0, recovery_delay=0.0, recovery_rate=0.0, first_shot_multiplier=1.0, ) rec_2: Recoil = Recoil( max_angle=1.0, min_angle=0.0, max_vertical=0.0, min_vertical=0.0, vertical_increase=0.0, vertical_crouched_increase=0.0, max_horizontal=0.0, min_horizontal=0.0, horizontal_tolerance=0.0, max_horizontal_increase=0.0, min_horizontal_increase=0.0, recovery_acceleration=0.0, recovery_delay=0.0, recovery_rate=0.0, first_shot_multiplier=1.0, ) # Player state cone of fire psc_1: Dict[PlayerState, ConeOfFire] = { PlayerState.STANDING: ConeOfFire( max_angle=1.0, min_angle=1.0, bloom=0.1, recovery_rate=10.0, recovery_delay=100, multiplier=2.0, moving_multiplier=2.0, pellet_spread=0.0, ) } psc_2: Dict[PlayerState, ConeOfFire] = { PlayerState.STANDING: ConeOfFire( max_angle=2.0, min_angle=1.0, bloom=0.1, recovery_rate=10.0, recovery_delay=100, multiplier=2.0, moving_multiplier=2.0, pellet_spread=0.0, ) } # Player state can ADS psa_1: Dict[PlayerState, bool] = {PlayerState.STANDING: True} psa_2: Dict[PlayerState, bool] = {PlayerState.STANDING: False} # Projectile prj_1: Projectile = Projectile( speed=100, gravity=0.0, life_time=3000, flight_type=ProjectileFlightType.BALLISTIC, drag=0.0, ) prj_2: Projectile = Projectile( speed=200, gravity=0.0, life_time=3000, flight_type=ProjectileFlightType.BALLISTIC, drag=0.0, ) # Lock-on lon_1: LockOn = LockOn( life_time=100, seek_in_flight=False, maintain=False, required=True, ) lon_2: LockOn = LockOn( life_time=200, seek_in_flight=False, maintain=False, required=True, ) # Damage profile ddp_1: DamageProfile = DamageProfile( max_damage=90, max_damage_range=10, min_damage=10, min_damage_range=20, pellets_count=1, resist_type=ResistType.SMALL_ARM, ) ddp_2: DamageProfile = DamageProfile( max_damage=95, max_damage_range=10, min_damage=10, min_damage_range=20, pellets_count=1, resist_type=ResistType.SMALL_ARM, ) # Indirect damage profile idp_1: DamageProfile = DamageProfile( max_damage=92, max_damage_range=1, min_damage=20, min_damage_range=2, pellets_count=1, resist_type=ResistType.SMALL_ARM, ) idp_2: DamageProfile = DamageProfile( max_damage=90, max_damage_range=1, min_damage=20, min_damage_range=2, pellets_count=1, resist_type=ResistType.SMALL_ARM, ) # Ammo amm_1: Ammo = Ammo( clip_size=12, total_capacity=100, ammo_per_shot=1, short_reload_time=0, reload_chamber_time=0, ) amm_2: Ammo = Ammo( clip_size=10, total_capacity=100, ammo_per_shot=1, short_reload_time=0, reload_chamber_time=0, ) # Heat hea_1: Heat = Heat( total_capacity=1000, heat_per_shot=0, overheat_penalty_time=0, recovery_delay=0, recovery_rate=0, ) hea_2: Heat = Heat( total_capacity=1200, heat_per_shot=0, overheat_penalty_time=0, recovery_delay=0, recovery_rate=0, ) # Fire modes fm_1: FireMode = FireMode( fire_mode_id=0, fire_mode_type=FireModeType.IRON_SIGHT, description="", is_ads=True, detect_range=30.0, move_multiplier=1.0, turn_multiplier=1.0, zoom=1.5, fire_timing=fit_1, recoil=rec_1, player_state_cone_of_fire=psc_1, player_state_can_ads=psa_1, projectile=prj_1, lock_on=lon_1, direct_damage_profile=ddp_1, indirect_damage_profile=idp_1, ammo=amm_1, heat=hea_1, ) fm_2: FireMode = FireMode( fire_mode_id=1, fire_mode_type=FireModeType.IRON_SIGHT, description="", is_ads=True, detect_range=30.0, move_multiplier=1.0, turn_multiplier=1.0, zoom=1.5, fire_timing=fit_2, recoil=rec_2, player_state_cone_of_fire=psc_2, player_state_can_ads=psa_2, projectile=prj_2, lock_on=lon_2, direct_damage_profile=ddp_2, indirect_damage_profile=idp_2, ammo=amm_2, heat=hea_2, ) # Fire group fg: FireGroup = FireGroup( fire_group_id=2, description="", transition_time=0, fire_modes=[fm_1, fm_2] ) assert fg.fire_timing is None assert fg.recoil is None assert fg.player_state_cone_of_fire is None assert fg.player_state_can_ads is None assert fg.projectile is None assert fg.lock_on is None assert fg.direct_damage_profile is None assert fg.indirect_damage_profile is None assert fg.ammo is None assert fg.heat is None