오늘의 학습 키워드

Action,

공부한 내용

아이템 -> 인벤토리 (장착 로직과 캐릭터 상태 갱신 콜백)

인벤토리의 리스트로 있는 아이템에 접근해서 콜백을 주기에는 아이템마다 세팅 해줘야하고 나중에 있을지도 모르는 캐릭터마다 상태를 갱신시켜주는 상황이 생길 수 있다.

이를 해결하기 위해 인벤토리에서 장착 콜백을 받아놓고 처리하는 방식으로 진행하려고 한다.

public class ItemInfo : IItem
{
    public ItemType Type { get; private set; }
    public string Name { get; private set; }
    public int AttackModifier { get; private set; }
    public int DefenseModifier { get; private set; }
    public string Description { get; private set; }
    public int Price { get; private set; }
    public bool IsEquiped { get; private set; }

    public void SetInfo(ItemType type, string name, int attack, int defense, string description, int price, bool isEquiped)
    {
        Type = type;
        Name = name;
        AttackModifier = attack;
        DefenseModifier = defense;
        Description = description;
        Price = price;
        IsEquiped = isEquiped;
    }

    public void Equip(bool isEquip)
    {
        IsEquiped = isEquip;
    }
}

인벤토리에 옮긴 후

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

namespace TextRPG_Single
{
    class Inventory
    {
        Action<Item> equipCallback;

        public List<Item> Items { get; private set; } = new List<Item>();

        public Inventory()
        {
            Items.Add(new Item(ItemType.Armor, "린넨 셔츠", 0, 1, "부드러운 천으로 만든 셔츠이다.", 100));
            Items.Add(new Item(ItemType.Weapon, "나무 망치", 1, 0, "나무로 만든 망치이다.", 200));
        }

        public void Init(Character character)
        {
            equipCallback = character.ApplyToState;
        }

        public void Equip(Item item)
        {
            item.Info.IsEquiped = true;
            equipCallback?.Invoke(item);
        }

        public void UnEquip(Item item)
        {
            item.Info.IsEquiped = false;
            equipCallback?.Invoke(item);
        }

        public int GetSellingPrice(Item item)
        {
            return (int)(item.Info.Price * 0.85f);
        }

        public void RemoveItem(Item item)
        {
            UnEquip(item);
            Items.Remove(item);
        }

        public Item GetSameTypeItem(Item otherItem)
        {
            foreach (var item in Items)
            {
                if (item != otherItem && item.Info.Type == otherItem.Info.Type && item.Info.IsEquiped)
                {
                    Equip(item);
                    return item;
                }
            }

            return null;
        }
    }
}

 

 

오늘의 회고

 오늘은 리팩토링 하는 마지막 주차이다. 다른 것들은 모두 이해가 갔지만 Json Deserialize 하는 부분에서 프로퍼티 쪽으로 데이터를 넘기는 부분은 좀 더 공부가 필요한 것 같다. 그래도 목표는 거의 다 달성했으니 꽤나 만족하는 하루였다.

다음 주는 다른 사람들과 팀으로 TextRPG를 만들게 되는데 기대가 되고 개인으로 만들던 경험을 기반으로 더 잘 만들 수 있을 것 같다. 다음 주도 파이팅!

+ Recent posts