This release combines months of work on improving existing components and adding requested features.
General
- The project has been renamed to `katsuba`.
- The Python bindings are now available as `katsuba` on PyPI for all relevant x86, x86_64 and AArch64 platforms.
- All crates now return proper error types instead of `anyhow::Result`.
Flake
- `nix build .katsuba-py` can now be used to build the Python bindings.
CLI
- A threadpool is now used for heavy I/O tasks. Performance gain has been measured on all tested platforms.
- The environment variable `KATSUBA_WORKER_THREADS` can be used to tweak the amount of threads in the pool.
- **WARNING:** More is not better and unless you know what you are doing just stick to the default configuration.
- Various subcommands now support logging at different verbosities using the `-v` option.
- Most commands now support glob patterns to process many input files at once.
- Reading input from stdin is now supported by using `-` in place of an input file path.
- A compact JSON representation will be emitted when `katsuba` output is piped into another application.
ClientSig
- A new crate `katsuba-client-sig` was introduced.
- Support for reading and dumping `ClientSig.bin` files from the game was added.
- This requires KingsIsle's private key which must be provided by the user.
- Appropriate CLI commands were added.
BCD
- Parsing errors were fixed.
- Structure was changed to match the actual file representation closer.
Python
- WAD archives now allow direct deserialization of ObjectProperty values without copying file contents between Rust and Python.
- ObjectProperty lists and objects now resolve their values lazily on access instead of converting the full object to a Python dict
immediately after deserialization.
- All the compound leaf types like `Euler`, `Quaternion`, `Color` now have a Pythonic object representation and can be told apart
from each other when encountered.
- This has been possible before too but it required knowledge of the deserialized class layout since all these compounds were
represented as tuples.
- `from katsuba.module import X` imports now work without raising an exception.
- The common KingsIsle hash functions from `katsuba-utils` are now accessible from Python.
- Support for NAV, POI, BCD has been preliminarily removed until we build a better object representation for them.
- Demand for those has never been high so I don't think they will be missed at the time being.
POI
- Parsing errors were fixed.
- Structure was changed to match the actual file representation closer.
Types
- Support for [wiztype](https://github.com/wizspoil/wiztype) JSONs in all formats was added.
- Katsuba automatically detects which one you supply.
ObjectProperty
- Support for `CoreObject` deserialization has been removed because it is too inconsistent and gets outdated.
- Users are encouraged to deserialize via library usage if this functionality is needed.
- `Value` has been shrunk to a size of 32 bytes.
- `Value::Object` now provides the type hash of the object so library users have access to this info.
- One reusable `Serializer` instance now provides all functionality.
- Support for guessing configuration based on an object's data was added.
- This does not reliably detect every case but it's a good enough starting point for reversing unknown objects.
- An appropriate CLI command has been added.
WAD
- Archives now report their UNIX file permissions, if available.
- The extractor uses this info to create files with the same permissions as the archive they originate from.
- `GlobIter` has been added to iterate over a subset of an archive's files given a glob pattern.
As always, a Windows build is attached below. Enjoy!