void Game::oop_initializeObject() { debug(DBG_OPCODES, "Game::oop_initializeObject"); int index = findObjectByName(_objectScript.currentObjectNum, _objectScript.testObjectNum, &_objectScript.objectFound); if (index != -1) { SceneObject *so = derefSceneObject(index); int16 op = _objectScript.fetchNextWord(); if (op == 0) { if (so->state != 0) { so->x = so->xPrev; so->y = so->yPrev; so->frameNum = so->frameNumPrev; if (so->state == 2) { SceneObjectFrame *sof = derefSceneObjectFrame(so->frameNum); copyBufferToBuffer(so->x, _bitmapBuffer1.h + 1 - so->y - sof->hdr.h, sof->hdr.w, sof->hdr.h, &_bitmapBuffer3, &_bitmapBuffer1); } so->state = -1; } } else if (op == 1) { int16 mode = so->mode; so->mode = 1; reinitializeObject(index); so->mode = mode; if (so->state == 2) { so->state = 1; } } else if (op == 2) { if (so->state == 1) { so->x = so->xPrev; so->y = so->yPrev; so->frameNum = so->frameNumPrev; so->state = 2; } else { int16 mode = so->mode; so->mode = 3; reinitializeObject(index); so->mode = mode; } } } else { _objectScript.dataOffset += 2; } }
void Game::runObjectsScript() { debug(DBG_GAME, "Game::runObjectsScript()"); _objectScript.nextScene = -1; assert(_loadDataState != 3); // unneeded code if (_varsTable[309]) { memset(_keysPressed, 0, sizeof(_keysPressed)); } if (_loadDataState == 2) { int start = _workaroundRaftFlySceneBug ? 1 : 0; _workaroundRaftFlySceneBug = false; for (int i = start; i < _sceneObjectsCount; ++i) { SceneObject *so = &_sceneObjectsTable[i]; if (so->statePrev == 0 || so->statePrev == -1) { continue; } debug(DBG_GAME, "Game::runObjectsScript() currentObjectNum=%d", i); _objectScript.currentObjectNum = i; int anim = _sceneObjectMotionsTable[so->motionNum1].animNum; assert(anim >= 0 && anim < _animationsCount); _objectScript.data = _animationsTable[anim].scriptData; int endOfDataOffset = _animationsTable[anim].scriptSize; // endOfDataOffset2 _objectScript.dataOffset = 0; int statement = 0; while (_objectScript.dataOffset < endOfDataOffset) { _objectScript.statementNum = statement; int endOfStatementDataOffset = _objectScript.fetchNextWord(); // endOfDataOffset1 _objectScript.testObjectNum = -1; _objectScript.testDataOffset = endOfStatementDataOffset; bool loop = true; while (loop) { int op = _objectScript.fetchNextWord(); debug(DBG_OPCODES, "statement %d condition %d op %d", statement, i, op); if (op == 0) { break; } loop = executeConditionOpcode(op); } if (loop) { while (_objectScript.dataOffset < endOfStatementDataOffset) { int op = _objectScript.fetchNextWord(); debug(DBG_OPCODES, "statement %d operator %d op %d", statement, i, op); if (op == 100) { // &Game::oop_breakObjectScript endOfStatementDataOffset = _objectScript.dataOffset = endOfDataOffset; break; } executeOperatorOpcode(op); } } _objectScript.dataOffset = endOfStatementDataOffset; ++statement; } } _dialogueEndedFlag = 0; if (_objectScript.nextScene != -1 && _objectScript.nextScene < _sceneConditionsCount) { strcpy(_tempTextBuffer, _nextScenesTable[_objectScript.nextScene].name); _switchScene = true; _currentSceneSav[0] = 0; if (stringEndsWith(_tempTextBuffer, "SAV")) { // debug(DBG_GAME, "End of demo interactive part"); // strcpy(_tempTextBuffer, "A03.SCN"); FileHolder fh(_fs, _tempTextBuffer); if (!fh._fp) { warning("Unable to load game state from file '%s'", _tempTextBuffer); } else { strcpy(_currentSceneSav, _tempTextBuffer); loadState(fh._fp, kDemoSavSlot, true); _loadState = _switchScene; // load on scene switch } } } for (int i = 0; i < _sceneObjectsCount; ++i) { reinitializeObject(i); } if (kCheatNoHit) { _varsTable[0] = 0; } if (_varsTable[0] >= 10 && !_gameOver) { strcpy(_musicName, "..\\midi\\gameover.mid"); playMusic(_musicName); _gameOver = true; // _skipUpdateScreen = false; } if (_loadDataState == 2) { updateObjects(); } } // _skipUpdateScreen = false; if (_varsTable[241] == 1) { // _startEndingScene = true; stopMusic(); clearSceneData(-1); _varsTable[241] = 2; playVideo("DATA/FINAL.AVI"); strcpy(_tempTextBuffer, "END.SCN"); _switchScene = true; } }
void Game::runObjectsScript() { debug(DBG_GAME, "Game::runObjectsScript()"); _objectScript.nextScene = -1; assert(_loadDataState != 3); // unneeded code if (_varsTable[309]) { memset(_keysPressed, 0, sizeof(_keysPressed)); } if (_loadDataState == 2) { int start = _workaroundRaftFlySceneBug ? 1 : 0; _workaroundRaftFlySceneBug = false; for (int i = start; i < _sceneObjectsCount; ++i) { SceneObject *so = &_sceneObjectsTable[i]; if (so->statePrev == 0 || so->statePrev == -1) { continue; } debug(DBG_GAME, "Game::runObjectsScript() currentObjectNum=%d", i); _objectScript.currentObjectNum = i; int anim = _sceneObjectMotionsTable[so->motionNum1].animNum; assert(anim >= 0 && anim < _animationsCount); _objectScript.data = _animationsTable[anim].scriptData; int endOfDataOffset = _animationsTable[anim].scriptSize; // endOfDataOffset2 _objectScript.dataOffset = 0; int statement = 0; while (_objectScript.dataOffset < endOfDataOffset) { _objectScript.statementNum = statement; int endOfStatementDataOffset = _objectScript.fetchNextWord(); // endOfDataOffset1 _objectScript.testObjectNum = -1; _objectScript.testDataOffset = endOfStatementDataOffset; bool loop = true; while (loop) { int op = _objectScript.fetchNextWord(); debug(DBG_OPCODES, "statement %d condition %d op %d", statement, i, op); if (op == 0) { break; } const GameConditionOpcode *cop = findConditionOpcode(op); if (!cop) { error("Invalid condition %d", op); } loop = (this->*(cop->pf))(); } if (loop) { while (_objectScript.dataOffset < endOfStatementDataOffset) { int op = _objectScript.fetchNextWord(); debug(DBG_OPCODES, "statement %d operator %d op %d", statement, i, op); if (op == 100) { // &Game::oop_breakObjectScript endOfStatementDataOffset = _objectScript.dataOffset = endOfDataOffset; break; } const GameOperatorOpcode *oop = findOperatorOpcode(op); if (!oop) { error("Invalid operator %d", op); } (this->*(oop->pf))(); } } _objectScript.dataOffset = endOfStatementDataOffset; ++statement; } } _dialogueEndedFlag = 0; if (_objectScript.nextScene != -1 && _objectScript.nextScene < _sceneConditionsCount) { strcpy(_tempTextBuffer, _nextScenesTable[_objectScript.nextScene].name); _switchScene = true; } for (int i = 0; i < _sceneObjectsCount; ++i) { reinitializeObject(i); } #if 0 // cheat: no hit _varsTable[0] = 0; #endif if (_varsTable[0] >= 10 && !_gameOver) { strcpy(_musicName, "..\\midi\\gameover.mid"); playMusic(_musicName); _gameOver = true; // _skipUpdateScreen = false; } if (_loadDataState == 2) { updateObjects(); } } // _skipUpdateScreen = false; if (_varsTable[241] == 1) { // _startEndingScene = true; stopMusic(); clearSceneData(-1); _varsTable[241] = 2; playVideo("DATA/FINAL.AVI"); strcpy(_tempTextBuffer, "END.SCN"); _switchScene = true; } }