[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