어제 말썽이었던 gitignore 문제는 다행히도 팀장님이 해결해주셨다!!! 와!!!!
팀장님 최고~٩( ᐛ )و
그래서 무난하게 작업 시작~~
// 스킬을 사용한 공격
void UsePlayerSkill()
{
while (true)
{
Console.Clear();
// 공격할 몬스터가 없으면 break;
if (monsters.All(x => x.IsDead)) break;
string str = "1. 알파 스트라이크 - MP 10\n 공격력 * 2 로 하나의 적을 공격합니다.\n\n" +
"2. 더블 스트라이크 - MP 15\n 공격력 * 1.5 로 2명의 적을 랜덤으로 공격합니다.\n\n0. 취소";
InfoScreen(false, str);
int input = Extension.GetInput(0, 2);
if (input == 1)
{
if (player.CurrentMP < (int)Player.MPAttackType.ALPHA)
{
Console.WriteLine("MP가 부족합니다!");
Thread.Sleep(1000);
}
else
{
Console.Clear();
InfoScreen(true, "");
int monsterIdx = Extension.GetInput(1, monsters.Count) - 1;
if (monsters[monsterIdx].IsDead)
{
Console.WriteLine($"{monsters[monsterIdx].Name} 은(는) 이미 죽었습니다.");
Thread.Sleep(1000);
}
else AlphaStrikeAttack(monsterIdx);
}
}
else if (input == 2)
{
if (player.CurrentMP < (int)Player.MPAttackType.DOUBLE)
{
Console.WriteLine("MP가 부족합니다!");
Thread.Sleep(1000);
}
else
{
DoubleStrikeAttack();
}
}
else break;
}
}
// 스킬 - 알파 스트라이크
private void AlphaStrikeAttack(int monsterIdx)
{
Console.Clear();
Extension.TypeWriting("Battle!!\n");
Extension.TypeWriting($"{player.Name}의 알파 스트라이크 공격!");
Console.WriteLine();
Monster curMonster = (Monster)monsters[monsterIdx];
int monsterPrevHP = curMonster.CurrentHealth;
curMonster.TakeDamage(player.Attack * 2); // 공격력 * 2 로 하나의 적 공격
player.AttackWithMP(Player.MPAttackType.ALPHA);
// 알파 스트라이크 결과 출력
Console.WriteLine($"Lv.{curMonster.Level} {curMonster.Name}");
Console.WriteLine($"HP {monsterPrevHP} -> {curMonster.CurrentHealth}\n");
Console.WriteLine("0.다음");
int input = Extension.GetInput(0, 0);
}
// 스킬 - 더블 스트라이크
private void DoubleStrikeAttack()
{
Console.Clear();
Extension.TypeWriting("Battle!!\n");
Extension.TypeWriting($"{player.Name}의 더블 스트라이크 공격!");
Console.WriteLine();
// 살아있는 몬스터의 수
int aliveMonster = monsters.Where(m => !m.IsDead).Count();
// 살아있는 몬스터가 2마리 미만이면 1마리만 공격, 2마리 이상이면 2마리 공격
int num = (aliveMonster < 2) ? 1 : 2;
List<int> randomIdx = GetRandomIdx(num, 0, monsters.Count);
// 공격 당하기 전 몬스터 체력을 저장해놓을 배열
List<int> monsterPrevHPList = new List<int>();
foreach (int idx in randomIdx)
{
if (monsters[idx].IsDead) continue;
monsterPrevHPList.Add(monsters[idx].CurrentHealth); // 공격 당하기 전 몬스터 체력 저장
monsters[idx].TakeDamage((int)(player.Attack * 1.5)); // 공격력 * 1.5 로 2명의 적을 랜덤 공격
}
player.AttackWithMP(Player.MPAttackType.DOUBLE);
Console.WriteLine();
// 더블 스트라이크 결과 출력
int prevHPidx = 0;
foreach (int idx in randomIdx)
{
Console.WriteLine($"Lv.{monsters[idx].Level} {monsters[idx].Name}");
Console.WriteLine($"HP {monsterPrevHPList[prevHPidx++]} -> {monsters[idx].CurrentHealth}\n");
}
Console.WriteLine("0.다음");
int input = Extension.GetInput(0, 0);
}
// Player가 스킬을 사용할 때 실행
public void AttackWithMP(MPAttackType type)
{
if (type == MPAttackType.ALPHA) CurrentMP -= (int)MPAttackType.ALPHA;
else CurrentMP -= (int)MPAttackType.DOUBLE;
}
public enum MPAttackType
{
ALPHA = 10,
DOUBLE = 15
}
// 10% 의 확률로 플레이어의 공격을 회피
if (IsOccur(10)) monster.Avoid();
else
{
Console.Write($"Lv.{monster.Level} {monster.Name} 을(를) 맞췄습니다.");
// 15% 의 확률로 치명타 공격
if (IsOccur(15))
{
damage = (int)(damage * 1.6);
Console.WriteLine($" [ 데미지 : {damage} ] - 치명타 공격!!");
}
else Console.WriteLine($" [ 데미지 : {damage} ]");
Console.WriteLine();
monster.TakeDamage(damage);
Console.WriteLine();
Console.WriteLine($"Lv.{monster.Level} {monster.Name}");
Console.WriteLine($"HP {previousHP} -> {monster.CurrentHealth}\n");
}
public void Avoid()
{
Console.WriteLine($"Lv.{Level} {Name} 을(를) 공격했지만 아무 일도 일어나지 않았습니다.");
}
private void GiveRewards()
{
// 보상 아이템
// 소모 가능한 보상 아이템
int consumableItemIdx = GetRandomIdx(1, 0, rewards.Count / 2)[0];
IItem consumableItemReward = rewards[consumableItemIdx];
rewards.Remove(consumableItemReward);
// 착용 가능한 보상 아이템
int equipableItemIdx = GetRandomIdx(1, rewards.Count / 2, rewards.Count)[0];
IItem equipableItemReward = rewards[equipableItemIdx];
rewards.Remove(equipableItemReward);
Console.WriteLine("[ 획득 아이템 ]");
Console.WriteLine($"{consumableItemReward.Name} - 1");
Console.WriteLine($"{equipableItemReward.Name} - 1");
Console.WriteLine();
}
private List<IItem> GetStageRewards(int curStageNum)
{
// 각 스테이지의 보상 아이템들
List<IItem> stageRewards = new List<IItem>();
// 리스트 앞부분 절반에는 소모 가능한 아이템, 뒷부분 절반에는 착용 가능한 아이템을 담음
for (int i = 0; i < 2; i++) stageRewards.Add(ConsumableItemList[i * curStageNum]);
for (int i = 0; i < 2; i++) stageRewards.Add(EquipableItemList[i * curStageNum]);
return stageRewards;
}
오늘은 여기까지!!! 스우파 봐야 되니까 일찍 퇴근 히히
끗~.~