206 lines
4.2 KiB
C++
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();
|
|
}
|