Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def merge_drop_file(file: str, drop_table: dict):
base_path = file[: file.index("//")]
sub_path = file[file.index("//") :]
try:
ref_drop = _drop_to_dict(
ParameterIO.from_binary(
util.get_nested_file_bytes(str(util.get_game_file(base_path)) + sub_path)
)
)
for table in set(ref_drop.keys()):
if table not in drop_table:
del ref_drop[table]
else:
for item in set(ref_drop[table]["items"].keys()):
if item not in drop_table[table]["items"]:
del ref_drop[table]["items"][item]
util.dict_merge(ref_drop, drop_table)
drop_table = ref_drop
except (FileNotFoundError, AttributeError, RuntimeError):
pass
actor_name = re.search(r"Pack\/(.+)\.sbactorpack", file).groups()[0]
pio = _dict_to_drop(drop_table)
util.inject_files_into_actor(actor_name, {file.split("//")[-1]: pio.to_binary()})
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
def get_aamp_diff(file: Union[Path, str], tmp_dir: Path):
"""
Diffs a modded AAMP file from the stock game version
:param file: The modded AAMP file to diff
: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)
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
def get_aamp_diff(file: Union[Path, str], tmp_dir: Path):
"""
Diffs a modded AAMP file from the stock game version
:param file: The modded AAMP file to diff
: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)
def log_drop_file(file: str, mod_dir: Path):
drop = ParameterIO.from_binary(util.get_nested_file_bytes(str(mod_dir) + "/" + file))
drop_table = _drop_to_dict(drop)
del drop
try:
base_file = file[: file.index("//")]
sub_file = file[file.index("//") :]
ref_drop = ParameterIO.from_binary(
util.get_nested_file_bytes(str(util.get_game_file(base_file)) + sub_file)
)
ref_table = _drop_to_dict(ref_drop)
del ref_drop
for table, contents in drop_table.items():
if table not in ref_table:
continue
for item, prob in {
(i, p)
for i, p in contents["items"].items()
def get_stock_eventinfo() -> {}:
""" Gets the contents of the stock `EventInfo.product.sbyml` """
if not hasattr(get_stock_eventinfo, 'event_info'):
get_stock_eventinfo.event_info = byml.Byml(
util.get_nested_file_bytes(
str(util.get_game_file('Pack/Bootup.pack')) + '//Event/EventInfo.product.sbyml',
unyaz=True
)
).parse()
return deepcopy(get_stock_eventinfo.event_info)
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:")