diff options
author | Strangerke | 2016-04-24 22:38:30 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2016-05-10 09:54:21 +0200 |
commit | 7a66d4b3568ebcfae549f13e87549f2771f36732 (patch) | |
tree | 0fc132bdf1133b627cdfcea81908d093433ffc86 /engines/gnap/scenes | |
parent | aca5984e2b2f08890f828bbe9c331841c9b33674 (diff) | |
download | scummvm-rg350-7a66d4b3568ebcfae549f13e87549f2771f36732.tar.gz scummvm-rg350-7a66d4b3568ebcfae549f13e87549f2771f36732.tar.bz2 scummvm-rg350-7a66d4b3568ebcfae549f13e87549f2771f36732.zip |
GNAP: Refactor scenes 51&52
Diffstat (limited to 'engines/gnap/scenes')
-rw-r--r-- | engines/gnap/scenes/scene51.cpp | 493 | ||||
-rw-r--r-- | engines/gnap/scenes/scene51.h | 101 | ||||
-rw-r--r-- | engines/gnap/scenes/scene52.cpp | 482 | ||||
-rw-r--r-- | engines/gnap/scenes/scene52.h | 118 | ||||
-rw-r--r-- | engines/gnap/scenes/scenecore.cpp | 14 |
5 files changed, 724 insertions, 484 deletions
diff --git a/engines/gnap/scenes/scene51.cpp b/engines/gnap/scenes/scene51.cpp index 1d9e177989..f4a3a843ba 100644 --- a/engines/gnap/scenes/scene51.cpp +++ b/engines/gnap/scenes/scene51.cpp @@ -23,6 +23,7 @@ #include "gnap/gnap.h" #include "gnap/gamesys.h" #include "gnap/resource.h" +#include "gnap/scenes/scene51.h" namespace Gnap { @@ -46,18 +47,54 @@ static const int kDigitPositions[4] = { 0x76 Platypus jumping (right) */ -int GnapEngine::scene51_init() { - _gameSys->setAnimation(0, 0, 0); +Scene51::Scene51(GnapEngine *vm) : Scene(vm) { + _s51_dropLoseCash = false; + + _s51_cashAmount = -1; + _s51_guySequenceId = -1; + _s51_guyNextSequenceId = -1; + _s51_itemsCaughtCtr = -1; + _s51_dropSpeedTicks = -1; + _s51_nextDropItemKind = -1; + _s51_itemInsertX = -1; + _s51_itemInsertDirection = -1; + _s51_platypusSequenceId = -1; + _s51_platypusNextSequenceId = -1; + _s51_platypusJumpSequenceId = -1; + _s51_itemsCtr = -1; + _s51_itemsCtr1 = -1; + _s51_itemsCtr2 = -1; + + for (int i = 0; i < 4; i++) { + _s51_digits[i] = 0; + _s51_digitSequenceIds[4] = -1; + } + + for (int i = 0; i < 6; i++) { + _s51_items[i]._currSequenceId = -1; + _s51_items[i]._droppedSequenceId; + _s51_items[i]._x = 0; + _s51_items[i]._y = 0; + _s51_items[i]._collisionX; + _s51_items[i]._canCatch = false; + _s51_items[i]._isCollision = false; + _s51_items[i]._x2 = 0; + _s51_items[i]._id = -1; + } +} + +int Scene51::init() { + _vm->_gameSys->setAnimation(0, 0, 0); for (int i = 0; i < 6; ++i) - _gameSys->setAnimation(0, 0, i + 1); + _vm->_gameSys->setAnimation(0, 0, i + 1); return 0xD4; } -void GnapEngine::scene51_updateHotspots() { - _hotspotsCount = 0; +void Scene51::updateHotspots() { + _vm->_hotspotsCount = 0; } -void GnapEngine::scene51_clearItem(Scene51Item *item) { +void Scene51::clearItem(Scene51Item *item) { item->_currSequenceId = 0; item->_droppedSequenceId = 0; item->_x = 0; @@ -67,13 +104,11 @@ void GnapEngine::scene51_clearItem(Scene51Item *item) { item->_canCatch = false; } -void GnapEngine::scene51_dropNextItem() { - - if (_timers[0]) +void Scene51::dropNextItem() { + if (_vm->_timers[0]) return; int index = 0; - while (index < 6 && _s51_items[index]._currSequenceId) ++index; @@ -81,9 +116,8 @@ void GnapEngine::scene51_dropNextItem() { return; switch (_s51_nextDropItemKind) { - case 0: - if (getRandom(10) != 0 || _s51_itemsCtr2 >= 2) { + if (_vm->getRandom(10) != 0 || _s51_itemsCtr2 >= 2) { _s51_items[index]._currSequenceId = 0xBD; } else { --_s51_itemsCtr1; @@ -93,8 +127,8 @@ void GnapEngine::scene51_dropNextItem() { break; case 1: - if (getRandom(8) != 0 || _s51_itemsCtr2 >= 2) { - if (getRandom(5) == 0) { + if (_vm->getRandom(8) != 0 || _s51_itemsCtr2 >= 2) { + if (_vm->getRandom(5) == 0) { if (_s51_itemInsertDirection) _s51_itemInsertX -= 70; else @@ -109,7 +143,7 @@ void GnapEngine::scene51_dropNextItem() { break; case 2: - if (getRandom(6) != 0 || _s51_itemsCtr2 >= 2) { + if (_vm->getRandom(6) != 0 || _s51_itemsCtr2 >= 2) { _s51_items[index]._currSequenceId = 0xBD; } else { --_s51_itemsCtr1; @@ -127,8 +161,8 @@ void GnapEngine::scene51_dropNextItem() { case 5: case 6: - if (getRandom(5) != 0 || _s51_itemsCtr2 >= 2) { - if (getRandom(5) != 0) + if (_vm->getRandom(5) != 0 || _s51_itemsCtr2 >= 2) { + if (_vm->getRandom(5) != 0) _s51_items[index]._currSequenceId = 0xBD; else _s51_items[index]._currSequenceId = 0xC0; @@ -140,14 +174,14 @@ void GnapEngine::scene51_dropNextItem() { break; case 7: - if (getRandom(5) != 0 || _s51_itemsCtr2 >= 2) { - if (getRandom(5) == 0) { + if (_vm->getRandom(5) != 0 || _s51_itemsCtr2 >= 2) { + if (_vm->getRandom(5) == 0) { if (_s51_itemInsertDirection) _s51_itemInsertX -= 40; else _s51_itemInsertX += 40; } - if (getRandom(9) != 0) + if (_vm->getRandom(9) != 0) _s51_items[index]._currSequenceId = 0xBD; else _s51_items[index]._currSequenceId = 0xC0; @@ -159,8 +193,8 @@ void GnapEngine::scene51_dropNextItem() { break; default: - if (getRandom(4) != 0 || _s51_itemsCtr2 >= 2) { - if (getRandom(9) != 0) + if (_vm->getRandom(4) != 0 || _s51_itemsCtr2 >= 2) { + if (_vm->getRandom(9) != 0) _s51_items[index]._currSequenceId = 0xBD; else _s51_items[index]._currSequenceId = 0xC0; @@ -170,7 +204,6 @@ void GnapEngine::scene51_dropNextItem() { ++_s51_itemsCtr2; } break; - } if (_s51_itemInsertDirection) { @@ -194,7 +227,7 @@ void GnapEngine::scene51_dropNextItem() { _s51_itemInsertX = 129; if (_s51_items[index]._currSequenceId == 0xBA) { - _s51_items[index]._x2 = getRandom(350) + 200; + _s51_items[index]._x2 = _vm->getRandom(350) + 200; _s51_items[index]._x = _s51_items[index]._x2 - 362; _s51_items[index]._y = 15; _s51_items[index]._id = 249 - index; @@ -207,37 +240,37 @@ void GnapEngine::scene51_dropNextItem() { _s51_items[index]._canCatch = true; } - _gameSys->setAnimation(_s51_items[index]._currSequenceId, _s51_items[index]._id, index + 1); - _gameSys->insertSequence(_s51_items[index]._currSequenceId, _s51_items[index]._id, 0, 0, + _vm->_gameSys->setAnimation(_s51_items[index]._currSequenceId, _s51_items[index]._id, index + 1); + _vm->_gameSys->insertSequence(_s51_items[index]._currSequenceId, _s51_items[index]._id, 0, 0, kSeqNone, 0, _s51_items[index]._x, _s51_items[index]._y); - _timers[0] = _s51_dropSpeedTicks; + _vm->_timers[0] = _s51_dropSpeedTicks; if (_s51_nextDropItemKind >= 3) - _timers[0] = 20; + _vm->_timers[0] = 20; if (_s51_nextDropItemKind >= 5) - _timers[0] = 5; + _vm->_timers[0] = 5; if (_s51_nextDropItemKind == 8) - _timers[0] = 4; + _vm->_timers[0] = 4; ++_s51_itemsCtr; - } -void GnapEngine::scene51_updateItemAnimations() { - for (int i = 0; i < 6; ++i) - if (_gameSys->getAnimationStatus(i + 1) == 2) - scene51_updateItemAnimation(&_s51_items[i], i); +void Scene51::updateItemAnimations() { + for (int i = 0; i < 6; ++i) { + if (_vm->_gameSys->getAnimationStatus(i + 1) == 2) + updateItemAnimation(&_s51_items[i], i); + } } -int GnapEngine::scene51_checkCollision(int sequenceId) { +int Scene51::checkCollision(int sequenceId) { bool jumpingLeft = false, jumpingRight = false; int v8, v4; int result = 0; - if (!scene51_isJumping(sequenceId)) + if (!isJumping(sequenceId)) return false; bool checkFl = false; @@ -247,13 +280,13 @@ int GnapEngine::scene51_checkCollision(int sequenceId) { if (!checkFl) return false; - if (scene51_isJumpingRight(sequenceId)) { - v8 = scene51_getPosRight(sequenceId); - v4 = scene51_getPosRight(sequenceId + 1); + if (isJumpingRight(sequenceId)) { + v8 = getPosRight(sequenceId); + v4 = getPosRight(sequenceId + 1); jumpingRight = true; - } else if (scene51_isJumpingLeft(sequenceId)) { - v4 = scene51_getPosLeft(sequenceId - 1) + 33; - v8 = scene51_getPosLeft(sequenceId) + 33; + } else if (isJumpingLeft(sequenceId)) { + v4 = getPosLeft(sequenceId - 1) + 33; + v8 = getPosLeft(sequenceId) + 33; jumpingLeft = true; } @@ -278,8 +311,8 @@ int GnapEngine::scene51_checkCollision(int sequenceId) { } } if (v5) { - _gameSys->setAnimation(0xBC, _s51_items[i]._id, i + 1); - _gameSys->insertSequence(0xBC, _s51_items[i]._id, _s51_items[i]._currSequenceId, _s51_items[i]._id, kSeqSyncWait, 0, _s51_items[i]._x, 15); + _vm->_gameSys->setAnimation(0xBC, _s51_items[i]._id, i + 1); + _vm->_gameSys->insertSequence(0xBC, _s51_items[i]._id, _s51_items[i]._currSequenceId, _s51_items[i]._id, kSeqSyncWait, 0, _s51_items[i]._x, 15); _s51_items[i]._isCollision = false; _s51_items[i]._currSequenceId = 0xBC; --_s51_itemsCtr2; @@ -290,14 +323,14 @@ int GnapEngine::scene51_checkCollision(int sequenceId) { return result; } -void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { +void Scene51::updateItemAnimation(Scene51Item *item, int index) { switch (item->_currSequenceId) { case 0xBD: case 0xC0: case 0xC1: // Falling coin and banknote - if (!scene51_itemIsCaught(item)) { + if (!itemIsCaught(item)) { if (_s51_dropLoseCash) { if (item->_currSequenceId == 0xBD) _s51_cashAmount -= 2; @@ -305,30 +338,30 @@ void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { _s51_cashAmount -= 25; if (_s51_cashAmount < 0) _s51_cashAmount = 0; - scene51_updateCash(_s51_cashAmount); + updateCash(_s51_cashAmount); } item->_droppedSequenceId = item->_currSequenceId + 1; if (item->_currSequenceId != 0xC0) { item->_canCatch = false; _s51_dropLoseCash = true; _s51_itemsCtr = 0; - _timers[0] = 10; + _vm->_timers[0] = 10; } if (item->_droppedSequenceId) { - _gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); - _gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); + _vm->_gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); + _vm->_gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); item->_currSequenceId = item->_droppedSequenceId; item->_y = 0; } } else { - _gameSys->removeSequence(item->_currSequenceId, item->_id, true); - _gameSys->setAnimation(0, 0, index + 1); - playSound(218, false); - if (scene51_incCashAmount(item->_currSequenceId) == 1995) { - scene51_winMinigame(); - _sceneDone = true; + _vm->_gameSys->removeSequence(item->_currSequenceId, item->_id, true); + _vm->_gameSys->setAnimation(0, 0, index + 1); + _vm->playSound(218, false); + if (incCashAmount(item->_currSequenceId) == 1995) { + winMinigame(); + _vm->_sceneDone = true; } else { - scene51_clearItem(item); + clearItem(item); ++_s51_itemsCaughtCtr; if (_s51_itemsCaughtCtr == 5) --_s51_dropSpeedTicks; @@ -347,7 +380,7 @@ void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { _s51_itemsCtr1 = 20; _s51_dropLoseCash = false; _s51_itemsCaughtCtr = 0; - scene51_removeCollidedItems(); + removeCollidedItems(); } } } @@ -357,8 +390,8 @@ void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { // Fallen coin item->_droppedSequenceId = item->_currSequenceId + 1; if (item->_droppedSequenceId) { - _gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); - _gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); + _vm->_gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); + _vm->_gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); item->_currSequenceId = item->_droppedSequenceId; item->_y = 0; } @@ -367,9 +400,9 @@ void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { case 0xBF: case 0xC2: // Bouncing coin and banknote - _gameSys->setAnimation(0, 0, index + 1); - _gameSys->removeSequence(item->_currSequenceId, item->_id, true); - scene51_clearItem(item); + _vm->_gameSys->setAnimation(0, 0, index + 1); + _vm->_gameSys->removeSequence(item->_currSequenceId, item->_id, true); + clearItem(item); break; case 0xBA: @@ -377,8 +410,8 @@ void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { item->_droppedSequenceId = 0xBB; item->_y = 15; if (item->_droppedSequenceId) { - _gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); - _gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); + _vm->_gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); + _vm->_gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); item->_currSequenceId = item->_droppedSequenceId; item->_y = 0; } @@ -387,60 +420,57 @@ void GnapEngine::scene51_updateItemAnimation(Scene51Item *item, int index) { case 0xBB: item->_isCollision = true; item->_droppedSequenceId = 0; - _gameSys->setAnimation(0, 0, index + 1); + _vm->_gameSys->setAnimation(0, 0, index + 1); break; case 0xBC: - _gameSys->removeSequence(item->_currSequenceId, item->_id, true); - _gameSys->setAnimation(0, 0, index + 1); - scene51_clearItem(item); + _vm->_gameSys->removeSequence(item->_currSequenceId, item->_id, true); + _vm->_gameSys->setAnimation(0, 0, index + 1); + clearItem(item); break; default: if (item->_droppedSequenceId) { - _gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); - _gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); + _vm->_gameSys->setAnimation(item->_droppedSequenceId, item->_id, index + 1); + _vm->_gameSys->insertSequence(item->_droppedSequenceId, item->_id, item->_currSequenceId, item->_id, kSeqSyncWait, 0, item->_x, item->_y); item->_currSequenceId = item->_droppedSequenceId; item->_y = 0; } break; - } - } -void GnapEngine::scene51_removeCollidedItems() { +void Scene51::removeCollidedItems() { for (int i = 0; i < 6; ++i) { if (_s51_items[i]._isCollision) { - _gameSys->removeSequence(_s51_items[i]._currSequenceId, _s51_items[i]._id, true); - _gameSys->setAnimation(0, 0, i + 1); - scene51_clearItem(&_s51_items[i]); + _vm->_gameSys->removeSequence(_s51_items[i]._currSequenceId, _s51_items[i]._id, true); + _vm->_gameSys->setAnimation(0, 0, i + 1); + clearItem(&_s51_items[i]); } } _s51_itemsCtr2 = 0; } -int GnapEngine::scene51_itemIsCaught(Scene51Item *item) { - +int Scene51::itemIsCaught(Scene51Item *item) { if (!item->_canCatch) return 0; - if (scene51_isJumpingRight(_s51_platypusJumpSequenceId)) { - int v4 = scene51_getPosRight(_s51_platypusJumpSequenceId) + 97; + if (isJumpingRight(_s51_platypusJumpSequenceId)) { + int v4 = getPosRight(_s51_platypusJumpSequenceId) + 97; if (item->_collisionX < v4 && v4 - item->_collisionX < 56) return 1; } else { - int v2 = scene51_getPosLeft(_s51_platypusJumpSequenceId); + int v2 = getPosLeft(_s51_platypusJumpSequenceId); if (item->_collisionX > v2 && item->_collisionX - v2 < 56) return 1; } if (item->_currSequenceId == 0xC1) { int v3 = item->_collisionX + 100; - if (scene51_isJumpingRight(_s51_platypusJumpSequenceId)) { - if (ABS(scene51_getPosRight(_s51_platypusJumpSequenceId) + 46 - v3) < 56) + if (isJumpingRight(_s51_platypusJumpSequenceId)) { + if (ABS(getPosRight(_s51_platypusJumpSequenceId) + 46 - v3) < 56) return 1; - } else if (ABS(scene51_getPosLeft(_s51_platypusJumpSequenceId) + 46 - v3) < 56) { + } else if (ABS(getPosLeft(_s51_platypusJumpSequenceId) + 46 - v3) < 56) { return 1; } } @@ -448,27 +478,27 @@ int GnapEngine::scene51_itemIsCaught(Scene51Item *item) { return 0; } -bool GnapEngine::scene51_isJumpingRight(int sequenceId) { +bool Scene51::isJumpingRight(int sequenceId) { return sequenceId >= 0x76 && sequenceId <= 0x95; } -bool GnapEngine::scene51_isJumpingLeft(int sequenceId) { +bool Scene51::isJumpingLeft(int sequenceId) { return sequenceId >= 0x96 && sequenceId <= 0xB5; } -bool GnapEngine::scene51_isJumping(int sequenceId) { +bool Scene51::isJumping(int sequenceId) { return sequenceId >= 0x76 && sequenceId <= 0xB5; } -void GnapEngine::scene51_waitForAnim(int animationIndex) { - while (_gameSys->getAnimationStatus(animationIndex) != 2) { +void Scene51::waitForAnim(int animationIndex) { + while (_vm->_gameSys->getAnimationStatus(animationIndex) != 2) { // pollMessages(); - scene51_updateItemAnimations(); - gameUpdateTick(); + updateItemAnimations(); + _vm->gameUpdateTick(); } } -int GnapEngine::scene51_getPosRight(int sequenceId) { +int Scene51::getPosRight(int sequenceId) { static const int kRightPosTbl[] = { 131, 159, 178, 195, 203, 219, 238, 254, 246, 274, 293, 310, 318, 334, 353, 369, @@ -481,7 +511,7 @@ int GnapEngine::scene51_getPosRight(int sequenceId) { return -1; } -int GnapEngine::scene51_getPosLeft(int sequenceId) { +int Scene51::getPosLeft(int sequenceId) { static const int kLeftPosTbl[] = { 580, 566, 550, 536, 526, 504, 488, 469, 460, 446, 430, 416, 406, 384, 368, 349, @@ -494,14 +524,14 @@ int GnapEngine::scene51_getPosLeft(int sequenceId) { return -1; } -void GnapEngine::scene51_playIntroAnim() { +void Scene51::playIntroAnim() { int soundCtr = 0; _s51_platypusSequenceId = 0x76; _s51_platypusNextSequenceId = 0x76; for (int i = 0; i < 6; ++i) - scene51_clearItem(&_s51_items[i]); + clearItem(&_s51_items[i]); _s51_items[0]._currSequenceId = 0xBA; _s51_items[0]._x2 = 320; @@ -510,51 +540,48 @@ void GnapEngine::scene51_playIntroAnim() { _s51_items[0]._id = 249; _s51_items[0]._isCollision = true; - _gameSys->insertSequence(_s51_platypusSequenceId, 256, 0, 0, kSeqNone, 0, -179, 0); - _gameSys->insertSequence(0xBA, 249, 0, 0, kSeqNone, 0, _s51_items[0]._x, _s51_items[0]._y); - _gameSys->setAnimation(0xBA, 249, 1); - _gameSys->setAnimation(_s51_platypusSequenceId, 256, 0); + _vm->_gameSys->insertSequence(_s51_platypusSequenceId, 256, 0, 0, kSeqNone, 0, -179, 0); + _vm->_gameSys->insertSequence(0xBA, 249, 0, 0, kSeqNone, 0, _s51_items[0]._x, _s51_items[0]._y); + _vm->_gameSys->setAnimation(0xBA, 249, 1); + _vm->_gameSys->setAnimation(_s51_platypusSequenceId, 256, 0); while (_s51_platypusSequenceId < 0x80) { - scene51_waitForAnim(0); + waitForAnim(0); ++_s51_platypusNextSequenceId; - _gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); - _gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, -179, 0); + _vm->_gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); + _vm->_gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, -179, 0); _s51_platypusSequenceId = _s51_platypusNextSequenceId; ++soundCtr; if (soundCtr % 4 == 0) - playSound(214, false); + _vm->playSound(214, false); } _s51_platypusNextSequenceId = 0x75; while (_s51_platypusSequenceId != 0x84) { - scene51_waitForAnim(0); + waitForAnim(0); ++_s51_platypusNextSequenceId; int oldSequenceId = _s51_platypusNextSequenceId; - int v0 = scene51_checkCollision(_s51_platypusNextSequenceId); - _gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); - _gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, v0, 0); + int v0 = checkCollision(_s51_platypusNextSequenceId); + _vm->_gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); + _vm->_gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, v0, 0); _s51_platypusSequenceId = _s51_platypusNextSequenceId; if (v0) { _s51_platypusNextSequenceId = oldSequenceId; } else { ++soundCtr; if (soundCtr % 4 == 0) - playSound(214, false); + _vm->playSound(214, false); } } - - scene51_waitForAnim(0); - + waitForAnim(0); } -void GnapEngine::scene51_updateGuyAnimation() { - - if (!_timers[4]) { - _timers[4] = getRandom(20) + 60; +void Scene51::updateGuyAnimation() { + if (!_vm->_timers[4]) { + _vm->_timers[4] = _vm->getRandom(20) + 60; - switch (getRandom(5)) { + switch (_vm->getRandom(5)) { case 0: _s51_guyNextSequenceId = 0xC3; break; @@ -572,15 +599,13 @@ void GnapEngine::scene51_updateGuyAnimation() { break; } - _gameSys->insertSequence(_s51_guyNextSequenceId, 39, _s51_guySequenceId, 39, kSeqSyncWait, 0, 0, 0); + _vm->_gameSys->insertSequence(_s51_guyNextSequenceId, 39, _s51_guySequenceId, 39, kSeqSyncWait, 0, 0, 0); _s51_guySequenceId = _s51_guyNextSequenceId; _s51_guyNextSequenceId = -1; - } - } -int GnapEngine::scene51_incCashAmount(int sequenceId) { +int Scene51::incCashAmount(int sequenceId) { switch (sequenceId) { case 0xBD: _s51_cashAmount += 10; @@ -591,44 +616,44 @@ int GnapEngine::scene51_incCashAmount(int sequenceId) { break; case 0xB6: case 0xB7: - _s51_cashAmount -= 10 * getRandom(5) + 50; + _s51_cashAmount -= 10 * _vm->getRandom(5) + 50; if (_s51_cashAmount < 0) _s51_cashAmount = 0; break; } if (_s51_cashAmount > 1995) _s51_cashAmount = 1995; - scene51_updateCash(_s51_cashAmount); + updateCash(_s51_cashAmount); return _s51_cashAmount; } -void GnapEngine::scene51_winMinigame() { - scene51_updateCash(1995); - playSound(218, false); +void Scene51::winMinigame() { + updateCash(1995); + _vm->playSound(218, false); // TODO delayTicksA(1, 5); - _newSceneNum = 48; - invRemove(kItemBanana); + _vm->_newSceneNum = 48; + _vm->invRemove(kItemBanana); } -void GnapEngine::scene51_playCashAppearAnim() { - _gameSys->setAnimation(0xC8, 252, 0); - _gameSys->insertSequence(0xC8, 252, 0, 0, kSeqNone, 0, -20, -20); - while (_gameSys->getAnimationStatus(0) != 2) { - gameUpdateTick(); +void Scene51::playCashAppearAnim() { + _vm->_gameSys->setAnimation(0xC8, 252, 0); + _vm->_gameSys->insertSequence(0xC8, 252, 0, 0, kSeqNone, 0, -20, -20); + while (_vm->_gameSys->getAnimationStatus(0) != 2) { + _vm->gameUpdateTick(); // checkGameAppStatus(); } } -void GnapEngine::scene51_updateCash(int amount) { - scene51_drawDigit(amount / 1000, 0); - scene51_drawDigit(amount / 100 % 10, 1); - scene51_drawDigit(amount / 10 % 10, 2); - scene51_drawDigit(amount % 10, 3); +void Scene51::updateCash(int amount) { + drawDigit(amount / 1000, 0); + drawDigit(amount / 100 % 10, 1); + drawDigit(amount / 10 % 10, 2); + drawDigit(amount % 10, 3); } -void GnapEngine::scene51_drawDigit(int digit, int position) { +void Scene51::drawDigit(int digit, int position) { if (digit != _s51_digits[position]) { - _gameSys->insertSequence(kDigitSequenceIds[digit], 253, + _vm->_gameSys->insertSequence(kDigitSequenceIds[digit], 253, _s51_digitSequenceIds[position], 253, kSeqSyncWait, 0, kDigitPositions[position] - 20, -20); _s51_digitSequenceIds[position] = kDigitSequenceIds[digit]; @@ -636,44 +661,42 @@ void GnapEngine::scene51_drawDigit(int digit, int position) { } } -void GnapEngine::scene51_initCashDisplay() { +void Scene51::initCashDisplay() { for (int position = 0; position < 4; ++position) { _s51_digits[position] = 0; _s51_digitSequenceIds[position] = kDigitSequenceIds[0]; - _gameSys->insertSequence(kDigitSequenceIds[0], 253, 0, 0, + _vm->_gameSys->insertSequence(kDigitSequenceIds[0], 253, 0, 0, kSeqNone, 0, kDigitPositions[position] - 20, -20); } _s51_cashAmount = 0; } -void GnapEngine::scene51_run() { - +void Scene51::run() { int soundCtr = 0; bool isIdle = true; _s51_itemsCtr = 0; - _newSceneNum = _prevSceneNum; + _vm->_newSceneNum = _vm->_prevSceneNum; _s51_cashAmount = 0; _s51_platypusJumpSequenceId = 0x84; - endSceneInit(); + _vm->endSceneInit(); - hideCursor(); - setGrabCursorSprite(-1); + _vm->hideCursor(); + _vm->setGrabCursorSprite(-1); _s51_guySequenceId = 0xC3; _s51_guyNextSequenceId = -1; - _gameSys->insertSequence(0xC3, 39, 0, 0, kSeqNone, 0, 0, 0); + _vm->_gameSys->insertSequence(0xC3, 39, 0, 0, kSeqNone, 0, 0, 0); + _vm->_timers[4] = _vm->getRandom(20) + 60; - _timers[4] = getRandom(20) + 60; - - scene51_playCashAppearAnim(); - scene51_initCashDisplay(); - scene51_playIntroAnim(); + playCashAppearAnim(); + initCashDisplay(); + playIntroAnim(); _s51_platypusNextSequenceId = 0x74; - _gameSys->setAnimation(0x74, 256, 0); - _gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosRight(_s51_platypusJumpSequenceId) - 362, 0); + _vm->_gameSys->setAnimation(0x74, 256, 0); + _vm->_gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosRight(_s51_platypusJumpSequenceId) - 362, 0); _s51_platypusSequenceId = _s51_platypusNextSequenceId; _s51_itemInsertDirection = 0; @@ -682,55 +705,53 @@ void GnapEngine::scene51_run() { _s51_nextDropItemKind = 0; for (int i = 0; i < 6; ++i) - scene51_clearItem(&_s51_items[i]); - - _s51_itemInsertX = getRandom(556) + 129; + clearItem(&_s51_items[i]); - _timers[0] = 15; + _s51_itemInsertX = _vm->getRandom(556) + 129; + _vm->_timers[0] = 15; _s51_itemsCaughtCtr = 0; _s51_dropLoseCash = false; _s51_itemsCtr1 = 20; - clearKeyStatus1(Common::KEYCODE_RIGHT); - clearKeyStatus1(Common::KEYCODE_LEFT); - clearKeyStatus1(Common::KEYCODE_UP); - clearKeyStatus1(Common::KEYCODE_SPACE); - clearKeyStatus1(Common::KEYCODE_ESCAPE); + _vm->clearKeyStatus1(Common::KEYCODE_RIGHT); + _vm->clearKeyStatus1(Common::KEYCODE_LEFT); + _vm->clearKeyStatus1(Common::KEYCODE_UP); + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + _vm->clearKeyStatus1(Common::KEYCODE_ESCAPE); bool isCollision = false; bool startWalk = true; - while (!_sceneDone) { + while (!_vm->_sceneDone) { + if (_vm->sceneXX_sub_4466B1()) + _vm->_sceneDone = true; - if (sceneXX_sub_4466B1()) - _sceneDone = true; + _vm->gameUpdateTick(); - gameUpdateTick(); + updateGuyAnimation(); + dropNextItem(); + updateItemAnimations(); - scene51_updateGuyAnimation(); - scene51_dropNextItem(); - scene51_updateItemAnimations(); - - if (isKeyStatus2(Common::KEYCODE_UP) || isKeyStatus2(Common::KEYCODE_SPACE)) { - clearKeyStatus1(Common::KEYCODE_UP); - clearKeyStatus1(Common::KEYCODE_SPACE); - if (scene51_isJumpingRight(_s51_platypusJumpSequenceId)) { - scene51_waitForAnim(0); - _gameSys->setAnimation(0xB8, 256, 0); - _gameSys->insertSequence(0xB8, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosRight(_s51_platypusJumpSequenceId) - 348, 0); + if (_vm->isKeyStatus2(Common::KEYCODE_UP) || _vm->isKeyStatus2(Common::KEYCODE_SPACE)) { + _vm->clearKeyStatus1(Common::KEYCODE_UP); + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + if (isJumpingRight(_s51_platypusJumpSequenceId)) { + waitForAnim(0); + _vm->_gameSys->setAnimation(0xB8, 256, 0); + _vm->_gameSys->insertSequence(0xB8, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosRight(_s51_platypusJumpSequenceId) - 348, 0); _s51_platypusSequenceId = 0xB8; - scene51_waitForAnim(0); + waitForAnim(0); _s51_platypusNextSequenceId += 6; if (_s51_platypusNextSequenceId > 0x95) _s51_platypusNextSequenceId = 0x95; _s51_platypusJumpSequenceId = _s51_platypusNextSequenceId; } else { - scene51_waitForAnim(0); - _gameSys->setAnimation(0xB9, 256, 0); - _gameSys->insertSequence(0xB9, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosLeft(_s51_platypusJumpSequenceId) - 338, 0); + waitForAnim(0); + _vm->_gameSys->setAnimation(0xB9, 256, 0); + _vm->_gameSys->insertSequence(0xB9, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosLeft(_s51_platypusJumpSequenceId) - 338, 0); _s51_platypusSequenceId = 0xB9; - scene51_waitForAnim(0); + waitForAnim(0); _s51_platypusNextSequenceId += 6; if (_s51_platypusNextSequenceId > 0xB5) _s51_platypusNextSequenceId = 0xB5; @@ -739,22 +760,22 @@ void GnapEngine::scene51_run() { isIdle = false; } - while (isKeyStatus2(Common::KEYCODE_RIGHT) && _s51_platypusNextSequenceId != 0x96) { + while (_vm->isKeyStatus2(Common::KEYCODE_RIGHT) && _s51_platypusNextSequenceId != 0x96) { // pollMessages(); if (_s51_platypusNextSequenceId == 0xB6) _s51_platypusNextSequenceId = 0x76; - scene51_updateItemAnimations(); + updateItemAnimations(); if (startWalk) { _s51_platypusNextSequenceId = 0x86; startWalk = false; } - if (_gameSys->getAnimationStatus(0) == 2) { - int collisionX = scene51_checkCollision(_s51_platypusNextSequenceId); + if (_vm->_gameSys->getAnimationStatus(0) == 2) { + int collisionX = checkCollision(_s51_platypusNextSequenceId); if (collisionX) - scene51_incCashAmount(_s51_platypusNextSequenceId); - _gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); - _gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, collisionX, 0); + incCashAmount(_s51_platypusNextSequenceId); + _vm->_gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); + _vm->_gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, collisionX, 0); _s51_platypusSequenceId = _s51_platypusNextSequenceId; if (collisionX) { isCollision = true; @@ -763,17 +784,17 @@ void GnapEngine::scene51_run() { } else { _s51_platypusJumpSequenceId = _s51_platypusNextSequenceId; } - if (scene51_isJumpingRight(_s51_platypusJumpSequenceId)) { + if (isJumpingRight(_s51_platypusJumpSequenceId)) { ++_s51_platypusNextSequenceId; if (!isCollision) { - if (isKeyStatus2(Common::KEYCODE_UP) || isKeyStatus2(Common::KEYCODE_SPACE)) { - clearKeyStatus1(Common::KEYCODE_UP); - clearKeyStatus1(Common::KEYCODE_SPACE); - scene51_waitForAnim(0); - _gameSys->setAnimation(0xB8, 256, 0); - _gameSys->insertSequence(0xB8, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosRight(_s51_platypusJumpSequenceId) - 348, 0); + if (_vm->isKeyStatus2(Common::KEYCODE_UP) || _vm->isKeyStatus2(Common::KEYCODE_SPACE)) { + _vm->clearKeyStatus1(Common::KEYCODE_UP); + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + waitForAnim(0); + _vm->_gameSys->setAnimation(0xB8, 256, 0); + _vm->_gameSys->insertSequence(0xB8, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosRight(_s51_platypusJumpSequenceId) - 348, 0); _s51_platypusSequenceId = 0xB8; - scene51_waitForAnim(0); + waitForAnim(0); _s51_platypusNextSequenceId += 6; if (_s51_platypusNextSequenceId > 0x95) _s51_platypusNextSequenceId = 0x95; @@ -781,7 +802,7 @@ void GnapEngine::scene51_run() { } else { ++soundCtr; if (soundCtr % 4 == 0) - playSound(214, false); + _vm->playSound(214, false); } } } else { @@ -790,23 +811,23 @@ void GnapEngine::scene51_run() { isCollision = false; isIdle = false; } - gameUpdateTick(); + _vm->gameUpdateTick(); } - while (isKeyStatus2(Common::KEYCODE_LEFT) && _s51_platypusNextSequenceId != 0xB6) { + while (_vm->isKeyStatus2(Common::KEYCODE_LEFT) && _s51_platypusNextSequenceId != 0xB6) { // pollMessages(); - scene51_updateItemAnimations(); + updateItemAnimations(); if (startWalk) { _s51_platypusNextSequenceId = 0xA5; startWalk = false; } - if (_gameSys->getAnimationStatus(0) == 2) { - int collisionX = scene51_checkCollision(_s51_platypusNextSequenceId); + if (_vm->_gameSys->getAnimationStatus(0) == 2) { + int collisionX = checkCollision(_s51_platypusNextSequenceId); if (collisionX) - scene51_incCashAmount(_s51_platypusNextSequenceId); - _gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); - _gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, collisionX, 0); + incCashAmount(_s51_platypusNextSequenceId); + _vm->_gameSys->setAnimation(_s51_platypusNextSequenceId, 256, 0); + _vm->_gameSys->insertSequence(_s51_platypusNextSequenceId, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, collisionX, 0); _s51_platypusSequenceId = _s51_platypusNextSequenceId; if (collisionX) { isCollision = true; @@ -815,17 +836,17 @@ void GnapEngine::scene51_run() { } else { _s51_platypusJumpSequenceId = _s51_platypusNextSequenceId; } - if (scene51_isJumpingLeft(_s51_platypusJumpSequenceId)) { + if (isJumpingLeft(_s51_platypusJumpSequenceId)) { ++_s51_platypusNextSequenceId; if (!isCollision) { - if (isKeyStatus2(Common::KEYCODE_UP) || isKeyStatus2(Common::KEYCODE_SPACE)) { - clearKeyStatus1(Common::KEYCODE_UP); - clearKeyStatus1(Common::KEYCODE_SPACE); - scene51_waitForAnim(0); - _gameSys->setAnimation(0xB9, 256, 0); - _gameSys->insertSequence(0xB9, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosLeft(_s51_platypusJumpSequenceId) - 338, 0); + if (_vm->isKeyStatus2(Common::KEYCODE_UP) || _vm->isKeyStatus2(Common::KEYCODE_SPACE)) { + _vm->clearKeyStatus1(Common::KEYCODE_UP); + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + waitForAnim(0); + _vm->_gameSys->setAnimation(0xB9, 256, 0); + _vm->_gameSys->insertSequence(0xB9, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosLeft(_s51_platypusJumpSequenceId) - 338, 0); _s51_platypusSequenceId = 0xB9; - scene51_waitForAnim(0); + waitForAnim(0); _s51_platypusNextSequenceId += 6; if (_s51_platypusNextSequenceId > 0xB5) _s51_platypusNextSequenceId = 0xB5; @@ -833,7 +854,7 @@ void GnapEngine::scene51_run() { } else { ++soundCtr; if (soundCtr % 4 == 0) - playSound(214, false); + _vm->playSound(214, false); } } } else { @@ -842,37 +863,35 @@ void GnapEngine::scene51_run() { isCollision = false; isIdle = false; } - gameUpdateTick(); + _vm->gameUpdateTick(); } - if (!isIdle && _gameSys->getAnimationStatus(0) == 2) { - if (scene51_isJumpingRight(_s51_platypusJumpSequenceId)) { - _gameSys->setAnimation(0x74, 256, 0); - _gameSys->insertSequence(0x74, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosRight(_s51_platypusJumpSequenceId) - 362, 0); + if (!isIdle && _vm->_gameSys->getAnimationStatus(0) == 2) { + if (isJumpingRight(_s51_platypusJumpSequenceId)) { + _vm->_gameSys->setAnimation(0x74, 256, 0); + _vm->_gameSys->insertSequence(0x74, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosRight(_s51_platypusJumpSequenceId) - 362, 0); _s51_platypusSequenceId = 0x74; } else { - _gameSys->setAnimation(0x75, 256, 0); - _gameSys->insertSequence(0x75, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, scene51_getPosLeft(_s51_platypusJumpSequenceId) - 341, 0); + _vm->_gameSys->setAnimation(0x75, 256, 0); + _vm->_gameSys->insertSequence(0x75, 256, _s51_platypusSequenceId, 256, kSeqSyncWait, 0, getPosLeft(_s51_platypusJumpSequenceId) - 341, 0); _s51_platypusSequenceId = 0x75; } - scene51_waitForAnim(0); + waitForAnim(0); isIdle = true; } - } - clearKeyStatus1(Common::KEYCODE_ESCAPE); - clearKeyStatus1(Common::KEYCODE_UP); - clearKeyStatus1(Common::KEYCODE_SPACE); - clearKeyStatus1(Common::KEYCODE_RIGHT); - clearKeyStatus1(Common::KEYCODE_LEFT); + _vm->clearKeyStatus1(Common::KEYCODE_ESCAPE); + _vm->clearKeyStatus1(Common::KEYCODE_UP); + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + _vm->clearKeyStatus1(Common::KEYCODE_RIGHT); + _vm->clearKeyStatus1(Common::KEYCODE_LEFT); - _gameSys->setAnimation(0, 0, 0); + _vm->_gameSys->setAnimation(0, 0, 0); for (int i = 0; i < 6; ++i) - _gameSys->setAnimation(0, 0, i + 1); - - showCursor(); + _vm->_gameSys->setAnimation(0, 0, i + 1); + _vm->showCursor(); } } // End of namespace Gnap diff --git a/engines/gnap/scenes/scene51.h b/engines/gnap/scenes/scene51.h new file mode 100644 index 0000000000..44fbd3d4d1 --- /dev/null +++ b/engines/gnap/scenes/scene51.h @@ -0,0 +1,101 @@ +/* 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GNAP_SCENE51_H +#define GNAP_SCENE51_H + +#include "gnap/debugger.h" +#include "gnap/scenes/scenecore.h" + +namespace Gnap { + +class GnapEngine; + +struct Scene51Item { + int _currSequenceId; + int _droppedSequenceId; + int _x, _y; + int _collisionX; + bool _canCatch; + bool _isCollision; + int _x2; + int _id; +}; + +class Scene51: public Scene { +public: + Scene51(GnapEngine *vm); + ~Scene51() {} + + virtual int init(); + virtual void updateHotspots(); + virtual void run(); + virtual void updateAnimations() {}; + virtual void updateAnimationsCb() {}; + +private: + bool _s51_dropLoseCash; + + int _s51_cashAmount; + int _s51_digits[4]; + int _s51_digitSequenceIds[4]; + int _s51_guySequenceId; + int _s51_guyNextSequenceId; + int _s51_itemsCaughtCtr; + int _s51_dropSpeedTicks; + int _s51_nextDropItemKind; + int _s51_itemInsertX; + int _s51_itemInsertDirection; + int _s51_platypusSequenceId; + int _s51_platypusNextSequenceId; + int _s51_platypusJumpSequenceId; + int _s51_itemsCtr; + int _s51_itemsCtr1; + int _s51_itemsCtr2; + + Scene51Item _s51_items[6]; + + void clearItem(Scene51Item *item); + void dropNextItem(); + void updateItemAnimations(); + int checkCollision(int sequenceId); + void updateItemAnimation(Scene51Item *item, int index); + void removeCollidedItems(); + int itemIsCaught(Scene51Item *item); + bool isJumpingRight(int sequenceId); + bool isJumpingLeft(int sequenceId); + bool isJumping(int sequenceId); + void waitForAnim(int animationIndex); + int getPosRight(int sequenceId); + int getPosLeft(int sequenceId); + void playIntroAnim(); + void updateGuyAnimation(); + int incCashAmount(int sequenceId); + void winMinigame(); + void playCashAppearAnim(); + void updateCash(int amount); + void drawDigit(int digit, int position); + void initCashDisplay(); +}; + +} // End of namespace Gnap +#endif // GNAP_SCENE51_H diff --git a/engines/gnap/scenes/scene52.cpp b/engines/gnap/scenes/scene52.cpp index 3d74538b27..fb16184742 100644 --- a/engines/gnap/scenes/scene52.cpp +++ b/engines/gnap/scenes/scene52.cpp @@ -23,96 +23,103 @@ #include "gnap/gnap.h" #include "gnap/gamesys.h" #include "gnap/resource.h" +#include "gnap/scenes/scene52.h" namespace Gnap { -int GnapEngine::scene52_init() { - scene52_initAnims(); +Scene52::Scene52(GnapEngine *vm) : Scene(vm) { + _s52_gameScore = 0; + _s52_aliensInitialized = false; + _s52_alienDirection = 0; + _s52_soundToggle = false; +} + +int Scene52::init() { + initAnims(); return 0x2B; } -void GnapEngine::scene52_updateHotspots() { - _hotspotsCount = 0; +void Scene52::updateHotspots() { + _vm->_hotspotsCount = 0; } -void GnapEngine::scene52_update() { - +void Scene52::update() { for (int rowNum = 0; rowNum < 7; ++rowNum) { - gameUpdateTick(); - if (_gameSys->getAnimationStatus(_s52_alienRowAnims[rowNum]) == 2) { - scene52_updateAlienRow(rowNum); + _vm->gameUpdateTick(); + if (_vm->_gameSys->getAnimationStatus(_s52_alienRowAnims[rowNum]) == 2) { + updateAlienRow(rowNum); rowNum = 0; } } if (_s52_liveAlienRows == 0 && !_s52_alienSingle) { _s52_alienWave = false; - playSound(48, false); + _vm->playSound(48, false); ++_s52_alienCounter; if (_s52_alienCounter != 3) { - _timers[0] = 50; - _timers[2] = 100; + _vm->_timers[0] = 50; + _vm->_timers[2] = 100; _s52_alienRowDownCtr = 0; _s52_alienSingle = true; } } - if (_s52_alienSingle && !_timers[0]) { - scene52_initAliens(); + if (_s52_alienSingle && !_vm->_timers[0]) { + initAliens(); _s52_alienSingle = false; - _timers[2] = 5; + _vm->_timers[2] = 5; _s52_alienWave = true; } if ((_s52_alienRowDownCtr || _s52_liveAlienRows == 0) && !_s52_alienSingle) { - scene52_moveDownAlienRow(); + moveDownAlienRow(); _s52_alienRowDownCtr = 0; } - if (isKeyStatus1(Common::KEYCODE_UP) || isKeyStatus1(Common::KEYCODE_SPACE)) { - clearKeyStatus1(Common::KEYCODE_SPACE); - clearKeyStatus1(Common::KEYCODE_UP); + if (_vm->isKeyStatus1(Common::KEYCODE_UP) || _vm->isKeyStatus1(Common::KEYCODE_SPACE)) { + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + _vm->clearKeyStatus1(Common::KEYCODE_UP); if (!_s52_aliensCount) - scene52_fireShipCannon(_s52_shipPosX); + fireShipCannon(_s52_shipPosX); } if (_s52_shipCannonFiring) - scene52_updateShipCannon(); + updateShipCannon(); - scene52_fireAlienCannon(); - scene52_updateAlienCannons(); + fireAlienCannon(); + updateAlienCannons(); if (_s52_aliensCount == 1) { _s52_alienWave = false; - _timers[3] = 20; - _timers[2] = 100; + _vm->_timers[3] = 20; + _vm->_timers[2] = 100; ++_s52_aliensCount; } - if (_s52_aliensCount && !_timers[3]) { - scene52_updateAliens(); - scene52_loseShip(); + if (_s52_aliensCount && !_vm->_timers[3]) { + updateAliens(); + loseShip(); if (_s52_shipsLeft != 0) { - _timers[3] = 40; - while (_timers[3]) { - scene52_updateAlienCannons(); + _vm->_timers[3] = 40; + while (_vm->_timers[3]) { + updateAlienCannons(); if (_s52_shipCannonFiring) - scene52_updateShipCannon(); - gameUpdateTick(); + updateShipCannon(); + _vm->gameUpdateTick(); } - scene52_initAliens(); + initAliens(); _s52_shipPosX = (800 - _s52_shipMidX) / 2; - _gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); - _gameSys->insertSequence(_s52_nextUfoSequenceId, 256, 0, 0, kSeqNone, 0, _s52_shipPosX, _s52_arcadeScreenBottom); + _vm->_gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); + _vm->_gameSys->insertSequence(_s52_nextUfoSequenceId, 256, 0, 0, kSeqNone, 0, _s52_shipPosX, _s52_arcadeScreenBottom); _s52_ufoSequenceId = _s52_nextUfoSequenceId; - _timers[2] = 5; + _vm->_timers[2] = 5; _s52_alienWave = true; } else { - _sceneDone = true; + _vm->_sceneDone = true; } } - if (_timers[1] || scene52_getFreeShipCannon() == -1) { + if (_vm->_timers[1] || getFreeShipCannon() == -1) { _s52_nextUfoSequenceId = 34; if (_s52_ufoSequenceId != 34) _s52_shipFlag = true; @@ -123,35 +130,35 @@ void GnapEngine::scene52_update() { } if (_s52_shipFlag) { - if (_gameSys->getAnimationStatus(7) == 2) { - _gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); - _gameSys->insertSequence(_s52_nextUfoSequenceId, 256, _s52_ufoSequenceId, 256, kSeqSyncWait, 0, _s52_shipPosX, _s52_arcadeScreenBottom); + if (_vm->_gameSys->getAnimationStatus(7) == 2) { + _vm->_gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); + _vm->_gameSys->insertSequence(_s52_nextUfoSequenceId, 256, _s52_ufoSequenceId, 256, kSeqSyncWait, 0, _s52_shipPosX, _s52_arcadeScreenBottom); _s52_ufoSequenceId = _s52_nextUfoSequenceId; } _s52_shipFlag = false; } - if (_s52_alienWave && !_timers[0]) { - scene52_playSound(); + if (_s52_alienWave && !_vm->_timers[0]) { + playSound(); int v0 = _s52_alienSpeed; if (_s52_alienSpeed >= 10) v0 = 10; int v1 = v0; if (v0 < 2) v1 = 2; - _timers[0] = v1; + _vm->_timers[0] = v1; } } -void GnapEngine::scene52_initShipCannon(int bottomY) { +void Scene52::initShipCannon(int bottomY) { _s52_shipCannonFired = false; - _s52_shipCannonWidth = MAX(_gameSys->getSpriteWidthById(14), _gameSys->getSpriteWidthById(16)); - _s52_shipCannonHeight = MAX(_gameSys->getSpriteHeightById(14), _gameSys->getSpriteHeightById(16)); + _s52_shipCannonWidth = MAX(_vm->_gameSys->getSpriteWidthById(14), _vm->_gameSys->getSpriteWidthById(16)); + _s52_shipCannonHeight = MAX(_vm->_gameSys->getSpriteHeightById(14), _vm->_gameSys->getSpriteHeightById(16)); _s52_shipCannonTopY = bottomY - _s52_shipCannonHeight; _s52_shipCannonFiring = false; } -void GnapEngine::scene52_initAlienCannons() { +void Scene52::initAlienCannons() { for (int i = 0; i < 3; ++i) { _s52_alienCannonIds[i] = 0; _s52_alienCannonFired[i] = 0; @@ -161,117 +168,112 @@ void GnapEngine::scene52_initAlienCannons() { _s52_alienCannonSequenceIds[2] = 32; } -void GnapEngine::scene52_fireShipCannon(int posX) { - - if (_timers[1]) +void Scene52::fireShipCannon(int posX) { + if (_vm->_timers[1]) return; - int cannonNum = scene52_getFreeShipCannon(); + int cannonNum = getFreeShipCannon(); if (cannonNum != -1) { _s52_shipCannonPosX = _s52_shipMidX / 2 + posX - _s52_shipCannonWidth / 2; _s52_shipCannonPosY = _s52_shipCannonTopY; - _gameSys->setAnimation(0x23, cannonNum + 256, cannonNum + 8); - _gameSys->insertSequence(0x23, cannonNum + 256, 0, 0, kSeqNone, 0, _s52_shipCannonPosX, _s52_shipCannonPosY); - playSound(0x2D, false); - if (scene52_shipCannonHitShield(cannonNum)) { - _gameSys->setAnimation(0, 0, cannonNum + 8); - _gameSys->removeSequence(0x23, cannonNum + 256, true); + _vm->_gameSys->setAnimation(0x23, cannonNum + 256, cannonNum + 8); + _vm->_gameSys->insertSequence(0x23, cannonNum + 256, 0, 0, kSeqNone, 0, _s52_shipCannonPosX, _s52_shipCannonPosY); + _vm->playSound(0x2D, false); + if (shipCannonHitShield(cannonNum)) { + _vm->_gameSys->setAnimation(0, 0, cannonNum + 8); + _vm->_gameSys->removeSequence(0x23, cannonNum + 256, true); } else { _s52_shipCannonFired = true; _s52_shipCannonPosY -= 13; _s52_shipCannonFiring = true; } - _timers[1] = 5; + _vm->_timers[1] = 5; } - } -void GnapEngine::scene52_fireAlienCannon() { - - if (_timers[2]) +void Scene52::fireAlienCannon() { + if (_vm->_timers[2]) return; - int cannonNum = scene52_getFreeAlienCannon(); + int cannonNum = getFreeAlienCannon(); if (cannonNum != -1) { int alienX1 = _s52_alienLeftX + _s52_alienRowXOfs[0]; int alienX2 = _s52_alienLeftX + _s52_alienRowXOfs[0] + 5 * _s52_alienWidth - (_s52_alienWidth / 2 - 15); - _s52_alienCannonPosX[cannonNum] = getRandom(alienX2 - alienX1) + alienX1; + _s52_alienCannonPosX[cannonNum] = _vm->getRandom(alienX2 - alienX1) + alienX1; _s52_alienCannonPosY[cannonNum] = 104; _s52_alienCannonFired[cannonNum] = 1; - _gameSys->setAnimation(_s52_alienCannonSequenceIds[cannonNum], _s52_alienCannonIds[cannonNum] + 256, cannonNum + 9); - _gameSys->insertSequence(_s52_alienCannonSequenceIds[cannonNum], _s52_alienCannonIds[cannonNum] + 256, 0, 0, + _vm->_gameSys->setAnimation(_s52_alienCannonSequenceIds[cannonNum], _s52_alienCannonIds[cannonNum] + 256, cannonNum + 9); + _vm->_gameSys->insertSequence(_s52_alienCannonSequenceIds[cannonNum], _s52_alienCannonIds[cannonNum] + 256, 0, 0, kSeqNone, 0, _s52_alienCannonPosX[cannonNum], _s52_alienCannonPosY[cannonNum]); _s52_alienCannonPosY[cannonNum] -= 13; - _timers[2] = 5; + _vm->_timers[2] = 5; } - } -int GnapEngine::scene52_getFreeShipCannon() { +int Scene52::getFreeShipCannon() { if (!_s52_shipCannonFired) return 0; return -1; } -int GnapEngine::scene52_getFreeAlienCannon() { +int Scene52::getFreeAlienCannon() { for (int i = 0; i < 3; ++i) if (!_s52_alienCannonFired[i]) return i; return -1; } -void GnapEngine::scene52_updateShipCannon() { - if (_s52_shipCannonFired && _gameSys->getAnimationStatus(8) == 2) { +void Scene52::updateShipCannon() { + if (_s52_shipCannonFired && _vm->_gameSys->getAnimationStatus(8) == 2) { _s52_shipCannonPosY -= 13; if (_s52_shipCannonPosY - 13 >= 135) { - if (scene52_updateHitAlien()) { - _gameSys->setAnimation(0, 0, 8); - _gameSys->removeSequence(35, 256, true); + if (updateHitAlien()) { + _vm->_gameSys->setAnimation(0, 0, 8); + _vm->_gameSys->removeSequence(35, 256, true); _s52_shipCannonFired = false; - scene52_drawScore(_s52_gameScore); + drawScore(_s52_gameScore); } else { - _gameSys->setAnimation(35, 256, 8); - _gameSys->insertSequence(35, 256, 35, 256, kSeqSyncWait, 0, _s52_shipCannonPosX, _s52_shipCannonPosY); + _vm->_gameSys->setAnimation(35, 256, 8); + _vm->_gameSys->insertSequence(35, 256, 35, 256, kSeqSyncWait, 0, _s52_shipCannonPosX, _s52_shipCannonPosY); _s52_shipCannonPosY -= 13; } } else { - _gameSys->setAnimation(0, 0, 8); - _gameSys->removeSequence(35, 256, true); + _vm->_gameSys->setAnimation(0, 0, 8); + _vm->_gameSys->removeSequence(35, 256, true); _s52_shipCannonFired = false; } } } -void GnapEngine::scene52_updateAlienCannons() { +void Scene52::updateAlienCannons() { for (int i = 0; i < 3; ++i) { - if (_s52_alienCannonFired[i] && _gameSys->getAnimationStatus(i + 9) == 2) { + if (_s52_alienCannonFired[i] && _vm->_gameSys->getAnimationStatus(i + 9) == 2) { _s52_alienCannonPosY[i] += 13; if (_s52_shipCannonHeight + _s52_alienCannonPosY[i] + 13 <= 550) { - if (scene52_alienCannonHitShip(i)) { - _gameSys->setAnimation(0, 0, i + 9); + if (alienCannonHitShip(i)) { + _vm->_gameSys->setAnimation(0, 0, i + 9); _s52_alienCannonFired[i] = 0; - scene52_shipExplode(); - } else if (scene52_alienCannonHitShield(i)) { + shipExplode(); + } else if (alienCannonHitShield(i)) { _s52_alienCannonFired[i] = 0; } else { - _gameSys->insertSequence(_s52_alienCannonSequenceIds[i], 1 - _s52_alienCannonIds[i] + 256, 0, 0, + _vm->_gameSys->insertSequence(_s52_alienCannonSequenceIds[i], 1 - _s52_alienCannonIds[i] + 256, 0, 0, kSeqNone, 0, _s52_alienCannonPosX[i], _s52_alienCannonPosY[i]); - _gameSys->setAnimation(_s52_alienCannonSequenceIds[i], 1 - _s52_alienCannonIds[i] + 256, i + 9); + _vm->_gameSys->setAnimation(_s52_alienCannonSequenceIds[i], 1 - _s52_alienCannonIds[i] + 256, i + 9); _s52_alienCannonIds[i] = 1 - _s52_alienCannonIds[i]; _s52_alienCannonPosY[i] += 13; } } else { - _gameSys->setAnimation(0, 0, i + 9); + _vm->_gameSys->setAnimation(0, 0, i + 9); _s52_alienCannonFired[i] = 0; } } } } -void GnapEngine::scene52_initAliens() { - +void Scene52::initAliens() { if (!_s52_aliensInitialized) { - scene52_initAlienSize(); + initAlienSize(); _s52_aliensInitialized = true; } @@ -282,91 +284,88 @@ void GnapEngine::scene52_initAliens() { _s52_alienSingle = false; _s52_alienRowDownCtr = 0; - scene52_initShields(); + initShields(); _s52_alienRowKind[0] = -1; _s52_alienRowKind[1] = -1; _s52_alienRowKind[2] = -1; _s52_alienRowKind[3] = -1; - _s52_alienRowKind[4] = getRandom(2) != 0 ? 24 : 27; - _s52_alienRowKind[5] = getRandom(2) != 0 ? 25 : 28; - _s52_alienRowKind[6] = getRandom(2) != 0 ? 26 : 29; + _s52_alienRowKind[4] = _vm->getRandom(2) != 0 ? 24 : 27; + _s52_alienRowKind[5] = _vm->getRandom(2) != 0 ? 25 : 28; + _s52_alienRowKind[6] = _vm->getRandom(2) != 0 ? 26 : 29; for (int i = 0; i < 7; ++i) { _s52_alienRowAnims[i] = i; _s52_alienRowXOfs[i] = 0; - scene52_initAlienRowKind(i, _s52_alienRowKind[i]); - scene52_insertAlienRow(i); + initAlienRowKind(i, _s52_alienRowKind[i]); + insertAlienRow(i); } - } -void GnapEngine::scene52_initAlienRowKind(int rowNum, int alienKind) { +void Scene52::initAlienRowKind(int rowNum, int alienKind) { for (int i = 0; i < 5; ++i) _s52_items[rowNum][i] = alienKind; } -void GnapEngine::scene52_insertAlienRow(int rowNum) { +void Scene52::insertAlienRow(int rowNum) { if (_s52_alienRowKind[rowNum] >= 0) { - scene52_insertAlienRowAliens(rowNum); + insertAlienRowAliens(rowNum); _s52_alienRowIds[rowNum] = 256; - _gameSys->setAnimation(_s52_alienRowKind[rowNum], _s52_alienRowIds[rowNum], _s52_alienRowAnims[rowNum]); + _vm->_gameSys->setAnimation(_s52_alienRowKind[rowNum], _s52_alienRowIds[rowNum], _s52_alienRowAnims[rowNum]); ++_s52_liveAlienRows; } } -void GnapEngine::scene52_insertAlienRowAliens(int rowNum) { +void Scene52::insertAlienRowAliens(int rowNum) { int xOffs = _s52_alienLeftX; int yOffs = _s52_alienTopY - 52 * rowNum - _s52_alienHeight + 10; for (int i = 0; i < 5; ++i) { if (_s52_items[rowNum][i] >= 0) { - _gameSys->insertSequence(_s52_items[rowNum][i], i + 256, 0, 0, kSeqNone, 0, xOffs, yOffs); + _vm->_gameSys->insertSequence(_s52_items[rowNum][i], i + 256, 0, 0, kSeqNone, 0, xOffs, yOffs); ++_s52_alienSpeed; } xOffs += _s52_alienWidth; } } -void GnapEngine::scene52_updateAlienRow(int rowNum) { - - if (_s52_alienRowKind[rowNum] != -1 && !scene52_checkAlienRow(rowNum)) { - scene52_updateAlienRowXOfs(); +void Scene52::updateAlienRow(int rowNum) { + if (_s52_alienRowKind[rowNum] != -1 && !checkAlienRow(rowNum)) { + updateAlienRowXOfs(); _s52_alienRowIds[rowNum] = -1; int xOffs = _s52_alienLeftX + _s52_alienRowXOfs[rowNum]; int yOffs = _s52_alienTopY - 52 * rowNum - _s52_alienHeight + 10; for (int i = 0; i < 5; ++i) { if (_s52_items[rowNum][i] >= 0) { - _gameSys->insertSequence(_s52_items[rowNum][i], i + 256, _s52_items[rowNum][i], i + 256, kSeqSyncWait, 0, xOffs, yOffs); + _vm->_gameSys->insertSequence(_s52_items[rowNum][i], i + 256, _s52_items[rowNum][i], i + 256, kSeqSyncWait, 0, xOffs, yOffs); if (_s52_alienRowIds[rowNum] == -1) _s52_alienRowIds[rowNum] = i + 256; } else if (_s52_items[rowNum][i] == -2) { - _gameSys->removeSequence(_s52_alienRowKind[rowNum], i + 256, true); + _vm->_gameSys->removeSequence(_s52_alienRowKind[rowNum], i + 256, true); _s52_items[rowNum][i] = -1; --_s52_alienSpeed; } xOffs += _s52_alienWidth; } if (_s52_alienRowIds[rowNum] == -1) { - _gameSys->setAnimation(0, 0, _s52_alienRowAnims[rowNum]); + _vm->_gameSys->setAnimation(0, 0, _s52_alienRowAnims[rowNum]); // MessageBoxA(0, "No live aliens!", "Error 3:", 0x30u); } else { - _gameSys->setAnimation(_s52_alienRowKind[rowNum], _s52_alienRowIds[rowNum], _s52_alienRowAnims[rowNum]); + _vm->_gameSys->setAnimation(_s52_alienRowKind[rowNum], _s52_alienRowIds[rowNum], _s52_alienRowAnims[rowNum]); } if (rowNum == 1) { for (int j = 0; j < 3; ++j) { if (_s52_shieldSpriteIds[j] != -1) { - _gameSys->fillSurface(0, _s52_shieldPosX[j], _s52_arcadeScreenBottom - 44, 33, 44, 0, 0, 0); + _vm->_gameSys->fillSurface(0, _s52_shieldPosX[j], _s52_arcadeScreenBottom - 44, 33, 44, 0, 0, 0); _s52_shieldSpriteIds[j] = -1; } } } if (rowNum == 0 && _s52_bottomAlienFlag) - scene52_shipExplode(); + shipExplode(); } } -void GnapEngine::scene52_moveDownAlienRow() { - +void Scene52::moveDownAlienRow() { int v2[5], v3, v1, v0, v4; for (int i = 0; i < 5; ++i) @@ -394,14 +393,14 @@ void GnapEngine::scene52_moveDownAlienRow() { _s52_alienRowKind[6] = v0; _s52_alienRowXOfs[6] = v4; - scene52_updateAlien(6); - scene52_initAlienRowKind(6, _s52_alienRowKind[6]); - scene52_insertAlienRow(6); + updateAlien(6); + initAlienRowKind(6, _s52_alienRowKind[6]); + insertAlienRow(6); _s52_bottomAlienFlag = _s52_alienRowKind[0] > -1; } -int GnapEngine::scene52_updateHitAlien() { +int Scene52::updateHitAlien() { int result = 0, rowNum, ya; int y = _s52_shipCannonTopY - _s52_shipCannonPosY; @@ -417,12 +416,12 @@ int GnapEngine::scene52_updateHitAlien() { } if (rowNum < 7) { - int hitAlienNum = scene52_getHitAlienNum(rowNum); + int hitAlienNum = getHitAlienNum(rowNum); if (hitAlienNum != -1 && _s52_items[rowNum][hitAlienNum] >= 0) { _s52_gameScore = ((_s52_items[rowNum][hitAlienNum] - 24) % 3 + _s52_gameScore + 1) % 1000; _s52_items[rowNum][hitAlienNum] = -2; - playSound(44, false); - _gameSys->insertSequence(0x21, 266, 0, 0, + _vm->playSound(44, false); + _vm->_gameSys->insertSequence(0x21, 266, 0, 0, kSeqNone, 0, _s52_alienLeftX + hitAlienNum * _s52_alienWidth + _s52_alienRowXOfs[rowNum] - 10, ya - _s52_alienHeight); result = 1; } @@ -431,8 +430,7 @@ int GnapEngine::scene52_updateHitAlien() { return result; } -int GnapEngine::scene52_getHitAlienNum(int rowNum) { - +int Scene52::getHitAlienNum(int rowNum) { int result = -1; int v3 = _s52_alienLeftX + _s52_alienRowXOfs[rowNum]; @@ -473,7 +471,7 @@ int GnapEngine::scene52_getHitAlienNum(int rowNum) { return result; } -int GnapEngine::scene52_alienCannonHitShip(int cannonNum) { +int Scene52::alienCannonHitShip(int cannonNum) { int result = 0; if (_s52_aliensCount) { @@ -496,7 +494,7 @@ int GnapEngine::scene52_alienCannonHitShip(int cannonNum) { return result; } -int GnapEngine::scene52_alienCannonHitShield(int cannonNum) { +int Scene52::alienCannonHitShield(int cannonNum) { int result = 0; int v3 = _s52_alienCannonPosY[cannonNum] + 39; @@ -533,21 +531,21 @@ int GnapEngine::scene52_alienCannonHitShield(int cannonNum) { } else { ++_s52_shieldSpriteIds[shieldNum]; if (_s52_shieldSpriteIds[shieldNum] <= 21) { - _gameSys->drawSpriteToBackground(_s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, _s52_shieldSpriteIds[shieldNum]); + _vm->_gameSys->drawSpriteToBackground(_s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, _s52_shieldSpriteIds[shieldNum]); } else { - _gameSys->fillSurface(0, _s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, 33, 44, 0, 0, 0); + _vm->_gameSys->fillSurface(0, _s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, 33, 44, 0, 0, 0); _s52_shieldSpriteIds[shieldNum] = -1; } - _gameSys->setAnimation(0, 0, cannonNum + 9); - _gameSys->insertSequence(0x21, shieldNum + 257, 0, 0, kSeqNone, 0, _s52_alienCannonPosX[cannonNum] - 18, _s52_arcadeScreenBottom - 44); - playSound(0x2C, false); + _vm->_gameSys->setAnimation(0, 0, cannonNum + 9); + _vm->_gameSys->insertSequence(0x21, shieldNum + 257, 0, 0, kSeqNone, 0, _s52_alienCannonPosX[cannonNum] - 18, _s52_arcadeScreenBottom - 44); + _vm->playSound(0x2C, false); result = 1; } return result; } -bool GnapEngine::scene52_shipCannonHitShield(int cannonNum) { +bool Scene52::shipCannonHitShield(int cannonNum) { bool result = false; if (_s52_shipCannonPosX < _s52_shieldPosX[0]) @@ -577,23 +575,23 @@ bool GnapEngine::scene52_shipCannonHitShield(int cannonNum) { } else { ++_s52_shieldSpriteIds[shieldNum]; if (_s52_shieldSpriteIds[shieldNum] <= 21) { - _gameSys->drawSpriteToBackground(_s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, _s52_shieldSpriteIds[shieldNum]); + _vm->_gameSys->drawSpriteToBackground(_s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, _s52_shieldSpriteIds[shieldNum]); } else { - _gameSys->fillSurface(0, _s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, 33, 44, 0, 0, 0); + _vm->_gameSys->fillSurface(0, _s52_shieldPosX[shieldNum], _s52_arcadeScreenBottom - 44, 33, 44, 0, 0, 0); _s52_shieldSpriteIds[shieldNum] = -1; } - _gameSys->insertSequence(0x21, shieldNum + 257, 0, 0, kSeqNone, 0, _s52_shipCannonPosX - 18, _s52_arcadeScreenBottom - 44); - playSound(0x2C, false); + _vm->_gameSys->insertSequence(0x21, shieldNum + 257, 0, 0, kSeqNone, 0, _s52_shipCannonPosX - 18, _s52_arcadeScreenBottom - 44); + _vm->playSound(0x2C, false); result = true; } return result; } -bool GnapEngine::scene52_shipCannonHitAlien() { +bool Scene52::shipCannonHitAlien() { bool result = false; - if (_s52_aliensCount || scene52_checkAlienRow(0)) + if (_s52_aliensCount || checkAlienRow(0)) return false; int alienNextX = _s52_alienLeftX + _s52_alienRowXOfs[0]; @@ -632,18 +630,18 @@ bool GnapEngine::scene52_shipCannonHitAlien() { return result; } -void GnapEngine::scene52_shipExplode() { +void Scene52::shipExplode() { if (!_s52_aliensCount) { - _gameSys->setAnimation(0, 0, 7); - _gameSys->removeSequence(_s52_ufoSequenceId, 256, true); - playSound(44, false); - _gameSys->insertSequence(0x21, 266, 0, 0, kSeqNone, 0, _s52_shipPosX, _s52_arcadeScreenBottom); + _vm->_gameSys->setAnimation(0, 0, 7); + _vm->_gameSys->removeSequence(_s52_ufoSequenceId, 256, true); + _vm->playSound(44, false); + _vm->_gameSys->insertSequence(0x21, 266, 0, 0, kSeqNone, 0, _s52_shipPosX, _s52_arcadeScreenBottom); _s52_aliensCount = 1; - playSound(0x31, false); + _vm->playSound(0x31, false); } } -bool GnapEngine::scene52_checkAlienRow(int rowNum) { +bool Scene52::checkAlienRow(int rowNum) { for (int i = 0; i < 5; ++i) { if (_s52_items[rowNum][i] >= 0) return false; @@ -652,14 +650,14 @@ bool GnapEngine::scene52_checkAlienRow(int rowNum) { bool found = false; for (int j = 0; j < 5; ++j) if (_s52_items[rowNum][j] == -2) { - _gameSys->removeSequence(_s52_alienRowKind[rowNum], j + 256, true); + _vm->_gameSys->removeSequence(_s52_alienRowKind[rowNum], j + 256, true); _s52_items[rowNum][j] = -1; --_s52_alienSpeed; found = true; } if (found) { - _gameSys->setAnimation(0, 0, _s52_alienRowAnims[rowNum]); + _vm->_gameSys->setAnimation(0, 0, _s52_alienRowAnims[rowNum]); --_s52_liveAlienRows; } @@ -669,8 +667,7 @@ bool GnapEngine::scene52_checkAlienRow(int rowNum) { return true; } -void GnapEngine::scene52_updateAlienRowXOfs() { - +void Scene52::updateAlienRowXOfs() { int amount = 2 * (3 - _s52_liveAlienRows) + 1; if (_s52_alienSpeed == 2) @@ -699,110 +696,109 @@ void GnapEngine::scene52_updateAlienRowXOfs() { } } -void GnapEngine::scene52_initAlienSize() { - _s52_alienWidth = _gameSys->getSpriteWidthById(0); - if (_gameSys->getSpriteWidthById(1) > _s52_alienWidth) - _s52_alienWidth = _gameSys->getSpriteWidthById(1); - if (_gameSys->getSpriteWidthById(4) > _s52_alienWidth) - _s52_alienWidth = _gameSys->getSpriteWidthById(4); - if (_gameSys->getSpriteWidthById(5) > _s52_alienWidth) - _s52_alienWidth = _gameSys->getSpriteWidthById(5); - if (_gameSys->getSpriteWidthById(12) > _s52_alienWidth) - _s52_alienWidth = _gameSys->getSpriteWidthById(12); - if (_gameSys->getSpriteWidthById(13) > _s52_alienWidth) - _s52_alienWidth = _gameSys->getSpriteWidthById(13); - - _s52_alienHeight = _gameSys->getSpriteHeightById(0); - if (_gameSys->getSpriteHeightById(1) > _s52_alienHeight) - _s52_alienHeight = _gameSys->getSpriteHeightById(1); - if (_gameSys->getSpriteHeightById(4) > _s52_alienHeight) - _s52_alienHeight = _gameSys->getSpriteHeightById(4); - if (_gameSys->getSpriteHeightById(5) > _s52_alienHeight) - _s52_alienHeight = _gameSys->getSpriteHeightById(5); - if (_gameSys->getSpriteHeightById(12) > _s52_alienHeight) - _s52_alienHeight = _gameSys->getSpriteHeightById(12); - if (_gameSys->getSpriteHeightById(13) > _s52_alienHeight) - _s52_alienHeight = _gameSys->getSpriteHeightById(13); +void Scene52::initAlienSize() { + _s52_alienWidth = _vm->_gameSys->getSpriteWidthById(0); + if (_vm->_gameSys->getSpriteWidthById(1) > _s52_alienWidth) + _s52_alienWidth = _vm->_gameSys->getSpriteWidthById(1); + if (_vm->_gameSys->getSpriteWidthById(4) > _s52_alienWidth) + _s52_alienWidth = _vm->_gameSys->getSpriteWidthById(4); + if (_vm->_gameSys->getSpriteWidthById(5) > _s52_alienWidth) + _s52_alienWidth = _vm->_gameSys->getSpriteWidthById(5); + if (_vm->_gameSys->getSpriteWidthById(12) > _s52_alienWidth) + _s52_alienWidth = _vm->_gameSys->getSpriteWidthById(12); + if (_vm->_gameSys->getSpriteWidthById(13) > _s52_alienWidth) + _s52_alienWidth = _vm->_gameSys->getSpriteWidthById(13); + + _s52_alienHeight = _vm->_gameSys->getSpriteHeightById(0); + if (_vm->_gameSys->getSpriteHeightById(1) > _s52_alienHeight) + _s52_alienHeight = _vm->_gameSys->getSpriteHeightById(1); + if (_vm->_gameSys->getSpriteHeightById(4) > _s52_alienHeight) + _s52_alienHeight = _vm->_gameSys->getSpriteHeightById(4); + if (_vm->_gameSys->getSpriteHeightById(5) > _s52_alienHeight) + _s52_alienHeight = _vm->_gameSys->getSpriteHeightById(5); + if (_vm->_gameSys->getSpriteHeightById(12) > _s52_alienHeight) + _s52_alienHeight = _vm->_gameSys->getSpriteHeightById(12); + if (_vm->_gameSys->getSpriteHeightById(13) > _s52_alienHeight) + _s52_alienHeight = _vm->_gameSys->getSpriteHeightById(13); _s52_alienTopY = _s52_shipCannonTopY + 52; _s52_alienLeftX = (800 - 5 * _s52_alienWidth) / 2; - } -void GnapEngine::scene52_playSound() { +void Scene52::playSound() { if (_s52_soundToggle) { - playSound(0x2F, false); + _vm->playSound(0x2F, false); _s52_soundToggle = false; } else { - playSound(0x2E, false); + _vm->playSound(0x2E, false); _s52_soundToggle = true; } } -void GnapEngine::scene52_updateAliens() { +void Scene52::updateAliens() { for (int i = 0; i < 7; ++i) - scene52_updateAlien(i); + updateAlien(i); } -void GnapEngine::scene52_updateAlien(int rowNum) { - if (_s52_alienRowKind[rowNum] >= 0 && !scene52_checkAlienRow(rowNum)) { +void Scene52::updateAlien(int rowNum) { + if (_s52_alienRowKind[rowNum] >= 0 && !checkAlienRow(rowNum)) { for (int i = 0; i < 5; ++i) { if (_s52_items[rowNum][i] >= 0) _s52_items[rowNum][i] = -2; } - scene52_checkAlienRow(rowNum); + checkAlienRow(rowNum); } } -void GnapEngine::scene52_loseShip() { +void Scene52::loseShip() { --_s52_shipsLeft; if (_s52_shipsLeft == 2) { - _gameSys->fillSurface(0, 120, 140, _s52_shipMidX, _s52_shipMidY, 0, 0, 0); + _vm->_gameSys->fillSurface(0, 120, 140, _s52_shipMidX, _s52_shipMidY, 0, 0, 0); } else if (_s52_shipsLeft == 1) { - _gameSys->fillSurface(0, 120, 185, _s52_shipMidX, _s52_shipMidY, 0, 0, 0); + _vm->_gameSys->fillSurface(0, 120, 185, _s52_shipMidX, _s52_shipMidY, 0, 0, 0); } } -void GnapEngine::scene52_initShields() { +void Scene52::initShields() { for (int i = 0; i < 3; ++i) { - _gameSys->drawSpriteToBackground(_s52_shieldPosX[i], _s52_arcadeScreenBottom - 44, 17); + _vm->_gameSys->drawSpriteToBackground(_s52_shieldPosX[i], _s52_arcadeScreenBottom - 44, 17); _s52_shieldSpriteIds[i] = 17; } } -void GnapEngine::scene52_initAnims() { +void Scene52::initAnims() { for (int i = 0; i < 7; ++i) - _gameSys->setAnimation(0, 0, i); - _gameSys->setAnimation(0, 0, 7); + _vm->_gameSys->setAnimation(0, 0, i); + _vm->_gameSys->setAnimation(0, 0, 7); for (int j = 0; j < 1; ++j) - _gameSys->setAnimation(0, 0, j + 8); + _vm->_gameSys->setAnimation(0, 0, j + 8); for (int k = 0; k < 3; ++k) - _gameSys->setAnimation(0, 0, k + 9); + _vm->_gameSys->setAnimation(0, 0, k + 9); } -void GnapEngine::scene52_drawScore(int score) { +void Scene52::drawScore(int score) { char str[4]; sprintf(str, "%03d", score); - _gameSys->fillSurface(0, 420, 80, 48, 30, 0, 0, 0); - _gameSys->drawTextToSurface(0, 420, 80, 255, 255, 255, str); + _vm->_gameSys->fillSurface(0, 420, 80, 48, 30, 0, 0, 0); + _vm->_gameSys->drawTextToSurface(0, 420, 80, 255, 255, 255, str); } -void GnapEngine::scene52_run() { - _timers[1] = 0; +void Scene52::run() { + _vm->_timers[1] = 0; - hideCursor(); + _vm->hideCursor(); // TODO loadFont("maturasc", "Matura MT Script Capitals", 2000); // TODO setFontSize(24); _s52_gameScore = 0; - _gameSys->drawTextToSurface(0, 300, 80, 255, 255, 255, "SCORE"); - _gameSys->drawTextToSurface(0, 468, 80, 255, 255, 255, "0"); + _vm->_gameSys->drawTextToSurface(0, 300, 80, 255, 255, 255, "SCORE"); + _vm->_gameSys->drawTextToSurface(0, 468, 80, 255, 255, 255, "0"); - scene52_drawScore(0); + drawScore(0); _s52_shipMidX = 33; - _s52_shipMidY = _gameSys->getSpriteHeightById(15); + _s52_shipMidY = _vm->_gameSys->getSpriteHeightById(15); _s52_shipPosX = (800 - _s52_shipMidX) / 2; _s52_arcadeScreenBottom = 496; _s52_arcadeScreenRight = 595 - _s52_shipMidX; @@ -817,82 +813,82 @@ void GnapEngine::scene52_run() { for (int i = 0; i < 3; ++i) _s52_shieldSpriteIds[i] = -1; - _gameSys->drawSpriteToBackground(120, 140, 0xF); - _gameSys->drawSpriteToBackground(120, 185, 0xF); + _vm->_gameSys->drawSpriteToBackground(120, 140, 0xF); + _vm->_gameSys->drawSpriteToBackground(120, 185, 0xF); - scene52_initShipCannon(_s52_arcadeScreenBottom); - scene52_initAlienCannons(); - scene52_initAliens(); + initShipCannon(_s52_arcadeScreenBottom); + initAlienCannons(); + initAliens(); _s52_nextUfoSequenceId = 0x22; - _gameSys->setAnimation(0x22, 256, 7); - _gameSys->insertSequence(_s52_nextUfoSequenceId, 256, 0, 0, kSeqNone, 0, _s52_shipPosX, _s52_arcadeScreenBottom); + _vm->_gameSys->setAnimation(0x22, 256, 7); + _vm->_gameSys->insertSequence(_s52_nextUfoSequenceId, 256, 0, 0, kSeqNone, 0, _s52_shipPosX, _s52_arcadeScreenBottom); _s52_ufoSequenceId = _s52_nextUfoSequenceId; - clearKeyStatus1(Common::KEYCODE_RIGHT); - clearKeyStatus1(Common::KEYCODE_LEFT); - clearKeyStatus1(Common::KEYCODE_SPACE); - clearKeyStatus1(Common::KEYCODE_UP); - clearKeyStatus1(Common::KEYCODE_ESCAPE); + _vm->clearKeyStatus1(Common::KEYCODE_RIGHT); + _vm->clearKeyStatus1(Common::KEYCODE_LEFT); + _vm->clearKeyStatus1(Common::KEYCODE_SPACE); + _vm->clearKeyStatus1(Common::KEYCODE_UP); + _vm->clearKeyStatus1(Common::KEYCODE_ESCAPE); - _timers[2] = 5; + _vm->_timers[2] = 5; _s52_shipFlag = false; - _timers[0] = 10; + _vm->_timers[0] = 10; _s52_alienWave = true; - while (!_sceneDone) { - gameUpdateTick(); + while (!_vm->_sceneDone) { + _vm->gameUpdateTick(); - while (isKeyStatus2(Common::KEYCODE_RIGHT)) { - scene52_update(); - if (_gameSys->getAnimationStatus(7) == 2) { + while (_vm->isKeyStatus2(Common::KEYCODE_RIGHT)) { + update(); + if (_vm->_gameSys->getAnimationStatus(7) == 2) { if (_s52_shipPosX < _s52_arcadeScreenRight) { _s52_shipPosX += 15; if (_s52_shipPosX > _s52_arcadeScreenRight) _s52_shipPosX = _s52_arcadeScreenRight; - _gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); - _gameSys->insertSequence(_s52_nextUfoSequenceId, 256, _s52_ufoSequenceId, 256, kSeqSyncWait, 0, _s52_shipPosX, _s52_arcadeScreenBottom); + _vm->_gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); + _vm->_gameSys->insertSequence(_s52_nextUfoSequenceId, 256, _s52_ufoSequenceId, 256, kSeqSyncWait, 0, _s52_shipPosX, _s52_arcadeScreenBottom); _s52_ufoSequenceId = _s52_nextUfoSequenceId; - if (_s52_bottomAlienFlag && scene52_shipCannonHitAlien()) - scene52_shipExplode(); + if (_s52_bottomAlienFlag && shipCannonHitAlien()) + shipExplode(); } break; } } - while (isKeyStatus2(Common::KEYCODE_LEFT)) { - scene52_update(); - if (_gameSys->getAnimationStatus(7) == 2) { + while (_vm->isKeyStatus2(Common::KEYCODE_LEFT)) { + update(); + if (_vm->_gameSys->getAnimationStatus(7) == 2) { if (_s52_shipPosX > _s52_arcadeScreenLeft) { _s52_shipPosX -= 15; if (_s52_shipPosX < _s52_arcadeScreenLeft) _s52_shipPosX = _s52_arcadeScreenLeft; - _gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); - _gameSys->insertSequence(_s52_nextUfoSequenceId, 256, _s52_ufoSequenceId, 256, kSeqSyncWait, 0, _s52_shipPosX, _s52_arcadeScreenBottom); + _vm->_gameSys->setAnimation(_s52_nextUfoSequenceId, 256, 7); + _vm->_gameSys->insertSequence(_s52_nextUfoSequenceId, 256, _s52_ufoSequenceId, 256, kSeqSyncWait, 0, _s52_shipPosX, _s52_arcadeScreenBottom); _s52_ufoSequenceId = _s52_nextUfoSequenceId; - if (_s52_bottomAlienFlag && scene52_shipCannonHitAlien()) - scene52_shipExplode(); + if (_s52_bottomAlienFlag && shipCannonHitAlien()) + shipExplode(); } break; } } - scene52_update(); + update(); - if (sceneXX_sub_4466B1()) { + if (_vm->sceneXX_sub_4466B1()) { _s52_alienWave = false; - _gameSys->waitForUpdate(); - scene52_initAnims(); - clearKeyStatus1(30); - _sceneDone = true; + _vm->_gameSys->waitForUpdate(); + initAnims(); + _vm->clearKeyStatus1(30); + _vm->_sceneDone = true; } } // TODO freeFont(); - _gameSys->waitForUpdate(); + _vm->_gameSys->waitForUpdate(); } } // End of namespace Gnap diff --git a/engines/gnap/scenes/scene52.h b/engines/gnap/scenes/scene52.h new file mode 100644 index 0000000000..0fbc29cb71 --- /dev/null +++ b/engines/gnap/scenes/scene52.h @@ -0,0 +1,118 @@ +/* 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GNAP_SCENE52_H +#define GNAP_SCENE52_H + +#include "gnap/debugger.h" +#include "gnap/scenes/scenecore.h" + +namespace Gnap { + +class GnapEngine; + +class Scene52: public Scene { +public: + Scene52(GnapEngine *vm); + ~Scene52() {} + + virtual int init(); + virtual void updateHotspots(); + virtual void run(); + virtual void updateAnimations() {}; + virtual void updateAnimationsCb() {}; + +private: + int _s52_liveAlienRows; + int _s52_gameScore; + bool _s52_soundToggle; + int _s52_arcadeScreenLeft; + int _s52_arcadeScreenRight; + int _s52_arcadeScreenBottom; + int _s52_shipsLeft; + int _s52_shieldSpriteIds[3]; + int _s52_shieldPosX[3]; + int _s52_shipPosX; + int _s52_shipCannonPosX, _s52_shipCannonPosY; + bool _s52_shipCannonFiring; + bool _s52_shipCannonFired; + int _s52_shipCannonWidth, _s52_shipCannonHeight; + int _s52_shipCannonTopY; + int _s52_shipMidX, _s52_shipMidY; + bool _s52_shipFlag; + bool _s52_aliensInitialized; + int _s52_alienSpeed, _s52_alienDirection; + int _s52_alienWidth, _s52_alienHeight; + int _s52_alienLeftX, _s52_alienTopY; + int _s52_alienRowDownCtr; + int _s52_alienRowKind[7]; + int _s52_alienRowAnims[7]; + int _s52_alienRowIds[7]; + int _s52_alienRowXOfs[7]; + int _s52_alienCannonFired[3]; + int _s52_alienCannonPosX[3]; + int _s52_alienCannonPosY[3]; + int _s52_alienCannonSequenceIds[3]; + int _s52_alienCannonIds[3]; + bool _s52_alienWave, _s52_alienSingle; + int _s52_alienCounter; + bool _s52_bottomAlienFlag; + int _s52_aliensCount; + int _s52_items[8][5]; + int _s52_nextUfoSequenceId, _s52_ufoSequenceId; + + void update(); + void initShipCannon(int bottomY); + void initAlienCannons(); + void fireShipCannon(int posX); + void fireAlienCannon(); + int getFreeShipCannon(); + int getFreeAlienCannon(); + void updateShipCannon(); + void updateAlienCannons(); + void initAliens(); + void initAlienRowKind(int rowNum, int alienKind); + void insertAlienRow(int rowNum); + void insertAlienRowAliens(int rowNum); + void updateAlienRow(int rowNum); + void moveDownAlienRow(); + int updateHitAlien(); + int getHitAlienNum(int rowNum); + int alienCannonHitShip(int cannonNum); + int alienCannonHitShield(int cannonNum); + bool shipCannonHitShield(int cannonNum); + bool shipCannonHitAlien(); + void shipExplode(); + bool checkAlienRow(int rowNum); + void updateAlienRowXOfs(); + void initAlienSize(); + void playSound(); + void updateAliens(); + void updateAlien(int rowNum); + void loseShip(); + void initShields(); + void initAnims(); + void drawScore(int score); +}; + +} // End of namespace Gnap +#endif // GNAP_SCENE52_H diff --git a/engines/gnap/scenes/scenecore.cpp b/engines/gnap/scenes/scenecore.cpp index 438604670b..f9f4af91ab 100644 --- a/engines/gnap/scenes/scenecore.cpp +++ b/engines/gnap/scenes/scenecore.cpp @@ -72,6 +72,8 @@ #include "gnap/scenes/scene48.h" #include "gnap/scenes/scene49.h" #include "gnap/scenes/scene50.h" +#include "gnap/scenes/scene51.h" +#include "gnap/scenes/scene52.h" #include "gnap/scenes/scene54.h" namespace Gnap { @@ -419,12 +421,14 @@ int GnapEngine::initSceneLogic() { initSceneGrid(21, 146, 11, 10); break; case 51: - backgroundId = scene51_init(); + _scene = new Scene51(this); + backgroundId = _scene->init(); _gameSys->setScaleValues(0, 500, 1, 1000); initSceneGrid(21, 146, 11, 10); break; case 52: - backgroundId = scene52_init(); + _scene = new Scene52(this); + backgroundId = _scene->init(); _gameSys->setScaleValues(0, 500, 1, 1000); initSceneGrid(21, 146, 11, 10); break; @@ -783,10 +787,12 @@ void GnapEngine::runSceneLogic() { _newSceneNum = _prevSceneNum; break; case 51: - scene51_run(); + _scene->run(); + delete _scene; break; case 52: - scene52_run(); + _scene->run(); + delete _scene; _newSceneNum = _prevSceneNum; break; case 53: |