Equipment-Combat Integration: - Update Stats damage formula from STR//2 to int(STR*0.75) for better scaling - Add spell_power system for magical weapons (staves, wands) - Add spell_power_bonus field to Stats model with spell_power property - Add spell_power field to Item model with is_magical_weapon() method - Update Character.get_effective_stats() to populate spell_power_bonus Combatant Model Updates: - Add weapon property fields (crit_chance, crit_multiplier, damage_type) - Add elemental weapon support (elemental_damage_type, physical_ratio, elemental_ratio) - Update serialization to handle new weapon properties DamageCalculator Refactoring: - Remove weapon_damage parameter from calculate_physical_damage() - Use attacker_stats.damage directly (includes weapon bonus) - Use attacker_stats.spell_power for magical damage calculations Combat Service Updates: - Extract weapon properties in _create_combatant_from_character() - Use stats.damage_bonus for enemy combatants from templates - Remove hardcoded _get_weapon_damage() method - Handle elemental weapons with split damage in _execute_attack() Item Generation Updates: - Add base_spell_power to BaseItemTemplate dataclass - Add ARCANE damage type to DamageType enum - Add magical weapon templates (wizard_staff, arcane_staff, wand, crystal_wand) Test Updates: - Update test_stats.py for new damage formula (0.75 scaling) - Update test_character.py for equipment bonus calculations - Update test_damage_calculator.py for new API signatures - Update test_combat_service.py mock fixture for equipped attribute Tests: 174 passing
228 lines
5.5 KiB
YAML
228 lines
5.5 KiB
YAML
# Base Weapon Templates for Procedural Generation
|
|
#
|
|
# These templates define the foundation that affixes attach to.
|
|
# Example: "Dagger" + "Flaming" prefix = "Flaming Dagger"
|
|
#
|
|
# Template Structure:
|
|
# template_id: Unique identifier
|
|
# name: Base item name
|
|
# item_type: "weapon"
|
|
# description: Flavor text
|
|
# base_damage: Weapon damage
|
|
# base_value: Gold value
|
|
# damage_type: "physical" (default)
|
|
# crit_chance: Critical hit chance (0.0-1.0)
|
|
# crit_multiplier: Crit damage multiplier
|
|
# required_level: Min level to use/drop
|
|
# drop_weight: Higher = more common (1.0 = standard)
|
|
# min_rarity: Minimum rarity for this template
|
|
|
|
weapons:
|
|
# ==================== ONE-HANDED SWORDS ====================
|
|
dagger:
|
|
template_id: "dagger"
|
|
name: "Dagger"
|
|
item_type: "weapon"
|
|
description: "A small, quick blade for close combat"
|
|
base_damage: 6
|
|
base_value: 15
|
|
damage_type: "physical"
|
|
crit_chance: 0.08
|
|
crit_multiplier: 2.0
|
|
required_level: 1
|
|
drop_weight: 1.5
|
|
|
|
short_sword:
|
|
template_id: "short_sword"
|
|
name: "Short Sword"
|
|
item_type: "weapon"
|
|
description: "A versatile one-handed blade"
|
|
base_damage: 10
|
|
base_value: 30
|
|
damage_type: "physical"
|
|
crit_chance: 0.06
|
|
crit_multiplier: 2.0
|
|
required_level: 1
|
|
drop_weight: 1.3
|
|
|
|
longsword:
|
|
template_id: "longsword"
|
|
name: "Longsword"
|
|
item_type: "weapon"
|
|
description: "A standard warrior's blade"
|
|
base_damage: 14
|
|
base_value: 50
|
|
damage_type: "physical"
|
|
crit_chance: 0.05
|
|
crit_multiplier: 2.0
|
|
required_level: 3
|
|
drop_weight: 1.0
|
|
|
|
# ==================== TWO-HANDED WEAPONS ====================
|
|
greatsword:
|
|
template_id: "greatsword"
|
|
name: "Greatsword"
|
|
item_type: "weapon"
|
|
description: "A massive two-handed blade"
|
|
base_damage: 22
|
|
base_value: 100
|
|
damage_type: "physical"
|
|
crit_chance: 0.04
|
|
crit_multiplier: 2.5
|
|
required_level: 5
|
|
drop_weight: 0.7
|
|
min_rarity: "uncommon"
|
|
|
|
# ==================== AXES ====================
|
|
hatchet:
|
|
template_id: "hatchet"
|
|
name: "Hatchet"
|
|
item_type: "weapon"
|
|
description: "A small throwing axe"
|
|
base_damage: 8
|
|
base_value: 20
|
|
damage_type: "physical"
|
|
crit_chance: 0.06
|
|
crit_multiplier: 2.2
|
|
required_level: 1
|
|
drop_weight: 1.2
|
|
|
|
battle_axe:
|
|
template_id: "battle_axe"
|
|
name: "Battle Axe"
|
|
item_type: "weapon"
|
|
description: "A heavy axe designed for combat"
|
|
base_damage: 16
|
|
base_value: 60
|
|
damage_type: "physical"
|
|
crit_chance: 0.05
|
|
crit_multiplier: 2.3
|
|
required_level: 4
|
|
drop_weight: 0.9
|
|
|
|
# ==================== BLUNT WEAPONS ====================
|
|
club:
|
|
template_id: "club"
|
|
name: "Club"
|
|
item_type: "weapon"
|
|
description: "A simple wooden club"
|
|
base_damage: 7
|
|
base_value: 10
|
|
damage_type: "physical"
|
|
crit_chance: 0.04
|
|
crit_multiplier: 2.0
|
|
required_level: 1
|
|
drop_weight: 1.5
|
|
|
|
mace:
|
|
template_id: "mace"
|
|
name: "Mace"
|
|
item_type: "weapon"
|
|
description: "A flanged mace for crushing armor"
|
|
base_damage: 12
|
|
base_value: 40
|
|
damage_type: "physical"
|
|
crit_chance: 0.05
|
|
crit_multiplier: 2.0
|
|
required_level: 2
|
|
drop_weight: 1.0
|
|
|
|
# ==================== STAVES ====================
|
|
quarterstaff:
|
|
template_id: "quarterstaff"
|
|
name: "Quarterstaff"
|
|
item_type: "weapon"
|
|
description: "A simple wooden staff"
|
|
base_damage: 6
|
|
base_value: 10
|
|
damage_type: "physical"
|
|
crit_chance: 0.05
|
|
crit_multiplier: 2.0
|
|
required_level: 1
|
|
drop_weight: 1.2
|
|
|
|
wizard_staff:
|
|
template_id: "wizard_staff"
|
|
name: "Wizard Staff"
|
|
item_type: "weapon"
|
|
description: "A staff attuned to magical energy"
|
|
base_damage: 4
|
|
base_spell_power: 12
|
|
base_value: 45
|
|
damage_type: "arcane"
|
|
crit_chance: 0.05
|
|
crit_multiplier: 2.0
|
|
required_level: 3
|
|
drop_weight: 0.8
|
|
|
|
arcane_staff:
|
|
template_id: "arcane_staff"
|
|
name: "Arcane Staff"
|
|
item_type: "weapon"
|
|
description: "A powerful staff pulsing with arcane power"
|
|
base_damage: 6
|
|
base_spell_power: 18
|
|
base_value: 90
|
|
damage_type: "arcane"
|
|
crit_chance: 0.06
|
|
crit_multiplier: 2.0
|
|
required_level: 5
|
|
drop_weight: 0.6
|
|
min_rarity: "uncommon"
|
|
|
|
# ==================== WANDS ====================
|
|
wand:
|
|
template_id: "wand"
|
|
name: "Wand"
|
|
item_type: "weapon"
|
|
description: "A simple magical focus"
|
|
base_damage: 2
|
|
base_spell_power: 8
|
|
base_value: 30
|
|
damage_type: "arcane"
|
|
crit_chance: 0.06
|
|
crit_multiplier: 2.0
|
|
required_level: 1
|
|
drop_weight: 1.0
|
|
|
|
crystal_wand:
|
|
template_id: "crystal_wand"
|
|
name: "Crystal Wand"
|
|
item_type: "weapon"
|
|
description: "A wand topped with a magical crystal"
|
|
base_damage: 3
|
|
base_spell_power: 14
|
|
base_value: 60
|
|
damage_type: "arcane"
|
|
crit_chance: 0.07
|
|
crit_multiplier: 2.2
|
|
required_level: 4
|
|
drop_weight: 0.8
|
|
|
|
# ==================== RANGED ====================
|
|
shortbow:
|
|
template_id: "shortbow"
|
|
name: "Shortbow"
|
|
item_type: "weapon"
|
|
description: "A compact bow for quick shots"
|
|
base_damage: 8
|
|
base_value: 25
|
|
damage_type: "physical"
|
|
crit_chance: 0.07
|
|
crit_multiplier: 2.0
|
|
required_level: 1
|
|
drop_weight: 1.1
|
|
|
|
longbow:
|
|
template_id: "longbow"
|
|
name: "Longbow"
|
|
item_type: "weapon"
|
|
description: "A powerful bow with excellent range"
|
|
base_damage: 14
|
|
base_value: 55
|
|
damage_type: "physical"
|
|
crit_chance: 0.08
|
|
crit_multiplier: 2.2
|
|
required_level: 4
|
|
drop_weight: 0.9
|