feat(api): implement combat loot integration with hybrid static/procedural system

Add CombatLootService that orchestrates loot generation from combat,
supporting both static item drops (consumables, materials) and procedural
equipment generation (weapons, armor with affixes).

Key changes:
- Extend LootEntry model with LootType enum (STATIC/PROCEDURAL)
- Create StaticItemLoader service for consumables/materials from YAML
- Create CombatLootService with full rarity formula incorporating:
  - Party average level
  - Enemy difficulty tier (EASY: +0%, MEDIUM: +5%, HARD: +15%, BOSS: +30%)
  - Character luck stat
  - Per-entry rarity bonus
- Integrate with CombatService._calculate_rewards() for automatic loot gen
- Add boss guaranteed drops via generate_boss_loot()

New enemy variants (goblin family proof-of-concept):
- goblin_scout (Easy) - static drops only
- goblin_warrior (Medium) - static + procedural weapon drops
- goblin_chieftain (Hard) - static + procedural weapon/armor drops

Static items added:
- consumables.yaml: health/mana potions, elixirs, food
- materials.yaml: trophy items, crafting materials

Tests: 59 new tests across 3 test files (all passing)
This commit is contained in:
2025-11-27 00:01:17 -06:00
parent a38906b445
commit fdd48034e4
14 changed files with 2257 additions and 26 deletions

View File

@@ -0,0 +1,85 @@
# Goblin Chieftain - Hard variant, elite tribe leader
# A cunning and powerful goblin leader, adorned with trophies.
# Commands respect through fear and violence, drops quality loot.
enemy_id: goblin_chieftain
name: Goblin Chieftain
description: >
A large, scarred goblin wearing a crown of teeth and bones.
The chieftain has clawed its way to leadership through countless
battles and betrayals. It wields a well-maintained weapon stolen
from a fallen adventurer and commands its tribe with an iron fist.
base_stats:
strength: 16
dexterity: 12
constitution: 14
intelligence: 10
wisdom: 10
charisma: 12
luck: 12
abilities:
- basic_attack
- shield_bash
- intimidating_shout
loot_table:
# Static drops - guaranteed materials
- loot_type: static
item_id: goblin_ear
drop_chance: 1.0
quantity_min: 2
quantity_max: 3
- loot_type: static
item_id: goblin_chieftain_token
drop_chance: 0.80
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: goblin_war_paint
drop_chance: 0.50
quantity_min: 1
quantity_max: 2
# Consumable drops
- loot_type: static
item_id: health_potion_medium
drop_chance: 0.40
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: elixir_of_strength
drop_chance: 0.10
quantity_min: 1
quantity_max: 1
# Procedural equipment drops - higher chance and rarity bonus
- loot_type: procedural
item_type: weapon
drop_chance: 0.25
rarity_bonus: 0.10
quantity_min: 1
quantity_max: 1
- loot_type: procedural
item_type: armor
drop_chance: 0.15
rarity_bonus: 0.05
quantity_min: 1
quantity_max: 1
experience_reward: 75
gold_reward_min: 20
gold_reward_max: 50
difficulty: hard
tags:
- humanoid
- goblinoid
- leader
- elite
- armed
base_damage: 14
crit_chance: 0.15
flee_chance: 0.25

View File

@@ -0,0 +1,56 @@
# Goblin Scout - Easy variant, agile but fragile
# A fast, cowardly goblin that serves as a lookout for its tribe.
# Quick to flee, drops minor loot and the occasional small potion.
enemy_id: goblin_scout
name: Goblin Scout
description: >
A small, wiry goblin with oversized ears and beady yellow eyes.
Goblin scouts are the first line of awareness for their tribes,
often found lurking in shadows or perched in trees. They prefer
to run rather than fight, but will attack if cornered.
base_stats:
strength: 6
dexterity: 14
constitution: 5
intelligence: 6
wisdom: 10
charisma: 4
luck: 10
abilities:
- basic_attack
loot_table:
# Static drops - materials and consumables
- loot_type: static
item_id: goblin_ear
drop_chance: 0.60
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: goblin_trinket
drop_chance: 0.20
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: health_potion_small
drop_chance: 0.08
quantity_min: 1
quantity_max: 1
experience_reward: 10
gold_reward_min: 1
gold_reward_max: 4
difficulty: easy
tags:
- humanoid
- goblinoid
- small
- scout
base_damage: 3
crit_chance: 0.08
flee_chance: 0.70

View File

@@ -0,0 +1,70 @@
# Goblin Warrior - Medium variant, trained fighter
# A battle-hardened goblin wielding crude but effective weapons.
# More dangerous than scouts, fights in organized groups.
enemy_id: goblin_warrior
name: Goblin Warrior
description: >
A muscular goblin clad in scavenged armor and wielding a crude
but deadly weapon. Goblin warriors are the backbone of any goblin
warband, trained to fight rather than flee. They attack with
surprising ferocity and coordination.
base_stats:
strength: 12
dexterity: 10
constitution: 10
intelligence: 6
wisdom: 6
charisma: 4
luck: 8
abilities:
- basic_attack
- shield_bash
loot_table:
# Static drops - materials and consumables
- loot_type: static
item_id: goblin_ear
drop_chance: 0.80
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: goblin_war_paint
drop_chance: 0.15
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: health_potion_small
drop_chance: 0.15
quantity_min: 1
quantity_max: 1
- loot_type: static
item_id: iron_ore
drop_chance: 0.10
quantity_min: 1
quantity_max: 2
# Procedural equipment drops
- loot_type: procedural
item_type: weapon
drop_chance: 0.08
rarity_bonus: 0.0
quantity_min: 1
quantity_max: 1
experience_reward: 25
gold_reward_min: 5
gold_reward_max: 15
difficulty: medium
tags:
- humanoid
- goblinoid
- warrior
- armed
base_damage: 8
crit_chance: 0.10
flee_chance: 0.45