ProjectTextRPG/TextRPG/Source/Game/Scene/DungeonScene.cpp

206 lines
4.2 KiB
C++

#include "DungeonScene.h"
#include "BossDungeonScene.h"
#include "GameInstance.h"
#include "MainMenuScene.h"
#include "Core/Item/Item.h"
#include "Core/Subsystems/GameInputSystem.h"
#include "Core/Subsystems/SceneManager.h"
#include "Game/Characters/Monster/Monster.h"
#include "Game/Characters/Monster/Goblin/Goblin.h"
#include "Game/Characters/Monster/Orc/Orc.h"
#include "Game/Characters/Monster/Slime/Slime.h"
#include "Game/Characters/Player/Player.h"
#include "Game/Inventory/InventorySystem.h"
DungeonScene::DungeonScene(GameSceneManager* InOwner) :
CoreScene(InOwner),
LocalPlayer(nullptr),
CurrentMonsterIndex(-1),
DungeonState(EDungeonState::Default)
{
bEnableTick = true;
Monster* NewSlime = new Slime();
Monster* NewOrc = new Orc();
Monster* NewGoblin = new Goblin();
Monsters.push_back(NewSlime);
Monsters.push_back(NewOrc);
Monsters.push_back(NewGoblin);
}
EDungeonState DungeonScene::ProcessDungeonMenu()
{
GInput << "=== DungeonRoom === \n";
bool IsDungeonCleared = Monsters.empty();
size_t MaxRange = IsDungeonCleared ? 1 : Monsters.size();
if (!IsDungeonCleared)
{
for (size_t i = 0; i < Monsters.size(); ++i)
GInput << i + 1 << ". " << Monsters[i]->GetName() << "의 방...\n";
}
else
{
GInput << "던전을 클리어 했습니다.\n";
GInput << "1. 보스방 입장 \n";
}
GInput << "0. 메인 메뉴 가기 \n";
GInput << "선택: ";
int Input = 0;
if (!(GInput >> Input))
{
GInput.Reset();
return EDungeonState::DungeonMenu;
}
if (Input == 0)
{
return EDungeonState::DungeonExit;
}
if (Input < 1 || Input > MaxRange)
{
GInput << Game::Common::ErrorInput;
GInput.Reset();
return EDungeonState::DungeonMenu;
}
if (!IsDungeonCleared)
{
CurrentMonsterIndex = Input - 1;
return EDungeonState::BattleRunning;
}
return EDungeonState::EnterBossRoom;
}
void DungeonScene::DestroyCurrentMonster(Monster* TargetMonster)
{
Monsters.erase(Monsters.begin() + CurrentMonsterIndex);
SafeDelete(TargetMonster);
}
bool DungeonScene::ProcessBattle(Monster* SelectedMonster)
{
Player* LocalPlayer = GInst->GetLocalPlayer();
bool Turn = false;
while (!LocalPlayer->IsDead() && !SelectedMonster->IsDead())
{
system("cls");
GInput << Game::Dungeon::BattleStartTitle;
GInput << LocalPlayer->GetName() << "(" << LocalPlayer->GetJob() << ")" << " vs " << SelectedMonster->GetName() << "\n";
system("pause");
if (!Turn)
{
GInput << Game::Dungeon::PlayerTurn;
LocalPlayer->Attack(SelectedMonster);
}
else
{
GInput << Game::Dungeon::TargetTurn;
SelectedMonster->Attack(LocalPlayer);
}
Turn = !Turn;
}
GInput << " (사망)" << "\n";
return true;
}
void DungeonScene::EvalueteBattle(Player* TargetPlayer, Monster* TargetMonster)
{
Player* LocalPlayer = GInst->GetLocalPlayer();
if (TargetPlayer->IsDead())
{
GInput << Game::Dungeon::Loose;
system("pause");
TargetPlayer->Reset();
Exit();
}
if (TargetPlayer->IsDead())
{
GInput << Game::Dungeon::Victory;
GInput << TargetMonster->GetDropItemName() << " 획득!\n";
GInput << Game::Dungeon::DropItemSaveGuide;
system("pause");
Item Item = ItemStatData(TargetMonster->GetDropItemName(), TargetMonster->GetDropItemPrice());
TargetPlayer->GetInventory()->AddItem(std::move(Item));
DestroyCurrentMonster(TargetMonster);
}
}
void DungeonScene::Enter()
{
CurrentMonsterIndex = -1;
DungeonState = EDungeonState::DungeonMenu;
}
void DungeonScene::Update()
{
switch (DungeonState)
{
case EDungeonState::DungeonMenu:
{
DungeonState = ProcessDungeonMenu();
break;
}
case EDungeonState::BattleRunning:
{
if (ProcessBattle(Monsters[CurrentMonsterIndex]))
{
DungeonState = EDungeonState::BattleResult;
}
break;
}
case EDungeonState::BattleResult:
{
ProcessBattle(Monsters[CurrentMonsterIndex]);
break;
}
case EDungeonState::PlayerWin:
{
break;
}
case EDungeonState::PlayerLoose:
{
break;
}
case EDungeonState::DungeonReward:
{
break;
}
case EDungeonState::DungeonExit:
{
break;
}
default: assert(0);
}
}
void DungeonScene::Exit()
{
GInput << "메인 메뉴로 돌아갑니다." << "\n";
system("pause");
Owner->TransitionTo<MainMenuScene>();
}
void DungeonScene::Release()
{
CoreScene::Release();
LocalPlayer = nullptr;
Monsters.clear();
}