Compare commits
6 Commits
7c96e47da2
...
fix_item_c
| Author | SHA1 | Date | |
|---|---|---|---|
| 1cb9ff63e7 | |||
| b8b79a0ea5 | |||
| 20fbdfdea9 | |||
| a8938264b0 | |||
| 8cca6e3464 | |||
| 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")
|
||||
@@ -92,22 +92,26 @@ def storage_count(item: Item, stash: str) -> int | str:
|
||||
db = get_stash_db(stash)
|
||||
if item.is_simple:
|
||||
return db.execute(
|
||||
"SELECT COUNT(id) FROM item WHERE code = ? AND deleted IS NULL",
|
||||
"SELECT COUNT(id) FROM item "
|
||||
"WHERE code = ? AND deleted IS NULL AND socketed_into IS NULL",
|
||||
(item.code,),
|
||||
).fetchone()[0]
|
||||
elif item.quality == Quality.UNIQUE:
|
||||
return db.execute(
|
||||
"SELECT COUNT(id) FROM item INNER JOIN item_extra ON id = item_id WHERE code = ? AND unique_id = ? AND deleted IS NULL",
|
||||
"SELECT COUNT(id) FROM item INNER JOIN item_extra ON id = item_id "
|
||||
"WHERE code = ? AND unique_id = ? AND deleted IS NULL AND socketed_into IS NULL",
|
||||
(item.code, item.unique_id),
|
||||
).fetchone()[0]
|
||||
elif item.quality == Quality.SET:
|
||||
return db.execute(
|
||||
"SELECT COUNT(id) FROM item INNER JOIN item_extra ON id = item_id WHERE code = ? AND set_id = ? AND deleted IS NULL",
|
||||
"SELECT COUNT(id) FROM item INNER JOIN item_extra ON id = item_id "
|
||||
"WHERE code = ? AND set_id = ? AND deleted IS NULL AND socketed_into IS NULL",
|
||||
(item.code, item.set_id),
|
||||
).fetchone()[0]
|
||||
elif item.is_runeword:
|
||||
return db.execute(
|
||||
"SELECT COUNT(id) FROM item INNER JOIN item_extra ON id = item_id WHERE code = ? AND runeword_id = ? AND deleted IS NULL",
|
||||
"SELECT COUNT(id) FROM item INNER JOIN item_extra ON id = item_id "
|
||||
"WHERE code = ? AND runeword_id = ? AND deleted IS NULL and socketed_into IS NULL",
|
||||
(item.code, item.runeword_id),
|
||||
).fetchone()[0]
|
||||
else:
|
||||
@@ -217,7 +221,9 @@ def list_storage(stash_name: str):
|
||||
|
||||
db = get_stash_db(stash_name)
|
||||
items = {}
|
||||
rows = db.execute("SELECT id FROM item WHERE deleted IS NULL").fetchall()
|
||||
rows = db.execute(
|
||||
"SELECT id FROM item WHERE deleted IS NULL and socketed_into IS NULL"
|
||||
).fetchall()
|
||||
for row in rows:
|
||||
items[row["id"]] = Item.load_from_db(row["id"], db=db)
|
||||
|
||||
@@ -238,16 +244,21 @@ def list_storage_category(stash_name: str, category: str):
|
||||
|
||||
if category == "uniques":
|
||||
q = db.execute(
|
||||
"SELECT id FROM item INNER JOIN item_extra ON id = item_id WHERE deleted IS NULL AND quality = ?",
|
||||
"SELECT id FROM item INNER JOIN item_extra ON id = item_id "
|
||||
"WHERE deleted IS NULL AND socketed_into IS NULL AND quality = ?",
|
||||
(int(Quality.UNIQUE),),
|
||||
)
|
||||
elif category == "sets":
|
||||
q = db.execute(
|
||||
"SELECT id FROM item INNER JOIN item_extra ON id = item_id WHERE deleted IS NULL AND quality = ?",
|
||||
"SELECT id FROM item INNER JOIN item_extra ON id = item_id "
|
||||
"WHERE deleted IS NULL AND socketed_into IS NULL AND quality = ?",
|
||||
(int(Quality.SET),),
|
||||
)
|
||||
elif category == "misc":
|
||||
q = db.execute("SELECT id FROM item WHERE deleted IS NULL AND is_simple = TRUE")
|
||||
q = db.execute(
|
||||
"SELECT id FROM item "
|
||||
"WHERE deleted IS NULL AND socketed_into IS NULL AND is_simple = TRUE"
|
||||
)
|
||||
else:
|
||||
return "Unexpected category", 400
|
||||
|
||||
@@ -325,7 +336,9 @@ def storage_currency_counts(item_codes: list[str], stash_name: str) -> dict:
|
||||
for code in item_codes:
|
||||
currencies[code] = {
|
||||
"count": db.execute(
|
||||
"SELECT COUNT(id) FROM item WHERE code = ?", (code,)
|
||||
"SELECT COUNT(id) FROM item "
|
||||
"WHERE code = ? AND deleted IS NULL AND socketed_into IS NULL",
|
||||
(code,),
|
||||
).fetchone()[0],
|
||||
"name": lookup_basetype(code)["name"],
|
||||
}
|
||||
|
||||
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
|
||||
_runeword_map = None
|
||||
_affix_map = None
|
||||
_skills_map = None
|
||||
|
||||
|
||||
class Quality(IntEnum):
|
||||
@@ -77,8 +78,18 @@ 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]
|
||||
if '[' in subst_text:
|
||||
return subst_text[:subst_text.find('[')] + lookup_random_skill_tab(self.parameter)
|
||||
return re.sub(r"\[[^\]]*\]", lookup_random_skill_tab(self.parameter), subst_text, 1)
|
||||
else:
|
||||
return re.sub(r"\[[^\]]*\]", str(self.parameter), subst_text, 1)
|
||||
|
||||
|
||||
def txtbits(bits: bitarray) -> str:
|
||||
@@ -546,3 +557,57 @@ 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:
|
||||
# FIXME: This hackish way of calculating the key is because we directly index into local/lng/strings/skills.json
|
||||
# but the actual ID points to global/excel/skills.txt
|
||||
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_random_skill_tab(id: int) -> str:
|
||||
# (ClassId * 8) is the id of the first tab for that class
|
||||
skills_map = _get_skills_map()
|
||||
class_name = lookup_class(int(id / 8))
|
||||
two_letter_class_code = lookup_class(int(id / 8))[:2]
|
||||
tab_index = 3 - id % 8 # for some reason local/lng/strings/skills.json index backwards (0 -> 3, 1 -> 2, ...)
|
||||
try:
|
||||
return skills_map[f"SkillCategory{two_letter_class_code}{tab_index}"] + f" ({class_name} only)"
|
||||
except KeyError:
|
||||
return f"<Invalid random skill tab: {id}>"
|
||||
|
||||
|
||||
def lookup_class(id: int) -> 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"
|
||||
|
||||
Reference in New Issue
Block a user