feat(backend): Implement base framework for Perks, Skills, and Derived Stats

This commit is contained in:
Joan
2026-02-25 10:05:14 +01:00
parent aa71a6be7c
commit 185781d168
5 changed files with 931 additions and 1 deletions

194
gamedata/perks.json Normal file
View File

@@ -0,0 +1,194 @@
{
"perks": {
"heavy_hitter": {
"name": {
"en": "Heavy Hitter",
"es": "Golpe Pesado"
},
"description": {
"en": "+10% damage with two-handed weapons",
"es": "+10% de daño con armas a dos manos"
},
"icon": "🔨",
"requirements": {
"strength": 10
},
"effects": {
"two_handed_damage_bonus": 0.1
}
},
"iron_fist": {
"name": {
"en": "Iron Fist",
"es": "Puño de Hierro"
},
"description": {
"en": "Unarmed attacks deal STR × 1 damage",
"es": "Los ataques sin armas hacen STR × 1 de daño"
},
"icon": "👊",
"requirements": {
"strength": 20
},
"effects": {
"unarmed_str_scaling": 1.0
}
},
"fleet_footed": {
"name": {
"en": "Fleet Footed",
"es": "Pies Ligeros"
},
"description": {
"en": "-20% stamina cost on travel",
"es": "-20% de coste de aguante al viajar"
},
"icon": "🏃",
"requirements": {
"agility": 10
},
"effects": {
"travel_stamina_reduction": 0.2
}
},
"lucky_strike": {
"name": {
"en": "Lucky Strike",
"es": "Golpe de Suerte"
},
"description": {
"en": "+5% crit chance",
"es": "+5% de probabilidad de crítico"
},
"icon": "🍀",
"requirements": {
"agility": 20
},
"effects": {
"crit_chance_bonus": 0.05
}
},
"thick_skin": {
"name": {
"en": "Thick Skin",
"es": "Piel Gruesa"
},
"description": {
"en": "+10% max HP",
"es": "+10% de vida máxima"
},
"icon": "🛡️",
"requirements": {
"endurance": 10
},
"effects": {
"max_hp_bonus_percent": 0.1
}
},
"resilient": {
"name": {
"en": "Resilient",
"es": "Resistente"
},
"description": {
"en": "Status effects last 1 fewer turn (min 1)",
"es": "Los efectos de estado duran 1 turno menos (mín 1)"
},
"icon": "💪",
"requirements": {
"endurance": 20
},
"effects": {
"status_duration_reduction": 1
}
},
"quick_learner": {
"name": {
"en": "Quick Learner",
"es": "Aprendiz Rápido"
},
"description": {
"en": "+15% XP gain",
"es": "+15% de experiencia ganada"
},
"icon": "📖",
"requirements": {
"intellect": 10
},
"effects": {
"xp_bonus": 0.15
}
},
"scavenger": {
"name": {
"en": "Scavenger",
"es": "Carroñero"
},
"description": {
"en": "+1 quantity on consumable/resource drops",
"es": "+1 cantidad en drops de consumibles/recursos"
},
"icon": "🦅",
"requirements": {
"intellect": 20
},
"effects": {
"consumable_loot_bonus": 1
}
},
"survivor": {
"name": {
"en": "Survivor",
"es": "Superviviente"
},
"description": {
"en": "Heal 2% max HP every combat turn",
"es": "Cura 2% de vida máxima cada turno de combate"
},
"icon": "❤️‍🩹",
"requirements": {
"endurance": 15,
"agility": 10
},
"effects": {
"combat_regen_percent": 0.02
}
},
"glass_cannon": {
"name": {
"en": "Glass Cannon",
"es": "Cañón de Cristal"
},
"description": {
"en": "+30% damage, -20% max HP",
"es": "+30% de daño, -20% de vida máxima"
},
"icon": "💣",
"requirements": {
"strength": 20,
"endurance_max": 8
},
"effects": {
"damage_bonus": 0.3,
"max_hp_penalty_percent": 0.2
}
},
"last_stand": {
"name": {
"en": "Last Stand",
"es": "Última Resistencia"
},
"description": {
"en": "Once per combat, survive lethal damage with 1 HP",
"es": "Una vez por combate, sobrevive daño letal con 1 de vida"
},
"icon": "💀",
"requirements": {
"endurance": 30
},
"effects": {
"cheat_death": true
}
}
}
}

