디아블로의 '고행(Torment)' 난이도 시스템: 몬스터 스탯 스케일링 공식과 밸런싱 구조
디아블로 시리즈의 대표적인 엔드게임 난이도 구조인 고행 단계별 몬스터 스탯 스케일링 수식과 보상 밸런싱 메커니즘을 분석하고 게임 엔진에서의 실용적인 구현 방법을 정리합니다.

디아블로(Diablo) 시리즈는 루터 슈터 및 액션 RPG 장르에서 엔드게임 난이도 구조의 대표적인 기준을 제시해 왔습니다. 특히 ‘고난도(Torment)’ 및 ‘고행’으로 불리는 단계별 난이도 시스템은 플레이어가 캐릭터의 아이템과 스킬 조합을 강화함에 따라 맞춰진 적절한 도전 과제와 보상을 지속적으로 제공합니다.
이러한 엔드게임 난이도 시스템의 핵심은 몬스터 스탯 스케일링 공식입니다. 난이도가 올라갈 때 몬스터의 체력과 공격력을 어떤 수식으로 늘릴 것인가에 따라 플레이의 긴장감과 수집 욕구가 결정됩니다. 단순한 픽스드 스탯 증가는 수치 인플레이션이나 급격한 난이도 수직 상승을 일으켜 플레이어에게 불쾌감을 줄 수 있습니다.

고행 단계별 몬스터 스탯 스케일링의 수학적 구조
디아블로 3와 디아블로 4의 난이도 스케일링은 지수 함수와 구간별 가중 다항식을 혼합한 형태를 띱니다. 난이도 단계 t (Torment Level, t = 1, 2, 3, …)에 따른 몬스터 체력 HP(t)는 기본 체력 HP_base에 승수 함수를 곱하는 방식으로 계산됩니다.
여기서 α는 난이도 1단계 상승당 체력 증가율 계수입니다. 초기 고행 단계에서는 α가 일정한 값을 유지하지만 고단계로 진입할수록 장비 옵션의 곱연산 스케일링에 맞추기 위해 구간별 승수 g_i를 적용하는 형태를 띱니다.
반면 몬스터의 공격력 Damage(t)는 체력 스케일링과 동일한 비율로 늘리지 않는 것이 보편적입니다. 플레이어의 방어 스탯 및 생존 기믹 한계로 인해 공격력이 체력과 같은 속도로 증가하면 한 번의 공격으로 사망하는 이른바 ‘원샷’ 상황이 빈번하게 발생하기 때문입니다. 따라서 공격력 증가율 계수 β는 체력 계수 α보다 작게 설정합니다.
일반적으로 체력 증가율 α가 0.6~1.0 (단계당 60%~100% 증가) 수준이라면 공격력 증가율 β는 0.15~0.25 (단계당 15%~25% 증가) 선에서 통제됩니다.
난이도 증가에 따른 보상 밸런싱
난이도가 상승할 때 플레이어에게 체감되는 난이도 대비 리워드 수율이 정당해야 고행 난이도를 도전할 동기가 부여됩니다. 획득 경험치(EXP)와 골드 및 드랍률 multiplier Reward(t)는 다음과 같은 비선형 공식을 따릅니다.
여기서 k는 보상 기본 계수, p는 성장의 완급을 조절하는 지수 파라미터입니다.
p 파라미터를 1보다 작게 설정하면 난이도가 높아질수록 비례 보상 증가 폭이 점차 감소하여 특정 난이도에서의 효율 과밀 현상을 막을 수 있습니다.
graph TD
A[난이도 단계 Torment Level] --> B[기본 스탯 테이블 참조]
B --> C[체력 및 공격력 스케일링 승수 산출]
C --> D[몬스터 HP 계산]
C --> E[몬스터 Damage 계산]
D --> F[인게임 몬스터 스폰 및 전투 실행]
E --> F
F --> G[처치 시 보상 배율 적용]
게임 엔진에서의 실용적인 스케일링 시스템 구현
Unity나 Unreal Engine과 같은 최신 엔진에서 이와 같은 난이도 스케일링을 구현할 때, 하드코딩된 공식보다는 인스펙터에서 구성을 용이하게 만드는 구조가 권장됩니다. 다음은 C#을 활용해 구간별 스케일링 계수를 처리하는 난이도 매니저의 예시입니다.
using UnityEngine;
[System.Serializable]
public struct TormentTierData
{
public int tierIndex;
public float hpMultiplier;
public float damageMultiplier;
public float rewardMultiplier;
}
public class DifficultyScalingManager : MonoBehaviour
{
[SerializeField] private float baseMonsterHP = 100f;
[SerializeField] private float baseMonsterDamage = 10f;
[SerializeField] private float baseRewardRate = 1.0f;
[SerializeField] private float hpGrowthFactor = 0.75f;
[SerializeField] private float damageGrowthFactor = 0.20f;
public (float hp, float damage, float reward) CalculateScaledStats(int tormentLevel)
{
float scaledHP = baseMonsterHP * Mathf.Pow(1f + hpGrowthFactor, tormentLevel);
float scaledDamage = baseMonsterDamage * Mathf.Pow(1f + damageGrowthFactor, tormentLevel);
float scaledReward = baseRewardRate * (1f + 0.5f * Mathf.Pow(tormentLevel, 0.85f));
return (scaledHP, scaledDamage, scaledReward);
}
}
이와 같이 체력과 공격력의 성장 계수를 분리하고 보상 배율은 지수 파라미터 기반으로 계산하도록 설계하면 에디터 상에서 균형점을 손쉽게 조작할 수 있습니다.

인디 게임 개발자가 유의해야 할 난이도 설계 가이드라인
- Time-To-Kill(TTK) 지표의 수평 유지: 플레이어의 최고 등급 장비 세팅 시 몬스터 한 분대를 처치하는 데 걸리는 평균 시간(TTK)이 고행 각 단계별로 크게 튀지 않도록 조절해야 합니다.
- 원샷 데미지 세이프가드: 공격력 성장률을 억제하더라도 특정 난이도 구간에서 플레이어 최대 체력을 상회하는 데미지가 들어오는 것을 방지하기 위해 최대 피해 제한(Damage Cap) 시스템을 병행해야 합니다.
- 직관적인 UI 표기: 내부 수치가 수억, 수조 단위로 인플레이션되더라도 플레이어가 시각적으로 성장 속도를 직관적으로 파악할 수 있도록 수치 축약 표기(K, M, B, T 등)를 도입하는 것이 효과적입니다.



