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,161 @@
# Consumable items that drop from enemies or are purchased from vendors
# These items have effects_on_use that trigger when consumed
items:
# ==========================================================================
# Health Potions
# ==========================================================================
health_potion_small:
name: "Small Health Potion"
item_type: consumable
rarity: common
description: "A small vial of red liquid that restores a modest amount of health."
value: 25
is_tradeable: true
effects_on_use:
- effect_id: heal_small
name: "Minor Healing"
effect_type: hot
power: 30
duration: 1
stacks: 1
health_potion_medium:
name: "Health Potion"
item_type: consumable
rarity: uncommon
description: "A standard healing potion used by adventurers across the realm."
value: 75
is_tradeable: true
effects_on_use:
- effect_id: heal_medium
name: "Healing"
effect_type: hot
power: 75
duration: 1
stacks: 1
health_potion_large:
name: "Large Health Potion"
item_type: consumable
rarity: rare
description: "A potent healing draught that restores significant health."
value: 150
is_tradeable: true
effects_on_use:
- effect_id: heal_large
name: "Major Healing"
effect_type: hot
power: 150
duration: 1
stacks: 1
# ==========================================================================
# Mana Potions
# ==========================================================================
mana_potion_small:
name: "Small Mana Potion"
item_type: consumable
rarity: common
description: "A small vial of blue liquid that restores mana."
value: 25
is_tradeable: true
# Note: MP restoration would need custom effect type or game logic
mana_potion_medium:
name: "Mana Potion"
item_type: consumable
rarity: uncommon
description: "A standard mana potion favored by spellcasters."
value: 75
is_tradeable: true
# ==========================================================================
# Status Effect Cures
# ==========================================================================
antidote:
name: "Antidote"
item_type: consumable
rarity: common
description: "A bitter herbal remedy that cures poison effects."
value: 30
is_tradeable: true
smelling_salts:
name: "Smelling Salts"
item_type: consumable
rarity: uncommon
description: "Pungent salts that can revive unconscious allies or cure stun."
value: 40
is_tradeable: true
# ==========================================================================
# Combat Buffs
# ==========================================================================
elixir_of_strength:
name: "Elixir of Strength"
item_type: consumable
rarity: rare
description: "A powerful elixir that temporarily increases strength."
value: 100
is_tradeable: true
effects_on_use:
- effect_id: str_buff
name: "Strength Boost"
effect_type: buff
power: 5
duration: 5
stacks: 1
elixir_of_agility:
name: "Elixir of Agility"
item_type: consumable
rarity: rare
description: "A shimmering elixir that enhances reflexes and speed."
value: 100
is_tradeable: true
effects_on_use:
- effect_id: dex_buff
name: "Agility Boost"
effect_type: buff
power: 5
duration: 5
stacks: 1
# ==========================================================================
# Food Items (simple healing, no combat use)
# ==========================================================================
ration:
name: "Trail Ration"
item_type: consumable
rarity: common
description: "Dried meat, hardtack, and nuts. Sustains an adventurer on long journeys."
value: 5
is_tradeable: true
effects_on_use:
- effect_id: ration_heal
name: "Nourishment"
effect_type: hot
power: 10
duration: 1
stacks: 1
cooked_meat:
name: "Cooked Meat"
item_type: consumable
rarity: common
description: "Freshly cooked meat that restores health."
value: 15
is_tradeable: true
effects_on_use:
- effect_id: meat_heal
name: "Hearty Meal"
effect_type: hot
power: 20
duration: 1
stacks: 1