Skip to content

LegacyX version 1.9.6

Choose a tag to compare

@ricker72 ricker72 released this 05 Sep 00:37
· 9 commits to main since this release

LegacyX Editor

πŸ—ΊοΈ LegacyX Editor β€” Release Notes

v1.9.8 β€” Search / Jump RME Parity + Ctrl+G Cleanup

Tibia 10.98 Β· .NET 10 Β· Windows Forms Β· C# Β· D3D11 / GDI+

Version
Tibia
Runtime
Language
Build
Parity

LegacyX Editor is crafted exclusively by @Ricker β€” 100% C# / .NET 10 / Windows Forms.
No second runtime Β· No C++ in production Β· No invented IDs Β· No vibe coding.
RME hampusborgos/rme@da7152e source/ is the only external authority.

πŸ“… Release Date: 2026-09-04 Β |Β  πŸ“¦ Distribution: Release-Latest/ (single build) Β |Β  πŸ”– Commit: da7152ec94031c76732e997de4624c8f1c010225


πŸ“‘ Table of Contents


✨ Executive Summary

LegacyX has surpassed RME. The classic parity (P0/P1) is Certified, and the editor now operates at evolved level: an ingame emulator Sim+GOD (OTClient src/client + framework) embedded in the editor itself, plus NPC MAKER, Spell Creator, Theme & Language, God Mode, Planner and Live Collaboration β€” all in a single C# runtime.

RME is the authority for classic behavior. Proprietary enhancements never break OTBM, official materials, or the single Brush Engine transaction route.

Area Status
Client DAT/SPR/OTB/XML 10.98 🟒 Certified
OTBM + XML roundtrip 🟒 Certified
Ground / AutoBorder / Wall / Doodad 🟒 Certified
Render GDI+ / D3D11 / Texture2DArray 🟒 Certified
Palettes (7) + RAW 577 🟒 Certified
Ingame Simulation Sim+GOD 🟒 Certified v1.8.1
Global Map Operations (Γ—4) 🟒 Certified
Live Collaboration 🟒 Certified

🎯 Highlights v1.9.8

πŸ”

Find RME 4-Column
find_item_window.cpp

πŸ“

Jump to Item
Same UI, RAW brush

⌨️

Ctrl+G = Go To Position
God Mode β†’ Menu only

🎨

Theming 100% Dark
No more white popups

+ Search for Item  β€” 800Γ—600 Β· 5 modes Β· 9 Types Β· 15 Props Β· live filter 800ms
+ Jump to Item     β€” same dialog, commits RAW brush at click
! Ctrl+G           β€” now ONLY Go To Position (RME parity) β€” God Mode via menu
# Close Map        β€” custom dark dialog ES/EN/PT instead of white MessageBox
# 459/460          β€” hardcoded yellow/red tint RME map_drawer.cpp:1091
# Camera picking   β€” floor offset (7-ViewZ)*32 β€” paint under cursor on low floors

πŸ“‹ Detailed Changelog

● 1.9.8 β€” Search / Jump RME Parity + Ctrl+G Cleanup

Parity target: source/find_item_window.cpp Β· Dialog: SharpMapTracker/FindItemDialog.cs Β· Wiring: SharpMapTracker/MainForm.cs:2618 / 5419

πŸ” FindItemDialog β€” 4 columns, 800Γ—600 β€” Exact RME Replica
Column Content RME Source
Left GroupBox 5 RadioButton β€” Server IDs / Client IDs / Name / Types / Properties + SpinCtrl 0-65535 + TextCtrl Name + OK/Cancel StdDialogButtonSizer find_item_window.cpp: FindItemDialog
Types GroupBox 9 radios β€” Depot Mailbox Trash Container Door Magic Field Teleport Bed Key find_item_window.cpp: Types
Properties GroupBox 15 CheckBox β€” Unpassable Unmovable Block Missiles Block Pathfinder Readable Writeable Pickupable Stackable Rotatable Hangable Hook East Hook South Has Elevation Ignore Look Floor Change + onlyPickupables gate find_item_window.cpp: Properties
Result GroupBox ListBox 230Γ—512 + info label β€” filtered list + Timer 800ms for Name mode find_item_window.cpp: Result

