using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestBattle
{
public class GameLauncher
{
//캐릭터들 전역변수
private Baron baron = null;
private Annivia annivia = null;
private Eggnnivia eggnnivia = null;
//스위치코드
private int switchCode = 0;
//유저인포
private UserInfo userInfo;
//캐릭터 리스트
private List<Character> characters = new List<Character>();
public GameLauncher()
{
//게임 시작 전 준비
this.ReadyToStart();
//게임시작
this.GameStart();
//유저인포 저장(싱크 맞추고 저장)
this.SaveUserInfo();
//런쳐 종료
}
private void ReadyToStart()
{
Console.WriteLine("게임 데이터 준비중입니다. 잠시만 기다려주세요.");
//데이터 로드
DataManager.GetInstance().DataLoad("./data/character_data.Json");
//신구 유저 확인
ExistsUserInfo("./info");
//사전 준비완료
}
private void GameStart()
{
Console.WriteLine("게임이 시작되었습니다.");
#region 캐릭터 생성
if (this.userInfo.NewbieCheck == false)
{
//기존유저
baron = (Baron)this.CreateCharacter<Baron>(this.userInfo.gameInfo.characterInfos[0]);
annivia = (Annivia)this.CreateCharacter<Annivia>(this.userInfo.gameInfo.characterInfos[1]);
eggnnivia = (Eggnnivia)this.CreateCharacter<Eggnnivia>(this.userInfo.gameInfo.characterInfos[2]);
}
else
{
//신규유저
baron = this.CreateCharacter<Baron>(0);
annivia = this.CreateCharacter<Annivia>(1);
eggnnivia = this.CreateCharacter<Eggnnivia>(2);
}
baron.characterInfo.pos = new Vector2(10, 10);
this.characters.Add(baron);
this.characters.Add(annivia);
this.characters.Add(eggnnivia);
#endregion
#region 게임진행
if (annivia.characterInfo.alive == true)
{
switchCode = 0;
}
else
{
switchCode = 1;
}
while (true)
{
if (switchCode == 0)
{
this.AnniviaGameStart();
}
else if (switchCode == 1)
{
this.EggnniviaGameStart();
}
else if (switchCode==-1)
{
break;
}
}
#endregion
//게임종료
}
//유저 정보 불러오기(신규 or 기존)
private void ExistsUserInfo(string path)
{
if (Directory.Exists(path))
{
//기존 유저
Console.WriteLine("기존 유저입니다.");
//캐릭터 인포 불러오기
this.userInfo = this.LoadUserInfo("./info/user_info.json");
this.userInfo.NewbieCheck = false;
}
else
{
//신규 유저
Console.WriteLine("신규 유저입니다.");
//./info폴더 만들기
Directory.CreateDirectory(path);
//캐릭터 인포만들기
this.CreateUserInfo();
this.userInfo.NewbieCheck = true;
}
}
//유저 정보 불러오기 - 1(기존 유저 인포 불러오기)
private UserInfo LoadUserInfo(string path)
{
//./info/user_info.json불러오기
var json = File.ReadAllText(path);
return JsonConvert.DeserializeObject<UserInfo>(json);
}
//유저 정보 불러오기 - 2(신규 유저 인포 생성)
private void CreateUserInfo(UserInfo userInfo = null)
{
if (this.userInfo == null)
{
if (userInfo == null)
{
this.userInfo = new UserInfo();
}
else
{
this.userInfo = userInfo;
}
}
}
//기존유저 캐릭터 인스턴스 생성(불러오기)
private T CreateCharacter<T>(CharacterInfo characterInfo) where T : Character, new()
{
T character = new T();
character.characterInfo = characterInfo;
return character;
}
//신규유저 캐릭터 인스턴스 생성(새로만들기)
private T CreateCharacter<T>(int id) where T : Character, new()
{
var data = DataManager.GetInstance().dicCharacterData[id];
var info = new CharacterInfo();
info.id = data.id;
info.hp = data.hp;
info.pos = new Vector2(0, 0);
info.alive = true;
T character = new T();
character.characterInfo = info;
return character;
}
private void SaveUserInfo()//json
{
//현재의 유저인포(게임인포(캐릭터인포List)))를 유저인포에 저장
var characterInfos = new List<CharacterInfo>();
foreach (var character in this.characters)
{
characterInfos.Add(character.characterInfo);
}
this.userInfo.gameInfo.characterInfos = characterInfos;
//파일 쓰기
var json = JsonConvert.SerializeObject(this.userInfo);
File.WriteAllText("./info/user_info.json", json, Encoding.UTF8);
Console.WriteLine("저장완료");
}
private void AnniviaGameStart()
{
while (true)//애니비아버전
{
Console.WriteLine();
Console.WriteLine("=============================================================================================");
Console.Write("[바론의 위치({0}, {1})]\n1.애니비아(이동)/2.애니비아(공격)/3.바론(공격)/4.정보 보기/0.종료 후 저장(숫자 입력):", baron.characterInfo.pos.x, baron.characterInfo.pos.y);
var input = Console.ReadLine();
if (input == "0")
{
//게임 종료
Console.WriteLine("게임을 종료합니다.");
switchCode = -1;
break;
}
else if (input == "1")
{
Console.Write("(x, y)좌표 입력\nx좌표 : ");
var x = Console.ReadLine();
Console.Write("y좌표 : ");
var y = Console.ReadLine();
float resultX, resultY;
if (float.TryParse(x, out resultX) && float.TryParse(y, out resultY))
{
var movePos = new Vector2(resultX, resultY);
annivia.Move(movePos);
}
else
{
Console.WriteLine("잘못된 입력입니다.");
}
}
else if (input == "2")
{
annivia.Attack(baron);
if (baron.characterInfo.hp <= 0)
{
Console.WriteLine("바론이 죽었습니다.10초후에 부활합니다.");
for (int i = 10; i > 0; i--)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine(i);
}
baron.characterInfo.hp = DataManager.GetInstance().dicCharacterData[0].hp;
Console.WriteLine("{0}:크와아아아아아앙({0}이 부활했습니다.) Hp:{1}/{2}", DataManager.GetInstance().dicCharacterData[0].name, baron.characterInfo.hp, DataManager.GetInstance().dicCharacterData[0].hp);
}
}
else if (input == "3")
{
baron.Attack(annivia);
if (annivia.characterInfo.hp <= 0)
{
Console.WriteLine("애니비아가 죽었습니다.");
annivia.characterInfo.alive = false;
eggnnivia.characterInfo.alive = true;
eggnnivia.characterInfo.pos = annivia.characterInfo.pos;
annivia.characterInfo.hp = DataManager.GetInstance().dicCharacterData[1].hp;
eggnnivia.characterInfo.hp = DataManager.GetInstance().dicCharacterData[2].hp;
Console.WriteLine("에그니비아 : 아 정글차이");
switchCode = 1;
break;
}
}
else if(input == "4")
{
var data = DataManager.GetInstance().dicCharacterData[0];
Console.WriteLine("=============================================================================================");
Console.WriteLine("{0}의 정보", DataManager.GetInstance().dicCharacterData[0].name);
Console.WriteLine("위치 : ({0}, {1}), 체력 : ({2}/{3})\n공격력 : {4}, 사거리 : {5}, 이동속도 : {6}", baron.characterInfo.pos.x, baron.characterInfo.pos.y, baron.characterInfo.hp, data.hp, data.damage, data.range, data.speed);
data = DataManager.GetInstance().dicCharacterData[1];
Console.WriteLine("=============================================================================================");
Console.WriteLine("{0}의 정보", DataManager.GetInstance().dicCharacterData[1].name);
Console.WriteLine("위치 : ({0}, {1}), 체력 : ({2}/{3})\n공격력 : {4}, 사거리 : {5}, 이동속도 : {6}", annivia.characterInfo.pos.x, annivia.characterInfo.pos.y, annivia.characterInfo.hp, data.hp, data.damage, data.range, data.speed);
}
else
{
Console.WriteLine("잘못된 입력입니다.");
}
}
}
private void EggnniviaGameStart()
{
while (true)//에그니비아버전
{
Console.WriteLine();
Console.WriteLine("=============================================================================================");
Console.Write("[바론의 위치({0}, {1})]\n1.애그니비아(이동)/2.애그니비아(공격)/3.바론(공격)/4.애니비아(즉시부활)/5.정보 보기/0.종료 후 저장(숫자 입력):", baron.characterInfo.pos.x, baron.characterInfo.pos.y);
var input = Console.ReadLine();
if (input == "0")
{
//게임 종료
Console.WriteLine("게임을 종료합니다.");
switchCode = -1;
break;
}
else if (input == "1")
{
Console.WriteLine("{0}은(는) 이동할 수 없습니다.", DataManager.GetInstance().dicCharacterData[2].name);
}
else if (input == "2")
{
Console.WriteLine("{0}은(는) 공격할 수 없습니다.", DataManager.GetInstance().dicCharacterData[2].name);
}
else if (input == "3")
{
baron.Attack(eggnnivia);
if (eggnnivia.characterInfo.hp <= 0)
{
Console.WriteLine("에그니비아가 죽었습니다.");
eggnnivia.characterInfo.alive = false;
annivia.characterInfo.alive = true;
annivia.characterInfo.pos = new Vector2(0, 0);
Console.WriteLine("10초후에 본진(0, 0)에서 부활합니다.");
for (int i = 10; i > 0; i--)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine(i);
}
Console.WriteLine("{0} : 자, 날아볼까요?", DataManager.GetInstance().dicCharacterData[1].name);
annivia.characterInfo.hp = DataManager.GetInstance().dicCharacterData[1].hp;
switchCode = 0;
break;
}
}
else if (input == "4")
{
Console.WriteLine("애니비아가 즉시 부활합니다.");
eggnnivia.characterInfo.alive = false;
annivia.characterInfo.alive = true;
Console.WriteLine("{0} : 내 날개를 타고.", DataManager.GetInstance().dicCharacterData[1].name);
annivia.characterInfo.hp = eggnnivia.characterInfo.hp;
switchCode = 0;
break;
}
else if (input == "5")
{
var data = DataManager.GetInstance().dicCharacterData[0];
Console.WriteLine("=============================================================================================");
Console.WriteLine("{0}의 정보", DataManager.GetInstance().dicCharacterData[0].name);
Console.WriteLine("위치 : ({0}, {1}), 체력 : ({2}/{3})\n공격력 : {4}, 사거리 : {5}, 이동속도 : {6}", baron.characterInfo.pos.x, baron.characterInfo.pos.y, baron.characterInfo.hp, data.hp, data.damage, data.range, data.speed);
data = DataManager.GetInstance().dicCharacterData[2];
Console.WriteLine("=============================================================================================");
Console.WriteLine("{0}의 정보", DataManager.GetInstance().dicCharacterData[2].name);
Console.WriteLine("위치 : ({0}, {1}), 체력 : ({2}/{3})\n공격력 : {4}, 사거리 : {5}, 이동속도 : {6}", eggnnivia.characterInfo.pos.x, eggnnivia.characterInfo.pos.y, eggnnivia.characterInfo.hp, data.hp, data.damage, data.range, data.speed);
}
else
{
Console.WriteLine("잘못된 입력입니다.");
}
}
}
}
}