1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-1997 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PEGASUS_INPUT_H 27 #define PEGASUS_INPUT_H 28 29 #include "common/events.h" 30 #include "common/rect.h" 31 #include "common/singleton.h" 32 33 #include "pegasus/constants.h" 34 #include "pegasus/types.h" 35 36 namespace Pegasus { 37 38 class Hotspot; 39 class Input; 40 41 enum PegasusAction { 42 kPegasusActionNone, 43 kPegasusActionUp, 44 kPegasusActionDown, 45 kPegasusActionLeft, 46 kPegasusActionRight, 47 kPegasusActionInteract, 48 kPegasusActionShowInventory, 49 kPegasusActionShowBiochip, 50 kPegasusActionToggleCenterDisplay, 51 kPegasusActionShowInfoScreen, 52 kPegasusActionShowPauseMenu, 53 kPegasusActionSaveGameState, 54 kPegasusActionLoadGameState, 55 kPegasusActionEnableEasterEgg, 56 kPegasusActionToggleChattyAI, 57 58 kPegasusActionCount 59 }; 60 61 class InputDeviceManager : public Common::Singleton<InputDeviceManager>, public Common::EventObserver { 62 public: 63 InputDeviceManager(); 64 ~InputDeviceManager() override; 65 66 bool notifyEvent(const Common::Event &event) override; 67 68 void getInput(Input &, const InputBits); 69 70 void waitInput(const InputBits); 71 72 void pumpEvents(); 73 74 protected: 75 friend class Common::Singleton<SingletonBaseType>; 76 77 // Keep track of which keys are down (= true) or not 78 bool _keysDown[kPegasusActionCount]; 79 InputBits _lastRawBits; 80 bool _AKeyWasDown; 81 }; 82 83 enum { 84 kButtonDownBit = 0, 85 kAutoButtonBit = 1, 86 kBitsPerButton = 2, 87 88 kButtonDownMask = 1 << kButtonDownBit, 89 kAutoButtonMask = 1 << kAutoButtonBit, 90 91 kButtonStateBits = kButtonDownMask | kAutoButtonMask, 92 93 kRawButtonUp = 0, 94 kRawButtonDown = kButtonDownMask | kAutoButtonMask, 95 96 kButtonUp = 0, 97 kButtonDown = kButtonDownMask, 98 kButtonAutoUp = kAutoButtonMask, 99 kButtonAutoDown = kButtonDownMask | kAutoButtonMask 100 }; 101 102 enum { 103 kUpButtonNum = 0, 104 kLeftButtonNum = 1, 105 kDownButtonNum = 2, 106 kRightButtonNum = 3, 107 kLeftFireButtonNum = 4, 108 kRightFireButtonNum = 5, 109 kOneButtonNum = 6, 110 kTwoButtonNum = 7, 111 kThreeButtonNum = 8, 112 kFourButtonNum = 9, 113 kMod1ButtonNum = 10, 114 kMod2ButtonNum = 11, 115 kMod3ButtonNum = 12 116 }; 117 118 enum { 119 kUpButtonShift = kUpButtonNum * kBitsPerButton, 120 kLeftButtonShift = kLeftButtonNum * kBitsPerButton, 121 kDownButtonShift = kDownButtonNum * kBitsPerButton, 122 kRightButtonShift = kRightButtonNum * kBitsPerButton, 123 kLeftFireButtonShift = kLeftFireButtonNum * kBitsPerButton, 124 kRightFireButtonShift = kRightFireButtonNum * kBitsPerButton, 125 kOneButtonShift = kOneButtonNum * kBitsPerButton, 126 kTwoButtonShift = kTwoButtonNum * kBitsPerButton, 127 kThreeButtonShift = kThreeButtonNum * kBitsPerButton, 128 kFourButtonShift = kFourButtonNum * kBitsPerButton, 129 kMod1ButtonShift = kMod1ButtonNum * kBitsPerButton, 130 kMod2ButtonShift = kMod2ButtonNum * kBitsPerButton, 131 kMod3ButtonShift = kMod3ButtonNum * kBitsPerButton 132 }; 133 134 enum { 135 kAllUpBits = (kButtonUp << kUpButtonShift) | 136 (kButtonUp << kLeftButtonShift) | 137 (kButtonUp << kDownButtonShift) | 138 (kButtonUp << kRightButtonShift) | 139 (kButtonUp << kLeftFireButtonShift) | 140 (kButtonUp << kRightFireButtonShift) | 141 (kButtonUp << kOneButtonShift) | 142 (kButtonUp << kTwoButtonShift) | 143 (kButtonUp << kThreeButtonShift) | 144 (kButtonUp << kFourButtonShift) | 145 (kButtonUp << kMod1ButtonShift) | 146 (kButtonUp << kMod2ButtonShift) | 147 (kButtonUp << kMod3ButtonShift), 148 kDirectionBits = (kButtonDownMask << kUpButtonShift) | 149 (kButtonDownMask << kLeftButtonShift) | 150 (kButtonDownMask << kDownButtonShift) | 151 (kButtonDownMask << kRightButtonShift), 152 kButtonBits = (kButtonDownMask << kLeftFireButtonShift) | 153 (kButtonDownMask << kRightFireButtonShift) | 154 (kButtonDownMask << kOneButtonShift) | 155 (kButtonDownMask << kTwoButtonShift) | 156 (kButtonDownMask << kThreeButtonShift) | 157 (kButtonDownMask << kFourButtonShift) | 158 (kButtonDownMask << kMod1ButtonShift) | 159 (kButtonDownMask << kMod2ButtonShift) | 160 (kButtonDownMask << kMod3ButtonShift), 161 kAllButtonDownBits = kDirectionBits | kButtonBits, 162 kAllAutoBits = (kAutoButtonMask << kUpButtonShift) | 163 (kAutoButtonMask << kLeftButtonShift) | 164 (kAutoButtonMask << kDownButtonShift) | 165 (kAutoButtonMask << kRightButtonShift) | 166 (kAutoButtonMask << kLeftFireButtonShift) | 167 (kAutoButtonMask << kRightFireButtonShift) | 168 (kAutoButtonMask << kOneButtonShift) | 169 (kAutoButtonMask << kTwoButtonShift) | 170 (kAutoButtonMask << kThreeButtonShift) | 171 (kAutoButtonMask << kFourButtonShift) | 172 (kAutoButtonMask << kMod1ButtonShift) | 173 (kAutoButtonMask << kMod2ButtonShift) | 174 (kAutoButtonMask << kMod3ButtonShift), 175 176 kFilterUpButton = kButtonDownMask << kUpButtonShift, 177 kFilterUpAuto = kAutoButtonMask << kUpButtonShift, 178 kFilterUpButtonAny = kFilterUpButton | kFilterUpAuto, 179 kFilterLeftButton = kButtonDownMask << kLeftButtonShift, 180 kFilterLeftAuto = kAutoButtonMask << kLeftButtonShift, 181 kFilterLeftButtonAny = kFilterLeftButton | kFilterLeftAuto, 182 kFilterDownButton = kButtonDownMask << kDownButtonShift, 183 kFilterDownAuto = kAutoButtonMask << kDownButtonShift, 184 kFilterDownButtonAny = kFilterDownButton | kFilterDownAuto, 185 kFilterRightButton = kButtonDownMask << kRightButtonShift, 186 kFilterRightAuto = kAutoButtonMask << kRightButtonShift, 187 kFilterRightButtonAny = kFilterRightButton | kFilterRightAuto, 188 kFilterLeftFireButton = kButtonDownMask << kLeftFireButtonShift, 189 kFilterLeftFireAuto = kAutoButtonMask << kLeftFireButtonShift, 190 kFilterLeftFireButtonAny = kFilterLeftFireButton | kFilterLeftFireAuto, 191 kFilterRightFireButton = kButtonDownMask << kRightFireButtonShift, 192 kFilterRightFireAuto = kAutoButtonMask << kRightFireButtonShift, 193 kFilterRightFireButtonAny = kFilterRightFireButton | kFilterRightFireAuto, 194 kFilterOneButton = kButtonDownMask << kOneButtonShift, 195 kFilterOneAuto = kAutoButtonMask << kOneButtonShift, 196 kFilterOneButtonAny = kFilterOneButton | kFilterOneAuto, 197 kFilterTwoButton = kButtonDownMask << kTwoButtonShift, 198 kFilterTwoAuto = kAutoButtonMask << kTwoButtonShift, 199 kFilterTwoButtonAny = kFilterTwoButton | kFilterTwoAuto, 200 kFilterThreeButton = kButtonDownMask << kThreeButtonShift, 201 kFilterThreeAuto = kAutoButtonMask << kThreeButtonShift, 202 kFilterThreeButtonAny = kFilterThreeButton | kFilterThreeAuto, 203 kFilterFourButton = kButtonDownMask << kFourButtonShift, 204 kFilterFourAuto = kAutoButtonMask << kFourButtonShift, 205 kFilterFourButtonAny = kFilterFourButton | kFilterFourAuto, 206 kFilterMod1Button = kButtonDownMask << kMod1ButtonShift, 207 kFilterMod1Auto = kAutoButtonMask << kMod1ButtonShift, 208 kFilterMod1ButtonAny = kFilterMod1Button | kFilterMod1Auto, 209 kFilterMod2Button = kButtonDownMask << kMod2ButtonShift, 210 kFilterMod2Auto = kAutoButtonMask << kMod2ButtonShift, 211 kFilterMod2ButtonAny = kFilterMod2Button | kFilterMod2Auto, 212 kFilterMod3Button = kButtonDownMask << kMod3ButtonShift, 213 kFilterMod3Auto = kAutoButtonMask << kMod3ButtonShift, 214 kFilterMod3ButtonAny = kFilterMod3Button | kFilterMod3Auto, 215 216 kFilterNoInput = 0, 217 kFilterAllInput = kFilterUpButton | 218 kFilterUpAuto | 219 kFilterLeftButton | 220 kFilterLeftAuto | 221 kFilterDownButton | 222 kFilterDownAuto | 223 kFilterRightButton | 224 kFilterRightAuto | 225 kFilterLeftFireButton | 226 kFilterLeftFireAuto | 227 kFilterRightFireButton | 228 kFilterRightFireAuto | 229 kFilterOneButton | 230 kFilterOneAuto | 231 kFilterTwoButton | 232 kFilterTwoAuto | 233 kFilterThreeButton | 234 kFilterThreeAuto | 235 kFilterFourButton | 236 kFilterFourAuto | 237 kFilterMod1Button | 238 kFilterMod1Auto | 239 kFilterMod2Button | 240 kFilterMod2Auto | 241 kFilterMod3Button | 242 kFilterMod3Auto, 243 244 kFilterAllDirections = kFilterUpButton | 245 kFilterUpAuto | 246 kFilterLeftButton | 247 kFilterLeftAuto | 248 kFilterDownButton | 249 kFilterDownAuto | 250 kFilterRightButton | 251 kFilterRightAuto, 252 253 kFilterButtons = kFilterOneButton | 254 kFilterOneAuto | 255 kFilterTwoButton | 256 kFilterTwoAuto | 257 kFilterThreeButton | 258 kFilterThreeAuto | 259 kFilterFourButton | 260 kFilterFourAuto, 261 262 kFilterFireButtons = kFilterLeftFireButton | 263 kFilterLeftFireAuto | 264 kFilterRightFireButton | 265 kFilterRightFireAuto, 266 267 kFilterAllButtons = kFilterLeftFireButton | 268 kFilterLeftFireAuto | 269 kFilterRightFireButton | 270 kFilterRightFireAuto | 271 kFilterOneButton | 272 kFilterOneAuto | 273 kFilterTwoButton | 274 kFilterTwoAuto | 275 kFilterThreeButton | 276 kFilterThreeAuto | 277 kFilterFourButton | 278 kFilterFourAuto | 279 kFilterMod1Button | 280 kFilterMod1Auto | 281 kFilterMod2Button | 282 kFilterMod2Auto | 283 kFilterMod3Button | 284 kFilterMod3Auto, 285 286 kFilterAllInputNoAuto = kFilterUpButton | 287 kFilterLeftButton | 288 kFilterDownButton | 289 kFilterRightButton | 290 kFilterLeftFireButton | 291 kFilterRightFireButton | 292 kFilterOneButton | 293 kFilterTwoButton | 294 kFilterThreeButton | 295 kFilterFourButton | 296 kFilterMod1Button | 297 kFilterMod2Button | 298 kFilterMod3Button 299 }; 300 301 static const InputBits kHintInterruption = kFilterAllInputNoAuto; 302 static const InputBits kWarningInterruption = kFilterAllInputNoAuto; 303 static const InputBits kOpticalInterruption = kFilterAllInputNoAuto; 304 305 /* 306 307 Buttons are defined as: 308 up, left, down, right direction buttons. 309 fireLeft, fireRight: fire buttons. 310 mod1, mod2, mod3: modifier buttons, similar to shift, control, etc. 311 a, b, c, d: general purpose buttons. 312 313 button state is held as bits in a long word, two bits per button. 314 315 Filter bits: 316 for each button, two bits are assigned for filtering. If bit 0 is set, the 317 corresponding button is available for "button down" input. If bit 1 is set, 318 the corresponding button is available for "auto down" input. Note that bit 319 1 is meaningful only if bit 0 is set. 320 321 */ 322 323 class Input { 324 friend int operator==(const Input &, const Input &); 325 friend int operator!=(const Input &, const Input &); 326 friend class InputDeviceManager; 327 328 public: Input()329 Input() { clearInput(); } 330 upButtonDown()331 bool upButtonDown() const { return (_inputState & (kButtonStateBits << kUpButtonShift)) == (kButtonDown << kUpButtonShift); } upButtonAutoDown()332 bool upButtonAutoDown() const { return (_inputState & (kButtonStateBits << kUpButtonShift)) == (kButtonAutoDown << kUpButtonShift); } upButtonAnyDown()333 bool upButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kUpButtonShift)) != 0; } 334 leftButtonDown()335 bool leftButtonDown() const { return (_inputState & (kButtonStateBits << kLeftButtonShift)) == (kButtonDown << kLeftButtonShift); } leftButtonAutoDown()336 bool leftButtonAutoDown() const { return (_inputState & (kButtonStateBits << kLeftButtonShift)) == (kButtonAutoDown << kLeftButtonShift); } leftButtonAnyDown()337 bool leftButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kLeftButtonShift)) != 0; } 338 downButtonDown()339 bool downButtonDown() const { return (_inputState & (kButtonStateBits << kDownButtonShift)) == (kButtonDown << kDownButtonShift); } downButtonAutoDown()340 bool downButtonAutoDown() const { return (_inputState & (kButtonStateBits << kDownButtonShift)) == (kButtonAutoDown << kDownButtonShift); } downButtonAnyDown()341 bool downButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kDownButtonShift)) != 0; } 342 rightButtonDown()343 bool rightButtonDown() const { return (_inputState & (kButtonStateBits << kRightButtonShift)) == (kButtonDown << kRightButtonShift); } rightButtonAutoDown()344 bool rightButtonAutoDown() const { return (_inputState & (kButtonStateBits << kRightButtonShift)) == (kButtonAutoDown << kRightButtonShift); } rightButtonAnyDown()345 bool rightButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kRightButtonShift)) != 0; } 346 leftFireButtonDown()347 bool leftFireButtonDown() const { return (_inputState & (kButtonStateBits << kLeftFireButtonShift)) == (kButtonDown << kLeftFireButtonShift); } leftFireButtonAutoDown()348 bool leftFireButtonAutoDown() const { return (_inputState & (kButtonStateBits << kLeftFireButtonShift)) == (kButtonAutoDown << kLeftFireButtonShift); } leftFireButtonAnyDown()349 bool leftFireButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kLeftFireButtonShift)) != 0; } 350 rightFireButtonDown()351 bool rightFireButtonDown() const { return (_inputState & (kButtonStateBits << kRightFireButtonShift)) == (kButtonDown << kRightFireButtonShift); } rightFireButtonAutoDown()352 bool rightFireButtonAutoDown() const { return (_inputState & (kButtonStateBits << kRightFireButtonShift)) == (kButtonAutoDown << kRightFireButtonShift); } rightFireButtonAnyDown()353 bool rightFireButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kRightFireButtonShift)) != 0; } 354 oneButtonDown()355 bool oneButtonDown() const { return (_inputState & (kButtonStateBits << kOneButtonShift)) == (kButtonDown << kOneButtonShift); } oneButtonAutoDown()356 bool oneButtonAutoDown() const { return (_inputState & (kButtonStateBits << kOneButtonShift)) == (kButtonAutoDown << kOneButtonShift); } oneButtonAnyDown()357 bool oneButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kOneButtonShift)) != 0; } 358 twoButtonDown()359 bool twoButtonDown() const { return (_inputState & (kButtonStateBits << kTwoButtonShift)) == (kButtonDown << kTwoButtonShift); } twoButtonAutoDown()360 bool twoButtonAutoDown() const { return (_inputState & (kButtonStateBits << kTwoButtonShift)) == (kButtonAutoDown << kTwoButtonShift); } twoButtonAnyDown()361 bool twoButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kTwoButtonShift)) != 0; } 362 threeButtonDown()363 bool threeButtonDown() const { return (_inputState & (kButtonStateBits << kThreeButtonShift)) == (kButtonDown << kThreeButtonShift); } threeButtonAutoDown()364 bool threeButtonAutoDown() const { return (_inputState & (kButtonStateBits << kThreeButtonShift)) == (kButtonAutoDown << kThreeButtonShift); } threeButtonAnyDown()365 bool threeButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kThreeButtonShift)) != 0; } 366 fourButtonDown()367 bool fourButtonDown() const { return (_inputState & (kButtonStateBits << kFourButtonShift)) == (kButtonDown << kFourButtonShift); } fourButtonAutoDown()368 bool fourButtonAutoDown() const { return (_inputState & (kButtonStateBits << kFourButtonShift)) == (kButtonAutoDown << kFourButtonShift); } fourButtonAnyDown()369 bool fourButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kFourButtonShift)) != 0; } 370 mod1ButtonDown()371 bool mod1ButtonDown() const { return (_inputState & (kButtonStateBits << kMod1ButtonShift)) == (kButtonDown << kMod1ButtonShift); } mod1ButtonAutoDown()372 bool mod1ButtonAutoDown() const { return (_inputState & (kButtonStateBits << kMod1ButtonShift)) == (kButtonAutoDown << kMod1ButtonShift); } mod1ButtonAnyDown()373 bool mod1ButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kMod1ButtonShift)) != 0; } 374 mod2ButtonDown()375 bool mod2ButtonDown() const { return (_inputState & (kButtonStateBits << kMod2ButtonShift)) == (kButtonDown << kMod2ButtonShift); } mod2ButtonAutoDown()376 bool mod2ButtonAutoDown() const { return (_inputState & (kButtonStateBits << kMod2ButtonShift)) == (kButtonAutoDown << kMod2ButtonShift); } mod2ButtonAnyDown()377 bool mod2ButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kMod2ButtonShift)) != 0; } 378 mod3ButtonDown()379 bool mod3ButtonDown() const { return (_inputState & (kButtonStateBits << kMod3ButtonShift)) == (kButtonDown << kMod3ButtonShift); } mod3ButtonAutoDown()380 bool mod3ButtonAutoDown() const { return (_inputState & (kButtonStateBits << kMod3ButtonShift)) == (kButtonAutoDown << kMod3ButtonShift); } mod3ButtonAnyDown()381 bool mod3ButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kMod3ButtonShift)) != 0; } 382 allAutoInput()383 bool allAutoInput() const { return (_inputState & kAllAutoBits) != 0; } anyDirectionInput()384 bool anyDirectionInput() const { return (_inputState & kDirectionBits) != 0; } anyButtonInput()385 bool anyButtonInput() const { return (_inputState & kButtonBits) != 0; } anyInput()386 bool anyInput() const { return _inputState != 0; } 387 getInputLocation(Common::Point & where)388 void getInputLocation(Common::Point &where) const { where = _inputLocation; } 389 anyInputBitSet(const InputBits bits)390 bool anyInputBitSet(const InputBits bits) const { return (_inputState & bits) != 0; } 391 isAltDown()392 bool isAltDown() const { return _altDown; } 393 clearInput()394 void clearInput() { 395 _inputState = kAllUpBits; 396 _inputLocation.x = 0; 397 _inputLocation.y = 0; 398 _altDown = false; 399 } 400 401 protected: setInputBits(const InputBits state)402 void setInputBits(const InputBits state) { _inputState = state; } setInputLocation(const Common::Point & where)403 void setInputLocation(const Common::Point &where) { _inputLocation = where; } setAltDown(bool altDown)404 void setAltDown(bool altDown) { _altDown = altDown; } 405 406 InputBits _inputState; 407 Common::Point _inputLocation; 408 bool _altDown; 409 }; 410 411 class InputHandler { 412 public: 413 static InputHandler *setInputHandler(InputHandler*); getCurrentHandler()414 static InputHandler *getCurrentHandler() { return _inputHandler; } 415 static void pollForInput(); 416 static void getInput(Input&, Hotspot*&); 417 static void readInputDevice(Input&); invalHotspots()418 static void invalHotspots() { _invalHotspots = true; } getCurrentFilter()419 static InputBits getCurrentFilter() { return _lastFilter; } 420 421 InputHandler(InputHandler*); 422 virtual ~InputHandler(); 423 setNextHandler(InputHandler * nextHandler)424 virtual void setNextHandler(InputHandler *nextHandler) { _nextHandler = nextHandler; } getNextHandler()425 virtual InputHandler *getNextHandler() { return _nextHandler; } 426 427 virtual void handleInput(const Input &, const Hotspot *); 428 virtual void clickInHotspot(const Input &, const Hotspot *); 429 430 virtual void activateHotspots(); 431 virtual void updateCursor(const Common::Point, const Hotspot *); 432 virtual bool isClickInput(const Input &, const Hotspot *); 433 virtual bool wantsCursor(); 434 releaseInputFocus()435 virtual bool releaseInputFocus() { return true; } grabInputFocus()436 virtual void grabInputFocus() {} 437 438 // This returns bits set for what kinds of input to accept. 439 virtual InputBits getInputFilter(); 440 441 // This returns bits defining what input constitutes a "click." 442 virtual InputBits getClickFilter(); 443 allowInput(const bool allow)444 virtual void allowInput(const bool allow) { _allowInput = allow; } 445 446 protected: 447 static InputHandler *_inputHandler; 448 static bool _invalHotspots; 449 static InputBits _lastFilter; 450 451 InputHandler *_nextHandler; 452 bool _allowInput; 453 }; 454 455 456 /* 457 458 Tracker implements "dragging". A Tracker can receive a startTracking message, 459 which causes it to be the current tracker, as well as setting it up as the current 460 input handler. In addition, only one tracker can be tracking at a time, and no 461 other handler can be set up as the current handler until the track finishes. By 462 default, there is no next input handler for a Tracker, but this behavior can be 463 overridden if desired. 464 465 */ 466 467 class Tracker : public InputHandler { 468 public: Tracker()469 Tracker() : InputHandler(0), _savedHandler(nullptr) {} ~Tracker()470 ~Tracker() override {} 471 472 void handleInput(const Input &, const Hotspot *) override; stopTrackingInput(const Input &)473 virtual bool stopTrackingInput(const Input &) { return false; } 474 475 virtual void startTracking(const Input &); 476 virtual void stopTracking(const Input &); continueTracking(const Input &)477 virtual void continueTracking(const Input &) {} 478 isTracking()479 bool isTracking() { return this == _currentTracker; } 480 bool isClickInput(const Input &, const Hotspot *) override; 481 releaseInputFocus()482 bool releaseInputFocus() override { return !isTracking(); } 483 484 protected: 485 static Tracker *_currentTracker; 486 487 InputHandler *_savedHandler; 488 }; 489 490 class JMPPPInput { 491 public: isMenuButtonPressInput(const Input & input)492 static bool isMenuButtonPressInput(const Input &input) { return input.twoButtonDown(); } 493 getClickInputFilter()494 static InputBits getClickInputFilter() { return kFilterTwoButton; } isClickInput(const Input & input)495 static bool isClickInput(const Input &input) { return input.twoButtonDown(); } isDraggingInput(const Input & input)496 static bool isDraggingInput(const Input &input) { return input.twoButtonAnyDown(); } isPressingInput(const Input & input)497 static bool isPressingInput(const Input &input) { return input.twoButtonAnyDown(); } 498 isRaiseInventoryInput(const Input & input)499 static bool isRaiseInventoryInput(const Input &input) { return input.leftFireButtonDown(); } isRaiseBiochipsInput(const Input & input)500 static bool isRaiseBiochipsInput(const Input &input) { return input.rightFireButtonDown(); } getItemPanelsInputFilter()501 static InputBits getItemPanelsInputFilter() { return kFilterFourButton | kFilterLeftFireButton | kFilterRightFireButton; } 502 isToggleAIMiddleInput(const Input & input)503 static bool isToggleAIMiddleInput(const Input &input) { return input.threeButtonDown(); } 504 isToggleInfoInput(const Input & input)505 static bool isToggleInfoInput(const Input &input) { return input.fourButtonDown(); } 506 507 // Hmmmmm.... isEasterEggModifierInput(const Input & input)508 static bool isEasterEggModifierInput(const Input &input) { return input.isAltDown(); } 509 isTogglePauseInput(const Input & input)510 static bool isTogglePauseInput(const Input &input) { return input.mod3ButtonDown(); } 511 }; 512 513 } // End of namespace Pegasus 514 515 #define InputDevice (::Pegasus::InputDeviceManager::instance()) 516 517 #endif 518