1
0
mirror of synced 2024-11-12 01:00:46 +01:00

Fix AFP extract always decompiling and writing code, fix colors off on some textures for some games.

This commit is contained in:
Jennifer Taylor 2023-07-30 17:55:59 +00:00
parent 6ce7ad8f60
commit 8efe913ad5
2 changed files with 12 additions and 7 deletions

View File

@ -527,14 +527,17 @@ class TXP2File(TrackedCoverage, VerboseOutput):
# Since the AFP file format can be found in both big and little endian, its # Since the AFP file format can be found in both big and little endian, its
# possible that some of these loaders might need byteswapping on some platforms. # possible that some of these loaders might need byteswapping on some platforms.
# This has been tested on files intended for X86 (little endian). # This has been tested on files intended for X86 (little endian). I've found that
# the "correct" thing to do is always treat data as little-endian instead of the
# determined endianness of the file. But, this could also be broken per-game, so
# I'm not entirely sure this is fully possible to do generically.
if fmt == 0x0B: if fmt == 0x0B:
# 16-bit 565 color RGB format. Game references D3D9 texture format 23 (R5G6B5). # 16-bit 565 color RGB format. Game references D3D9 texture format 23 (R5G6B5).
newdata = [] newdata = []
for i in range(width * height): for i in range(width * height):
pixel = struct.unpack( pixel = struct.unpack(
f"{self.endian}H", "<H",
raw_data[(64 + (i * 2)) : (66 + (i * 2))], raw_data[(64 + (i * 2)) : (66 + (i * 2))],
)[0] )[0]
@ -581,7 +584,7 @@ class TXP2File(TrackedCoverage, VerboseOutput):
newdata = [] newdata = []
for i in range(width * height): for i in range(width * height):
pixel = struct.unpack( pixel = struct.unpack(
f"{self.endian}H", "<H",
raw_data[(64 + (i * 2)) : (66 + (i * 2))], raw_data[(64 + (i * 2)) : (66 + (i * 2))],
)[0] )[0]
@ -661,7 +664,7 @@ class TXP2File(TrackedCoverage, VerboseOutput):
newdata = [] newdata = []
for i in range(width * height): for i in range(width * height):
pixel = struct.unpack( pixel = struct.unpack(
f"{self.endian}H", "<H",
raw_data[(64 + (i * 2)) : (66 + (i * 2))], raw_data[(64 + (i * 2)) : (66 + (i * 2))],
)[0] )[0]

View File

@ -26,7 +26,7 @@ from bemani.format.afp import (
from bemani.format import IFS from bemani.format import IFS
def write_bytecode(swf: SWF, directory: str, *, verbose: bool) -> None: def decompile_and_write_bytecode(swf: SWF, directory: str, *, verbose: bool) -> None:
# Actually place the files down. # Actually place the files down.
os.makedirs(directory, exist_ok=True) os.makedirs(directory, exist_ok=True)
@ -103,6 +103,7 @@ def extract_txp2(
write_mappings: bool = False, write_mappings: bool = False,
write_raw: bool = False, write_raw: bool = False,
write_binaries: bool = False, write_binaries: bool = False,
write_bytecode: bool = False,
pretend: bool = False, pretend: bool = False,
verbose: bool = False, verbose: bool = False,
) -> int: ) -> int:
@ -312,7 +313,7 @@ def extract_txp2(
announced[texturename] = True announced[texturename] = True
if write_bytecode: if write_bytecode:
for swf in afpfile.swfdata: for swf in afpfile.swfdata:
write_bytecode(swf, output_dir, verbose=verbose) decompile_and_write_bytecode(swf, output_dir, verbose=verbose)
return 0 return 0
@ -414,7 +415,7 @@ def decompile_afp(afp: str, bsi: str, output_dir: str, *, verbose: bool = False)
# Now, decompile it # Now, decompile it
swf.parse(verbose=verbose) swf.parse(verbose=verbose)
write_bytecode(swf, output_dir, verbose=verbose) decompile_and_write_bytecode(swf, output_dir, verbose=verbose)
return 0 return 0
@ -1375,6 +1376,7 @@ def main() -> int:
write_mappings=args.write_mappings, write_mappings=args.write_mappings,
write_raw=args.write_raw, write_raw=args.write_raw,
write_binaries=args.write_binaries, write_binaries=args.write_binaries,
write_bytecode=args.write_bytecode,
pretend=args.pretend, pretend=args.pretend,
verbose=args.verbose, verbose=args.verbose,
) )