// flagbits: 0 = freeInterVariables, 1 = skipPlay void Game::totSub(int8 flags, const char *newTotFile) { int8 curBackupPos; if ((flags == 16) || (flags == 17)) warning("Urban Stub: Game::totSub(), flags == %d", flags); if (_numEnvironments >= Environments::kEnvironmentCount) return; _environments->set(_numEnvironments); curBackupPos = _curEnvironment; _numEnvironments++; _curEnvironment = _numEnvironments; _script = new Script(_vm); _resources = new Resources(_vm); if (flags & 0x80) warning("Urban Stub: Game::totSub(), flags & 0x80"); if (flags & 1) _vm->_inter->_variables = 0; Common::strlcpy(_curTotFile, newTotFile, 10); strcat(_curTotFile, ".TOT"); if (_vm->_inter->_terminate != 0) { clearUnusedEnvironment(); return; } _hotspots->push(0, true); if (flags & 2) playTot(-1); else playTot(0); if (_vm->_inter->_terminate != 2) _vm->_inter->_terminate = 0; _hotspots->clear(); _hotspots->pop(); if ((flags & 1) && _vm->_inter->_variables) { _vm->_inter->delocateVars(); } clearUnusedEnvironment(); _numEnvironments--; _curEnvironment = curBackupPos; _environments->get(_numEnvironments); }
void Game::start() { prepareStart(); playTot(-2); _vm->_draw->closeScreen(); for (int i = 0; i < Draw::kSpriteCount; i++) _vm->_draw->freeSprite(i); _vm->_draw->_scummvmCursor.reset(); }
void Game::start() { prepareStart(); playTot(-2); _vm->_draw->closeScreen(); for (int i = 0; i < SPRITES_COUNT; i++) _vm->_draw->freeSprite(i); _vm->_draw->_scummvmCursor.reset(); }
void Game::switchTotSub(int16 index, int16 function) { int16 backupedCount; int16 curBackupPos; if ((_numEnvironments - index) < 1) return; int16 newPos = _curEnvironment - index - ((index >= 0) ? 1 : 0); if (newPos >= Environments::kEnvironmentCount) return; // WORKAROUND: Some versions don't make the MOVEMENT menu item unselectable // in the dreamland screen, resulting in a crash when it's clicked. if ((_vm->getGameType() == kGameTypeGob2) && (index == -1) && (function == 7) && _environments.getTotFile(newPos).equalsIgnoreCase("gob06.tot")) return; curBackupPos = _curEnvironment; backupedCount = _numEnvironments; if (_curEnvironment == _numEnvironments) _environments.set(_numEnvironments++); _curEnvironment -= index; if (index >= 0) _curEnvironment--; clearUnusedEnvironment(); _environments.get(_curEnvironment); if (_vm->_inter->_terminate != 0) { clearUnusedEnvironment(); return; } _hotspots->push(0, true); playTot(function); if (_vm->_inter->_terminate != 2) _vm->_inter->_terminate = 0; _hotspots->pop(); clearUnusedEnvironment(); _curEnvironment = curBackupPos; _numEnvironments = backupedCount; _environments.get(_curEnvironment); }
// flagbits: 0 = freeInterVariables, 1 = function -1 void Game::totSub(int8 flags, const Common::String &totFile) { int8 curBackupPos; if ((flags == 16) || (flags == 17)) { // Prefetch tot data + delete prefetched data return; } if (_numEnvironments >= Environments::kEnvironmentCount) error("Game::totSub(): Environments overflow"); _environments.set(_numEnvironments); if (flags == 18) { warning("Backuping media to %d", _numEnvironments); _environments.setMedia(_numEnvironments); } curBackupPos = _curEnvironment; _numEnvironments++; _curEnvironment = _numEnvironments; _script = new Script(_vm); _resources = new Resources(_vm); if (flags & 0x80) warning("Addy Stub: Game::totSub(), flags & 0x80"); if (flags & 5) _vm->_inter->_variables = 0; _curTotFile = totFile + ".TOT"; if (_vm->_inter->_terminate != 0) { clearUnusedEnvironment(); return; } if (!(flags & 0x20)) _hotspots->push(0, true); if ((flags == 18) || (flags & 0x06)) playTot(-1); else playTot(0); if (_vm->_inter->_terminate != 2) _vm->_inter->_terminate = 0; if (!(flags & 0x20)) { _hotspots->clear(); _hotspots->pop(); } if ((flags & 5) && _vm->_inter->_variables) _vm->_inter->delocateVars(); clearUnusedEnvironment(); _numEnvironments--; _curEnvironment = curBackupPos; _environments.get(_numEnvironments); if (flags == 18) { warning("Restoring media from %d", _numEnvironments); _environments.getMedia(_numEnvironments); } _vm->_global->_inter_animDataSize = _script->getAnimDataSize(); }