diff --git a/.github/workflows/nuitka-app.yml b/.github/workflows/nuitka-app.yml index 96bca03467d4fc213bfacc359ab0a401d0786e38..d2779e58a1cf6ac3123a28c0a82bca70ee47ab67 100644 --- a/.github/workflows/nuitka-app.yml +++ b/.github/workflows/nuitka-app.yml @@ -35,9 +35,9 @@ jobs: onefile: false enable-plugins: pyside6 disable-console: true - windows-icon-from-ico: qt/assets/icon.ico + windows-icon-from-ico: assets/icon.ico nofollow-import-to: http,email - include-data-dir: qt/assets=qt/assets/ + include-data-dir: assets=assets/ - name: Upload Artifact uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/pyinstaller-app.yml b/.github/workflows/pyinstaller-app.yml index 759c882b02392b4a30a7e9589cfd8c47949deae4..091c705367351187144dd882ab367335a373d954 100644 --- a/.github/workflows/pyinstaller-app.yml +++ b/.github/workflows/pyinstaller-app.yml @@ -69,17 +69,16 @@ jobs: pip install pyside6 - name: Build run: | - pyinstaller -F -w -i qt/assets/icon.ico qt/app.py + pyinstaller -F -w -i assets/icon.ico qt/app.py mv dist Formulator - mkdir Formulator/qt - mv qt/assets Formulator/qt/assets + mv assets Formulator/assets mkdir ${{ env.PACKAGENAME }} mv Formulator ${{ env.PACKAGENAME }} 7z a -t7z -r "$($Env:PACKAGENAME + '.7z')" "Formulator" - name: Upload uses: actions/upload-artifact@v4 with: - name: Formulator + name: ${{ env.PACKAGENAME }} path: ${{ env.PACKAGENAME }} - name: upload-win uses: actions/upload-release-asset@v1 @@ -90,3 +89,45 @@ jobs: asset_path: ${{ env.PACKAGENAME }}.7z asset_name: ${{ env.PACKAGENAME }}.7z asset_content_type: application/zip + + macos: + needs: [ setup, release ] + runs-on: macos-11 + env: + PACKAGENAME: ${{ needs.setup.outputs.PACKAGE_PREFIX }}_macos_x64 + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pyinstaller + pip install pyside6 + brew install create-dmg + - name: Build + run: | + cp assets/icon.icns ./ + pyinstaller --clean --onedir --name Formulator --strip --windowed -i icon.icns qt/app.py + rm -rf dist/Formulator + ln -s /Applications/ dist/Applications + xattr -cr dist/Formulator.app + create-dmg --volname "Formulator" ${{ env.PACKAGENAME }}.dmg dist/ + zip -9 Formulator.zip ${{ env.PACKAGENAME }}.dmg + - name: Upload + uses: actions/upload-artifact@v2 + with: + name: ${{ env.PACKAGENAME }} + path: Formulator.zip + - name: upload-macos + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.release.outputs.Up_Url }} + asset_path: ${{ env.PACKAGENAME }}.dmg + asset_name: ${{ env.PACKAGENAME }}.dmg + asset_content_type: application/gzip \ No newline at end of file diff --git a/qt/constant.py b/assets/constant.py similarity index 86% rename from qt/constant.py rename to assets/constant.py index a592499d0009c9cfbf79e1e48bd2524b0ee820f2..6d71d30b2e6473b252d5ffecf92376ad2756011f 100644 --- a/qt/constant.py +++ b/assets/constant.py @@ -1,20 +1,7 @@ import os -from dataclasses import dataclass -from typing import Type, List, Dict, Union, Tuple - -from base.attribute import Attribute -from base.buff import Buff -from base.gain import Gain -from base.skill import Skill - -# from general.gains import equipment - -from schools import bei_ao_jue - """ Directory """ -# ASSETS_DIR = os.path.join(os.getcwd(), "qt/assets") -ASSETS_DIR = "qt/assets" +ASSETS_DIR = "assets" EQUIPMENTS_DIR = os.path.join(ASSETS_DIR, "equipments") ENCHANTS_DIR = os.path.join(ASSETS_DIR, "enchants") STONES_DIR = os.path.join(ASSETS_DIR, "stones.json") diff --git a/qt/assets/enchants/belt b/assets/enchants/belt similarity index 100% rename from qt/assets/enchants/belt rename to assets/enchants/belt diff --git a/qt/assets/enchants/bottoms b/assets/enchants/bottoms similarity index 100% rename from qt/assets/enchants/bottoms rename to assets/enchants/bottoms diff --git a/qt/assets/enchants/hat b/assets/enchants/hat similarity index 100% rename from qt/assets/enchants/hat rename to assets/enchants/hat diff --git a/qt/assets/enchants/jacket b/assets/enchants/jacket similarity index 100% rename from qt/assets/enchants/jacket rename to assets/enchants/jacket diff --git a/qt/assets/enchants/necklace b/assets/enchants/necklace similarity index 100% rename from qt/assets/enchants/necklace rename to assets/enchants/necklace diff --git a/qt/assets/enchants/pendant b/assets/enchants/pendant similarity index 100% rename from qt/assets/enchants/pendant rename to assets/enchants/pendant diff --git a/qt/assets/enchants/primary_weapon b/assets/enchants/primary_weapon similarity index 100% rename from qt/assets/enchants/primary_weapon rename to assets/enchants/primary_weapon diff --git a/qt/assets/enchants/ring b/assets/enchants/ring similarity index 100% rename from qt/assets/enchants/ring rename to assets/enchants/ring diff --git a/qt/assets/enchants/secondary_weapon b/assets/enchants/secondary_weapon similarity index 100% rename from qt/assets/enchants/secondary_weapon rename to assets/enchants/secondary_weapon diff --git a/qt/assets/enchants/shoes b/assets/enchants/shoes similarity index 100% rename from qt/assets/enchants/shoes rename to assets/enchants/shoes diff --git a/qt/assets/enchants/tertiary_weapon b/assets/enchants/tertiary_weapon similarity index 100% rename from qt/assets/enchants/tertiary_weapon rename to assets/enchants/tertiary_weapon diff --git a/qt/assets/enchants/wrist b/assets/enchants/wrist similarity index 100% rename from qt/assets/enchants/wrist rename to assets/enchants/wrist diff --git a/qt/assets/equipments/belt b/assets/equipments/belt similarity index 100% rename from qt/assets/equipments/belt rename to assets/equipments/belt diff --git a/qt/assets/equipments/bottoms b/assets/equipments/bottoms similarity index 100% rename from qt/assets/equipments/bottoms rename to assets/equipments/bottoms diff --git a/qt/assets/equipments/hat b/assets/equipments/hat similarity index 100% rename from qt/assets/equipments/hat rename to assets/equipments/hat diff --git a/qt/assets/equipments/jacket b/assets/equipments/jacket similarity index 100% rename from qt/assets/equipments/jacket rename to assets/equipments/jacket diff --git a/qt/assets/equipments/necklace b/assets/equipments/necklace similarity index 100% rename from qt/assets/equipments/necklace rename to assets/equipments/necklace diff --git a/qt/assets/equipments/pendant b/assets/equipments/pendant similarity index 100% rename from qt/assets/equipments/pendant rename to assets/equipments/pendant diff --git a/qt/assets/equipments/primary_weapon b/assets/equipments/primary_weapon similarity index 100% rename from qt/assets/equipments/primary_weapon rename to assets/equipments/primary_weapon diff --git a/qt/assets/equipments/ring b/assets/equipments/ring similarity index 100% rename from qt/assets/equipments/ring rename to assets/equipments/ring diff --git a/qt/assets/equipments/secondary_weapon b/assets/equipments/secondary_weapon similarity index 100% rename from qt/assets/equipments/secondary_weapon rename to assets/equipments/secondary_weapon diff --git a/qt/assets/equipments/shoes b/assets/equipments/shoes similarity index 100% rename from qt/assets/equipments/shoes rename to assets/equipments/shoes diff --git a/qt/assets/equipments/tertiary_weapon b/assets/equipments/tertiary_weapon similarity index 100% rename from qt/assets/equipments/tertiary_weapon rename to assets/equipments/tertiary_weapon diff --git a/qt/assets/equipments/wrist b/assets/equipments/wrist similarity index 100% rename from qt/assets/equipments/wrist rename to assets/equipments/wrist diff --git a/assets/icon.icns b/assets/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..9734283099cc540ebd66d5b130d169703d873669 Binary files /dev/null and b/assets/icon.icns differ diff --git a/qt/assets/icon.ico b/assets/icon.ico similarity index 100% rename from qt/assets/icon.ico rename to assets/icon.ico diff --git a/assets/stones.json b/assets/stones.json new file mode 100644 index 0000000000000000000000000000000000000000..a6e037c854968492882a2535c9a82cf18610b5d8 --- /dev/null +++ b/assets/stones.json @@ -0,0 +1 @@ +{"力道": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "外功会效": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "外功攻击": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "内功会效": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "加速": {"外功攻击": {"1": {"level": 1, "attr": {"strength_base": 22, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strength_base": 44, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strength_base": 66, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strength_base": 87, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strength_base": 109, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strength_base": 131, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "身法": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "外功会效": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "外功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "内功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "外功会效": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "外功会心": {"内功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "加速": {"外功攻击": {"1": {"level": 1, "attr": {"agility_base": 22, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"agility_base": 44, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"agility_base": 66, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"agility_base": 87, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"agility_base": 109, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"agility_base": 131, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "根骨": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "外功会效": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "外功攻击": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "内功会效": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "加速": {"内功攻击": {"1": {"level": 1, "attr": {"spirit_base": 22, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spirit_base": 44, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spirit_base": 66, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spirit_base": 87, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spirit_base": 109, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spirit_base": 131, "haste_base": 1170, "magical_attack_power_base": 1257}}}}}, "外功攻击": {"外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功会效": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}}}, "外功破防": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功会效": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}}}, "外功会心": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "外功会效": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "外功攻击": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "内功攻击": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "外功会效": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}}, "外功会效": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}}, "外功会心": {"内功攻击": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}}, "破招": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "外功会效": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "外功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "内功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "内功会效": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "外功会心": {"内功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}, "加速": {"内功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "haste_base": 1170, "magical_attack_power_base": 1257}}}, "外功攻击": {"1": {"level": 1, "attr": {"surplus_base": 98, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"surplus_base": 195, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"surplus_base": 293, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"surplus_base": 390, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"surplus_base": 488, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"surplus_base": 585, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "无双": {"外功攻击": {"基础武器伤害": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "外功破防": {"基础武器伤害": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "外功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "外功会效": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"基础武器伤害": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "外功破防": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "外功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "内功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "内功会效": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "外功会心": {"内功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}, "加速": {"内功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "haste_base": 1170, "magical_attack_power_base": 1257}}}, "外功攻击": {"1": {"level": 1, "attr": {"strain_base": 98, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strain_base": 195, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strain_base": 293, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strain_base": 390, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strain_base": 488, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strain_base": 585, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "元气": {"内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "内功会效": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "外功会心": {"内功攻击": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_strike_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_strike_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_strike_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_strike_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_strike_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_strike_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"内功攻击": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "加速": {"内功攻击": {"1": {"level": 1, "attr": {"spunk_base": 22, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "haste_base": 1170, "magical_attack_power_base": 1257}}}}}, "内功攻击": {"内功破防": {"内功会效": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "内功会效": {"内功破防": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "外功会心": {"内功破防": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "physical_critical_strike_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "physical_critical_strike_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "physical_critical_strike_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "physical_critical_strike_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "physical_critical_strike_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "physical_critical_strike_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"内功破防": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}}, "内功破防": {"内功攻击": {"内功会效": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "外功会效": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}}, "外功会心": {"内功攻击": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "外功会效": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "physical_critical_strike_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "physical_critical_strike_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "physical_critical_strike_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "physical_critical_strike_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "physical_critical_strike_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "physical_critical_strike_base": 1170, "physical_critical_power_base": 2340}}}}, "外功会效": {"内功攻击": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}}}, "内功会心": {"内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "内功会效": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "内功会效": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "内功会效": {"内功攻击": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "内功破防": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}}, "内功会效": {"内功攻击": {"内功破防": {"1": {"level": 1, "attr": {"magical_critical_power_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_power_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_power_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_power_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_power_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_power_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}}, "内功破防": {"内功攻击": {"1": {"level": 1, "attr": {"magical_critical_power_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_critical_power_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_critical_power_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_critical_power_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_critical_power_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_critical_power_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}}}, "全属性": {"全会效": {"4": {"level": 4, "attr": {"all_major_base": 110, "all_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"all_major_base": 137, "all_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"all_major_base": 165, "all_critical_power_base": 2340}}}}} \ No newline at end of file diff --git a/get_assets.py b/get_assets.py index 9bdf4edc3009872b846767a42dc81e44a16b153c..97252c507ddccaaa37c0506ad2754f03b9ea74ba 100644 --- a/get_assets.py +++ b/get_assets.py @@ -5,10 +5,10 @@ from functools import cache import requests from tqdm import tqdm -from qt.constant import MAX_BASE_ATTR, MAX_MAGIC_ATTR, MAX_EMBED_ATTR, MAX_ENCHANT_ATTR -from qt.constant import ATTR_TYPE_TRANSLATE -from qt.constant import MAX_STONE_ATTR, MAX_STONE_LEVEL -from qt.constant import EQUIPMENTS_DIR, ENCHANTS_DIR, STONES_DIR +from assets.constant import MAX_BASE_ATTR, MAX_MAGIC_ATTR, MAX_EMBED_ATTR, MAX_ENCHANT_ATTR, STONES_DIR +from assets.constant import ATTR_TYPE_TRANSLATE +from assets.constant import MAX_STONE_ATTR, MAX_STONE_LEVEL +from assets.constant import EQUIPMENTS_DIR, ENCHANTS_DIR from schools import SUPPORT_SCHOOL KINDS = set(sum([[school.kind, school.major] for school in SUPPORT_SCHOOL.values()], [])) @@ -320,6 +320,7 @@ def get_stones_list(): if detail := get_stone_detail(row): current = result for attr in detail['attr']: + attr = ATTR_TYPE_TRANSLATE[attr] if attr not in current: current[attr] = {} current = current[attr] @@ -370,4 +371,4 @@ if __name__ == '__main__': json.dump( get_weapon_enchants(), open(os.path.join(ENCHANTS_DIR, "secondary_weapon"), "w", encoding="utf-8") ) - # json.dump(get_stones_list(), open(STONES_DIR, "w", encoding="utf-8"), ensure_ascii=False) + json.dump(get_stones_list(), open(STONES_DIR, "w", encoding="utf-8"), ensure_ascii=False) diff --git a/qt/__init__.py b/gr/__init__.py similarity index 100% rename from qt/__init__.py rename to gr/__init__.py diff --git a/gr/app.py b/gr/app.py new file mode 100644 index 0000000000000000000000000000000000000000..eb37db9c555ae1ff38d4a7942bda669f413e3a8b --- /dev/null +++ b/gr/app.py @@ -0,0 +1,42 @@ +from gr.components.top import TopComponent +from gr.components.equipments import EquipmentsComponent +from gr.components.talents import TalentsComponent +from gr.components.recipes import RecipesComponent +from gr.components.combat import CombatComponent + +from gr.scripts.top import top_script +from gr.scripts.equipments import equipments_script +from gr.scripts.talents import talents_script +from gr.scripts.recipes import recipes_script +from gr.scripts.combat import combat_script + +import gradio as gr + + +def start(): + with gr.Blocks(theme=gr.themes.Soft()) as app: + top_component = TopComponent() + with gr.Group(visible=False) as bottom_component: + with gr.Tab("装备"): + equipments_component = EquipmentsComponent() + with gr.Tab("奇穴"): + talents_component = TalentsComponent() + with gr.Tab("秘籍"): + recipes_component = RecipesComponent() + with gr.Tab("战斗"): + combat_component = CombatComponent() + + parser = top_script(top_component, bottom_component, + equipments_component, talents_component, recipes_component, + combat_component) + equipments = equipments_script(equipments_component) + talents = talents_script(talents_component) + recipes = recipes_script(recipes_component) + combat_script(parser, talents, recipes, equipments, combat_component) + + app.queue() + app.launch(allowed_paths=["."]) + + +if __name__ == '__main__': + start() diff --git a/qt/scripts/__init__.py b/gr/components/__init__.py similarity index 100% rename from qt/scripts/__init__.py rename to gr/components/__init__.py diff --git a/gr/components/combat.py b/gr/components/combat.py new file mode 100644 index 0000000000000000000000000000000000000000..2627586118da42014d6d7dd40166be98ac0facb7 --- /dev/null +++ b/gr/components/combat.py @@ -0,0 +1,32 @@ +import gradio as gr + +from base.constant import SHIELD_BASE_MAP + + +class CombatComponent: + def __init__(self): + with gr.Row(): + self.combat_duration = gr.Slider(label="战斗时长", step=0.01) + target_levels = list(SHIELD_BASE_MAP) + self.target_level = gr.Dropdown(choices=target_levels, value=target_levels[0], label="目标等级") + self.formulate = gr.Button("开始模拟") + + with gr.Tab("属性"): + with gr.Row(): + self.init_attribute = gr.Textbox("初始属性") + self.final_attribute = gr.Textbox("增益后属性") + with gr.Tab("伤害总结"): + self.skill_select = gr.Dropdown(label="选择技能") + self.status_select = gr.Dropdown(label="选择增益") + with gr.Row(): + self.damage_detail = gr.Textbox(label="伤害细节") + self.gradient_detail = gr.Textbox(label="属性收益") + with gr.Tab("战斗统计"): + with gr.Row(): + self.summary = gr.DataFrame(label="战斗总结", headers=["技能/次数", "命中/%", "会心/%", "伤害/%"], scale=3) + with gr.Column(scale=1): + self.dps = gr.Textbox("每秒伤害") + self.gradient = gr.Textbox("属性收益") + + + diff --git a/gr/components/equipments.py b/gr/components/equipments.py new file mode 100644 index 0000000000000000000000000000000000000000..fa65db9bb271f2236e92681cfe9c3442dde91ef7 --- /dev/null +++ b/gr/components/equipments.py @@ -0,0 +1,81 @@ +import json +import os + +from assets.constant import POSITION_MAP, STONES_POSITIONS, EQUIPMENTS_DIR, ENCHANTS_DIR, STONES_DIR, MAX_STONE_ATTR, \ + ATTR_TYPE_TRANSLATE +from assets.constant import EMBED_POSITIONS, MAX_EMBED_LEVEL, MAX_STONE_LEVEL, SPECIAL_ENCHANT_POSITIONS +import gradio as gr + + +class EquipmentComponent: + def __init__(self, label): + self.position = POSITION_MAP[label] + self.equipment_json = json.load(open(os.path.join(EQUIPMENTS_DIR, self.position), encoding="utf-8")) + self.equipment_mapping = {v['id']: k for k, v in self.equipment_json.items()} + self.enchant_json = json.load(open(os.path.join(ENCHANTS_DIR, self.position), encoding="utf-8")) + self.enchant_mapping = {v['id']: k for k, v in self.enchant_json.items()} + + self.equipment = gr.Dropdown(label="装备") + with gr.Row(): + with gr.Column(scale=3) as self.detail: + with gr.Row(): + if not self.enchant_json: + self.enchant = gr.Dropdown(visible=False) + else: + self.enchant = gr.Dropdown(choices=[""] + list(self.enchant_json), label="附魔") + + if self.position not in SPECIAL_ENCHANT_POSITIONS: + self.special_enchant = gr.Checkbox(visible=False) + else: + self.special_enchant = gr.Checkbox(label="大附魔") + + with gr.Row(): + self.strength_level = gr.Dropdown(label="精炼等级") + + self.embed_levels = [] + for i in range(EMBED_POSITIONS[self.position]): + embed_level = gr.Dropdown( + choices=list(range(MAX_EMBED_LEVEL + 1)), value=MAX_EMBED_LEVEL, visible=False + ) + self.embed_levels.append(embed_level) + + with gr.Row(): + if self.position not in STONES_POSITIONS: + self.stones_json = None + self.stone_level = gr.Dropdown(visible=False) + self.stone_attrs = [gr.Dropdown(visible=False)] * MAX_STONE_ATTR + else: + self.stones_json = json.load(open(STONES_DIR, encoding="utf-8")) + + self.stone_level = gr.Dropdown( + choices=list(range(MAX_STONE_LEVEL + 1)), value=MAX_STONE_LEVEL, label="五彩石等级" + ) + self.stone_attrs = [] + for i in range(MAX_STONE_ATTR): + if i: + stone_attr = gr.Dropdown(label=f"五彩石属性-{i + 1}") + else: + stone_attr = gr.Dropdown(choices=list(self.stones_json), label=f"五彩石属性-{i + 1}") + self.stone_attrs.append(stone_attr) + + self.base_attr = gr.Textbox(label="基本属性", visible=False, scale=1, lines=5) + self.magic_attr = gr.Textbox(label="精炼属性", visible=False, scale=1, lines=5) + self.embed_attr = gr.Textbox(label="镶嵌属性", visible=False, scale=1, lines=5) + + +class EquipmentsComponent: + def __init__(self): + super().__init__() + self.equipments = {} + for label in POSITION_MAP: + with gr.Tab(label): + self.equipments[label] = EquipmentComponent(label) + + def __getitem__(self, item) -> EquipmentComponent: + return self.equipments[item] + + def items(self): + return self.equipments.items() + + def values(self): + return self.equipments.values() diff --git a/gr/components/recipes.py b/gr/components/recipes.py new file mode 100644 index 0000000000000000000000000000000000000000..e03cdfdca17c137a71d016a4fbacda1bfe26b047 --- /dev/null +++ b/gr/components/recipes.py @@ -0,0 +1,24 @@ +import gradio as gr + +from assets.constant import MAX_RECIPE_SKILLS, MAX_RECIPES + + +class RecipesComponent: + def __init__(self): + + self.recipes = [] + + columns = 6 + rows = MAX_RECIPE_SKILLS // columns + + for i in range(rows): + with gr.Row(): + for j in range(columns): + recipe = gr.Dropdown(multiselect=True, max_choices=MAX_RECIPES, visible=False) + self.recipes.append(recipe) + + def __getitem__(self, item) -> gr.Dropdown: + return self.recipes[item] + + def values(self) -> list[gr.Dropdown]: + return self.recipes diff --git a/gr/components/talents.py b/gr/components/talents.py new file mode 100644 index 0000000000000000000000000000000000000000..9134ba6163da9a7af68d61241d82f99522b02ae9 --- /dev/null +++ b/gr/components/talents.py @@ -0,0 +1,25 @@ +from typing import List + +import gradio as gr + +from assets.constant import MAX_TALENTS + + +class TalentsComponent: + def __init__(self): + self.talents = [] + + rows = 2 + columns = MAX_TALENTS // rows + + for i in range(rows): + with gr.Row(): + for j in range(columns): + talent = gr.Dropdown(label=f"奇穴第{i * columns + j + 1}层") + self.talents.append(talent) + + def __getitem__(self, item) -> gr.Dropdown: + return self.talents[item] + + def values(self) -> List[gr.Dropdown]: + return self.talents diff --git a/gr/components/top.py b/gr/components/top.py new file mode 100644 index 0000000000000000000000000000000000000000..16a5f6660763d7d17a04edc91a66952880e438a5 --- /dev/null +++ b/gr/components/top.py @@ -0,0 +1,13 @@ +import gradio as gr + + +class TopComponent: + def __init__(self): + with gr.Row(): + self.upload_log = gr.UploadButton("上传JCL") + with gr.Column(): + self.upload_json = gr.UploadButton("上传JSON") + self.save_json = gr.DownloadButton("保存JSON", visible=False) + with gr.Column(scale=2): + self.player_select = gr.Dropdown(label="选择角色", visible=False) + self.target_select = gr.Dropdown(label="选择目标", visible=False) diff --git a/gr/scripts/__init__.py b/gr/scripts/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/gr/scripts/combat.py b/gr/scripts/combat.py new file mode 100644 index 0000000000000000000000000000000000000000..4cd227f14a909500f23bc8ec21514056f7ef189a --- /dev/null +++ b/gr/scripts/combat.py @@ -0,0 +1,151 @@ +from typing import Dict + +from gr.components.combat import CombatComponent +from assets.constant import ATTR_TYPE_TRANSLATE +# from gr.scripts.bonuses import Bonuses +# from gr.scripts.consumables import Consumables +from gr.scripts.top import Parser +from gr.scripts.equipments import Equipments +from gr.scripts.recipes import Recipes +from gr.scripts.talents import Talents +from utils.analyzer import analyze_details, Detail + +import gradio as gr + +FULL_SPACE = "\u3000" + + +def attribute_content(display_attrs, attribute): + content = [] + for attr, name in display_attrs.items(): + value = getattr(attribute, attr) + if isinstance(value, int): + content.append([name, f"{value}"]) + else: + content.append([name, f"{round(value * 100, 2)}%"]) + return content + + +def summary_content(summary: Dict[str, Detail], total_damage): + content = [] + for skill in sorted(summary, key=lambda x: summary[x].expected_damage, reverse=True): + detail = summary[skill] + critical = round(detail.critical_count, 2) + critical_rate = round(detail.critical_count / detail.count * 100, 2) + hit = round(detail.count - critical, 2) + hit_rate = round(100 - critical_rate, 2) + damage = round(detail.expected_damage, 2) + damage_rate = round(damage / total_damage * 100, 2) + content.append( + [f"{skill}/{detail.count}", + f"{hit}/{hit_rate}%", f"{critical}/{critical_rate}%", f"{damage}/{damage_rate}%"] + ) + return content + + +def gradient_content(gradients, total_damage): + return "\n".join( + ATTR_TYPE_TRANSLATE[k].ljust(10, FULL_SPACE) + f"{round(v / total_damage * 100, 2)}%" + for k, v in gradients.items() + ) + + +def detail_content(detail: Detail): + damage_content = "\n".join([ + "命中伤害\t" + f"{round(detail.damage)}", + "会心伤害\t" + f"{round(detail.critical_damage)}", + "期望伤害\t" + f"{round(detail.expected_damage)}", + "期望会心\t" + f"{round(detail.critical_strike * 100, 2)}%", + "实际会心\t" + f"{round(detail.actual_critical_strike * 100, 2)}%", + "统计数量\t" + f"{detail.count}" + ]) + + return damage_content, gradient_content(detail.gradients, detail.expected_damage) + + +def combat_script( + parser: Parser, + talents: Talents, recipes: Recipes, equipments: Equipments, + # consumables: Consumables, bonuses: Bonuses + combat_component: CombatComponent, +): + def formulate(target_level, duration): + combat_update = {} + record = parser.current_records + school = parser.current_school + + attribute = school.attribute() + attribute.target_level = target_level + for attr, value in equipments.attrs.items(): + setattr(attribute, attr, getattr(attribute, attr) + value) + combat_update[combat_component.init_attribute] = gr.update( + value=attribute_content(school.display_attrs, attribute) + ) + # for attr, value in consumables.attrs.items(): + # setattr(attribute, attr, getattr(attribute, attr) + value) + + equipment_gains = [school.gains[gain] for gain in equipments.gains] + talent_gains = [school.talent_gains[school.talent_encoder[talent]] for talent in talents.gains] + recipe_gains = [ + school.recipe_gains[skill][recipe] + for i, skill in enumerate(school.recipe_gains) + for recipe in recipes.gains[i] + ] + gains = equipment_gains + talent_gains + recipe_gains # + bonuses.gains + + for gain in gains: + gain.add(attribute, school.skills, school.buffs) + + combat_update[combat_component.final_attribute] = gr.update( + value=attribute_content(school.display_attrs, attribute) + ) + total, summary, details = analyze_details(record, duration, attribute, school) + + for gain in gains: + gain.sub(attribute, school.skills, school.buffs) + + combat_update[combat_component.dps] = gr.update(value=round(total.expected_damage / duration)) + + combat_update[combat_component.gradient] = gradient_content(total.gradients, total.expected_damage) + # + # dashboard_widget.detail_widget.details = details + # set_skills() + + combat_update[combat_component.summary] = summary_content(summary, total.expected_damage) + return combat_update + + combat_component.formulate.click( + formulate, + [combat_component.target_level, combat_component.combat_duration], + [combat_component.init_attribute, combat_component.final_attribute, + combat_component.dps, combat_component.gradient, combat_component.summary] + ) + + # def set_skills(): + # detail_widget = dashboard_widget.detail_widget + # detail_widget.skill_combo.set_items(list(detail_widget.details), keep_index=True, default_index=-1) + # set_status(None) + # + # def set_status(_): + # detail_widget = dashboard_widget.detail_widget + # skill = detail_widget.skill_combo.combo_box.currentText() + # detail_widget.status_combo.set_items( + # list(detail_widget.details.get(skill, {})), keep_index=True, default_index=-1 + # ) + # set_detail(None) + # + # dashboard_widget.detail_widget.skill_combo.combo_box.currentTextChanged.connect(set_status) + # + # def set_detail(_): + # detail_widget = dashboard_widget.detail_widget + # skill = detail_widget.skill_combo.combo_box.currentText() + # status = detail_widget.status_combo.combo_box.currentText() + # if detail := detail_widget.details.get(skill, {}).get(status): + # damage_content, gradient_content = detail_content(detail) + # detail_widget.damage_detail.set_content(damage_content) + # detail_widget.gradient_detail.set_content(gradient_content) + # else: + # detail_widget.damage_detail.table.clear() + # detail_widget.gradient_detail.table.clear() + # + # dashboard_widget.detail_widget.status_combo.combo_box.currentTextChanged.connect(set_detail) diff --git a/qt/scripts/equipments.py b/gr/scripts/equipments.py similarity index 50% rename from qt/scripts/equipments.py rename to gr/scripts/equipments.py index 2697ca91df05d0c6aeefa68a493e050b2ad6d73e..c27f34419b4b2ecef5a3cbcc4d1c9aeb20118b47 100644 --- a/qt/scripts/equipments.py +++ b/gr/scripts/equipments.py @@ -1,11 +1,15 @@ from collections import defaultdict from typing import Dict, List, Union, Tuple +import gradio as gr + from general.gains.equipment import EQUIPMENT_GAINS -from qt.components.equipments import EquipmentsWidget -from qt.constant import POSITION_MAP, STONES_POSITIONS, EMBED_POSITIONS -from qt.constant import ATTR_TYPE_TRANSLATE, ATTR_TYPE_TRANSLATE_REVERSE -from qt.constant import STRENGTH_COF, EMBED_COF, MAX_STRENGTH_LEVEL, MAX_EMBED_LEVEL +from gr.components.equipments import EquipmentsComponent +from assets.constant import POSITION_MAP, STONES_POSITIONS, EMBED_POSITIONS +from assets.constant import ATTR_TYPE_TRANSLATE +from assets.constant import STRENGTH_COF, EMBED_COF, MAX_STRENGTH_LEVEL, MAX_EMBED_LEVEL + +FULL_SPACE = "\u3000" class Enchant: @@ -97,18 +101,27 @@ class Equipment: @property def base_attr_content(self): - return [[ATTR_TYPE_TRANSLATE[k], str(v)] for k, v in self.base_attr.items()] + return "\n".join( + ATTR_TYPE_TRANSLATE[k].ljust(10, FULL_SPACE) + str(v) for k, v in self.base_attr.items() + ) @property def magic_attr_content(self): if strength_attr := self.strength_attr: - return [[ATTR_TYPE_TRANSLATE[k], f"{v}(+{strength_attr[k]})"] for k, v in self.magic_attr.items()] + return "\n".join( + ATTR_TYPE_TRANSLATE[k].ljust(10, FULL_SPACE) + f"{v}(+{strength_attr[k]})" + for k, v in self.magic_attr.items() + ) else: - return [[ATTR_TYPE_TRANSLATE[k], f"{v}"] for k, v in self.magic_attr.items()] + return "\n".join( + ATTR_TYPE_TRANSLATE[k].ljust(10, FULL_SPACE) + str(v) for k, v in self.magic_attr.items() + ) @property def embed_attr_content(self): - return [[ATTR_TYPE_TRANSLATE[k], str(v)] for k, v in self.embed_attr.items()] + return "\n".join( + ATTR_TYPE_TRANSLATE[k].ljust(10, FULL_SPACE) + str(v) for k, v in self.embed_attr.items() + ) class Equipments: @@ -117,7 +130,7 @@ class Equipments: def __getitem__(self, item) -> Equipment: return self.equipments[item] - + @property def attrs(self): final_attrs = defaultdict(int) @@ -177,67 +190,80 @@ class Equipments: return [tuple(gain) if isinstance(gain, list) else gain for gain in final_gains] -def equipments_script(equipments_widget: EquipmentsWidget): +def equipments_script(equipments_component: EquipmentsComponent): equipments = Equipments() - def equipment_update(label): - widget = equipments_widget[label] - equipment = equipments[label] - + def equipment_changed(label): def inner(equipment_name): - + equipment = equipments[label] + component = equipments_component[label] if not equipment_name: equipment.clear() - widget.detail_widget.hide() - return + return { + component.equipment: gr.update(value=""), + component.detail: gr.update(visible=False) + } + equipment_update = {} if equipment.strength_level == equipment.max_strength: max_strength = True else: max_strength = False equipment.name = equipment_name - equipment_detail = widget.equipment_json[equipment_name] + equipment_detail = component.equipment_json[equipment_name] for k, v in equipment_detail.items(): setattr(equipment, k, v) if equipment.base: - widget.base_attr.set_content(equipment.base_attr_content) - widget.base_attr.show() + equipment_update[component.base_attr] = gr.update( + value=equipment.base_attr_content, visible=True + ) else: - widget.base_attr.hide() + equipment_update[component.base_attr] = gr.update(visible=False) + + if isinstance(equipment.special_enchant, list): + equipment.special_enchant = tuple(equipment.special_enchant) + + if equipment.special_enchant: + equipment_update[component.special_enchant] = gr.update( + label=EQUIPMENT_GAINS[equipment.special_enchant].gain_name + ) if max_strength: equipment.strength_level = equipment.max_strength - widget.strength_level.set_items([str(i) for i in range(equipment.max_strength + 1)]) - widget.strength_level.combo_box.setCurrentIndex(equipment.strength_level) + equipment_update[component.strength_level] = gr.update( + choices=list(range(equipment.max_strength + 1)), value=equipment.strength_level + ) + equipment_update[component.magic_attr] = gr.update( + value=equipment.magic_attr_content, visible=True + ) if equipment.embed: - for i, (attr, value) in enumerate(equipment.embed.items()): - widget.embed_levels[i].set_label(f"镶嵌等级-{ATTR_TYPE_TRANSLATE[attr]}\t") - widget.embed_attr.set_content(equipment.embed_attr_content) - widget.embed_attr.show() + for i, attr in enumerate(equipment.embed): + embed_level_component = component.embed_levels[i] + equipment_update[embed_level_component] = gr.update( + label=f"镶嵌等级-{ATTR_TYPE_TRANSLATE[attr]}", visible=True + ) + equipment_update[component.embed_attr] = gr.update( + value=equipment.embed_attr_content, visible=True + ) else: - widget.embed_attr.hide() + for embed_level_component in component.embed_levels: + equipment_update[embed_level_component] = gr.update(visible=False) - if isinstance(equipment.special_enchant, list): - equipment.special_enchant = tuple(equipment.special_enchant) - - if equipment.special_enchant: - widget.special_enchant.set_text(EQUIPMENT_GAINS[equipment.special_enchant].gain_name) - - widget.detail_widget.show() + equipment_update[component.detail] = gr.update(visible=True) + return equipment_update return inner - def enchant_update(label): - widget = equipments_widget.equipments[label] - equipment = equipments[label] - + def enchant_changed(label): def inner(enchant_name): + equipment = equipments[label] + component = equipments_component[label] if enchant_name: - enchant_detail = widget.enchant_json[enchant_name] + enchant_detail = component.enchant_json[enchant_name] equipment.enchant.name = enchant_name for k, v in enchant_detail.items(): setattr(equipment.enchant, k, v) @@ -246,89 +272,99 @@ def equipments_script(equipments_widget: EquipmentsWidget): return inner - def special_enchant_update(label): - widget = equipments_widget.equipments[label] - equipment = equipments[label] - - def inner(_): - if widget.special_enchant and widget.special_enchant.radio_button.isChecked(): + def special_enchant_changed(label): + def inner(special_enchant_check): + equipment = equipments[label] + component = equipments_component[label] + if component.special_enchant and special_enchant_check: equipment.special_enchant_gain = [equipment.special_enchant] else: equipment.special_enchant_gain = [] return inner - def strength_level_update(label): - widget = equipments_widget.equipments[label] - equipment = equipments[label] - - def inner(index): - equipment.strength_level = index + def strength_level_changed(label): + def inner(strength_level): + equipment = equipments[label] + equipment.strength_level = strength_level if magic_attr_content := equipment.magic_attr_content: - widget.magic_attr.set_content(magic_attr_content) - widget.magic_attr.show() + return gr.update(value=magic_attr_content, visible=True) else: - widget.magic_attr.hide() + return gr.update(visible=False) return inner - def embed_level_update(i, label): - widget = equipments_widget.equipments[label] - equipment = equipments[label] - - def inner(index): - equipment.embed_levels[i] = index + def embed_level_changed(i, label): + def inner(embed_level): + equipment = equipments[label] + equipment.embed_levels[i] = embed_level if embed_attr_content := equipment.embed_attr_content: - widget.embed_attr.set_content(embed_attr_content) - widget.embed_attr.show() + return gr.update(value=embed_attr_content, visible=True) else: - widget.embed_attr.hide() + return gr.update(visible=False) return inner - def stone_update(label): - widget = equipments_widget.equipments[label] - equipment = equipments[label] - - def inner(_): - level = widget.stone_level.combo_box.currentText() + def stone_changed(label): + def inner(stone_level, *stone_attrs): + equipment = equipments[label] + component = equipments_component[label] - current = widget.stones_json + current = component.stones_json i = 0 - while i < len(widget.stone_attrs): - attr = ATTR_TYPE_TRANSLATE_REVERSE.get(widget.stone_attrs[i].combo_box.currentText()) - if attr in current: - current = current[attr] + for stone_attr in stone_attrs: + if stone_attr in current: + current = current[stone_attr] i += 1 else: break - if level in current: - for k, v in current[level].items(): + + stone_update = {component.stone_level: gr.update()} + stone_level = str(stone_level) + if stone_level in current: + for k, v in current[stone_level].items(): setattr(equipment.stone, k, v) - else: - widget.stone_attrs[i].set_items([""] + [ATTR_TYPE_TRANSLATE[k] for k in current]) - equipment.stone = Stone() + return stone_update + + equipment.stone = Stone() + stone_update[component.stone_attrs[i]] = gr.Dropdown( + choices=list(current) + ) i += 1 - while i < len(widget.stone_attrs): - widget.stone_attrs[i].set_items([""]) + while i < len(stone_attrs): + stone_update[component.stone_attrs[i]] = gr.Dropdown( + choices=[] + ) i += 1 + return stone_update return inner - for equipment_label, equipment_widget in equipments_widget.items(): - - equipment_widget.equipment.combo_box.currentTextChanged.connect(equipment_update(equipment_label)) - if equipment_widget.special_enchant: - equipment_widget.special_enchant.radio_button.clicked.connect(special_enchant_update(equipment_label)) - if equipment_widget.enchant: - equipment_widget.enchant.combo_box.currentTextChanged.connect(enchant_update(equipment_label)) - equipment_widget.strength_level.combo_box.currentIndexChanged.connect(strength_level_update(equipment_label)) - for n, embed_widget in enumerate(equipment_widget.embed_levels): - embed_widget.combo_box.currentIndexChanged.connect(embed_level_update(n, equipment_label)) - if equipment_widget.stones_json: - equipment_widget.stone_level.combo_box.currentIndexChanged.connect(stone_update(equipment_label)) - for stone_attr in equipment_widget.stone_attrs: - stone_attr.combo_box.currentIndexChanged.connect(stone_update(equipment_label)) + for equipment_label, equipment_component in equipments_component.items(): + equipment_component.equipment.change( + equipment_changed(equipment_label), equipment_component.equipment, + [equipment_component.detail, equipment_component.special_enchant, + equipment_component.base_attr, equipment_component.magic_attr, equipment_component.embed_attr, + equipment_component.strength_level, *equipment_component.embed_levels] + ) + equipment_component.enchant.change(enchant_changed(equipment_label), equipment_component.enchant) + equipment_component.special_enchant.change( + special_enchant_changed(equipment_label), equipment_component.special_enchant + ) + equipment_component.strength_level.change( + strength_level_changed(equipment_label), equipment_component.strength_level, equipment_component.magic_attr + ) + for n, embed_component in enumerate(equipment_component.embed_levels): + embed_component.change( + embed_level_changed(n, equipment_label), embed_component, equipment_component.embed_attr) + stone_components = [equipment_component.stone_level] + equipment_component.stone_attrs + equipment_component.stone_level.change( + stone_changed(equipment_label), stone_components, stone_components + ) + for stone_attr_component in equipment_component.stone_attrs: + stone_attr_component.change( + stone_changed(equipment_label), stone_components, stone_components + ) return equipments diff --git a/gr/scripts/recipes.py b/gr/scripts/recipes.py new file mode 100644 index 0000000000000000000000000000000000000000..aaedc36e42edf6aae943ecaf364bfea71ca43ea1 --- /dev/null +++ b/gr/scripts/recipes.py @@ -0,0 +1,36 @@ +from gr.components.recipes import RecipesComponent + +from assets.constant import MAX_RECIPE_SKILLS + + +class Recipes: + def __init__(self): + self.recipes = [[] for _ in range(MAX_RECIPE_SKILLS)] + + def __getitem__(self, item): + return self.recipes[item] + + def __setitem__(self, key, value): + self.recipes[key] = value + + @property + def gains(self): + return self.recipes + + +def recipes_script(recipes_component: RecipesComponent): + recipes = Recipes() + + def recipe_changed(i): + def inner(recipe_list): + if recipe_list: + recipes[i] = recipe_list + else: + recipes[i] = [] + + return inner + + for n, recipe_component in enumerate(recipes_component.values()): + recipe_component.change(recipe_changed(n), recipe_component) + + return recipes diff --git a/gr/scripts/talents.py b/gr/scripts/talents.py new file mode 100644 index 0000000000000000000000000000000000000000..78a0be6e44edb9dbded011e94513e77737bd947c --- /dev/null +++ b/gr/scripts/talents.py @@ -0,0 +1,33 @@ +from gr.components.talents import TalentsComponent + +from assets.constant import MAX_TALENTS + + +class Talents: + def __init__(self): + self.talents = ["" for _ in range(MAX_TALENTS)] + + def __getitem__(self, item): + return self.talents[item] + + def __setitem__(self, key, value): + self.talents[key] = value + + @property + def gains(self): + return [talent for talent in self.talents if talent] + + +def talents_script(talents_component: TalentsComponent): + talents = Talents() + + def talent_changed(i): + def inner(talent): + talents[i] = talent + + return inner + + for n, talent_component in enumerate(talents_component.values()): + talent_component.change(talent_changed(n), talent_component) + + return talents diff --git a/gr/scripts/top.py b/gr/scripts/top.py new file mode 100644 index 0000000000000000000000000000000000000000..13752708c67f61254d515a728fbd7e26bbefa6a6 --- /dev/null +++ b/gr/scripts/top.py @@ -0,0 +1,174 @@ +import json + +import gradio as gr + +from general.consumables import FOODS, POTIONS, WEAPON_ENCHANTS, SNACKS, WINES, SPREADS +from general.gains.formation import FORMATIONS +from gr.components.top import TopComponent +from gr.components.equipments import EquipmentsComponent +from gr.components.talents import TalentsComponent +from gr.components.recipes import RecipesComponent +from gr.components.combat import CombatComponent +from assets.constant import MAX_RECIPES, MAX_EMBED_ATTR, MAX_EMBED_LEVEL +from schools import SUPPORT_SCHOOL +from utils.parser import Parser +from utils.io import serialize, unserialize + + +def top_script( + top_component: TopComponent, bottom_component: gr.Group, + equipments_component: EquipmentsComponent, + talents_component: TalentsComponent, recipes_component: RecipesComponent, + combat_component: CombatComponent +): + parser = Parser() + + def save_json(): + result = dict( + records=serialize(parser.records), + file_name=parser.file_name, + start_frame=parser.start_frame, + end_frame=parser.end_frame, + id2name=parser.id2name, + name2id=parser.name2id, + players={player_id: school.id for player_id, school in parser.players.items()}, + targets=parser.targets, + select_talents=parser.select_talents, + select_equipments=parser.select_equipments, + ) + file_name = parser.file_name.split(".jcl")[0] + ".json" + json.dump(result, open(file_name, "w", encoding="utf-8"), ensure_ascii=False) + return file_name + + def upload_log(file_path): + if not file_path: + return [None] * 4 + parser(file_path) + players = [parser.id2name[player_id] for player_id in parser.players] + player_select_update = gr.update(choices=players, value=players[0], visible=True) + json_link = f"/file={save_json()}" + return player_select_update, gr.update(visible=True), gr.update(visible=True), gr.update(value=json_link) + + top_component.upload_log.upload( + upload_log, top_component.upload_log, + [top_component.player_select, top_component.save_json, bottom_component, top_component.save_json] + ) + + def load_json(file_path): + if not file_path: + return [None] * 4 + result = json.load(open(file_path, encoding="utf-8")) + + file_name = result['file_name'].split(".jcl")[0] + ".json" + json.dump(result, open(file_name, "w", encoding="utf-8"), ensure_ascii=False) + + result['records'] = unserialize(result['records']) + for player_id, school_id in result['players'].items(): + result['players'][player_id] = SUPPORT_SCHOOL[school_id] + for k, v in result.items(): + setattr(parser, k, v) + + json_link = f"/file={save_json()}" + + players = [parser.id2name[player_id] for player_id in parser.players] + player_select_update = gr.update(choices=players, value=players[0], visible=True) + return player_select_update, gr.update(visible=True), gr.update(visible=True), gr.update(value=json_link) + + top_component.upload_json.upload( + load_json, top_component.upload_json, + [top_component.player_select, top_component.save_json, bottom_component, top_component.save_json] + ) + + def player_select(player_name): + if not player_name: + return {} + player_id = parser.name2id[player_name] + parser.current_player = player_id + school = parser.players[player_id] + + top_update = { + top_component.target_select: gr.update( + choices=[""] + [parser.id2name[target_id] for target_id in parser.current_targets], + ), + combat_component.combat_duration: gr.update(value=parser.duration) + } + + # """ Update config """ + # config_choices = list(CONFIG.get(school.school, {})) + # config_widget.config_select.set_items(config_choices, default_index=-1) + # """ Update dashboard """ + # dashboard_widget.duration.set_value(parser.duration) + + """ Update talent options """ + for i, talent_component in enumerate(talents_component.values()): + choices = [""] + [school.talent_decoder[talent] for talent in school.talents[i]] + value = school.talent_decoder[parser.select_talents[player_id][i]] + top_update[talent_component] = gr.update(choices=choices, value=value) + + """ Update recipe options """ + for recipe_component in recipes_component.values(): + top_update[recipe_component] = gr.update(choices=[], visible=False) + + for i, (skill, recipes) in enumerate(school.recipes.items()): + recipe_component = recipes_component[i] + values = recipes[:min(MAX_RECIPES, len(recipes))] + top_update[recipe_component] = gr.update(choices=recipes, value=values, label=skill, visible=True) + + """ Update equipment options """ + for label, equipment_component in equipments_component.items(): + top_update[equipment_component.equipment] = equipment_update = gr.update() + top_update[equipment_component.enchant] = enchant_update = gr.update() + top_update[equipment_component.strength_level] = strength_level = gr.update() + embed_level_updates = [gr.update(value=MAX_EMBED_LEVEL)] * MAX_EMBED_ATTR + for i, embed_level in enumerate(equipment_component.embed_levels): + top_update[embed_level] = embed_level_updates[i] + + equipment_update["choices"] = equipment_choices = [""] + for name, detail in equipment_component.equipment_json.items(): + if detail['kind'] not in (school.kind, school.major): + continue + if detail['school'] not in ("精简", "通用", school.school): + continue + equipment_choices.append(name) + if select_equipment := parser.select_equipments[player_id].get(label, {}): + if equipment_name := equipment_component.equipment_mapping.get(select_equipment['equipment']): + equipment_update["value"] = equipment_name + if enchant := equipment_component.enchant_mapping.get(select_equipment['enchant']): + enchant_update["value"] = enchant + strength_level["value"] = select_equipment['strength_level'] + for i, embed_level in enumerate(select_equipment['embed_levels']): + embed_level_updates[i] = gr.update(value=embed_level) + + return top_update + # + # """ Update consumable options """ + # consumables_widget.major_food.set_items([""] + FOODS[school.major], keep_index=True) + # consumables_widget.minor_food.set_items([""] + FOODS[school.kind] + FOODS[""], keep_index=True) + # consumables_widget.major_potion.set_items([""] + POTIONS[school.major], keep_index=True) + # consumables_widget.minor_potion.set_items([""] + POTIONS[school.kind] + POTIONS[""], keep_index=True) + # consumables_widget.weapon_enchant.set_items([""] + WEAPON_ENCHANTS[school.kind], keep_index=True) + # consumables_widget.home_snack.set_items([""] + SNACKS[school.kind] + SNACKS[""], keep_index=True) + # consumables_widget.home_wine.set_items([""] + WINES[school.major] + WINES[""], keep_index=True) + # consumables_widget.spread.set_items([""] + SPREADS[school.major] + SPREADS[school.kind], keep_index=True) + # + # """ Update bonus options """ + # bonus_widget.formation.formation.set_items([""] + FORMATIONS[school.kind] + FORMATIONS[""], keep_index=True) + # config_widget.show() + # bottom_widget.show() + + top_component.player_select.change( + player_select, top_component.player_select, + sum([[e.equipment, e.enchant, e.strength_level, *e.embed_levels] for e in equipments_component.values()], []) + + talents_component.talents + recipes_component.recipes + + [combat_component.combat_duration] + [top_component.target_select] + ) + + def target_select(target_name): + target_id = parser.name2id.get(target_name, "") + parser.current_target = target_id + + top_component.target_select.change( + target_select, top_component.target_select + ) + + return parser diff --git a/qt/app.py b/qt/app.py deleted file mode 100644 index 7f9ff51e42ed5d78ba8e8ab9ed985bd22e655f53..0000000000000000000000000000000000000000 --- a/qt/app.py +++ /dev/null @@ -1,94 +0,0 @@ -import sys - - -from PySide6.QtGui import QIcon - -from qt.components.top import TopWidget -from qt.scripts.config import config_script -from qt.scripts.top import top_script -from qt.components.config import ConfigWidget -from qt.components.equipments import EquipmentsWidget -from qt.scripts.equipments import equipments_script -from qt.components.consumables import ConsumablesWidget -from qt.scripts.consumables import consumables_script -from qt.components.talents import TalentsWidget -from qt.scripts.talents import talents_script -from qt.components.recipes import RecipesWidget -from qt.scripts.recipes import recipes_script -from qt.components.bonuses import BonusesWidget -from qt.scripts.bonuses import bonuses_script -from qt.components.dashboard import DashboardWidget -from qt.scripts.dashboard import dashboard_script - -from PySide6.QtWidgets import QApplication, QMainWindow, QStyleFactory -from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget, QTabWidget - - -class MainWindow(QMainWindow): - def __init__(self): - super().__init__() - - self.setWindowTitle("Formulator") - - icon = QIcon("qt/assets/icon.ico") - self.setWindowIcon(icon) - - self.central_widget = QWidget(self) - self.setCentralWidget(self.central_widget) - - self.showMaximized() - layout = QVBoxLayout(self.central_widget) - - self.top_widget = TopWidget() - layout.addWidget(self.top_widget, 1) - - self.config_widget = ConfigWidget() - layout.addWidget(self.config_widget, 1) - self.config_widget.hide() - - self.bottom_widget = QWidget() - layout.addWidget(self.bottom_widget, 8) - self.bottom_widget.hide() - - bottom_layout = QHBoxLayout(self.bottom_widget) - self.detail_widget = QTabWidget() - self.dashboard_widget = DashboardWidget() - bottom_layout.addWidget(self.detail_widget, 1) - bottom_layout.addWidget(self.dashboard_widget, 1) - - self.equipments_widget = EquipmentsWidget() - self.detail_widget.addTab(self.equipments_widget, "配装") - self.consumable_widget = ConsumablesWidget() - self.detail_widget.addTab(self.consumable_widget, "消耗品") - self.bonus_widget = BonusesWidget() - self.detail_widget.addTab(self.bonus_widget, "增益") - self.talents_widget = TalentsWidget() - self.detail_widget.addTab(self.talents_widget, "奇穴") - self.recipes_widget = RecipesWidget() - self.detail_widget.addTab(self.recipes_widget, "秘籍") - - parser = top_script( - self.top_widget, self.config_widget, self.bottom_widget, - self.dashboard_widget, self.talents_widget, self.recipes_widget, - self.equipments_widget, self.consumable_widget, self.bonus_widget - ) - config_script( - parser, self.config_widget, - self.talents_widget, self.recipes_widget, - self.equipments_widget, self.consumable_widget, self.bonus_widget - ) - talents = talents_script(self.talents_widget) - recipes = recipes_script(self.recipes_widget) - equipments = equipments_script(self.equipments_widget) - consumables = consumables_script(self.consumable_widget) - bonuses = bonuses_script(parser, self.bonus_widget) - dashboard_script(parser, self.dashboard_widget, - talents, recipes, equipments, consumables, bonuses) - - -if __name__ == "__main__": - app = QApplication(sys.argv) - app.setStyle(QStyleFactory.create('Fusion')) - window = MainWindow() - window.show() - sys.exit(app.exec()) diff --git a/qt/assets/stones.json b/qt/assets/stones.json deleted file mode 100644 index d9396a2a4b21f3387aba282c5d06c38a8a6e7562..0000000000000000000000000000000000000000 --- a/qt/assets/stones.json +++ /dev/null @@ -1 +0,0 @@ -{"strength_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strength_base": 44, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strength_base": 66, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strength_base": 87, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strength_base": 109, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strength_base": 131, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"strength_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strength_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strength_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strength_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strength_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strength_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "haste_base": {"physical_attack_power_base": {"1": {"level": 1, "attr": {"strength_base": 22, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strength_base": 44, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strength_base": 66, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strength_base": 87, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strength_base": 109, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strength_base": 131, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "agility_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "magical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "physical_critical_strike_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"agility_base": 22, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"agility_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"agility_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"agility_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"agility_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"agility_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"agility_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "haste_base": {"physical_attack_power_base": {"1": {"level": 1, "attr": {"agility_base": 22, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"agility_base": 44, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"agility_base": 66, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"agility_base": 87, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"agility_base": 109, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"agility_base": 131, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "spirit_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"spirit_base": 44, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"spirit_base": 66, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"spirit_base": 87, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"spirit_base": 109, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"spirit_base": 131, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spirit_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spirit_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spirit_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spirit_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spirit_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "haste_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spirit_base": 22, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spirit_base": 44, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spirit_base": 66, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spirit_base": 87, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spirit_base": 109, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spirit_base": 131, "haste_base": 1170, "magical_attack_power_base": 1257}}}}}, "physical_attack_power_base": {"physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"physical_attack_power_base": 44, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_attack_power_base": 87, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_attack_power_base": 131, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_attack_power_base": 175, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_attack_power_base": 218, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_attack_power_base": 262, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}}}, "physical_overcome_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"physical_overcome_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_overcome_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_overcome_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_overcome_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_overcome_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_overcome_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}}}, "physical_critical_strike_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "magical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"physical_critical_strike_base": 98, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_strike_base": 195, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_strike_base": 293, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_strike_base": 390, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_strike_base": 488, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_strike_base": 585, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}}, "physical_critical_power_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}}, "physical_critical_strike_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"physical_critical_power_base": 98, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"physical_critical_power_base": 195, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"physical_critical_power_base": 293, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"physical_critical_power_base": 390, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"physical_critical_power_base": 488, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"physical_critical_power_base": 585, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}}, "surplus_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "magical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "physical_critical_strike_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"surplus_base": 195, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"surplus_base": 293, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"surplus_base": 390, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"surplus_base": 488, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"surplus_base": 585, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}, "haste_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"surplus_base": 195, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"surplus_base": 293, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"surplus_base": 390, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"surplus_base": 488, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"surplus_base": 585, "haste_base": 1170, "magical_attack_power_base": 1257}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"surplus_base": 98, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"surplus_base": 195, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"surplus_base": 293, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"surplus_base": 390, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"surplus_base": 488, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"surplus_base": 585, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "strain_base": {"physical_attack_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_attack_power_base": 87, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_attack_power_base": 175, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_attack_power_base": 262, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_attack_power_base": 349, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_attack_power_base": 436, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_attack_power_base": 524, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_attack_power_base": 87, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_attack_power_base": 175, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_attack_power_base": 262, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_attack_power_base": 349, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_attack_power_base": 436, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_attack_power_base": 524, "physical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_attack_power_base": 87, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_attack_power_base": 175, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_attack_power_base": 262, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_attack_power_base": 349, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_attack_power_base": 436, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_attack_power_base": 524, "physical_critical_power_base": 2340}}}}, "physical_overcome_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_overcome_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_overcome_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_overcome_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_overcome_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_overcome_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_overcome_base": 1170, "weapon_damage_base": 1571}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_overcome_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_overcome_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_overcome_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_overcome_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_overcome_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_overcome_base": 1170, "physical_attack_power_base": 1048}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"weapon_damage_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "weapon_damage_base": 262}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "weapon_damage_base": 524}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "weapon_damage_base": 786}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "weapon_damage_base": 1048}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "weapon_damage_base": 1309}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "weapon_damage_base": 1571}}}, "physical_overcome_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "physical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "physical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "physical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "physical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "physical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "physical_overcome_base": 2340}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "physical_attack_power_base": 1048}}}, "magical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"strain_base": 98, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "physical_critical_strike_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"strain_base": 98, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"strain_base": 195, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"strain_base": 293, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"strain_base": 390, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"strain_base": 488, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"strain_base": 585, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}}, "haste_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"strain_base": 195, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"strain_base": 293, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"strain_base": 390, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"strain_base": 488, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"strain_base": 585, "haste_base": 1170, "magical_attack_power_base": 1257}}}, "physical_attack_power_base": {"1": {"level": 1, "attr": {"strain_base": 98, "haste_base": 195, "physical_attack_power_base": 175}}, "2": {"level": 2, "attr": {"strain_base": 195, "haste_base": 390, "physical_attack_power_base": 349}}, "3": {"level": 3, "attr": {"strain_base": 293, "haste_base": 585, "physical_attack_power_base": 524}}, "4": {"level": 4, "attr": {"strain_base": 390, "haste_base": 780, "physical_attack_power_base": 698}}, "5": {"level": 5, "attr": {"strain_base": 488, "haste_base": 975, "physical_attack_power_base": 873}}, "6": {"level": 6, "attr": {"strain_base": 585, "haste_base": 1170, "physical_attack_power_base": 1048}}}}}, "spunk_base": {"magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "physical_critical_strike_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_strike_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_strike_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_strike_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_strike_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_strike_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_strike_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"spunk_base": 44, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"spunk_base": 66, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"spunk_base": 87, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"spunk_base": 109, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"spunk_base": 131, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "haste_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"spunk_base": 22, "haste_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"spunk_base": 44, "haste_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"spunk_base": 66, "haste_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"spunk_base": 87, "haste_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"spunk_base": 109, "haste_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"spunk_base": 131, "haste_base": 1170, "magical_attack_power_base": 1257}}}}}, "magical_attack_power_base": {"magical_overcome_base": {"magical_critical_power_base": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "magical_overcome_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "magical_overcome_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "magical_overcome_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "magical_overcome_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "magical_overcome_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "magical_overcome_base": 1170, "physical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}, "physical_critical_strike_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "physical_critical_strike_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "physical_critical_strike_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "physical_critical_strike_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "physical_critical_strike_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "physical_critical_strike_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "physical_critical_strike_base": 1170, "magical_overcome_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "physical_critical_strike_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "physical_critical_strike_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "physical_critical_strike_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "physical_critical_strike_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "physical_critical_strike_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "physical_critical_strike_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"magical_attack_power_base": 52, "physical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_attack_power_base": 105, "physical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_attack_power_base": 157, "physical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_attack_power_base": 210, "physical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_attack_power_base": 262, "physical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_attack_power_base": 314, "physical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}}, "magical_overcome_base": {"magical_attack_power_base": {"magical_critical_power_base": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "magical_attack_power_base": 105, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "magical_attack_power_base": 210, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "magical_attack_power_base": 314, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "magical_attack_power_base": 419, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "magical_attack_power_base": 524, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "magical_attack_power_base": 629, "physical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}}, "physical_critical_strike_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "physical_critical_strike_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "physical_critical_strike_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "physical_critical_strike_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "physical_critical_strike_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "physical_critical_strike_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "physical_critical_strike_base": 1170, "magical_attack_power_base": 1257}}}, "physical_critical_power_base": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "physical_critical_strike_base": 195, "physical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "physical_critical_strike_base": 390, "physical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "physical_critical_strike_base": 585, "physical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "physical_critical_strike_base": 780, "physical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "physical_critical_strike_base": 975, "physical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "physical_critical_strike_base": 1170, "physical_critical_power_base": 2340}}}}, "physical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"magical_overcome_base": 98, "physical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_overcome_base": 195, "physical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_overcome_base": 293, "physical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_overcome_base": 390, "physical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_overcome_base": 488, "physical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_overcome_base": 585, "physical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}}}, "magical_critical_strike_base": {"magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_attack_power_base": 105, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_attack_power_base": 210, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_attack_power_base": 314, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_attack_power_base": 419, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_attack_power_base": 524, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_attack_power_base": 629, "magical_critical_power_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}, "magical_critical_power_base": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_overcome_base": 195, "magical_critical_power_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_overcome_base": 390, "magical_critical_power_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_overcome_base": 585, "magical_critical_power_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_overcome_base": 780, "magical_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_overcome_base": 975, "magical_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_overcome_base": 1170, "magical_critical_power_base": 2340}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_critical_power_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_critical_power_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_critical_power_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_critical_power_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_critical_power_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_critical_power_base": 1170, "magical_attack_power_base": 1257}}}, "magical_overcome_base": {"1": {"level": 1, "attr": {"magical_critical_strike_base": 98, "magical_critical_power_base": 195, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_strike_base": 195, "magical_critical_power_base": 390, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_strike_base": 293, "magical_critical_power_base": 585, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_strike_base": 390, "magical_critical_power_base": 780, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_strike_base": 488, "magical_critical_power_base": 975, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_strike_base": 585, "magical_critical_power_base": 1170, "magical_overcome_base": 2340}}}}}, "magical_critical_power_base": {"magical_attack_power_base": {"magical_overcome_base": {"1": {"level": 1, "attr": {"magical_critical_power_base": 98, "magical_attack_power_base": 105, "magical_overcome_base": 390}}, "2": {"level": 2, "attr": {"magical_critical_power_base": 195, "magical_attack_power_base": 210, "magical_overcome_base": 780}}, "3": {"level": 3, "attr": {"magical_critical_power_base": 293, "magical_attack_power_base": 314, "magical_overcome_base": 1170}}, "4": {"level": 4, "attr": {"magical_critical_power_base": 390, "magical_attack_power_base": 419, "magical_overcome_base": 1560}}, "5": {"level": 5, "attr": {"magical_critical_power_base": 488, "magical_attack_power_base": 524, "magical_overcome_base": 1950}}, "6": {"level": 6, "attr": {"magical_critical_power_base": 585, "magical_attack_power_base": 629, "magical_overcome_base": 2340}}}}, "magical_overcome_base": {"magical_attack_power_base": {"1": {"level": 1, "attr": {"magical_critical_power_base": 98, "magical_overcome_base": 195, "magical_attack_power_base": 210}}, "2": {"level": 2, "attr": {"magical_critical_power_base": 195, "magical_overcome_base": 390, "magical_attack_power_base": 419}}, "3": {"level": 3, "attr": {"magical_critical_power_base": 293, "magical_overcome_base": 585, "magical_attack_power_base": 629}}, "4": {"level": 4, "attr": {"magical_critical_power_base": 390, "magical_overcome_base": 780, "magical_attack_power_base": 838}}, "5": {"level": 5, "attr": {"magical_critical_power_base": 488, "magical_overcome_base": 975, "magical_attack_power_base": 1048}}, "6": {"level": 6, "attr": {"magical_critical_power_base": 585, "magical_overcome_base": 1170, "magical_attack_power_base": 1257}}}}}, "all_major_base": {"all_critical_power_base": {"4": {"level": 4, "attr": {"all_major_base": 110, "all_critical_power_base": 1560}}, "5": {"level": 5, "attr": {"all_major_base": 137, "all_critical_power_base": 1950}}, "6": {"level": 6, "attr": {"all_major_base": 165, "all_critical_power_base": 2340}}}}} \ No newline at end of file diff --git a/qt/components/__init__.py b/qt/components/__init__.py deleted file mode 100644 index b484d2d4491e323e62b468c449901d02b288d716..0000000000000000000000000000000000000000 --- a/qt/components/__init__.py +++ /dev/null @@ -1,208 +0,0 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel -from PySide6.QtWidgets import QAbstractItemView, QTableWidgetItem, QHeaderView, QListView -from PySide6.QtWidgets import QComboBox, QRadioButton, QLineEdit, QSpinBox, QDoubleSpinBox, QListWidget, QTableWidget - - -class LabelWidget(QWidget): - def __init__(self, label, info: str = ""): - super().__init__() - if info: - self.label = QLabel(f"{label} - {info}") - else: - self.label = QLabel(label) - - def set_label(self, label): - self.label.setText(label) - - -class TableWithLabel(LabelWidget): - def __init__(self, label, row_count: int = 0, column_count: int = 0, headers: list = None): - super().__init__(label) - layout = QVBoxLayout() - self.setLayout(layout) - - self.table = QTableWidget() - - if row_count: - self.table.setRowCount(row_count) - if column_count: - self.table.setColumnCount(column_count) - if headers: - self.table.setColumnCount(len(headers)) - self.table.setHorizontalHeaderLabels(headers) - else: - self.table.horizontalHeader().setVisible(False) - - self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) - self.table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) - self.table.verticalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) - self.table.verticalHeader().setVisible(False) - - layout.addWidget(self.label) - layout.addWidget(self.table) - - def set_content(self, content): - self.table.setRowCount(len(content)) - - for i, row in enumerate(content): - for j, e in enumerate(row): - self.table.setItem(i, j, QTableWidgetItem(e)) - - -class ListWithLabel(LabelWidget): - def __init__(self, label, max_select: int = 4, items: list = None): - super().__init__(label) - layout = QVBoxLayout(self) - - self.max_select = max_select - - self.list = QListWidget() - self.list.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection) - self.list.setResizeMode(QListView.ResizeMode.Adjust) - - if items: - self.set_items(items) - layout.addWidget(self.label) - layout.addWidget(self.list) - - def set_items(self, items): - self.list.clear() - self.list.addItems(items) - - -class ComboWithLabel(LabelWidget): - def __init__(self, label, info: str = "", items: list = None, index=None): - super().__init__(label, info) - layout = QVBoxLayout() - self.setLayout(layout) - - self.combo_box = QComboBox() - self.items = [] - if items: - self.set_items(items) - if index: - self.combo_box.setCurrentIndex(index) - - layout.addWidget(self.label) - layout.addWidget(self.combo_box) - - layout.addStretch() - - def set_items(self, items, keep_index=False, default_index=0): - self.items = items - self.combo_box.blockSignals(True) - current_text = self.combo_box.currentText() - self.combo_box.clear() - self.combo_box.addItems(items) - self.combo_box.blockSignals(False) - if keep_index and current_text and current_text in items: - self.combo_box.setCurrentIndex(items.index(current_text)) - else: - self.combo_box.setCurrentIndex(default_index) - - -class RadioWithLabel(LabelWidget): - def __init__(self, label, text: str = None): - super().__init__(label) - layout = QVBoxLayout() - self.setLayout(layout) - - self.radio_button = QRadioButton() - if text: - self.radio_button.setText(text) - - layout.addWidget(self.label) - layout.addWidget(self.radio_button) - - layout.addStretch() - - def set_text(self, text): - self.radio_button.setText(text) - - -class SpinWithLabel(LabelWidget): - def __init__(self, label, info="", minimum=None, maximum=None, value=None): - super().__init__(label, info) - layout = QVBoxLayout() - self.setLayout(layout) - - self.spin_box = QSpinBox() - if minimum: - self.spin_box.setMinimum(minimum) - - if maximum: - self.spin_box.setMaximum(maximum + 1) - else: - self.spin_box.setMaximum(10 ** 8) - - if value: - self.spin_box.setValue(value) - - layout.addWidget(self.label) - layout.addWidget(self.spin_box) - - layout.addStretch() - - def set_value(self, value): - self.spin_box.setValue(value) - - -class DoubleSpinWithLabel(LabelWidget): - def __init__(self, label, info="", minimum=None, maximum=None, value=None): - super().__init__(label, info) - layout = QVBoxLayout() - self.setLayout(layout) - - self.spin_box = QDoubleSpinBox() - if minimum: - self.spin_box.setMinimum(minimum) - - if maximum: - self.spin_box.setMaximum(maximum + 1) - else: - self.spin_box.setMaximum(10 ** 8) - - if value: - self.spin_box.setValue(value) - - layout.addWidget(self.label) - layout.addWidget(self.spin_box) - - layout.addStretch() - - def set_value(self, value): - self.spin_box.setValue(value) - -class TextWithLabel(LabelWidget): - def __init__(self, label): - super().__init__(label) - layout = QVBoxLayout(self) - - self.text_browser = QLineEdit() - - layout.addWidget(self.label) - layout.addWidget(self.text_browser) - - layout.addStretch() - - def set_text(self, text): - self.text_browser.setText(text) - - -class LabelWithLabel(QWidget): - def __init__(self, label): - super().__init__() - layout = QHBoxLayout() - self.setLayout(layout) - - self.label = QLabel(label) - self.text = QLabel() - # self.text_browser.textChanged.connect(self.resize_height) - - layout.addWidget(self.label) - layout.addWidget(self.text) - - layout.addStretch() - - def set_text(self, text): - self.text.setText(text) diff --git a/qt/components/bonuses.py b/qt/components/bonuses.py deleted file mode 100644 index 582d1ae953d8b1af45bb195289cfd2eb7cf5377a..0000000000000000000000000000000000000000 --- a/qt/components/bonuses.py +++ /dev/null @@ -1,239 +0,0 @@ -from general.gains.team import TEAM_GAIN_LIMIT -from qt.components import ComboWithLabel, SpinWithLabel, RadioWithLabel -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QTabWidget - - -class FormationWidget(QWidget): - def __init__(self): - super().__init__() - layout = QHBoxLayout() - self.setLayout(layout) - - self.formation = ComboWithLabel("阵法") - layout.addWidget(self.formation) - self.core_rate = SpinWithLabel("四重覆盖(%)", maximum=100) - layout.addWidget(self.core_rate) - self.rate = SpinWithLabel("五重覆盖(%)", maximum=100) - layout.addWidget(self.rate) - - -class TeamGainsWidget(QWidget): - def __init__(self): - super().__init__() - layout = QVBoxLayout(self) - - self.team_gains = {} - - self.real_formulation = RadioWithLabel("开启真实团队增益模拟(仅包括存在覆盖率的角色BUFF,不包含目标和常驻BUFF)") - - layout.addWidget(self.real_formulation) - - tabs = QTabWidget() - layout.addWidget(tabs) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "七秀") - - self.team_gains["袖气"] = RadioWithLabel("袖气", "常驻") - tab_layout.addWidget(self.team_gains["袖气"], 0, 0) - - self.team_gains["左旋右转"] = { - "stack": SpinWithLabel("左旋右转", "层数", maximum=TEAM_GAIN_LIMIT["左旋右转"]["stack"]), - "rate": SpinWithLabel("左旋右转", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["左旋右转"]["stack"], 1, 0) - tab_layout.addWidget(self.team_gains["左旋右转"]["rate"], 1, 1) - self.team_gains["泠风解怀"] = { - "rate": SpinWithLabel("泠风解怀", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["泠风解怀"]["rate"], 2, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "天策") - - self.team_gains["撼如雷"] = RadioWithLabel("撼如雷", "常驻") - tab_layout.addWidget(self.team_gains["撼如雷"], 0, 0) - - self.team_gains["破风"] = { - "variety": ComboWithLabel("破风", "种类", ["", "破风", "劲风"]) - } - tab_layout.addWidget(self.team_gains["破风"]["variety"], 1, 0) - - self.team_gains["乘龙箭"] = { - "rate": SpinWithLabel("乘龙箭", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["乘龙箭"]["rate"], 2, 0) - - self.team_gains["号令三军"] = { - "stack": SpinWithLabel("号令三军", "层数", maximum=TEAM_GAIN_LIMIT["号令三军"]["stack"]), - "rate": SpinWithLabel("号令三军", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["号令三军"]["stack"], 3, 0) - tab_layout.addWidget(self.team_gains["号令三军"]["rate"], 3, 1) - - self.team_gains["激雷"] = { - "rate": SpinWithLabel("激雷", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["激雷"]["rate"], 4, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "少林") - - self.team_gains["立地成佛"] = { - "rate": SpinWithLabel("立地成佛", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["立地成佛"]["rate"], 0, 0) - - self.team_gains["舍身弘法"] = { - "stack": SpinWithLabel("舍身弘法", "层数", maximum=TEAM_GAIN_LIMIT["舍身弘法"]["stack"]), - "rate": SpinWithLabel("舍身弘法", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["舍身弘法"]["stack"], 1, 0) - tab_layout.addWidget(self.team_gains["舍身弘法"]["rate"], 1, 1) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "万花") - - self.team_gains["秋肃"] = RadioWithLabel("秋肃", "常驻") - tab_layout.addWidget(self.team_gains["秋肃"], 0, 0) - - self.team_gains["皎素"] = { - "rate": SpinWithLabel("皎素", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["皎素"]["rate"], 1, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "纯阳") - - self.team_gains["碎星辰"] = RadioWithLabel("碎星辰", "常驻") - tab_layout.addWidget(self.team_gains["碎星辰"], 0, 0) - - self.team_gains["破苍穹"] = RadioWithLabel("破苍穹", "常驻") - tab_layout.addWidget(self.team_gains["破苍穹"], 1, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "藏剑") - - self.team_gains["剑锋百锻"] = { - "rate": SpinWithLabel("剑锋百锻", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["剑锋百锻"]["rate"], 0, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "五毒") - - self.team_gains["仙王蛊鼎"] = { - "rate": SpinWithLabel("仙王蛊鼎", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["仙王蛊鼎"]["rate"], 0, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "明教") - - self.team_gains["戒火"] = RadioWithLabel("戒火", "常驻") - tab_layout.addWidget(self.team_gains["戒火"], 0, 0) - - self.team_gains["朝圣言"] = { - "stack": SpinWithLabel("朝圣言", "层数", maximum=TEAM_GAIN_LIMIT["朝圣言"]["stack"]), - "rate": SpinWithLabel("朝圣言", "覆盖(%)", maximum=100), - "variety": ComboWithLabel("朝圣言", "种类", ["", "朝圣言", "圣浴明心"]) - } - tab_layout.addWidget(self.team_gains["朝圣言"]["variety"], 1, 0) - tab_layout.addWidget(self.team_gains["朝圣言"]["stack"], 1, 1) - tab_layout.addWidget(self.team_gains["朝圣言"]["rate"], 1, 2) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "丐帮") - - self.team_gains["酒中仙"] = RadioWithLabel("酒中仙", "常驻") - tab_layout.addWidget(self.team_gains["酒中仙"], 0, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "苍云") - - self.team_gains["虚弱"] = RadioWithLabel("虚弱", "常驻") - tab_layout.addWidget(self.team_gains["虚弱"], 0, 0) - - self.team_gains["寒啸千军"] = { - "rate": SpinWithLabel("寒啸千军", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["寒啸千军"]["rate"], 1, 0) - - self.team_gains["振奋"] = { - "stack": SpinWithLabel("振奋", "层数", maximum=TEAM_GAIN_LIMIT["振奋"]["stack"]), - "rate": SpinWithLabel("振奋", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["振奋"]["stack"], 2, 0) - tab_layout.addWidget(self.team_gains["振奋"]["rate"], 2, 1) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "长歌") - - self.team_gains["庄周梦"] = { - "stack": SpinWithLabel("庄周梦", "层数", maximum=TEAM_GAIN_LIMIT["庄周梦"]["stack"]), - "rate": SpinWithLabel("庄周梦", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["庄周梦"]["stack"], 0, 0) - tab_layout.addWidget(self.team_gains["庄周梦"]["rate"], 0, 1) - self.team_gains["弄梅"] = { - "rate": SpinWithLabel("弄梅", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["弄梅"]["rate"], 1, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "霸刀") - - self.team_gains["疏狂"] = { - "rate": SpinWithLabel("疏狂", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["疏狂"]["rate"], 0, 0) - - tab = QWidget() - tab_layout = QGridLayout(tab) - tabs.addTab(tab, "药宗") - - self.team_gains["配伍"] = { - "rate": SpinWithLabel("配伍", "覆盖(%)", maximum=100) - } - tab_layout.addWidget(self.team_gains["配伍"]["rate"], 0, 0) - - # self.team_gains["飘黄"] = { - # "rate": SpinWithLabel("飘黄", "覆盖", maximum=100) - # } - # tab_layout.addWidget(self.team_gains["飘黄"]["rate"], 1, 0) - - layout.addStretch() - - def __getitem__(self, item): - return self.team_gains[item] - - def items(self): - return self.team_gains.items() - - -class BonusesWidget(QWidget): - def __init__(self): - super().__init__() - layout = QVBoxLayout() - self.setLayout(layout) - - self.tab = QTabWidget() - layout.addWidget(self.tab) - self.formation = FormationWidget() - self.tab.addTab(self.formation, "阵法") - self.team_gains = TeamGainsWidget() - self.tab.addTab(self.team_gains, "团队增益") - - layout.addStretch() diff --git a/qt/components/config.py b/qt/components/config.py deleted file mode 100644 index c04318173ac4fd1497602642575d508df4e70e3a..0000000000000000000000000000000000000000 --- a/qt/components/config.py +++ /dev/null @@ -1,26 +0,0 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton - -from qt.components import ComboWithLabel, TextWithLabel - - -class ConfigWidget(QWidget): - def __init__(self): - super().__init__() - layout = QVBoxLayout(self) - top_layout = QHBoxLayout() - layout.addLayout(top_layout) - bottom_layout = QHBoxLayout() - layout.addLayout(bottom_layout) - - self.config_select = ComboWithLabel("选择预设方案") - top_layout.addWidget(self.config_select, 1) - self.config_category = ComboWithLabel("选择导入类别", items=["全部", "装备", "消耗品", "增益"]) - top_layout.addWidget(self.config_category, 1) - self.load_config = QPushButton("导入预设方案") - bottom_layout.addWidget(self.load_config, 2) - self.config_name = TextWithLabel("设置预设方案") - top_layout.addWidget(self.config_name, 2) - self.save_config = QPushButton("保存预设方案") - bottom_layout.addWidget(self.save_config, 1) - self.delete_config = QPushButton("删除预设方案") - bottom_layout.addWidget(self.delete_config, 1) diff --git a/qt/components/consumables.py b/qt/components/consumables.py deleted file mode 100644 index 3dcbd03ef369d29a4f7c986c15812c39a03a76c6..0000000000000000000000000000000000000000 --- a/qt/components/consumables.py +++ /dev/null @@ -1,54 +0,0 @@ -from general.consumables import BOILED_FISH, GUILD_FOOD, GUILD_SPREAD -from qt.components import ComboWithLabel, RadioWithLabel -from PySide6.QtWidgets import QWidget, QGridLayout - - -class ConsumablesWidget(QWidget): - def __init__(self): - super().__init__() - layout = QGridLayout() - self.setLayout(layout) - - self.consumables = {} - - self.major_food = ComboWithLabel("辅助类食品") - self.consumables['major_food'] = self.major_food - layout.addWidget(self.major_food, 0, 0) - self.minor_food = ComboWithLabel("增强类食品") - self.consumables['minor_food'] = self.minor_food - layout.addWidget(self.minor_food, 0, 1) - self.major_potion = ComboWithLabel("辅助类药品") - self.consumables['major_potion'] = self.major_potion - layout.addWidget(self.major_potion, 0, 2) - self.minor_potion = ComboWithLabel("增强类药品") - self.consumables['minor_potion'] = self.minor_potion - layout.addWidget(self.minor_potion, 0, 3) - - self.weapon_enchant = ComboWithLabel("武器磨石") - self.consumables['weapon_enchant'] = self.weapon_enchant - layout.addWidget(self.weapon_enchant, 1, 0) - self.home_snack = ComboWithLabel("家园食物") - self.consumables['home_snack'] = self.home_snack - layout.addWidget(self.home_snack, 1, 1) - self.home_wine = ComboWithLabel("家园酒") - self.consumables['home_wine'] = self.home_wine - layout.addWidget(self.home_wine, 1, 2) - - self.guild_spread = RadioWithLabel("同泽宴", GUILD_SPREAD) - self.consumables['guild_spread'] = self.guild_spread - layout.addWidget(self.guild_spread, 2, 0) - self.guild_food = RadioWithLabel("蒸鱼餐盘", GUILD_FOOD) - self.consumables['guild_food'] = self.guild_food - layout.addWidget(self.guild_food, 2, 1) - self.spread = ComboWithLabel("宴席") - self.consumables['spread'] = self.spread - layout.addWidget(self.spread, 2, 2) - self.boiled_fish = ComboWithLabel("水煮鱼", items=[""] + BOILED_FISH[""]) - self.consumables['boiled_fish'] = self.boiled_fish - layout.addWidget(self.boiled_fish, 2, 3) - - def __getitem__(self, item) -> [ComboWithLabel, RadioWithLabel]: - return self.consumables[item] - - def items(self): - return self.consumables.items() diff --git a/qt/components/dashboard.py b/qt/components/dashboard.py deleted file mode 100644 index 6b0fb78108a2e7dafe5dae7e887b9704c9fc2523..0000000000000000000000000000000000000000 --- a/qt/components/dashboard.py +++ /dev/null @@ -1,82 +0,0 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTabWidget - -from qt.components import ComboWithLabel, DoubleSpinWithLabel, LabelWithLabel, TableWithLabel -from base.constant import SHIELD_BASE_MAP - - -class DetailWidget(QWidget): - def __init__(self): - super().__init__() - layout = QVBoxLayout(self) - self.details = {} - self.skill_combo = ComboWithLabel("选择技能", info="技能名字#技能ID-技能等级-技能层数") - layout.addWidget(self.skill_combo) - self.status_combo = ComboWithLabel("选择增益", info="增益名字#增益ID-增益等级-增益层数") - layout.addWidget(self.status_combo) - detail_table = QWidget() - detail_table_layout = QHBoxLayout(detail_table) - self.damage_detail = TableWithLabel("伤害细节", column_count=2) - detail_table_layout.addWidget(self.damage_detail) - self.gradient_detail = TableWithLabel("属性收益", column_count=2) - detail_table_layout.addWidget(self.gradient_detail) - layout.addWidget(detail_table) - - layout.addStretch() - - -class DashboardWidget(QWidget): - def __init__(self): - super().__init__() - layout = QVBoxLayout(self) - - top_layout = QHBoxLayout() - layout.addLayout(top_layout) - - self.target_select = ComboWithLabel("选择目标") - top_layout.addWidget(self.target_select) - self.target_level = ComboWithLabel("目标等级", items=[str(level) for level in SHIELD_BASE_MAP]) - top_layout.addWidget(self.target_level) - self.duration = DoubleSpinWithLabel("战斗时长", maximum=3600, value=180) - top_layout.addWidget(self.duration) - - mid_layout = QHBoxLayout() - layout.addLayout(mid_layout) - self.formulate_button = QPushButton(text="开始模拟!") - mid_layout.addWidget(self.formulate_button) - self.save_button = QPushButton(text="保存JSON") - mid_layout.addWidget(self.save_button) - - bottom_layout = QHBoxLayout() - layout.addLayout(bottom_layout) - - tab = QTabWidget() - bottom_layout.addWidget(tab, 2) - result_layout = QVBoxLayout() - bottom_layout.addLayout(result_layout, 1) - - attribute = QWidget() - attribute_layout = QHBoxLayout(attribute) - tab.addTab(attribute, "属性") - - self.init_attribute = TableWithLabel("增益前属性", column_count=2) - attribute_layout.addWidget(self.init_attribute) - self.final_attribute = TableWithLabel("增益后属性", column_count=2) - attribute_layout.addWidget(self.final_attribute) - - self.detail_widget = DetailWidget() - tab.addTab(self.detail_widget, "伤害总结") - - self.summary = TableWithLabel("伤害统计", headers=["技能/次数", "命中/%", "会心/%", "伤害/%"]) - - tab.addTab(self.summary, "战斗总结") - - self.dps = LabelWithLabel("每秒伤害") - result_layout.addWidget(self.dps) - - self.gradients = TableWithLabel("属性收益", column_count=2) - - result_layout.addWidget(self.gradients) - - result_layout.addStretch() - - layout.addStretch() diff --git a/qt/components/equipments.py b/qt/components/equipments.py deleted file mode 100644 index 8a7425e12b5452a77f20476c6bc94fb0591d82bf..0000000000000000000000000000000000000000 --- a/qt/components/equipments.py +++ /dev/null @@ -1,100 +0,0 @@ -import json -import os - -from qt.constant import POSITION_MAP, STONES_POSITIONS, EQUIPMENTS_DIR, ENCHANTS_DIR, STONES_DIR, MAX_STONE_ATTR -from qt.constant import EMBED_POSITIONS, MAX_EMBED_LEVEL, MAX_STONE_LEVEL, SPECIAL_ENCHANT_POSITIONS -from qt.components import ComboWithLabel, RadioWithLabel, TableWithLabel -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QTabWidget - - -class EquipmentWidget(QWidget): - def __init__(self, label): - super().__init__() - self.position = POSITION_MAP[label] - layout = QVBoxLayout(self) - - self.equipment_json = json.load(open(os.path.join(EQUIPMENTS_DIR, self.position), encoding="utf-8")) - self.equipment_mapping = {v['id']: k for k, v in self.equipment_json.items()} - self.enchant_json = json.load(open(os.path.join(ENCHANTS_DIR, self.position), encoding="utf-8")) - self.enchant_mapping = {v['id']: k for k, v in self.enchant_json.items()} - self.equipment = ComboWithLabel("装备") - layout.addWidget(self.equipment) - - self.detail_widget = QWidget() - detail_layout = QHBoxLayout(self.detail_widget) - layout.addWidget(self.detail_widget) - self.detail_widget.hide() - layout.addStretch() - - input_layout = QGridLayout() - detail_layout.addLayout(input_layout) - - if not self.enchant_json: - self.enchant = None - else: - self.enchant = ComboWithLabel("附魔") - self.enchant.set_items([""] + list(self.enchant_json)) - input_layout.addWidget(self.enchant, 0, 0, 1, 2) - - if self.position not in SPECIAL_ENCHANT_POSITIONS: - self.special_enchant = None - else: - self.special_enchant = RadioWithLabel("大附魔") - input_layout.addWidget(self.special_enchant, 0, 2, 1, 2) - - self.strength_level = ComboWithLabel("精炼等级") - input_layout.addWidget(self.strength_level, 1, 0) - - self.embed_levels = [] - for i in range(EMBED_POSITIONS[self.position]): - embed_level = ComboWithLabel( - f"镶嵌等级-{i + 1}", items=[str(i) for i in range(MAX_EMBED_LEVEL + 1)] - ) - embed_level.combo_box.setCurrentIndex(MAX_EMBED_LEVEL) - self.embed_levels.append(embed_level) - input_layout.addWidget(embed_level, 1, i + 1) - - if self.position not in STONES_POSITIONS: - self.stones_json = None - self.stone_level = None - self.stone_attrs = None - else: - self.stones_json = json.load(open(STONES_DIR, encoding="utf-8")) - - self.stone_level = ComboWithLabel( - "五彩石等级", items=[str(i) for i in range(MAX_STONE_LEVEL + 1)] - ) - self.stone_attrs = [] - input_layout.addWidget(self.stone_level, 2, 0) - for i in range(MAX_STONE_ATTR): - stone_attr = ComboWithLabel(f"五彩石属性-{i + 1}") - self.stone_attrs.append(stone_attr) - input_layout.addWidget(stone_attr, 2, i + 1) - self.detail_widget.hide() - - output_layout = QVBoxLayout() - detail_layout.addLayout(output_layout) - self.base_attr = TableWithLabel("基本属性", column_count=2) - output_layout.addWidget(self.base_attr) - self.magic_attr = TableWithLabel("精炼属性", column_count=2) - output_layout.addWidget(self.magic_attr) - self.embed_attr = TableWithLabel("镶嵌属性", column_count=2) - output_layout.addWidget(self.embed_attr) - - -class EquipmentsWidget(QTabWidget): - def __init__(self): - super().__init__() - self.equipments = {} - for label in POSITION_MAP: - self.equipments[label] = EquipmentWidget(label) - self.addTab(self.equipments[label], label) - - def __getitem__(self, item) -> EquipmentWidget: - return self.equipments[item] - - def items(self): - return self.equipments.items() - - def values(self): - return self.equipments.values() diff --git a/qt/components/recipes.py b/qt/components/recipes.py deleted file mode 100644 index fe90e5b524ae919073340a4c8300a41a16731991..0000000000000000000000000000000000000000 --- a/qt/components/recipes.py +++ /dev/null @@ -1,27 +0,0 @@ -from qt.components import ListWithLabel -from PySide6.QtWidgets import QWidget, QGridLayout - -from qt.constant import MAX_RECIPE_SKILLS - - -class RecipesWidget(QWidget): - def __init__(self): - super().__init__() - layout = QGridLayout() - self.setLayout(layout) - - self.recipes = [] - - columns = 6 - rows = MAX_RECIPE_SKILLS // columns - for i in range(rows): - for j in range(columns): - recipe = ListWithLabel("") - self.recipes.append(recipe) - layout.addWidget(recipe, i, j) - - def __getitem__(self, item) -> ListWithLabel: - return self.recipes[item] - - def values(self) -> list[ListWithLabel]: - return self.recipes diff --git a/qt/components/talents.py b/qt/components/talents.py deleted file mode 100644 index 56e9776572d5f135927bae32dba769bbb371450a..0000000000000000000000000000000000000000 --- a/qt/components/talents.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import List - -from qt.components import ComboWithLabel -from PySide6.QtWidgets import QWidget, QGridLayout - -from qt.constant import MAX_TALENTS - - -class TalentsWidget(QWidget): - def __init__(self): - super().__init__() - layout = QGridLayout() - self.setLayout(layout) - - self.talents = [] - - rows = 2 - columns = MAX_TALENTS // rows - - for i in range(rows): - for j in range(columns): - talent = ComboWithLabel(f"奇穴第{i * columns + j + 1}层") - self.talents.append(talent) - layout.addWidget(talent, i, j) - - def __getitem__(self, item) -> ComboWithLabel: - return self.talents[item] - - def values(self) -> List[ComboWithLabel]: - return self.talents diff --git a/qt/components/top.py b/qt/components/top.py deleted file mode 100644 index 5118b18d8b47217eb302fbb43a55a8a26ce10e26..0000000000000000000000000000000000000000 --- a/qt/components/top.py +++ /dev/null @@ -1,18 +0,0 @@ -from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton -from PySide6.QtCore import Qt - -from qt.components import ComboWithLabel - - -class TopWidget(QWidget): - def __init__(self): - super().__init__() - layout = QHBoxLayout() - self.setLayout(layout) - - self.upload_button = QPushButton("请上传JCL") - layout.addWidget(self.upload_button) - self.player_select = ComboWithLabel("请选择角色") - layout.addWidget(self.player_select) - self.player_select.hide() - layout.setAlignment(Qt.AlignmentFlag.AlignTop) diff --git a/qt/scripts/bonuses.py b/qt/scripts/bonuses.py deleted file mode 100644 index 145af947741de67bd819bceadc1cc536990cfc9d..0000000000000000000000000000000000000000 --- a/qt/scripts/bonuses.py +++ /dev/null @@ -1,93 +0,0 @@ -from general.gains.formation import FORMATION_GAINS -from general.gains.team import TEAM_GAINS, RealTeamGain - -from qt.components import RadioWithLabel, ComboWithLabel, SpinWithLabel -from qt.components.bonuses import BonusesWidget -from utils.parser import Parser - - -class Bonuses(dict): - @property - def gains(self): - gains = list(self.values()) - if "秋肃" in self and "戒火" in self: - gains.remove(self["戒火"]) - - return gains - - -def bonuses_script(parser: Parser, bonuses_widget: BonusesWidget): - bonuses = Bonuses() - - def formation_update(_): - widget = bonuses_widget.formation - formation = widget.formation.combo_box.currentText() - core_rate = widget.core_rate.spin_box.value() - formation_rate = widget.rate.spin_box.value() - - if formation == parser.current_school.formation: - widget.core_rate.show() - else: - core_rate = 0 - widget.core_rate.hide() - - if formation: - bonuses['formation'] = FORMATION_GAINS[formation](formation_rate, core_rate) - else: - bonuses.pop("formation", None) - - bonuses_widget.formation.formation.combo_box.currentTextChanged.connect(formation_update) - bonuses_widget.formation.core_rate.spin_box.valueChanged.connect(formation_update) - bonuses_widget.formation.rate.spin_box.valueChanged.connect(formation_update) - - def real_team_gain(): - widget = bonuses_widget.team_gains.real_formulation - if widget.radio_button.isChecked(): - bonuses[None] = RealTeamGain() - else: - bonuses.pop(None, None) - bonuses_widget.team_gains.real_formulation.radio_button.clicked.connect(real_team_gain) - - def radio_update(label): - widget = bonuses_widget.team_gains[label] - - def inner(): - if widget.radio_button.isChecked(): - bonuses[label] = TEAM_GAINS[label]() - else: - bonuses.pop(label, None) - - return inner - - def combine_update(label): - widgets = bonuses_widget.team_gains[label] - - def inner(_): - kwargs = {} - for attr, widget in widgets.items(): - if isinstance(widget, ComboWithLabel): - kwargs[attr] = widget.combo_box.currentText() - elif isinstance(widget, SpinWithLabel): - kwargs[attr] = widget.spin_box.value() - if all(kwargs.values()): - bonuses[label] = TEAM_GAINS[label](**kwargs) - else: - bonuses.pop(label, None) - - return inner - - for bonus_label, bonus_widget in bonuses_widget.team_gains.items(): - if isinstance(bonus_widget, RadioWithLabel): - bonus_widget.radio_button.clicked.connect(radio_update(bonus_label)) - elif isinstance(bonus_widget, dict): - for sub_bonus_widget in bonus_widget.values(): - if isinstance(sub_bonus_widget, ComboWithLabel): - sub_bonus_widget.combo_box.currentTextChanged.connect(combine_update(bonus_label)) - elif isinstance(sub_bonus_widget, SpinWithLabel): - sub_bonus_widget.spin_box.valueChanged.connect(combine_update(bonus_label)) - else: - raise TypeError - else: - raise TypeError - - return bonuses diff --git a/qt/scripts/config.py b/qt/scripts/config.py deleted file mode 100644 index 68935b5bca829bc2a71c75eec5ede06a38e8fd9a..0000000000000000000000000000000000000000 --- a/qt/scripts/config.py +++ /dev/null @@ -1,192 +0,0 @@ -import json -import os - -from qt.components import ComboWithLabel, RadioWithLabel, SpinWithLabel -from qt.components.bonuses import BonusesWidget -from qt.components.config import ConfigWidget -from qt.components.equipments import EquipmentsWidget -from qt.components.consumables import ConsumablesWidget -from qt.components.recipes import RecipesWidget -from qt.components.talents import TalentsWidget -from qt.components.top import TopWidget -from utils.parser import Parser - -if not os.path.exists("config"): - CONFIG = {} -else: - CONFIG = json.load(open("config", encoding="utf-8")) - - -def config_script( - parser: Parser, config_widget: ConfigWidget, - talent_widget: TalentsWidget, recipe_widget: RecipesWidget, - equipments_widget: EquipmentsWidget, consumable_widget: ConsumablesWidget, bonus_widget: BonusesWidget): - def load_equipments(config): - if not config: - return - - for label, equipment in equipments_widget.items(): - if 'equipment' not in config[label]: - continue - else: - index = equipment.equipment.combo_box.findText(config[label]['equipment']) - equipment.equipment.combo_box.setCurrentIndex(index) - - equipment.strength_level.combo_box.setCurrentIndex(config[label]['strength_level']) - if 'enchant' in config[label]: - index = equipment.enchant.combo_box.findText(config[label]['enchant']) - equipment.enchant.combo_box.setCurrentIndex(index) - if 'special_enchant' in config[label]: - if equipment.special_enchant.radio_button.isChecked() != config[label]['special_enchant']: - equipment.special_enchant.radio_button.click() - if 'embed_levels' in config[label]: - for i, embed_level in enumerate(equipment.embed_levels): - embed_level.combo_box.setCurrentIndex(config[label]['embed_levels'][i]) - if 'stone_level' in config[label]: - equipment.stone_level.combo_box.setCurrentIndex(config[label]['stone_level']) - if 'stone_attrs' in config[label]: - for i, stone_attr in enumerate(equipment.stone_attrs): - index = equipment.stone_attrs[i].combo_box.findText(config[label]['stone_attrs'][i]) - stone_attr.combo_box.setCurrentIndex(index) - - def load_consumables(config): - for label, consumable in consumable_widget.items(): - if isinstance(consumable, ComboWithLabel): - consumable.combo_box.setCurrentText(config[label]) - elif isinstance(consumable, RadioWithLabel): - if consumable.radio_button.isChecked() != config[label]: - consumable.radio_button.click() - - def load_bonuses(config): - bonus_widget.formation.formation.combo_box.setCurrentText(config['formation']['formation']) - bonus_widget.formation.core_rate.spin_box.setValue(config['formation']['core_rate']) - bonus_widget.formation.rate.spin_box.setValue(config['formation']['rate']) - for label, value in config['team_gains'].items(): - team_gain = bonus_widget.team_gains[label] - if isinstance(value, bool): - if team_gain.radio_button.isChecked() != value: - team_gain.radio_button.click() - elif isinstance(value, dict): - for sub_label, sub_value in value.items(): - sub_team_gain = team_gain[sub_label] - if isinstance(sub_team_gain, ComboWithLabel): - sub_team_gain.combo_box.setCurrentText(sub_value) - elif isinstance(sub_team_gain, SpinWithLabel): - sub_team_gain.spin_box.setValue(config['team_gains'][label][sub_label]) - - def load_recipes(config): - for i, recipes in enumerate(config): - for selected_item in recipe_widget.recipes[i].list.selectedItems(): - selected_item.setSelected(False) - - def load_config(): - config_name = config_widget.config_select.combo_box.currentText() - config = CONFIG.get(parser.current_school.school, {}).get(config_name, {}) - if not config: - return - category = config_widget.config_category.combo_box.currentText() - if category == "全部": - load_equipments(config.get("equipments")) - load_consumables(config.get("consumables")) - load_bonuses(config.get("bonuses")) - elif category == "装备": - load_equipments(config.get("equipments")) - elif category == "消耗品": - load_consumables(config.get("consumables")) - elif category == "增益": - load_bonuses(config.get("bonuses")) - - config_widget.config_name.text_browser.setText(config_name) - - config_widget.load_config.clicked.connect(load_config) - - def save_equipments(config): - for label, equipment in equipments_widget.items(): - config[label] = {} - if not (text := equipment.equipment.combo_box.currentText()): - continue - else: - config[label]['equipment'] = text - config[label]['strength_level'] = equipment.strength_level.combo_box.currentIndex() - if equipment.enchant: - config[label]['enchant'] = equipment.enchant.combo_box.currentText() - if equipment.special_enchant: - config[label]['special_enchant'] = equipment.special_enchant.radio_button.isChecked() - if equipment.embed_levels: - config[label]['embed_levels'] = [ - embed_level.combo_box.currentIndex() for embed_level in equipment.embed_levels - ] - if equipment.stone_level: - config[label]['stone_level'] = equipment.stone_level.combo_box.currentIndex() - if equipment.stone_attrs: - config[label]['stone_attrs'] = [ - stone_attr.combo_box.currentText() for stone_attr in equipment.stone_attrs - ] - - def save_consumables(config): - for label, consumable in consumable_widget.items(): - if isinstance(consumable, ComboWithLabel): - config[label] = consumable.combo_box.currentText() - elif isinstance(consumable, RadioWithLabel): - config[label] = consumable.radio_button.isChecked() - - def save_bonuses(config): - config['formation']['formation'] = bonus_widget.formation.formation.combo_box.currentText() - config['formation']['core_rate'] = bonus_widget.formation.core_rate.spin_box.value() - config['formation']['rate'] = bonus_widget.formation.rate.spin_box.value() - for label, team_gain in bonus_widget.team_gains.items(): - if isinstance(team_gain, RadioWithLabel): - config['team_gains'][label] = team_gain.radio_button.isChecked() - elif isinstance(team_gain, dict): - config['team_gains'][label] = {} - for sub_label, sub_team_gain in team_gain.items(): - if isinstance(sub_team_gain, ComboWithLabel): - config['team_gains'][label][sub_label] = sub_team_gain.combo_box.currentText() - elif isinstance(sub_team_gain, SpinWithLabel): - config['team_gains'][label][sub_label] = sub_team_gain.spin_box.value() - - def save_recipes(config): - for recipe in recipe_widget.values(): - if selected_items := recipe.list.selectedItems(): - config.append(selected_items) - - def save_config(): - config_name = config_widget.config_name.text_browser.text() - school = parser.current_school.school - if school not in CONFIG: - CONFIG[school] = {} - if config_name not in CONFIG[school]: - CONFIG[school][config_name] = { - "equipments": {}, - "consumables": {}, - "bonuses": {"formation": {}, "team_gains": {}}, - "talents": [], - "recipes": [] - } - - save_equipments(CONFIG[school][config_name]['equipments']) - save_consumables(CONFIG[school][config_name]['consumables']) - save_bonuses(CONFIG[school][config_name]['bonuses']) - # save_recipes(CONFIG[parser.school.school][config_name]['recipes']) - json.dump(CONFIG, open("config", "w", encoding="utf-8"), ensure_ascii=False) - - config_widget.config_select.set_items( - list(CONFIG.get(school, {})), keep_index=True, default_index=-1 - ) - - config_widget.save_config.clicked.connect(save_config) - - def delete_config(): - config_name = config_widget.config_name.text_browser.text() - school = parser.current_school.school - if config_name not in CONFIG.get(school, {}): - return - - CONFIG[school].pop(config_name) - - json.dump(CONFIG, open("config", "w", encoding="utf-8"), ensure_ascii=False) - - config_widget.config_select.set_items(list(CONFIG.get(school, {})), default_index=-1) - config_widget.config_name.text_browser.clear() - - config_widget.delete_config.clicked.connect(delete_config) diff --git a/qt/scripts/consumables.py b/qt/scripts/consumables.py deleted file mode 100644 index fad70703691c8e141a932fe92392114e419c21d2..0000000000000000000000000000000000000000 --- a/qt/scripts/consumables.py +++ /dev/null @@ -1,52 +0,0 @@ -from qt.components import ComboWithLabel, RadioWithLabel -from qt.components.consumables import ConsumablesWidget - -from general.consumables import CONSUMABLES - - -class Consumables(dict): - @property - def attrs(self): - final_attrs = {} - for consumable in self.values(): - for attr, value in consumable.items(): - if attr not in final_attrs: - final_attrs[attr] = 0 - final_attrs[attr] += value - return final_attrs - - -def consumables_script(consumables_widget: ConsumablesWidget): - consumables = Consumables() - - def consumable_combo_update(label): - widget = consumables_widget[label] - - def inner(index): - consumable = widget.combo_box.currentText() - if consumable: - consumables[label] = CONSUMABLES[consumable] - else: - consumables[label] = {} - - return inner - - def consumable_radio_update(label): - widget = consumables_widget[label] - - def inner(): - if widget.radio_button.isChecked(): - consumables[label] = CONSUMABLES[label] - else: - consumables[label] = {} - - return inner - - for consumable_label, consumable_widget in consumables_widget.items(): - - if isinstance(consumable_widget, ComboWithLabel): - consumable_widget.combo_box.currentTextChanged.connect(consumable_combo_update(consumable_label)) - elif isinstance(consumable_widget, RadioWithLabel): - consumable_widget.radio_button.clicked.connect(consumable_radio_update(consumable_label)) - - return consumables diff --git a/qt/scripts/dashboard.py b/qt/scripts/dashboard.py deleted file mode 100644 index df5630e11681d3a6293c4fe966e6318e1d5c8fcd..0000000000000000000000000000000000000000 --- a/qt/scripts/dashboard.py +++ /dev/null @@ -1,136 +0,0 @@ -import json -from typing import Dict - -from qt.components.dashboard import DashboardWidget -from qt.components.top import TopWidget -from qt.constant import ATTR_TYPE_TRANSLATE -from qt.scripts.bonuses import Bonuses -from qt.scripts.consumables import Consumables -from qt.scripts.top import Parser -from qt.scripts.equipments import Equipments -from qt.scripts.recipes import Recipes -from qt.scripts.talents import Talents -from utils.analyzer import analyze_details, Detail -from utils.io import serialize - - -def summary_content(summary: Dict[str, Detail], total_damage): - content = [] - for skill in sorted(summary, key=lambda x: summary[x].expected_damage, reverse=True): - detail = summary[skill] - critical = round(detail.critical_count, 2) - critical_rate = round(detail.critical_count / detail.count * 100, 2) - hit = round(detail.count - critical, 2) - hit_rate = round(100 - critical_rate, 2) - damage = round(detail.expected_damage, 2) - damage_rate = round(damage / total_damage * 100, 2) - content.append( - [f"{skill}/{detail.count}", - f"{hit}/{hit_rate}%", f"{critical}/{critical_rate}%", f"{damage}/{damage_rate}%"] - ) - return content - - -def detail_content(detail: Detail): - damage_content = [ - ["命中伤害", f"{round(detail.damage)}"], - ["会心伤害", f"{round(detail.critical_damage)}"], - ["期望伤害", f"{round(detail.expected_damage)}"], - ["期望会心", f"{round(detail.critical_strike * 100, 2)}%"], - ["实际会心", f"{round(detail.actual_critical_strike * 100, 2)}%"], - ["数量", f"{detail.count}"] - ] - gradient_content = [ - [ATTR_TYPE_TRANSLATE[k], f"{round(v / detail.expected_damage * 100, 2)}%"] - for k, v in detail.gradients.items() - ] - - return damage_content, gradient_content - - -def dashboard_script(parser: Parser, - dashboard_widget: DashboardWidget, talents: Talents, recipes: Recipes, - equipments: Equipments, consumables: Consumables, bonuses: Bonuses): - def formulate(): - target_name = dashboard_widget.target_select.combo_box.currentText() - target_id = parser.name2id.get(target_name, 0) - parser.current_target = target_id - record = parser.current_records - school = parser.current_school - - attribute = school.attribute() - attribute.target_level = int(dashboard_widget.target_level.combo_box.currentText()) - for attr, value in equipments.attrs.items(): - setattr(attribute, attr, getattr(attribute, attr) + value) - - dashboard_widget.init_attribute.set_content(school.attr_content(attribute)) - for attr, value in consumables.attrs.items(): - setattr(attribute, attr, getattr(attribute, attr) + value) - - equipment_gains = [school.gains[gain] for gain in equipments.gains] - talent_gains = [school.talent_gains[school.talent_encoder[talent]] for talent in talents.gains] - recipe_gains = [school.recipe_gains[skill][recipe] for skill, recipe in recipes.gains] - gains = sum([equipment_gains, talent_gains, recipe_gains, bonuses.gains], []) - - for gain in gains: - gain.add(attribute, school.skills, school.buffs) - - duration = dashboard_widget.duration.spin_box.value() - dashboard_widget.final_attribute.set_content(school.attr_content(attribute)) - total, summary, details = analyze_details(record, duration, attribute, school) - - for gain in gains: - gain.sub(attribute, school.skills, school.buffs) - - dashboard_widget.dps.set_text(str(round(total.expected_damage / duration))) - - dashboard_widget.gradients.set_content( - [[ATTR_TYPE_TRANSLATE[k], f"{round(v / total.expected_damage * 100, 2)}%"] - for k, v in total.gradients.items()] - ) - - dashboard_widget.detail_widget.details = details - set_skills() - - dashboard_widget.summary.set_content(summary_content(summary, total.expected_damage)) - - dashboard_widget.formulate_button.clicked.connect(formulate) - - def save_json(): - target_name = dashboard_widget.target_select.combo_box.currentText() - target_id = parser.name2id.get(target_name, 0) - parser.current_target = target_id - record = parser.current_records - duration = dashboard_widget.duration.spin_box.value() - json.dump(serialize(record, duration), open(parser.file_name.strip(".jcl") + ".json", "w", encoding="utf-8")) - - dashboard_widget.save_button.clicked.connect(save_json) - - def set_skills(): - detail_widget = dashboard_widget.detail_widget - detail_widget.skill_combo.set_items(list(detail_widget.details), keep_index=True, default_index=-1) - set_status(None) - - def set_status(_): - detail_widget = dashboard_widget.detail_widget - skill = detail_widget.skill_combo.combo_box.currentText() - detail_widget.status_combo.set_items( - list(detail_widget.details.get(skill, {})), keep_index=True, default_index=-1 - ) - set_detail(None) - - dashboard_widget.detail_widget.skill_combo.combo_box.currentTextChanged.connect(set_status) - - def set_detail(_): - detail_widget = dashboard_widget.detail_widget - skill = detail_widget.skill_combo.combo_box.currentText() - status = detail_widget.status_combo.combo_box.currentText() - if detail := detail_widget.details.get(skill, {}).get(status): - damage_content, gradient_content = detail_content(detail) - detail_widget.damage_detail.set_content(damage_content) - detail_widget.gradient_detail.set_content(gradient_content) - else: - detail_widget.damage_detail.table.clear() - detail_widget.gradient_detail.table.clear() - - dashboard_widget.detail_widget.status_combo.combo_box.currentTextChanged.connect(set_detail) diff --git a/qt/scripts/recipes.py b/qt/scripts/recipes.py deleted file mode 100644 index 50156e061db8dd47f2cf6adc53eac6b2a8e1e62b..0000000000000000000000000000000000000000 --- a/qt/scripts/recipes.py +++ /dev/null @@ -1,39 +0,0 @@ -from qt.components.recipes import RecipesWidget - -from qt.constant import MAX_RECIPE_SKILLS, MAX_RECIPES - - -class Recipes: - def __init__(self): - self.recipes = [[] for _ in range(MAX_RECIPE_SKILLS)] - - def __getitem__(self, item): - return self.recipes[item] - - def __setitem__(self, key, value): - self.recipes[key] = value - - @property - def gains(self): - return [recipe for recipes in self.recipes for recipe in recipes] - - -def recipes_script(recipes_widget: RecipesWidget): - recipes = Recipes() - - def recipe_update(i): - widget = recipes_widget[i] - - def inner(): - skill = widget.label.text() - if selected_items := widget.list.selectedItems(): - while len(selected_items) > MAX_RECIPES: - selected_items.pop().setSelected(False) - recipes[i] = [(skill, item.text()) for item in selected_items] - - return inner - - for n, recipe_widget in enumerate(recipes_widget.values()): - recipe_widget.list.itemSelectionChanged.connect(recipe_update(n)) - - return recipes diff --git a/qt/scripts/talents.py b/qt/scripts/talents.py deleted file mode 100644 index 93a3655ddec2731d7840fc5b7aa2d9180bc35ab5..0000000000000000000000000000000000000000 --- a/qt/scripts/talents.py +++ /dev/null @@ -1,38 +0,0 @@ -from qt.components.talents import TalentsWidget - -from qt.constant import MAX_TALENTS - - -class Talents: - def __init__(self): - self.talents = ["" for _ in range(MAX_TALENTS)] - - def __getitem__(self, item): - return self.talents[item] - - def __setitem__(self, key, value): - self.talents[key] = value - - @property - def gains(self): - return [talent for talent in self.talents if talent] - - -def talents_script(talents_widget: TalentsWidget): - talents = Talents() - - def talent_update(i): - widget = talents_widget[i] - - def inner(index): - if talent := widget.combo_box.currentText(): - talents[i] = talent - else: - talents[i] = "" - - return inner - - for n, talent_widget in enumerate(talents_widget.values()): - talent_widget.combo_box.currentIndexChanged.connect(talent_update(n)) - - return talents diff --git a/qt/scripts/top.py b/qt/scripts/top.py deleted file mode 100644 index 3795ff062682a82c0e78ea754ab3817e8ca0a944..0000000000000000000000000000000000000000 --- a/qt/scripts/top.py +++ /dev/null @@ -1,117 +0,0 @@ -from PySide6.QtWidgets import QFileDialog, QWidget - -from general.consumables import FOODS, POTIONS, WEAPON_ENCHANTS, SNACKS, WINES, SPREADS -from general.gains.formation import FORMATIONS -from qt.components.bonuses import BonusesWidget -from qt.components.config import ConfigWidget -from qt.components.consumables import ConsumablesWidget -from qt.components.dashboard import DashboardWidget -from qt.components.equipments import EquipmentsWidget -from qt.components.recipes import RecipesWidget -from qt.components.talents import TalentsWidget -from qt.components.top import TopWidget -from qt.constant import MAX_RECIPES, MAX_STONE_LEVEL -from qt.scripts.config import CONFIG -from utils.parser import Parser - - -def top_script( - top_widget: TopWidget, config_widget: ConfigWidget, bottom_widget: QWidget, - dashboard_widget: DashboardWidget, talents_widget: TalentsWidget, recipes_widget: RecipesWidget, - equipments_widget: EquipmentsWidget, consumables_widget: ConsumablesWidget, bonus_widget: BonusesWidget -): - parser = Parser() - - def upload_logs(): - file_name = QFileDialog(top_widget, "Choose File").getOpenFileName() - if not file_name[0]: - return - parser(file_name[0]) - top_widget.player_select.set_items( - [parser.id2name[player_id] for player_id in parser.players], keep_index=True, default_index=0 - ) - top_widget.player_select.show() - select_player(None) - - top_widget.upload_button.clicked.connect(upload_logs) - - def select_player(_): - player_name = top_widget.player_select.combo_box.currentText() - if not player_name: - return - player_id = parser.name2id[player_name] - parser.current_player = player_id - dashboard_widget.target_select.set_items( - [""] + [parser.id2name[target_id] for target_id in parser.current_targets], - keep_index=True, default_index=0 - ) - school = parser.players[player_id] - """ Update config """ - config_choices = list(CONFIG.get(school.school, {})) - config_widget.config_select.set_items(config_choices, default_index=-1) - """ Update dashboard """ - dashboard_widget.duration.set_value(parser.duration) - - """ Update talent options """ - for i, talent_widget in enumerate(talents_widget.values()): - talents = school.talents[i] - default_index = talents.index(parser.select_talents[player_id][i]) + 1 - talent_widget.set_items( - [""] + [school.talent_decoder[talent] for talent in talents], default_index=default_index - ) - - """ Update recipe options """ - for recipe_widget in recipes_widget.values(): - recipe_widget.list.clear() - recipe_widget.hide() - - for i, (skill, recipes) in enumerate(school.recipes.items()): - recipes_widget[i].set_label(skill) - recipes_widget[i].set_items(recipes) - for n in range(min(MAX_RECIPES, len(recipes))): - recipes_widget[i].list.item(n).setSelected(True) - recipes_widget[i].show() - - """ Update equipment options """ - for label, equipment_widget in equipments_widget.items(): - choices = [""] - for name, detail in equipment_widget.equipment_json.items(): - if detail['kind'] not in (school.kind, school.major): - continue - if detail['school'] not in ("精简", "通用", school.school): - continue - choices.append(name) - equipment_widget.equipment.set_items(choices, keep_index=True) - if equipment_widget.stones_json: - if not (current_index := equipment_widget.stone_level.combo_box.currentIndex()): - current_index = MAX_STONE_LEVEL - equipment_widget.stone_level.combo_box.setCurrentIndex(current_index) - if select_equipment := parser.select_equipments[player_id].get(label, {}): - if equipment := equipment_widget.equipment_mapping.get(select_equipment['equipment']): - if equipment in equipment_widget.equipment.items: - equipment_widget.equipment.combo_box.setCurrentText(equipment) - if enchant := equipment_widget.enchant_mapping.get(select_equipment['enchant']): - if enchant in equipment_widget.enchant.items: - equipment_widget.enchant.combo_box.setCurrentText(enchant) - equipment_widget.strength_level.combo_box.setCurrentIndex(select_equipment['strength_level']) - for i, embed_level in enumerate(select_equipment['embed_levels']): - equipment_widget.embed_levels[i].combo_box.setCurrentIndex(embed_level) - - """ Update consumable options """ - consumables_widget.major_food.set_items([""] + FOODS[school.major], keep_index=True) - consumables_widget.minor_food.set_items([""] + FOODS[school.kind] + FOODS[""], keep_index=True) - consumables_widget.major_potion.set_items([""] + POTIONS[school.major], keep_index=True) - consumables_widget.minor_potion.set_items([""] + POTIONS[school.kind] + POTIONS[""], keep_index=True) - consumables_widget.weapon_enchant.set_items([""] + WEAPON_ENCHANTS[school.kind], keep_index=True) - consumables_widget.home_snack.set_items([""] + SNACKS[school.kind] + SNACKS[""], keep_index=True) - consumables_widget.home_wine.set_items([""] + WINES[school.major] + WINES[""], keep_index=True) - consumables_widget.spread.set_items([""] + SPREADS[school.major] + SPREADS[school.kind], keep_index=True) - - """ Update bonus options """ - bonus_widget.formation.formation.set_items([""] + FORMATIONS[school.kind] + FORMATIONS[""], keep_index=True) - config_widget.show() - bottom_widget.show() - - top_widget.player_select.combo_box.currentTextChanged.connect(select_player) - - return parser diff --git a/requirements.txt b/requirements.txt index 30926a4e5d59678474f702f7256b6e62238d0513..9f66c7c903ab2c7a525c76a20e62b0280cdf0bed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -pyside6==6.7.0 \ No newline at end of file +gradio==4.31.0 \ No newline at end of file diff --git a/schools/__init__.py b/schools/__init__.py index d2bc083f65f4dd42dc4d880e243a8cdf76c30ac8..0915d895d8812cfc14cd738e0d090d4284db15ba 100644 --- a/schools/__init__.py +++ b/schools/__init__.py @@ -14,6 +14,7 @@ from schools import wu_fang, bing_xin_jue, mo_wen, zi_xia_gong, du_jing @dataclass class School: + id: int school: str major: str kind: str @@ -31,16 +32,6 @@ class School: gains: Dict[Union[Tuple[int, int], int], Gain] display_attrs: Dict[str, str] - def attr_content(self, attribute): - content = [] - for attr, name in self.display_attrs.items(): - value = getattr(attribute, attr) - if isinstance(value, int): - content.append([name, f"{value}"]) - else: - content.append([name, f"{round(value * 100, 2)}%"]) - return content - PHYSICAL_DISPLAY_ATTRS = { "base_physical_attack_power": "基础攻击", @@ -93,7 +84,7 @@ MIXING_DISPLAY_ATTRS = { SUPPORT_SCHOOL = { 10003: School( - school="少林", major="元气", kind="内功", attribute=yi_jin_jing.YiJinJing, formation="天鼓雷音阵", + id=10003, school="少林", major="元气", kind="内功", attribute=yi_jin_jing.YiJinJing, formation="天鼓雷音阵", skills=yi_jin_jing.SKILLS, buffs=yi_jin_jing.BUFFS, prepare=yi_jin_jing.prepare, talent_gains=yi_jin_jing.TALENT_GAINS, talents=yi_jin_jing.TALENTS, talent_decoder=yi_jin_jing.TALENT_DECODER, talent_encoder=yi_jin_jing.TALENT_ENCODER, @@ -101,7 +92,7 @@ SUPPORT_SCHOOL = { gains=yi_jin_jing.GAINS, display_attrs={"spunk": "元气", **MAGICAL_DISPLAY_ATTRS} ), 10014: School( - school="纯阳", major="根骨", kind="内功", attribute=zi_xia_gong.ZiXiaGong, formation="九宫八卦阵", + id=10014, school="纯阳", major="根骨", kind="内功", attribute=zi_xia_gong.ZiXiaGong, formation="九宫八卦阵", skills=zi_xia_gong.SKILLS, buffs=zi_xia_gong.BUFFS, prepare=zi_xia_gong.prepare, talent_gains=zi_xia_gong.TALENT_GAINS, talents=zi_xia_gong.TALENTS, talent_decoder=zi_xia_gong.TALENT_DECODER, talent_encoder=zi_xia_gong.TALENT_ENCODER, @@ -109,7 +100,7 @@ SUPPORT_SCHOOL = { gains=zi_xia_gong.GAINS, display_attrs={"spirit": "根骨", **MAGICAL_DISPLAY_ATTRS} ), 10015: School( - school="纯阳", major="身法", kind="外功", attribute=tai_xu_jian_yi.TaiXuJianYi, formation="北斗七星阵", + id=10015, school="纯阳", major="身法", kind="外功", attribute=tai_xu_jian_yi.TaiXuJianYi, formation="北斗七星阵", skills=tai_xu_jian_yi.SKILLS, buffs=tai_xu_jian_yi.BUFFS, prepare=tai_xu_jian_yi.prepare, talent_gains=tai_xu_jian_yi.TALENT_GAINS, talents=tai_xu_jian_yi.TALENTS, talent_decoder=tai_xu_jian_yi.TALENT_DECODER, talent_encoder=tai_xu_jian_yi.TALENT_ENCODER, @@ -117,7 +108,7 @@ SUPPORT_SCHOOL = { gains=tai_xu_jian_yi.GAINS, display_attrs={"agility": "身法", **PHYSICAL_DISPLAY_ATTRS} ), 10021: School( - school="万花", major="元气", kind="内功", attribute=hua_jian_you.HuaJianYou, formation="七绝逍遥阵", + id=10021, school="万花", major="元气", kind="内功", attribute=hua_jian_you.HuaJianYou, formation="七绝逍遥阵", skills=hua_jian_you.SKILLS, buffs=hua_jian_you.BUFFS, prepare=hua_jian_you.prepare, talent_gains=hua_jian_you.TALENT_GAINS, talents=hua_jian_you.TALENTS, talent_decoder=hua_jian_you.TALENT_DECODER, talent_encoder=hua_jian_you.TALENT_ENCODER, @@ -125,7 +116,7 @@ SUPPORT_SCHOOL = { gains=hua_jian_you.GAINS, display_attrs={"spunk": "元气", **MAGICAL_DISPLAY_ATTRS} ), 10026: School( - school="天策", major="力道", kind="外功", attribute=ao_xue_zhan_yi.AoXueZhanYi, formation="卫公折冲阵", + id=10026, school="天策", major="力道", kind="外功", attribute=ao_xue_zhan_yi.AoXueZhanYi, formation="卫公折冲阵", skills=ao_xue_zhan_yi.SKILLS, buffs=ao_xue_zhan_yi.BUFFS, prepare=ao_xue_zhan_yi.prepare, talent_gains=ao_xue_zhan_yi.TALENT_GAINS, talents=ao_xue_zhan_yi.TALENTS, talent_decoder=ao_xue_zhan_yi.TALENT_DECODER, talent_encoder=ao_xue_zhan_yi.TALENT_ENCODER, @@ -133,7 +124,7 @@ SUPPORT_SCHOOL = { gains=ao_xue_zhan_yi.GAINS, display_attrs={"strength": "力道", **PHYSICAL_DISPLAY_ATTRS} ), 10081: School( - school="七秀", major="根骨", kind="内功", attribute=bing_xin_jue.BingXinJue, formation="九音惊弦阵", + id=10081, school="七秀", major="根骨", kind="内功", attribute=bing_xin_jue.BingXinJue, formation="九音惊弦阵", skills=bing_xin_jue.SKILLS, buffs=bing_xin_jue.BUFFS, prepare=bing_xin_jue.prepare, talent_gains=bing_xin_jue.TALENT_GAINS, talents=bing_xin_jue.TALENTS, talent_decoder=bing_xin_jue.TALENT_DECODER, talent_encoder=bing_xin_jue.TALENT_ENCODER, @@ -141,7 +132,7 @@ SUPPORT_SCHOOL = { gains=bing_xin_jue.GAINS, display_attrs={"spirit": "根骨", **MAGICAL_DISPLAY_ATTRS} ), 10175: School( - school="五毒", major="根骨", kind="内功", attribute=du_jing.DuJing, formation="万蛊噬心阵", + id=10175, school="五毒", major="根骨", kind="内功", attribute=du_jing.DuJing, formation="万蛊噬心阵", skills=du_jing.SKILLS, buffs=du_jing.BUFFS, prepare=du_jing.prepare, talent_gains=du_jing.TALENT_GAINS, talents=du_jing.TALENTS, talent_decoder=du_jing.TALENT_DECODER, talent_encoder=du_jing.TALENT_ENCODER, @@ -149,7 +140,7 @@ SUPPORT_SCHOOL = { gains=du_jing.GAINS, display_attrs={"spirit": "根骨", **MAGICAL_DISPLAY_ATTRS} ), 10225: School( - school="唐门", major="元气", kind="内功", attribute=tian_luo_gui_dao.TianLuoGuiDao, formation="千机百变阵", + id=10225, school="唐门", major="元气", kind="内功", attribute=tian_luo_gui_dao.TianLuoGuiDao, formation="千机百变阵", skills=tian_luo_gui_dao.SKILLS, buffs=tian_luo_gui_dao.BUFFS, prepare=tian_luo_gui_dao.prepare, talent_gains=tian_luo_gui_dao.TALENT_GAINS, talents=tian_luo_gui_dao.TALENTS, talent_decoder=tian_luo_gui_dao.TALENT_DECODER, talent_encoder=tian_luo_gui_dao.TALENT_ENCODER, @@ -157,7 +148,7 @@ SUPPORT_SCHOOL = { gains=tian_luo_gui_dao.GAINS, display_attrs={"spunk": "元气", **MIXING_DISPLAY_ATTRS} ), 10390: School( - school="苍云", major="身法", kind="外功", attribute=fen_shan_jing.FenShanJing, formation="锋凌横绝阵", + id=10390, school="苍云", major="身法", kind="外功", attribute=fen_shan_jing.FenShanJing, formation="锋凌横绝阵", skills=fen_shan_jing.SKILLS, buffs=fen_shan_jing.BUFFS, prepare=fen_shan_jing.prepare, talent_gains=fen_shan_jing.TALENT_GAINS, talents=fen_shan_jing.TALENTS, talent_decoder=fen_shan_jing.TALENT_DECODER, talent_encoder=fen_shan_jing.TALENT_ENCODER, @@ -165,7 +156,7 @@ SUPPORT_SCHOOL = { gains=fen_shan_jing.GAINS, display_attrs={"agility": "身法", **PHYSICAL_DISPLAY_ATTRS} ), 10447: School( - school="长歌", major="根骨", kind="内功", attribute=mo_wen.MoWen, formation="万籁金弦阵", + id=10447, school="长歌", major="根骨", kind="内功", attribute=mo_wen.MoWen, formation="万籁金弦阵", skills=mo_wen.SKILLS, buffs=mo_wen.BUFFS, prepare=mo_wen.prepare, talent_gains=mo_wen.TALENT_GAINS, talents=mo_wen.TALENTS, talent_decoder=mo_wen.TALENT_DECODER, talent_encoder=mo_wen.TALENT_ENCODER, @@ -173,7 +164,7 @@ SUPPORT_SCHOOL = { gains=mo_wen.GAINS, display_attrs={"spirit": "根骨", **MAGICAL_DISPLAY_ATTRS} ), 10464: School( - school="霸刀", major="力道", kind="外功", attribute=bei_ao_jue.BeiAoJue, formation="霜岚洗锋阵", + id=10464, school="霸刀", major="力道", kind="外功", attribute=bei_ao_jue.BeiAoJue, formation="霜岚洗锋阵", skills=bei_ao_jue.SKILLS, buffs=bei_ao_jue.BUFFS, prepare=bei_ao_jue.prepare, talent_gains=bei_ao_jue.TALENT_GAINS, talents=bei_ao_jue.TALENTS, talent_decoder=bei_ao_jue.TALENT_DECODER, talent_encoder=bei_ao_jue.TALENT_ENCODER, @@ -181,7 +172,7 @@ SUPPORT_SCHOOL = { gains=bei_ao_jue.GAINS, display_attrs={"strength": "力道", **PHYSICAL_DISPLAY_ATTRS} ), 10533: School( - school="蓬莱", major="身法", kind="外功", attribute=ling_hai_jue.LingHaiJue, formation="墟海引归阵", + id=10533, school="蓬莱", major="身法", kind="外功", attribute=ling_hai_jue.LingHaiJue, formation="墟海引归阵", skills=ling_hai_jue.SKILLS, buffs=ling_hai_jue.BUFFS, prepare=ling_hai_jue.prepare, talent_gains=ling_hai_jue.TALENT_GAINS, talents=ling_hai_jue.TALENTS, talent_decoder=ling_hai_jue.TALENT_DECODER, talent_encoder=ling_hai_jue.TALENT_ENCODER, @@ -189,7 +180,7 @@ SUPPORT_SCHOOL = { gains=ling_hai_jue.GAINS, display_attrs={"agility": "身法", **PHYSICAL_DISPLAY_ATTRS} ), 10585: School( - school="凌雪", major="身法", kind="外功", attribute=yin_long_jue.YinLongJue, formation="龙皇雪风阵", + id=10585, school="凌雪", major="身法", kind="外功", attribute=yin_long_jue.YinLongJue, formation="龙皇雪风阵", skills=yin_long_jue.SKILLS, buffs=yin_long_jue.BUFFS, prepare=yin_long_jue.prepare, talent_gains=yin_long_jue.TALENT_GAINS, talents=yin_long_jue.TALENTS, talent_decoder=yin_long_jue.TALENT_DECODER, talent_encoder=yin_long_jue.TALENT_ENCODER, @@ -197,7 +188,7 @@ SUPPORT_SCHOOL = { gains=yin_long_jue.GAINS, display_attrs={"agility": "身法", **PHYSICAL_DISPLAY_ATTRS} ), 10627: School( - school="药宗", major="根骨", kind="内功", attribute=wu_fang.WuFang, formation="乱暮浊茵阵", + id=10627, school="药宗", major="根骨", kind="内功", attribute=wu_fang.WuFang, formation="乱暮浊茵阵", skills=wu_fang.SKILLS, buffs=wu_fang.BUFFS, prepare=wu_fang.prepare, talent_gains=wu_fang.TALENT_GAINS, talents=wu_fang.TALENTS, talent_decoder=wu_fang.TALENT_DECODER, talent_encoder=wu_fang.TALENT_ENCODER, @@ -205,7 +196,7 @@ SUPPORT_SCHOOL = { gains=wu_fang.GAINS, display_attrs={"spirit": "根骨", **MAGICAL_DISPLAY_ATTRS} ), 10698: School( - school="刀宗", major="力道", kind="外功", attribute=gu_feng_jue.GuFengJue, formation="横云破锋阵", + id=10698, school="刀宗", major="力道", kind="外功", attribute=gu_feng_jue.GuFengJue, formation="横云破锋阵", skills=gu_feng_jue.SKILLS, buffs=gu_feng_jue.BUFFS, prepare=gu_feng_jue.prepare, talent_gains=gu_feng_jue.TALENT_GAINS, talents=gu_feng_jue.TALENTS, talent_decoder=gu_feng_jue.TALENT_DECODER, talent_encoder=gu_feng_jue.TALENT_ENCODER, @@ -213,7 +204,7 @@ SUPPORT_SCHOOL = { gains=gu_feng_jue.GAINS, display_attrs={"strength": "力道", **PHYSICAL_DISPLAY_ATTRS} ), 10756: School( - school="万灵", major="身法", kind="外功", attribute=shan_hai_xin_jue.ShanHaiXinJue, formation="苍梧引灵阵", + id=10756, school="万灵", major="身法", kind="外功", attribute=shan_hai_xin_jue.ShanHaiXinJue, formation="苍梧引灵阵", skills=shan_hai_xin_jue.SKILLS, buffs=shan_hai_xin_jue.BUFFS, prepare=shan_hai_xin_jue.prepare, talent_gains=shan_hai_xin_jue.TALENT_GAINS, talents=shan_hai_xin_jue.TALENTS, talent_decoder=shan_hai_xin_jue.TALENT_DECODER, talent_encoder=shan_hai_xin_jue.TALENT_ENCODER, diff --git a/utils/io.py b/utils/io.py index 66f88888d193b25f8e561dc132dd9fcb5c1792b0..96339bce67d7b4ddf53737edc3de56f2a0cb7ba1 100644 --- a/utils/io.py +++ b/utils/io.py @@ -1,3 +1,4 @@ +import json from collections import defaultdict from base.constant import FRAME_PER_SECOND @@ -7,19 +8,40 @@ COMMA = "," SEMICOLON = ";" -def serialize(record, duration): - duration *= FRAME_PER_SECOND - result = defaultdict(lambda: defaultdict(list)) - for skill, status in record.items(): - skill = DELIMITER.join(str(e) for e in skill) - for (current_status, snapshot_status, target_status), timeline in status.items(): - if not (timeline := [t for t in timeline if t[0] < duration]): - continue - current_status = COMMA.join(DELIMITER.join(str(e) for e in buff) for buff in current_status) - snapshot_status = COMMA.join(DELIMITER.join(str(e) for e in buff) for buff in snapshot_status) - target_status = COMMA.join(DELIMITER.join(str(e) for e in buff) for buff in target_status) - concat_status = SEMICOLON.join((current_status, snapshot_status, target_status)) +def serialize(records): + result = defaultdict(lambda: defaultdict(lambda: defaultdict(dict))) + for player_id in records: + for target_id in records[player_id]: + for skill, status in records[player_id][target_id].items(): + skill = DELIMITER.join(str(e) for e in skill) + for (current_status, snapshot_status, target_status), timeline in status.items(): + current_status = COMMA.join(DELIMITER.join(str(e) for e in buff) for buff in current_status) + snapshot_status = COMMA.join(DELIMITER.join(str(e) for e in buff) for buff in snapshot_status) + target_status = COMMA.join(DELIMITER.join(str(e) for e in buff) for buff in target_status) + concat_status = SEMICOLON.join((current_status, snapshot_status, target_status)) - result[skill][concat_status].append(timeline) + result[player_id][target_id][skill][concat_status] = timeline return result + + +def unserialize(data: dict): + records = defaultdict(lambda: defaultdict(lambda: defaultdict(dict))) + for player_id in data: + for target_id in data[player_id]: + for skill, status in data[player_id][target_id].items(): + skill = tuple(int(e) for e in skill.split(DELIMITER)) + for status_set, timeline in status.items(): + current_status, snapshot_status, target_status = status_set.split(SEMICOLON) + current_status = tuple( + tuple(int(e) for e in buffs.split(DELIMITER)) for buffs in current_status.split(COMMA) + ) if current_status else tuple() + snapshot_status = tuple( + tuple(int(e) for e in buffs.split(DELIMITER)) for buffs in snapshot_status.split(COMMA) + ) if snapshot_status else tuple() + target_status = tuple( + tuple(int(e) for e in buffs.split(DELIMITER)) for buffs in target_status.split(COMMA) + ) if target_status else tuple() + concat_status = (current_status, snapshot_status, target_status) + records[player_id][target_id][skill][concat_status] = timeline + return records diff --git a/utils/parser.py b/utils/parser.py index 1985061096c669f8e317585bfe940613f0b50d5b..50631d09c34351feb5e571d82422d9e17e8133de 100644 --- a/utils/parser.py +++ b/utils/parser.py @@ -1,3 +1,4 @@ +import os.path from collections import defaultdict from base.constant import FRAME_PER_SECOND @@ -5,7 +6,7 @@ from schools import * from utils.lua import parse FRAME_TYPE, SECOND_TYPE = int, int -PLAYER_ID_TYPE, PLAYER_NAME_TYPE, TARGET_ID_TYPE, PET_ID_TYPE = int, int, int, int +PLAYER_ID_TYPE, PLAYER_NAME_TYPE, TARGET_ID_TYPE, PET_ID_TYPE = str, str, str, str CASTER_ID_TYPE = PLAYER_ID_TYPE | PET_ID_TYPE SKILL_ID_TYPE, SKILL_LEVEL_TYPE, SKILL_STACK_TYPE, SKILL_CRITICAL_TYPE = int, int, int, bool SKILL_TYPE = Tuple[SKILL_ID_TYPE, SKILL_LEVEL_TYPE, SKILL_STACK_TYPE] @@ -231,7 +232,7 @@ class Parser(BaseParser): def parse_player(self, row): detail = row.strip("{}").split(",") - player_id, school_id = int(detail[0]), int(detail[3]) + player_id, school_id = detail[0], int(detail[3]) if player_id in self.id2name or school_id not in SUPPORT_SCHOOL: return @@ -247,11 +248,14 @@ class Parser(BaseParser): def parse_npc(self, row): detail = row.strip("{}").split(",") - npc_id, employer_id = int(detail[0]), int(detail[3]) + npc_id, employer_id = detail[0], detail[3] if npc_id in self.id2name: return - npc_name = detail[1] + npc_name = detail[1].strip('"') + if not npc_name: + return + self.id2name[npc_id] = npc_name self.name2id[npc_name] = npc_id if employer_id in self.players: @@ -259,7 +263,7 @@ class Parser(BaseParser): def parse_pet(self, row): detail = row.strip().strip("{}") - pet_id = int(detail[0]) + pet_id = detail[0] if player_id := self.pet2employer.get(pet_id): if self.next_pet_buff_stacks[player_id]: pet_buff_stacks = self.next_pet_buff_stacks[player_id].pop() @@ -269,7 +273,7 @@ class Parser(BaseParser): def parse_shift_buff(self, row): detail = row.strip("{}").split(",") - player_id = int(detail[0]) + player_id = detail[0] if player_id not in self.players: return @@ -325,7 +329,7 @@ class Parser(BaseParser): def parse_buff(self, row): detail = row.strip("{}").split(",") - caster_id = int(detail[0]) + caster_id = detail[0] if caster_id in self.pet2employer: player_id = self.pet2employer[caster_id] if caster_id in self.buff_stacks: @@ -357,7 +361,7 @@ class Parser(BaseParser): def parse_skill(self, row): detail = row.strip("{}").split(",") - caster_id, target_id = int(detail[0]), int(detail[1]) + caster_id, target_id = detail[0], detail[1] if caster_id in self.pet2employer: player_id = self.pet2employer[caster_id] else: @@ -412,7 +416,7 @@ class Parser(BaseParser): return tuple(current_status), tuple(snapshot_status), tuple(target_status) def __call__(self, file_name): - self.file_name = file_name + self.file_name = os.path.basename(file_name) self.reset() lines = open(file_name).readlines() rows = [] @@ -463,4 +467,4 @@ class Parser(BaseParser): for skill_tuple, status in records.items(): for status_tuple, timeline in status.items(): player_record[skill_tuple][status_tuple] += timeline - self.records[player_id][0] = player_record + self.records[player_id][""] = player_record