[Scummvm-git-logs] scummvm-tools master -> 14de6343a7bef799fb32ad4d0cf16b20cdd75ed3
sev-
noreply at scummvm.org
Mon May 18 15:53:17 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm-tools' repo located at https://api.github.com/repos/scummvm/scummvm-tools .
Summary:
14de6343a7 AGDS: add tools
Commit: 14de6343a7bef799fb32ad4d0cf16b20cdd75ed3
https://github.com/scummvm/scummvm-tools/commit/14de6343a7bef799fb32ad4d0cf16b20cdd75ed3
Author: Vladimir Menshakov (vladimir.menshakov at gmail.com)
Date: 2026-05-18T17:53:13+02:00
Commit Message:
AGDS: add tools
Add unpackers for database (.db) and resources (.grp)
Changed paths:
A engines/agds/decrypt.py
A engines/agds/unpack-db
A engines/agds/unpack-grp
diff --git a/engines/agds/decrypt.py b/engines/agds/decrypt.py
new file mode 100644
index 00000000..a924315d
--- /dev/null
+++ b/engines/agds/decrypt.py
@@ -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
diff --git a/engines/agds/unpack-db b/engines/agds/unpack-db
new file mode 100755
index 00000000..6544f399
--- /dev/null
+++ b/engines/agds/unpack-db
@@ -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)
+
diff --git a/engines/agds/unpack-grp b/engines/agds/unpack-grp
new file mode 100755
index 00000000..598a0c66
--- /dev/null
+++ b/engines/agds/unpack-grp
@@ -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))
More information about the Scummvm-git-logs
mailing list