File: game_controller.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (195 lines) | stat: -rw-r--r-- 5,392 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef ULTIMA4_CONTROLLERS_GAME_CONTROLLER_H
#define ULTIMA4_CONTROLLERS_GAME_CONTROLLER_H

#include "ultima/ultima4/controllers/controller.h"
#include "ultima/ultima4/core/coords.h"
#include "ultima/ultima4/core/observer.h"
#include "ultima/ultima4/game/portal.h"
#include "ultima/ultima4/game/player.h"
#include "ultima/ultima4/map/location.h"
#include "ultima/ultima4/views/tileview.h"

namespace Ultima {
namespace Ultima4 {

/**
 * The main game controller that handles basic game flow and keypresses.
 *
 * @todo
 *  <ul>
 *      <li>separate the dungeon specific stuff into another class (subclass?)</li>
 *  </ul>
 */
class GameController : public Controller, public Observer<Party *, PartyEvent &>, public Observer<Location *, MoveEvent &>,
	public TurnCompleter {
private:
	/**
	 * Handles feedback after avatar moved during normal 3rd-person view.
	 */
	void avatarMoved(MoveEvent &event);

	/**
	 * Handles feedback after moving the avatar in the 3-d dungeon view.
	 */
	void avatarMovedInDungeon(MoveEvent &event);

	/**
	 * Removes creatures from the current map if they are too far away from the avatar
	 */
	void creatureCleanup();

	/**
	 * Handles trolls under bridges
	 */
	void checkBridgeTrolls();

	/**
	 * Checks creature conditions and spawns new creatures if necessary
	 */
	void checkRandomCreatures();

	/**
	 * Checks for valid conditions and handles
	 * special creatures guarding the entrance to the
	 * abyss and to the shrine of spirituality
	 */
	void checkSpecialCreatures(Direction dir);

	/**
	 * Checks for and handles when the avatar steps on a moongate
	 */
	bool checkMoongates();

	/**
	 * Creates the balloon near Hythloth, but only if the balloon doesn't already exists somewhere
	 */
	bool createBalloon(Map *map);

	/**
	 * Attempts to attack a creature at map coordinates x,y.  If no
	 * creature is present at that point, zero is returned.
	 */
	bool attackAt(const Coords &coords);
public:
	/**
	 * Show an attack flash at x, y on the current map.
	 * This is used for 'being hit' or 'being missed'
	 * by weapons, cannon fire, spells, etc.
	 */
	static void flashTile(const Coords &coords, MapTile tile, int timeFactor);

	static void flashTile(const Coords &coords, const Common::String &tilename, int timeFactor);
	static void doScreenAnimationsWhilePausing(int timeFactor);
public:
	TileView _mapArea;
	bool _paused;
	int _pausedTimer;
	bool _combatFinished;
public:
	GameController();

	/* controller functions */

	/**
	 * Called when a controller is made active
	 */
	void setActive() override;

	/**
	 * Keybinder actions
	 */
	void keybinder(KeybindingAction action) override;

	/**
	 * Mouse button was pressed
	 */
	bool mousePressed(const Common::Point &mousePos) override;

	/**
	 * This function is called every quarter second.
	 */
	void timerFired() override;

	/* main game functions */
	void init();
	void initScreen();
	void initScreenWithoutReloadingState();
	void setMap(Map *map, bool saveLocation, const Portal *portal, TurnCompleter *turnCompleter = nullptr);

	/**
	 * Exits the current map and location and returns to its parent location
	 * This restores all relevant information from the previous location,
	 * such as the map, map position, etc. (such as exiting a city)
	 **/
	int exitToParentMap();

	/**
	 * Finishes the game turn after combat ends. It suppresses monster
	 * movement to prevent issues, such as infinite combat at the
	 * Shrine of Humility
	 */
	void finishTurnAfterCombatEnds() override {
		_combatFinished = true;
		finishTurn();
	}

	/**
	 * Terminates a game turn.  This performs the post-turn housekeeping
	 * tasks like adjusting the party's food, incrementing the number of
	 * moves, etc.
	 */
	void finishTurn() override;

	/**
	 * Provide feedback to user after a party event happens.
	 */
	void update(Party *party, PartyEvent &event) override;

	/**
	 * Provide feedback to user after a movement event happens.
	 */
	void update(Location *location, MoveEvent &event) override;

	/**
	 * Initializes the moon state according to the savegame file. This method of
	 * initializing the moons (rather than just setting them directly) is necessary
	 * to make sure trammel and felucca stay in sync
	 */
	void initMoons();

	/**
	 * Updates the phases of the moons and shows
	 * the visual moongates on the map, if desired
	 */
	void updateMoons(bool showmoongates);

	void attack(Direction dir = DIR_NONE);
};

extern GameController *g_game;

} // End of namespace Ultima4
} // End of namespace Ultima

#endif