332
gamedata/skills.json Normal file
View File

@@ -0,0 +1,332 @@
{
"skills": {
"power_strike": {
"name": {
"en": "Power Strike",
"es": "Golpe Poderoso"
},
"description": {
"en": "A devastating blow with 20% chance to stun",
"es": "Un golpe devastador con 20% de probabilidad de aturdir"
},
"icon": "💥",
"stat_requirement": "strength",
"stat_threshold": 8,
"level_requirement": 5,
"cooldown": 3,
"stamina_cost": 5,
"effects": {
"damage_multiplier": 1.8,
"stun_chance": 0.2,
"stun_duration": 1
}
},
"crushing_blow": {
"name": {
"en": "Crushing Blow",
"es": "Golpe Aplastante"
},
"description": {
"en": "Heavy strike that ignores 50% of enemy armor",
"es": "Golpe pesado que ignora el 50% de la armadura enemiga"
},
"icon": "🔨",
"stat_requirement": "strength",
"stat_threshold": 15,
"level_requirement": 12,
"cooldown": 4,
"stamina_cost": 7,
"effects": {
"damage_multiplier": 1.5,
"armor_penetration": 0.5
}
},
"berserker_rage": {
"name": {
"en": "Berserker Rage",
"es": "Furia Berserker"
},
"description": {
"en": "+50% damage for 3 turns, but +25% damage taken",
"es": "+50% de daño durante 3 turnos, pero +25% de daño recibido"
},
"icon": "🔥",
"stat_requirement": "strength",
"stat_threshold": 25,
"level_requirement": 20,
"cooldown": 6,
"stamina_cost": 10,
"effects": {
"buff": "berserker_rage",
"buff_duration": 3,
"damage_bonus": 0.5,
"damage_taken_increase": 0.25
}
},
"execution": {
"name": {
"en": "Execution",
"es": "Ejecución"
},
"description": {
"en": "300% damage if target below 25% HP, else 100%",
"es": "300% de daño si el objetivo está por debajo del 25% de vida, si no 100%"
},
"icon": "⚰️",
"stat_requirement": "strength",
"stat_threshold": 40,
"level_requirement": 35,
"cooldown": 8,
"stamina_cost": 8,
"effects": {
"damage_multiplier": 1.0,
"execute_threshold": 0.25,
"execute_multiplier": 3.0
}
},
"quick_slash": {
"name": {
"en": "Quick Slash",
"es": "Tajo Rápido"
},
"description": {
"en": "Attack twice at 60% power each",
"es": "Ataca dos veces al 60% de poder cada una"
},
"icon": "🗡️",
"stat_requirement": "agility",
"stat_threshold": 8,
"level_requirement": 5,
"cooldown": 2,
"stamina_cost": 3,
"effects": {
"hits": 2,
"damage_multiplier": 0.6
}
},
"evade": {
"name": {
"en": "Evade",
"es": "Evadir"
},
"description": {
"en": "Guaranteed dodge on the next incoming attack",
"es": "Esquivar garantizado en el próximo ataque recibido"
},
"icon": "🏃",
"stat_requirement": "agility",
"stat_threshold": 15,
"level_requirement": 12,
"cooldown": 3,
"stamina_cost": 4,
"effects": {
"buff": "evade",
"buff_duration": 1,
"guaranteed_dodge": true
}
},
"poisoned_blade": {
"name": {
"en": "Poisoned Blade",
"es": "Hoja Envenenada"
},
"description": {
"en": "80% damage + poison (3 dmg/turn for 4 turns)",
"es": "80% de daño + veneno (3 de daño/turno durante 4 turnos)"
},
"icon": "🧪",
"stat_requirement": "agility",
"stat_threshold": 25,
"level_requirement": 20,
"cooldown": 5,
"stamina_cost": 6,
"effects": {
"damage_multiplier": 0.8,
"poison_damage": 3,
"poison_duration": 4
}
},
"shadow_strike": {
"name": {
"en": "Shadow Strike",
"es": "Golpe Sombrío"
},
"description": {
"en": "250% damage, guaranteed critical hit",
"es": "250% de daño, golpe crítico garantizado"
},
"icon": "🌑",
"stat_requirement": "agility",
"stat_threshold": 40,
"level_requirement": 35,
"cooldown": 7,
"stamina_cost": 8,
"effects": {
"damage_multiplier": 2.5,
"guaranteed_crit": true
}
},
"fortify": {
"name": {
"en": "Fortify",
"es": "Fortificar"
},
"description": {
"en": "Reduce incoming damage by 60% for 2 turns",
"es": "Reduce el daño recibido en un 60% durante 2 turnos"
},
"icon": "🛡️",
"stat_requirement": "endurance",
"stat_threshold": 8,
"level_requirement": 5,
"cooldown": 3,
"stamina_cost": 4,
"effects": {
"buff": "fortify",
"buff_duration": 2,
"damage_reduction": 0.6
}
},
"second_wind": {
"name": {
"en": "Second Wind",
"es": "Segundo Aliento"
},
"description": {
"en": "Restore 20% of max HP",
"es": "Restaura el 20% de la vida máxima"
},
"icon": "💚",
"stat_requirement": "endurance",
"stat_threshold": 15,
"level_requirement": 12,
"cooldown": 5,
"stamina_cost": 6,
"effects": {
"heal_percent": 0.2
}
},
"iron_skin": {
"name": {
"en": "Iron Skin",
"es": "Piel de Hierro"
},
"description": {
"en": "Immune to status effects for 3 turns",
"es": "Inmune a efectos de estado durante 3 turnos"
},
"icon": "🪨",
"stat_requirement": "endurance",
"stat_threshold": 25,
"level_requirement": 20,
"cooldown": 6,
"stamina_cost": 8,
"effects": {
"buff": "iron_skin",
"buff_duration": 3,
"status_immunity": true
}
},
"adrenaline_rush": {
"name": {
"en": "Adrenaline Rush",
"es": "Subida de Adrenalina"
},
"description": {
"en": "Restore 30% of max stamina (free to use)",
"es": "Restaura el 30% del aguante máximo (sin coste)"
},
"icon": "⚡",
"stat_requirement": "endurance",
"stat_threshold": 40,
"level_requirement": 35,
"cooldown": 8,
"stamina_cost": 0,
"effects": {
"stamina_restore_percent": 0.3
}
},
"analyze": {
"name": {
"en": "Analyze",
"es": "Analizar"
},
"description": {
"en": "Reveal enemy HP%, next attack, and weakness",
"es": "Revela el % de vida del enemigo, su próximo ataque y debilidad"
},
"icon": "🔍",
"stat_requirement": "intellect",
"stat_threshold": 8,
"level_requirement": 5,
"cooldown": 2,
"stamina_cost": 2,
"effects": {
"reveal_hp": true,
"reveal_intent": true,
"mark_analyzed": true
}
},
"exploit_weakness": {
"name": {
"en": "Exploit Weakness",
"es": "Explotar Debilidad"
},
"description": {
"en": "200% damage if Analyze was used this combat",
"es": "200% de daño si se usó Analizar en este combate"
},
"icon": "🎯",
"stat_requirement": "intellect",
"stat_threshold": 15,
"level_requirement": 12,
"cooldown": 4,
"stamina_cost": 5,
"effects": {
"damage_multiplier": 2.0,
"requires_analyzed": true
}
},
"drain_life": {
"name": {
"en": "Drain Life",
"es": "Drenar Vida"
},
"description": {
"en": "100% damage, heal for 50% of damage dealt",
"es": "100% de daño, cura el 50% del daño causado"
},
"icon": "🩸",
"stat_requirement": "intellect",
"stat_threshold": 25,
"level_requirement": 20,
"cooldown": 5,
"stamina_cost": 6,
"effects": {
"damage_multiplier": 1.0,
"lifesteal": 0.5
}
},
"foresight": {
"name": {
"en": "Foresight",
"es": "Premonición"
},
"description": {
"en": "Enemy's next 2 attacks automatically miss",
"es": "Los próximos 2 ataques del enemigo fallan automáticamente"
},
"icon": "👁️",
"stat_requirement": "intellect",
"stat_threshold": 40,
"level_requirement": 35,
"cooldown": 7,
"stamina_cost": 7,
"effects": {
"buff": "foresight",
"buff_duration": 2,
"enemy_miss": true
}
}
}
}