Arquitectura

Arquitectura Hexagonal

firelands-next implementa la Arquitectura Hexagonal (Ports & Adapters). Las reglas de negocio están en el centro; bases de datos, sockets, Lua y archivos DBC se conectan mediante interfaces. El cliente objetivo es WoW Cataclysm 4.3.4 (build 15595).

Definiciones Clave

TérminoSignificado en Firelands
PortInterfaz abstracta de la que depende el núcleo (p. ej. ICharacterRepository, IGameScriptHost). Las capas domain y application definen ports; infrastructure los implementa.
AdapterImplementación concreta de un port (p. ej. MySqlCharacterRepository, LuaGameScriptHost). Vive en infrastructure/.
EntityObjeto mutable con identidad y ciclo de vida (p. ej. Player, Creature, Character).
Value ObjectDato inmutable sin identidad (p. ej. coordenadas, snapshots de cooldown, GUIDs).
Use Case / ServiceOrquestación en application (p. ej. CharacterService, CommandService) que coordina el dominio vía ports.
Composition RootPunto de entrada ejecutable (auth, world) que conecta adaptadores concretos a ports al arrancar.
RepositoryPort de persistencia; domain declara I*Repository, infrastructure provee MySql*.

Estructura de Capas

src/
├── shared/           # FirelandsShared — config, logging, crypto, DBC, wire formats
├── domain/           # FirelandsDomain — entities, world model, combat, repository ports
├── application/      # FirelandsApplication — use cases, services, application ports
├── infrastructure/   # FirelandsInfrastructure — MySQL, ASIO, Lua, DBC stores, REST
├── auth/             # Auth server composition root
├── world/            # World server composition root
└── tools/            # FirelandsDevTools CLI

Orden de enlace CMake: FirelandsSharedFirelandsDomainFirelandsApplicationFirelandsInfrastructure → ejecutables.

Regla de Dependencias

  • domain/ no debe importar de application/ ni infrastructure/.
  • application/ depende solo de domain/ + shared/ — sin headers concretos de MySQL o Boost.Asio.
  • Las dependencias externas fluyen hacia adentro: Infrastructure → Application → Domain → Shared.
  • La comunicación entre capas usa ports abstractos, inyectados al arrancar en auth/main.cpp y world/main.cpp.

Capa Shared (FirelandsShared)

Biblioteca más baja; sin servicios de juego ni persistencia. Añade código aquí solo cuando varias capas lo necesiten y no dependa de MariaDB/ASIO.

ÁreaRutaPropósito
Configshared/Config.{h,cpp}Carga YAML; overrides FIRELANDS_AUTH_CONFIG / FIRELANDS_WORLD_CONFIG
Loggingshared/Logger.hWrapper spdlog; incluir siempre vía este header
Crypto / SRPshared/Crypto.h, SRPConstants.h, BigInt.hMatemática SRP-6a para autenticación
Redshared/network/ByteBuffer, WorldPacket, opcodes, codecs wire, WorldCrypt.h
DBCshared/dbc/DbcReader.cppLector de tablas binarias estilo .dbc
Helpers de juegoshared/game/Niveles de acceso, permisos, apariencia GM, tablas de experiencia
TUIshared/tui/Helpers FTXUI para consolas interactivas

Capa de Dominio (FirelandsDomain)

Modela qué manipula el emulador — no cómo se almacenan datos o se envían paquetes.

Entidades de mundo (domain/world/)

TipoArchivoRol
WorldObjectWorldObject.hBase: GUID, posición MovementInfo
PlayerPlayer.{h,cpp}Salud/poder en vivo, auras, notificaciones de mapa
CreatureCreature.{h,cpp}Entry NPC, facción, flags, XP de combate
GameObjectGameObject.{h,cpp}Colocación de objetos de mundo
MapMap.{h,cpp}Cuadrícula / indexado espacial
AuraAura.h, UnitAuraState.*Estado de buffs/debuffs

Modelos de cuenta/datos (domain/models/)

