오늘은 하루종일...팀원분의 코드를 뜯어보았다...
이걸 알아야 일단 내가 코드를 만질 수 있을 것 같아서..
↓↓민수님이 쓰셨던 player.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using TextRPG;
namespace TextRPG
{
internal class Player : IListener
{
private ObjectState state;
private int level = 1;
private int itemATK;
private int itemDEF;
public int ATK { get { return state.ATK; } }
public int DEF { get { return state.DEF; } }
public int Gold
{
get { return state.Gold; }
private set
{
state.Gold = Math.Clamp(value, 0, 999999999);
}
}
public int Health
{
get { return state.Health; }
private set
{
state.Health = Math.Clamp(value, 0, 100);
}
}
public Player()
{
EventManager.Instance.AddListener(EventType.eGameInit, this);
EventManager.Instance.AddListener(EventType.eGameEnd, this);
EventManager.Instance.AddListener(EventType.eHealthChage, this);
EventManager.Instance.AddListener(EventType.eGoldChage, this);
EventManager.Instance.AddListener(EventType.eItemChage, this);
EventManager.Instance.AddListener(EventType.eExpChage, this);
}
public void Init(string name, string _class, int? _gold = null, int? _health = null, int? _exp = null)
{
if (_health > 100)
_health = 100;
state.Name = name;
state.Class = _class;
state.Gold = _gold ?? 1500;
state.Health = _health ?? 100;
state.EXP = _exp ?? 100;
switch (_class)
{
case "전사":
{
state.InitATK = 1;
state.InitDEF = 2;
break;
}
case "마법사":
{
state.InitATK = 3;
state.InitDEF = 0;
break;
}
case "궁수":
{
state.InitATK = 2;
state.InitDEF = 1;
break;
}
case "도적":
{
state.InitATK = 3;
state.InitDEF = 0;
break;
}
}
LevelCheck();
state.ATK = ATK > 1 ? ATK + (int)state.InitATK : (int)state.InitATK;
state.DEF = DEF > 1 ? DEF + (int)state.InitDEF : (int)state.InitDEF;
}
public void LevelCheck()
{
int result = state.Level - level;
if (level != state.Level)
{
state.InitATK += 0.5f * result;
state.InitDEF += 1 * result;
level = state.Level;
}
else
level = state.Level;
}
public void ShowStat()
{
Console.Write($"Lv : {state.Level}");
Console.WriteLine($"\tEXP : {state.EXP % 100}");
Console.WriteLine($"{state.Name} ( {state.Class} )");
Console.WriteLine($"공격력 : {ATK}");
Console.WriteLine($"방어력 : {DEF}");
Console.WriteLine($"체력 : {Health}");
Console.WriteLine($"Gold : {Gold}G");
}
void IListener.OnEvent(EventType type, object data)
{
switch (type)
{
case EventType.eHealthChage:
{
Health += (int)data;
break;
}
case EventType.eGameInit:
{
ObjectState? stateLode = (ObjectState?)Utilities.LoadFile(LoadType.Player);
if (stateLode != null)
Init(stateLode.Value.Name, stateLode.Value.Class, stateLode.Value.Gold, stateLode.Value.Health, stateLode.Value.EXP);
break;
}
case EventType.eGameEnd:
{
ObjectState playerState = new ObjectState
{
Name = state.Name,
Class = state.Class,
Gold = Gold,
Health = Health,
EXP = state.EXP,
};
Utilities.SaveFile(SaveType.Player, playerState);
break;
}
case EventType.eGoldChage:
{
Gold += (int)data;
break;
}
case EventType.eItemChage:
{
List<Item> items = [];
items = (List<Item>)data;
if (items != null)
{
itemATK = 0;
itemDEF = 0;
foreach (Item item in items)
{
itemATK += item.Power;
itemDEF += item.Armor;
}
}
state.ATK = (int)state.InitATK + itemATK;
state.DEF = state.InitDEF + itemDEF;
break;
}
case EventType.eExpChage:
{
LevelCheck();
state.EXP += (int)data;
LevelCheck();
EventManager.Instance.PostEvent(EventType.eItemChage);
break;
}
default:
{
Console.WriteLine("Player OnEvent Type Error!");
break;
}
}
}
}
}
짧은 지식으로 열심히 찾아보면서 이해해보려 했다.
이...화딱지 나는 빨간줄들...
얘네들은 이제 이벤트리스너인데, 우리 팀 특성이 Manager.cs파일을 따로 갖고 있다.
대충 이제... 매니저파일에 식을 둬서 계산하거나 한 후 본 파일에 그 값을 불러오는 식으로, 코드가 복잡해지는 것을 방지한다라고 했었나... 민수님 진짜 똑똑한 것 같다
내가 맡은 부분이 플레이어에 대한 정보를 담으니까 당연히 플레이어 기본 스탯을 기재해놓고
플레이어에 대한 변동사항(전투 후 체력이 줄어들거나, 게임 정보를 저장하거나 등)에 대한 것들 또한 기재한다.
근데 이제 어떤 의도로 쓰신건지는 이해했으나,,,, 내가,,,너무 감자라서,,, 어떻게 돌아가는지를 아직도 파악하지 못함....
이벤트 매니저에서 정해놓은 것들을 토대로 불러온다- 까지는 이해했는데 이제 이걸 어떻게 뜯어고쳐야 오류가 없고 다른 팀원들도 쓸 수 있을까... 내일은 진짜 열심히 해야겠다. 진심으로.
나는 역시
말하는 감자다