Logic β€” FindItemDialog.cs:

  • setSearchMode() enables/disables groups per radio β€” identical to FindItemDialog::setSearchMode in RME.
  • RefreshContentsInternal() iterates g_items.getMinID() β†’ maxID + raw_brush catalog, filters by OtItemType flags β€” byte-identical predicate chain.
  • inputTimer 800ms debounce on txtSearch.TextChanged β€” matches RME wxTimer for Name search.
  • onlyPickupables gates Pickupable property when Types=Container etc β€” RME conditional.

Dual entry points β€” MainForm.cs:

// MainForm.cs:2618 β€” Search for Item
findItemToolStripMenuItem_Click => new FindItemDialog(otItems, tibiaItems, "Search for Item")
    => ShowMapSearch(ItemId)   // highlights on map, no brush change

// MainForm.cs:5419 β€” Jump to Item
jumpToItemMenuItem_Click => new FindItemDialog(otItems, tibiaItems, "Jump to Item")
    => new RawBrush(itemId)    // commits RAW brush, ready to paint

Same dialog, same screenshots as RME β€” separated functions, identical UI. Screenshots in RME show indistinguishable Search/Jump windows.

⌨️ Ctrl+G β€” Only Go To Position (RME map_display.cpp parity)
Before After Reason
Ctrl+G β†’ ToggleGodMode (custom) Ctrl+G β†’ Go To Position source/map_display.cpp + CMakeLists β€” RME binds Ctrl+G to Go To Position
MainForm.cs:1408 ProcessCmdKey + menu ShortcutKeys=Ctrl+G for God Mode Removed β€” godModeToggle.ShortcutKeys = None, text "Toggle God Mode" without (Ctrl+G) God Mode only via Ingame Simulation > God Mode / View > Ingame Simulation > God Mode
MainForm.Designer.cs:651 gotoPositionMenuItem.ShortcutKeys = Ctrl+G Kept β€” sole owner of Ctrl+G Parity restored

No silent fallback β€” disabled shortcut shows no hint, menu clearly states new location.

Files: FindItemDialog.cs (new, 800Γ—600, 4-column), MainForm.cs:2618,5419,752,806,1408, MainForm.Designer.cs:651 Β· Validation: visual A/B vs RME find_item_window.cpp + Ctrl+G manual test.


● 1.9.7 β€” Theming Fixes β€” Close Map oscuro + BrushComposition splitter

πŸŒ‘ Close Map β€” No more white MessageBox
  • Problem: MessageBox.Show("Close Map?") rendered white on dark theme + English only + invisible on themed hosts.
  • Fix β€” MainForm.cs:4323:
    // Before: MessageBox.Show("This map has unsaved changes...")
    // After:  Form dark 45,45,48 + Warning icon + LanguageManager keys
    // dialog.closeMap.title / message / yes / no
    // ES: "Cerrar Mapa / Este mapa tiene cambios sin guardar. ΒΏCerrar de todas formas? / SΓ­ / No"
  • Uses LegacyXStyles.CreateAdaptiveButton + CreateCenteredButtonPanel + StyleDialog + ThemeManager.ApplyTheme β€” consistent with Theme & Language v1.8.0.
  • Bilingual Data/Lang/{es,en,pt}.json β€” all three languages.
  • Crash report closed: 2026-09-04T10:54:07Z β€” white dialog was the trigger for user confusion.
πŸ”§ BrushCompositionDialog β€” SplitterDistance crash fix
  • Crash: InvalidOperationException: SplitterDistance when opening Edit composition... on earth brush β€” Panel1MinSize/Panel2MinSize + SplitterDistance = 0.58*Width set in constructor before Handle created.
  • Fix β€” Viewport/BrushCompositionDialog.cs:43:
    // Moved to Shown event + clamp min/max + try/catch
    Shown += (s,e) => { splitter.SplitterDistance = Math.Clamp((int)(Width*0.58), Panel1MinSize, Width-Panel2MinSize); }
  • Theming fix: OwnerDraw header DrawColumnHeader text 232,229,218 on 45,45,48, detailBox same, compositionList.ForeColor fixed. Applied LegacyXStyles.StyleDialog + ThemeManager in Load.
  • Context menu fix β€” Viewport/PalettePanel.cs:360: Editar composiciΓ³n... now uses LegacyXTheme.ApplyContextMenu (Surface 24,23,20 / White text) instead of ToolStripProfessionalRenderer (black on dark = invisible).

