aboutsummaryrefslogtreecommitdiff
path: root/engines/gnap/character.cpp
diff options
context:
space:
mode:
authorStrangerke2016-05-05 10:12:15 +0200
committerEugene Sandulenko2016-05-10 12:14:50 +0200
commit579ecdabd19f0a5f6837224eafebf6a8ac74c0ad (patch)
tree9704cec8a5164c2ec0515d5322477facdc4a739f /engines/gnap/character.cpp
parentdda4931ee9d78c704ebd768af243d7019e9d0913 (diff)
downloadscummvm-rg350-579ecdabd19f0a5f6837224eafebf6a8ac74c0ad.tar.gz
scummvm-rg350-579ecdabd19f0a5f6837224eafebf6a8ac74c0ad.tar.bz2
scummvm-rg350-579ecdabd19f0a5f6837224eafebf6a8ac74c0ad.zip
GNAP: More refactoring related to characters (WIP)
Diffstat (limited to 'engines/gnap/character.cpp')
-rw-r--r--engines/gnap/character.cpp460
1 files changed, 459 insertions, 1 deletions
diff --git a/engines/gnap/character.cpp b/engines/gnap/character.cpp
index 84274877d9..8b6ea803c0 100644
--- a/engines/gnap/character.cpp
+++ b/engines/gnap/character.cpp
@@ -22,6 +22,7 @@
#include "gnap/gnap.h"
#include "gnap/character.h"
+#include "gnap/gamesys.h"
namespace Gnap {
@@ -29,12 +30,469 @@ Character::Character(GnapEngine *vm) : _vm(vm) {
_pos = Common::Point(0, 0);
_idleFacing = kDirNone;
_actionStatus = 0;
+ _sequenceId = 0;
+ _sequenceDatNum = 0;
+ _id = 0;
}
Character::~Character() {}
-PlayerGnap::PlayerGnap(GnapEngine * vm) : Character(vm) {}
+PlayerGnap::PlayerGnap(GnapEngine * vm) : Character(vm) {
+ _gnapBrainPulseNum = 0;
+ _gnapBrainPulseRndValue = 0;
+}
+
+int PlayerGnap::getSequenceId(int kind, int gridX, int gridY) {
+ int sequenceId = 0;
+
+ switch (kind) {
+ case gskPullOutDevice:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x83F;
+ _idleFacing = kDirUpLeft;
+ } else {
+ sequenceId = 0x83D;
+ _idleFacing = kDirUpRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x83B;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x839;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else {
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = 0x839;
+ break;
+ case kDirBottomLeft:
+ sequenceId = 0x83B;
+ break;
+ case kDirUpRight:
+ sequenceId = 0x83D;
+ break;
+ default:
+ sequenceId = 0x83F;
+ break;
+ }
+ }
+ break;
+
+ case gskPullOutDeviceNonWorking:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x829;
+ _idleFacing = kDirUpLeft;
+ } else {
+ sequenceId = 0x828;
+ _idleFacing = kDirUpRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x827;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x826;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else {
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = 0x826;
+ break;
+ case kDirBottomLeft:
+ sequenceId = 0x827;
+ break;
+ case kDirUpRight:
+ sequenceId = 0x828;
+ break;
+ default:
+ sequenceId = 0x829;
+ break;
+ }
+ }
+ break;
+
+ case gskScratchingHead:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x834;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x885;
+ _idleFacing = kDirUpRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x834;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x833;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else {
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = 0x833;
+ _idleFacing = kDirBottomRight;
+ break;
+ case kDirBottomLeft:
+ sequenceId = 0x834;
+ _idleFacing = kDirBottomLeft;
+ break;
+ case kDirUpRight:
+ sequenceId = 0x885;
+ _idleFacing = kDirUpRight;
+ break;
+ default:
+ sequenceId = 0x834;
+ _idleFacing = kDirBottomLeft;
+ break;
+ }
+ }
+ break;
+
+ case gskIdle:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x7BC;
+ _idleFacing = kDirUpLeft;
+ } else {
+ sequenceId = 0x7BB;
+ _idleFacing = kDirUpRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x7BA;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7B9;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else {
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = 0x7B9;
+ break;
+ case kDirBottomLeft:
+ sequenceId = 0x7BA;
+ break;
+ case kDirUpRight:
+ sequenceId = 0x7BB;
+ break;
+ default:
+ sequenceId = 0x7BC;
+ break;
+ }
+ }
+ break;
+
+ case gskBrainPulsating:
+ _gnapBrainPulseNum = (_gnapBrainPulseNum + 1) & 1;
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x812;
+ _idleFacing = kDirUpLeft;
+ } else {
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x7FE;
+ _idleFacing = kDirUpRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x7D6;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x7EA;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else {
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x7EA;
+ break;
+ case kDirBottomLeft:
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x7D6;
+ break;
+ case kDirUpRight:
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x7FE;
+ break;
+ default:
+ sequenceId = _gnapBrainPulseRndValue + _gnapBrainPulseNum + 0x812;
+ break;
+ }
+ }
+ break;
+
+ case gskImpossible:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x831;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7A8;
+ _idleFacing = kDirBottomRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x831;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ if (_pos.x % 2)
+ sequenceId = 0x7A8;
+ else
+ sequenceId = 0x89A;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else if (_idleFacing != kDirBottomRight && _idleFacing != kDirUpRight) {
+ sequenceId = 0x831;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ if (_vm->_currentSceneNum % 2)
+ sequenceId = 0x7A8;
+ else
+ sequenceId = 0x89A;
+ _idleFacing = kDirBottomRight;
+ }
+ break;
+
+ case gskDeflect:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x830;
+ _idleFacing = kDirUpLeft;
+ } else {
+ sequenceId = 0x82F;
+ _idleFacing = kDirUpRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x82E;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7A7;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else {
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = 0x7A7;
+ break;
+ case kDirBottomLeft:
+ sequenceId = 0x82E;
+ break;
+ case kDirUpLeft:
+ sequenceId = 0x830;
+ break;
+ case kDirUpRight:
+ sequenceId = 0x82F;
+ break;
+ case kDirNone:
+ case kDirUnk4:
+ break;
+ }
+ }
+ break;
+
+ case gskUseDevice:
+ switch (_idleFacing) {
+ case kDirBottomRight:
+ sequenceId = 0x83A;
+ break;
+ case kDirBottomLeft:
+ sequenceId = 0x83C;
+ break;
+ case kDirUpLeft:
+ sequenceId = 0x840;
+ break;
+ case kDirUpRight:
+ sequenceId = 0x83E;
+ break;
+ case kDirNone:
+ case kDirUnk4:
+ break;
+ }
+ break;
+
+ case gskMoan1:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x832;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7AA;
+ _idleFacing = kDirBottomRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x832;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7AA;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else if (_idleFacing != kDirBottomRight && _idleFacing != kDirUpRight) {
+ sequenceId = 0x832;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7AA;
+ _idleFacing = kDirBottomRight;
+ }
+ break;
+
+ case gskMoan2:
+ if (gridX > 0 && gridY > 0) {
+ if (_pos.y > gridY) {
+ if (_pos.x > gridX) {
+ sequenceId = 0x832;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7AA;
+ _idleFacing = kDirBottomRight;
+ }
+ } else {
+ if (_pos.x > gridX) {
+ sequenceId = 0x832;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7AA;
+ _idleFacing = kDirBottomRight;
+ }
+ }
+ } else if (_idleFacing != kDirBottomRight && _idleFacing != kDirUpRight) {
+ sequenceId = 0x832;
+ _idleFacing = kDirBottomLeft;
+ } else {
+ sequenceId = 0x7AA;
+ _idleFacing = kDirBottomRight;
+ }
+ break;
+ }
+
+ return sequenceId | 0x10000;
+}
+
+void PlayerGnap::useJointOnPlatypus() {
+ _vm->setGrabCursorSprite(-1);
+ if (_vm->gnapPlatypusAction(1, 0, 0x107C1, 0)) {
+ _actionStatus = 100;
+ _vm->_gameSys->setAnimation(0, 0, 1);
+ _vm->_gameSys->setAnimation(0x10876, _vm->_plat->_id, 0);
+ _vm->_gameSys->insertSequence(0x10875, _id,
+ makeRid(_sequenceDatNum, _sequenceId), _id,
+ kSeqSyncWait, 0, 15 * (5 * _pos.x - 30), 48 * (_pos.y - 7));
+ _sequenceDatNum = 1;
+ _sequenceId = 0x875;
+ _vm->_gameSys->insertSequence(0x10876, _vm->_plat->_id,
+ _vm->_plat->_sequenceId | (_vm->_plat->_sequenceDatNum << 16), _vm->_plat->_id,
+ kSeqSyncWait, 0, 15 * (5 * _vm->_plat->_pos.x - 25), 48 * (_vm->_plat->_pos.y - 7));
+ _vm->_plat->_sequenceDatNum = 1;
+ _vm->_plat->_sequenceId = 0x876;
+ _vm->_plat->_idleFacing = kDirNone;
+ _vm->playGnapSequence(0x107B5);
+ _vm->gnapWalkStep();
+ while (_vm->_gameSys->getAnimationStatus(0) != 2) {
+ _vm->updateMouseCursor();
+ _vm->gameUpdateTick();
+ }
+ _vm->_gameSys->setAnimation(0, 0, 0);
+ _actionStatus = -1;
+ } else {
+ _vm->playGnapSequence(getSequenceId(gskScratchingHead, _vm->_plat->_pos.x, _vm->_plat->_pos.y) | 0x10000);
+ }
+}
+
+void PlayerGnap::kissPlatypus(int callback) {
+ if (_vm->gnapPlatypusAction(-1, 0, 0x107D1, callback)) {
+ _actionStatus = 100;
+ _vm->_gameSys->setAnimation(0, 0, 1);
+ _vm->_gameSys->setAnimation(0x10847, _id, 0);
+ _vm->_gameSys->insertSequence(0x10847, _id,
+ makeRid(_sequenceDatNum, _sequenceId), _id,
+ kSeqSyncWait, 0, 15 * (5 * _pos.x - 20) - (21 - _vm->_gridMinX), 48 * (_pos.y - 6) - (146 - _vm->_gridMinY));
+ _sequenceDatNum = 1;
+ _sequenceId = 0x847;
+ _vm->_gameSys->insertSequence(0x107CB, _vm->_plat->_id,
+ makeRid(_vm->_plat->_sequenceDatNum, _vm->_plat->_sequenceId), _vm->_plat->_id,
+ kSeqSyncWait, _vm->getSequenceTotalDuration(0x10847), 75 * _vm->_plat->_pos.x - _vm->_platGridX, 48 * _vm->_plat->_pos.y - _vm->_platGridY);
+ _vm->_plat->_sequenceDatNum = 1;
+ _vm->_plat->_sequenceId = 0x7CB;
+ _vm->_plat->_idleFacing = kDirNone;
+ _vm->playGnapSequence(0x107B5);
+ while (_vm->_gameSys->getAnimationStatus(0) != 2) {
+ _vm->updateMouseCursor();
+ _vm->doCallback(callback);
+ _vm->gameUpdateTick();
+ }
+ _vm->_gameSys->setAnimation(0, 0, 0);
+ _actionStatus = -1;
+ } else {
+ _vm->playGnapSequence(getSequenceId(gskScratchingHead, _vm->_plat->_pos.x, _vm->_plat->_pos.y) | 0x10000);
+ }
+}
+
+void PlayerGnap::useDeviceOnPlatypus() {
+ _vm->playGnapSequence(makeRid(1, getSequenceId(gskPullOutDevice, _vm->_plat->_pos.x, _vm->_plat->_pos.y)));
+
+ if (_vm->_plat->_idleFacing != kDirNone) {
+ _vm->_gameSys->insertSequence(makeRid(1, 0x7D5), _vm->_plat->_id,
+ makeRid(_vm->_plat->_sequenceDatNum, _vm->_plat->_sequenceId), _vm->_plat->_id,
+ kSeqSyncWait, 0, 75 * _vm->_plat->_pos.x - _vm->_platGridX, 48 * _vm->_plat->_pos.y - _vm->_platGridY);
+ _vm->_plat->_sequenceId = 0x7D5;
+ _vm->_plat->_sequenceDatNum = 1;
+ } else {
+ _vm->_gameSys->insertSequence(makeRid(1, 0x7D4), _vm->_plat->_id,
+ makeRid(_vm->_plat->_sequenceDatNum, _vm->_plat->_sequenceId), _vm->_plat->_id,
+ kSeqSyncWait, 0, 75 * _vm->_plat->_pos.x - _vm->_platGridX, 48 * _vm->_plat->_pos.y - _vm->_platGridY);
+ _vm->_plat->_sequenceId = 0x7D4;
+ _vm->_plat->_sequenceDatNum = 1;
+ }
+
+ int newSequenceId = getSequenceId(gskUseDevice, 0, 0);
+ _vm->_gameSys->insertSequence(makeRid(1, newSequenceId), _id,
+ makeRid(_sequenceDatNum, _sequenceId), _id,
+ kSeqSyncWait, 0, 75 * _pos.x - _vm->_gnapGridX, 48 * _pos.y - _vm->_gnapGridY);
+ _sequenceId = newSequenceId;
+ _sequenceDatNum = 1;
+}
+
+void PlayerGnap::initBrainPulseRndValue() {
+ _gnapBrainPulseRndValue = 2 * _vm->getRandom(10);
+}
+
+/************************************************************************************************/
PlayerPlat::PlayerPlat(GnapEngine * vm) : Character(vm) {}
+int PlayerPlat::getSequenceId(int kind, int gridX, int gridY) {
+ // The original had 3 parameters, all always set to 0.
+ // The code to handle the other values has been removed.
+
+ int sequenceId = 0x7CB;
+
+ if (_idleFacing != kDirNone) {
+ sequenceId = 0x7CC;
+ _idleFacing = kDirUnk4;
+ }
+
+ return sequenceId | 0x10000;
+}
} // End of namespace Gnap