TWINE: cleanup input code and replaced magic numbers
This commit is contained in:
parent
934a250cfd
commit
b307011170
9 changed files with 28 additions and 75 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue