몬스터 등급(Rarity) 체계와 수식어(Affix) 조합 로직 설계

일반부터 보스까지 몬스터 등급별 스탯 배율 공식과 무작위 수식어(Affix) 추첨 및 상극 속성 방지 알고리즘의 구현 방식을 다룹니다.

✓ 복사 완료!
챕터수치 공식 & 밸런싱
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
몬스터 등급(Rarity) 체계와 수식어(Affix) 조합 로직 설계

몬스터 등급(Rarity) 체계와 스탯 확장 공식

액션 RPG나 딜체크 중심의 게임에서 몬스터의 등급 구분은 전투의 리듬을 조절하는 핵심 요소입니다. 단조로운 전투를 방지하기 위해 몬스터는 크게 일반(Normal), 엘리트(Elite), 챔피언(Champion), 보스(Boss)로 구분됩니다.

각 등급은 단순 체력 증가를 넘어 공격 속도, AI 행동 주기, 특수 기술 사용 빈도에서 차이를 보입니다. 이를 유연하게 관리하려면 기초 스탯 테이블과 등급 가중치를 분리한 스케일링 공식이 필요합니다.

몬스터의 최종 체력과 공격력은 기초 스탯에 레벨 보정과 등급 가중치 그리고 부여된 수식어의 곱연산으로 산출됩니다.

HPfinal=HPbase×(1+α×L)×WrarityHP_{final} = HP_{base} \times (1 + \alpha \times L) \times W_{rarity}

여기서 HPbaseHP_{base}는 몬스터의 기본 체력, α\alpha는 레벨당 성장 계수, LL은 레벨이며 WrarityW_{rarity}는 등급 가중치입니다. 예를 들어 일반 등급의 가중치가 1.01.0이라면 엘리트는 3.53.5, 챔피언은 6.06.0, 보스는 25.025.0 이상으로 설정할 수 있습니다.

수식어가 여러 개 부여될 경우 초당 피해량(DPS) 보정은 다음과 같이 누적 적용됩니다.

DPSfinal=ATKbase×Wrarity×∏i=1n(1+Maffix,i)DPS_{final} = ATK_{base} \times W_{rarity} \times \prod_{i=1}^{n} (1 + M_{affix, i})

몬스터 등급별 스탯 스케일링 체계와 챔피언/엘리트 몬스터 시각적 배율 구조

수식어(Affix) 부여 시스템 구조

수식어(Affix) 시스템은 동일한 프리셋의 몬스터라도 매번 다른 패턴의 위협을 가하도록 만듭니다. ‘화염 강화’, ‘신속’, ‘유도 탄환’, ‘생명력 흡수’ 같은 속성들이 대표적입니다.

수식어를 무작위로 부여할 때 발생할 수 있는 주요 문제는 불합리한 조합입니다. 예를 들어 원거리 공격 전용 방막과 근접 피해 반사가 동시에 부여되면 특정 직업군이 대응하기 매우 까다로워집니다. 따라서 수식어 추첨 알고리즘에는 배타적 태그(Exclusion Tag)와 수식어 수 제한 로직이 포함되어야 합니다.

flowchart TD
    A[몬스터 생성 요청] --> B{등급 확인}
    B -- 일반 --> C[수식어 미부여]
    B -- 엘리트 / 챔피언 --> D[Affix Pool 테이블 참조]
    D --> E[가중치 기반 무작위 추첨]
    E --> F{상극 태그 충돌 검사}
    F -- 충돌 발생 --> E
    F -- 통과 --> G[수식어 확정 및 스탯 재산출]

가중치 기반 수식어 추첨 및 충돌 방지 로직

다음은 C# 기반으로 구성한 수식어 추첨 알고리즘 예제입니다. 각 수식어는 가중치(Weight)와 상극 태그 목록(IncompatibleTags)을 지닙니다. 호출자가 전달하는 Random 인스턴스를 사용하므로 시드를 고정해 테스트할 수 있고, 기존 선택 항목과 후보의 상극 태그를 양방향으로 검사합니다.

using System;
using System.Collections.Generic;
using System.Linq;

[Flags]
public enum AffixTag
{
    None = 0,
    ElementFire = 1 << 0,
    ElementIce = 1 << 1,
    RangedOnly = 1 << 2,
    MeleeOnly = 1 << 3
}

public class MonsterAffix
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Weight { get; set; }
    public AffixTag Tags { get; set; }
    public AffixTag IncompatibleTags { get; set; }
}

public class AffixSelector
{
    public List<MonsterAffix> SelectAffixes(List<MonsterAffix> pool, int count, Random random)
    {
        if (random == null) throw new ArgumentNullException(nameof(random));

        var selected = new List<MonsterAffix>();
        var currentTags = AffixTag.None;

        for (int i = 0; i < count; i++)
        {
            var validPool = pool
                .Where(a => !selected.Contains(a))
                .Where(a => a.Weight > 0)
                .Where(a => (currentTags & a.IncompatibleTags) == 0)
                .Where(a => selected.All(s => (s.IncompatibleTags & a.Tags) == 0))
                .ToList();

            if (validPool.Count == 0) break;

            int totalWeight = validPool.Sum(a => a.Weight);
            int randomValue = random.Next(0, totalWeight);
            int currentSum = 0;

            foreach (var affix in validPool)
            {
                currentSum += affix.Weight;
                if (randomValue < currentSum)
                {
                    selected.Add(affix);
                    currentTags |= affix.Tags;
                    break;
                }
            }
        }

        return selected;
    }
}

난이도 조절과 플레이어 경험(UX) 고려사항

수식어 시스템을 설계할 때는 플레이어가 수식어를 즉각 식별할 수 있는 직관성이 우선되어야 합니다.

  1. 시각적 인디케이터(VFX 및 텍스트): 엘리트 몬스터 상단에 수식어 아이콘과 체력바 색상 변화를 주어 전투 진입 전 대비를 유도해야 합니다.
  2. 수식어 개수 제한: 일반은 0개, 엘리트는 1~2개, 챔피언은 3~4개로 엄격히 한계를 두어 밸런스 붕괴를 막습니다.
  3. 이펙트 가시성 확보: 수식어 이펙트가 몬스터 실루엣을 지나치게 가리지 않도록 이펙트 크기와 발판 오라 형태를 정돈합니다.

전투의 다양성은 무작위성에서 나오지만 재미는 예측 가능성과 플레이어의 대처 가능성 사이의 균형에서 발생합니다. 수식어 수식과 가중치 시스템을 체계화하면 매번 새로운 도전을 선사하는 전투 환경을 구축할 수 있습니다.