From b3070111700a06cd212a0c33e572867f93663b81 Mon Sep 17 00:00:00 2001 From: Martin Gerhardy Date: Mon, 26 Oct 2020 00:24:41 +0100 Subject: [PATCH] TWINE: cleanup input code and replaced magic numbers --- engines/twine/actor.cpp | 4 ++-- engines/twine/actor.h | 14 +++++++++++++- engines/twine/input.cpp | 24 ------------------------ engines/twine/input.h | 24 ------------------------ engines/twine/movements.cpp | 2 +- engines/twine/movements.h | 12 ------------ engines/twine/scene.cpp | 4 ++-- engines/twine/script_life.cpp | 11 ++++++----- engines/twine/twine.cpp | 8 ++++---- 9 files changed, 28 insertions(+), 75 deletions(-) diff --git a/engines/twine/actor.cpp b/engines/twine/actor.cpp index cd843f50216..604bd169d9a 100644 --- a/engines/twine/actor.cpp +++ b/engines/twine/actor.cpp @@ -42,7 +42,7 @@ Actor::Actor(TwinEEngine *engine) : _engine(engine) { } void Actor::restartHeroScene() { - _engine->_scene->sceneHero->controlMode = 1; + _engine->_scene->sceneHero->controlMode = ControlMode::kManual; memset(&_engine->_scene->sceneHero->dynamicFlags, 0, sizeof(_engine->_scene->sceneHero->dynamicFlags)); memset(&_engine->_scene->sceneHero->staticFlags, 0, sizeof(_engine->_scene->sceneHero->staticFlags)); @@ -387,7 +387,7 @@ void Actor::resetActor(int16 actorIdx) { actor->angle = 0; actor->speed = 40; - actor->controlMode = 0; + actor->controlMode = ControlMode::kNoMove; actor->info0 = 0; actor->info1 = 0; diff --git a/engines/twine/actor.h b/engines/twine/actor.h index 5289fb10a92..d0a6798d81f 100644 --- a/engines/twine/actor.h +++ b/engines/twine/actor.h @@ -147,6 +147,18 @@ struct DynamicFlagsStruct { uint16 bUnk8000 : 1; // 0x8000 unused }; +/** Control mode types */ +enum ControlMode { + kNoMove = 0, + kManual = 1, + kFollow = 2, + kTrack = 3, + kFollow2 = 4, + kTrackAttack = 5, + kSameXZ = 6, + kRandom = 7 +}; + /** Actors structure */ struct ActorStruct { StaticFlagsStruct staticFlags; @@ -170,7 +182,7 @@ struct ActorStruct { int32 bonusParameter = 0; // field_10 int32 angle = 0; int32 speed = 0; - int32 controlMode = 0; + ControlMode controlMode = ControlMode::kNoMove; int32 info0 = 0; // cropLeft int32 info1 = 0; // cropTop int32 info2 = 0; // cropRight diff --git a/engines/twine/input.cpp b/engines/twine/input.cpp index 04560f3d157..19642121933 100644 --- a/engines/twine/input.cpp +++ b/engines/twine/input.cpp @@ -73,14 +73,6 @@ static const struct KeyProperties { {0x00, false, 0x00}}; static_assert(ARRAYSIZE(pressedKeyCharMap) == 31, "Expected size of key char map"); -ScopedKeyMapperDisable::ScopedKeyMapperDisable() { - g_system->getEventManager()->getKeymapper()->setEnabled(false); -} - -ScopedKeyMapperDisable::~ScopedKeyMapperDisable() { - g_system->getEventManager()->getKeymapper()->setEnabled(true); -} - ScopedKeyMap::ScopedKeyMap(TwinEEngine* engine, const char *id) : _engine(engine) { _prevKeyMap = _engine->_input->currentKeyMap(); _engine->_input->enableKeyMap(cutsceneKeyMapId); @@ -92,13 +84,6 @@ ScopedKeyMap::~ScopedKeyMap() { Input::Input(TwinEEngine *engine) : _engine(engine) {} -bool Input::isPressed(Common::KeyCode keycode, bool onlyFirstTime) const { - if (onlyFirstTime) { - return _pressed[keycode] == 1; - } - return _pressed[keycode] > 0; -} - bool Input::isActionActive(TwinEActionType actionType, bool onlyFirstTime) const { if (onlyFirstTime) { return actionStates[actionType] == 1; @@ -127,9 +112,6 @@ void Input::enableKeyMap(const char *id) { return; } - // switching the keymap must also disable all other action keys - memset(_pressed, 0, sizeof(_pressed)); - Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper(); const Common::KeymapArray &keymaps = keymapper->getKeymaps(); for (Common::Keymap *keymap : keymaps) { @@ -183,12 +165,6 @@ void Input::readKeys() { case Common::EVENT_LBUTTONDOWN: leftMouse = 1; break; - case Common::EVENT_KEYDOWN: - _pressed[event.kbd.keycode] = 1 + event.kbdRepeat; - break; - case Common::EVENT_KEYUP: - _pressed[event.kbd.keycode] = 0; - break; case Common::EVENT_RBUTTONDOWN: rightMouse = 1; break; diff --git a/engines/twine/input.h b/engines/twine/input.h index 20bd08c4df7..4ab416032fe 100644 --- a/engines/twine/input.h +++ b/engines/twine/input.h @@ -134,15 +134,6 @@ struct MouseStatusStruct { int32 y = 0; }; -/** - * @brief Whenever text input is needed (like the playername) - * you have to disable the keymaps - */ -struct ScopedKeyMapperDisable { - ScopedKeyMapperDisable(); - ~ScopedKeyMapperDisable(); -}; - /** * @brief Activates the given key map id that is registered in the meta engine */ @@ -158,7 +149,6 @@ public: class Input { private: TwinEEngine *_engine; - uint8 _pressed[Common::KEYCODE_LAST]{0}; Common::String _currentKeyMap; uint8 actionStates[TwinEActionType::Max]{false}; @@ -197,20 +187,6 @@ public: bool toggleAbortAction(); - /** - * @param onlyFirstTime If this is set to @c true, repeating key press events are not taken into account here - * This means, that even if the key is held down, this will return @c false. @c false as value for this parameter - * will return @c true also for repeating key presses. - * - * @note You won't receive any pressed events if you have that key bound to a @c TwinEActionType value. - * @sa isActionActive() - */ - bool isPressed(Common::KeyCode keycode, bool onlyFirstTime = true) const; - - inline bool isPressedEnter(bool onlyFirstTime = true) const { - return isPressed(Common::KEYCODE_RETURN, onlyFirstTime) || isPressed(Common::KEYCODE_KP_ENTER, onlyFirstTime); - } - bool isQuickBehaviourActionActive() const; /** diff --git a/engines/twine/movements.cpp b/engines/twine/movements.cpp index 7e3804a41ab..18bc0173525 100644 --- a/engines/twine/movements.cpp +++ b/engines/twine/movements.cpp @@ -281,7 +281,7 @@ void Movements::processActorMovements(int32 actorIdx) { heroPressedKey = _engine->_input->key; } else { if (!actor->staticFlags.bIsSpriteActor) { - if (actor->controlMode != kManual) { + if (actor->controlMode != ControlMode::kManual) { actor->angle = getRealAngle(&actor->move); } } diff --git a/engines/twine/movements.h b/engines/twine/movements.h index 154ffc9ae3a..2774f747829 100644 --- a/engines/twine/movements.h +++ b/engines/twine/movements.h @@ -28,18 +28,6 @@ namespace TwinE { -/** Control mode types */ -enum ControlMode { - kNoMove = 0, - kManual = 1, - kFollow = 2, - kTrack = 3, - kFollow2 = 4, - kTrackAttack = 5, - kSameXZ = 6, - kRandom = 7 -}; - class TwinEEngine; class Movements { diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp index 4b2ca275ae7..e4db3883e3a 100644 --- a/engines/twine/scene.cpp +++ b/engines/twine/scene.cpp @@ -170,7 +170,7 @@ bool Scene::loadSceneLBA1() { act->bonusParameter &= 0xFE; act->angle = stream.readUint16LE(); act->speed = stream.readUint16LE(); - act->controlMode = stream.readUint16LE(); + act->controlMode = (ControlMode)stream.readUint16LE(); act->info0 = stream.readUint16LE(); act->info1 = stream.readUint16LE(); act->info2 = stream.readUint16LE(); @@ -266,7 +266,7 @@ void Scene::changeScene() { resetScene(); _engine->_actor->loadHeroEntities(); - sceneHero->controlMode = 1; + sceneHero->controlMode = ControlMode::kManual; sceneHero->zone = -1; sceneHero->positionInLifeScript = 0; sceneHero->positionInMoveScript = -1; diff --git a/engines/twine/script_life.cpp b/engines/twine/script_life.cpp index 50e23f2e7b3..d1ec2015094 100644 --- a/engines/twine/script_life.cpp +++ b/engines/twine/script_life.cpp @@ -589,8 +589,8 @@ static int32 lFALLABLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) static int32 lSET_DIRMODE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) { int32 controlMode = *(scriptPtr++); - actor->controlMode = controlMode; - if (controlMode == kFollow) { + actor->controlMode = (ControlMode)controlMode; + if (actor->controlMode == ControlMode::kFollow) { actor->followedActor = *(scriptPtr++); } @@ -602,9 +602,10 @@ static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct * int32 otherActorIdx = *(scriptPtr++); int32 controlMode = *(scriptPtr++); - engine->_scene->getActor(otherActorIdx)->controlMode = controlMode; - if (controlMode == kFollow) { - engine->_scene->getActor(otherActorIdx)->followedActor = *(scriptPtr++); + ActorStruct *otherActor = engine->_scene->getActor(otherActorIdx); + otherActor->controlMode = (ControlMode)controlMode; + if (otherActor->controlMode == ControlMode::kFollow) { + otherActor->followedActor = *(scriptPtr++); } return 0; diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp index d51f1cbf5cf..8714adcc4ae 100644 --- a/engines/twine/twine.cpp +++ b/engines/twine/twine.cpp @@ -419,7 +419,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration // inventory menu loopInventoryItem = -1; - if (_input->isActionActive(TwinEActionType::InventoryMenu) && _scene->sceneHero->entity != -1 && _scene->sceneHero->controlMode == kManual) { + if (_input->isActionActive(TwinEActionType::InventoryMenu) && _scene->sceneHero->entity != -1 && _scene->sceneHero->controlMode == ControlMode::kManual) { freezeTime(); _menu->processInventoryMenu(); @@ -535,7 +535,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration _input->isActionActive(TwinEActionType::QuickBehaviourAthletic, false) || _input->isActionActive(TwinEActionType::QuickBehaviourAggressive, false) || _input->isActionActive(TwinEActionType::QuickBehaviourDiscreet, false)) && - _scene->sceneHero->entity != -1 && _scene->sceneHero->controlMode == kManual) { + _scene->sceneHero->entity != -1 && _scene->sceneHero->controlMode == ControlMode::kManual) { if (_input->isActionActive(TwinEActionType::QuickBehaviourNormal, false)) { _actor->heroBehaviour = HeroBehaviourType::kNormal; } else if (_input->isActionActive(TwinEActionType::QuickBehaviourAthletic, false)) { @@ -627,7 +627,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration if (actor->life == 0) { if (a == 0) { // if its hero who died _animations->initAnim(kLandDeath, 4, 0, 0); - actor->controlMode = 0; + actor->controlMode = ControlMode::kNoMove; } else { _sound->playSample(37, getRandomNumber(2000) + 3096, 1, actor->x, actor->y, actor->z, a); @@ -691,7 +691,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration _actor->cropBottomScreen = _renderer->projPosY; } _renderer->projectPositionOnScreen(actor->x - _grid->cameraX, actor->y - _grid->cameraY, actor->z - _grid->cameraZ); - actor->controlMode = 0; + actor->controlMode = ControlMode::kNoMove; actor->life = -1; _actor->cropBottomScreen = _renderer->projPosY; actor->staticFlags.bCanDrown |= 0x10;