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