Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def generate_diff(
self, mod_dir: Path, modded_files: List[Union[Path, str]]
) -> ParameterIO:
print("Logging changes to shop files...")
diffs = ParameterIO()
file_names = ParameterObject()
for file in [file for file in modded_files if Path(file).suffix in EXT_FOLDERS]:
try:
mod_bytes = util.get_nested_file_bytes(str(mod_dir) + "/" + str(file))
nests = str(file).split("//", 1)
ref_path = str(util.get_game_file(Path(nests[0]))) + "//" + nests[1]
ref_bytes = util.get_nested_file_bytes(ref_path)
shop_type = str(file).split(".")[-1]
mod_pio = get_named_pio(ParameterIO.from_binary(mod_bytes), shop_type)
ref_pio = get_named_pio(ParameterIO.from_binary(ref_bytes), shop_type)
file_names.params[oead.aamp.Name(file).hash] = Parameter(file)
diffs.lists[file] = gen_diffs(ref_pio, mod_pio)
except (FileNotFoundError, KeyError, AttributeError):
continue
diffs.objects["Filenames"] = file_names
return diffs
:type file: class:`typing.Union[class:pathlib.Path, str]`
:param tmp_dir: The temp directory containing the mod
:type tmp_dir: class:`pathlib.Path`
:return: Returns a string representation of the AAMP file diff
"""
if isinstance(file, str):
nests = file.split('//')
mod_bytes = util.get_nested_file_bytes(file)
ref_path = str(util.get_game_file(
Path(nests[0]).relative_to(tmp_dir))) + '//' + '//'.join(nests[1:])
ref_bytes = util.get_nested_file_bytes(ref_path)
else:
with file.open('rb') as m_file:
mod_bytes = m_file.read()
mod_bytes = util.unyaz_if_needed(mod_bytes)
with util.get_game_file(file.relative_to(tmp_dir)).open('rb') as r_file:
ref_bytes = r_file.read()
ref_bytes = util.unyaz_if_needed(ref_bytes)
ref_aamp = aamp.Reader(ref_bytes).parse()
mod_aamp = aamp.Reader(mod_bytes).parse()
return _aamp_diff(ref_aamp, mod_aamp)
:rtype: dict of str: str
"""
if not hasattr(get_msbt_hashes, 'texthashes'):
get_msbt_hashes.texthashes = {}
if lang not in get_msbt_hashes.texthashes:
hash_table = util.get_exec_dir() / 'data' / 'msyt' / \
f'Msg_{lang}_hashes.csv'
if hash_table.exists():
get_msbt_hashes.texthashes[lang] = {}
with hash_table.open('r') as h_file:
csv_loop = csv.reader(h_file)
for row in csv_loop:
get_msbt_hashes.texthashes[lang][row[0]] = row[1]
elif util.get_game_file(f'Pack/Bootup_{lang}.pack').exists():
get_msbt_hashes.texthashes[lang] = {}
with util.get_game_file(f'Pack/Bootup_{lang}.pack').open('rb') as b_file:
bootup_pack = sarc.read_file_and_make_sarc(b_file)
msg_bytes = util.decompress(
bootup_pack.get_file_data(f'Message/Msg_{lang}.product.ssarc').tobytes())
msg_pack = sarc.SARC(msg_bytes)
for msbt in msg_pack.list_files():
get_msbt_hashes.texthashes[lang][msbt] = xxhash.xxh32(
msg_pack.get_file_data(msbt)).hexdigest()
return get_msbt_hashes.texthashes[lang]
else:
if (aoc_dir / 'Pack' / 'AocMainField.pack').exists():
with (aoc_dir / 'Pack' / 'AocMainField.pack').open('rb') as s_file:
map_pack = sarc.read_file_and_make_sarc(s_file)
if map_pack:
try:
map_bytes = map_pack.get_file_data(
f'Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}'
'.smubin'
).tobytes()
except KeyError:
map_bytes = None
if not map_bytes:
map_path = f'Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin'
try:
map_bytes = util.get_game_file(map_path, aoc=True).read_bytes()
except FileNotFoundError:
try:
map_bytes = util.get_game_file(map_path).read_bytes()
except FileNotFoundError:
with util.get_game_file('Pack/TitleBG.pack').open('rb') \
as s_file:
title_pack = sarc.read_file_and_make_sarc(s_file)
if title_pack:
try:
map_bytes = title_pack.get_file_data(
f'Map/MainField/{map_unit.section}/'
f'{map_unit.section}_{map_unit.type}.smubin'
).tobytes()
except KeyError:
map_bytes = None
if not map_bytes:
def get_stock_rstb() -> rstb.ResourceSizeTable:
""" Gets the unmodified RSTB """
if not hasattr(get_stock_rstb, 'table'):
get_stock_rstb.table = read_rstb(
str(util.get_game_file('System/Resource/ResourceSizeTable.product.srsizetable')),
True
)
return deepcopy(get_stock_rstb.table)
def get_stock_actorinfo() -> oead.byml.Hash:
actorinfo = util.get_game_file("Actor/ActorInfo.product.sbyml")
return oead.byml.from_binary(util.decompress(actorinfo.read_bytes()))
def get_stock_quests() -> oead.byml.Array:
title_sarc = oead.Sarc(util.get_game_file("Pack/TitleBG.pack").read_bytes())
return oead.byml.from_binary(
util.decompress(title_sarc.get_file("Quest/QuestProduct.sbquestpack").data)
)
def perform_merge(self):
merged_effects = util.get_master_modpack_dir() / "logs" / "effects.byml"
print("Loading status effect mods...")
diffs = self.consolidate_diffs(self.get_all_diffs())
if not diffs:
print("No status effect merging necessary...")
if merged_effects.exists():
merged_effects.unlink()
try:
stock_effects = util.get_nested_file_bytes(
(
str(util.get_game_file("Pack/Bootup.pack"))
+ "//Ecosystem/StatusEffectList.sbyml"
),
unyaz=False,
)
util.inject_file_into_sarc(
"Ecosystem/StatusEffectList.sbyml",
stock_effects,
"Pack/Bootup.pack",
)
del stock_effects
except FileNotFoundError:
pass
return
util.vprint("All status effect diffs:")
util.vprint(diffs)