136 lines
4.4 KiB
Python
136 lines
4.4 KiB
Python
from typing import Optional
|
|
import wacky
|
|
import json
|
|
from os import walk, path
|
|
|
|
from read import BaseReader
|
|
from core.config import CoreConfig
|
|
from titles.wacca.database import WaccaData
|
|
from titles.wacca.const import WaccaConstants
|
|
|
|
|
|
class WaccaReader(BaseReader):
|
|
def __init__(
|
|
self,
|
|
config: CoreConfig,
|
|
version: int,
|
|
bin_dir: Optional[str],
|
|
opt_dir: Optional[str],
|
|
extra: Optional[str],
|
|
) -> None:
|
|
super().__init__(config, version, bin_dir, opt_dir, extra)
|
|
self.data = WaccaData(config)
|
|
|
|
try:
|
|
self.logger.info(
|
|
f"Start importer for {WaccaConstants.game_ver_to_string(version)}"
|
|
)
|
|
except IndexError:
|
|
self.logger.error(f"Invalid wacca version {version}")
|
|
exit(1)
|
|
|
|
async def read(self) -> None:
|
|
if not (
|
|
path.exists(f"{self.bin_dir}/Table")
|
|
and path.exists(f"{self.bin_dir}/Message")
|
|
):
|
|
self.logger.error("Could not find Table or Message folder, nothing to read")
|
|
return
|
|
|
|
await self.read_music(f"{self.bin_dir}/Table", "MusicParameterTable")
|
|
|
|
async def read_music(self, base_dir: str, table: str) -> None:
|
|
if not self.check_valid_pair(base_dir, table):
|
|
self.logger.warning(
|
|
f"Cannot find {table} uasset/uexp pair at {base_dir}, music will not be read"
|
|
)
|
|
return
|
|
|
|
uasset = open(f"{base_dir}/{table}.uasset", "rb")
|
|
uexp = open(f"{base_dir}/{table}.uexp", "rb")
|
|
|
|
package = wacky.jsonify(uasset, uexp)
|
|
package_json = json.dumps(package, indent=4, sort_keys=True)
|
|
data = json.loads(package_json)
|
|
|
|
first_elem = data[0]
|
|
wacca_data = first_elem["rows"]
|
|
|
|
for i, key in enumerate(wacca_data):
|
|
song_id = int(key)
|
|
title = wacca_data[str(key)]["MusicMessage"]
|
|
artist = wacca_data[str(key)]["ArtistMessage"]
|
|
bpm = wacca_data[str(key)]["Bpm"]
|
|
jacket_asset_name = wacca_data[str(key)]["JacketAssetName"]
|
|
|
|
diff = float(wacca_data[str(key)]["DifficultyNormalLv"])
|
|
designer = wacca_data[str(key)]["NotesDesignerNormal"]
|
|
|
|
if diff > 0:
|
|
await self.data.static.put_music(
|
|
self.version,
|
|
song_id,
|
|
1,
|
|
title,
|
|
artist,
|
|
bpm,
|
|
diff,
|
|
designer,
|
|
jacket_asset_name,
|
|
)
|
|
self.logger.info(f"Read song {song_id} chart 1")
|
|
|
|
diff = float(wacca_data[str(key)]["DifficultyHardLv"])
|
|
designer = wacca_data[str(key)]["NotesDesignerHard"]
|
|
|
|
if diff > 0:
|
|
await self.data.static.put_music(
|
|
self.version,
|
|
song_id,
|
|
2,
|
|
title,
|
|
artist,
|
|
bpm,
|
|
diff,
|
|
designer,
|
|
jacket_asset_name,
|
|
)
|
|
self.logger.info(f"Read song {song_id} chart 2")
|
|
|
|
diff = float(wacca_data[str(key)]["DifficultyExtremeLv"])
|
|
designer = wacca_data[str(key)]["NotesDesignerExpert"]
|
|
|
|
if diff > 0:
|
|
await self.data.static.put_music(
|
|
self.version,
|
|
song_id,
|
|
3,
|
|
title,
|
|
artist,
|
|
bpm,
|
|
diff,
|
|
designer,
|
|
jacket_asset_name,
|
|
)
|
|
self.logger.info(f"Read song {song_id} chart 3")
|
|
|
|
diff = float(wacca_data[str(key)]["DifficultyInfernoLv"])
|
|
designer = wacca_data[str(key)]["NotesDesignerInferno"]
|
|
|
|
if diff > 0:
|
|
await self.data.static.put_music(
|
|
self.version,
|
|
song_id,
|
|
4,
|
|
title,
|
|
artist,
|
|
bpm,
|
|
diff,
|
|
designer,
|
|
jacket_asset_name,
|
|
)
|
|
self.logger.info(f"Read song {song_id} chart 4")
|
|
|
|
def check_valid_pair(self, dir: str, file: str) -> bool:
|
|
return path.exists(f"{dir}/{file}.uasset") and path.exists(f"{dir}/{file}.uexp")
|