Scene1608::~Scene1608() { setGlobalVar(V_KLAYMEN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); if (_klaymenInCar) delete _kmScene1608; else delete _asCar; }
uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); break; case 0x2000: if (!_isSolved) { if (_changeCurrentSymbol) _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false); _asSymbols[_symbolPosition]->stopSymbolSound(); _symbolPosition++; if (_symbolPosition >= 12) { if (testVars()) { playSound(0); setGlobalVar(V_CODE_SYMBOLS_SOLVED, 1); _isSolved = true; } else { _symbolPosition = 0; for (int i = 0; i < 12; i++) _asSymbols[i]->hide(); } } _changeCurrentSymbol = true; _countdown1 = 1; } break; } return 0; }
NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes) : Scene(vm, parentModule), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false), _isWalkingForward(false), _isTurning(false), _smackerFileHash(0), _interactive(true), _leaveSceneAfter(false) { _navigationList = _vm->_staticData->getNavigationList(navigationListId); _navigationListId = navigationListId; if (_navigationIndex < 0) { _navigationIndex = (int)getGlobalVar(V_NAVIGATION_INDEX); if (_navigationIndex >= (int)_navigationList->size()) _navigationIndex = 0; } setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); SetUpdateHandler(&NavigationScene::update); SetMessageHandler(&NavigationScene::handleMessage); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true)); createMouseCursor(); _vm->_screen->clear(); _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); sendMessage(_parentModule, 0x100A, _navigationIndex); }
void Scene1202::update() { Scene::update(); if (_isPuzzleSolved) { if (!isSoundPlaying(3)) leaveScene(0); } else if (_counter == 0 && isSolved()) { _clickedIndex = 0; SetMessageHandler(&Scene1202::hmSolved); setGlobalVar(V_TNT_DUMMY_BUILT, 1); _palette->copyToBasePalette(_paletteData); _palette->startFadeToPalette(24); playSound(3); _isPuzzleSolved = true; } else if (_clickedIndex >= 0 && _counter == 0) { // Swap TNT positions int destIndex = kScene1202Table[_clickedIndex]; sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex)); sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); int temp = getSubVar(VA_TNT_POSITIONS, destIndex); setSubVar(VA_TNT_POSITIONS, destIndex, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp); _counter = 2; _clickedIndex = -1; playSound(_soundToggle ? 1 : 2); _soundToggle = !_soundToggle; } }
void Module1600::createScene(int sceneNum, int which) { debug(1, "Module1600::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; createNavigationScene(0x004B39D0, which); break; case 1: _vm->gameState().sceneNum = 1; createNavigationScene(0x004B3A30, which); break; case 2: _vm->gameState().sceneNum = 2; createNavigationScene(0x004B3A60, which); break; case 3: _vm->gameState().sceneNum = 3; createNavigationScene(0x004B3A90, which); break; case 4: _vm->gameState().sceneNum = 4; createNavigationScene(0x004B3B20, which); break; case 5: _vm->gameState().sceneNum = 5; createNavigationScene(0x004B3B50, which); break; case 6: _vm->gameState().sceneNum = 6; createNavigationScene(0x004B3B80, which); break; case 7: _vm->gameState().sceneNum = 7; _childObject = new Scene1608(_vm, this, which); break; case 8: _vm->gameState().sceneNum = 8; _childObject = new Scene1609(_vm, this); break; case 1001: _vm->gameState().sceneNum = 1; if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) createSmackerScene(0x80050200, true, true, false); else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) createSmackerScene(0x80090200, true, true, false); else createSmackerScene(0x80000200, true, true, false); if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2) setGlobalVar(V_TALK_COUNTING_INDEX, 0); else incGlobalVar(V_TALK_COUNTING_INDEX, +1); break; } SetUpdateHandler(&Module1600::updateScene); _childObject->handleUpdate(); }
Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { if (which >= 0) setGlobalVar(V_TELEPORTER_WHICH, which); createScene(0, 0); }
void Module2100::updateScene() { if (!updateChild()) { switch (_sceneNum) { case 0: if (_moduleResult == 1) { setGlobalVar(V_DOOR_PASSED, 1); leaveModule(0); } else leaveModule(1); break; } } }
uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case NM_MOUSE_CLICK: if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) { leaveScene(0); } break; case NM_ANIMATION_UPDATE: if (getGlobalVar(V_STAIRS_DOWN)) { playSound(0); for (int i = 0; i < 9; i++) _asSymbols[i]->moveUp(); _ssUpDownButton->setToUpPosition(); setGlobalVar(V_STAIRS_DOWN, 0); } else { if (!getGlobalVar(V_WALL_BROKEN)) { playSound(2); _countdown3 = 5; } else { playSound(1); _ssUpDownButton->setToDownPosition(); setGlobalVar(V_STAIRS_DOWN, 1); } _moveDownCountdown = 1; _currMovingSymbolIndex = 8; } break; case 0x2001: playSound(3); setGlobalVar(V_STAIRS_PUZZLE_SOLVED, 1); break; } return 0; }
uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4806: setGlobalVar(V_HAS_NEEDLE, 1); setVisible(false); SetMessageHandler(NULL); break; } return messageResult; }
Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { Sprite *tempSprite; setRectList(0x004B34C8); setBackground(0x01303227); setPalette(0x01303227); insertScreenMouse(0x0322301B); insertStaticSprite(0x42213133, 1100); if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) insertStaticSprite(0x40A40168, 100); else if (getGlobalVar(V_STAIRS_DOWN)) { insertStaticSprite(0x124404C4, 100); setGlobalVar(V_STAIRS_DOWN_ONCE, 1); } else insertStaticSprite(0x02840064, 100); if (which < 0) { // Restoring game insertKlaymen<KmScene1901>(120, 380); setMessageList(0x004B3408); } else if (which == 1) { // Klaymen returning from the puzzle insertKlaymen<KmScene1901>(372, 380); setMessageList(0x004B3410); } else { // Klaymen entering from the left insertKlaymen<KmScene1901>(0, 380); setMessageList(0x004B3400); } tempSprite = insertStaticSprite(0x4830A402, 1100); _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); }
void Module2000::createScene(int sceneNum, int which) { debug(1, "Module2000::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; _childObject = new Scene2001(_vm, this, which); break; case 1: _vm->gameState().sceneNum = 1; createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which); break; case 2: _vm->gameState().sceneNum = 2; setGlobalVar(V_WORLDS_JOINED, 1); setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1); createSmackerScene(0x204B2031, true, true, false); break; } SetUpdateHandler(&Module2000::updateScene); _childObject->handleUpdate(); }
void Module1200::createScene(int sceneNum, int which) { debug(1, "Module1200::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; _childObject = new Scene1201(_vm, this, which); break; case 1: _vm->gameState().sceneNum = 1; _childObject = new Scene1202(_vm, this); break; case 2: _vm->gameState().sceneNum = 2; _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); createSmackerScene(0x31890001, true, true, false); setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1); break; } SetUpdateHandler(&Module1200::updateScene); _childObject->handleUpdate(); }
void DiskplayerScene::update() { Scene::update(); if (_updateStatus == kUSTuningIn && _diskSmackerPlayer->isDone()) { if (_diskAvailable[_diskIndex]) playDisk(); else playStatic(); } else if (_updateStatus == kUSPlaying && _diskSmackerPlayer->isDone()) { _diskSlots[_diskIndex]->stop(); _diskIndex++; if (_hasAllDisks) { if (_diskIndex != 20) { playDisk(); } else if (_dropKey) { playDisk(); _updateStatus = kUSPlayingFinal; } else { _diskIndex = 0; stop(); } } else if (_diskIndex != 20) { tuneIn(); } else { _diskIndex = 0; stop(); } } else if (_updateStatus == kUSPlayingFinal) { if (_diskSmackerPlayer->getFrameNumber() == 133) { _asKey->stDropKey(); setGlobalVar(V_HAS_FINAL_KEY, 1); } else if (_diskSmackerPlayer->isDone()) { for (int i = 0; i < 20; i++) { _diskSlots[i]->setLocked(false); _diskSlots[i]->stop(); } _diskIndex = 0; stop(); showMouse(true); _dropKey = false; } } if (_appearCountdown != 0 && (--_appearCountdown == 0)) { _diskSlots[_diskIndex]->appear(); if (_dropKey) { _diskSlots[_diskIndex]->activate(); _diskSlots[_diskIndex]->setLocked(true); } _diskIndex++; while (!_diskAvailable[_diskIndex] && _diskIndex < 19) _diskIndex++; if (_diskIndex < 20) { _appearCountdown = 1; } else { _diskIndex = 0; _inputDisabled = false; if (_dropKey) { _ssPlayButton->press(); _tuneInCountdown = 2; } else { showMouse(true); _diskSlots[_diskIndex]->activate(); } } } if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0)) playDisk(); }
void NavigationScene::handleNavigation(const NPoint &mousePos) { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; bool oldIsWalkingForward = _isWalkingForward; bool oldIsTurning = _isTurning; uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos); switch (direction) { case 0: if (navigationItem.leftSmackerFileHash != 0) { _smackerFileHash = navigationItem.leftSmackerFileHash; _interactive = false; _isWalkingForward = false; _isTurning = true; do { _navigationIndex--; if (_navigationIndex < 0) _navigationIndex = _navigationList->size() - 1; } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); } else { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } break; case 1: if (navigationItem.rightSmackerFileHash != 0) { _smackerFileHash = navigationItem.rightSmackerFileHash; _interactive = false; _isWalkingForward = false; _isTurning = true; do { _navigationIndex++; if (_navigationIndex >= (int)_navigationList->size()) _navigationIndex = 0; } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); } else { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } break; case 2: case 3: case 4: if (navigationItem.middleFlag) { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } else if (navigationItem.middleSmackerFileHash != 0) { _smackerFileHash = navigationItem.middleSmackerFileHash; _interactive = false; _isWalkingForward = true; _isTurning = false; _leaveSceneAfter = true; } break; } if (oldIsTurning != _isTurning) _vm->_soundMan->setSoundThreePlayFlag(_isTurning); if (oldIsWalkingForward != _isWalkingForward) _vm->_soundMan->setTwoSoundsPlayFlag(_isWalkingForward); }
bool UFuncPar::handleCommand(UServerInMsg * msg, void * extra) { const int MRL = 500; char reply[MRL]; // bool aLog, doLog, aDummy, aSilent = false; // bool aFake; // check for parameter 'help' if (msg->tag.getAttValue("help", NULL, 0)) { // create the reply in XML-like (html - like) format sendHelpStart("Par"); sendText("--- PAR is for roll and pitch calculations\n"); snprintf(reply, MRL, "log=true|false Opens or closes the logfile %s (open=%s)\n", logf.getLogFileName(), bool2str(logf.isOpen())); sendText(reply); sendText("eval evaluate parametric roll state\n"); sendText("update update parametric roll state with new sensor data\n"); //sendText("dummy update dummy data generator (output values for marg)\n"); sendText("fake=F fake some roll/pitch values F=roll frq\n"); sendText("sweep fake a frequenct sweep for the roll\n"); sendText("sweepStep fake a frequenct sweep step\n"); sendText("pitch=F with fake F=pitch frq\n"); sendText("silent do not make an info reply\n"); sendText("help This message\n"); sendHelpDone(); } else { // get any command attributes (when not a help request) bool doLog, aSilent, aSweep = false, aSweepStep = false, anEval = false; int aSweepSteps = 1; double rollFrq, pitchFrq=1.0/10.0; // 10Hz bool aLog = msg->tag.getAttBool("log", &doLog, true); bool aDummy = msg->tag.getAttBool("dummy", NULL); msg->tag.getAttBool("silent", &aSilent, true); bool aFake = msg->tag.getAttDouble("fake", &rollFrq, 1.0/20.0); msg->tag.getAttDouble("pitch", &pitchFrq, 1.0/10.0); msg->tag.getAttBool("sweep", &aSweep, true); aSweepStep = msg->tag.getAttInteger("sweepStep", &aSweepSteps, 1); msg->tag.getAttBool("eval", &anEval, true); bool anUpdate = msg->tag.getAttBool("update", NULL); // // implement command if (aLog) { // open or close the log aLog = logf.openLog(doLog); if (doLog) snprintf(reply, MRL, "Opened logfile %s (%s)", logf.getLogFileName(), bool2str(aLog)); else snprintf(reply, MRL, "closed logfile %s", logf.getLogFileName()); // send an information tag back to client sendInfo(reply); } else if (aDummy) { //dummy(); bool isOK = setGlobalVar("imu.aaa[1]", 33.0, true); printf("Set ima.aaa=33 %s\n", bool2str(isOK)); isOK = setGlobalVar("imu.bbb", 34.0, false); printf("Set ima.bbb=34 %s\n", bool2str(isOK)); isOK = getVarPool()->getGlobalVariable("imu.aaa")->setDouble(33.7, 1, true); printf("Set ima.aaa=33.7 %s\n", bool2str(isOK)); if (not aSilent) sendInfo("done"); } else if (aFake) { fakeImuValues(rollFrq, pitchFrq); // fake sweep } else if (aSweep) { double startFrq=0.001; //1.0; // oldest time double sampleRate=10.0; double endFrq = 0.3; // 0.0002; // newest time int samples=30000; UVariable * var = getVarPool()->getGlobalVariable("imu.rot"); fakeFrqSweep(var, 0.5, startFrq, endFrq, samples, sampleRate); // fake sweep } else if (anEval) { rollDetectBatch(); if (not aSilent) sendInfo("Done roll detect - not fully implemented yet"); } else if (anUpdate) { bool done = newImuData(); if (not aSilent) { if (done) sendInfo("updated sensor values"); else sendInfo("redundant info"); } } else if (not aSweepStep) sendWarning("No action see 'par help'"); if (aSweepStep) { UVariable * var = getVarPool()->getGlobalVariable("imu.rot"); double startFrq = 0.0003; // Hz double sampleRate = 3; // Hz double endFrq = sampleRate / 3.0; if (not setSweepMeasurement(var, -0.5, aSweepSteps, log(startFrq), log(endFrq), 20000, sampleRate)) { // last sample sweepStep = 0; sweepAngle = 0.0; } } } return true; }
Scene1201::~Scene1201() { if (_creatureExploded) setGlobalVar(V_CREATURE_EXPLODED, 1); setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); }
Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _asCar(NULL), _countdown1(0) { setGlobalVar(V_CAR_DELTA_X, 1); SetMessageHandler(&Scene1608::hmLowerFloor); _asKey = insertSprite<AsCommonKey>(this, 1, 1100, 198, 220); addCollisionSprite(_asKey); if (which < 0) { // Restoring game if (_vm->gameState().which == 1) // Klaymen is in the car which = 1; else { // Klaymen is standing around setRectList(0x004B47D0); insertKlaymen<KmScene1608>(380, 438); _kmScene1608 = _klaymen; _klaymenInCar = false; _sprite1 = insertStaticSprite(0x7D0404E8, 1100); setMessageList(0x004B46A8); setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011); addCollisionSprite(_asTape); _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); insertScreenMouse(0x80E05108); insertStaticSprite(0x4B18F868, 1200); } } else if (which == 0) { // Klaymen entering from the left _vm->gameState().which = 0; setRectList(0x004B47D0); insertKlaymen<KmScene1608>(0, 438); _kmScene1608 = _klaymen; _klaymenInCar = false; setMessageList(0x004B46B0); setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011); addCollisionSprite(_asTape); insertScreenMouse(0x80E05108); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); insertStaticSprite(0x4B18F868, 1200); } else if (which == 2) { // Klaymen returning from looking through the upper window _vm->gameState().which = 1; _dataResource.load(0x003C0492); _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); setBackground(0x98001604); setPalette(0x98001604); _palette->addPalette("paPodRed", 65, 31, 65); insertScreenMouse(0x01600988); _sprite2 = insertStaticSprite(0x491F38A8, 1100); _asCar = createSprite<AsCommonCar>(this, 375, 227); // Create but don't add to the sprite list yet _asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227); _asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227); _asCar->setVisible(false); if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { insertKlaymen<KmScene1608>(373, 220); _klaymen->setDoDeltaX(1); } else insertKlaymen<KmScene1608>(283, 220); _kmScene1608 = _klaymen; setMessageList(0x004B47A8); SetMessageHandler(&Scene1608::hmUpperFloor); SetUpdateHandler(&Scene1608::upUpperFloor); _asCar->setPathPoints(_roomPathPoints); sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1); _sprite3 = insertStaticSprite(0xB47026B0, 1100); _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _clipRect2 = _clipRect1; _clipRect2.y2 = 215; _klaymen->setClipRect(_clipRect1); _asCar->setClipRect(_clipRect1); _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011); addCollisionSprite(_asTape); insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1); _klaymenInCar = false; _carClipFlag = false; _carStatus = 0; setRectList(0x004B4810); } // NOTE: Not in the else because 'which' is set to 1 in the true branch if (which == 1) { // Klaymen riding the car _vm->gameState().which = 1; _dataResource.load(0x003C0492); _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); setBackground(0x98001604); setPalette(0x98001604); _palette->addPalette("paPodRed", 65, 31, 65); insertScreenMouse(0x01600988); _asCar = insertSprite<AsCommonCar>(this, 375, 227); _asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227); _asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227); _sprite2 = insertStaticSprite(0x491F38A8, 1100); _kmScene1608 = createSprite<KmScene1608>(this, 439, 220); sendMessage(_kmScene1608, 0x2032, 1); _kmScene1608->setDoDeltaX(1); SetMessageHandler(&Scene1608::hmRidingCar); SetUpdateHandler(&Scene1608::upRidingCar); _asIdleCarLower->setVisible(false); _asIdleCarFull->setVisible(false); _asCar->setPathPoints(_roomPathPoints); sendMessage(_asCar, 0x2002, 0); sendMessage(_asCar, 0x2008, 90); _sprite3 = insertStaticSprite(0xB47026B0, 1100); _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _clipRect2 = _clipRect1; _clipRect2.y2 = 215; _kmScene1608->setClipRect(_clipRect1); _asCar->setClipRect(_clipRect1); _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011); // ... addCollisionSprite(_asTape); insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1); _klaymenInCar = true; _carClipFlag = true; _carStatus = 0; } _palette->addPalette("paKlayRed", 0, 64, 0); }
void Module2600::createScene(int sceneNum, int which) { debug("Module2600::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; createNavigationScene(0x004B8608, which); break; case 1: _vm->gameState().sceneNum = 1; createNavigationScene(0x004B8638, which); break; case 2: _vm->gameState().sceneNum = 2; createNavigationScene(0x004B86C8, which); break; case 3: _vm->gameState().sceneNum = 3; if (getGlobalVar(V_CREATURE_ANGRY)) createNavigationScene(0x004B8758, which); else createNavigationScene(0x004B86F8, which); break; case 4: _vm->gameState().sceneNum = 4; createNavigationScene(0x004B87B8, which); break; case 6: _vm->gameState().sceneNum = 6; createNavigationScene(0x004B8698, which); break; case 7: _vm->gameState().sceneNum = 7; _vm->_soundMan->deleteGroup(0x40271018); createSmackerScene(0x30090001, true, true, false); break; case 8: _vm->gameState().sceneNum = 8; _childObject = new Scene2609(_vm, this, which); break; case 1002: _vm->gameState().sceneNum = 2; if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) createSmackerScene(0x018C0404, true, true, false); else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) createSmackerScene(0x018C0407, true, true, false); else createSmackerScene(0x818C0405, true, true, false); if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) setGlobalVar(V_FRUIT_COUNTING_INDEX, 0); else incGlobalVar(V_FRUIT_COUNTING_INDEX, +1); break; case 1003: _vm->gameState().sceneNum = 3; createSmackerScene(0x001C0007, true, true, false); break; case 1006: _vm->gameState().sceneNum = 6; if (getGlobalVar(V_WATER_RUNNING)) createSmackerScene(0x049A1181, true, true, false); else createSmackerScene(0x04981181, true, true, false); break; case 1008: _vm->gameState().sceneNum = 8; if (getGlobalVar(V_WATER_RUNNING)) createSmackerScene(0x42B80941, true, true, false); else createSmackerScene(0x42980941, true, true, false); break; case 9999: createDemoScene(); break; } SetUpdateHandler(&Module2600::updateScene); _childObject->handleUpdate(); }
void Module2600::updateScene() { if (!updateChild()) { switch (_sceneNum) { case 0: if (_moduleResult == 1) createScene(1, 3); else leaveModule(0); break; case 1: if (_moduleResult == 0) createScene(6, 0); else if (_moduleResult == 1) createScene(0, 0); else if (_moduleResult == 2) createScene(2, 1); else if (_moduleResult == 3) createScene(3, 0); break; case 2: if (_moduleResult == 0) createScene(1, 0); else if (_moduleResult == 1) { if (_vm->isDemo()) createScene(9999, -1); else createScene(1002, -1); } break; case 3: if (_moduleResult == 0) { if (getGlobalVar(V_CREATURE_ANGRY)) createScene(4, 0); else createScene(1003, -1); } else if (_moduleResult == 2) createScene(1, 1); else if (_moduleResult == 3) { if (getGlobalVar(V_CREATURE_ANGRY)) createScene(4, 0); else { setGlobalVar(V_CREATURE_ANGRY, 1); createScene(7, -1); } } break; case 4: if (_moduleResult == 0) leaveModule(1); else createScene(3, 1); break; case 6: if (_moduleResult == 0) { if (_vm->isDemo()) createScene(9999, -1); else createScene(1006, -1); } else if (_moduleResult == 1) createScene(1, 2); break; case 7: leaveModule(0); break; case 8: createScene(1008, -1); break; case 1002: createScene(2, 1); break; case 1003: createScene(3, 0); break; case 1006: createScene(8, -1); break; case 1008: createScene(6, 0); break; case 9999: createScene(_vm->gameState().sceneNum, -1); break; } } }
void AsScene2402TV::stJokeFinished() { setGlobalVar(V_TV_JOKE_TOLD, 1); startAnimation(0x050A0103, 0, -1); _newStickFrameIndex = 0; SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); }
uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { if (!_isActionButtonClicked && _backgroundIndex == 0) { if (_isPanelOpen) { _isPanelOpen = false; _backgroundIndex = 15; SetUpdateHandler(&Scene1105::upClosePanel); } else _isClosePanelDone = true; _leaveResult = 0; } } break; case 0x2001: showMouse(false); _backgroundIndex = 24; SetUpdateHandler(&Scene1105::upOpenPanel); break; case 0x2003: _backgroundIndex = 24; _leaveResult = 1; SetUpdateHandler(&Scene1105::upClosePanel); break; case 0x4807: if (sender == _ssActionButton) { if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) && getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) && getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) { setGlobalVar(V_ROBOT_TARGET, 1); playSound(2); _doMoveTeddy = true; } else { sendMessage(_asTeddyBear, 0x2002, 0); } showMouse(false); _isActionButtonClicked = true; } break; case 0x4826: if (_isPanelOpen) { if (sender == _ssActionButton) { sendMessage(_ssActionButton, 0x480B, 0); _isPanelOpen = false; } else if (!getGlobalVar(V_ROBOT_TARGET)) { if (sender == _ssSymbol1UpButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) { incSubVar(VA_CURR_DICE_NUMBERS, 0, +1); sendMessage(_ssSymbol1UpButton, 0x480B, 0); sendMessage(_ssSymbolDice[0], 0x2000, 0); } } else if (sender == _ssSymbol1DownButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 0) > 1) { incSubVar(VA_CURR_DICE_NUMBERS, 0, -1); sendMessage(_ssSymbol1DownButton, 0x480B, 0); sendMessage(_ssSymbolDice[0], 0x2000, 0); } } else if (sender == _ssSymbol2UpButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 1) < 9) { incSubVar(VA_CURR_DICE_NUMBERS, 1, +1); sendMessage(_ssSymbol2UpButton, 0x480B, 0); sendMessage(_ssSymbolDice[1], 0x2000, 0); } } else if (sender == _ssSymbol2DownButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 1) > 1) { incSubVar(VA_CURR_DICE_NUMBERS, 1, -1); sendMessage(_ssSymbol2DownButton, 0x480B, 0); sendMessage(_ssSymbolDice[1], 0x2000, 0); } } else if (sender == _ssSymbol3UpButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 2) < 9) { incSubVar(VA_CURR_DICE_NUMBERS, 2, +1); sendMessage(_ssSymbol3UpButton, 0x480B, 0); sendMessage(_ssSymbolDice[2], 0x2000, 0); } } else if (sender == _ssSymbol3DownButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 2) > 1) { incSubVar(VA_CURR_DICE_NUMBERS, 2, -1); sendMessage(_ssSymbol3DownButton, 0x480B, 0); sendMessage(_ssSymbolDice[2], 0x2000, 0); } } } } break; } return messageResult; }
Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL), _asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { int16 topY1, topY2, topY3, topY4; int16 x1, x2; Sprite *tempSprite; SetUpdateHandler(&Scene1201::update); SetMessageHandler(&Scene1201::handleMessage); setHitRects(0x004AEBD0); if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) { setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1); for (uint32 index = 0; index < 18; index++) setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]); } insertScreenMouse(0x9A2C0409); _asTape = insertSprite<AsScene1201Tape>(this, 3, 1100, 243, 340, 0x9148A011); addCollisionSprite(_asTape); tempSprite = insertStaticSprite(0x03C82530, 100); topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; tempSprite = insertStaticSprite(0x88182069, 200); topY2 = tempSprite->getY() + tempSprite->getDrawRect().height; tempSprite = insertStaticSprite(0x476014E0, 300); topY3 = tempSprite->getY() + tempSprite->getDrawRect().height; tempSprite = insertStaticSprite(0x04063110, 500); topY4 = tempSprite->getY() + 1; _asTntManRope = insertSprite<AsScene1201TntManRope>(getGlobalVar(V_TNT_DUMMY_BUILT) && which != 1); _asTntManRope->setClipRect(0, topY4, 640, 480); insertStaticSprite(0x400B04B0, 1200); tempSprite = insertStaticSprite(0x40295462, 1200); x1 = tempSprite->getX(); tempSprite = insertStaticSprite(0xA29223FA, 1200); x2 = tempSprite->getX() + tempSprite->getDrawRect().width; _asKlaymenHead = insertSprite<AsScene1201KlaymenHead>(); if (which < 0) { // Restoring game insertKlaymen<KmScene1201>(364, 333); setMessageList(0x004AEC08); } else if (which == 3) { // Klaymen standing after the weasel exploded insertKlaymen<KmScene1201>(400, 329); setMessageList(0x004AEC08); } else if (which == 2) { // Klaymen entering from the right if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { insertKlaymen<KmScene1201>(374, 333); setMessageList(0x004AEC08); } else { insertKlaymen<KmScene1201>(640, 329); setMessageList(0x004AEC20); } } else if (which == 1) { // Klaymen returning from the TNT console if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { insertKlaymen<KmScene1201>(364, 333); _klaymen->setDoDeltaX(1); } else { insertKlaymen<KmScene1201>(246, 333); } setMessageList(0x004AEC30); } else { // Klaymen entering from the left insertKlaymen<KmScene1201>(0, 336); setMessageList(0x004AEC10); } _klaymen->setClipRect(x1, 0, x2, 480); _klaymen->setRepl(64, 0); if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { setBackground(0x4019A2C4); setPalette(0x4019A2C4); _asRightDoor = NULL; } else { setBackground(0x40206EC5); setPalette(0x40206EC5); _asRightDoor = insertSprite<AsScene1201RightDoor>(_klaymen, which == 2); } if (getGlobalVar(V_TNT_DUMMY_BUILT)) { insertStaticSprite(0x10002ED8, 500); if (!getGlobalVar(V_CREATURE_EXPLODED)) { _asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1); _asTntMan->setClipRect(x1, 0, x2, 480); _asTntMan->setRepl(64, 0); addCollisionSprite(_asTntMan); tempSprite = insertSprite<AsScene1201TntManFlame>(_asTntMan); tempSprite->setClipRect(x1, 0, x2, 480); } uint32 tntIndex = 1; while (tntIndex < 18) { uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); int16 clipY2; if (kScene1201PointArray[elemIndex].y < 175) clipY2 = topY1; else if (kScene1201PointArray[elemIndex].y < 230) clipY2 = topY2; else clipY2 = topY3; insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex + 1); if (kScene1201PointArray[elemIndex].y < 175) clipY2 = topY1; else if (kScene1201PointArray[elemIndex].y < 230) clipY2 = topY2; else clipY2 = topY3; insertSprite<SsScene1201Tnt>(tntIndex + 1, getSubVar(VA_TNT_POSITIONS, tntIndex + 1), clipY2); tntIndex += 3; } if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { setRectList(0x004AEE58); } else { setRectList(0x004AEDC8); } } else { insertStaticSprite(0x8E8A1981, 900); uint32 tntIndex = 0; while (tntIndex < 18) { uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); int16 clipY2; if (kScene1201PointArray[elemIndex].x < 300) { clipY2 = 480; } else { if (kScene1201PointArray[elemIndex].y < 175) clipY2 = topY1; else if (kScene1201PointArray[elemIndex].y < 230) clipY2 = topY2; else clipY2 = topY3; } insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); tntIndex++; } if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) setRectList(0x004AEE18); else setRectList(0x004AED88); } tempSprite = insertStaticSprite(0x63D400BC, 900); _asLeftDoor = insertSprite<AsScene1201LeftDoor>(_klaymen); _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) setGlobalVar(V_MATCH_STATUS, 1); _asMatch = NULL; if (getGlobalVar(V_MATCH_STATUS) < 3) { _asMatch = insertSprite<AsScene1201Match>(this); addCollisionSprite(_asMatch); } if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { _asCreature = insertSprite<AsScene1201Creature>(this, _klaymen); _asCreature->setClipRect(x1, 0, x2, 480); } }
Scene1202::~Scene1202() { if (isSolved()) setGlobalVar(V_TNT_DUMMY_BUILT, 1); }