Caution
This is not YET fully working app. This is work in progress. Please report any issues in ISSUES tab.
A Modern, Community-Driven 2D Tile-Based Map Editor for Open Tibia.
Quick Start β’ Features β’ Architecture β’ Building β’ Contributing
Disclaimer:
This application was developed entirely by various Agentic AI tools.
Every vibe-coder is welcome to contribute, as project rules and architecture are followed..
ImGui Map Editor is community-driven map editor for Open Tibia, designed from the ground up to deliver exceptional performance, a modern user experience, and seamless cross-platform compatibility. My mission is to empower map creators, server administrators, and content developers with a professional-grade tool that makes map creation intuitive, efficient, and enjoyable.
Built upon the foundation of Remere's Map Editor (RME), this project represents a fundamental reimagining of what a Open Tibia map editor can be. With modern C++20 standards, hardware-accelerated OpenGL rendering, and the battle-tested ImGui framework to create an editor that feels responsive and polished.
Core Principles:
- Performance First: Chunk-based spatial storage, sprite batching, and multi-draw indirect rendering ensure buttery-smooth editing even on massive maps
- Modern Architecture: Clean separation of concerns with service-oriented design, RAII resource management, and dependency injection
- Community-Driven: Open development process, welcoming contributions from the Tibia mapping community.
- Cross-Platform: Native support for Windows, Linux, and macOS
| Feature | RME Classic | ImGui Map Editor |
|---|---|---|
| Rendering | wxWidgets/GDI | Modern OpenGL 3.3+ |
| UI Framework | wxWidgets | Dear ImGui (Docking) |
| Sprite Loading | Synchronous | Async Background Loading |
| Map Storage | Flat arrays | Chunked Spatial Index |
| Multi-Floor View | Basic | Ghost Floor Visualization |
| Light Simulation | Limited | Real-time Dynamic Lighting |
| Undo System | Simple | Compressed Tile Snapshots |
| Architecture | Monolithic | Service-Oriented Modules |
Key Differentiators:
- Hardware-Accelerated Rendering: OpenGL-based pipeline with sprite atlasing and batch rendering achieves 60+ FPS on large maps
- Async Sprite Loading: Background thread loads sprites on-demand, keeping the UI responsive
- Ghost Floor Preview: See adjacent floors with configurable transparency for multi-level editing
- Real-Time Lighting: Dynamic light overlay simulates in-game lighting conditions
- Ribbon Interface: Clean, organized toolbar with logical grouping of features
- Map Creators: Build immersive game worlds with professional tools
- Server Administrators: Maintain and extend existing maps efficiently
- Content Developers: Create custom tilesets, brushes, and palettes
- Open Tibia Contributors: Help push the boundaries of map editing technology
Important
Current Version is (~50% Complete)
This project is actively developed and released for collaborative community development. While many core features are functional, not all RME features have been ported yet By the time beeing - this is NOT RME replacement, until first RC release.
Remere's Map Editor, Item Editor and Object Builder has been the gold standard for Tibia map editing for over a decade, and our architecture draws heavy inspiration from its proven design patterns.
We acknowledge and thank:
- The original developers of open tibia tools (Remere's Map Editor, Object Builder, Item Editor, Otclient/V8 )
- The Open Tibia community for file format specifications
- All contributors who have helped shape this project
# Clone the repository
git clone https://github.com/karolak6612/ImguiMapEditor.git
cd ImguiMapEditor/ImguiMapEditor
# Build (Windows with vcpkg)
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
# Run
./build/Release/TibiaMapEditor.exeFirst Launch:
- Select your Tibia client version (7.1 through 10.10+)
- Point to your client data directory (containing
.datand.sprfiles) - Create a new map or open an existing
.otbmfile
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PRESENTATION LAYER β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β MainWindow β β MenuBar β β Dialogs β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β UI LAYER (ImGui) β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Ribbon β β Panels β β Dialogs β β Widgets β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β CONTROLLER LAYER β
β ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β
β β MapInputCtrl β β HotkeyCtrl β β SearchCtrl β β
β ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β APPLICATION / CORE LAYER β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Application β β EditorSessionβ β BrushSystem β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β TabManager β β StateManager β β Lifecycle β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SERVICES LAYER β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββ β
β β ClientData β βSpriteManagerβ β Clipboard β β Preview β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββ β
β β BrushLookup β β Selection β β MapOps β β Settings β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β DOMAIN LAYER β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β ChunkedMap β β Tile β β Item β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β History β β Selection β β CopyBuf β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β RENDERING LAYER β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β RenderMgr β β Passes β β Overlays β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Light β β Camera β β Minimap β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β I/O LAYER β
β βββββββββββββ βββββββββββββ βββββββββββββ βββββββββββββ β
β β OTBM β β OTB β β DAT/SPR β β XML β β
β βββββββββββββ βββββββββββββ βββββββββββββ βββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β PLATFORM LAYER β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β GLFW + OpenGL + Native File Dialogs β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Dependency Flow: UI Layer β Controllers β Core layer β Services β Domain β I/O β Platform
Warning
Dependencies flow downwards only.
The application core resides in Application/ and manages the editor lifecycle:
| Component | Responsibility |
|---|---|
Application |
Main orchestrator, initialization, main loop |
AppStateManager |
FSM for Startup β Editor transitions |
EditorSession |
Per-map editing session with undo/services |
MapTabManager |
Multi-map tab management |
SessionLifecycleManager |
Session creation, destruction, version switching |
ClientVersionManager |
Client version state and validation |
CallbackMediator |
Decoupled event/callback routing |
MapOperationHandler |
High-level map operations (save, load, export) |
Application Lifecycle:
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β Startup β -> β Version β -> β Editor β
β Dialog β β Selection β β Mode β
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β
v
ββββββββββββββββ
β Load Assets β
β (DAT/SPR/OTB)β
ββββββββββββββββ
The domain layer (Domain/) contains pure business logic with no external dependencies:
ChunkedMap System:
// Hierarchical spatial storage for O(1) tile access
ChunkedMap
βββ FloorMap[0..15] // 16 floors
βββ Chunk[x,y] // 32x32 tile chunks
βββ Tile[0..1023] // Contiguous tile storageKey Domain Classes:
| Class | Purpose |
|---|---|
ChunkedMap |
Root container with chunk-based spatial indexing |
Tile |
Single map tile with ground, items, creatures, spawn |
Item |
Item instance with attributes (action ID, unique ID, etc.) |
Creature |
Creature instance with outfit data |
Position |
Immutable (x, y, z) coordinate tuple |
House |
House definition with tiles and properties |
Spawn |
Spawn point with radius and creature list |
Town |
Town definition with temple position |
History System:
HistoryManager
βββ HistoryBuffer (circular, memory-capped)
βββ HistoryEntry[]
βββ TileSnapshot (compressed delta)
The undo system uses tile snapshots with LZ4 compression to minimize memory usage while supporting unlimited undo depth (configurable cap).
The brush system (Brushes/) is a proof of concept. Its not functional.
The rendering system (Rendering/) uses modern OpenGL with a multi-pass architecture:
RenderOrchestrator
βββ RenderingManager
βββ TileRenderer ββββββββββββββββββββββββββ
β β
βββ TerrainPass (Base layer) β
βββ SpawnTintPass (Spawn overlay) β
βββ GhostFloorRenderer (Adjacent floors)β
βββ LightingPass (Dynamic lights) β
βββ OverlayRenderer ββββββββββββββββββ€
βββ GridOverlay β
βββ SelectionOverlay β
βββ PreviewOverlay β
βββ TooltipOverlay β
βββ SpawnLabelOverlay β
βββ WaypointOverlay β
βββ StatusOverlay β
β
SpriteBatcher βββββββββββββββββββββ
βββ RingBuffer (GPU staging)
βββ SpriteAtlas (Texture packing)
Rendering Optimizations:
| Technique | Benefit |
|---|---|
| Chunk-level culling | Skip invisible chunks entirely |
| Sprite batching | Minimize draw calls |
| Ring buffer | Lock-free GPU uploads |
| Atlas packing | Reduce texture binds |
| Async sprite loading | Non-blocking asset loading |
Light System:
LightManager
βββ LightGatherer // Collect light sources in view
βββ LightCache // Memoize light calculations
βββ LightTexture // GPU light lookup texture
βββ LightOverlay // Final compositing
The I/O layer (IO/) handles all file format parsing and serialization:
Binary Formats:
| Reader/Writer | Format | Purpose |
|---|---|---|
OtbmReader/Writer |
.otbm |
Open Tibia Binary Map |
OtbReader |
.otb |
Item type definitions |
SprReader |
.spr |
Sprite graphics |
DatReaderV* |
.dat |
Item/creature metadata |
SecReader |
.sec |
Secondary client data |
NodeFileReader |
Binary nodes | Hierarchical binary format |
Dat Reader Hierarchy:
DatReaderBase (Abstract)
βββ DatReaderV710 (Tibia 7.10)
βββ DatReaderV740 (Tibia 7.40)
βββ DatReaderV755 (Tibia 7.55)
βββ DatReaderV780 (Tibia 7.80)
βββ DatReaderV860 (Tibia 8.60)
βββ DatReaderV1010 (Tibia 10.10+)
XML Formats:
| Reader/Writer | Format | Purpose |
|---|---|---|
BrushXmlReader |
brushes.xml |
Brush definitions |
CreatureXmlReader |
creatures.xml |
Creature types |
ItemXmlReader |
items.xml |
Item metadata |
TilesetXmlReader/Writer |
tilesets.xml |
Tileset organization |
PaletteXmlReader |
palettes.xml |
Palette definitions |
HouseXmlReader/Writer |
houses.xml |
House data |
SpawnXmlReader/Writer |
spawns.xml |
Spawn data |
MaterialsXmlReader |
materials.xml |
Material definitions |
The services layer (Services/) provides business logic and utilities:
Core Services:
| Service | Responsibility |
|---|---|
ClientDataService |
Item types, object attributes |
SpriteManager |
Sprite loading, caching, GPU upload |
SpriteAsyncLoader |
Background sprite loading queue |
ClipboardService |
Copy/paste operations |
BrushSettingsService |
Brush size, shape, parameters |
ConfigService |
Application configuration |
HotkeyRegistry |
Keyboard shortcut management |
ViewSettings |
Rendering preferences |
TilesetService |
Tileset and palette management |
CreatureSpriteService |
Creature outfit rendering |
CreatureSimulator |
Creature animation simulation |
Map Services:
| Service | Responsibility |
|---|---|
MapLoadingService |
Map file loading orchestration |
MapSavingService |
Map serialization |
MapEditingService |
Tile modification operations |
MapSearchService |
Search and replace |
MapCleanupService |
Remove invalid items, fix errors |
MapMergeService |
Combine multiple maps |
Brush Lookup Services:
| Service | Purpose |
|---|---|
BorderLookupService |
Border/transition tile lookup |
WallLookupService |
Wall segment lookup |
CarpetLookupService |
Carpet pattern lookup |
TableLookupService |
Table arrangement lookup |
Preview System:
PreviewService
βββ PreviewManager // Coordinates preview providers
βββ Providers/
βββ ItemPreviewProvider
βββ CreaturePreviewProvider
βββ DoodadPreviewProvider
βββ GroundPreviewProvider
βββ WallPreviewProvider
The UI layer (UI/) uses Dear ImGui with a docking-enabled layout:
Component Hierarchy:
UI/
βββ Core/
β βββ Theme system
βββ Ribbon/
β βββ RibbonController
β βββ Panels/
β βββ FilePanel
β βββ EditPanel
β βββ ViewPanel
β βββ BrushesPanel
β βββ PalettesPanel
β βββ SelectionPanel
βββ Panels/
β βββ MapPanel (main editing viewport)
βββ Widgets/
β βββ TilesetWidget
β βββ TilesetGridWidget
β βββ SpritePicker
βββ Dialogs/
β βββ Startup/
β β βββ StartupDialog
β β βββ VersionSelectionDialog
β βββ Properties/
β β βββ TilePropertiesDialog
β β βββ ItemPropertiesDialog
β βββ Import/
β βββ ClientConfiguration/
β βββ NewMapDialog
β βββ EditTownsDialog
β βββ AdvancedSearchDialog
β βββ ConfirmationDialog
βββ Windows/
βββ MinimapWindow
βββ BrowseTileWindow
βββ IngameBoxWindow
βββ PaletteWindowManager
Controllers (Controllers/) handle user input and coordinate UI with services:
| Controller | Responsibility |
|---|---|
MapInputController |
Mouse/keyboard input on map viewport |
HotkeyController |
Global keyboard shortcut handling |
SearchController |
Search dialog coordination |
SimulationController |
Creature animation playback |
StartupController |
Startup flow orchestration |
WindowController |
Window state management |
WorkspaceController |
Panel layout management |
| Technology | Version | Purpose |
|---|---|---|
| C++ | C++20 | Core language |
| CMake | 3.25+ | Build system |
| vcpkg / Conan | Latest | Package management |
| Library | Purpose |
|---|---|
| OpenGL | 3.3+ Core Profile rendering |
| GLFW | Window creation, input handling |
| GLAD | OpenGL function loading |
| GLM | Mathematics (vectors, matrices) |
| stb_image | Image loading |
| Library | Purpose |
|---|---|
| Dear ImGui | Immediate-mode GUI (docking branch) |
| FontAwesome 6 | Icon font |
| ImGuiNotify | Toast notifications |
| imHotKey | Hotkey binding UI |
| nativefiledialog-extended | Native file dialogs |
| Library | Purpose |
|---|---|
| spdlog | Logging |
| nlohmann_json | JSON parsing |
| pugixml | XML parsing |
| fmt | String formatting |
| LZ4 | Fast compression |
| Boost.IOStreams | Stream utilities |
| Boost.Filesystem | Path handling |
| Boost.CircularBuffer | History buffer |
| zlib | Compression |
- C++ Compiler: MSVC 2022, GCC 11+, or Clang 14+
- CMake: 3.20 or newer
- Git: For cloning and submodule management
- GPU: OpenGL 3.3+ capable graphics card
vcpkg is automatically integrated via CMake manifest mode.
Windows (Visual Studio):
# Clone the repository
git clone https://github.com/karolak6612/ImguiMapEditor.git
cd ImguiMapEditor/ImguiMapEditor
# Configure (vcpkg will auto-install dependencies)
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
# Build
cmake --build build --config Release
# The executable is at: build/Release/TibiaMapEditor.exeLinux/macOS:
# Ensure vcpkg is installed and VCPKG_ROOT is set
export VCPKG_ROOT=/path/to/vcpkg
cmake -S . -B build \
-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_BUILD_TYPE=Release
cmake --build build
# The executable is at: build/TibiaMapEditor# Install Conan
pip install conan
conan profile detect # First time only
cd ImguiMapEditor
# Install dependencies
conan install . --output-folder=build --build=missing -s build_type=Release
# Configure
cmake -S . -B build \
-DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release
# Build
cmake --build build --config Release| Issue | Solution |
|---|---|
| vcpkg not found | Set VCPKG_ROOT environment variable |
| OpenGL headers missing | Ensure GPU drivers are installed |
| Compiler too old | Upgrade to MSVC 2022, GCC 11+, or Clang 14+ |
| CMake version | Upgrade to CMake 3.25+ |
| Boost linking errors | Clean build directory and rebuild vcpkg |
The editor requires Tibia client data files to function:
- Obtain Client Files: You need
.dat,.spr, and.otbfiles from a Tibia client - Supported Versions: 7.10 through 10.10+ (see
clients.jsonfor full list) - Directory Structure:
client_data/
βββ 854/ # Version-specific folder
β βββ Tibia.dat
β βββ Tibia.spr
β βββ items.otb
βββ 1010/
β βββ Tibia.dat
β βββ Tibia.spr
β βββ items.otb
βββ ...
- Configuration: On first launch, use the Client Configuration dialog to point to your client data directories
First Launch:
- The Startup Dialog appears on launch
- Click "Configure Clients" to set up your client data paths
- Select a client version for your new map
- Choose "New Map" or "Open Map"
Interface Overview:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Ribbon Toolbar (File | Edit | View | Brushes | Palettes | ...) β
βββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββ€
β β β β
β Palette β Map Viewport β Minimap β
β Panel β β β
β β βββββββββββββββββ€
β β β β
β β β Tile β
β β β Inspector β
β β β β
βββββββββββββββ΄ββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββ
β Status Bar β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Action | Shortcut |
|---|---|
| New Map | Ctrl+N |
| Open Map | Ctrl+O |
| Save Map | Ctrl+S |
| Save As | Ctrl+Shift+S |
| Undo | Ctrl+Z |
| Redo | Ctrl+Y |
| Copy | Ctrl+C |
| Paste | Ctrl+V |
| Cut | Ctrl+X |
| Delete | Delete |
| Select All | Ctrl+A |
| Floor Up | Page Up |
| Floor Down | Page Down |
| Zoom In | Mouse Wheel Up |
| Zoom Out | Mouse Wheel Down |
| Toggle Grid | G |
| Toggle Minimap | M |
| Search | Ctrl+F |
| Preferences | Ctrl+, |
Hotkeys are customizable via Edit β Preferences β Hotkeys
ImguiMapEditor/
βββ Application/ # Core application lifecycle
β βββ Coordination/ # Version switching, session coordination
β βββ Selection/ # Selection state management
βββ Brushes/ # Painting tools
β βββ Behaviors/ # Brush behavior strategies
β βββ Core/ # Base brush interfaces
β βββ Data/ # Brush data structures
β βββ Enums/ # Brush enumerations
β βββ Types/ # Concrete brush implementations
βββ Controllers/ # Input handling and UI coordination
βββ Core/ # Configuration and constants
βββ Domain/ # Business logic and data models
β βββ Algorithms/ # Map algorithms
β βββ History/ # Undo/redo system
β βββ Palette/ # Palette definitions
β βββ Search/ # Search data structures
β βββ Selection/ # Selection data structures
β βββ Tileset/ # Tileset definitions
βββ IO/ # File format handlers
β βββ Flags/ # Item flags
β βββ Otbm/ # OTBM format
β βββ Readers/ # DAT version readers
β βββ Sec/ # SEC format
βββ Input/ # Low-level input handling
βββ Platform/ # OS abstraction
βββ Presentation/ # High-level UI shells
β βββ Dialogs/ # Modal dialogs
βββ Rendering/ # Graphics pipeline
β βββ Animation/ # Sprite animation
β βββ Backend/ # OpenGL wrappers
β βββ Camera/ # View camera
β βββ Core/ # Renderer core
β βββ Frame/ # Frame orchestration
β βββ Light/ # Lighting system
β βββ Map/ # Map rendering
β βββ Minimap/ # Minimap rendering
β βββ Overlays/ # UI overlays
β βββ Passes/ # Render passes
β βββ Resources/ # GPU resources
β βββ Selection/ # Selection rendering
β βββ Tile/ # Tile rendering
β βββ Utils/ # Rendering utilities
β βββ Visibility/ # Visibility culling
βββ Services/ # Business services
β βββ Brushes/ # Brush lookup services
β βββ Map/ # Map operations
β βββ Preview/ # Preview providers
β βββ Selection/ # Selection services
βββ UI/ # ImGui interface
β βββ Core/ # UI core (themes)
β βββ Dialogs/ # Dialog windows
β βββ DTOs/ # Data transfer objects
β βββ Map/ # Map panel
β βββ Panels/ # Dockable panels
β βββ Ribbon/ # Ribbon toolbar
β βββ Utils/ # UI utilities
β βββ Widgets/ # Reusable widgets
β βββ Windows/ # Floating windows
βββ Utils/ # General utilities
βββ ext/ # External dependencies
βββ sample_data/ # Sample configuration files
βββ shaders/ # GLSL shader files
| Element | Convention | Example |
|---|---|---|
| Classes | PascalCase | ChunkedMap, TileRenderer |
| Functions | camelCase | loadMap(), getTile() |
| Member Variables | snake_case_ (trailing underscore) | sprite_manager_ |
| Constants | UPPER_SNAKE_CASE | CHUNK_SIZE, MAX_FLOORS |
| Namespaces | PascalCase | MapEditor::Domain |
| Files | PascalCase | ChunkedMap.cpp, ChunkedMap.h |
Adding a New Brush Type:
- Create class in
Brushes/Types/inheriting fromIBrush - Implement
apply(),canDraw(), and metadata methods - Register in
BrushRegistry - Add preview provider in
Services/Preview/
Adding a New Overlay:
- Create class in
Rendering/Overlays/implementingIOverlayRenderer - Implement
render()method - Register in
OverlayManager - Add toggle in
ViewSettings
Adding a New File Format:
- Create reader/writer in
IO/ - Follow existing patterns (OtbmReader, etc.)
- Wire into
MapLoadingServiceorMapSavingService
Adding a New Service:
- Create class in
Services/ - Use dependency injection via constructor
- Wire in
Application::initializeServices() - Document service responsibilities
-
Clone with submodules:
git clone --recursive https://github.com/karolak6612/ImguiMapEditor.git
-
IDE Setup:
- Visual Studio 2022: Open the folder, CMake integration automatic
- VS Code: Install C++ and CMake extensions
- CLion: Import CMake project
-
Run tests:
cmake --build build --target run_tests
Important
Read AGENTS.MD for complete style guidelines!
Core Rules:
- C++20 standard: Use modern features (concepts, ranges, etc.)
- RAII everywhere: No manual resource management
- Const-correctness: Mark methods
constwhen possible - No globals: Use dependency injection
- One class per file: Unless tightly coupled helpers
- Max 120 chars: Per line - soft rule
- Max 50 lines: Per function (refactor if longer) - soft rule
Before submitting code:
β No duplicate code
β Nothing in Application.cpp except wiring
β Code in correct module
β Existing utilities reused
β Headers properly organized
β RAII for OpenGL objects
β Clear ownership semantics
- Fork the repository
- Create a feature branch:
feature/my-feature - Make small, focused commits
- Write descriptive commit messages
- Open a Pull Request against
main - Address review feedback
Commit Message Format:
type(scope): Short description
Longer explanation if needed.
Fixes #123
Types: feat, fix, refactor, docs, style, test, chore
Problem: Tibia maps can be up to 65536x65536 tiles Γ 16 floors. A flat array would require 68 billion tile slots.
Solution: Chunk-based spatial index with 32x32 tile chunks.
Benefits:
- Memory efficiency: Only allocate chunks with content
- Cache efficiency: Tiles in a chunk are contiguous in memory
- Culling: Skip entire chunks outside viewport
- Dirty tracking: Invalidate render state per-chunk
Problem: wxWidgets/GDI rendering in RME was CPU-bound and slow on large viewports.
Solution: OpenGL 3.3+ with modern techniques.
Benefits:
- GPU acceleration: Leverages dedicated graphics hardware
- Batching: Thousands of sprites in few draw calls
- Shader-based: Flexible effects (lighting, tinting)
- Cross-platform: Consistent behavior across OSes
Problem: wxWidgets is verbose, platform-inconsistent, and slow to develop with.
Solution: Dear ImGui immediate-mode GUI.
Benefits:
- Rapid iteration: Change UI in real-time
- Consistent: Identical across all platforms
- Docking: Flexible panel layouts out of the box
- Performance: Minimal overhead
Problem: Monolithic code becomes unmaintainable.
Solution: Services with clear responsibilities and dependency injection.
Benefits:
- Testability: Mock services in tests
- Decoupling: Changes isolated to services
- Clarity: Easy to find functionality
- Reusability: Services can be shared
Q: Is this a replacement for Remere's Map Editor?
A: No. Its an experimental concept which is far from beeing a fully functional map editor.
Q: Can I open my existing RME maps?
A: Yes! The OTBM format is fully supported for reading, and partially for writing.
Q: Which client versions are supported?
A: Tibia 7.10 through 10.10+. See clients.json for the complete list.
Q: Will this work on Linux/macOS?
A: The codebase is cross-platform, but testing has focused on Windows. Community testing on other platforms is welcome.
Q: How can I contribute?
A: Fork the repo, make changes, and open a Pull Request. See the Contributing Guide above.
- Project Lead: @karolak6612
- Contributors: See CONTRIBUTORS.md
- Remere's Map Editor, Object Builder, Item Editor, Otclient/V8 developers for the foundational work
- Open Tibia community for format specifications
- Dear ImGui by Omar Cornut
- All open-source library authors
See Technology Stack for the complete list.
This project is licensed under the AGPL v3 - see the LICENSE file for details.
This project includes code and assets from various open-source projects, each with their own licenses. See individual library documentation for details.
Caution
Tibia is a registered trademark of CipSoft GmbH. This project is not affiliated with, endorsed by, or connected to CipSoft GmbH in any way. This is a community tool for Open Tibia servers. THE SOFTWARE AND ANY RELATED DOCUMENTATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OR MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU
Built with β€οΈ by the Open Source Community