64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
from typing import Any, Dict, List
|
|
|
|
from bemani.backend.base import Base
|
|
from bemani.common import ValidatedDict, GameConstants
|
|
from bemani.data import Data, ArcadeID
|
|
|
|
|
|
def get_game_settings(data: Data, arcadeid: ArcadeID) -> List[Dict[str, Any]]:
|
|
game_lut: Dict[GameConstants, Dict[int, str]] = {}
|
|
settings_lut: Dict[GameConstants, Dict[int, Dict[str, Any]]] = {}
|
|
all_settings = []
|
|
|
|
for (game, version, name) in Base.all_games():
|
|
if game not in game_lut:
|
|
game_lut[game] = {}
|
|
settings_lut[game] = {}
|
|
game_lut[game][version] = name
|
|
settings_lut[game][version] = {}
|
|
|
|
for (game, version, settings) in Base.all_settings():
|
|
if not settings:
|
|
continue
|
|
|
|
# First, set up the basics
|
|
game_settings: Dict[str, Any] = {
|
|
"game": game.value,
|
|
"version": version,
|
|
"name": game_lut[game][version],
|
|
"bools": [],
|
|
"ints": [],
|
|
"strs": [],
|
|
"longstrs": [],
|
|
}
|
|
|
|
# Now, look up the current setting for each returned setting
|
|
for setting_type, setting_unpacker in [
|
|
("bools", "get_bool"),
|
|
("ints", "get_int"),
|
|
("strs", "get_str"),
|
|
("longstrs", "get_str"),
|
|
]:
|
|
for setting in settings.get(setting_type, []):
|
|
if setting["category"] not in settings_lut[game][version]:
|
|
cached_setting = data.local.machine.get_settings(
|
|
arcadeid, game, version, setting["category"]
|
|
)
|
|
if cached_setting is None:
|
|
cached_setting = ValidatedDict()
|
|
settings_lut[game][version][setting["category"]] = cached_setting
|
|
|
|
current_settings = settings_lut[game][version][setting["category"]]
|
|
setting["value"] = getattr(current_settings, setting_unpacker)(
|
|
setting["setting"]
|
|
)
|
|
game_settings[setting_type].append(setting)
|
|
|
|
# Now, include it!
|
|
all_settings.append(game_settings)
|
|
|
|
return sorted(
|
|
all_settings,
|
|
key=lambda setting: (setting["game"], setting["version"]),
|
|
)
|