Beispiel #1
0
Scene1608::~Scene1608() {
	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0);
	if (_klaymenInCar)
		delete _kmScene1608;
	else
		delete _asCar;
}
Beispiel #2
0
uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, 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);
}
Beispiel #4
0
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;
	}
}
Beispiel #5
0
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();
}
Beispiel #6
0
Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which)
	: Module(vm, parentModule) {

	if (which >= 0)
		setGlobalVar(V_TELEPORTER_WHICH, which);

	createScene(0, 0);

}
Beispiel #7
0
void Module2100::updateScene() {
	if (!updateChild()) {
		switch (_sceneNum) {
		case 0:
			if (_moduleResult == 1) {
				setGlobalVar(V_DOOR_PASSED, 1);
				leaveModule(0);
			} else
				leaveModule(1);
			break;
		}
	}
}
Beispiel #8
0
uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, 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 &param, 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;
}
Beispiel #10
0
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);

}
Beispiel #11
0
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();
}
Beispiel #12
0
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();
}
Beispiel #13
0
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();

}
Beispiel #14
0
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);
}
Beispiel #15
0
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;
}
Beispiel #16
0
Scene1201::~Scene1201() {
	if (_creatureExploded)
		setGlobalVar(V_CREATURE_EXPLODED, 1);
	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0);
}
Beispiel #17
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);

}
Beispiel #18
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();
}
Beispiel #19
0
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);
}
Beispiel #21
0
uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, 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;
}
Beispiel #22
0
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);
	}

}
Beispiel #23
0
Scene1202::~Scene1202() {
	if (isSolved())
		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
}