def test_enhanced_s1_scorchrent_combo_50(transformer_skill: SkillTransformer): # Summer Mitsuhide # https://dragalialost.wiki/w/Summer_Mitsuhide conditions = ConditionComposite( [Condition.TARGET_SCORCHRENT, Condition.COMBO_GTE_50]) transformer_skill.transform_attacking(103501033).with_conditions( conditions)
def test_has_crisis_and_punisher_2(transformer_skill: SkillTransformer): # Louise S2 # https://dragalialost.wiki/w/Louise # Exporting skill_data = transformer_skill.transform_attacking(106503012, is_exporting=True) possible_entries = skill_data.get_all_possible_entries() expected_max_total_mods = { ConditionComposite(): 20.94, ConditionComposite(Condition.TARGET_POISONED): 31.41, } assert set(expected_max_total_mods.keys()) == {entry.condition_comp for entry in possible_entries} for entry in possible_entries: assert entry.total_mod_at_max == pytest.approx(expected_max_total_mods[entry.condition_comp]), \ entry.condition_comp del expected_max_total_mods[entry.condition_comp] assert len(expected_max_total_mods) == 0, f"Conditions not tested: {set(expected_max_total_mods.keys())}" # Not exporting skill_data = transformer_skill.transform_attacking(106503012, is_exporting=False) possible_entries = skill_data.get_all_possible_entries() expected_max_total_mods = { ConditionComposite(Condition.SELF_HP_FULL): 20.94, ConditionComposite(Condition.SELF_HP_EQ_70): 19.9977, ConditionComposite(Condition.SELF_HP_EQ_50): 18.3225, ConditionComposite(Condition.SELF_HP_EQ_30): 15.8097, ConditionComposite(Condition.SELF_HP_EQ_20): 14.2392, ConditionComposite(Condition.SELF_HP_EQ_10): 12.4593, ConditionComposite(Condition.SELF_HP_1): 10.47, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_FULL]): 31.41, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_70]): 29.99655, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_50]): 27.48375, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_30]): 23.71455, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_20]): 21.3588, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_10]): 18.68895, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_1]): 15.705, } assert set(expected_max_total_mods.keys()) == {entry.condition_comp for entry in possible_entries} for entry in possible_entries: assert entry.total_mod_at_max == pytest.approx(expected_max_total_mods[entry.condition_comp]), \ entry.condition_comp del expected_max_total_mods[entry.condition_comp] assert len(expected_max_total_mods) == 0, f"Conditions not tested: {set(expected_max_total_mods.keys())}"
def test_has_crisis_and_punisher_1(transformer_skill: SkillTransformer): # Veronica S1 # https://dragalialost.wiki/w/Veronica # Exporting skill_data = transformer_skill.transform_attacking(107505011, is_exporting=True) possible_entries = skill_data.get_all_possible_entries() expected_max_total_mods = { ConditionComposite(): 24.77, ConditionComposite(Condition.TARGET_POISONED): 29.724, } assert set(expected_max_total_mods.keys()) == {entry.condition_comp for entry in possible_entries} for entry in possible_entries: expected_total_mod = expected_max_total_mods[entry.condition_comp] assert entry.total_mod_at_max == pytest.approx(expected_total_mod), entry.condition_comp del expected_max_total_mods[entry.condition_comp] assert len(expected_max_total_mods) == 0, f"Conditions not tested: {set(expected_max_total_mods.keys())}" # Not exporting skill_data = transformer_skill.transform_attacking(107505011, is_exporting=False) possible_entries = skill_data.get_all_possible_entries() expected_max_total_mods = { ConditionComposite(Condition.SELF_HP_FULL): 24.77, ConditionComposite(Condition.SELF_HP_EQ_70): 25.88465, ConditionComposite(Condition.SELF_HP_EQ_50): 27.86625, ConditionComposite(Condition.SELF_HP_EQ_30): 30.83865, ConditionComposite(Condition.SELF_HP_EQ_20): 32.6964, ConditionComposite(Condition.SELF_HP_EQ_10): 34.80185, ConditionComposite(Condition.SELF_HP_1): 37.155, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_FULL]): 29.724, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_70]): 31.06158, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_50]): 33.4395, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_30]): 37.00638, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_20]): 39.23568, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_EQ_10]): 41.76222, ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_1]): 44.586, } assert set(expected_max_total_mods.keys()) == {entry.condition_comp for entry in possible_entries} for entry in possible_entries: expected_total_mod = expected_max_total_mods[entry.condition_comp] assert entry.total_mod_at_max == pytest.approx(expected_total_mod), entry.condition_comp del expected_max_total_mods[entry.condition_comp] assert len(expected_max_total_mods) == 0, f"Conditions not tested: {set(expected_max_total_mods.keys())}"
def test_s2_tempura(transformer_skill: SkillTransformer): # Mitsuba S2 in Tempura # https://dragalialost.wiki/w/Mitsuba skill_data_base = transformer_skill.transform_supportive(103502024) assert skill_data_base.max_level == 2 expected_buffs_lv_1 = { BuffEffectInfo("DAG_119_04_2_BUF_LV01", HitTargetSimple.TEAM, BuffParameter.CRT_DAMAGE_BUFF, 0.5, 15, 0), BuffEffectInfo("DAG_119_04_2_INSP_LV01", HitTargetSimple.TEAM, BuffParameter.INSPIRE_LEVEL, 2, 0, 1) } expected_buffs_lv_2 = { BuffEffectInfo("DAG_119_04_2_BUF_LV02", HitTargetSimple.TEAM, BuffParameter.CRT_DAMAGE_BUFF, 0.5, 15, 0), BuffEffectInfo("DAG_119_04_2_INSP_LV02", HitTargetSimple.TEAM, BuffParameter.INSPIRE_LEVEL, 3, 0, 1) } expected_base_buffs = [expected_buffs_lv_1, expected_buffs_lv_2] # Base data skill_data = skill_data_base.with_conditions() check_buff_unit_match(skill_data.max_lv_buffs, expected_buffs_lv_2) for skill_lv in range(skill_data_base.max_level): expected_buffs = expected_base_buffs[skill_lv] actual_buffs = skill_data.buffs[skill_lv] check_buff_unit_match(actual_buffs, expected_buffs)
def test_s2_6_plus_butterflies(transformer_skill: SkillTransformer): # Meene S2 @ 6+ butterflies # https://dragalialost.wiki/w/Meene skill_data_base = transformer_skill.transform_attacking(106503036) addl_hits = { ConditionComposite(Condition.BULLETS_ON_MAP_0): 0, ConditionComposite(Condition.BULLETS_ON_MAP_1): 1, ConditionComposite(Condition.BULLETS_ON_MAP_2): 2, ConditionComposite(Condition.BULLETS_ON_MAP_3): 3, ConditionComposite(Condition.BULLETS_ON_MAP_4): 4, ConditionComposite(Condition.BULLETS_ON_MAP_5): 5, ConditionComposite(Condition.BULLETS_ON_MAP_6): 6, ConditionComposite(Condition.BULLETS_ON_MAP_7): 7, ConditionComposite(Condition.BULLETS_ON_MAP_8): 8, ConditionComposite(Condition.BULLETS_ON_MAP_9): 9, } for cond_comp, bonus_hits in addl_hits.items(): skill_data = skill_data_base.with_conditions(cond_comp) assert skill_data.hit_count == [1 + bonus_hits, 1 + bonus_hits] assert skill_data.hit_count_at_max == 1 + bonus_hits assert skill_data.total_mod == pytest.approx( [9 + 1.5 * bonus_hits, 10 + 1.67 * bonus_hits]) assert skill_data.total_mod_at_max == pytest.approx(10 + 1.67 * bonus_hits) assert skill_data.mods == approx_matrix([[9.0] + [1.5] * bonus_hits, [10.0] + [1.67] * bonus_hits]) assert skill_data.mods_at_max == pytest.approx([10.0] + [1.67] * bonus_hits) assert skill_data.max_level == 2
def test_has_punisher_3_1(transformer_skill: SkillTransformer): # Nefaria S1 # https://dragalialost.wiki/w/Nefaria skill_data_base = transformer_skill.transform_attacking(106505011) # Base data skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [8, 8, 8, 8] assert skill_data.hit_count_at_max == 8 assert skill_data.total_mod == pytest.approx([ 1.036 * 8, 1.09 * 8, 1.144 * 8, 1.144 * 8, ]) assert skill_data.total_mod_at_max == pytest.approx(1.144 * 8) assert skill_data.mods == approx_matrix([ [1.036] * 8, [1.09] * 8, [1.144] * 8, [1.144] * 8, ]) assert skill_data.mods_at_max == pytest.approx([1.144] * 8) assert skill_data.max_level == 4
def test_s2(transformer_skill: SkillTransformer): # Mitsuhide # https://dragalialost.wiki/w/Mitsuhide skill_data_base = transformer_skill.transform_attacking(103504022) combo_dmg_bonus = { ConditionComposite(Condition.COMBO_GTE_0): 1, ConditionComposite(Condition.COMBO_GTE_5): 1.05, ConditionComposite(Condition.COMBO_GTE_10): 1.10, ConditionComposite(Condition.COMBO_GTE_15): 1.20, ConditionComposite(Condition.COMBO_GTE_20): 1.30, ConditionComposite(Condition.COMBO_GTE_25): 1.40, ConditionComposite(Condition.COMBO_GTE_30): 1.50, } for condition, dmg_rate in combo_dmg_bonus.items(): skill_data = skill_data_base.with_conditions(condition) assert skill_data.hit_count == [1, 1] assert skill_data.hit_count_at_max == 1 assert skill_data.total_mod == pytest.approx( [12.21 * dmg_rate, 13.56 * dmg_rate]) assert skill_data.total_mod_at_max == pytest.approx(13.56 * dmg_rate) assert skill_data.mods == approx_matrix([[12.21 * dmg_rate], [13.56 * dmg_rate]]) assert skill_data.mods_at_max == pytest.approx([13.56 * dmg_rate]) assert skill_data.max_level == 2
def test_peony_s1_paralyze(transformer_skill: SkillTransformer): # Peony S1 # https://dragalialost.wiki/w/Peony skill_data = transformer_skill.transform_attacking( 107504021).with_conditions() afflictions_lv1 = [ AfflictionInfo("ROD_112_04_H01_LV01", Status.PARALYZE, 100, 13, 3.9, 0.513, True) ] afflictions_lv2 = [ AfflictionInfo("ROD_112_04_H01_LV02", Status.PARALYZE, 110, 13, 3.9, 0.727, True) ] afflictions_lv3 = [ AfflictionInfo("ROD_112_04_H01_LV03", Status.PARALYZE, 120, 13, 3.9, 0.97, True) ] expected_afflictions = [afflictions_lv1, afflictions_lv2, afflictions_lv3] assert len(expected_afflictions) == len(skill_data.afflictions) for skill_lv, (expected, actual) in enumerate(zip(expected_afflictions, skill_data.afflictions), start=1): check_affliction_unit_match(actual, expected, message=skill_lv)
def test_iter_entries_s1(transformer_skill: SkillTransformer): # Dragonyule Malora S1 # https://dragalialost.wiki/w/Dragonyule_Malora skill_data = transformer_skill.transform_attacking(104504021) possible_entries = skill_data.get_all_possible_entries() expected_addl_at_max = { ConditionComposite(): 4.67 * 2, ConditionComposite(Condition.TARGET_SHADOW): 4.67 * 2, } expected = set(expected_addl_at_max.keys()) actual = {entry.condition_comp for entry in possible_entries} assert expected == actual, actual.symmetric_difference(expected) for entry in possible_entries: assert \ pytest.approx(expected_addl_at_max[entry.condition_comp]) == entry.total_mod_at_max, \ entry.condition_comp del expected_addl_at_max[entry.condition_comp] assert len( expected_addl_at_max ) == 0, f"Conditions not tested: {set(expected_addl_at_max.keys())}"
def test_hp_related_1_1(transformer_skill: SkillTransformer): # Veronica S1 # https://dragalialost.wiki/w/Veronica skill_data_base = transformer_skill.transform_attacking(107505011) # 1 HP skill_data = skill_data_base.with_conditions( ConditionComposite(Condition.SELF_HP_1)) assert skill_data.hit_count == [4, 4, 4, 4] assert skill_data.hit_count_at_max == 4 assert skill_data.total_mod == pytest.approx([ 6.0525 * 3 + 7.5825, 6.7275 * 3 + 8.3925, 7.47 * 3 + 9.3375, 8.955 * 3 + 10.29, ]) assert skill_data.total_mod_at_max == pytest.approx(8.955 * 3 + 10.29) assert skill_data.mods == approx_matrix([ [6.0525] * 3 + [7.5825], [6.7275] * 3 + [8.3925], [7.47] * 3 + [9.3375], [8.955] * 3 + [10.29], ]) assert skill_data.mods_at_max == pytest.approx([8.955] * 3 + [10.29]) assert skill_data.max_level == 4
def test_seimei_s2(transformer_skill: SkillTransformer): # Seimei # https://dragalialost.wiki/w/Seimei skill_data_base = transformer_skill.transform_attacking(107501042) # For some reason, they inserted dummy data yet again (Lv 3) # Shikigami Level 1 skill_data = skill_data_base.with_conditions( ConditionComposite([ Condition.BULLETS_SUMMONED_1, Condition.SELF_SEIMEI_SHIKIGAMI_LV_1 ])) assert skill_data.hit_count == [1, 1, 0] assert skill_data.hit_count_at_max == 0 assert skill_data.total_mod == pytest.approx([13.5, 15, 0]) assert skill_data.total_mod_at_max == pytest.approx(0) assert skill_data.mods == [[13.5], [15], []] assert skill_data.mods_at_max == [] assert skill_data.max_level == 3 # Shikigami Level 2 skill_data = skill_data_base.with_conditions( ConditionComposite([ Condition.BULLETS_SUMMONED_1, Condition.SELF_SEIMEI_SHIKIGAMI_LV_2 ])) assert skill_data.hit_count == [1, 1, 1] assert skill_data.hit_count_at_max == 1 assert skill_data.total_mod == pytest.approx([22.5, 25, 25]) assert skill_data.total_mod_at_max == pytest.approx(25) assert skill_data.mods == [[22.5], [25], [25]] assert skill_data.mods_at_max == [25] assert skill_data.max_level == 3
def test_fs_spd(transformer_skill: SkillTransformer): # Linnea S2 # https://dragalialost.wiki/w/Linnea skill_data_base = transformer_skill.transform_supportive(102505032) assert skill_data_base.max_level == 2 expected_buffs_lv_1 = { BuffEffectInfo("BUF_205_BAC_LV01", HitTargetSimple.SELF, BuffParameter.FS_SPD, 0.2, 15, 0), } expected_buffs_lv_2 = { BuffEffectInfo("BUF_205_BAC_LV02", HitTargetSimple.SELF, BuffParameter.FS_SPD, 0.3, 15, 0), } expected_base_buffs = [expected_buffs_lv_1, expected_buffs_lv_2] skill_data = skill_data_base.with_conditions() check_buff_unit_match(skill_data.max_lv_buffs, expected_buffs_lv_2) for skill_lv in range(skill_data_base.max_level): expected_buffs = expected_base_buffs[skill_lv] actual_buffs = skill_data.buffs[skill_lv] check_buff_unit_match(actual_buffs, expected_buffs)
def test_s1_eden(transformer_skill: SkillTransformer): # Gala Laxi S1 @ Eden # https://dragalialost.wiki/w/Gala_Laxi skill_data_base = transformer_skill.transform_attacking(103501023) # Base data skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [12, 12, 12, 12] assert skill_data.hit_count_at_max == 12 assert skill_data.total_mod == pytest.approx([ 0.595 * 2 + 0.793 * 4 + 0.992 * 6, 0.669 * 2 + 0.892 * 4 + 1.116 * 6, 0.744 * 2 + 0.992 * 4 + 1.240 * 6, 0.760 * 2 + 1.000 * 4 + 1.260 * 6, ]) assert skill_data.total_mod_at_max == pytest.approx(0.760 * 2 + 1.000 * 4 + 1.260 * 6) assert skill_data.mods == approx_matrix([ [0.595, 0.992] * 2 + [0.793, 0.992] * 2 + [0.992, 0.793] * 2, [0.669, 1.116] * 2 + [0.892, 1.116] * 2 + [1.116, 0.892] * 2, [0.744, 1.240] * 2 + [0.992, 1.240] * 2 + [1.240, 0.992] * 2, [0.760, 1.260] * 2 + [1.000, 1.260] * 2 + [1.260, 1.000] * 2, ]) assert skill_data.mods_at_max == pytest.approx([0.760, 1.260] * 2 + [1.000, 1.260] * 2 + [1.260, 1.000] * 2) assert skill_data.max_level == 4
def test_s1(transformer_skill: SkillTransformer): # Wedding Aoi S1 # https://dragalialost.wiki/w/Wedding_Aoi skill_data_base = transformer_skill.transform_attacking(103503011) # Base data skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [5, 5, 5, 5] assert skill_data.hit_count_at_max == 5 assert skill_data.total_mod == pytest.approx([ 2.926 * 4 + 11.682, 3.08 * 4 + 12.276, 3.234 * 4 + 12.892, 3.24 * 4 + 12.9, ]) assert skill_data.total_mod_at_max == pytest.approx(3.24 * 4 + 12.9) assert skill_data.mods == approx_matrix([ [2.926] * 4 + [11.682], [3.08] * 4 + [12.276], [3.234] * 4 + [12.892], [3.24] * 4 + [12.9], ]) assert skill_data.mods_at_max == pytest.approx([3.24] * 4 + [12.9]) assert skill_data.max_level == 4
def test_iter_entries_s2(transformer_skill: SkillTransformer): # Original Alex S2 # https://dragalialost.wiki/w/Alex skill_data = transformer_skill.transform_attacking(103405022) possible_entries = skill_data.get_all_possible_entries() expected_addl_at_max = { ConditionComposite(): 2.01 * 3 + 4.02, ConditionComposite(Condition.TARGET_BK_STATE): 2.01 * 3 + 4.02, } expected = set(expected_addl_at_max.keys()) actual = {entry.condition_comp for entry in possible_entries} assert expected == actual, actual.symmetric_difference(expected) for entry in possible_entries: assert \ pytest.approx(expected_addl_at_max[entry.condition_comp]) == entry.total_mod_at_max, \ entry.condition_comp del expected_addl_at_max[entry.condition_comp] assert len( expected_addl_at_max ) == 0, f"Conditions not tested: {set(expected_addl_at_max.keys())}"
def test_og_alex_s2(transformer_skill: SkillTransformer): # Original Alex S2 # https://dragalialost.wiki/w/Alex skill_data_base = transformer_skill.transform_attacking(103405022) # Not BK skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [4, 4, 4] assert skill_data.hit_count_at_max == 4 assert skill_data.total_mod == pytest.approx( [1.64 * 3 + 3.27, 1.82 * 3 + 3.62, 2.01 * 3 + 4.02]) assert skill_data.total_mod_at_max == pytest.approx(2.01 * 3 + 4.02) assert skill_data.mods == approx_matrix([[1.64] * 2 + [3.27] + [1.64], [1.82] * 2 + [3.62] + [1.82], [2.01] * 2 + [4.02] + [2.01]]) assert skill_data.mods_at_max == pytest.approx([2.01] * 2 + [4.02] + [2.01]) assert skill_data.max_level == 3 # In BK skill_data = skill_data_base.with_conditions( ConditionComposite(Condition.TARGET_BK_STATE)) assert skill_data.hit_count == [4, 4, 4] assert skill_data.hit_count_at_max == 4 assert skill_data.total_mod == pytest.approx( [3.28 * 3 + 6.54, 3.64 * 3 + 7.24, 2.01 * 3 + 4.02]) assert skill_data.total_mod_at_max == pytest.approx(2.01 * 3 + 4.02) assert skill_data.mods == approx_matrix([[3.28] * 2 + [6.54] + [3.28], [3.64] * 2 + [7.24] + [3.64], [2.01] * 2 + [4.02] + [2.01]]) assert skill_data.mods_at_max == pytest.approx([2.01] * 2 + [4.02] + [2.01]) assert skill_data.max_level == 3
def test_hp_related_1_2(transformer_skill: SkillTransformer): # Veronica S1 # https://dragalialost.wiki/w/Veronica skill_data_base = transformer_skill.transform_attacking(107505011) # 1 HP & Poisoned Punisher skill_data = skill_data_base.with_conditions( ConditionComposite([Condition.TARGET_POISONED, Condition.SELF_HP_1])) assert skill_data.hit_count == [4, 4, 4, 4] assert skill_data.hit_count_at_max == 4 assert skill_data.total_mod == pytest.approx([ 6.0525 * 3 + 7.5825, 6.7275 * 3 + 8.3925, 7.47 * 3 + 9.3375, 10.746 * 3 + 12.348, ]) assert skill_data.total_mod_at_max == pytest.approx(10.746 * 3 + 12.348) assert skill_data.mods == approx_matrix([ [6.0525] * 3 + [7.5825], [6.7275] * 3 + [8.3925], [7.47] * 3 + [9.3375], [10.746] * 3 + [12.348], ]) assert skill_data.mods_at_max == pytest.approx([10.746] * 3 + [12.348]) assert skill_data.max_level == 4
def test_s2(transformer_skill: SkillTransformer): # Lucretia S2 # https://dragalialost.wiki/w/Lucretia skill_data_base = transformer_skill.transform_supportive(107504012) assert skill_data_base.max_level == 3 expected_buffs_lv_1 = { BuffEffectInfo("BUF_119_ATACK_LV01", HitTargetSimple.SELF, BuffParameter.ATK_BUFF, 0.1, 10, 0), BuffEffectInfo("BUF_119_TENSION_LV01", HitTargetSimple.SELF, BuffParameter.ENERGY_LEVEL, 1, 0, 1) } expected_buffs_lv_2 = { BuffEffectInfo("BUF_119_ATACK_LV02", HitTargetSimple.SELF, BuffParameter.ATK_BUFF, 0.1, 10, 0), BuffEffectInfo("BUF_119_TENSION_LV02", HitTargetSimple.SELF, BuffParameter.ENERGY_LEVEL, 2, 0, 1) } expected_buffs_lv_3 = { BuffEffectInfo("BUF_119_ATACK_LV03", HitTargetSimple.SELF, BuffParameter.ATK_BUFF, 0.15, 15, 0), BuffEffectInfo("BUF_119_TENSION_LV03", HitTargetSimple.SELF, BuffParameter.ENERGY_LEVEL, 3, 0, 1) } expected_base_buffs = [expected_buffs_lv_1, expected_buffs_lv_2, expected_buffs_lv_3] # Base data skill_data = skill_data_base.with_conditions() check_buff_unit_match(skill_data.max_lv_buffs, expected_buffs_lv_3) for skill_lv in range(skill_data_base.max_level): expected_buffs = expected_base_buffs[skill_lv] actual_buffs = skill_data.buffs[skill_lv] check_buff_unit_match(actual_buffs, expected_buffs)
def test_s2(transformer_skill: SkillTransformer): # Original Zena S2 # https://dragalialost.wiki/w/Zena skill_data_base = transformer_skill.transform_attacking(107505042) level_1_hit = 3.2 level_1_bullet = 0.4 level_2_hit = 4.0 level_2_bullet = 0.5 hits_expected = 120 # Base data skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [hits_expected + 1, hits_expected + 1, 1] assert skill_data.hit_count_at_max == hits_expected + 1 assert skill_data.total_mod == pytest.approx([ level_1_hit + level_1_bullet * hits_expected, level_2_hit + level_2_bullet * hits_expected, level_2_hit ]) assert skill_data.total_mod_at_max == pytest.approx(level_2_hit + level_2_bullet * hits_expected) assert skill_data.mods == approx_matrix( [[level_1_hit] + [level_1_bullet] * hits_expected, [level_2_hit] + [level_2_bullet] * hits_expected, [level_2_hit]]) assert skill_data.mods_at_max == pytest.approx([level_2_hit] + [level_2_bullet] * hits_expected) assert skill_data.max_level == 2
def test_has_punisher_3_4(transformer_skill: SkillTransformer): # Nefaria S1 # https://dragalialost.wiki/w/Nefaria skill_data_base = transformer_skill.transform_attacking(106505011) # Blinded or Poisoned Punisher skill_data = skill_data_base.with_conditions( ConditionComposite( [Condition.TARGET_BLINDED, Condition.TARGET_POISONED])) assert skill_data.hit_count == [8, 8, 8, 8] assert skill_data.hit_count_at_max == 8 assert skill_data.total_mod == pytest.approx([ 1.036 * 8, 1.8421 * 8, 1.99056 * 8, 1.99056 * 8, ]) assert skill_data.total_mod_at_max == pytest.approx(1.99056 * 8) assert skill_data.mods == approx_matrix([ [1.036] * 8, [1.8421] * 8, [1.99056] * 8, [1.99056] * 8, ]) assert skill_data.mods_at_max == pytest.approx([1.99056] * 8) assert skill_data.max_level == 4
def test_iter_entries(transformer_skill: SkillTransformer): skill_id_mods = { 105502042: 0.60 * 46, 105502043: 0.60 * 58, 105502044: 0.60 * 66, 105502045: 0.60 * 37 + 1.30 * 37, 105502046: 0.60 * 46 } for skill_id, total_mod in skill_id_mods.items(): skill_data = transformer_skill.transform_attacking(skill_id) possible_entries = skill_data.get_all_possible_entries() expected_max_total_mods = { ConditionComposite(): total_mod, } expected = set(expected_max_total_mods.keys()) actual = {entry.condition_comp for entry in possible_entries} assert expected == actual, actual.symmetric_difference(expected) for entry in possible_entries: assert entry.total_mod_at_max == pytest.approx( expected_max_total_mods[entry.condition_comp]) del expected_max_total_mods[entry.condition_comp] assert len( expected_max_total_mods ) == 0, f"Conditions not tested: {set(expected_max_total_mods.keys())}"
def test_s2_chained(transformer_skill: SkillTransformer): # Gala Alex S2 @ Chained # https://dragalialost.wiki/w/Gala_Alex skill_data_base = transformer_skill.transform_attacking(101505026) # Base skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [2, 2, 2] assert skill_data.hit_count_at_max == 2 assert skill_data.total_mod == pytest.approx( [4.97 + 3.97, 5.53 + 4.42, 5.53 + 4.42]) assert skill_data.total_mod_at_max == pytest.approx(5.53 + 4.42) assert skill_data.mods == approx_matrix([[4.97, 3.97], [5.53, 4.42], [5.53, 4.42]]) assert skill_data.mods_at_max == pytest.approx([5.53, 4.42]) assert skill_data.max_level == 3 # Poisoned skill_data = skill_data_base.with_conditions( ConditionComposite(Condition.TARGET_POISONED)) assert skill_data.hit_count == [2, 2, 2] assert skill_data.hit_count_at_max == 2 assert skill_data.total_mod == pytest.approx( [5.467 + 4.367, 6.083 + 4.862, 6.083 + 4.862]) assert skill_data.total_mod_at_max == pytest.approx(6.083 + 4.862) assert skill_data.mods == approx_matrix([[5.467, 4.367], [6.083, 4.862], [6.083, 4.862]]) assert skill_data.mods_at_max == pytest.approx([6.083, 4.862]) assert skill_data.max_level == 3
def test_s2(transformer_skill: SkillTransformer): # Dragonyule Malora S2 # https://dragalialost.wiki/w/Dragonyule_Malora skill_data_base = transformer_skill.transform_attacking(104504022) # Base data skill_data = skill_data_base.with_conditions() assert skill_data.hit_count == [3, 3] assert skill_data.hit_count_at_max == 3 assert skill_data.total_mod == pytest.approx([3.86 * 3, 4.32 * 3]) assert skill_data.total_mod_at_max == pytest.approx(4.32 * 3) assert skill_data.mods == approx_matrix([[3.86] * 3, [4.32] * 3]) assert skill_data.mods_at_max == pytest.approx([4.32] * 3) assert skill_data.max_level == 2 # Target DEF down skill_data = skill_data_base.with_conditions( ConditionComposite(Condition.TARGET_DEF_DOWN)) assert skill_data.hit_count == [3, 3] assert skill_data.hit_count_at_max == 3 assert skill_data.total_mod == pytest.approx([6.948 * 3, 7.776 * 3]) assert skill_data.total_mod_at_max == pytest.approx(7.776 * 3) assert skill_data.mods == approx_matrix([[6.948] * 3, [7.776] * 3]) assert skill_data.mods_at_max == pytest.approx([7.776] * 3) assert skill_data.max_level == 2
def test_s1_p2(transformer_skill: SkillTransformer): # Xander S1 P2 # https://dragalialost.wiki/w/Xander skill_data_base = transformer_skill.transform_attacking(101502013) condition_to_dmg_up_rate = { (Condition.SELF_BUFF_0, ): 1 + 0, (Condition.SELF_BUFF_10, ): 1 + 0.05 * 10, (Condition.SELF_BUFF_15, ): 1 + 0.05 * 15, (Condition.SELF_BUFF_20, ): 1 + 0.05 * 20, (Condition.SELF_BUFF_25, ): 1 + 0.05 * 25, (Condition.SELF_BUFF_30, ): 1 + 0.05 * 30, (Condition.SELF_BUFF_35, ): 1 + 0.05 * 35, (Condition.SELF_BUFF_40, ): 1 + 0.05 * 40, (Condition.SELF_BUFF_45, ): 1 + 0.05 * 45, (Condition.SELF_BUFF_50, ): 1 + 0.05 * 50, } for conditions, boost_rate in condition_to_dmg_up_rate.items(): skill_data = skill_data_base.with_conditions( ConditionComposite(conditions)) assert skill_data.hit_count == [0, 0, 0, 1] assert skill_data.hit_count_at_max == 1 assert skill_data.total_mod == pytest.approx( [0, 0, 0, 16.74 * boost_rate]) assert skill_data.total_mod_at_max == pytest.approx(16.74 * boost_rate) assert skill_data.mods == approx_matrix([[], [], [], [16.74 * boost_rate]]) assert skill_data.mods_at_max == pytest.approx([16.74 * boost_rate]) assert skill_data.max_level == 4
def test_bellina_s2(transformer_skill: SkillTransformer): # Bellina S2 # https://dragalialost.wiki/w/Bellina skill_data = transformer_skill.transform_attacking( 103505034).with_conditions() assert skill_data.crisis_mods == approx_matrix([[3], [3]])
def test_iter_entries_s1(transformer_skill: SkillTransformer): # Lathna S1 # https://dragalialost.wiki/w/Lathna skill_data = transformer_skill.transform_attacking(200504121) possible_entries = skill_data.get_all_possible_entries() expected_addl_at_max = { ConditionComposite([Condition.ADDL_INPUT_0]): 3.25, ConditionComposite([Condition.ADDL_INPUT_1]): 3.25, ConditionComposite([Condition.ADDL_INPUT_2]): 3.25, ConditionComposite([Condition.ADDL_INPUT_3]): 7.85, ConditionComposite([Condition.ADDL_INPUT_4]): 7.85, ConditionComposite([Condition.ADDL_INPUT_5]): 7.85, ConditionComposite([Condition.ADDL_INPUT_6]): 13.8, ConditionComposite([Condition.ADDL_INPUT_7]): 13.8, ConditionComposite([Condition.ADDL_INPUT_8]): 13.8, ConditionComposite([Condition.ADDL_INPUT_9]): 17.8, } expected = set(expected_addl_at_max.keys()) actual = {entry.condition_comp for entry in possible_entries} assert expected == actual, actual.symmetric_difference(expected) for entry in possible_entries: assert \ entry.total_mod_at_max == pytest.approx(expected_addl_at_max[entry.condition_comp]), \ entry.condition_comp del expected_addl_at_max[entry.condition_comp] assert len( expected_addl_at_max ) == 0, f"Conditions not tested: {set(expected_addl_at_max.keys())}"
def test_og_alex_s1_poison(transformer_skill: SkillTransformer): # Original Alex S1 # https://dragalialost.wiki/w/Alex skill_data = transformer_skill.transform_attacking( 103405021).with_conditions() afflictions_lv1 = [] afflictions_lv2 = ([ AfflictionInfo("DAG_117_03_H01_POISON_LV02", Status.POISON, 90, 15, 2.9, 0.28, True) ] * 3 + [ AfflictionInfo("DAG_117_03_H02_POISON_LV02", Status.POISON, 90, 15, 2.9, 0.28, True) ] * 1) afflictions_lv3 = ([ AfflictionInfo("DAG_117_03_H01_POISON_LV03", Status.POISON, 100, 15, 2.9, 0.396, True) ] * 3 + [ AfflictionInfo("DAG_117_03_H02_POISON_LV03", Status.POISON, 100, 15, 2.9, 0.396, True) ] * 1) expected_afflictions = [afflictions_lv1, afflictions_lv2, afflictions_lv3] assert len(expected_afflictions) == len(skill_data.afflictions) for skill_lv, (expected, actual) in enumerate(zip(expected_afflictions, skill_data.afflictions), start=1): check_affliction_unit_match(actual, expected, message=skill_lv)
def test_iter_entries_s2(transformer_skill: SkillTransformer): # Meene S2 # https://dragalialost.wiki/w/Meene skill_data = transformer_skill.transform_attacking(106503032) possible_entries = skill_data.get_all_possible_entries() expected_addl_at_max = { ConditionComposite([Condition.BULLETS_ON_MAP_0]): 1.67 * 0, ConditionComposite([Condition.BULLETS_ON_MAP_1]): 1.67 * 1, ConditionComposite([Condition.BULLETS_ON_MAP_2]): 1.67 * 2, ConditionComposite([Condition.BULLETS_ON_MAP_3]): 1.67 * 3, ConditionComposite([Condition.BULLETS_ON_MAP_4]): 1.67 * 4, ConditionComposite([Condition.BULLETS_ON_MAP_5]): 1.67 * 5, ConditionComposite([Condition.BULLETS_ON_MAP_6]): 1.67 * 6, ConditionComposite([Condition.BULLETS_ON_MAP_7]): 1.67 * 7, ConditionComposite([Condition.BULLETS_ON_MAP_8]): 1.67 * 8, ConditionComposite([Condition.BULLETS_ON_MAP_9]): 1.67 * 9, } expected = set(expected_addl_at_max.keys()) actual = {entry.condition_comp for entry in possible_entries} assert expected == actual, actual.symmetric_difference(expected) for entry in possible_entries: expected_total = 10 + expected_addl_at_max[entry.condition_comp] assert pytest.approx( expected_total) == entry.total_mod_at_max, entry.condition_comp del expected_addl_at_max[entry.condition_comp] assert len( expected_addl_at_max ) == 0, f"Conditions not tested: {set(expected_addl_at_max.keys())}"
def test_iter_entries_s2(transformer_skill: SkillTransformer): # Mitsuhide # https://dragalialost.wiki/w/Mitsuhide skill_data = transformer_skill.transform_attacking(103504022) possible_entries = skill_data.get_all_possible_entries() expected_addl_at_max = { ConditionComposite(Condition.COMBO_GTE_0): 13.56 * 1.00, ConditionComposite(Condition.COMBO_GTE_5): 13.56 * 1.05, ConditionComposite(Condition.COMBO_GTE_10): 13.56 * 1.10, ConditionComposite(Condition.COMBO_GTE_15): 13.56 * 1.20, ConditionComposite(Condition.COMBO_GTE_20): 13.56 * 1.30, ConditionComposite(Condition.COMBO_GTE_25): 13.56 * 1.40, ConditionComposite(Condition.COMBO_GTE_30): 13.56 * 1.50, } expected = set(expected_addl_at_max.keys()) actual = {entry.condition_comp for entry in possible_entries} assert expected == actual, actual.symmetric_difference(expected) for entry in possible_entries: assert \ pytest.approx(expected_addl_at_max[entry.condition_comp]) == entry.total_mod_at_max, \ entry.condition_comp del expected_addl_at_max[entry.condition_comp] assert len( expected_addl_at_max ) == 0, f"Conditions not tested: {set(expected_addl_at_max.keys())}"
def test_has_punisher_1_2(transformer_skill: SkillTransformer): # Veronica S1 # https://dragalialost.wiki/w/Veronica skill_data_base = transformer_skill.transform_attacking(107505011) # Poisoned Punisher skill_data = skill_data_base.with_conditions( ConditionComposite(Condition.TARGET_POISONED)) assert skill_data.hit_count == [4, 4, 4, 4] assert skill_data.hit_count_at_max == 4 assert skill_data.total_mod == pytest.approx([ 2.69 * 3 + 3.37, 2.99 * 3 + 3.73, 3.32 * 3 + 4.15, 7.164 * 3 + 8.232, ]) assert skill_data.total_mod_at_max == pytest.approx(7.164 * 3 + 8.232) assert skill_data.mods == approx_matrix([ [2.69] * 3 + [3.37], [2.99] * 3 + [3.73], [3.32] * 3 + [4.15], [7.164] * 3 + [8.232], ]) assert skill_data.mods_at_max == pytest.approx([7.164] * 3 + [8.232]) assert skill_data.max_level == 4