-
Notifications
You must be signed in to change notification settings - Fork 8
Avalonia GUI
FEBuilderGBA includes a cross-platform GUI built with Avalonia UI (v11.2.3), enabling ROM editing on Linux, macOS, and Windows without requiring WinForms. The Avalonia frontend follows the MVVM pattern and currently covers approximately 93% of the WinForms feature set.
| Platform | Architecture | Status |
|---|---|---|
| Windows 10/11 | x64 | Fully supported |
| Linux (Ubuntu, Fedora, etc.) | x64 | Fully supported |
| macOS | arm64 (Apple Silicon) | Fully supported |
| macOS | x64 (Intel) | Supported via Rosetta 2 or native build |
| Android | arm64 / x86_64 | Experimental native APK — builds + emulator-validated render parity (see Native Android) |
| iOS / iPadOS | arm64 | Experimental native .ipa — builds on macOS (Xcode 26.5); on-device runtime maturing (see Native iOS) |
# Build and run directly
dotnet run --project FEBuilderGBA.Avalonia/FEBuilderGBA.Avalonia.csproj
# Or build first, then run the executable
dotnet build FEBuilderGBA.Avalonia/FEBuilderGBA.Avalonia.csproj
./FEBuilderGBA.Avalonia/bin/Debug/net9.0/FEBuilderGBA.Avalonia
# Open a specific ROM
dotnet run --project FEBuilderGBA.Avalonia/FEBuilderGBA.Avalonia.csproj -- --rom path/to/rom.gbaThe CLI works on all platforms independently of the GUI:
dotnet run --project FEBuilderGBA.CLI/FEBuilderGBA.CLI.csproj -- --help
dotnet run --project FEBuilderGBA.CLI/FEBuilderGBA.CLI.csproj -- --version
dotnet run --project FEBuilderGBA.CLI/FEBuilderGBA.CLI.csproj -- --rom rom.gba --lintSee Command-Line Interface for full CLI documentation.
Pre-built self-contained binaries are available from CI for each platform:
# Publish locally
scripts/publish-all.sh # Produces cli-{rid} and avalonia-{rid} artifactsEvery view (.axaml) has a corresponding ViewModel (.cs). All ViewModels inherit from ViewModelBase. Views define UI layout; ViewModels hold state and command logic.
FEBuilderGBA.Avalonia/
+-- Views/ # 357 AXAML view files
+-- ViewModels/ # 367 ViewModel classes
+-- Controls/ # 7 shared reusable controls
+-- Services/ # Platform services (undo, dialogs, image export/import)
+-- Dialogs/ # File/message dialog helpers
+-- App.axaml # Application entry point
+-- Program.cs # Startup and ROM initialization
| Control | Description |
|---|---|
AddressListControl |
Reusable list for ROM address entries with selection and navigation |
GbaImageControl |
Reusable GBA image display control with zoom and palette support |
BitFlagPanel |
Reusable 8/16/32-bit flag toggle panel |
EditorTopBar / EditorTopBarWithInputs
|
Shared editor top bar (Jump / Pick / navigation) |
IconPreviewControl |
Reusable icon / wait-icon preview control |
IdFieldControl |
Type-ID field: label + NumericUpDown + name preview + Jump + Pick (#366) |
| Service | Description |
|---|---|
UndoService |
Wraps Core undo system for all write operations |
WindowManager |
Editor window lifecycle, pick-and-return navigation |
ImageExportService |
Export GBA images to PNG/BMP |
ImageImportService |
Import images with palette validation |
PatchDetectionService |
Detect installed patches and show patch-aware UI |
ProgressDialogService |
Long-running operation progress feedback |
ComboResourceHelper |
Populate combo boxes with ROM data (units, classes, items) |
NameResolver |
Resolve ROM IDs to human-readable names |
ScriptEditorHelper |
Event/AI/Procs script editing support |
TableExportImportHelper |
CSV/TSV export and import for tabular data |
Eight editors implement IPickableEditor for cross-reference navigation:
- ClassEditor
- ClassFE6
- PortraitViewer
- ItemEditor
- ItemFE6
- UnitEditor
- SongTable
- SongTrackImportSelectInstrument
Use WindowManager.PickFromEditor<T>() to open an editor and return a selected value.
| Feature | Status |
|---|---|
| ROM loading and version detection | Complete |
| All 5 ROM variants (FE6, FE7J, FE7U, FE8J, FE8U) | Complete |
| Unit, Class, Item editors | Complete |
| Map editors (settings, tiles, terrain, style) | Complete |
| Event script editing (viewing + category/template navigation) | ~40% (raw script editing limited) |
| Event conditions | Complete (write-enabled editor) |
| Event unit placement | Complete (write-enabled, incl. New Allocation) |
| AI script editing | Complete |
| Procs script editing | Complete |
| Image/portrait viewing and editing | Complete |
| Portrait rendering and export | Complete |
| Battle animation sprite metadata | Complete |
| Audio/song table editing | Complete |
| MIDI export, parsing, and GBA write-back (import → ROM, #972) | Complete |
| Text viewing and editing | Complete |
| Text validation and cross-references | Complete |
| Support conversation editing | Complete |
| World map editing | Complete |
| Hex editor | Complete |
| Disassembler | Complete |
| Pointer tools | Complete |
| Patch manager (browse, filter, install, uninstall) | Largely complete |
| Three-way merge | Complete |
| Undo/redo on all editors | Complete |
| Stat growth simulation | Complete |
| FE Lint validation | Complete |
| ROM rebuild | Complete |
| Data expansion | Complete |
| CSV/TSV export and import | Complete |
| Easy mode (simplified menu) | Complete |
| Skill system editors | Complete |
| Drag-and-drop ROM loading | Complete |
| Feature | Status | Notes |
|---|---|---|
| OAM sprite assembly (battle animation) | Partial | Import-side OAM assembly works (magic / world-map border / battle-anime import via BattleAnimeOAMImportCore); a full battle-animation frame editor is not ported |
| Animation playback | Not implemented | No frame-by-frame animation preview |
| InputFormRef auto-wiring | Not implemented | WinForms convention-based control linking has no Avalonia equivalent |
| Emulator memory access (RAM viewer) | Limited | P/Invoke-based, Windows-only in WinForms |
The Avalonia GUI contains 357 AXAML views across 27 functional categories. Below is a summary of each category. For the complete view-by-view reference with ViewModel mappings, see docs/avalonia-forms.md.
Main window, welcome screen, version info, options, and ROM detection dialogs.
- MainWindow, WelcomeView, VersionView, OptionsView
- OpenLastSelectedFileView, LogViewerView
- ErrorUnknownROMView
Full unit and class editing for all ROM versions, including movement costs, weapon locks, promotion lists, and growth simulation.
- Units: UnitEditorView, UnitFE6View, UnitFE7View, UnitMainView
- Unit data: UnitActionPointerView, UnitCustomBattleAnimeView, UnitIncreaseHeightView, UnitPaletteView, UnitsShortTextView
- Extra units: ExtraUnitView, ExtraUnitFE8UView
- Classes: ClassEditorView, ClassFE6View, CCBranchEditorView
- Movement: MoveCostEditorView, MoveCostFE6View
- Other: SomeClassListView, VennouWeaponLockView, SMEPromoListView, GrowSimulatorView
Complete item and weapon editing including effects, bonuses, shops, and weapon triangle.
- Items: ItemEditorView, ItemFE6View
- Effects: ItemWeaponEffectViewerView, ItemEffectPointerViewerView, ItemUsagePointerViewerView
- Bonuses: ItemStatBonusesViewerView, ItemStatBonusesSkillSystemsView, ItemStatBonusesVennoView
- Effectiveness: ItemEffectivenessViewerView, ItemEffectivenessMainView, ItemEffectivenessSkillSystemsReworkView
- Other: ItemPromotionViewerView, ItemShopViewerView, ItemWeaponTriangleViewerView, ItemIconViewerView, ItemRandomChestView
Comprehensive map editing: settings, tiles, terrain, style, exit points, and visual tile editor.
- Settings: MapSettingView (+ FE6, FE7, FE7U variants), MapSettingDifficultyView/DialogView
- Map data: MapChangeView, MapExitPointView, MapPointerView (+ NewPLIST)
- Tile animation: MapTileAnimationView, MapTileAnimation1View, MapTileAnimation2View
- Visual editor: MapEditorView (+ resize, margin, map change dialogs)
- Style: MapStyleEditorView (+ append, warning, import options)
- Terrain: MapTerrainNameView, MapTerrainNameEngView, MapTerrainBGLookupView, MapTerrainFloorLookupView
- Other: MapMiniMapTerrainImageView, MapLoadFunctionView, TerrainNameEditorView
Event scripts, conditions, unit placement, battle conversations, death quotes, and templates.
- Scripts: EventScriptView (+ Main, Inner, Template, CategorySelect, Popup)
- Conditions: EventCondView, EventCondMainView
- Units: EventUnitView (+ FE6, FE7, Sim, Color, ItemDrop, NewAlloc variants)
- Battle talk: EventBattleTalkView (+ FE6, FE7 variants), EventBattleDataFE7View
- Death quotes: EventHaikuView (+ FE6, FE7 variants)
- FE7-specific: EventFinalSerifFE7View, EventMoveDataFE7View, EventTalkGroupFE7View
- Templates: EventTemplate1-6View, EventTemplateImplView
Enemy AI behavior editing.
- AIScriptView, AIScriptCategorySelectView, AIASMCALLTALKView, AIASMCoordinateView, AIASMRangeView
- AIMapSettingView, AIPerformItemView, AIPerformStaffView, AIStealItemView, AITargetView, AITilesView, AIUnitsView
- AOERANGEView
Process/animation script editing.
- ProcsScriptView, ProcsScriptCategorySelectView
Portraits, battle animations, backgrounds, CGs, tilesets, palettes, magic effects, and system graphics.
- Portraits: PortraitViewerView, ImagePortraitView (+ FE6), ImagePortraitImporterView, ImageGenericEnemyPortraitView
- Battle: ImageBattleAnimeView, ImageBattleAnimePalletView, ImageBattleBGView, ImageBattleScreenView
- CG: ImageCGView, ImageCGFE7UView, BigCGViewerView
- Unit sprites: ImageUnitPaletteView, ImageUnitWaitIconView, ImageUnitMoveIconView
- System: ImageSystemAreaView, SystemIconViewerView, SystemHoverColorViewerView
- TSA: ImageTSAEditorView, ImageTSAAnimeView, ImageTSAAnime2View
- Magic: ImageMagicFEditorView, ImageMagicCSACreatorView
- Tools: GraphicsToolView, GraphicsToolPatchMakerView, DecreaseColorTSAToolView
- PaletteChangeColorsView, PaletteClipboardView, PaletteSwapView
Song tables, tracks, instruments, MIDI import, sound room, and boss BGM.
- Songs: SongTableView, SongTrackView (+ AllChange, Change, ImportMidi, ImportSelectInstrument, ImportWave)
- Instruments: SongInstrumentView, SongInstrumentDirectSoundView, SongInstrumentImportWaveView
- Sound data: SoundBossBGMViewerView, SoundFootStepsViewerView
- Sound room: SoundRoomViewerView, SoundRoomFE6View, SoundRoomCGView
Game text editing, fonts, translation tools, and text utilities.
- Text: TextViewerView, OtherTextView, CStringView
- Fonts: FontEditorView, FontZHView
- Utilities: TextEscapeEditorView, TextDicView, TextCharCodeView, TextBadCharPopupView, TextRefAddDialogView
- Translation: DevTranslateView, ToolTranslateROMView, TextToSpeechView
- SupportUnitEditorView, SupportUnitFE6View, SupportAttributeView
- SupportTalkView, SupportTalkFE6View, SupportTalkFE7View
- ArenaClassViewerView, ArenaEnemyWeaponViewerView, LinkArenaDenyUnitViewerView
- MonsterProbabilityViewerView, MonsterItemViewerView, MonsterWMapProbabilityViewerView
- SummonUnitViewerView, SummonsDemonKingViewerView
- MenuDefinitionView, MenuCommandView, MenuExtendSplitMenuView, FE8SpellMenuExtendsView
- EDView, EDStaffRollView, EDFE6View, EDFE7View, EDSensekiCommentView
- WorldMapPointView, WorldMapBGMView, WorldMapEventPointerView (+ FE6, FE7)
- WorldMapPathView, WorldMapPathEditorView, WorldMapPathMoveEditorView
- WorldMapImageView (+ FE6, FE7)
- OPClassDemoViewerView (+ FE7, FE7U, FE8U), OPClassFontViewerView (+ FE8U)
- OPClassAlphaNameView (+ FE6, FE6Extra), OPPrologueViewerView
- ClassOPDemoView, ClassOPFontView
- StatusParamView, StatusRMenuView, StatusUnitsMenuView, StatusOptionOrderView, StatusOptionView
Multiple skill system implementations: SkillSystem, CSkillSys, and FE8N.
- SkillSystem: SkillAssignmentUnitSkillSystemView, SkillAssignmentClassSkillSystemView, SkillConfigSkillSystemView
- CSkillSys: SkillAssignmentUnitCSkillSysView, SkillAssignmentClassCSkillSysView, SkillConfigFE8UCSkillSys09xView
- FE8N: SkillAssignmentUnitFE8NView, SkillConfigFE8NSkillView (v1, v2, v3)
- Other: SkillSystemsEffectivenessReworkClassTypeView, SkillSystemsCSkillRechainView
- PatchManagerView, PatchFilterExView, PatchFormUninstallDialogView, PatchUninstallDialogView
- HowDoYouLikePatchView, HowDoYouLikePatch2View, ToolCustomBuildView
- HexEditorView (+ Jump, Mark, Search), DisASMView, DisASMDumpAllView, DisASMDumpAllArgGrepView
- ToolASMEditView, ToolASMInsertView, ToolDecompileResultView
- PointerToolView (+ BatchInput, CopyTo), MoveToFreeSpaceView, PackedMemorySlotView
- EmulatorMemoryView, RAMRewriteToolView, RAMRewriteToolMAPView
- UbyteBitFlagView (8-bit), UshortBitFlagView (16-bit), UwordBitFlagView (32-bit)
- Command85PointerView, DumpStructSelectDialogView, DumpStructSelectToTextDialogView, ResourceView
- ErrorReportView, ErrorPaletteMissMatchView, ErrorPaletteShowView, ErrorPaletteTransparentView, ErrorTSAErrorView, ErrorLongMessageDialogView
- NotifyDirectInjectionView, NotifyPleaseWaitView, NotifyWriteView
ROM management, lint, diff, UPS patching, three-way merge, and more.
- Undo: ToolUndoView, ToolUndoPopupDialogView
- Validation: ToolFELintView, ToolROMRebuildView, ToolLZ77View
- Diff/Merge: ToolDiffView, ToolDiffDebugSelectView, ToolThreeMargeView
- UPS: ToolUPSPatchSimpleView, ToolUPSOpenSimpleView
- Setup: ToolInitWizardView, ToolUpdateDialogView, ToolEmulatorSetupMessageView
- Reports: ToolProblemReportView (+ SearchBackup, SearchSav)
- Work support: ToolWorkSupportView (+ SelectUPS, UpdateQuestionDialog)
Beginner-friendly simplified interface.
- MainSimpleMenuView, MainSimpleMenuEventErrorView, MainSimpleMenuEventErrorIgnoreErrorView, MainSimpleMenuImageSubView
Many editors have version-specific variants that automatically activate based on the loaded ROM:
| ROM Version | Suffix | Example Editors |
|---|---|---|
| FE6 (Japan) | FE6 | UnitFE6, ClassFE6, ItemFE6, MapSettingFE6, EventUnitFE6, SupportTalkFE6 |
| FE7 (Japan) | FE7 | UnitFE7, MapSettingFE7, EventUnitFE7, EventBattleTalkFE7, SupportTalkFE7 |
| FE7 (US) | FE7U | MapSettingFE7U, ImageCGFE7U, OPClassDemoFE7U |
| FE8 (Japan) | FE8N | SkillConfigFE8N (v1, v2, v3) |
| FE8 (US) | FE8U | ExtraUnitFE8U, OPClassDemoFE8U, OPClassFontFE8U |
| Metric | Count |
|---|---|
| Total AXAML Views | 357 (*View.axaml; 369 .axaml incl. controls/dialogs) |
| Total ViewModels | 367 |
| Shared Controls | 7 |
| Functional Categories | 27 |
| Version-Specific Variants | ~25 |
| IPickableEditor Implementations | 8 |
Write-enabled editors (IDataVerifiable) |
176 |
-
OAM sprite assembly is partial -- Import-side OAM assembly works (magic / world-map border / battle-anime import via
BattleAnimeOAMImportCore), but a full battle-animation frame editor is not ported. - No animation playback -- Frame-by-frame animation preview is not available; only static frames can be viewed.
- No InputFormRef auto-wiring -- The WinForms convention-based control linking has no Avalonia equivalent. Cross-references are wired manually in ViewModels.
- Emulator memory access is limited -- The RAM viewer uses Windows P/Invoke and is not portable to Linux/macOS.
- Raw event-script editing is partial (~40%) -- Event conditions and unit placement are fully write-enabled editors, but the raw event-script editor is still primarily a viewer with category/template navigation.
MIDI→GBA write-back (import → ROM, #972) and patch install/uninstall are now implemented; they are no longer limitations.
- Getting Started -- First-time setup
- Command-Line Interface -- CLI usage
- Editors Reference -- WinForms editor overview
- Native Android -- Experimental native Android port of this Avalonia GUI
- Native iOS -- Experimental native iOS / iPadOS port of this Avalonia GUI
- Decomp Project Mode -- Source-tree-backed editing workflow