Character, Realm, PlayerCreateInfo, GmTicket, GossipMenu, NpcText, QuestGossip, SpellDefinition, WebSession, Chat, y Account (vía IAccountRepository.h).

Dominio de combate (domain/combat/)

ComponenteRol
CombatEngineResolución central de combate
DamageCalculatorFórmulas de daño
ICombatEntityContrato de entidad en combate
IThreatManagerPort de tabla de amenaza
ISpellProcessorPort de procesamiento de hechizos

Ports de repositorio (domain/repositories/)

PortPropósito
IAccountRepositoryCuentas, verificadores SRP, claves de sesión
IRealmRepositoryFilas de lista de reinos
ICharacterRepositoryCRUD de personajes y estado online
IPlayerCreateInfoRepositoryPosiciones, hechizos y skills iniciales
IWebSessionRepositorySeguimiento de sesiones REST
IGmTicketRepositoryTickets de ayuda GM
IGossipRepositoryDatos de menús gossip
INpcTextRepositoryTexto de diálogo NPC
IQuestGossipRepositoryLíneas gossip de misiones
ICreatureSpawnRepositoryFilas de spawn de criaturas
ICreatureClassLevelStatsRepositoryStats de nivel NPC
INpcTemplateSearchRepositoryBúsqueda .npc search
ISpellDefinitionStoreMetadatos de hechizos
ISpellCastTablesTablas de cast / coste de poder

Capa de Aplicación (FirelandsApplication)

Casos de uso y orquestación sin conocer MariaDB ni detalles de sockets.

Servicios (application/services/)

ServicioRol
AuthServiceBúsqueda de cuenta, verificación SRP, claves de sesión
SRPServiceHelpers de verificación SRP-6a
CharacterServiceLista y persistencia de personajes
PlayerCreateInfoServicePlantillas de creación de personaje
RealmListServiceLista de reinos + población en vivo vía IRealmLiveState
WorldServiceFachada del mundo: mapas, jugadores, criaturas, host Lua, colisiones
CommandServiceComandos . de staff y consola
GmTicketServiceCola de tickets, asignación, respuestas
OnlineCharacterSessionRegistryNombre online → sesión para consola
WebSessionServiceFlujos REST de login/sesión

Hechizos y combate (application/spell/, application/combat/)

SpellManager y módulos de efectos; CombatService, hostilidad, persecución.

Ports de aplicación (application/ports/)

PortImplementado por
INetworkServerAsyncNetworkServer
IAuthSessionAuthSession
ICommandService / ICommandSessionCommandService / WorldSession
IGameScriptHostLuaGameScriptHost
IMapCollisionQueriesMapCollisionQueriesStub (vmap planificado)
IMapNotifierNotificaciones de mapa/jugador
IRealmLiveStateRealmLiveRegistry + realm-link

Capa de Infraestructura (FirelandsInfrastructure)

Conecta el emulador con el mundo exterior. Todo I/O de sockets usa corrutinas C++20 (co_await, boost::asio::use_awaitable).

Persistencia (infrastructure/persistence/)

AdaptadorPort
DatabaseMigratorEjecuta sql/bundled/sql/init/sql/migrations/; rastrea schema_migrations
MySqlAccountRepositoryIAccountRepository
MySqlRealmRepositoryIRealmRepository
MySqlCharacterRepositoryICharacterRepository
MySqlPlayerCreateInfoRepositoryIPlayerCreateInfoRepository
MySqlGmTicketRepositoryIGmTicketRepository
MySqlGossipRepository, MySqlNpcTextRepository, MySqlQuestGossipRepositoryPorts gossip
MySqlCreatureSpawnRepository, MySqlCreatureClassLevelStatsRepositorySpawn/stats
MemoryWebSessionRepositoryIWebSessionRepository (en memoria)
InMemoryThreatManager, MySqlThreatManager, MySqlSpellProcessorPorts de combate

Red (infrastructure/network/)