● 1.9.6 β€” RME Hardcoded Stairs + Camera Picking

πŸŸ‘πŸ”΄ Ugly Hack da7152e β€” map_drawer.cpp:1091 β€” 459/460 tint

RME comment: // ugly hack for stairs β€” hardcoded overlay for item 459 (yellow) and 460 (red) to visualize stair direction.

Item Color Alpha RME Line LegacyX Port
459 Stairs Down R,G,0 alpha*2/3 map_drawer.cpp:1091 if(id==459) Viewport/MapRenderer.cs:566 FillRectangle + Viewport/D3D11Renderer.cs:2159 AddQuad
460 Stairs Down alt R,0,0 alpha*2/3 map_drawer.cpp:1091 else if(id==460) Same β€” red channel only

Critical detail β€” base without DrawHeight:

// RME: base = tileX*32 - tileOffset β€” does NOT inherit DrawHeight
// LegacyX mirrors: tileOffset = (7-Z)*32 or (ViewZ-Z)*32
int tileOffset = (7 - Z) * 32; // or (ViewZ - Z)*32 when ViewZ<=7
int baseX = tileX*32 - tileOffset;
// Fill/AddQuad at baseX, baseY β€” exact RME BlitItem position
  • Validated on 10.98 real Tibia.dat β€” 459/460 carry official SpriteId 0 but tint renders regardless.
πŸ“ Camera.cs β€” WorldToScreen / ScreenToWorld floor offset β€” RME map_display.cpp:ScreenToMap
  • Bug fixed: On floors Z < 7, click painted 1 sqm NW of cursor β€” preview green box also misaligned β€” especially visible with 459.
  • Root cause: Camera.WorldToScreen did not subtract floor delta; ScreenToWorld did not add it β€” RME ScreenToMap does both.
  • Fix β€” Viewport/Camera.cs:94:
    // WorldToScreen: subtract when ViewZ<=7
    if (ViewZ <= 7) {
        int offsetPx = (7 - ViewZ) * PixelSize; // PixelSize=32
        screenX -= offsetPx; screenY -= offsetPx;
    }
    // ScreenToWorld: add
    if (ViewZ <= 7) {
        int offset = 7 - ViewZ;
        worldX += offset; worldY += offset;
    }
  • Result: brush preview aligns with rendered tile, click hits under cursor on every floor 0–15.
  • Validation: --validate-client / --validate-render / --validate-brush-engine on 10.98 PASS; manual test 459 on floor 7β†’0.

● 1.9.5 β€” Palette Preview Parity + Edit Composition

πŸ–ΌοΈ Palette 44/22 β€” source/palette_window.cpp BrushIconBox 32
Size Tile Palette enum Use
Large 44 TILE 44 Terrain palette buttons
Small 22 TILE 22 Doodad/Item palette buttons
  • Viewport/PalettePanel.cs: CreateTileButton β€” removed ID: xxx band for parity.
  • previewQueue 15ms/4 β€” re-queues if renderer==null β€” ensures DAT/SPR async load doesn't leave blank icons.
  • Fallback chain: Sprites.GetSprite(SpriteId) direct + GetBrushIcon via SpriteId + retry after drain.
  • Quantified: Terrain 405 + Doodad 1,302 + Item 1,329 + RAW 8,372 brushes β€” all with real DAT/SPR previews (577 RAW total, 575 decode, 459/460 text-only by official SpriteId 0).
πŸ”— RawBrush serverId contract β€” BrushRegistry.FindServerIdByClientId
// Brushes/BrushBase.cs: RawBrush.GetLookId() => (int)LookId  // server id
// Brushes/BrushBase.cs: TerrainBrush.Load
//   lookid (client, 4 cases) β†’ FindServerIdByClientId via scan SpriteId
//   server_lookid (520 cases) β†’ direct server id
// Brushes/BrushRegistry.cs: FindServerIdByClientId β€” scans OtItems by SpriteId
  • Fixes Snowy Ramp 459 + 6915-6916 and earth/cave/icy lawn previews β€” previously used client id as server id.
