Switch平台的Arcaea打包与解包(Python)

解包(Unpack)
#Arcaea Switch unpacker
#将py文件,arc.pack,arc.json放于同一文件夹中,运行py文件即可生成pack文件夹。
#有bug务必联系我!
import json
import os
JSON=open("arc.json")
JSON=json.load(JSON)
JSON=JSON["Groups"]
PACK=open("arc.pack","rb")
for group in JSON:
if not os.path.exists("pack/"+group["Name"]):
os.makedirs("pack/"+group["Name"])
for entry in group["OrderedEntries"]:
offset = entry["Offset"]
length = entry["Length"]
originalfilename = entry["OriginalFilename"]
PACK.seek(offset,0)
data=PACK.read(length)
PATH="pack/"+group["Name"]+"/"+originalfilename
if not os.path.exists(os.path.dirname(PATH)):
os.makedirs(os.path.dirname(PATH))
output=open(PATH,"wb")
output.write(data)
print(PATH)

打包(Pack)
#Arcaea Switch packer
#将py文件与pack文件夹放于同一文件夹中,运行py文件即可生成arc.pack和arc.json。
#有bug务必联系我!
import os
import json
GLOBAL_OFFSET=0
Groups=[]
Dir=["startup","audio_init","buttons","mainmenu","topbar","base_shutters","jackets_large","jackets_small","packs","charts","songselect_bgs","character_sprites","not_large_png","not_large_jpg","not_audio_or_images","audio_wav","not_audio","Fallback"]
def hex_align(data,GLOBAL_OFFSET):
data = bytearray(data)
while len(data) % 16 != 0:
data.append(0)
GLOBAL_OFFSET+=1
data = bytes(data)
return data,GLOBAL_OFFSET
output_pack = open("arc.pack","wb+")
for i in Dir:
if i not in os.listdir("pack"):
os.mkdir("pack/"+i)
for d in os.listdir("pack"):
group={}
OrderedEntries = []
group["Name"] = d
group["Offset"] = GLOBAL_OFFSET
for root,dirs,files in os.walk("pack/"+d):
for f in files:
entry={}
PATH=os.path.join(root,f)
file = open(PATH,"rb")
data = file.read()
entry["OriginalFilename"] = PATH.lstrip("pack/").lstrip(d).lstrip("/")
entry["Offset"] = GLOBAL_OFFSET
entry["Length"] = len(data)
GLOBAL_OFFSET+=len(data)
OrderedEntries.append(entry)
data,GLOBAL_OFFSET=hex_align(data,GLOBAL_OFFSET)
output_pack.write(data)
print(PATH)
group["Length"]=GLOBAL_OFFSET-group["Offset"]
group["OrderedEntries"]=OrderedEntries
Groups.append(group)
JSON={}
JSON["Groups"]=Groups
with open("arc.json","w",newline="\n") as output_json:
output_json.write(json.dumps(JSON,indent=1))
print("COMPLETE!")