반갑다
오늘 드디어 어느정도 player파트의 코드 이해를 해냈다!!!
그래서 내가 할 수 있는 일을 했다.
내가 맡은 파트, player.cs를 요약하자면
1. 플레이어에 대한 모든 정보를 담는다 (레벨, 경험치, 체력, 마나, 공격력, 방어력 등)
struct PlayerData
{
public ObjectState os;
public int maxHealth;
public int maxMP;
public int maxExp;
public int dungeonStage;
}
private ObjectState myState;
private int maxHealth;
private int maxMP;
private int PrevHealth { get; set; } // 이전 hp값
private int PrevMp { get; set; }
private int PrevExp = 0;
public int dungeonStage = 0; // 플레이어가 입장 가능한 던전 스테이지
private int maxEXP= 100; // 레벨 1일때 렙업에 필요한 경험치량, 초기 설정
예를 들어 설명하면
던전에서 몬스터를 잡아 경험치와 골드를 얻었다면
내 상태창에서 증가한 경험치와 골드량을 바로 반영
public void PlayerStats()
{
Console.WriteLine("\n[내 정보]\n");
Console.Write("Lv.");
Utilities.TextColorWithNoNewLine($"{myState.Level} ", ConsoleColor.DarkRed);
Console.Write("EXP :");
Utilities.TextColor($"{myState.EXP} / {maxEXP}", ConsoleColor.Yellow);
Console.WriteLine($"{myState.Name} ({myState.Class})");
Console.WriteLine($"HP : {myState.Health} / {maxHealth}");
Console.WriteLine($"MP : {myState.MP} / {maxMP}");
Console.WriteLine($"공격력 : {myState.ATK}");
Console.WriteLine($"방어력 : {myState.DEF}");
}
public void ShowStats()
{
Console.Write("Lv.");
Utilities.TextColorWithNoNewLine($"{myState.Level} ", ConsoleColor.DarkRed);
Console.WriteLine($"{myState.Name} ({myState.Class})");
Console.Write("HP ");
Utilities.TextColorWithNoNewLine($"{myState.Health}", ConsoleColor.DarkRed);
Utilities.TextColorWithNoNewLine("/", ConsoleColor.DarkYellow);
Utilities.TextColorWithNoNewLine($"{maxHealth}\n", ConsoleColor.DarkRed);
Console.Write("MP ");
Utilities.TextColorWithNoNewLine($"{myState.MP}", ConsoleColor.Blue);
Utilities.TextColorWithNoNewLine("/", ConsoleColor.DarkYellow);
Utilities.TextColorWithNoNewLine($"{maxMP}\n", ConsoleColor.Blue);
}
이 함수를
여기서 쓴다.
팀원들이 중간중간 코드를 추가해서 힌트를 주지 않았다면... 절대 완성되지 못했을 것이다..
오늘 한 일
switch (Name.Value) // 직업: 전사, 마법사, 궁수, 도적
{
case "전사":
{
myState.Health += 400; // 전사 : 체력 +400, 마나 그대로, 공격력+200, 방어력+100
myState.MP = 100;
myState.ATK += 200;
myState.DEF += 100;
maxHealth = myState.Health;
maxMP = myState.MP;
break;
}
case "마법사":
{
myState.Health += 100; // 마법사 : 체력 +200, 마나+500, 공격력+150, 방어력+50
myState.MP += 400;
myState.ATK += 150;
myState.DEF += 50;
maxHealth = myState.Health;
maxMP = myState.MP;
break;
}
case "궁수":
{
myState.Health += 150; // 궁수 : 체력 +150, 마나+100, 공격력+300, 방어력+80
myState.MP += 200;
myState.ATK += 300;
myState.DEF += 80;
maxHealth = myState.Health;
maxMP = myState.MP;
break;
}
case "도적":
{
myState.Health += 250; // 도적 : 체력 + 350, 마나 + 200, 공격력 + 350, 방어력 + 60
myState.MP += 200;
myState.ATK += 350;
myState.DEF += 60;
maxHealth = myState.Health;
maxMP = myState.MP;
break;
}
}
이는 createPlayer에서도 최초로 초기 스탯을 보여준다.
private int maxEXP= 100; // 레벨 1일때 렙업에 필요한 경험치량
초기 경험치값을 설정해준다. 플레이어가 원래 가지고 있는 경험치가 아닌, 현재 플레이어의 레벨에서 다음 레벨업까지 필요한 경험치를 의미한다.
if (myState.EXP / maxEXP != 0)
{
LevelUp = myState.EXP / maxEXP; // maxEXP로 나눴을때 몫(=LevelUp)이 있다 (0이 아니면)
myState.Level += LevelUp; // 레벨에 레벨업을 더해줌(몫이 있으니까), 그럼 레벨 증가
myState.EXP = myState.EXP % maxEXP; // 렙업하고 나머지 경험치는 maxExp로 나눠서 나머지를 저장
maxEXP = maxEXP*2;// maxEXP 증가
Console.WriteLine("레벨 업!!\n");
EventManager.Instance.PostEvent(EventType.Quest, Utilities.EventPair(eQuestType.PlayerLevel, LevelUp.ToString()));
}
그리고 던전이나 퀘스트에서 획득한 경험치를 저장할 때, 플레이어가 가지고 있는 경험치와 maxEXP를 나눈다.
이때 나눠서 몫이 생긴다면, 그만큼 LevelUp 변수에 넣고
현재 가지고 있는 경험치와 maxEXP를 나눈 나머지 값은 현재 경험치값으로 넣는다.
레벨업을 한다고 모든 경험치가 다 사라지면 안되니까!
그 후에, maxEXP값을 2배로 늘려준다.
그럼 1레벨에 필요한 경험치량은 100, 2레벨은 200, 3레벨은 400... 이렇게 증가한다!
.
.
.
.
.
...근데 사실 버그가 있다.
현재 우리 게임에서 몬스터를 잡았을 때 나오는 경험치량은 5~25 사이인데, 만약에 이 경험치량을 100~200씩 올려버리면 한번에 레벨이 1보다 더 많이 증가한다.
그럼 레벨이 1>5로 변경됐으니 maxEXP가 1000이 되어야 하는데, 아예 같은 처리로 묶어서 해버린 탓인지 maxEXP가 200이 된다.
...
경험치 5배 이벤트 할 것도 아닌데 괜찮지 않을까? 하하
고쳐야지.... 고쳐야지..... 이게 바로 개발자의 삶......
당장 오늘이 제출 마감인데....사실 경험치량만 바뀌지 않는다면 아무 일도 없는 일이지만....
그래도 너무 찝찝하고 아쉬운 것 같다....휴....
내일까지 고칠 수 있을까..?