diff --git a/Content/Art/T_Damage_T1.uasset b/Content/Art/T_Damage_T1.uasset index e59f325..c341802 100644 --- a/Content/Art/T_Damage_T1.uasset +++ b/Content/Art/T_Damage_T1.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a0c413d8b8cbb1e4aa3491443a95032497670b691f1b7068339c42662879a78 -size 30831 +oid sha256:7f040518e66ac5d27547731ce8d2ca595ec6e8775775cde98a395c65b1acabbc +size 1489 diff --git a/Content/Art/T_Damage_T2.uasset b/Content/Art/T_Damage_T2.uasset index 70e3b85..e5f6f62 100644 --- a/Content/Art/T_Damage_T2.uasset +++ b/Content/Art/T_Damage_T2.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7c69514f14a0d60518f47876d3e7547bf23f5fb3e7fea6f793888b0ee648854 -size 34271 +oid sha256:185b44ee4fca1a3179ca926e22278c8ec86cc960a9d58092d8b50ddd5ab9d4b7 +size 1489 diff --git a/Content/Art/T_Damage_T3.uasset b/Content/Art/T_Damage_T3.uasset index 7a9cd59..95591a1 100644 --- a/Content/Art/T_Damage_T3.uasset +++ b/Content/Art/T_Damage_T3.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b2594ef272b7ce362d3d66e647e7f38c7c7c8a7435678b4dcd6b5b17447e4d36 -size 38426 +oid sha256:2ba330d5589edd7c5ce9c0e94ce47125715bd491c2ef1a7d7840fd6a7b27b747 +size 1489 diff --git a/Content/Art/T_Health_T1.uasset b/Content/Art/T_Health_T1.uasset index 7f03352..bfa4550 100644 --- a/Content/Art/T_Health_T1.uasset +++ b/Content/Art/T_Health_T1.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:731e06424adde445c58c57eb0b56f342d7e73f020d500da9a74a9744d2592b61 -size 45614 +oid sha256:db6d68b3212acf172b02d265855233f7caae44c3ee205fc88089027fc6f0b773 +size 1489 diff --git a/Content/Art/T_Health_T2.uasset b/Content/Art/T_Health_T2.uasset index 4249040..0489b81 100644 --- a/Content/Art/T_Health_T2.uasset +++ b/Content/Art/T_Health_T2.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ccb606c283c0359addc2e8aa7e6afa557e095bbc7cf5523aa0d8eed30eefeeb -size 46670 +oid sha256:9accb10ec6e44bdccac7aae5eb65d015e568d4dc02f9a2d8dfc7141f417598b7 +size 1489 diff --git a/Content/Art/T_Health_T3.uasset b/Content/Art/T_Health_T3.uasset index 2829265..d40481e 100644 --- a/Content/Art/T_Health_T3.uasset +++ b/Content/Art/T_Health_T3.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b34ce4d201774d757c867a5641fe904ad750bc942a2370199c936f86cf0f4d6c -size 51983 +oid sha256:95a7e6ca104c064c1ee543062609f869db35749dd6972c3a6ea3b489ebc5d847 +size 1489 diff --git a/Content/Art/T_Skill_Damage_T1.uasset b/Content/Art/T_Skill_Damage_T1.uasset new file mode 100644 index 0000000..3e085ac --- /dev/null +++ b/Content/Art/T_Skill_Damage_T1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33d22fdcd14b21b9aded8c5f8a9a668b98527e1420c16b9a0376c1bfc64c6712 +size 30956 diff --git a/Content/Art/T_Skill_Damage_T2.uasset b/Content/Art/T_Skill_Damage_T2.uasset new file mode 100644 index 0000000..46893d0 --- /dev/null +++ b/Content/Art/T_Skill_Damage_T2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57306f039db6822a1b577521b79df3a4d5dd28a2f7efb0285243ffe73b1ad05b +size 34396 diff --git a/Content/Art/T_Skill_Damage_T3.uasset b/Content/Art/T_Skill_Damage_T3.uasset new file mode 100644 index 0000000..8057efa --- /dev/null +++ b/Content/Art/T_Skill_Damage_T3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21e92032ebc0af30396647f38d837eb0c27e5c2656b05c3e0f59cabffdf345c0 +size 38551 diff --git a/Content/Art/T_Skill_Health_T1.uasset b/Content/Art/T_Skill_Health_T1.uasset new file mode 100644 index 0000000..b0aa2b3 --- /dev/null +++ b/Content/Art/T_Skill_Health_T1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26d77084405e16df30a706c6a6d7b971b995d8c9d6b64c575898697a2adf15de +size 45739 diff --git a/Content/Art/T_Skill_Health_T2.uasset b/Content/Art/T_Skill_Health_T2.uasset new file mode 100644 index 0000000..59356f5 --- /dev/null +++ b/Content/Art/T_Skill_Health_T2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e81d9c890d35a5f7cfffc652f16c94a6c490fc94423c0c44a4b1f2f35c8f6065 +size 46795 diff --git a/Content/Art/T_Skill_Health_T3.uasset b/Content/Art/T_Skill_Health_T3.uasset new file mode 100644 index 0000000..e56bff2 --- /dev/null +++ b/Content/Art/T_Skill_Health_T3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:347208191529047ed10c5882d5bf3df48588892f1352729541330abfa78eb12f +size 52108 diff --git a/Content/Art/T_Skill_Speed_T1.uasset b/Content/Art/T_Skill_Speed_T1.uasset new file mode 100644 index 0000000..ecae504 --- /dev/null +++ b/Content/Art/T_Skill_Speed_T1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00796deead085658e4b154deaec51bfffc2868f70fb677a59582bc4e3b74ef5e +size 54422 diff --git a/Content/Art/T_Skill_Speed_T2.uasset b/Content/Art/T_Skill_Speed_T2.uasset new file mode 100644 index 0000000..11f2082 --- /dev/null +++ b/Content/Art/T_Skill_Speed_T2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1367dd34f69184bd722fba08c1b4cab1254e9d73acb9aebba571ccf8cd626cc +size 59100 diff --git a/Content/Art/T_Skill_Speed_T3.uasset b/Content/Art/T_Skill_Speed_T3.uasset new file mode 100644 index 0000000..8284d03 --- /dev/null +++ b/Content/Art/T_Skill_Speed_T3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5af439bd5258a41b7e0f1a63bcfd4dc918de3c1787a9bdb4cea1c0c4394e323 +size 63113 diff --git a/Content/Art/T_Skill_Start.uasset b/Content/Art/T_Skill_Start.uasset new file mode 100644 index 0000000..784da36 --- /dev/null +++ b/Content/Art/T_Skill_Start.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2cd766b229460fe089a83e0a70bfc4673b6794197f28897ad31cdd2aee62fc18 +size 47433 diff --git a/Content/Art/T_Speed_T1.uasset b/Content/Art/T_Speed_T1.uasset index 77823a4..eee8e2f 100644 --- a/Content/Art/T_Speed_T1.uasset +++ b/Content/Art/T_Speed_T1.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b4cf5919d29ee6653c1cd12841f31f3f3df3606a4fedb4223614b77f5ede166 -size 54297 +oid sha256:da9e13175e931e37f92560b9da5cd6a202516beb3c5497a8f2b65aa2beddf3e5 +size 1480 diff --git a/Content/Art/T_Speed_T2.uasset b/Content/Art/T_Speed_T2.uasset index 8704983..9dd3629 100644 --- a/Content/Art/T_Speed_T2.uasset +++ b/Content/Art/T_Speed_T2.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d8d996ce2c8b4edaafd2c16e3d871d3adddf00ccde5f767f110a9ef01c84eab -size 58975 +oid sha256:8110e89e4e7006e193b668546c0d4b800c21e79a710d045a5b54e05b5b2818d6 +size 1480 diff --git a/Content/Art/T_Speed_T3.uasset b/Content/Art/T_Speed_T3.uasset index fc157c6..6bb91bc 100644 --- a/Content/Art/T_Speed_T3.uasset +++ b/Content/Art/T_Speed_T3.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f17a537945177856a8a1f66aa3c35528bc76b4d2d6cd5fce161e48f86218f89c -size 62988 +oid sha256:fb1180b3a36a86340317938972463351267aca3a35b8abe7b106f5993715dfbf +size 1480 diff --git a/Content/Art/T_Start.uasset b/Content/Art/T_Start.uasset index 25fc22f..fa67026 100644 --- a/Content/Art/T_Start.uasset +++ b/Content/Art/T_Start.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f814936c9f7cb30462efb322a5b94e2ded486324a861897f3e3fa1f7186485c9 -size 47308 +oid sha256:cd1b86eed23afc46acd567b88f1d0ae2aec65dcc9952f57ad732afcf6334e783 +size 1453 diff --git a/README-es.md b/README-es.md new file mode 100644 index 0000000..d9d3064 --- /dev/null +++ b/README-es.md @@ -0,0 +1,130 @@ +# Proyecto UI U-Tad + +**[Read in English](README.md)** | **Español** + +--- + +## Implementación del Sistema de Árbol de Habilidades + +### Resumen +Un sistema completo de árbol de habilidades con progresión basada en nodos, validación de prerrequisitos, líneas de conexión visuales y configuración orientada a datos. + +--- + +## Arquitectura: Decisión de Blueprint + +### Implementación en Blueprint +**Componentes:** `WBP_SkillTree`, `WBP_SkillNode`, `WBP_SkillNodeTooltip` + +**Justificación:** +- **Velocidad de iteración**: El diseño y estilización de UI requiere iteración visual rápida +- **Amigable para diseñadores**: Artistas/diseñadores pueden modificar la UI sin conocimientos de C++ + +--- + +## Sistemas Principales + +### 1. Capa de Datos (`SkillTreeTypes.h`) +**Estructuras:** +- `FSkillNodeData`: Fila de definición de habilidad para la tabla de datos (nombre, coste, prerrequisitos, efectos, bandera de inicio) +- `FSkillNodeRuntime`: Envoltorio de estado en tiempo de ejecución +- `ESkillNodeState`: Enum de estado (Bloqueado, Disponible, Seleccionado, Comprado) + +**Decisión**: El diseño basado en Data Table permite a no programadores configurar habilidades sin recompilar. + +### 2. Capa de Lógica (`SkillTreeComponent`) +**Responsabilidades:** +- Inicialización del árbol de habilidades desde DataTable +- Gestión de estado (prerrequisitos, comprobaciones de asequibilidad) +- Validación de selección y confirmación de compra +- Auto-compra de habilidades iniciales +- Gestión de puntos de habilidad +- Ganchos de aplicación de efectos + +**Características Clave:** +- **Ordenación por orden de compra**: Asegura que los prerrequisitos se compren antes que los dependientes +- **Deselección en cascada**: Eliminar un prerrequisito deselecciona las habilidades dependientes +- **Habilidades iniciales**: Marcadas en DataTable, auto-compradas en init, preservadas en reset +- **Agregación de estadísticas**: Proporciona funciones `GetTotal[Stat]Bonus()` para sumar bonificaciones de todas las habilidades compradas + +### 3. Capa de Integración de Estadísticas (`CharacterStatsComponent`) +**Responsabilidades:** +- Cálculo automático de estadísticas desde habilidades compradas +- Gestión de estadísticas del personaje (Salud, Daño, Velocidad) +- Actualizaciones en tiempo real cuando se compran habilidades +- Integración con velocidad de movimiento + +**Cómo funciona:** +- Encuentra SkillTreeComponent en el mismo actor en BeginPlay +- Escucha el evento `OnSkillPurchased` +- Itera todas las habilidades compradas, suma bonificaciones planas + porcentuales +- Aplica fórmula: `StatFinal = Base + BonusPlano + (Base * BonusPorcentual / 100)` +- Auto-actualiza la velocidad de CharacterMovementComponent +- Emite eventos de cambio de estadísticas para actualizaciones de UI + +**Decisión**: Un componente de estadísticas separado mantiene las responsabilidades separadas - SkillTreeComponent maneja la progresión, CharacterStatsComponent maneja la aplicación de estadísticas. Hace ambos reutilizables independientemente. + +### 4. Capa de Visualización (`SkillTreeConnectionsWidget`) +**Responsabilidades:** +- Dibujado automático de líneas entre nodos prerrequisito (¡Solo necesitas colocar los nodos en la UI!) +- Coloreado dinámico de líneas basado en estados de habilidades +- Refresco basado en eventos cuando cambian los estados + +**Enfoque Técnico:** +- **Búsqueda genérica**: Funciona con cualquier jerarquía de widgets para que diseñadores/artistas no estén limitados al crear el widget del árbol de habilidades (Canvas, Overlay, Grid) +- **Override de NativePaint**: Renderizado directo con Slate para rendimiento +- **Binding de delegados**: Se refresca automáticamente cuando cambian los estados de las habilidades + +**Decisión**: Un único widget auto-contenido elimina la gestión manual de líneas y complejidad de Blueprint. + +### 5. Capa de UI (Blueprints) +**WBP_SkillNode & WBP_SkillNodeTooltip:** +- Muestra icono de habilidad, estado, coste +- Maneja eventos de clic (seleccionar/deseleccionar) +- Almacena SkillID para búsqueda en tiempo de ejecución +- Soporte de tooltip personalizado para mostrar detalles de habilidad +- Actualizaciones de estado en tiempo real mediante binding de eventos permiten feedback visual instantáneo + +**WBP_SkillTree:** +- Contiene nodos de habilidad colocados manualmente +- Referencia a SkillTreeComponent +- Aloja SkillTreeConnectionsWidget que dibuja líneas entre nodos automáticamente +- Se vincula a eventos del componente para actualizaciones de UI + +**Decisión**: La colocación manual de nodos permite diseños personalizados (lineal, radial, ramificado) según preferencia del diseñador. + +--- + +## Decisiones Clave de Diseño + +### 1. Prerrequisitos de habilidades en DataTable +**Alternativa**: Hard-coded en C++ o referencias a DataAssets +**Elegido**: Array en DataTable +**Razón**: Los diseñadores pueden modificar dependencias de habilidades sin intervención del programador y sin recompilar + +### 2. Componente vs Subsistema +**Alternativa**: Game Instance Subsystem +**Elegido**: Actor Component +**Razón**: Soporta múltiples árboles de habilidades por jugador (ej., árbol de combate, árbol de crafteo) y más fácil integración con guardar/cargar + +### 3. Widget de Conexiones Único +**Alternativa**: Widgets de línea individuales por conexión con gestión manual +**Elegido**: Un widget dibuja todas las líneas automáticamente +**Razón**: Elimina gestión de arrays, mejor rendimiento, manejo automático de coordenadas + +### 4. Componente de Estadísticas Separado +**Alternativa**: Aplicar estadísticas directamente en SkillTreeComponent +**Elegido**: CharacterStatsComponent separado +**Razón**: Separación de responsabilidades - SkillTreeComponent es reutilizable para cualquier sistema de progresión, CharacterStatsComponent específicamente maneja estadísticas de personaje. Permite árboles de habilidades sin bonificaciones de stats, o stats sin árboles de habilidades. + +--- + +## Aspectos Técnicos Destacados + +- **Arquitectura basada en eventos**: El componente emite cambios de estado, la UI responde automáticamente +- **Validación de máquina de estados**: Previene transiciones inválidas (ej., no se pueden seleccionar habilidades bloqueadas) +- **Aplicación automática de estadísticas**: CharacterStatsComponent escucha compras de habilidades, recalcula estadísticas, las aplica al personaje +- **Renderizado consciente de geometría**: Las líneas se adaptan a cualquier sistema de posicionamiento de widgets +- **Configuración orientada a datos**: Cero cambios de código y no necesita compilar para nuevas habilidades o diseños de árbol +- **Funcionalidad de reinicio**: Reembolsa habilidades no iniciales, mantiene puntos de inicio +- **Diseño modular**: Progresión de habilidades, estadísticas y visualización son independientes diff --git a/README.md b/README.md index 967fed6..bbf7c67 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # U-Tad UI Project +**English** | **[Leer en Español](README-es.md)** + +--- + ## Skill Tree System Implementation ### Overview diff --git a/RawContent/Damage/T_Damage_T1.png b/RawContent/Damage/T_Skill_Damage_T1.png similarity index 100% rename from RawContent/Damage/T_Damage_T1.png rename to RawContent/Damage/T_Skill_Damage_T1.png diff --git a/RawContent/Damage/T_Damage_T2.png b/RawContent/Damage/T_Skill_Damage_T2.png similarity index 100% rename from RawContent/Damage/T_Damage_T2.png rename to RawContent/Damage/T_Skill_Damage_T2.png diff --git a/RawContent/Damage/T_Damage_T3.png b/RawContent/Damage/T_Skill_Damage_T3.png similarity index 100% rename from RawContent/Damage/T_Damage_T3.png rename to RawContent/Damage/T_Skill_Damage_T3.png diff --git a/RawContent/Health/T_Health_T1.png b/RawContent/Health/T_Skill_Health_T1.png similarity index 100% rename from RawContent/Health/T_Health_T1.png rename to RawContent/Health/T_Skill_Health_T1.png diff --git a/RawContent/Health/T_Health_T2.png b/RawContent/Health/T_Skill_Health_T2.png similarity index 100% rename from RawContent/Health/T_Health_T2.png rename to RawContent/Health/T_Skill_Health_T2.png diff --git a/RawContent/Health/T_Health_T3.png b/RawContent/Health/T_Skill_Health_T3.png similarity index 100% rename from RawContent/Health/T_Health_T3.png rename to RawContent/Health/T_Skill_Health_T3.png diff --git a/RawContent/Speed/T_Speed_T1.png b/RawContent/Speed/T_Skill_Speed_T1.png similarity index 100% rename from RawContent/Speed/T_Speed_T1.png rename to RawContent/Speed/T_Skill_Speed_T1.png diff --git a/RawContent/Speed/T_Speed_T2.png b/RawContent/Speed/T_Skill_Speed_T2.png similarity index 100% rename from RawContent/Speed/T_Speed_T2.png rename to RawContent/Speed/T_Skill_Speed_T2.png diff --git a/RawContent/Speed/T_Speed_T3.png b/RawContent/Speed/T_Skill_Speed_T3.png similarity index 100% rename from RawContent/Speed/T_Speed_T3.png rename to RawContent/Speed/T_Skill_Speed_T3.png diff --git a/RawContent/T_Skill_Start.png b/RawContent/T_Skill_Start.png new file mode 100644 index 0000000..501e10b --- /dev/null +++ b/RawContent/T_Skill_Start.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc8f335b9ea2e98ad7761a32f6e747acdceb9459ff50a6ef584554c3d9957d5b +size 37638