Struct BalanceTuning

Source
pub struct BalanceTuning {
Show 28 fields pub k_armor: f64, pub k_dodge: f64, pub power_norm: f64, pub enemy_curve_anchor_chapter: i64, pub hand_authored_chapter_max: i64, pub enemy_curve_anchor_power: f64, pub chapter_power_step: f64, pub enemy_step_late: f64, pub enemy_step_taper_start: i64, pub sell_price_exp: f64, pub sell_price_coef: f64, pub crit_chance_scale: f64, pub boss_crit_chance: f64, pub boss_armor: f64, pub armor_k_per_chapter: f64, pub regen_tick_max_pct: f64, pub hot_tick_max_pct: f64, pub dot_tick_max_pct: f64, pub enemy_early_bump: f64, pub enemy_mid_bump: f64, pub eff_a1: f64, pub eff_b1: f64, pub eff_a2: f64, pub eff_b2: f64, pub eff_c2: f64, pub wave_damage_skew: f64, pub wave_hp_skew: f64, pub enemy_curve_mode: EnemyCurveMode,
}

Fields§

§k_armor: f64

DR knob for armor mitigation K/(armor+K). Env: OVERLORD_BAL_K_ARMOR.

§k_dodge: f64

DR knob for dodge/evasion ev/(ev+K). Env: OVERLORD_BAL_K_DODGE.

§power_norm: f64

Power-scalar normaliser. Env: OVERLORD_BAL_POWER_NORM.

§enemy_curve_anchor_chapter: i64

Last hand-made campaign chapter (formula curve starts above it). Env: OVERLORD_BAL_ENEMY_ANCHOR_CHAPTER.

§hand_authored_chapter_max: i64

Highest 0-based chapter level resolved from hand-authored base_power in enemy_power_scalar (the base_power/curve split). See HAND_AUTHORED_CHAPTER_MAX. Env: OVERLORD_BAL_HAND_AUTHORED_CHAPTER_MAX.

§enemy_curve_anchor_power: f64

Enemy power at the anchor chapter. Env: OVERLORD_BAL_ENEMY_ANCHOR_POWER.

§chapter_power_step: f64

Enemy power geometric step per chapter — the progression gate. Env: OVERLORD_BAL_ENEMY_STEP.

§enemy_step_late: f64

Late-game enemy step floor. Past enemy_step_taper_start the per-chapter step decays smoothly from chapter_power_step toward this value, so the difficulty gate tracks the player’s DECELERATING late power growth (~1.12×/ch) instead of staying at the early 1.30 — which out-paced late power and produced multi-day chapter stalls / a hard wall. With >= chapter_power_step the taper is OFF (closed-form, unchanged). Env: OVERLORD_BAL_ENEMY_STEP_LATE.

§enemy_step_taper_start: i64

Chapter at which the late-step taper begins. Env: OVERLORD_BAL_ENEMY_STEP_TAPER_START.

§sell_price_exp: f64

Item sale-price exponent on eff (income growth shape). Env: OVERLORD_BAL_SELL_EXP.

§sell_price_coef: f64

Item sale-price coefficient. Env: OVERLORD_BAL_SELL_COEF.

§crit_chance_scale: f64

Crit-chance multiplier (1.0 = shipped). Sigmoid-steepening dial: crit is a ×2+ damage coin-flip per hit — the largest binary outcome-RNG. Env: OVERLORD_BAL_CRIT_SCALE. 0.0 disables crits entirely.

§boss_crit_chance: f64

Boss combat texture: crit_chance (permyriad) granted to boss entities at spawn, carved OUT of their attack budget (power neutral). Env: OVERLORD_BAL_BOSS_CRIT. 0 = off.

§boss_armor: f64

Boss armor rating granted at spawn, carved out of the HP budget (EHP/TTK neutral). Env: OVERLORD_BAL_BOSS_ARMOR. 0 = off.

§armor_k_per_chapter: f64

WoW-style rating deflation for PLAYER armor. Without it item armor saturates the DR curve from the first band (mitigation creeps 64% → ~78% across the game, decaying the marginal value of an armor point ×1.66). Deflating the aggregated player rating by k/(k + per_ch·chapter) is equivalent to growing K_ARMOR with content level but lives in ONE place (attribute aggregation), so combat, the honest scalar and the UI stay consistent automatically. 15/ch is the gentle calibration (late mitigation ≈68.5%, marginal decay ×1.25); 33/ch would flatten mitigation to the first-band level entirely. Env: OVERLORD_BAL_ARMOR_K_PER_CH. 0 = off.

