forked from omicron/d2warehouse
Compare commits
2 Commits
bd96f1e0ac
...
9dd93719bd
| Author | SHA1 | Date | |
|---|---|---|---|
| 9dd93719bd | |||
| 9e7d69f667 |
28
contrib/skills.py
Normal file
28
contrib/skills.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import json
|
||||||
|
import csv
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
path = sys.argv[1] if len(sys.argv) >= 2 else "."
|
||||||
|
|
||||||
|
items = {}
|
||||||
|
|
||||||
|
item_patches = {
|
||||||
|
"tbk": {"class": "tome"},
|
||||||
|
"ibk": {"class": "tome"},
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(os.path.join(path, "skills.json"), encoding="utf-8-sig") as f:
|
||||||
|
rows = json.load(f)
|
||||||
|
|
||||||
|
lookup_table = {}
|
||||||
|
for entry in rows:
|
||||||
|
key = entry["Key"]
|
||||||
|
text = entry["enUS"]
|
||||||
|
if len(text.strip()) == 0:
|
||||||
|
continue
|
||||||
|
lookup_table[key] = text
|
||||||
|
|
||||||
|
with open("skills.json", "w", newline="\n") as f:
|
||||||
|
json.dump(lookup_table, f, indent=4)
|
||||||
|
f.write("\n")
|
||||||
1251
d2warehouse/data/skills.json
Normal file
1251
d2warehouse/data/skills.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -31,6 +31,7 @@ _unique_map = None
|
|||||||
_set_item_map = None
|
_set_item_map = None
|
||||||
_runeword_map = None
|
_runeword_map = None
|
||||||
_affix_map = None
|
_affix_map = None
|
||||||
|
_skills_map = None
|
||||||
|
|
||||||
|
|
||||||
class Quality(IntEnum):
|
class Quality(IntEnum):
|
||||||
@@ -77,8 +78,16 @@ class Stat:
|
|||||||
for val in self.values:
|
for val in self.values:
|
||||||
subst_text = subst_text.replace("#", str(val), 1)
|
subst_text = subst_text.replace("#", str(val), 1)
|
||||||
if param:
|
if param:
|
||||||
subst_text = re.sub(r"\[[^\]]*\]", str(param), subst_text, 1)
|
subst_text = self.try_add_skill_text(subst_text)
|
||||||
return subst_text
|
return subst_text
|
||||||
|
|
||||||
|
def try_add_skill_text(self, subst_text: str) -> str | None:
|
||||||
|
if self.id == 107: # +X to [Skill] ([Class] only)
|
||||||
|
return re.sub(r"\[[^\]]*\]", lookup_skill_name(self.parameter), subst_text, 1)
|
||||||
|
elif self.id == 188: # +X to [Skill]
|
||||||
|
return re.sub(r"\[[^\]]*\]", lookup_talent_tree(self.parameter) + f"({self.parameter})", subst_text, 1)
|
||||||
|
else:
|
||||||
|
return re.sub(r"\[[^\]]*\]", str(self.parameter), subst_text, 1)
|
||||||
|
|
||||||
|
|
||||||
def txtbits(bits: bitarray) -> str:
|
def txtbits(bits: bitarray) -> str:
|
||||||
@@ -546,3 +555,55 @@ def lookup_affix(id: int, prefix: bool) -> dict:
|
|||||||
with open(os.path.join(_data_path, "affixes.json")) as f:
|
with open(os.path.join(_data_path, "affixes.json")) as f:
|
||||||
_affix_map = json.load(f)
|
_affix_map = json.load(f)
|
||||||
return _affix_map["prefixes" if prefix else "suffixes"][str(id)]
|
return _affix_map["prefixes" if prefix else "suffixes"][str(id)]
|
||||||
|
|
||||||
|
|
||||||
|
def _get_skills_map():
|
||||||
|
global _skills_map
|
||||||
|
if _skills_map is None:
|
||||||
|
with open(os.path.join(_data_path, "skills.json")) as f:
|
||||||
|
_skills_map = json.load(f)
|
||||||
|
return _skills_map
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_skill_name(id: int) -> str:
|
||||||
|
# NOTE: The mapping seems not straight forward
|
||||||
|
# for Powerstrike and Impale the id given is 14 and 19 and the key is "skillname14" and "skillname19"
|
||||||
|
# for Feral Rage id 232 is given but the key is "Skillname233"
|
||||||
|
skills_map = _get_skills_map()
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
return skills_map[f"Skillname{id + 1}"]
|
||||||
|
except KeyError:
|
||||||
|
return skills_map[f"skillname{id}"]
|
||||||
|
except KeyError:
|
||||||
|
return f"<Invalid key: skillname{id} or Skillname{id + 1}>"
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_talent_tree(id: int) -> str:
|
||||||
|
# TODO: I do not know how to translate this Id to e.g. SkillCategoryBa1
|
||||||
|
class_guess = lookup_class(int(id / 10) + 1, id)
|
||||||
|
try:
|
||||||
|
return f"<TODO: Talent Tree of {class_guess}?>"
|
||||||
|
except AssertionError:
|
||||||
|
return "<TODO: Talent Tree Name>"
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_class(id: int, dbg) -> str:
|
||||||
|
match id:
|
||||||
|
case 0:
|
||||||
|
return "Amazon"
|
||||||
|
case 1:
|
||||||
|
return "Sorceress"
|
||||||
|
case 2:
|
||||||
|
return "Necromancer"
|
||||||
|
case 3:
|
||||||
|
return "Paladin"
|
||||||
|
case 4:
|
||||||
|
return "Barbarian"
|
||||||
|
case 5:
|
||||||
|
return "Druid"
|
||||||
|
case 6:
|
||||||
|
return "Assassin"
|
||||||
|
case _:
|
||||||
|
# TODO: In 3.11 replace this with assert_never
|
||||||
|
assert False, f"{id} Should be unreachable: {dbg}"
|
||||||
|
|||||||
Reference in New Issue
Block a user