mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-08-21 13:36:52 -04:00
Implement support for building forest_1st.arc, forest_2nd.arc
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import pyjkernel
|
||||
import os
|
||||
import argparse
|
||||
|
||||
def unpack_dir(archive: pyjkernel.JKRArchive, dir: str, verbose=False):
|
||||
if verbose:
|
||||
print('Dumping dir: ' + dir)
|
||||
# create all files
|
||||
for file in archive.list_files(dir):
|
||||
if verbose:
|
||||
print('Dumping file: ' + file.name)
|
||||
with open(os.path.join(dir, file.name), "wb") as f:
|
||||
f.write(archive.get_file(dir + "/" + file.name).data)
|
||||
|
||||
# create all subdirectories and recurse through them
|
||||
for subdir in archive.list_folders(dir):
|
||||
if not os.path.exists(dir + "/" + subdir):
|
||||
os.mkdir(dir + "/" + subdir)
|
||||
unpack_dir(archive, dir + "/" + subdir, verbose)
|
||||
|
||||
|
||||
def unpack_archive(path: str, out_path: str, verbose=False):
|
||||
archive = pyjkernel.from_archive_file(path, True)
|
||||
orig_dir = os.path.abspath(os.curdir)
|
||||
os.chdir(out_path)
|
||||
if not os.path.exists(archive.root_name):
|
||||
os.mkdir(archive.root_name)
|
||||
unpack_dir(archive, archive.root_name, verbose)
|
||||
os.chdir(orig_dir)
|
||||
|
||||
def pack_dir(archive: pyjkernel.JKRArchive, path: str, verbose=False):
|
||||
local_path = os.path.dirname(path)
|
||||
orig_dir = os.path.abspath(os.curdir)
|
||||
if local_path != "":
|
||||
os.chdir(local_path)
|
||||
local_root = os.path.basename(os.path.normpath(path))
|
||||
|
||||
for root, dirs, files in os.walk(local_root):
|
||||
files.sort(key=lambda item: (item.lower(), item))
|
||||
for dir in dirs:
|
||||
archive.create_folder(root + "/" + dir)
|
||||
|
||||
for file in files:
|
||||
if verbose:
|
||||
print('Packing file: ' + root + '/' + file)
|
||||
with open(root + "/" + file, "rb") as f:
|
||||
archive.create_file(root + "/" + file, bytearray(f.read()), pyjkernel.JKRPreloadType.ARAM)
|
||||
os.chdir(orig_dir)
|
||||
|
||||
def pack_archive(root_path: str, out_path: str, verbose=False):
|
||||
root_name = os.path.basename(os.path.normpath(root_path))
|
||||
archive = pyjkernel.create_new_archive(root_name)
|
||||
pack_dir(archive, root_path, verbose)
|
||||
pyjkernel.write_archive_file(archive, out_path, True, pyjkernel.jkrcomp.JKRCompression.NONE, 0)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Pack or unpack JSystem JKernel archives.')
|
||||
parser.add_argument('-v', help='Enable verbose logging.', required=False, action='store_true')
|
||||
parser.add_argument('path', help='The path of the folder to pack or archive file to unpack.')
|
||||
parser.add_argument('out', help='The path of the destination folder or file.')
|
||||
|
||||
args = parser.parse_args()
|
||||
if os.path.isfile(args.path):
|
||||
unpack_archive(args.path, args.out, args.v)
|
||||
elif os.path.isdir(args.path):
|
||||
pack_archive(args.path, args.out, args.v)
|
||||
else:
|
||||
raise Exception('path is not a valid file or directory!')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user