ComponenteRol
AsyncNetworkServerBucle accept con corrutinas; Update() hace poll de io_context
AuthSessionBucles read/write del cliente auth
WorldSessionCliente world; handlers en worldsession/*.cpp
RestAuthServerLogin REST en Network.RestPort
RealmLinkSession / RealmLinkOutboundMétricas auth ↔ world en vivo

Otros adaptadores

ComponenteRol
LuaGameScriptHostScripting Lua 5.4 bajo Scripting.ScriptsDirectory
SpellEntryDbcStore, SpellCastTablesDbcDatos DBC de hechizos
MapCollisionQueriesStubPlaceholder hasta integración vmap completa

Ejecutables (Composition Roots)

ObjetivoBinarioResumen de arranque
authbuild/bin/authCarga authserver.yaml → migra BD → conecta repos MySQL → TCP auth (3724), realm-link + REST opcional (8081)
worldbuild/bin/worldCarga worldserver.yaml → init Lua + world_startup → migra BD → conecta BD auth/characters/world → TCP world (8085) + consola
FirelandsDevToolsbuild/bin/FirelandsDevToolsCLI de cuentas y reinos

Flujo operativo: los clientes se autentican en auth (SRP-6a, lista de reinos), luego conectan a world con cripto derivada de sesión. Realm-link sincroniza población/carga en vivo de world a auth si está configurado.

Formato de Red

Paquetes y opcodes apuntan a WoW Cataclysm 4.3.4 (build 15595). Builders compartidos en src/shared/network/. ByteBuffer usa helpers std::span de C++20. Los handlers de WorldSession se reparten por tema: movimiento, hechizos, gossip, estado GM, tickets, updates de objetos.

Encabezados Precompilados (PCH)

Encabezados pesados precompilados: contenedores STL, spdlog, nlohmann/json, shared/Common.h, shared/Logger.h. Al añadir targets:

target_precompile_headers(<target_name> PRIVATE ${PROJECT_PCH_HEADERS})

Importante: spdlog DEBE incluirse vía <shared/Logger.h>. LuaGameScriptHost.cpp omite PCH por compatibilidad del toolchain.

Convenciones C++

ReglaDetalle
EstándarC++20 (std::filesystem, std::optional, std::variant, std::span, corrutinas en red)
Nombressnake_case funciones/variables; PascalCase tipos; UPPER_SNAKE_CASE constantes; archivos en kebab-case
IdiomaSolo inglés en código, comentarios y commits
Términos WoWNomenclatura Blizzard: Aura, Unit, SpellEffect, etc.
LoggingSiempre vía <shared/Logger.h>
Hilosstd::thread en código de negocio
Commitstype(scope): description — tipos: feat, fix, refactor, docs, test, chore, perf
TDDRojo → Verde → Refactor para comportamiento nuevo

Diagrama arquitectónico

Vista general de los composition roots, las capas hexagonales y los sistemas externos. Las flechas sólidas muestran cableado en tiempo de ejecución; las líneas punteadas muestran la regla de dependencias (cada capa solo depende de las inferiores — domain nunca importa infrastructure).

FirelandsShared

FirelandsDomain — núcleo de negocio

FirelandsApplication

FirelandsInfrastructure — adaptadores

Composition roots

Sistemas externos

login SRP lista de reinos

paquetes de sesión de juego

realm-link métricas en vivo

usa

usa

usa

Cliente WoW Cataclysm 4.3.4

MySQL / MariaDB

Extractos DBC y scripts Lua

auth — TCP 3724 REST opcional

world — TCP 8085 consola

FirelandsDevTools CLI

AsyncNetworkServer AuthSession WorldSession RealmLink

Repositorios MySql DatabaseMigrator

LuaGameScriptHost

SpellEntryDbcStore stub colisiones

Servicios Auth Character World Command GmTicket...

Ports INetworkServer IGameScriptHost IMapCollisionQueries...

Entidades Player Creature Map modelos...

Ports de repositorio ICharacterRepository IAccountRepository...

CombatEngine DamageCalculator amenaza hechizos

Config Logger Crypto ByteBuffer opcodes DbcReader

Orden de enlace CMake (bibliotecas): FirelandsSharedFirelandsDomainFirelandsApplicationFirelandsInfrastructureauth / world / FirelandsDevTools.