OSDN Git Service

[Modify] boostライブラリに依存した処理をコメントアウトによる一時的措置を含めて完了.
[deeangband/Deeangband-new.git] / Deeangband / GameEngine.cpp
1 /*!
2  * @file GameEngine.cpp
3  * @brief \83Q\81[\83\80\83G\83\93\83W\83\93\82Ì\8eÀ\91\95
4  * @date 2013/12/17
5  * @author Deskull
6  * 2014 Sikabane Works.
7  */
8
9 #pragma once
10
11 #include "stdafx.h"
12 #include "GameEngine.h"
13
14 #include "HaveGameTime.h"
15 #include "Creature.h"
16 #include "GameCampaign.h"
17 #include "GameLogger.h"
18 #include <thread>
19
20 namespace Deeangband
21 {
22         std::mutex mutex;
23
24         GameEngine::GameEngine()
25         {
26                 gameWorld = new GameWorld();
27                 gameSurface = new GameSurfaceSDL(gameWorld);
28                 gameLogger = new GameLogger();
29
30                 GameElement::GameWorldPtr = gameWorld;
31                 GameElement::GameSurfacePtr = gameSurface;
32                 GameElement::GameLoggerPtr = gameLogger;
33
34                 Dice::Initialize();
35                 gameWorld->Initialize();
36
37                 this->gameSurface->SetField(gameWorld->GetField(0));
38                 this->gameSurface->SetSideStatusCreature(gameWorld->GetCreature(0));
39                 this->gameLogger->PutLog("GameEngine\8aJ\8en");
40                 Direction::Initialize();
41         }
42
43         GameEngine::~GameEngine()
44         {
45                 delete(gameLogger);
46                 delete(gameSurface);
47                 delete(gameWorld);
48         }
49
50         void GameEngine::DrawingLoop(void)
51         {
52                 while(true)
53                 {
54                         mutex.lock();
55                         this->gameSurface->UpdateTimeStatus(this->gameWorld->GetGameTime());
56                         this->gameSurface->UpdateSideCreatureStatus(gameWorld->GetPlayerCreature()->second.get());
57                         this->gameSurface->Draw(gameWorld->GetPlayerCreature());
58                         mutex.unlock();
59                         Sleep(2);
60                 }
61         }
62
63         PLAY_EXIT_CODE GameEngine::PlayLoop(void)
64         {
65                 //std::asio::io_service io;
66                 std::thread drawing(&GameEngine::DrawingLoop, this);
67                 drawing.detach();
68
69                 GAME_COMMAND commandID;
70                 PLAY_EXIT_CODE code = PLAY_EXIT_NONE;
71                 ACTION_IT actionIt;
72                 HaveGameTime *currentHaveGameTimeObject;
73                 while(code == PLAY_EXIT_NONE)
74                 {
75                         mutex.lock();
76                         currentHaveGameTimeObject = this->gameWorld->GetNextActionObject();
77                         
78                         code = currentHaveGameTimeObject->TurnProcess();
79
80                         ProcessDeadCreatures();
81                         this->gameSurface->FocusField(gameWorld->GetPlayerCreature()->second->GetPosition());
82                         if(!gameWorld->GetPlayerCreature()->second->IsAlive())
83                         {
84                                 code = PLAY_EXIT_DEAD;
85                                 gameSurface->SystemMessage("\82 \82È\82½\82Í\8e\80\82É\82Ü\82µ\82½\81B");
86                         }
87                         mutex.unlock();
88                         Sleep(2);
89                 }
90                 return PLAY_EXIT_QUIT;
91         }
92
93         bool GameEngine::CombatCreatures(Creature *attackerPtr, Creature *targetPtr)
94         {
95                 attackerPtr->Melee(targetPtr);
96                 return true;
97         }
98
99         int GameEngine::ProcessDeadCreatures()
100         {
101                 int deadNum = 0;
102                 CREATURE_IT creatureIt, creatureItCurrent;
103                 CREATURE_LIST *creatureList = gameWorld->GetCreatureList();
104
105                 creatureIt = creatureList->begin();
106
107                 while(creatureIt != creatureList->end())
108                 {
109                         creatureItCurrent = creatureIt;
110                         creatureIt++;
111                         if(!creatureItCurrent->second->IsAlive())
112                         {
113                                 //!< @note \83v\83\8c\83C\83\84\81[\82Ì\8e\80\96S\82È\82ç\82Î\95Ê\93r\8f\88\97\9d\82·\82é\82Ì\82Å\83X\83L\83b\83v\81A\82³\82à\82È\82­\82Î\83N\83\8a\81[\83`\83\83\81[\82Ì\8fÁ\96Å\81B
114                                 if(gameWorld->GetPlayerCreature() != creatureItCurrent)
115                                 {
116                                         gameSurface->GameMessage(creatureItCurrent->second->GetName() + "\82Í\8e\80\82ñ\82¾\81B");
117                                         creatureList->erase(creatureItCurrent);
118                                 }
119                                 deadNum++;
120                         }
121                 }
122
123                 return deadNum;
124         }
125 }