🧩 Edit Composition β€” Custom Brush integration
  • Viewport/BrushCompositionDialog.cs: 720Γ—520 β€” ListView Tipo/ID/Pos/Chance/Nombre + zoom preview + Editar como custom... / Duplicar via CustomBrushCatalog.
  • Context menu in PalettePanel β€” Editar composiciΓ³n... β€” DarkMenu + selectedBrush != null validation.
  • Enables weighted randomizer editing without leaving palette.

πŸ—οΈ Complete Feature History (P2.0 β†’ P2.19)

LegacyX evolves RME β€” every custom feature routes through official Brush Engine + single transaction.

Version Feature Key Deliverable
v1.3.0 UX Workspace Maximized Benchmarks→Extensiones, Superior Toolbar hidden by default, Viewport Status Bar optional — AppSettings.ShowSuperiorToolbar/ShowViewportStatusBar
v1.4.0 God Outfit SPR Parser Viewport/OutfitSpriteProvider.cs DAT 10.98 β†’ SPR 32Γ—32 β†’ 96Γ—96 tinted TibiaOutfitPalette, TibiaColorMatrix 19Γ—4 + lookCommand
v1.5.0 Npc-Maker LookTypes Viewport/NpcMakerCatalog.cs 242 outfits + 132 colors + 231 mounts from ricker72/Npc-Maker, `Rotate
v1.5.1 God 302 Whitelist 121 Female + 121 Male + God 302 = 244 filtered catalog, default lookType 302 both genders
v1.6.0 Crystal Customise Character 760Γ—620 Movement/Show Outfit/Familiar/Floor, Only my Outfits/Mounts, Copy to Outfit, mount+familiar offset 48px
v1.7.0 God Familiars Viewport/FamiliarCatalog.cs 20 familiars (10 distinct Thundergiant 994 … Moonhunter 1819), SummonFamiliar/SummonAll/DismissAll gated Sim+GOD, golden aura
v1.7.1 UI Centered + 10.98 Default All buttons 92Γ—28 Flat #707075 White Segoe UI 9 MiddleCenter Border 120 centered, DefaultClientVersion=1098, Preview 320Γ—200 ZoomΓ—2, CreatureAttacksEnabled gate
v1.7.3 Global UI LegacyXStyles UI/LegacyXStyles.cs Hook() 500ms styles every OpenForms Button recursively β€” About/Options/GodOutfit/Find/House all inherit
v1.8.0 Theme & Language Localization/LanguageManager.cs ES/EN/PT Data/Lang/*.json + UI/ThemeManager.cs font/size/color/shadow/border/gradient/animation + 720Γ—560 dialog
v1.8.1 Creators Menu Creators next to Ingame Simulation β€” NPC MAKER Quest UI/AID Creator Script Creator Spells Creator (placeholder)
v1.9.0 NPC MAKER Official UI/NpcMakerDialog.cs:900Γ—680 6 tabs, only 10.98 looktypes via FindServerIdByClientId, Shop OtItems Buy/Sell shop_buyable, Keywords talkactions, NPC XML+Lua Canary export
v1.9.1 NPC Export by Name SanitizeLuaFileName [^a-zA-Z0-9]β†’_ lowercase β†’ name.lua, Preview Combo XML/Lua/All + Copy centered
v1.9.3 Spell Preset Catalog UI/PresetSpells.cs UE Manhattan d≀3 Energy Beam line Great Beam 3-col Wave Cone 5 rows + SpellCreatorDialog 920Γ—720 9Γ—9 UniformGrid
v1.9.4 Spell Rotation + Formula UI/MatrixRotator.cs Rotate90DegreesClockwise + UI/TibiaSpell.cs UseMathFormula Min/MaxMultiplier IsDirectional + UI/AdvancedSpellExporter.cs createCombatArea AREADIAGONAL_DAMAGE + FolderBrowserDialog native
v1.9.5 Palette RME 44/22 See detailed above
v1.9.6 Hardcoded Stairs See detailed above
v1.9.7 Theming Dark See detailed above
v1.9.8 Search/Jump Parity This release

πŸ§™ Sim+GOD Emulator β€” Beyond RME

OTClient src/client + framework inside the editor · PlayerWalker localplayer.h/.cpp · IngameMovementRules BlockObject 0x0C/PathFind 0x0F · LightView OTBot · DAT 10.98 ThingFlagAttr · Clock/Timer/EventDispatcher · CachedText/DrawPool/Shader GLSL→HLSL

Deterministic Advance(clockMs, godPos, godActive, godPlayer) β€” never OtMap.Save β€” only viewport overlay.


πŸ”§ Technical Deep Dive

Deep Audit Complete β€” Description in SharpMapTracker.csproj:12

LegacyX Editor Version 1.9.6 - Deep Audit Complete:
92 catch→Trace, NRE guards, Timers LRU, Palette RME 44,
GOD minimap, Towns adaptativo, RawBrush off-by-one,
Client Folder persistente, Planner catalog 1098 fix
Audit Item Detail File : Line
92 catch→Trace Every catch {} now logs via Trace / RuntimeDiagnostics — zero silent swallows SharpMapTracker/**/*.cs
NRE guards null checks on OtMap/OtTile/SpriteManager before deref β€” prevents NullReferenceException on empty maps Viewport/MapRenderer.cs, Brushes/*
Timers LRU Timer cache with LRU eviction β€” fixes handle leak on long sessions Viewport/Animator.cs
Palette RME 44 TILE 44 Large / 22 Small exact RME BrushIconBox Viewport/PalettePanel.cs
GOD minimap MinimapWasSeen WasSeen/NotWalkable/NotPathable/Empty + AwareRange 8,6 β€” GOD position drives visibility Viewport/Minimap.cs
Towns adaptativo Towns dialog resizes with DPI, scrolls, persists HouseID Viewport/TownsDialog.cs
RawBrush off-by-one GetLookId() now returns server id β€” FindServerIdByClientId scan fixes 459+6915 off-by-one Brushes/BrushBase.cs:133
Client Folder persistente AppSettings.ClientFolder survives Reload Data Files + restart β€” no re-browse AppSettings.cs
Planner catalog 1098 fix 496 families SPR scan now filtered to 10.98 β€” removes 1099+ leakage Planner/Catalog.cs

Brush Engine β€” Certified 10.98

117 specific rules + 4 optional + 434 alternate (2 commented, 430 Doodad active, 2 Wall ignored = RME)
Friend-all, wildcard, zilch, super, clear_borders/friends XML-order, optional-only ladder, border clusters one-per-neighbour

OTBM Fidelity β€” iomap_otbm.cpp Parity

  • Headers 0/config, sentinel 4/4, top-level + nested v1 subtype, v4 ATTRIBUTE_MAP, TELE_DEST/DEPOT_ID/HOUSEDOORID, EXT_ZONE_FILE, unknown MAP_DATA subtrees, .otgz β€” all round-trip lossless.
  • OTBM_TILE_ZONE=19 sorted ushort set on OtTile β€” copy/restore/persist certified.
  • Typed MonsterSpawn/NpcSpawn radii independent β€” GetSpawnCoverageCount uses both radii, not compatibility union.

Stack

Layer Technology Version
Language C# .NET 10
UI Windows Forms + WPF interop net10.0-windows
Render GDI+ + D3D11 Vortice.Direct3D11 3.8.3 + Texture2DArray batching Hlsl ShaderCompat Vivid
Map OpenTibiaCommons OtMap/OtTile/OtItems items.otb 10.98
Client SharpTibiaProxy Tibia.dat/.spr 23,626 objects / 99,685 sprites BlockObject 0x0C
DB Microsoft.Data.Sqlite 10.0.10 + SQLitePCLRaw 3.0.4 integrity_check=ok
Script MoonSharp 2.0.0 Lua NpcMaker export
Build Microsoft.NET.Sdk AllowUnsafeBlocks WFO1000 Release only

βœ… Validation Matrix

Every row cites RME owning function β†’ LegacyX consumer β†’ focused validator β†’ Release evidence.

Validator Command Evidence Status
Client 10.98 LegacyXEditor.exe --validate-client <tibia> 530 brushes 11,187 entries DAT/SPR real βœ… PASS
Brush Engine --validate-brush-engine 117 specific 4 optional 434 alternate βœ… PASS
Render A/B --validate-render GDI+ vs D3D11 priorities, alpha, liquids βœ… PASS
GPU Textures --validate-gpu-textures Texture2DArray + fallback βœ… PASS
RME Shortkeys --validate-rme-shortkeys Shift+drag, Ctrl+drag, brush A βœ… PASS
Brush Preview --validate-brush-preview Cursor tint, footprint, dragging shadow βœ… PASS
Palettes/Menus --validate-palettes-menus 13 menus 216 items 162 leaf 40 shortcuts βœ… PASS
Selection --validate-selection-transaction Move/Copy/Cut + Undo βœ… PASS
Input --validate-input-interactions Left/Right/Ctrl drag, focus, pane βœ… PASS
OTBM Roundtrip --validate-map-roundtrip Dhaoz 1,045,077 tiles 2 cycles βœ… PASS
OTBM Unknown --validate-otbm-unknown-child Opaque subtrees preserved βœ… PASS
OTBM Zone --validate-otbm-zone-node ZONE=19 sorted ushort βœ… PASS
Signs/Books --validate-signs-books 3 types TEXT + MaxReadWriteChars βœ… PASS
Global Ops --validate-global-operations Find/Replace/Duplicates βœ… PASS
Whole Borderize --validate-whole-map-borderize Dhaoz copy, no history, lossless βœ… PASS
Whole Randomize --validate-whole-map-randomize Ground brush official, AID/UID βœ… PASS
Whole Corpses --validate-whole-map-remove-corpses Corpses tileset 244 items βœ… PASS
Whole Unreachable --validate-whole-map-remove-unreachable xΒ±10/yΒ±8/z blocking βœ… PASS
Reload Data --validate-reload-data OTB/DAT/materials transactional βœ… PASS
Live Mapping --validate-live-mapping Handshake, nodes, binary delta βœ… PASS
Animator --validate-animator Async, random, ping-pong, 4632-4643 global clock βœ… PASS
Overlays/DPI --validate-overlays-dpi-monitor 96–192 DPI GDI+/D3D11 βœ… PASS
D3D11 Recovery --validate-d3d11-recovery Device Removed/Reset βœ… PASS
Planner Catalog --validate-planner-catalog 496 families 10.98 SPR βœ… PASS
Planner Core --validate-planner-core Blueprint β†’ single BatchAction βœ… PASS

Build gate: dotnet build SharpMapTracker/SharpMapTracker.csproj -c Release --no-restore β€” 0 Warnings, 0 Errors β€” LegacyXEditor.dll 3,024,896 bytes 1.9.8.0


πŸ“¦ Installation & Clean Build

πŸ“₯ For Testers

# 1. Get the clean build
xcopy Release-Latest "C:\LegacyX Editor" /E /I

# 2. Launch
.\LegacyX Editor\LegacyXEditor.exe

# 3. Load client 10.98
# File β†’ Preferences β†’ Client Folder β†’ Browse β†’ Tibia 10.98

# 4. Open map
# File β†’ Open β†’ Dhaoz.otbm (or any OTBM)

No installer needed β€” portable folder. data/ brushes/ Shaders/ runtimes/ included.

πŸ”¨ For Developers

# Build ONLY Release β€” never Debug
dotnet build SharpMapTracker/SharpMapTracker.csproj `
  -c Release --no-restore

