Esempio n. 1
0
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())}"
Esempio n. 4
0
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)
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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)
Esempio n. 9
0
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())}"
Esempio n. 10
0
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
Esempio n. 12
0
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
Esempio n. 15
0
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())}"
Esempio n. 16
0
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
Esempio n. 17
0
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
Esempio n. 20
0
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
Esempio n. 23
0
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
Esempio n. 24
0
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)
Esempio n. 28
0
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())}"
Esempio n. 29
0
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())}"
Esempio n. 30
0
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