scripts/mini_boss.pyΒΆ
Part of Dungeon Explorer.
1"""Mini-boss enemies: named elites on floors 25/50/75 with unique visuals."""
2
3import random
4
5from nodes.enemy_base import EnemyBase
6from nodes.enemy_types import make_elite
7
8# Mini-boss definitions: (name, archetype, base_hp, base_dmg, base_spd, base_xp)
9_MINI_BOSS_DEFS = {
10 25: ("Gorrath the Bonelord", "skeleton", 200, 15, 50, 200),
11 50: ("Malachar the Undying", "wraith", 400, 25, 45, 500),
12 75: ("Kragthor the Stone King", "golem", 600, 35, 35, 800),
13}
14
15_MINI_BOSS_COLOURS = {
16 25: (0.95, 0.9, 0.7, 1.0), # Pale gold bones
17 50: (0.7, 0.2, 0.9, 0.8), # Deep purple wraith
18 75: (0.6, 0.55, 0.4, 1.0), # Bronze stone
19}
20
21
22def create_mini_boss(dungeon_level: int, rng: random.Random | None = None) -> EnemyBase:
23 """Create a named mini-boss for the given floor.
24
25 Mini-bosses are elite enemies with boosted stats and guaranteed epic loot.
26 """
27 rng = rng or random.Random()
28 boss_def = _MINI_BOSS_DEFS.get(dungeon_level)
29 if boss_def is None:
30 # Default to a generic elite if floor isn't in the table
31 from nodes.enemy_types import create_enemy
32
33 enemy = create_enemy("demon", dungeon_level)
34 make_elite(enemy, rng)
35 return enemy
36
37 boss_name, archetype, base_hp, base_dmg, base_spd, base_xp = boss_def
38 lm = max(0, dungeon_level - 1)
39
40 from nodes.enemy_types import create_enemy
41
42 enemy = create_enemy(archetype, dungeon_level)
43
44 # Override with mini-boss stats (stronger than regular enemies of same level)
45 enemy.hp = int(base_hp * (1 + lm * 0.15))
46 enemy.max_hp = enemy.hp
47 enemy.damage = int(base_dmg * (1 + lm * 0.08))
48 enemy.speed = base_spd * (1 + lm * 0.005)
49 enemy.xp_reward = int(base_xp * (1 + lm * 0.05))
50 enemy.display_name = boss_name
51 enemy.name = boss_name
52 enemy._colour = _MINI_BOSS_COLOURS.get(dungeon_level, (0.9, 0.7, 0.2, 1.0))
53
54 # Mark as elite with 2 affixes
55 make_elite(enemy, rng)
56 enemy.display_name = boss_name # Restore name after make_elite prepends "Elite"
57
58 # Flag for guaranteed epic loot
59 enemy._is_mini_boss = True
60 enemy._guaranteed_epic = True
61
62 return enemy