Commit Graph
43 Commits
Author SHA1 Message Date
MagicBotandClaude Opus 5.5 b2e38bdc06 Support all .wpak files with a wpak target
Replaces the config target with wpak, which handles every known pak or a
single one named on the command line. Map icon .tga entries are stored
unencrypted (sb.exe 0xAACA60).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 11:55:10 -04:00
MagicBotandClaude Opus 5.5 8a8ebc5632 Document wpak support in README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 11:22:52 -04:00
MagicBotandClaude Opus 5.5 a312c9270a Add Config.wpak unpack, pack and test
A .wpak is a zip whose entries are each Blowfish CFB-64 encrypted with
a zero IV and the client's hardcoded key (sb.exe 0x54DEC0). Pure Python
Blowfish, no new dependencies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 11:22:52 -04:00
MagicBotandClaude Opus 5.5 a1ed572aca Fix item use flag bit order to match client
The client's use flag name table (sb.exe 0x16C9728) has None at bit 0,
so USE_SELF is bit 1 through EMPTY_NEWITEM at bit 4. Names in the JSON
were one bit low.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 09:47:38 -04:00
MagicBotandClaude Opus 5.5 d7e518bbd3 Note in README that unpack reads only plain-named caches
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:56:06 -04:00
MagicBotandClaude Opus 5.5 4286e886fc Remove JSON_CHANGES.md (moved to MBDATA)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:47:14 -04:00
MagicBotandClaude Opus 5.5 027b6e143f Fix ARCANE_DUMP folder name in README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:46:20 -04:00
MagicBotandClaude Opus 5.5 a29d00ce23 Document numbered pack/unpack output in README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:46:01 -04:00
MagicBotandClaude Opus 5.5 9005de76d9 Number output files and folders instead of overwriting
Pack now writes <Name>.cache, or <Name>.cache.1, .2, ... if that file
already exists (replaces the fixed .cache.new name). Unpack writes each
target folder under ARCANE_DUMP the same way, e.g. COBJECTS.1. The
output folder is created only after the cache loads, so a missing cache
does not leave an empty numbered folder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:43:40 -04:00
MagicBotandClaude Opus 5.5 7bcbed08a8 Accept unsigned values in signed fields when packing
Dumps made before the signed-read change store values like -1 as
4294967295. write_long now converts 2147483648..4294967295 to the
signed equivalent (same bytes), so existing community dumps still
pack. Verified: all 10332 files of an older dump repack identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:09:05 -04:00
MagicBotandClaude Opus 5.5 50d8d76a21 Document COBJECTS JSON format changes
List every field now read signed, the grant key hashing, the effect on
the sample cache, compatibility with older dumps, related parser fixes
and open items, for readers of the unpacked JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:06:08 -04:00
MagicBotandClaude Opus 5.5 ca4d2b2565 Hash grant attr and power keys, read grant values signed
Power and skill grants read every sub-array as (u32 key, int32 value)
(sb.exe 0x6D7640). Skill keys were already hashed; attr and power keys
now are too, and the values plus attribute/skill/resource amounts and
power action arguments are read signed. Shared pair read/write and key
hashing moved into helpers; load_json no longer mutates its input.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:55:04 -04:00
MagicBotandClaude Opus 5.5 0adbfe0d99 Read client signed int32 fields as signed
Add ResStream.read_long/write_long and use them for every CObjects
field the client loads with ResStream_ReadInt32 (sb.exe 0x7E1700)
as a value: rank info, attribute/skill/resource amounts, requirements,
door/deed/container/key fields, natural attacks, hardpoints, sound
event types and sparse VAL_LONG (LoadSaveBehavior<long>). Hash/enum
fields, list counts and flag words keep unsigned reads.

The binary is unchanged; JSON now shows e.g. -1 instead of 4294967295
(rank_hirelings, rank_rank) and -10 instead of 4294967286 (attr_adj).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:55:04 -04:00
MagicBotandClaude Opus 5.5 6a8598f33f Fix ArcContainerObject save_binary and load_json
save_binary called stream.read_dword(value) instead of write_dword,
so packing any container raised a TypeError. load_json called
super().load_json() without data, so the item base never loaded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:53:31 -04:00
MagicBotandClaude Opus 5.5 2008697d6c Fail on unsupported asset template trigger objects
When the bool after USE_TRIGGER / LOOT_TRIGGER is set, the client
(sb.exe 0xC46DE0) instantiates a trigger object by name and loads
extra data from the stream. The parser silently ignored the branch,
which would desync the rest of the template. Raise instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:42:57 -04:00
MagicBotandClaude Opus 5.5 7da18716a8 Fix sparse MerchantData write size
The client loads MerchantData as ArcCacheID + ArcCacheID + int32
(20 bytes, sb.exe 0x4859B0). save_binary wrote the final field as a
qword, corrupting any packed object carrying merchant sparse data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:42:57 -04:00
MagicBot 75efa29012 helper and groupee are not hashes. They correspond to the group type on the rune. 2024-04-04 14:46:59 -04:00
MagicBot 834f8f6d8d rune and item skill grant sub arrays are now hashed 2024-04-03 16:07:13 -04:00
MagicBot 89faf12277 mbEditorPro 2.1 2024-03-30 10:44:19 -04:00
MagicBot 1fb6336c39 Update 'mbEditorPro2.0/README.md' 2023-01-01 00:47:51 +00:00
MagicBot 35c25ccc55 Update 'README.md' 2023-01-01 00:46:05 +00:00
MagicBot 0db4750d1c Update 'README.md' 2022-12-31 16:52:03 +00:00
MagicBot 6bc7e3ecd8 Show progress bar when unpacking files. 2022-12-31 11:49:00 -05:00
MagicBot 2e62063c14 README updated 2022-12-25 09:51:53 -05:00
MagicBot a4f75ee1b5 README updated 2022-12-25 09:50:19 -05:00
MagicBot cbd1b579ae README updated 2022-12-25 09:24:38 -05:00
MagicBot 4ca95d2a17 README updated 2022-12-25 09:22:47 -05:00
MagicBot 282d644580 README updated 2022-12-25 09:19:42 -05:00
MagicBot 738de28858 README updated 2022-12-25 09:14:11 -05:00
MagicBot 11a7a21630 README updated 2022-12-25 09:13:06 -05:00
MagicBot 7ac814ab03 README updated 2022-12-25 08:52:21 -05:00
MagicBot 942b33a252 mbEditorPro2.0 release 2022-12-25 08:47:00 -05:00
MagicBot 30375c8413 Removed ArcaneDump from repo. 2022-12-25 07:44:20 -05:00
MagicBot 8f994b6940 README updated with dump availability. 2022-10-11 07:35:25 -04:00
MagicBot 511a36b1f7 Dumps were moved out of project directory.
Zone data was added.
2022-10-11 07:32:35 -04:00
MagicBot 281929affa LICENSE copied to subfolder. 2022-10-11 00:21:10 -04:00
MagicBot f6c049039c Typo fixed. 2022-10-10 13:11:02 -04:00
MagicBot 65bc566fd4 Initial source push. mbEditorPro v1.0 2022-10-10 13:06:07 -04:00
MagicBot 1218f843cb Update header. 2022-10-10 08:27:36 -04:00
MagicBot b771bdbb02 Initial push. README and LICENSE files. 2022-10-10 08:01:39 -04:00
MagicBot 4ffe65e3bd Update 'README.md' 2022-05-02 17:48:06 +00:00
MagicBot 086155e5fc Update 'README.md' 2022-05-02 17:46:35 +00:00
MagicBot e171ab9968 Initial commit 2022-05-02 17:42:15 +00:00