Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions engines/agds/decrypt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
key = bytes(map(lambda c: ord(c), 'Vyvojovy tym AGDS varuje: Hackerovani skodi obchodu!'))
key_n = len(key)

def decrypt(src):
r = bytearray()
for i in range(len(src)):
r.append(src[i] ^ key[i % key_n] ^ 0xff)
return r
46 changes: 46 additions & 0 deletions engines/agds/unpack-db
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env python3

from argparse import ArgumentParser
from struct import unpack
import sys
import os.path
from decrypt import decrypt

argparser = ArgumentParser('Unpack ADB file')
argparser.add_argument('file')
args = argparser.parse_args()

with open(args.file, "rb") as f:
data = bytearray(f.read())

size = len(data)
magic, h1, h2, h3, h4 = unpack('<IIIII', data[:0x14])
if magic != 666:
raise Exception('invalid db magic', magic)

db_name, _ = os.path.splitext(os.path.basename(args.file))
try:
os.makedirs(db_name)
except:
pass

print('header', h1, h2, h3, h4)

data_offset = h2 * 0x28 + 0x14
print('data offset: 0x%08x' %(data_offset))
for i in range(h3):
offset = 0x14 + i * 0x28
entry = data[offset: offset + 0x28]
name_end = entry.index(bytes([0]), 4)
name = str(entry[4: name_end], 'utf-8')
index, = unpack('<I', entry[0:4])
size, = unpack('<I', entry[0x24:])
print(repr(name), hex(index), hex(data_offset + index), size)

entry_data = data[data_offset + index: data_offset + index + size]
with open(os.path.join(db_name, name + '.dec'), 'wb') as fo:
fo.write(decrypt(entry_data))

with open(os.path.join(db_name, name), 'wb') as fo:
fo.write(entry_data)

48 changes: 48 additions & 0 deletions engines/agds/unpack-grp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/usr/bin/env python3

from argparse import ArgumentParser
from struct import unpack
from decrypt import decrypt

import sys
import os.path

argparser = ArgumentParser('unpack GRP file')
argparser.add_argument('file')
args = argparser.parse_args()


f = open(args.file, "rb")

header = bytes(f.read(0x2c))
grp_dir = bytes(f.read(0x31))

id = decrypt(header[0:0x10])
if id != bytes('AGDS group file\x1a', 'ascii'):
raise Exception('invalid header', id)

version1, magic, version2 = unpack('<III', header[0x10:0x1c])
if magic != 0x1a03c9e6 or version1 != 44 or version2 != 2:
raise Exception("unsupported version")
dir_count, _dc2, _unk14, _unk18 = unpack('<IIII', header[0x1c:])

dir_data = bytearray(f.read(0x31 * dir_count))

gfx_name, _ = os.path.splitext(os.path.basename(args.file))
try:
os.makedirs(gfx_name)
except:
pass

for offset in range(0, dir_count * 0x31, 0x31):
entry = dir_data[offset: offset + 0x31]
name_len = entry.index(bytes([0]))
if name_len == 0:
break
name = str(decrypt(entry[:name_len]), "utf-8")
offset, size, _unk1, _unk2 = unpack('<IIII', entry[0x21:])
f.seek(offset)

print("writing file %s" %name)
with open(os.path.join(gfx_name, name), "wb") as fo:
fo.write(f.read(size))