mirror of https://github.com/zeldaret/botw.git
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
from typing import Dict, List
|
|
import yaml
|
|
|
|
from common.util import utils
|
|
from common.util.graph import Graph
|
|
|
|
BaseClasses = {
|
|
0x71024d8d68,
|
|
0x71025129f0,
|
|
0x7102513278,
|
|
0x71024d8ef0,
|
|
0x710243c9b8,
|
|
}
|
|
|
|
|
|
def check_vtable_name_dict(names: Dict[int, str]):
|
|
seen = set()
|
|
for k, v in names.items():
|
|
if v in seen:
|
|
raise ValueError(f"invalid vtable names: {v} appears twice")
|
|
seen.add(k)
|
|
seen.add(v)
|
|
|
|
|
|
def get_vtables() -> Dict[str, Dict[str, List[int]]]:
|
|
with (utils.get_repo_root() / "data" / "aidef_vtables.yml").open(encoding="utf-8") as f:
|
|
return yaml.load(f, Loader=yaml.CSafeLoader)
|
|
|
|
|
|
def get_action_params() -> Dict[str, List[dict]]:
|
|
with (utils.get_repo_root() / "data" / "aidef_action_params.yml").open(encoding="utf-8") as f:
|
|
return yaml.load(f, Loader=yaml.CSafeLoader)
|
|
|
|
|
|
def get_action_vtable_names() -> Dict[int, str]:
|
|
with (utils.get_repo_root() / "data" / "aidef_action_vtables.yml").open(encoding="utf-8") as f:
|
|
names = yaml.load(f, Loader=yaml.CSafeLoader)
|
|
|
|
check_vtable_name_dict(names)
|
|
return names
|
|
|
|
|
|
def get_ai_params() -> Dict[str, List[dict]]:
|
|
with (utils.get_repo_root() / "data" / "aidef_ai_params.yml").open(encoding="utf-8") as f:
|
|
return yaml.load(f, Loader=yaml.CSafeLoader)
|
|
|
|
|
|
def get_ai_vtable_names() -> Dict[int, str]:
|
|
with (utils.get_repo_root() / "data" / "aidef_ai_vtables.yml").open(encoding="utf-8") as f:
|
|
names = yaml.load(f, Loader=yaml.CSafeLoader)
|
|
|
|
check_vtable_name_dict(names)
|
|
return names
|
|
|
|
|
|
def topologically_sort_vtables(all_vtables: dict, type_: str) -> List[int]:
|
|
graph = Graph()
|
|
for name, vtables in all_vtables[type_].items():
|
|
classes = list(dict.fromkeys(reversed(vtables)))
|
|
for i in range(len(classes) - 1):
|
|
graph.add_edge(classes[i + 1], classes[i])
|
|
return graph.topological_sort()
|