Um editor moderno e profissional de assets do Tibia 15.x construído com Rust + Tauri 2 no backend e TypeScript + Vite 6 no frontend. Permite explorar, editar e gerenciar completamente os assets do Tibia, incluindo appearances (Objects, Outfits, Effects, Missiles), sprites e sons.
Tibia Assets Editor é uma aplicação desktop completa e profissional para gerenciamento de assets do Tibia 15.x, oferecendo:
- Parser Completo de Appearances: Leitura e manipulação de
appearances.datvia Protocol Buffers (usandoprost 0.14). - Suporte Multi-Categoria: Objects, Outfits, Effects, Missiles e Sounds.
- Editor Avançado de Propriedades: Edição completa de flags, atributos e configurações de appearances.
- Gerenciamento de Sprites: Visualização, cache otimizado e preview de sprites com suporte a animações.
- Sistema de Sons: Carregamento e gerenciamento de efeitos sonoros, ambient streams, object streams e music templates.
- Importação/Exportação: Suporte para exportar e importar appearances em formato JSON.
- Interface Moderna: UI responsiva e intuitiva com suporte a múltiplos temas e idiomas (Português, English, Español, Русский).
- Sistema de Seleção Múltipla: Seleção e manipulação de múltiplos assets simultaneamente.
- Infinite Scroll: Navegação otimizada com scroll infinito para grandes conjuntos de dados.
- Preview de Animações: Visualização de animações de outfits e outros assets com controles de playback.
- Sistema de Temas: 6 temas profissionais (Default, Ocean, Aurora, Ember, Forest, Dusk).
- Internacionalização (i18n): Interface multilíngue com suporte completo a PT-BR, EN, ES e RU.
- Cache Inteligente: Sistema de cache otimizado com DashMap (lock-free) para sprites.
- Subcategorias de Objects: Navegação organizada por tipos (Armors, Weapons, Tools, etc.).
- Special Meaning IDs: Suporte para IDs especiais do Tibia.
- Clipboard de Flags: Copiar e colar propriedades entre appearances.
- Texture Settings: Configuração avançada de texturas para appearances.
- Auto-animação: Opção de animação automática na grade de assets.
- Windows 10/11 (suporte primário; Linux/macOS em desenvolvimento).
- Node.js 18+ e npm.
- Rust 1.90+ com toolchain MSVC.
- Pré-requisitos Tauri no Windows:
- Microsoft Visual C++ Build Tools (Desktop development with C++).
- Microsoft Edge WebView2 Runtime instalado.
Frontend:
@tauri-apps/api: ^2@tauri-apps/plugin-dialog: ^2@tauri-apps/plugin-opener: ^2vite: ^6.0.3typescript: ~5.6.2
Backend (Rust):
tauri: 2 (com plugins dialog e opener)prost: 0.14 (Protocol Buffers)prost-types: 0.14lzma-rs: 0.3 (decompressão LZMA)xz2: 0.1 (decompressão XZ)image: 0.25 (manipulação de imagens - PNG, JPEG, BMP)serde+serde_json: 1 (serialização)anyhow: 1.0 +thiserror: 2.0 (error handling)log: 0.4 +env_logger: 0.11base64: 0.22dashmap: 6.1 (estruturas de dados lock-free)
O projeto requer Rust 1.90 ou superior com toolchain MSVC.
Windows:
- Baixe e instale o rustup em https://rustup.rs/
- Execute o instalador
rustup-init.exe - Escolha a opção padrão de instalação (opção 1)
- Reinicie o terminal após a instalação
- Verifique a instalação:
rustc --version cargo --version
Alternativa usando winget:
winget install Rustlang.RustupNecessário Node.js 18 ou superior.
Windows:
- Baixe em https://nodejs.org/ (recomendado: versão LTS)
- Ou use winget:
winget install OpenJS.NodeJS.LTS
Verifique a instalação:
node --version
npm --versionMicrosoft Visual C++ Build Tools:
- Baixe Visual Studio Build Tools
- Durante a instalação, selecione "Desktop development with C++"
- Certifique-se de que os seguintes componentes estão marcados:
- MSVC v143 - VS 2022 C++ x64/x86 build tools (ou mais recente)
- Windows 10/11 SDK
Microsoft Edge WebView2 Runtime:
- Geralmente já vem instalado no Windows 10/11
- Se necessário, baixe em https://developer.microsoft.com/microsoft-edge/webview2/
-
Clone o repositório:
git clone https://github.com/seu-usuario/tibia-assets-editor.git cd tibia-assets-editor -
Instale dependências do frontend:
npm install
-
Compile as dependências Rust (primeira vez):
cd src-tauri cargo build cd ..
Nota: A primeira compilação pode demorar vários minutos, pois o Cargo irá baixar e compilar todas as dependências.
-
(Opcional) Configure variáveis de ambiente para desenvolvimento remoto:
TAURI_DEV_HOST— host para HMR remoto (ver vite.config.ts)
- src-tauri/tauri.conf.json:
devUrl = http://localhost:1420,frontendDist = ../dist - vite.config.ts: Servidor Vite usa porta
1420e HMR em1421(quandoTAURI_DEV_HOSTestá definido) - tsconfig.json: TypeScript estrito com target ES2020
# Iniciar aplicação em modo desenvolvimento (Tauri + Vite)
npm run tauri dev
# Somente frontend (Vite)
npm run dev
# Preview do build do Vite
npm run preview# Criar instalador/executável
npm run tauri build-
Configuração Inicial:
- Selecione o diretório do cliente Tibia (detecção automática disponível via
select_tibia_directory) - O caminho é salvo automaticamente para sessões futuras
- Selecione o diretório do cliente Tibia (detecção automática disponível via
-
Carregamento de Assets:
- Carregue os appearances automaticamente
- Sistema detecta e carrega
appearances_latest.datou o arquivo mais recente - Sons são carregados automaticamente do diretório
sounds/
-
Navegação:
- Navegue pelas categorias (Objects, Outfits, Effects, Missiles, Sounds)
- Use subcategorias para filtrar Objects por tipo
- Sistema de busca em tempo real
- Paginação com tamanhos customizáveis (100, 500, 1000, 10000, 50000 itens)
-
Edição de Assets:
- Clique em um asset para ver detalhes completos
- Use a aba "Edit" para modificar propriedades
- Use a aba "Texture" para configurações de textura
- Navegue entre assets usando os botões anterior/próximo
-
Sprites/Catalog:
- A aplicação procura
catalog-content.jsonno diretório do projeto - Se não existir, tenta em
<Tibia>/assets/catalog-content.json - Cache automático de sprites para performance otimizada
- A aplicação procura
tibia-assets-editor/
├── src/ # Frontend (TypeScript/HTML/CSS)
│ ├── main.ts # Ponto de entrada, inicialização
│ ├── assetUI.ts # Lógica da grade de assets
│ ├── assetDetails.ts # Modal de detalhes de assets
│ ├── assetSave.ts # Lógica de salvamento
│ ├── assetSelection.ts # Sistema de seleção múltipla
│ ├── animation.ts # Sistema de animação
│ ├── spriteCache.ts # Cache de sprites no frontend
│ ├── i18n.ts # Sistema de internacionalização
│ ├── navigation.ts # Navegação entre telas
│ ├── sounds.ts # Interface de sons
│ ├── soundTypes.ts # Tipos de sons
│ ├── textureTab.ts # Aba de texturas
│ ├── importExport.ts # Importação/exportação JSON
│ ├── utils.ts # Utilitários gerais
│ ├── types.ts # TypeScript types
│ ├── specialMeaning.ts # IDs especiais do Tibia
│ ├── confirmModal.ts # Modal de confirmação
│ ├── addSoundModal.ts # Modal de adição de sons
│ ├── eventListeners.ts # Event listeners globais
│ ├── features/
│ │ ├── assetGrid/ # Layout da grade de assets
│ │ ├── infiniteScroll/ # Scroll infinito
│ │ ├── layout/ # Layout components
│ │ └── previewAnimation/ # Sistema de preview de animações
│ └── styles/ # CSS modular
│ ├── main.css # CSS principal (imports)
│ ├── variables.css # Variáveis CSS
│ ├── theme.css # Sistema de temas
│ ├── base.css # Estilos base
│ ├── animations.css # Animações
│ ├── buttons.css # Botões
│ ├── forms.css # Formulários
│ ├── header.css # Header
│ ├── categories.css # Categorias
│ ├── assets.css # Grade de assets
│ ├── modals.css # Modals
│ ├── search.css # Busca
│ ├── loading.css # Loading screen
│ ├── audio.css # Player de áudio
│ ├── texture.css # Aba de texturas
│ ├── responsive.css # Media queries
│ └── utilities.css # Utilitários
├── index.html # HTML base da aplicação
├── src-tauri/ # Backend (Rust/Tauri)
│ ├── src/
│ │ ├── main.rs # Entry point
│ │ ├── lib.rs # Builder Tauri, registro de comandos
│ │ ├── state.rs # Estado global da aplicação
│ │ ├── core/ # Módulos core
│ │ │ ├── lzma/ # Decompressão LZMA/XZ
│ │ │ └── protobuf/ # Definições protobuf geradas
│ │ └── features/ # Features organizadas por domínio
│ │ ├── appearances/ # Feature de appearances
│ │ │ ├── mod.rs
│ │ │ ├── types.rs # Tipos e estruturas
│ │ │ ├── parsers/ # Parsers de appearances
│ │ │ └── commands/ # Comandos Tauri
│ │ │ ├── io.rs # Load/save/list files
│ │ │ ├── query.rs # Consultas e filtros
│ │ │ ├── update.rs # Atualizações de properties
│ │ │ ├── import_export.rs # JSON import/export
│ │ │ ├── conversion.rs # Conversões de tipos
│ │ │ ├── helpers.rs # Funções auxiliares
│ │ │ └── category_types.rs # Tipos de categorias
│ │ ├── sprites/ # Feature de sprites
│ │ │ ├── mod.rs
│ │ │ ├── parsers/ # SpriteLoader
│ │ │ └── commands/ # Comandos de sprites
│ │ ├── sounds/ # Feature de sons
│ │ │ ├── mod.rs
│ │ │ ├── parsers/ # Parser de sounds.dat
│ │ │ └── commands/ # Comandos de sons
│ │ └── settings/ # Configurações persistentes
│ ├── protobuf/ # Arquivos .proto
│ │ ├── appearances.proto # Schema de appearances
│ │ └── sounds.proto # Schema de sounds
│ ├── build.rs # Build script (compila protobuf)
│ ├── tauri.conf.json # Configuração Tauri
│ ├── capabilities/ # Permissões e capabilities
│ │ └── default.json
│ ├── icons/ # Ícones da aplicação
│ └── Cargo.toml # Dependências Rust
├── package.json # Scripts NPM e deps frontend
├── tsconfig.json # Config TypeScript (strict)
├── vite.config.ts # Config Vite (porta 1420)
└── README.md # Este arquivo
cd src-tauri
cargo test
# Teste específico com output
cargo test test_load_tibia_appearances -- --ignored --nocapturenpm run dev: Inicia Vite dev servernpm run build: Compila TypeScript e cria build Vitenpm run preview: Preview do buildnpm run tauri: CLI do Tauri (dev/build/etc)
O backend segue uma arquitetura modular baseada em features:
- appearances: Gerenciamento de appearances (Objects, Outfits, Effects, Missiles)
- sprites: Carregamento e cache de sprites
- sounds: Gerenciamento de sons e efeitos sonoros
- settings: Configurações persistentes da aplicação
Cada feature contém:
mod.rs: Exportações públicastypes.rs: Tipos e estruturas de dadosparsers/: Lógica de parsingcommands/: Comandos Tauri (API IPC)
select_tibia_directory() -> string: Detecta automaticamente caminhos comuns do Tibia no Windowslist_appearance_files(tibia_path: string) -> string[]: Lista arquivosappearances-*.datem<Tibia>/assetsload_appearances_file(path: string) -> AppearanceStats: Decodifica protobuf (com fallback LZMA/XZ)get_appearance_stats() -> AppearanceStats: Estatísticas totais por categoriasave_appearances_file() -> number: Serializa e grava no caminho carregado
list_appearances_by_category(category, page, page_size, search?, subcategory?) -> AppearanceItem[]: Listagem paginada com filtrofind_appearance_position(category, id) -> number: Encontra posição de um appearanceget_appearance_details(category, id) -> AppearanceDetails: Informações de frame groups e spritesget_complete_appearance(category, id) -> CompleteAppearanceItem: Estrutura completa (flags, frameGroups, spriteInfo)get_appearance_count(category, search?, subcategory?) -> number: Contagem para paginaçãoget_item_subcategories() -> [key, label][]: Pares chave/rótulo para filtrosget_special_meaning_ids() -> SpecialMeaningIds: IDs especiais do Tibia
update_appearance_name(category, id, new_name) -> AppearanceItemupdate_appearance_description(category, id, new_description) -> AppearanceItemupdate_appearance_flag_bool(category, id, flag, value) -> AppearanceItem: Ativa/desativa flags booleanas
update_appearance_light(category, id, brightness?, color?) -> AppearanceItemupdate_appearance_shift(category, id, x?, y?) -> AppearanceItemupdate_appearance_height(category, id, elevation?) -> AppearanceItemupdate_appearance_write(category, id, max_text_length?) -> AppearanceItemupdate_appearance_write_once(category, id, max_text_length_once?) -> AppearanceItemupdate_appearance_automap(category, id, color?) -> AppearanceItemupdate_appearance_hook(category, id, type?, direction?) -> AppearanceItemupdate_appearance_lenshelp(category, id, lenshelp_id?) -> AppearanceItemupdate_appearance_clothes(category, id, slot?) -> AppearanceItemupdate_appearance_default_action(category, id, action?) -> AppearanceItem
update_appearance_market(category, id, market_data) -> AppearanceItemupdate_appearance_bank(category, id, waypoints?) -> AppearanceItemupdate_appearance_changed_to_expire(category, id, former_object_typeid?) -> AppearanceItemupdate_appearance_cyclopedia_item(category, id, cyclopedia_type?) -> AppearanceItemupdate_appearance_upgrade_classification(category, id, upgrade_classification?) -> AppearanceItem
update_appearance_skillwheel_gem(category, id, gem_type?, visual_id?) -> AppearanceItemupdate_appearance_imbueable(category, id, imbuement_slot?, base_imbuement_slot?) -> AppearanceItemupdate_appearance_proficiency(category, id, proficiency_name?) -> AppearanceItemupdate_appearance_transparency_level(category, id, level?) -> AppearanceItemupdate_appearance_weapon_type(category, id, weapon_type?) -> AppearanceItemupdate_appearance_texture_settings(category, id, texture_data) -> AppearanceItem
export_appearance_to_json(category, id) -> string: Exporta appearance para JSONimport_appearance_from_json(category, json_data) -> AppearanceItem: Importa de JSONduplicate_appearance(category, source_id) -> AppearanceItem: Duplica um appearancecreate_empty_appearance(category) -> AppearanceItem: Cria novo appearance vaziocopy_appearance_flags(category, id) -> void: Copia flags para clipboardpaste_appearance_flags(category, id) -> AppearanceItem: Cola flags do clipboarddelete_appearance(category, id) -> void: Remove um appearance
load_sprites_catalog(catalog_path, assets_dir) -> number: Inicializa SpriteLoaderauto_load_sprites(tibia_path) -> number: Usacatalog-content.json(projeto ou<Tibia>/assets)get_sprite_by_id(sprite_id) -> base64: Converte sprite para PNG em base64get_appearance_sprites(category, appearance_id) -> base64[]: Retorna todos os sprites (usa cache)get_appearance_preview_sprite(category, appearance_id) -> base64?: Retorna primeiro sprite como previewclear_sprite_cache() -> number: Limpa cache de spritesget_sprite_cache_stats() -> [entries, sprites]: Estatísticas do cache
load_sounds_file(sounds_dir) -> SoundStats: Carrega sons do diretórioget_sounds_stats() -> SoundStats: Estatísticas de sonslist_sound_types() -> string[]: Lista tipos de sons disponíveisget_sound_by_id(sound_id) -> SoundInfo: Obtém informações de um somget_sounds_by_type(sound_type) -> SoundInfo[]: Lista sons por tipolist_all_sounds() -> SoundInfo[]: Lista todos os sonsget_sound_audio_data(sound_id) -> base64: Dados de áudio em base64get_sound_file_path(sound_id) -> string: Caminho do arquivo de som
list_numeric_sound_effects() -> NumericSoundEffect[]: Lista efeitos sonoros numéricosget_numeric_sound_effect_by_id(effect_id) -> NumericSoundEffect: Obtém efeito por IDget_sound_effect_count() -> number: Contagem de efeitos
list_ambience_streams() -> AmbienceStream[]: Lista streams de ambienteget_ambience_stream_by_id(stream_id) -> AmbienceStream: Obtém stream por IDget_ambience_stream_count() -> number: Contagem de streams
list_ambience_object_streams() -> AmbienceObjectStream[]: Lista object streamsget_ambience_object_stream_by_id(stream_id) -> AmbienceObjectStream: Obtém por IDget_ambience_object_stream_count() -> number: Contagem
list_music_templates() -> MusicTemplate[]: Lista templates de músicaget_music_template_by_id(template_id) -> MusicTemplate: Obtém template por IDget_music_template_count() -> number: Contagem de templates
update_sound_info(sound_id, name?, category?) -> SoundInfo: Atualiza informações básicasupdate_numeric_sound_effect(effect_id, data) -> NumericSoundEffect: Atualiza efeitoupdate_ambience_stream(stream_id, data) -> AmbienceStream: Atualiza streamupdate_ambience_object_stream(stream_id, data) -> AmbienceObjectStream: Atualiza object streamupdate_music_template(template_id, data) -> MusicTemplate: Atualiza template
save_sounds_file() -> number: Salva alteraçõesadd_sound(sound_data) -> SoundInfo: Adiciona novo somdelete_sound(sound_id) -> void: Remove somadd_numeric_sound_effect(effect_data) -> NumericSoundEffect: Adiciona efeitodelete_numeric_sound_effect(effect_id) -> void: Remove efeitoimport_and_add_sound(file_path, name?, category?) -> SoundInfo: Importa arquivo de som
set_tibia_base_path(tibia_path: string) -> void: Persiste caminho emsettings.jsonget_tibia_base_path() -> string | null: Obtém caminho persistido
Objects: Itens, decorações, equipamentosOutfits: Roupas e looksEffects: Efeitos visuaisMissiles: Projéteis
Subcategorias de Objects:
- Equipamentos:
Armors,Amulets,Boots,HelmetsHats,Legs,Rings,Shields - Armas:
Axes,Clubs,DistanceWeapons,Swords,WandsRods - Consumíveis:
Food,Potions,Runes - Outros:
Containers,Decoration,Tools,Valuables,Ammunition,PremiumScrolls,TibiaCoins,CreatureProducts,Quiver,Soulcores,Others
O aplicativo suporta 6 temas visuais:
- Default: Azul/roxo profissional
- Ocean: Tons de azul oceânico
- Aurora: Roxo/rosa vibrante
- Ember: Laranja/vermelho quente
- Forest: Verde natural
- Dusk: Dourado/azul crepuscular
Temas são aplicados via classes CSS e persistidos no localStorage.
Suporte completo a 4 idiomas:
- Português (pt-BR): Idioma padrão
- English (en)
- Español (es)
- Русский (ru)
Sistema i18n implementado com:
- Traduções dinâmicas via atributos
data-i18n - Placeholders traduzidos
- Formatação de números e contadores
- Persistência de preferência no localStorage
- Fork o repositório e crie uma branch descritiva (ex.:
feat/sprite-editor,fix/cache-leak) - Commits semânticos:
feat:para novas funcionalidadesfix:para correçõesrefactor:para refatoraçõesdocs:para documentação
- Garanta qualidade:
- Execute
npm run tauri deve teste a funcionalidade - Execute
cargo testpara testes Rust - Mantenha TypeScript strict mode
- Execute
- Estilo de código:
- TypeScript: Configuração strict do tsconfig.json
- Rust: Use
cargo fmtantes de commitar - CSS: Use variáveis CSS existentes e padrões de nomenclatura
- Pull Request:
- Descrição clara da mudança
- Screenshots para mudanças de UI
- Passos de teste detalhados
Este projeto está licenciado sob a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License (CC BY-NC-SA 4.0).
✅ Você PODE:
- Usar o software para fins pessoais e educacionais
- Visualizar, estudar e aprender com o código
- Modificar e adaptar o software
- Compartilhar suas modificações (sob a mesma licença)
- Contribuir com melhorias para o projeto
❌ Você NÃO PODE:
- Usar o software para fins comerciais
- Vender o software ou versões modificadas
- Usar em ambientes corporativos/empresariais com fins lucrativos
- Incluir em produtos ou serviços comerciais
Ao usar ou distribuir este software, você deve dar crédito apropriado:
Based on Tibia Assets Editor (https://github.com/seu-usuario/tibia-assets-editor)
by Tibia Assets Editor Contributors, licensed under CC BY-NC-SA 4.0
Para uso comercial, entre em contato com o mantenedor do projeto para obter uma licença comercial separada.
Licença completa: Veja o arquivo LICENSE para detalhes completos.
Texto legal oficial: https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
Porta 1420 ocupada:
- Feche outros processos usando a porta ou ajuste
vite.config.ts - Tauri falha se a porta fixa não estiver disponível
Erro de build no Windows (linker/MSVC):
- Instale Microsoft C++ Build Tools (Desktop development with C++)
- Reinicie o terminal/IDE após instalação
WebView2 não encontrado:
- Instale Microsoft Edge WebView2 Runtime
- Download: https://developer.microsoft.com/microsoft-edge/webview2/
npm install falha:
- Use Node.js 18 ou superior
- Limpe cache:
npm cache clean --force - Delete
node_modulesepackage-lock.json, executenpm installnovamente - Verifique configurações de proxy corporativo
Catálogo/sprites não carregam:
- Confirme existência de
catalog-content.jsonno projeto ou<Tibia>/assets/ - Verifique permissões de leitura dos arquivos
- Use o caminho correto do Tibia no setup
Tauri IPC não responde:
- Verifique console do DevTools (F12) para erros JavaScript
- Verifique logs Rust no terminal (env_logger usa nível
debug) - Reinicie aplicação:
npm run tauri dev
Build Rust falha com erro de protobuf:
- O projeto usa
protoc-bin-vendored(protoc embutido) - Se persistir, limpe:
cargo clean - Reconstrua:
cargo build
Performance lenta com muitos assets:
- Reduza tamanho de página (100 ou 500 itens)
- Limpe cache de sprites: Settings → Clear sprite cache
- Desative animação automática se habilitada
- ✅ Sistema completo de appearances
- ✅ Gerenciamento de sprites com cache
- ✅ Sistema de sons completo
- ✅ Editor de propriedades avançado
- ✅ Importação/exportação JSON
- ✅ Sistema de temas e i18n
- ✅ Seleção múltipla de assets
- ✅ Preview de animações
- ✅ Subcategorias de objects
- ✅ Clipboard de flags
- 🔲 Editor de Sprites: Importação e edição de sprites customizados
- 🔲 Editor de Paletas: Modificação de paletas de cores
- 🔲 Export de Sprites: Exportação individual/batch para PNG/BMP
- 🔲 Criação de Assets: Wizard para criar novos items/criaturas
- 🔲 Histórico de Alterações: Undo/redo de modificações
- 🔲 Validação de Assets: Verificação de integridade e erros
- 🔲 Batch Operations: Operações em lote para múltiplos assets
- 💡 Performance: Otimizações adicionais para datasets grandes (100k+ items)
- 💡 UI/UX: Melhorias de acessibilidade e usabilidade
- 💡 Documentação: Wiki completo e tutoriais em vídeo
- 💡 Testes: Cobertura de testes unitários e integração
Feito com ❤️ usando Rust + Tauri e TypeScript + Vite.
Tecnologias principais:
- Tauri - Framework desktop
- Rust - Backend performático
- TypeScript - Frontend type-safe
- Vite - Build tool moderno
- Protocol Buffers - Serialização eficiente
Nota: Este é um projeto independente e não é afiliado oficialmente com a CipSoft GmbH ou Tibia.