Implement skill names for stat 188

Also provides a class guesstimate for stat 107
This commit is contained in:
2025-09-27 14:33:33 +02:00
parent 9e7d69f667
commit 9dd93719bd

View File

@@ -31,6 +31,7 @@ _unique_map = None
_set_item_map = None
_runeword_map = None
_affix_map = None
_skills_map = None
class Quality(IntEnum):
@@ -77,8 +78,16 @@ class Stat:
for val in self.values:
subst_text = subst_text.replace("#", str(val), 1)
if param:
subst_text = re.sub(r"\[[^\]]*\]", str(param), subst_text, 1)
subst_text = self.try_add_skill_text(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:
@@ -546,3 +555,55 @@ def lookup_affix(id: int, prefix: bool) -> dict:
with open(os.path.join(_data_path, "affixes.json")) as f:
_affix_map = json.load(f)
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}"