Configuration

Source: src/dungeon_config.c · 33 lines · 3 functions.

Module responsibility

Holds the tunable generation, reward, progression and combat rules used by the other Dungeon modules.

See how this module fits into the complete Dungeon system →

Module entry points

These functions are exposed to the rest of the Dungeon system. Open one to follow its decisions and helper calls.

How to read these diagrams

Each function has an expandable structural diagram derived from the current C source. Decisions split into True and False, loop bodies are indented, and arrows show statement order.

These are source diagrams before preprocessing, not runtime traces. Callback execution, task scheduling and macro expansion are not inferred.

Functions in this file

initDungeonConfig() · source line 5
void initDungeonConfig(void)
  1. Executeconfig = (DungeonConfig){ .roomsPerFloor = 27, .extraConnectionPercent = 5, .enemyRoomRatio = 4, .treasureRoomRatio = 3, .emptyRoomRatio = 3, .trapsPer100Rooms = 50, .corridorTreasuresPer100Rooms = 20, .combatDiceSides = 8, .combatMinimumDamage = 1, .avoidChancePercent = 50, .runChancePercent = 50, .floor1TrapDamageMin = 2, .floor1TrapDamageMax = 5, .floor2TrapDamageMin = 4, .floor2TrapDamageMax = 8, .floor3TrapDamageMin = 6, .floor3TrapDamageMax = 12, .rareTreasurePercent = 10, .normalGoldRatio = 2, .normalHealthRatio = 1, .rareLifeRatio = 3, .rareAttackRatio = 4, .rareDefenceRatio = 3, .rareLifeHealthGain = 3, .rareAttackGain = 1, .rareDefenceGain = 1, .maxHealthPotions = 1, .floor1EnemyMinLevel = 1, .floor1EnemyMaxLevel = 2, .floor2EnemyMinLevel = 2, .floor2EnemyMaxLevel = 3, .floor3EnemyMinLevel = 3, .floor3EnemyMaxLevel = 4, .enemyLevel1Health = 8, .enemyLevel1Attack = 2, .enemyLevel1Defence = 1, .enemyLevel1Xp = 10, .enemyLevel2Health = 12, .enemyLevel2Attack = 3, .enemyLevel2Defence = 1, .enemyLevel2Xp = 15, .enemyLevel3Health = 16, .enemyLevel3Attack = 4, .enemyLevel3Defence = 2, .enemyLevel3Xp = 22, .enemyLevel4Health = 22, .enemyLevel4Attack = 5, .enemyLevel4Defence = 3, .enemyLevel4Xp = 30, .dragonHealth = 40, .dragonAttack = 7, .dragonDefence = 4, .dragonXp = 60, .floor1GoldMin = 10, .floor1GoldMax = 20, .floor2GoldMin = 20, .floor2GoldMax = 35, .floor3GoldMin = 35, .floor3GoldMax = 55, .shopHealthBaseCost = 40, .shopAttackBaseCost = 60, .shopDefenceBaseCost = 50, .shopRestoreCost = 20, .shopCostIncreasePercent = 25, .aiGlobalShopBudget = 100, .shopHealthGain = 3, .shopAttackGain = 1, .shopDefenceGain = 1, .startHealth = 20, .startAttack = 3, .startDefence = 1, .healthRegenMoves = 25, .healthRegenAmount = 1, .healthRegenLimitPercent = 90, .firstLevelXp = 40, .xpGrowthTenthsPercent = 125, .levelHealthGain = 3, .levelAttackGain = 1, .levelDefenceGain = 1, .chosenHealthGain = 3, .chosenAttackGain = 1, .chosenDefenceGain = 1, };
Read original function source
void initDungeonConfig(void)
{
    config = (DungeonConfig){
        .roomsPerFloor = 27, .extraConnectionPercent = 5, .enemyRoomRatio = 4, .treasureRoomRatio = 3, .emptyRoomRatio = 3,
        .trapsPer100Rooms = 50, .corridorTreasuresPer100Rooms = 20, .combatDiceSides = 8, .combatMinimumDamage = 1,
        .avoidChancePercent = 50, .runChancePercent = 50, .floor1TrapDamageMin = 2, .floor1TrapDamageMax = 5,
        .floor2TrapDamageMin = 4, .floor2TrapDamageMax = 8, .floor3TrapDamageMin = 6, .floor3TrapDamageMax = 12,
        .rareTreasurePercent = 10, .normalGoldRatio = 2, .normalHealthRatio = 1, .rareLifeRatio = 3, .rareAttackRatio = 4,
        .rareDefenceRatio = 3, .rareLifeHealthGain = 3, .rareAttackGain = 1, .rareDefenceGain = 1, .maxHealthPotions = 1,
        .floor1EnemyMinLevel = 1, .floor1EnemyMaxLevel = 2, .floor2EnemyMinLevel = 2, .floor2EnemyMaxLevel = 3,
        .floor3EnemyMinLevel = 3, .floor3EnemyMaxLevel = 4, .enemyLevel1Health = 8, .enemyLevel1Attack = 2, .enemyLevel1Defence = 1, .enemyLevel1Xp = 10,
        .enemyLevel2Health = 12, .enemyLevel2Attack = 3, .enemyLevel2Defence = 1, .enemyLevel2Xp = 15,
        .enemyLevel3Health = 16, .enemyLevel3Attack = 4, .enemyLevel3Defence = 2, .enemyLevel3Xp = 22,
        .enemyLevel4Health = 22, .enemyLevel4Attack = 5, .enemyLevel4Defence = 3, .enemyLevel4Xp = 30,
        .dragonHealth = 40, .dragonAttack = 7, .dragonDefence = 4, .dragonXp = 60,
        .floor1GoldMin = 10, .floor1GoldMax = 20, .floor2GoldMin = 20, .floor2GoldMax = 35, .floor3GoldMin = 35, .floor3GoldMax = 55,
        .shopHealthBaseCost = 40, .shopAttackBaseCost = 60, .shopDefenceBaseCost = 50, .shopRestoreCost = 20, .shopCostIncreasePercent = 25,
        .aiGlobalShopBudget = 100, .shopHealthGain = 3, .shopAttackGain = 1, .shopDefenceGain = 1, .startHealth = 20, .startAttack = 3, .startDefence = 1,
        .healthRegenMoves = 25, .healthRegenAmount = 1, .healthRegenLimitPercent = 90, .firstLevelXp = 40, .xpGrowthTenthsPercent = 125,
        .levelHealthGain = 3, .levelAttackGain = 1, .levelDefenceGain = 1, .chosenHealthGain = 3, .chosenAttackGain = 1, .chosenDefenceGain = 1,
    };
}
applyDungeonConfig() · source line 28
void applyDungeonConfig(const DungeonConfig *saved_config)
  1. Decisionsaved_config != NULL
    True
    1. Executeconfig = *saved_config;
    False

    Continue after this decision.

