Repository navigation
LegacyX version 1.9.6
πΊοΈ LegacyX Editor β Release Notes
v1.9.8 β Search / Jump RME Parity + Ctrl+G Cleanup
Tibia 10.98 Β· .NET 10 Β· Windows Forms Β· C# Β· D3D11 / GDI+
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.
RMEhampusborgos/rme@da7152esource/is the only external authority.
π
Release Date: 2026-09-04 Β |Β π¦ Distribution: Release-Latest/ (single build) Β |Β π Commit: da7152ec94031c76732e997de4624c8f1c010225
π Table of Contents
- β¨ Executive Summary
- π― Highlights v1.9.8
- π Detailed Changelog
- ποΈ Complete Feature History
- π§ Technical Deep Dive
- β Validation Matrix
- π¦ Installation & Clean Build
- π€ Author & Credits
- π License
β¨ 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 |
πJump to Item |
β¨οΈCtrl+G = Go To Position |
π¨Theming 100% Dark |
+ 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 toFindItemDialog::setSearchModein RME.RefreshContentsInternal()iteratesg_items.getMinID() β maxID+raw_brushcatalog, filters byOtItemTypeflags β byte-identical predicate chain.inputTimer 800msdebounce ontxtSearch.TextChangedβ matches RMEwxTimerfor Name search.onlyPickupablesgatesPickupableproperty whenTypes=Containeretc β 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 paintSame 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 withTheme & 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: SplitterDistancewhen openingEdit composition...onearthbrush βPanel1MinSize/Panel2MinSize+SplitterDistance = 0.58*Widthset in constructor beforeHandlecreated. - 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:
OwnerDrawheaderDrawColumnHeadertext232,229,218on45,45,48,detailBoxsame,compositionList.ForeColorfixed. AppliedLegacyXStyles.StyleDialog + ThemeManagerinLoad. - Context menu fix β
Viewport/PalettePanel.cs:360:Editar composiciΓ³n...now usesLegacyXTheme.ApplyContextMenu(Surface 24,23,20/Whitetext) instead ofToolStripProfessionalRenderer(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 foritem 459(yellow) and460(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.98realTibia.datβ459/460carry officialSpriteId 0but 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 with459. - Root cause:
Camera.WorldToScreendid not subtract floor delta;ScreenToWorlddid not add it β RMEScreenToMapdoes 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-engineon10.98PASS; manual test459on 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β removedID: xxxband for parity.previewQueue 15ms/4β re-queues ifrenderer==nullβ ensures DAT/SPR async load doesn't leave blank icons.- Fallback chain:
Sprites.GetSprite(SpriteId)direct +GetBrushIconviaSpriteId+ retry after drain. - Quantified: Terrain
405+ Doodad1,302+ Item1,329+ RAW8,372brushes β all with real DAT/SPR previews (577 RAWtotal,575decode,459/460text-only by officialSpriteId 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-6916andearth/cave/icy lawnpreviews β 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.../DuplicarviaCustomBrushCatalog.- Context menu in
PalettePanelβEditar composiciΓ³n...βDarkMenu+selectedBrush != nullvalidation. - 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, sentinel4/4, top-level + nestedv1subtype,v4 ATTRIBUTE_MAP,TELE_DEST/DEPOT_ID/HOUSEDOORID,EXT_ZONE_FILE, unknownMAP_DATAsubtrees,.otgzβ all round-trip lossless. OTBM_TILE_ZONE=19sortedushortset onOtTileβ copy/restore/persist certified.- Typed
MonsterSpawn/NpcSpawnradii independent βGetSpawnCoverageCountuses both radii, notcompatibilityunion.
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)
|
π¨ 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"
|
π 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 |
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.exeMade 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.