1 /***************************************************************************
2  *      Mechanized Assault and Exploration Reloaded Projectfile            *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18  ***************************************************************************/
19 
20 #ifndef ui_graphical_game_control_gameguicontrollerH
21 #define ui_graphical_game_control_gameguicontrollerH
22 
23 #include <memory>
24 #include <string>
25 #include <vector>
26 #include <array>
27 
28 #include "utility/signal/signal.h"
29 #include "utility/signal/signalconnectionmanager.h"
30 #include "utility/position.h"
31 
32 #include "ui/graphical/game/gameguistate.h"
33 
34 #include "game/logic/upgradecalculator.h"
35 
36 class cGameGui;
37 class cClient;
38 class cApplication;
39 class cSoundManager;
40 class cAnimationTimer;
41 
42 class cPlayer;
43 class cUnit;
44 class cVehicle;
45 class cBuilding;
46 class cStaticMap;
47 class cMap;
48 class cGameSettings;
49 class cUnitUpgrade;
50 class cCasualtiesTracker;
51 class cTurnTimeClock;
52 class cTurnClock;
53 class cSavedReport;
54 class cBuildListItem;
55 class cWindowUpgradesFilterState;
56 
57 class cPosition;
58 
59 struct sID;
60 
61 class cGameGuiController
62 {
63 public:
64 	cGameGuiController (cApplication& application, std::shared_ptr<const cStaticMap> staticMap);
65 	~cGameGuiController();
66 
67 	void start();
68 
69 	void addPlayerGameGuiState (const cPlayer& player, cGameGuiState playerGameGuiState);
70 
71 	void setSingleClient (std::shared_ptr<cClient> clients);
72 	void setClients (std::vector<std::shared_ptr<cClient>> clients, int activePlayerNumber);
73 
74 	mutable cSignal<void (int saveNumber, const std::string& name)> triggeredSave;
75 	mutable cSignal<void ()> terminated;
76 private:
77 	cSignalConnectionManager signalConnectionManager;
78 	cSignalConnectionManager guiSignalConnectionManager;
79 	cSignalConnectionManager clientSignalConnectionManager;
80 	cSignalConnectionManager allClientsSignalConnectionManager;
81 	cSignalConnectionManager buildPositionSelectionConnectionManager;
82 
83 	cApplication& application;
84 
85 	std::shared_ptr<cSoundManager> soundManager;
86 	std::shared_ptr<cAnimationTimer> animationTimer;
87 
88 	std::shared_ptr<cGameGui> gameGui;
89 	std::shared_ptr<cClient> activeClient;
90 	std::vector<std::shared_ptr<cClient>> clients;
91 
92 	std::map<int, cGameGuiState> playerGameGuiStates;
93 
94 	std::pair<bool, cPosition> savedReportPosition;
95 	std::shared_ptr<cWindowUpgradesFilterState> upgradesFilterState;
96 	std::array<std::pair<bool, cPosition>, 4> savedPositions;
97 
98 	void initShortcuts();
99 
100 	void connectGuiStaticCommands();
101 
102 	void setActiveClient (std::shared_ptr<cClient> client);
103 
104 	void connectClient (cClient& client);
105 
106 	void showNextPlayerDialog();
107 
108 	void showFilesWindow();
109 	void showPreferencesDialog();
110 	void showReportsWindow();
111 
112 	void showUnitHelpWindow (const cUnit& unit);
113 	void showUnitTransferDialog (const cUnit& sourceUnit, const cUnit& destinationUnit);
114 	void showBuildBuildingsWindow (const cVehicle& vehicle);
115 	void showBuildVehiclesWindow (const cBuilding& building);
116 	void showResourceDistributionDialog (const cUnit& unit);
117 	void showResearchDialog (const cUnit& unit);
118 	void showUpgradesWindow (const cUnit& unit);
119 	void showStorageWindow (const cUnit& unit);
120 	void showSelfDestroyDialog (const cUnit& unit);
121 
122 	void handleChatCommand (const std::string& command);
123 
124 	void handleReport (const cSavedReport& report);
125 
126 	void selectNextUnit();
127 	void selectPreviousUnit();
128 	void markSelectedUnitAsDone();
129 
130 	void centerSelectedUnit();
131 
132 	void savePosition (size_t index);
133 	void jumpToSavedPosition (size_t index);
134 
135 	std::vector<std::shared_ptr<const cPlayer>> getPlayers() const;
136 	std::shared_ptr<const cPlayer> getActivePlayer() const;
137 	std::shared_ptr<const cTurnClock> getTurnClock() const;
138 	std::shared_ptr<const cTurnTimeClock> getTurnTimeClock() const;
139 	std::shared_ptr<const cGameSettings> getGameSettings() const;
140 	std::shared_ptr<const cCasualtiesTracker> getCasualtiesTracker() const;
141 	std::shared_ptr<const cMap> getDynamicMap() const;
142 
143 	mutable cSignal<void (const cUnit&, const cUnit&, int, int)> transferTriggered;
144 	mutable cSignal<void (const cVehicle&, const cPosition&, const sID&, int)> buildBuildingTriggered;
145 	mutable cSignal<void (const cVehicle&, const cPosition&, const sID&, int)> buildBuildingPathTriggered;
146 	mutable cSignal<void (const cBuilding&, const std::vector<cBuildListItem>&, int, bool)> buildVehiclesTriggered;
147 	mutable cSignal<void (const cUnit& unit, size_t index, const cPosition& position)> activateAtTriggered;
148 	mutable cSignal<void (const cUnit&, const cUnit&)> reloadTriggered;
149 	mutable cSignal<void (const cUnit&, const cUnit&)> repairTriggered;
150 	mutable cSignal<void (const cUnit&, size_t index)> upgradeTriggered;
151 	mutable cSignal<void (const cUnit&)> upgradeAllTriggered;
152 	mutable cSignal<void (const cBuilding&, int, int, int)> changeResourceDistributionTriggered;
153 	mutable cSignal<void (const std::array<int, cResearch::kNrResearchAreas>&)> changeResearchSettingsTriggered;
154 	mutable cSignal<void (const std::vector<std::pair<sID, cUnitUpgrade>>&)> takeUnitUpgradesTriggered;
155 	mutable cSignal<void (const cUnit&)> selfDestructionTriggered;
156 	mutable cSignal<void (const cUnit&)> resumeMoveJobTriggered;
157 	mutable cSignal<void ()> resumeAllMoveJobsTriggered;
158 };
159 
160 #endif // ui_graphical_game_control_gameguicontrollerH
161