#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(); } void DungeonScene::Release() { CoreScene::Release(); LocalPlayer = nullptr; Monsters.clear(); }