Example #1
0
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;
	}
}
Example #2
0
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;
	}
}
Example #3
0
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;
	}
}