mirror of
https://github.com/PaiGramTeam/python-genshin-artifact.git
synced 2024-11-16 04:35:36 +00:00
🐛 Fix exception caused by the change in get_item
method in pyo3 0.20.0
This commit is contained in:
parent
1358a2ca57
commit
d8d4b1e34e
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -20,8 +20,8 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, windows-latest]
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
python-version: ['3.9', '3.10', '3.11', '3.12']
|
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
7
develop.ps1
Normal file
7
develop.ps1
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
$env:RUSTFLAGS="-Awarnings";
|
||||||
|
pip uninstall python_genshin_artifact -y
|
||||||
|
maturin develop
|
||||||
|
|
||||||
|
# py -m pip install maturin
|
||||||
|
# $env:PYTHONPATH="C:\Users\luoshuijs\AppData\Local\Programs\Python\Python311"
|
||||||
|
# cargo test
|
0
install.sh
Normal file
0
install.sh
Normal file
5
main.py
Normal file
5
main.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from python_genshin_artifact import Artifact
|
||||||
|
|
||||||
|
a = Artifact()
|
||||||
|
|
||||||
|
a.main_stat = ("ATKFixed", 1)
|
3
my_install.sh
Normal file
3
my_install.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
$env:RUSTFLAGS="-Awarnings";
|
||||||
|
cargo build
|
||||||
|
maturin develop
|
4
rustfmt.toml
Normal file
4
rustfmt.toml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#max_width = 120
|
||||||
|
ignore = [
|
||||||
|
"genshin_artifact"
|
||||||
|
]
|
@ -162,12 +162,14 @@ mod tests {
|
|||||||
let hutao_dict = py_dict
|
let hutao_dict = py_dict
|
||||||
.get_item("HuTao")
|
.get_item("HuTao")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
.downcast::<PyDict>()
|
.downcast::<PyDict>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
hutao_dict
|
hutao_dict
|
||||||
.get_item("le_50")
|
.get_item("le_50")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
.extract::<&str>()
|
.extract::<&str>()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
"true"
|
"true"
|
||||||
|
@ -153,12 +153,14 @@ mod tests {
|
|||||||
let params_dict = py_dict
|
let params_dict = py_dict
|
||||||
.get_item("StaffOfHoma")
|
.get_item("StaffOfHoma")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
.downcast::<PyDict>()
|
.downcast::<PyDict>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
params_dict
|
params_dict
|
||||||
.get_item("be50_rate")
|
.get_item("be50_rate")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
.extract::<f64>()
|
.extract::<f64>()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
1.0
|
1.0
|
||||||
|
@ -73,7 +73,8 @@ pub struct PyDamageAnalysis {
|
|||||||
#[pymethods]
|
#[pymethods]
|
||||||
impl PyDamageAnalysis {
|
impl PyDamageAnalysis {
|
||||||
#[getter]
|
#[getter]
|
||||||
fn __dict__(&self, py: Python) -> PyResult<PyObject> { // skipcq: RS-R1000
|
fn __dict__(&self, py: Python) -> PyResult<PyObject> {
|
||||||
|
// skipcq: RS-R1000
|
||||||
let dict = PyDict::new(py);
|
let dict = PyDict::new(py);
|
||||||
|
|
||||||
fn insert_hashmap(
|
fn insert_hashmap(
|
||||||
|
24
test.ps1
Normal file
24
test.ps1
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
$env:RUSTFLAGS="-Awarnings"
|
||||||
|
|
||||||
|
venv/Scripts/activate.ps1
|
||||||
|
|
||||||
|
maturin build
|
||||||
|
|
||||||
|
deactivate
|
||||||
|
|
||||||
|
$pythonPath = py -c "import sys; print(sys.exec_prefix)"
|
||||||
|
$env:PYTHONHOME = $pythonPath
|
||||||
|
$env:PYTHONPATH = $pythonPath
|
||||||
|
$Env:Path += ";$pythonPath"
|
||||||
|
|
||||||
|
py -m pip uninstall python_genshin_artifact -y
|
||||||
|
|
||||||
|
$wheelDirectory = ".\target\wheels"
|
||||||
|
$latestWheel = Get-ChildItem $wheelDirectory -Filter *.whl | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||||||
|
$wheelPath = Join-Path $wheelDirectory $latestWheel.Name
|
||||||
|
|
||||||
|
py -m pip install $wheelPath
|
||||||
|
|
||||||
|
cargo test
|
||||||
|
|
||||||
|
py -m pip uninstall python_genshin_artifact -y
|
2914
tests/data/enka.json
Normal file
2914
tests/data/enka.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,185 +0,0 @@
|
|||||||
{
|
|
||||||
"character": {
|
|
||||||
"name": "HuTao",
|
|
||||||
"level": 81,
|
|
||||||
"ascend": false,
|
|
||||||
"constellation": 1,
|
|
||||||
"skill1": 9,
|
|
||||||
"skill2": 8,
|
|
||||||
"skill3": 7,
|
|
||||||
"params": {
|
|
||||||
"HuTao": {
|
|
||||||
"le_50": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"weapon": {
|
|
||||||
"name": "DragonSBane",
|
|
||||||
"level": 90,
|
|
||||||
"ascend": false,
|
|
||||||
"refine": 4,
|
|
||||||
"params": "NoConfig"
|
|
||||||
},
|
|
||||||
"buffs": [],
|
|
||||||
"artifacts": [
|
|
||||||
{
|
|
||||||
"set_name": "WandererSTroupe",
|
|
||||||
"slot": "Flower",
|
|
||||||
"level": 20,
|
|
||||||
"star": 5,
|
|
||||||
"sub_stats": [
|
|
||||||
[
|
|
||||||
"CriticalRate",
|
|
||||||
0.14800000000000002
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"Recharge",
|
|
||||||
5.8
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"HPPercentage",
|
|
||||||
0.111
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalDamage",
|
|
||||||
0.14800000000000002
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"main_stat": [
|
|
||||||
"HPFixed",
|
|
||||||
4780.0
|
|
||||||
],
|
|
||||||
"id": 15003
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"set_name": "CrimsonWitchOfFlames",
|
|
||||||
"slot": "Feather",
|
|
||||||
"level": 20,
|
|
||||||
"star": 5,
|
|
||||||
"sub_stats": [
|
|
||||||
[
|
|
||||||
"CriticalRate",
|
|
||||||
0.113
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"ATKPercentage",
|
|
||||||
0.099
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalDamage",
|
|
||||||
0.132
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"DEFFixed",
|
|
||||||
19.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"main_stat": [
|
|
||||||
"ATKFixed",
|
|
||||||
311.0
|
|
||||||
],
|
|
||||||
"id": 15006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"set_name": "CrimsonWitchOfFlames",
|
|
||||||
"slot": "Sand",
|
|
||||||
"level": 20,
|
|
||||||
"star": 5,
|
|
||||||
"sub_stats": [
|
|
||||||
[
|
|
||||||
"DEFPercentage",
|
|
||||||
0.11699999999999999
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalRate",
|
|
||||||
0.039
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalDamage",
|
|
||||||
0.19399999999999998
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"Recharge",
|
|
||||||
14.9
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"main_stat": [
|
|
||||||
"HPPercentage",
|
|
||||||
0.466
|
|
||||||
],
|
|
||||||
"id": 15006
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"set_name": "EmblemOfSeveredFate",
|
|
||||||
"slot": "Goblet",
|
|
||||||
"level": 20,
|
|
||||||
"star": 5,
|
|
||||||
"sub_stats": [
|
|
||||||
[
|
|
||||||
"DEFFixed",
|
|
||||||
21.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalDamage",
|
|
||||||
0.225
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"HPFixed",
|
|
||||||
209.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalRate",
|
|
||||||
0.113
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"main_stat": [
|
|
||||||
"PyroBonus",
|
|
||||||
0.466
|
|
||||||
],
|
|
||||||
"id": 15020
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"set_name": "WandererSTroupe",
|
|
||||||
"slot": "Head",
|
|
||||||
"level": 20,
|
|
||||||
"star": 5,
|
|
||||||
"sub_stats": [
|
|
||||||
[
|
|
||||||
"HPPercentage",
|
|
||||||
0.122
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"DEFFixed",
|
|
||||||
21.0
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"CriticalDamage",
|
|
||||||
0.21
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"HPFixed",
|
|
||||||
418.0
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"main_stat": [
|
|
||||||
"CriticalRate",
|
|
||||||
0.311
|
|
||||||
],
|
|
||||||
"id": 15003
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"artifact_config": {
|
|
||||||
"config_crimson_witch_of_flames": {
|
|
||||||
"level": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"skill": {
|
|
||||||
"index": 7,
|
|
||||||
"config": {
|
|
||||||
"HuTao": {
|
|
||||||
"after_e": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"enemy": null
|
|
||||||
}
|
|
32
tests/test_enka.py
Normal file
32
tests/test_enka.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
from python_genshin_artifact import get_damage_analysis, get_transformative_damage
|
||||||
|
from python_genshin_artifact.enka.enka_parser import enka_parser
|
||||||
|
from python_genshin_artifact import CalculatorConfig
|
||||||
|
from python_genshin_artifact import SkillInterface
|
||||||
|
|
||||||
|
PATH = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
enka_test_file = os.path.join(PATH, "data", "enka.json")
|
||||||
|
with open(enka_test_file, "r", encoding="utf-8") as file:
|
||||||
|
enka_data = json.load(file)
|
||||||
|
|
||||||
|
|
||||||
|
def test_enka_parser():
|
||||||
|
character, weapon, artifacts = enka_parser(enka_data, 10000046)
|
||||||
|
logger.info(character)
|
||||||
|
logger.info(weapon)
|
||||||
|
logger.info(artifacts)
|
||||||
|
s = {"index": 7, "config": {"HuTao": {"after_e": True}}}
|
||||||
|
artifact_config = {"config_crimson_witch_of_flames": {"level": 1}}
|
||||||
|
skill = SkillInterface(**s)
|
||||||
|
calculator_config = CalculatorConfig(
|
||||||
|
character=character, weapon=weapon, artifacts=artifacts, skill=skill, artifact_config=artifact_config
|
||||||
|
)
|
||||||
|
damage_analysis = get_damage_analysis(calculator_config)
|
||||||
|
logger.info(damage_analysis)
|
||||||
|
transformative_damage = get_transformative_damage(calculator_config)
|
||||||
|
logger.info(transformative_damage)
|
54
tools/ambe.py
Normal file
54
tools/ambe.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import httpx
|
||||||
|
|
||||||
|
from python_genshin_artifact.enka.characters import characters_map
|
||||||
|
from python_genshin_artifact.enka.weapon import weapon_name_map, test_weapon_name_map
|
||||||
|
from python_genshin_artifact.enka.artifacts import artifacts_name_map
|
||||||
|
|
||||||
|
response = httpx.get("https://api.ambr.top/v2/chs/weapon")
|
||||||
|
|
||||||
|
items: dict = response.json()["data"]["items"]
|
||||||
|
need_add = {}
|
||||||
|
|
||||||
|
for key, value in items.items():
|
||||||
|
key_id = int(key)
|
||||||
|
if key_id in weapon_name_map:
|
||||||
|
continue
|
||||||
|
if key_id in test_weapon_name_map:
|
||||||
|
continue
|
||||||
|
name = value["route"].replace(" ", "")
|
||||||
|
need_add.setdefault(int(key), name)
|
||||||
|
|
||||||
|
print(need_add)
|
||||||
|
|
||||||
|
response = httpx.get("https://api.ambr.top/v2/chs/avatar")
|
||||||
|
|
||||||
|
items: dict = response.json()["data"]["items"]
|
||||||
|
need_add = {}
|
||||||
|
|
||||||
|
for key, value in items.items():
|
||||||
|
try:
|
||||||
|
key_id = int(key)
|
||||||
|
except ValueError as exc:
|
||||||
|
print(exc)
|
||||||
|
continue
|
||||||
|
if key_id in characters_map:
|
||||||
|
continue
|
||||||
|
name = value["route"].replace(" ", "")
|
||||||
|
need_add.setdefault(int(key), name)
|
||||||
|
|
||||||
|
print(need_add)
|
||||||
|
|
||||||
|
|
||||||
|
response = httpx.get("https://api.ambr.top/v2/chs/reliquary")
|
||||||
|
|
||||||
|
items: dict = response.json()["data"]["items"]
|
||||||
|
need_add = {}
|
||||||
|
|
||||||
|
for key, value in items.items():
|
||||||
|
key_id = int(key)
|
||||||
|
if key_id in artifacts_name_map:
|
||||||
|
continue
|
||||||
|
name = value["route"].replace(" ", "")
|
||||||
|
need_add.setdefault(int(key), name)
|
||||||
|
|
||||||
|
print(need_add)
|
30
tools/character.py
Normal file
30
tools/character.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
from python_genshin_artifact.assets import Assets
|
||||||
|
|
||||||
|
assets = Assets()
|
||||||
|
|
||||||
|
character = assets.character.get("Yelan")
|
||||||
|
locale = assets.locale.get("zh-cn")
|
||||||
|
|
||||||
|
print(f"name {locale[character.get('name_locale')]}")
|
||||||
|
|
||||||
|
for skill_map1 in character.get("skill_map1"):
|
||||||
|
index = skill_map1.get("index")
|
||||||
|
locale_index = skill_map1.get("locale_index")
|
||||||
|
print(f"skill_map1 index {index} locale {locale[locale_index]}")
|
||||||
|
|
||||||
|
|
||||||
|
for skill_map2 in character.get("skill_map2"):
|
||||||
|
index = skill_map2.get("index")
|
||||||
|
locale_index = skill_map2.get("locale_index")
|
||||||
|
print(f"skill_map2 index {index} locale {locale[locale_index]}")
|
||||||
|
|
||||||
|
for skill_map3 in character.get("skill_map3"):
|
||||||
|
index = skill_map3.get("index")
|
||||||
|
locale_index = skill_map3.get("locale_index")
|
||||||
|
print(f"skill_map3 index {index} locale {locale[locale_index]}")
|
||||||
|
|
||||||
|
print(locale.index("夜兰"))
|
||||||
|
|
||||||
|
|
53
tools/main.py
Normal file
53
tools/main.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import json
|
||||||
|
from python_genshin_artifact import get_damage_analysis, gen_character_meta_as_json, gen_weapon_meta_as_json, \
|
||||||
|
gen_artifact_meta_as_json, gen_generate_locale_as_json
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"character": {
|
||||||
|
"name": "HuTao",
|
||||||
|
"level": 90,
|
||||||
|
"ascend": True,
|
||||||
|
"constellation": 0,
|
||||||
|
"skill1": 10,
|
||||||
|
"skill2": 10,
|
||||||
|
"skill3": 10,
|
||||||
|
"params": "NoConfig",
|
||||||
|
},
|
||||||
|
"weapon": {
|
||||||
|
"name": "StaffOfHoma",
|
||||||
|
"level": 90,
|
||||||
|
"ascend": True,
|
||||||
|
"refine": 1,
|
||||||
|
"params": "NoConfig",
|
||||||
|
},
|
||||||
|
"buffs": [],
|
||||||
|
"artifacts": [],
|
||||||
|
"artifact_config": None,
|
||||||
|
"skill": {"index": 1, "config": {"HuTao": {"after_e": True}}},
|
||||||
|
"enemy": None,
|
||||||
|
}
|
||||||
|
|
||||||
|
# character_meta = gen_character_meta_as_json()
|
||||||
|
# with open("character.json", mode="w+", encoding="utf-8") as f:
|
||||||
|
# f.write(character_meta)
|
||||||
|
# print(character_meta)
|
||||||
|
#
|
||||||
|
# weapon_meta = gen_weapon_meta_as_json()
|
||||||
|
# with open("weapon.json", mode="w+", encoding="utf-8") as f:
|
||||||
|
# f.write(weapon_meta)
|
||||||
|
#
|
||||||
|
# artifact_meta = gen_artifact_meta_as_json()
|
||||||
|
# with open("artifact.json", mode="w+", encoding="utf-8") as f:
|
||||||
|
# f.write(artifact_meta)
|
||||||
|
#
|
||||||
|
# locale_meta = gen_generate_locale_as_json("zh-cn")
|
||||||
|
# with open("locale_zh_cn.json", mode="w+", encoding="utf-8") as f:
|
||||||
|
# f.write(locale_meta)
|
||||||
|
|
||||||
|
|
||||||
|
damage_analysis = get_damage_analysis(json.dumps(data))
|
||||||
|
data: dict = json.loads(damage_analysis)
|
||||||
|
for key, value in data.items():
|
||||||
|
if value:
|
||||||
|
print(key)
|
||||||
|
print(value)
|
Loading…
Reference in New Issue
Block a user