§regen_tick_max_pct: f64

Max per-tick combat regen heal as a fraction of max HP — bounds regen in combat (the scalar bound is separate) so high regen can’t out-heal all damage / instant-full a tank. Env: OVERLORD_BAL_REGEN_TICK_PCT.

§hot_tick_max_pct: f64

Max per-tick HoT heal as a fraction of max HP. Env: OVERLORD_BAL_HOT_TICK_PCT.

§dot_tick_max_pct: f64

Max per-tick DoT damage as a fraction of max HP. Env: OVERLORD_BAL_DOT_TICK_PCT.

§enemy_early_bump: f64

Early-game stat-check bump strength applied at ch3 (tapering ch4/ch5), so the first gear conversions are forced. ch2 is left untouched (it is resource-capped by the 20 starter cookies — a bump there DEADLOCKS, sim- confirmed). 1.0 = off. Env: OVERLORD_BAL_ENEMY_EARLY_BUMP.

§enemy_mid_bump: f64

Mid-game boss-only bump applied at ch7–15 to enforce the gear-engagement gate. Applied exclusively to CampaignBossFight in enemy_power_scalar; wave fights are unaffected so the global enemy_power_for_chapter curve stays monotone. At 8.0: a frozen player (stopped at ch5, power ~2121) faces P/E ≈ 0.34 at the ch7 boss → ~7% first-try win rate; combined with stop_on_lose=true on bosses and the lazy bot not retrying, this creates the hard wall. Engaged players open more chests between attempts and eventually clear the boss. Tapers to 1.0 at ch16 (one past ability-slot unlock at ch15). 1.0 = off. Env: OVERLORD_BAL_ENEMY_MID_BUMP.

§eff_a1: f64

eff_by_level early-branch (L ≤ 130) coefficient. Env: OVERLORD_BAL_EFF_A1.

§eff_b1: f64

eff_by_level early-branch exponent — THE early-power shape knob (lower = flatter early growth, decouples power from level/clock). Env: OVERLORD_BAL_EFF_B1.

§eff_a2: f64

eff_by_level late-branch (L > 130) coefficient. Env: OVERLORD_BAL_EFF_A2.

§eff_b2: f64

eff_by_level late-branch exponent (raise above 0.1 so late power keeps growing instead of plateauing). Env: OVERLORD_BAL_EFF_B2.

§eff_c2: f64

eff_by_level late-branch offset (re-fit for continuity at L=130). Env: OVERLORD_BAL_EFF_C2.

§wave_damage_skew: f64

Wave LETHALITY skew: multiplies the wave’s damage-output normalization relative to the mirror reference’s EHP. >1 ⇒ the wave hits harder than the pure mirror (more death pressure / lower hp_end at equal win-rate). Env: OVERLORD_BAL_WAVE_DAMAGE_SKEW.

§wave_hp_skew: f64

Wave KILL-TIME skew: divides the reference DPS the wave’s total-HP budget is built from. >1 ⇒ the wave has LESS HP than the pure mirror (dies faster / checks less sustained DPS). Env: OVERLORD_BAL_WAVE_HP_SKEW.

EXACT LAW (verified analytically + numerically): the wave’s survive/die break-even sits at true-power ratio r_draw = wave_damage_skew / wave_hp_skew, and fight length scales as 1 / wave_hp_skew. An equal pair keeps the draw at exactly r=1 (skews cancel) while setting the tempo. Move the RATIO to shift the break-even (harder: damage↑ or hp↓); move both together to change tempo without touching the threshold.

§enemy_curve_mode: EnemyCurveMode

Which enemy-curve formula runs: Legacy anchor/step/taper or Derived — the smooth campaign curve (S_ref-seeded FTUE, sparse early E_base calibration, boss sqrt(1.30), then one universal geometric tail). Env: OVERLORD_BAL_ENEMY_CURVE_MODE = legacy | derived.

Implementations§

Source§

impl BalanceTuning

Source

pub fn from_env() -> Self

Defaults, with any OVERLORD_BAL_* env var that parses applied on top. This is the sim-sweep entry point — no recompile, no deploy.

Trait Implementations§

Source§

impl Clone for BalanceTuning

Source§

fn clone(&self) -> BalanceTuning

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BalanceTuning

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BalanceTuning

Source§

fn eq(&self, other: &BalanceTuning) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for BalanceTuning

Source§

impl StructuralPartialEq for BalanceTuning

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more