0.0.1 - Initial release
Pre-release
Pre-release
This is initial GORO Patcher release.
It works, but this release is for testing purposes and feedback collection.
Features
- GRF 2.0 read/write/merge — full format implementation with 46-byte header (rAthena layout), zlib-compressed file table, EUC-KR filename decoding
- GRF patching — merge
.grffiles directly or extract.zipcontents into target GRF - Raw patching — extract zip files to game directory with backup support
- HTTP downloader — resume support (Range headers), retry with backoff, xxhash64 verification
- Self-update — patcher can update itself from manifest
- Process detection — checks if game is running before patching
- State machine — clean state transitions (idle → checking → downloading → patching → ready/error)
- Polling-based progress — real-time progress via
GetProgress()bound method - Crash recovery — atomic GRF save,
.bakrestoration, re-download on hash failure - Auto-check on start — patcher checks for updates automatically on launch
- Cross-platform builds —
scripts/build.sh(Linux/cross-compile) andscripts/build.bat(native Windows) - Hash tool —
hashfilecommand for generating XXHash64 hashes for manifest - Patch validation — patcher validates applied patches against manifest on start
- Repair — redownload and reapply from first mismatching patch when corruption detected
Technical
- Stack: Go + Wails v3 + vanilla HTML/CSS/JS
- GRF format: 46-byte header,
FileTableOffsetrelative to header end (SEEK_CUR), data blocks before file table - Version tracking: patch ID = version, stored in
goro-patch.jsonwith patch metadata, no separate version field in manifest - Config:
goro-config.jsonwithmanifest_urlandexe_name - Manifest:
plist.jsonwithpatch_base_urland patches array - File encoding: EUC-KR filenames decoded to UTF-8 via
golang.org/x/text/encoding/korean
Project Structure
- Source code in
src/directory - Build output to
build/directory - Documentation in
doc/ - Build script
build.shfor Linux and Windows
