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
|