OSDN Git Service

GameEngineのデストラクタ実装。 / Implement destructor of GameEngine.
[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
19 namespace Deeangband
20 {
21         GameEngine::GameEngine()
22         {
23                 gameWorld = new GameWorld();
24                 gameSurface = new GameSurfaceSDL(gameWorld);
25                 gameLogger = new GameLogger();
26
27                 GameElement::GameWorldPtr = gameWorld;
28                 GameElement::GameSurfacePtr = gameSurface;
29                 GameElement::GameLoggerPtr = gameLogger;
30
31                 Dice::Initialize();
32                 gameWorld->Initialize();
33
34                 gameSurface->SetField(gameWorld->GetField(0));
35                 gameSurface->SetSideStatusCreature(gameWorld->GetCreature(0));
36                 this->gameLogger->PutLog("GameEngine\8aJ\8en");
37                 Direction::Initialize();
38         }
39
40         GameEngine::~GameEngine()
41         {
42                 delete(gameLogger);
43                 delete(gameSurface);
44                 delete(gameWorld);
45         }
46
47         PLAY_EXIT_CODE GameEngine::PlayLoop(void)
48         {
49                 GAME_COMMAND commandID;
50                 PLAY_EXIT_CODE code = PLAY_EXIT_NONE;
51                 ACTION_IT actionIt;
52                 gameSurface->Draw(gameWorld->GetPlayerCreature());
53
54                 while(code == PLAY_EXIT_NONE)
55                 {
56                         this->gameSurface->UpdateTimeStatus(this->gameWorld->GetGameTime());
57                         //actionIt = this->toNextProcess();
58                         commandID = gameSurface->GetCommand(gameWorld->GetPlayerCreature());
59                         code = DoGameCommand(commandID);
60                         this->gameSurface->FocusField(gameWorld->GetPlayerCreature()->second->GetPosition());
61
62                         this->gameSurface->UpdateSideCreatureStatus(gameWorld->GetPlayerCreature()->second.get());
63                         ProcessDeadCreatures();
64                         if(!gameWorld->GetPlayerCreature()->second->IsAlive())
65                         {
66                                 code = PLAY_EXIT_DEAD;
67                                 gameSurface->SystemMessage("\82 \82È\82½\82Í\8e\80\82É\82Ü\82µ\82½\81B");
68                         }
69                 }
70
71                 return PLAY_EXIT_QUIT;
72         }
73
74         PLAY_EXIT_CODE GameEngine::DoGameCommand(GAME_COMMAND command)
75         {
76                 CREATURE_IT playerIt = gameWorld->GetPlayerCreature();
77
78                 switch(command)
79                 {
80                 case GAME_COMMAND_VIEW_PLAYER_STATUS:
81                         gameSurface->ViewCreatureStatus(gameWorld->GetPlayerCreature()->second.get());
82                         break;
83                 case GAME_COMMAND_REDRAW:
84                         gameSurface->Draw(playerIt);
85                         break;
86                 case GAME_COMMAND_DEBUG_XML_SAVE:
87                         gameWorld->XMLSave();
88                         gameSurface->SystemMessage("XML\82É\95Û\91\82µ\82Ü\82µ\82½\81B");
89                         break;
90                 case GAME_COMMAND_DEBUG_XML_LOAD:
91                         gameSurface->Draw(playerIt);
92                         gameWorld->XMLLoad();
93                         gameSurface->SystemMessage("XML\82©\82ç\8cÄ\82Ñ\8fo\82µ\82Ü\82µ\82½\81B");
94                         break;
95                 case GAME_COMMAND_EXIT:
96                         return PLAY_EXIT_QUIT;
97                         break;
98                 case GAME_COMMAND_NORTH:
99                         playerIt->second.get()->Walk(DIRECTION_NORTH);
100                         break;
101                 case GAME_COMMAND_NORTH_EAST:
102                         playerIt->second.get()->Walk(DIRECTION_NORTH_EAST);
103                         break;
104                 case GAME_COMMAND_EAST:
105                         playerIt->second.get()->Walk(DIRECTION_EAST);
106                         break;
107                 case GAME_COMMAND_SOUTH_EAST:
108                         playerIt->second.get()->Walk(DIRECTION_SOUTH_EAST);
109                         break;
110                 case GAME_COMMAND_SOUTH:
111                         playerIt->second.get()->Walk(DIRECTION_SOUTH);
112                         break;
113                 case GAME_COMMAND_SOUTH_WEST:
114                         playerIt->second.get()->Walk(DIRECTION_SOUTH_WEST);
115                         break;
116                 case GAME_COMMAND_WEST:
117                         playerIt->second.get()->Walk(DIRECTION_WEST);
118                         break;
119                 case GAME_COMMAND_NORTH_WEST:
120                         playerIt->second.get()->Walk(DIRECTION_NORTH_WEST);
121                         break;
122                 }
123                 return PLAY_EXIT_NONE;
124         }
125
126
127         bool GameEngine::CombatCreatures(Creature *attackerPtr, Creature *targetPtr)
128         {
129                 attackerPtr->Melee(targetPtr);
130                 return true;
131         }
132
133         int GameEngine::ProcessDeadCreatures()
134         {
135                 int deadNum = 0;
136                 CREATURE_IT creatureIt, creatureItCurrent;
137                 CREATURE_LIST *creatureList = gameWorld->GetCreatureList();
138
139                 creatureIt = creatureList->begin();
140
141                 while(creatureIt != creatureList->end())
142                 {
143                         creatureItCurrent = creatureIt;
144                         creatureIt++;
145                         if(!creatureItCurrent->second->IsAlive())
146                         {
147                                 //!< @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
148                                 if(gameWorld->GetPlayerCreature() != creatureItCurrent)
149                                 {
150                                         gameSurface->GameMessage(creatureItCurrent->second->GetName() + "\82Í\8e\80\82ñ\82¾\81B");
151                                         creatureList->erase(creatureItCurrent);
152                                 }
153                                 deadNum++;
154                         }
155                 }
156
157                 return deadNum;
158         }
159
160         ACTION_IT GameEngine::toNextProcess(void)
161         {
162                 return this->gameWorld->GetActionList()->begin()++;
163         }
164
165 }