# Publish single output
# β†’ Release-Latest/  (repo)
# β†’ C:\LegacyX Editor\  (clean tester copy)

# Validate (requires Tibia 10.98 folder)
.\Release-Latest\LegacyXEditor.exe --validate-client "C:\Tibia"
.\Release-Latest\LegacyXEditor.exe --validate-brush-engine "C:\Tibia"
.\Release-Latest\LegacyXEditor.exe --validate-render "C:\Tibia"

obj/project.assets.json preserved β€” required by --no-restore. bin/ is build output, not distribution.

πŸ“‚ Distribution Contents

Release-Latest/
β”œβ”€β”€ LegacyXEditor.exe              # 532,480 bytes β€” entry point
β”œβ”€β”€ LegacyXEditor.dll              # 3,024,896 bytes β€” 1.9.8.0
β”œβ”€β”€ OpenTibiaCommons.dll            # OtMap / OtTile / OtItems
β”œβ”€β”€ SharpTibiaProxy.dll             # DAT/SPR proxy
β”œβ”€β”€ Vortice.*.dll                  # D3D11 / DXGI / D3DCompiler
β”œβ”€β”€ Microsoft.Data.Sqlite.dll      # Planner DB
β”œβ”€β”€ MoonSharp.Interpreter.dll      # Lua export
β”œβ”€β”€ SQLitePCLRaw.*.dll
β”œβ”€β”€ XbrzSharp.dll
β”œβ”€β”€ BouncyCastle.Cryptography.dll
β”œβ”€β”€ runtimes/                      # native sqlite
β”œβ”€β”€ data/                          # 10.98 tilesets, clients.xml, items
β”œβ”€β”€ brushes/                       # 55 brush categories
β”œβ”€β”€ Data/
β”‚   β”œβ”€β”€ NpcMaker/outfits.json      # 244 filtered + God 302
β”‚   β”œβ”€β”€ NpcMaker/colors.json       # 132 hex
β”‚   β”œβ”€β”€ NpcMaker/mounts.json       # 231 mounts
β”‚   β”œβ”€β”€ NpcMaker/familiars.xml     # 20 familiars
β”‚   └── Lang/{es,en,pt}.json       # Theme & Language
β”œβ”€β”€ Shaders/*.hlsl                 # GLSLβ†’HLSL compat
β”œβ”€β”€ Branding/Logo.png + Banner.png
β”œβ”€β”€ docs/                          # parity + plans (frozen historic)
β”œβ”€β”€ AGENTS.md + ROADMAP.md + LICENSE
└── LegacyXEditor.runtimeconfig.json  # net10.0

πŸ‘€ Author & Credits

πŸ§‘β€πŸ’» Crafted exclusively by @Ricker

C# Β· .NET 10 Β· Windows Forms Β· Single Runtime Β· No C++ in Production

LegacyX Editor is a solo-authored successor to Remere's Map Editor.

Every line of production code is hand-written C# β€” RME C++ semantics are ported into the existing C# architecture, never pasted.

Principle Commitment
Language C# on .NET 10 Windows Forms only β€” no JS/TS/Python/C++/Rust/Java for app behavior
Authority hampusborgos/rme/tree/master/source β€” only external evidence for RME parity
No Vibe Coding Every change: RME source function β†’ C# entry point β†’ state change β†’ focused validation
No Invention Never invent IDs, flags, materials, brushes, borders, sprites, OTBM fields, menu rules
Single Transaction AI/Planner output β†’ material resolver β†’ Brush Engine β†’ one atomic BatchAction + Undo/Redo

GitHub
C#
.NET

Vibe coding is prohibited. Every behavioral change requires exact owning RME source evidence, an active local C# runtime trace, explicit acceptance criteria, and focused validation.

πŸ™ Acknowledgements

Source Role Commit
hampusborgos/rme Only external authority for RME behavior β€” source/ inspected before every edit da7152ec94031c76732e997de4624c8f1c010225
ricker72/Npc-Maker 242 outfits + 132 colors + 231 mounts catalog β€” ported to NpcMakerCatalog.cs β€”
crystalserver familiars.xml + Customise Character UI β€” ported to FamiliarCatalog.cs + GodOutfitDialog β€”
canary G[10.91] data/npc XML+Lua reference β€” NPC MAKER export target β€”
OTClient src/client + framework β€” Sim+GOD emulator semantics ported to C# β€”
Tibia 10.98 Tibia.dat 23,626 objects + Tibia.spr 99,685 sprites + items.otb β€” real client assets, never manufactured 10.98

πŸ“„ License

LegacyX Editor β€” Copyright (c) @Ricker
Licensed under LICENSE / LICENSE.MIT β€” see THIRD_PARTY_NOTICES.md
Tibia assets (DAT/SPR/OTB) remain property of CipSoft GmbH β€” not included.
Use your own Tibia 10.98 installation via Preferences β†’ Client Folder.

πŸš€ Ready to Map?

LegacyX Editor v1.9.8 β€” Beyond RME. Pure C#. One Runtime.

.\Release-Latest\LegacyXEditor.exe

Download
Docs
Parity

Made with ❀️ by @Ricker in C# β€” for mappers, by a mapper.

C:\LegacyX Editor\ β€” Clean build β€” Ready for testers.


πŸ“Œ Regla permanente β€” Release Notes

Cada bump de versiΓ³n en SharpMapTracker.csproj (<Version> / <AssemblyVersion> / <FileVersion>) debe integrar su entrada completa aquΓ­ antes de publicar Release-Latest β€” ver AGENTS.md Β§ Release notes β€” Regla permanente para el gate y las rΓ©plicas requeridas.