/* 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 . * */ #ifndef ULTIMA4_CONTROLLERS_CONTROLLER_H #define ULTIMA4_CONTROLLERS_CONTROLLER_H #include "ultima/ultima4/metaengine.h" namespace Ultima { namespace Ultima4 { /** * A generic controller base class. Controllers are classes that * contain the logic for responding to external events (e.g. keyboard, * mouse, timers). */ class Controller { public: Controller(int timerInterval = 1); virtual ~Controller(); /* methods for interacting with event manager */ virtual bool isCombatController() const { return false; } /** * The event manager will call this method to notify the active * controller that a key has been pressed. The key will be passed on * to the virtual keyPressed method. */ bool notifyKeyPressed(int key); /** * The event manager will call this method to notify that * the left button was clicked */ bool notifyMousePress(const Common::Point &mousePos); int getTimerInterval(); /** * A simple adapter to make a timer callback into a controller method * call. */ static void timerCallback(void *data); /** control methods subclasses may want to override */ /** * Called when a controller is made active */ virtual void setActive(); /** * Key was pressed */ virtual bool keyPressed(int key) { return false; } /** * Mouse button was pressed */ virtual bool mousePressed(const Common::Point &mousePos) { return false; } /** * Handles keybinder actions */ virtual void keybinder(KeybindingAction action) {} /** * The default timerFired handler for a controller. By default, * timers are ignored, but subclasses can override this method and it * will be called every 1/4 seconds. */ virtual void timerFired(); /** * Returns true if game should quit */ bool shouldQuit() const; private: int _timerInterval; }; // helper functions for the waitable controller; they just avoid // having eventhandler dependencies in this header file void Controller_startWait(); void Controller_endWait(); /** * Class template for controllers that can be "waited for". * Subclasses should set the value variable and call doneWaiting when * the controller has completed. */ template class WaitableController : public Controller { private: bool _exitWhenDone; T _defaultValue; protected: T _value; void doneWaiting() { if (_exitWhenDone) Controller_endWait(); } public: WaitableController(T defaultValue) : _defaultValue(defaultValue), _value(defaultValue), _exitWhenDone(false) {} virtual T getValue() { return shouldQuit() ? _defaultValue : _value; } virtual T waitFor() { _exitWhenDone = true; Controller_startWait(); return getValue(); } /** * Mouse button was pressed */ virtual bool mousePressed(const Common::Point &mousePos) { // Treat mouse clicks as an abort doneWaiting(); _value = _defaultValue; return true; } }; class TurnCompleter { public: virtual ~TurnCompleter() { } virtual void finishTurn() = 0; virtual void finishTurnAfterCombatEnds() { finishTurn(); } }; } // End of namespace Ultima4 } // End of namespace Ultima #endif