- Replace bash with cmd for all Windows runner steps
- Use setlocal enabledelayedexpansion for variable expansion
- Use findstr for string matching instead of bash [[ ]]
- Use xcopy/copy instead of cp
- Use powershell inline for sed-like regex replacements
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add debug output to diagnose build failures
- Handle empty directories gracefully with || true
- Add fallback for app.app -> XPlor.app rename on macOS
- Check for non-empty directories before glob copy
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bash is now available on the Windows runner. Reverted all PowerShell
(pwsh) steps back to bash for consistency across platforms.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Windows runner doesn't have bash in PATH. Convert the "Extract
version info" steps in build-windows and deploy jobs from bash to
PowerShell (pwsh) syntax.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Triggers on tags: v1.0.0 (stable), v1.0.0-alpha1 (alpha), v1.0.0-test1 (tester)
- Builds on Windows, macOS, and Linux in parallel
- Creates offline and online installers for each platform
- Deploys repository to P:\repository\{channel}
- Creates Gitea release with all installers
Outputs:
- XPlor-{version}-Windows-Setup.exe / Online.exe
- XPlor-{version}-macOS-Setup.dmg / Online.dmg
- XPlor-{version}-Linux-Setup.run / Online.run
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds linux-g++ build with:
- System dependencies: build-essential, libgl1-mesa-dev, zlib1g-dev
- Searches common Qt installation paths for gcc_64
Requires an Ubuntu runner with label "ubuntu" and Qt installed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The zlib directory was incorrectly listed as "unused" in .gitignore,
but it's required by app.pro for Windows builds. Added exception
patterns for third-party libraries.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The CLI tool was missing the system zlib linkage that app.pro already had,
causing undefined symbol errors for zlib functions on macOS.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- DevIL, bundled zlib, and xcompress64 only linked on Windows
- macOS/Linux use system zlib (-lz)
- DLL deployment only on Windows
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The xcompress.h header and XMem compression functions require Windows.h
and the Xbox SDK, which are not available on macOS. Wrap all XMem
functions with #ifdef Q_OS_WIN and provide stub implementations that
return empty data on non-Windows platforms.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ci.yml: Build on every push (for testing)
- release.yml: Full release pipeline on version tags
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major UI improvements across the application:
MainWindow:
- Integrate undo stack for field editing
- Dirty state tracking with tab title indicators (*)
- Save/SaveAs prompts on tab close with unsaved changes
- Export menu integration in tab context menu
- Tab management: close all, close left/right of current tab
- Connect export system to tree widget signals
XTreeWidget:
- Add context menus for tree items
- Quick export action for immediate saves
- Export dialog action for format options
- Raw data export for any item
- Batch export for containers
XTreeWidgetItem:
- Add modified state tracking with visual indicator
- Support for marking items as dirty
ImagePreviewWidget:
- Enhanced image display and navigation
- Improved zoom and pan controls
TreeBuilder:
- Better handling of nested data structures
- Improved child node generation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Extend CLI with comprehensive file parsing capabilities:
New parse command:
- Parse binary files using XScript definitions
- Auto-detect file type or force specific type with -t option
- Output formats: JSON, tree, or table view
Output options:
- JSON (-f json): Machine-readable structured output
- Tree (-f tree): Hierarchical view with colored output
- Table (-f table): Compact tabular format
Additional features:
- Verbose mode (-v) to show hidden fields
- Warnings-only mode (-w) to show blank/zero values
- Nested data expansion in tree view
- Hex formatting for addresses and hashes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement a unified export system for extracting data from parsed files:
ExportManager (singleton):
- Centralized export handling for all content types
- Content type detection (image, audio, video, text, binary)
- Batch export support with progress tracking
Format-specific export dialogs:
- ImageExportDialog: PNG, JPEG, BMP, TGA with quality options
- AudioExportDialog: WAV, MP3, OGG with FFmpeg integration
- BinaryExportDialog: Raw data export with optional decompression
- BatchExportDialog: Recursive export with filtering options
- Base ExportDialog class for common functionality
Settings additions:
- FFmpeg path configuration with auto-detection
- Search common install locations and PATH
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement infrastructure for editing parsed binary fields:
FieldEditCommand (QUndoCommand):
- Undo/redo support for field value changes
- Stores old and new values with field metadata
- Integrates with Qt's undo stack
DirtyStateManager:
- Tracks modified state per-tab
- Emits signals when dirty state changes
- Enables save prompts and tab indicators
ScriptTypeEditorWidget enhancements:
- Add recompilation debouncing (300ms) for responsive editing
- Build form layout only for fields with values (skip unexecuted branches)
- Support edit signals for modified fields
- Improved table and form layout building
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major improvements to VPP, PEG, and ASM parsers:
vpp.xscript:
- Support all VPP versions (4-10) for Saints Row 1-4 and Red Faction
- Add container type detection (str2, packfile, etc.)
- Improved compression handling (zlib, LZO, auto-detection)
- Better recursive parsing of nested archives
peg.xscript:
- Full PEG texture container parsing
- Support for multiple texture formats (DXT1, DXT3, DXT5, etc.)
- Xbox 360 and PC format variants
asm.xscript:
- Animation state machine container parsing
New format definitions:
- anim.xscript: Animation data
- audio.xscript: Audio containers (bank files)
- mesh.xscript: 3D mesh geometry
- morph.xscript: Morph targets
- rig.xscript: Skeletal rigs
- sim.xscript: Simulation data
- zone.xscript: Level zone data
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
XScript definitions for Dead Rising 2 (Xbox 360) file formats:
- big.xscript: Main archive format with LZX-compressed entries
- tex.xscript: Texture files
- anm.xscript: Animation files
- bcf.xscript, bcs.xscript, bct.xscript: Character format files
- bin.xscript: Generic binary containers
- bik.xscript: Bink video references
- havok.xscript: Havok physics data
The .big archive parser uses deadrising_lzx() to decompress entries
and recursively parses nested archives.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Introduce operation journaling to track how values are read from the
binary stream, enabling future write-back of edited fields.
New components:
- OperationJournal: Records read operations with stream offsets, sizes,
byte order, and original values during parsing
- ReverseEval: Analyzes expressions for invertibility (e.g., x+5 can be
reversed to compute the source field when editing the result)
- Recompiler: Infrastructure for recompiling modified values back to
binary format
Interpreter enhancements:
- Add runTypeInternalWithJournal() for journaled parsing
- Journal scalar reads, byte reads, strings, skip/seek operations
- Add deadrising_lzx() built-in for Dead Rising 2 LZX decompression
- Support _deadrising_lzx_stem context variable for nested archives
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Integrate libmspack's LZX decompressor for Xbox 360 and UE-style
compressed data. This replaces the need for external xcompress64.dll
which was hanging/crashing on certain files.
- Add mspack/ library (lzxd.c decompressor with Gildor's fixes)
- Implement memory-based mspack_system for in-memory decompression
- Support multiple LZX formats: raw streams, Xbox 360 block format,
and Dead Rising 2's per-block format with 4-byte size headers
- Add DecompressDeadRisingLZX() with per-block independent contexts
to handle the block-based compression correctly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Stripped all platform-specific COD test files (360, PC, PS3, Wii, WiiU).
Will rebuild test suite later with new approach.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Pauses and shows what will be published, requires y/Y to proceed.
If declined, exits gracefully with local files still available.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Calls claude.exe --print with git log to generate professional
release notes. Falls back to basic git log format if unavailable.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Volition VPP: Unified BE/LE types using inheritance pattern
- THQA PAK: Child types now inherit byte order from parent
- Various XScript definition updates and fixes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>