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:
161
api/app/data/static_items/consumables.yaml
Normal file
161
api/app/data/static_items/consumables.yaml
Normal 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
|
||||
Reference in New Issue
Block a user