C#

[TIL] 텍스트 RPG_ Item 클래스에 SetBonus 기능 추가하기

unihee1 2025. 2. 12. 21:31

Item 클래스에서는 아이템 리스트를 만들고 다른 곳(상점, 인벤토리)에서 리스트를 출력할 수 있게 만들며 인벤토리에서 장비를 장착하면 플레이어의 능력치가 오르게 하는 기능을 필수로 가지고 있다. 필수적인 기능을 구현한 후 좀 더 게임을 재밌게 할 수 있는 요소가 없을까 고민을 했다. 고민 끝에 아이템 세트 효과 기능을 구현하면 재밌을 것 같아서 구현하기 시작했다.

 

1. SetBonus()  

        public string SetBonus(Player player)
        {
            StringBuilder message = new StringBuilder();
            var equippedItems = player.inventory.Where(i => i.IsEquip).ToList();

            // 기존에 적용된 세트 효과 확인
            int previousBonus = player.CurrentSetBonus;
            player.CurrentSetBonus = 0;

            if (equippedItems.Any(i => i.Name == "지배자의 피갑옷") && equippedItems.Any(i => i.Name == "몰락한 왕의 검"))
                player.CurrentSetBonus = 1;
            if (equippedItems.Any(i => i.Name == "심연의 갑옷") && equippedItems.Any(i => i.Name == "어둠불꽃 횃불"))
                player.CurrentSetBonus = 2;

            // 기존 세트 보너스 해제
            if (previousBonus == 1 && player.CurrentSetBonus != 1)
            {
                player.Attack -= 2;
                player.Defense -= 1;
                message.AppendLine("세트 효과가 사라졌습니다! 공격력 -2, 방어력 -1 감소.");
            }
            if (previousBonus == 2 && player.CurrentSetBonus != 2)
            {
                player.Attack -= 1;
                player.Defense -= 1;
                player.Dexterity -= 1;
                player.Luck -= 1;
                player.Intelligence -= 1;
                message.AppendLine("세트 효과가 사라졌습니다! 모든 능력치 -1 감소.");
            }

            // 새로운 세트 보너스 적용
            switch (player.CurrentSetBonus)
            {
                case 1:
                    player.Attack += 2;
                    player.Defense += 1;
                    message.AppendLine("세트 효과 발동! 공격력 +2, 방어력 +1 증가.");
                    break;
                case 2:
                    player.Attack += 1;
                    player.Defense += 1;
                    player.Dexterity += 1;
                    player.Luck += 1;
                    player.Intelligence += 1;
                    message.AppendLine("세트 효과 발동! 모든 능력치 +1 증가.");
                    break;
            }

            return message.ToString();
        }

 

특정 아이템 조합을 장착했을 때 추가 능력치를 부여하는 기능이다.

 

var equippedItems = player.inventory.Where(i => i.IsEquip).ToList();

플레이어의 인벤토리에서 IsEquip == true인 아이템만 가져와서 확인한다.

 

int previousBonus = player.CurrentSetBonus;
player.CurrentSetBonus = 0;

 

  • previousBonus → 플레이어가 기존에 적용받고 있던 세트 보너스 값을 저장한다.
  • player.CurrentSetBonus = 0; → 세트 보너스를 다시 계산하기 위해 초기화한다.
if (equippedItems.Any(i => i.Name == "지배자의 피갑옷") && equippedItems.Any(i => i.Name == "몰락한 왕의 검"))
    player.CurrentSetBonus = 1;
if (equippedItems.Any(i => i.Name == "심연의 갑옷") && equippedItems.Any(i => i.Name == "어둠불꽃 횃불"))
    player.CurrentSetBonus = 2;

장착된 아이템 목록을 equippedItems.Any(i => i.Name == "아이템이름")으로 검사하여 특정 조합이 있으면 세트 보너스를 부여한다.

if (previousBonus == 1 && player.CurrentSetBonus != 1)
{
    player.Attack -= 2;
    player.Defense -= 1;
    message.AppendLine("세트 효과가 사라졌습니다! 공격력 -2, 방어력 -1 감소.");
}

기존 보너스(previousBonus == 1)가 있었지만 새로운 CurrentSetBonus가 1이 아니라면 세트 효과를 해제한다.

switch (player.CurrentSetBonus)
{
    case 1:
        player.Attack += 2;
        player.Defense += 1;
        message.AppendLine("세트 효과 발동! 공격력 +2, 방어력 +1 증가.");
        break;
    case 2:
        player.Attack += 1;
        player.Defense += 1;
        player.Dexterity += 1;
        player.Luck += 1;
        player.Intelligence += 1;
        message.AppendLine("세트 효과 발동! 모든 능력치 +1 증가.");
        break;
}

CurrentSetBonus 값에 따라 능력치를 증가한다. (값이 1이면 공격력 +2, 방어력 +1 증가 / 2면 모든 능력치 +1 증가 )