Buffs y debuffs que alteran atributos. Soporta efectos instantáneos, por duración y DoT/HoT.
attributeModifiers#
Define cambios en atributos: el +10 ATK de una Espada de Hierro, el -5 HP/s durante 6s del Veneno, el ×1.5 SPD de un buff de velocidad.
Por qué importa#
Sin un modelo unificado de modificadores, cada feature implementa el suyo propio (ítems, habilidades, eventos, clases). Eso lleva a un motor con 5 sistemas de buff incompatibles. Aquí defines una sola vez, y cualquier feature que necesite "cambiar un atributo" referencia una entrada de este addon.
Dónde suele vivir#
- Página de Equipo (
⚔️ Ítems con efectos) — efectos aplicados cuando el ítem está equipado. - Página de Habilidad (
⚡ Habilidades) — efectos que la habilidad aplica al objetivo. - Página de Personaje (
👤 Personajes) — efectos de clase pasivos. - Página en blanco — un pool genérico de modificadores reutilizables.
Singleton — 1 addon por página. Cada addon puede tener N entradas, así que una página de Skills puede contener todos los efectos de sus habilidades.
Esquema#
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
idSí | string | ID interno del addon. | |
nameSí | string | Nombre amigable. | |
definitionsRef | string (sectionId) | Página con attributeDefinitions. Filtra qué claves ofrece el panel. | |
modifiersSí | AttributeModifierEntry[] | Lista de entradas — cada una es un efecto atómico. |
AttributeModifierEntry#
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
idSí | string | ID interno. | |
name | string | Nombre legible (ej.: Fireball Impact). Cuando está ausente, la UI genera una etiqueta automática como +10 ATK 30s. | |
attributeKeySí | string | Clave del atributo a modificar (proviene de definitionsRef). | |
modeSí | "add" | "mult" | "set" | add: suma (negativo = daño). mult: multiplica (×1.5 = +50%). set: fuerza un valor exacto. | |
valueSí | number | boolean | El valor a aplicar. Boolean solo tiene sentido con mode=set en atributos booleanos. | |
temporary | boolean | false | Cuando es true, el modificador expira después de durationSeconds. Cuando es false, es permanente (ej.: daño de HP que no se regenera). |
durationSeconds | number | Duración total del efecto (en segundos). Acepta decimales (1.5s). | |
tickIntervalSeconds | number | Intervalo entre aplicaciones para DoT/HoT. Convención de tick final: primer tick en t=N, total = floor(duración/intervalo). | |
stackingRule | "unique" | "refresh" | "stack" | unique: el segundo lanzamiento se ignora si todavía está activo. refresh: cada lanzamiento renueva la duración. stack: se apila como instancias separadas. | |
category | "buff" | "debuff" | "neutral" | Para sistemas de dispel/resistencia en el motor. | |
tags | string[] | Etiquetas libres para agrupar (fire, poison, magical). Se convierten automáticamente a minúsculas y se deduplicán. |
Ejemplos#
Instantáneo: daño inmediato#
{
"id": "fire-impact",
"name": "Fireball Impact",
"attributeKey": "hp",
"mode": "add",
"value": -30,
"stackingRule": "stack"
}
Sin temporary, así que es permanente — el daño de HP se mantiene hasta que el jugador se cura.
Por duración: buff de 30s#
{
"id": "berserk",
"name": "Berserker",
"attributeKey": "atk",
"mode": "mult",
"value": 1.5,
"temporary": true,
"durationSeconds": 30,
"stackingRule": "refresh",
"category": "buff"
}
mult: 1.5 = +50% ATK durante 30s. refresh significa que relanzarlo reinicia el temporizador.
DoT: quemadura#
{
"id": "burn",
"name": "Quemadura",
"attributeKey": "hp",
"mode": "add",
"value": -2,
"temporary": true,
"durationSeconds": 6,
"tickIntervalSeconds": 1,
"stackingRule": "unique",
"category": "debuff",
"tags": ["fire", "dot"]
}
Aplica -2 HP cada 1s durante 6s = 6 ticks × -2 = -12 HP total. unique evita un apilamiento descontrolado cuando el jugador hace spam con la habilidad.
Convención de ticks#
DoT/HoT sigue la convención de tick final:
- Duración = 10s, tick = 1s → 10 ticks aplicados en t=1, 2, ..., 10
- Total de ticks =
floor(durationSeconds / tickIntervalSeconds)
No se ejecuta en t=0. Si tu motor usa tick inicial (t=0, 1, ..., 10 = 11 ticks), hará un 10% más de daño de lo que especifica el GDD. Asegúrate de documentar esta convención claramente para tu equipo de programación.
Quién apunta a este addon#
skills.SkillEffectRef— los efectos de habilidad apuntan a entradas específicas aquí (en la misma página, por diseño).- Equipo (vía tipo de página
equipmentItem) — los modificadores se aplican cuando el ítem está equipado.
Wizard#
No tiene wizard dedicado (no es un tipo de página primario). Pero se inicializa automáticamente por:
👤 Personajes⚔️ Ítems con efectos⚡ Habilidades
Todos lo inicializan vacío con definitionsRef ya completado — solo agregas entradas.
Comportamiento en la UI#
- Panel: un bloque colapsable por entrada, arrastrar y soltar para reordenar, dropdowns dependientes (clave → valores disponibles).
- Solo lectura: lista entradas con badge de categoría + chips de etiqueta + desglose de tiempo (s, tick).
- Checklist de habilidades: cada entrada aparece en el selector de efectos para una habilidad en la misma página. El
name(cuando está definido) se resalta en negrita.