Contribuir
Contribuir
Esta guía describe cómo contribuir a firelands-next, incluyendo el flujo de desarrollo, estándares de codificación y buenas prácticas.
Prerrequisitos
Antes de contribuir, comprende:
- Arquitectura hexagonal — Arquitectura y guías de módulos
- Flujo TDD — Pruebas
- Sistema de build — CMake + Ninja (Configuración del desarrollador)
- Idioma — Todo el código, comentarios y commits de git en inglés
Flujo de desarrollo
1. Encontrar trabajo
- Revisa el Roadmap para funcionalidades planificadas
- Busca issues en GitHub etiquetados como
good first issue - Revisa lagunas de documentación en esta wiki
2. Comenzar el trabajo
git checkout -b feature/my-new-feature
# o
git checkout -b fix/description-of-bug
Nomenclatura de ramas:
| Prefijo | Uso |
|---|---|
feature/ | Nuevas funcionalidades |
fix/ | Correcciones de bugs |
refactor/ | Refactorización de código |
docs/ | Solo documentación |
3. Proceso de desarrollo
- Escribe pruebas primero (TDD)
- Implementa la funcionalidad
- Verifica que las pruebas pasen:
ctest --test-dir build - Haz commit con mensajes claros
- Abre un pull request
4. Mensajes de commit
<type>(<scope>): <description>
[cuerpo opcional]
Tipos: feat, fix, refactor, docs, test, chore, perf
Ejemplos:
feat(auth): add SRP6a password reset flow
fix(world): correct spell damage for area spells
docs(database): document new migration schema
Estándares de código
Estilo C++
| Regla | Convención |
|---|---|
| Estándar | C++20 |
| Variables / funciones | snake_case |
| Tipos / clases | PascalCase |
| Constantes / enums | UPPER_SNAKE_CASE |
| Nombres de archivo | kebab-case |
Reglas de arquitectura
Dirección de dependencias:
Infrastructure → Application → Domain → Shared
domain/no debe importar deapplication/niinfrastructure/- Usa ports (interfaces) en domain/application; implementa adapters en infrastructure
- Application depende solo de domain + shared — sin headers concretos de MySQL o Boost.Asio
Logging
Siempre incluye spdlog vía <shared/Logger.h>:
#include <shared/Logger.h>
LOG_INFO("Player {} logged in from {}", player.GetName(), ip_address);
Manejo de errores
- Excepciones para situaciones excepcionales
std::optional<T>cuando una operación puede legítimamente no encontrar nada- Nunca concatenes cadenas SQL — usa consultas parametrizadas en infrastructure
Estándares SQL
- Coloca migraciones en
sql/migrations/con prefijos numéricos (001_,002_, …) - Usa operaciones idempotentes (
IF NOT EXISTS,ADD COLUMN IF NOT EXISTS) - Nunca
DROP TABLEen migraciones - Regenera el SQL bundled tras cambios de esquema:
cmake --build build --target merge-migrations
Estándares Lua
- Scripts en
scripts/lua/ - Nombres de archivo descriptivos:
npc_9001_boss_karax.lua - Envuelve código riesgoso en
pcall; agrupa handlers en tablas - Consulta Scripting Lua
Estándares de pruebas
- GoogleTest + GMock
- Un comportamiento por prueba; patrón AAA (Arrange, Act, Assert)
- Simula repository ports al probar application services
- Consulta Pruebas
Tipos comunes de contribución
Añadir una funcionalidad
- Modelo de dominio (si es necesario)
- Repository port + adapter de infrastructure
- Application service
- Conectar handlers (infrastructure)
- Pruebas unitarias
- Documentación en la wiki
Añadir un comando GM
Permissionenshared/game/Permissions.h- Registrar en
CommandService.cpp - Implementar en
WorldSessionvíaICommandSession - Documentar en Comandos GM
Añadir una migración de base de datos
sql/migrations/NNN_description.sql- Actualizar modelos/repositorios C++ si es necesario
- Ejecutar
merge-migrationsy probar en MySQL con Docker - Actualizar Base de datos
Revisión de código
Revisores: enfócate en lógica, arquitectura y estilo; sé constructivo.
Autores: responde a comentarios; mantén los PRs enfocados y de tamaño razonable.
Obtener ayuda
- Esta wiki y
docs/en el repositorio firelands-next - Issues y discussions en GitHub
- Structs de WowPacketParser y capturas de paquetes para build 15595 al validar formatos wire