OSDN Git Service

サイドステータスウィンドウの更新処理を改善。 / Improve update process of side status window.
[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
15 namespace Deeangband
16 {
17         GameEngine::GameEngine()
18         {
19                 gameWorld = new GameWorld();
20                 gameSurface = new GameSurfaceSDL(gameWorld);
21                 gameLogger = new GameLogger();
22
23                 gameSurface->SetField(gameWorld->GetField(0));
24                 gameSurface->SetSideStatusCreature(gameWorld->GetCreature(0));
25                 this->gameLogger->PutLog("GameEngine\8aJ\8en");
26                 Direction::Initialize();
27         }
28
29         PLAY_EXIT_CODE GameEngine::PlayLoop(void)
30         {
31                 GAME_COMMAND commandID;
32                 PLAY_EXIT_CODE code = PLAY_EXIT_NONE;
33                 gameSurface->Redraw();
34
35                 while(code == PLAY_EXIT_NONE)
36                 {
37                         commandID = gameSurface->GetCommand();
38                         code = DoGameCommand(commandID);
39                 }
40
41                 return PLAY_EXIT_QUIT;
42         }
43
44         PLAY_EXIT_CODE GameEngine::DoGameCommand(GAME_COMMAND command)
45         {
46                 Creature *playerPtr = gameWorld->GetPlayerCreature();
47
48                 switch(command)
49                 {
50                 case GAME_COMMAND_VIEW_PLAYER_STATUS:
51                         gameSurface->ViewCreatureStatus(gameWorld->GetCreature(0));
52                         break;
53                 case GAME_COMMAND_REDRAW:
54                         gameSurface->Redraw();
55                         break;
56                 case GAME_COMMAND_DEBUG_XML_SAVE:
57                         gameWorld->XMLSave();
58                         gameSurface->SystemMessage("XML\82É\95Û\91\82µ\82Ü\82µ\82½\81B");
59                         break;
60                 case GAME_COMMAND_DEBUG_XML_LOAD:
61                         gameSurface->Redraw();
62                         gameWorld->XMLLoad();
63                         gameSurface->SystemMessage("XML\82©\82ç\8cÄ\82Ñ\8fo\82µ\82Ü\82µ\82½\81B");
64                         break;
65                 case GAME_COMMAND_EXIT:
66                         return PLAY_EXIT_QUIT;
67                         break;
68                 case GAME_COMMAND_NORTH:
69                         this->WalkCreature(playerPtr, DIRECTION_NORTH);
70                         break;
71                 case GAME_COMMAND_NORTH_EAST:
72                         this->WalkCreature(playerPtr, DIRECTION_NORTH_EAST);
73                         break;
74                 case GAME_COMMAND_EAST:
75                         this->WalkCreature(playerPtr, DIRECTION_EAST);
76                         break;
77                 case GAME_COMMAND_SOUTH_EAST:
78                         this->WalkCreature(playerPtr, DIRECTION_SOUTH_EAST);
79                         break;
80                 case GAME_COMMAND_SOUTH:
81                         this->WalkCreature(playerPtr, DIRECTION_SOUTH);
82                         break;
83                 case GAME_COMMAND_SOUTH_WEST:
84                         this->WalkCreature(playerPtr, DIRECTION_SOUTH_WEST);
85                         break;
86                 case GAME_COMMAND_WEST:
87                         this->WalkCreature(playerPtr, DIRECTION_WEST);
88                         break;
89                 case GAME_COMMAND_NORTH_WEST:
90                         this->WalkCreature(playerPtr, DIRECTION_NORTH_WEST);
91                         break;
92                 }
93                 return PLAY_EXIT_NONE;
94         }
95
96         bool GameEngine::WalkCreature(Creature *creaturePtr, DIRECTION direction)
97         {
98                 Coordinates nextPoint = creaturePtr->GetPosition() + Direction::DirectionVector[direction];
99                 Floor *floor = gameWorld->GetFloorFromPosition(creaturePtr->GetFieldID(), &nextPoint);
100                 Creature *targetPtr;
101
102                 //! @note \88Ú\93®\90æ\82É\95Ê\82Ì\83N\83\8a\81[\83`\83\83\81[\82ª\91\8dÝ\82·\82é\82È\82ç\82ΠFALSE
103                 targetPtr = gameWorld->GetCreatureFromPosition(creaturePtr->GetFieldID(), &nextPoint);
104                 if(targetPtr)
105                 {
106                         this->gameLogger->CreaturesCombated(creaturePtr->GetName(), targetPtr->GetName());
107                         return this->CombatCreatures(creaturePtr, targetPtr);
108                 }
109
110                 //! @note \88Ú\93®\90æ\82ª\95Ç\92n\8c`\82È\82ç\82ΠFALSE            
111                 if(!floor || floor->IsWall())
112                 {
113                         this->gameSurface->GameMessage("\8ds\82­\8eè\82ð\91j\82Ü\82ê\82Ä\82¢\82é\81B");
114                         return false;
115                 }
116
117                 creaturePtr->Walk(this->gameLogger, direction);
118                 this->gameSurface->FocusField(creaturePtr->GetPosition());
119                 return true;
120         }
121
122         bool GameEngine::CombatCreatures(Creature *attackerPtr, Creature *targetPtr)
123         {
124                 attackerPtr->CalcHP(-Dice::Cast(1, 6));
125                 targetPtr->CalcHP(-Dice::Cast(1, 6));
126                 this->gameSurface->UpdateSideCreatureStatus(gameWorld->GetPlayerCreature());
127                 return true;
128         }
129
130 }