Read original function source
void applyDungeonConfig(const DungeonConfig *saved_config)
{
    if (saved_config != NULL) config = *saved_config;
}
getDungeonConfig() · source line 33
const DungeonConfig *getDungeonConfig(void)
  1. Exit this functionreturn &config;
Read original function source
const DungeonConfig *getDungeonConfig(void) { return &config; }
Complete original file, including constants and data
/* Coded By JD(2026) */
#error "Reference listing only — not provided as build-ready source."
#include "dungeon_config.h"

static DungeonConfig config;

void initDungeonConfig(void)
{
    config = (DungeonConfig){
        .roomsPerFloor = 27, .extraConnectionPercent = 5, .enemyRoomRatio = 4, .treasureRoomRatio = 3, .emptyRoomRatio = 3,
        .trapsPer100Rooms = 50, .corridorTreasuresPer100Rooms = 20, .combatDiceSides = 8, .combatMinimumDamage = 1,
        .avoidChancePercent = 50, .runChancePercent = 50, .floor1TrapDamageMin = 2, .floor1TrapDamageMax = 5,
        .floor2TrapDamageMin = 4, .floor2TrapDamageMax = 8, .floor3TrapDamageMin = 6, .floor3TrapDamageMax = 12,
        .rareTreasurePercent = 10, .normalGoldRatio = 2, .normalHealthRatio = 1, .rareLifeRatio = 3, .rareAttackRatio = 4,
        .rareDefenceRatio = 3, .rareLifeHealthGain = 3, .rareAttackGain = 1, .rareDefenceGain = 1, .maxHealthPotions = 1,
        .floor1EnemyMinLevel = 1, .floor1EnemyMaxLevel = 2, .floor2EnemyMinLevel = 2, .floor2EnemyMaxLevel = 3,
        .floor3EnemyMinLevel = 3, .floor3EnemyMaxLevel = 4, .enemyLevel1Health = 8, .enemyLevel1Attack = 2, .enemyLevel1Defence = 1, .enemyLevel1Xp = 10,
        .enemyLevel2Health = 12, .enemyLevel2Attack = 3, .enemyLevel2Defence = 1, .enemyLevel2Xp = 15,
        .enemyLevel3Health = 16, .enemyLevel3Attack = 4, .enemyLevel3Defence = 2, .enemyLevel3Xp = 22,
        .enemyLevel4Health = 22, .enemyLevel4Attack = 5, .enemyLevel4Defence = 3, .enemyLevel4Xp = 30,
        .dragonHealth = 40, .dragonAttack = 7, .dragonDefence = 4, .dragonXp = 60,
        .floor1GoldMin = 10, .floor1GoldMax = 20, .floor2GoldMin = 20, .floor2GoldMax = 35, .floor3GoldMin = 35, .floor3GoldMax = 55,
        .shopHealthBaseCost = 40, .shopAttackBaseCost = 60, .shopDefenceBaseCost = 50, .shopRestoreCost = 20, .shopCostIncreasePercent = 25,
        .aiGlobalShopBudget = 100, .shopHealthGain = 3, .shopAttackGain = 1, .shopDefenceGain = 1, .startHealth = 20, .startAttack = 3, .startDefence = 1,
        .healthRegenMoves = 25, .healthRegenAmount = 1, .healthRegenLimitPercent = 90, .firstLevelXp = 40, .xpGrowthTenthsPercent = 125,
        .levelHealthGain = 3, .levelAttackGain = 1, .levelDefenceGain = 1, .chosenHealthGain = 3, .chosenAttackGain = 1, .chosenDefenceGain = 1,
    };
}

void applyDungeonConfig(const DungeonConfig *saved_config)
{
    if (saved_config != NULL) config = *saved_config;
}

const DungeonConfig *getDungeonConfig(void) { return &config; }