From dbcb0c5c772a12a5d58d3743f58b6d76ffe21093 Mon Sep 17 00:00:00 2001 From: Denis Ranneft Date: Tue, 31 Mar 2026 12:04:55 +0300 Subject: [PATCH] nerf skeleton king --- backend/internal/game/combat.go | 13 ++++++----- backend/internal/tuning/runtime.go | 35 ++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/backend/internal/game/combat.go b/backend/internal/game/combat.go index f405914..c5911e7 100644 --- a/backend/internal/game/combat.go +++ b/backend/internal/game/combat.go @@ -365,16 +365,17 @@ func ProcessEnemyRegen(enemy *model.Enemy, tickDuration time.Duration, remainder return 0 } - // Regen rates vary by enemy type. - cfg := tuning.Get() - regenRate := cfg.EnemyRegenDefault + // Regen rates: runtime_config JSON merged at startup; Effective* falls back to tuning.DefaultEnemyRegen*. + var regenRate float64 switch enemy.Type { case model.EnemySkeletonKing: - regenRate = cfg.EnemyRegenSkeletonKing + regenRate = tuning.EffectiveEnemyRegenSkeletonKing() case model.EnemyForestWarden: - regenRate = cfg.EnemyRegenForestWarden + regenRate = tuning.EffectiveEnemyRegenForestWarden() case model.EnemyBattleLizard: - regenRate = cfg.EnemyRegenBattleLizard + regenRate = tuning.EffectiveEnemyRegenBattleLizard() + default: + regenRate = tuning.EffectiveEnemyRegenDefault() } healFloat := float64(enemy.MaxHP) * regenRate * tickDuration.Seconds() diff --git a/backend/internal/tuning/runtime.go b/backend/internal/tuning/runtime.go index b8f6f42..cc70160 100644 --- a/backend/internal/tuning/runtime.go +++ b/backend/internal/tuning/runtime.go @@ -305,10 +305,10 @@ func DefaultValues() Values { DebuffProcStun: 0.25, DebuffProcFreeze: 0.20, DebuffProcIceSlow: 0.20, - EnemyRegenDefault: 0.02, - EnemyRegenSkeletonKing: 0.10, - EnemyRegenForestWarden: 0.05, - EnemyRegenBattleLizard: 0.01, + EnemyRegenDefault: DefaultEnemyRegenDefault, + EnemyRegenSkeletonKing: DefaultEnemyRegenSkeletonKing, + EnemyRegenForestWarden: DefaultEnemyRegenForestWarden, + EnemyRegenBattleLizard: DefaultEnemyRegenBattleLizard, SummonCycleSeconds: 15, SummonDamageDivisor: 4, LuckBuffMultiplier: 1.75, @@ -431,6 +431,33 @@ func EffectiveQuestOfferRefreshHours() int { return n } +func effectiveRegenPerSecond(cfg float64, fallback float64) float64 { + if cfg <= 0 { + return fallback + } + return cfg +} + +// EffectiveEnemyRegenDefault returns enemy regen rate (MaxHP per second) from runtime config with code fallback. +func EffectiveEnemyRegenDefault() float64 { + return effectiveRegenPerSecond(Get().EnemyRegenDefault, DefaultEnemyRegenDefault) +} + +// EffectiveEnemyRegenSkeletonKing returns Skeleton King regen rate (MaxHP per second) from runtime config with code fallback. +func EffectiveEnemyRegenSkeletonKing() float64 { + return effectiveRegenPerSecond(Get().EnemyRegenSkeletonKing, DefaultEnemyRegenSkeletonKing) +} + +// EffectiveEnemyRegenForestWarden returns Forest Warden regen rate from runtime config with code fallback. +func EffectiveEnemyRegenForestWarden() float64 { + return effectiveRegenPerSecond(Get().EnemyRegenForestWarden, DefaultEnemyRegenForestWarden) +} + +// EffectiveEnemyRegenBattleLizard returns Battle Lizard regen rate from runtime config with code fallback. +func EffectiveEnemyRegenBattleLizard() float64 { + return effectiveRegenPerSecond(Get().EnemyRegenBattleLizard, DefaultEnemyRegenBattleLizard) +} + func Set(v Values) { current.Store(&v) }