bool Keyboard::getKey(Common::Event &event, int &cgeCode) { Common::KeyCode keycode = event.kbd.keycode; if ((keycode == Common::KEYCODE_LCTRL) || (keycode == Common::KEYCODE_RCTRL)) { cgeCode = kKeyCtrl; return true; } if ((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) { cgeCode = kKeyAlt; return true; } if (keycode == Common::KEYCODE_KP_ENTER) { cgeCode = 28; return true; } if (keycode == Common::KEYCODE_F5) { warning("keycode %d", event.kbd.ascii); if (_vm->canSaveGameStateCurrently()) { const EnginePlugin *plugin = NULL; EngineMan.findGame(_vm->_gameDescription->gameid, &plugin); GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save"); dialog->setSaveMode(true); int16 savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); Common::String savegameDescription = dialog->getResultString(); delete dialog; _vm->saveGameState(savegameId, savegameDescription); } return false; } else if (keycode == Common::KEYCODE_F7) { if (_vm->canLoadGameStateCurrently()) { const EnginePlugin *plugin = NULL; EngineMan.findGame(_vm->_gameDescription->gameid, &plugin); GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore"); dialog->setSaveMode(false); int16 savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); delete dialog; _vm->loadGameState(savegameId); } return false; } // Scan through the ScummVM mapping list for (int idx = 0; idx < 0x60; idx++) { if (_scummVmCodes[idx] == event.kbd.ascii) { cgeCode = idx; return true; } } return false; }
void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) { const EnginePlugin *plugin = 0; EngineMan.findGame(_vm->getGameId(), &plugin); GUI::SaveLoadChooser *dialog; if (saveFlag) dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); else dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); dialog->setSaveMode(saveFlag); saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); saveName = dialog->getResultString(); delete dialog; }
/** * Restore game from supplied slot number */ bool FileManager::restoreGame(const int16 slot) { debugC(1, kDebugFile, "restoreGame(%d)", slot); const EnginePlugin *plugin = NULL; int16 savegameId; EngineMan.findGame(_vm->getGameId(), &plugin); if (slot == -1) { GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore"); dialog->setSaveMode(false); savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); delete dialog; } else { savegameId = slot; } if (savegameId < 0) // dialog aborted return false; Common::String savegameFile = _vm->getSavegameFilename(savegameId); Common::SaveFileManager *saveMan = g_system->getSavefileManager(); Common::InSaveFile *in = saveMan->openForLoading(savegameFile); if (!in) return false; // Initialize new-game status _vm->initStatus(); // Check version, can't restore from different versions int saveVersion = in->readByte(); if (saveVersion != kSavegameVersion) { warning("Savegame of incompatible version"); delete in; return false; } // Skip over description int32 saveGameNameSize = in->readSint16BE(); in->skip(saveGameNameSize); Graphics::skipThumbnail(*in); in->skip(6); // Skip date & time // If hero image is currently swapped, swap it back before restore if (_vm->_heroImage != kHeroIndex) _vm->_object->swapImages(kHeroIndex, _vm->_heroImage); _vm->_object->restoreObjects(in); _vm->_heroImage = in->readByte(); // If hero swapped in saved game, swap it byte heroImg = _vm->_heroImage; if (heroImg != kHeroIndex) _vm->_object->swapImages(kHeroIndex, _vm->_heroImage); _vm->_heroImage = heroImg; status_t &gameStatus = _vm->getGameStatus(); int score = in->readSint16BE(); _vm->setScore(score); gameStatus.storyModeFl = (in->readByte() == 1); _vm->_mouse->setJumpExitFl(in->readByte() == 1); gameStatus.gameOverFl = (in->readByte() == 1); for (int i = 0; i < _vm->_numStates; i++) _vm->_screenStates[i] = in->readByte(); _vm->_scheduler->restoreSchedulerData(in); // Restore palette and change it if necessary _vm->_screen->restorePal(in); // Restore maze status _vm->_maze.enabledFl = (in->readByte() == 1); _vm->_maze.size = in->readByte(); _vm->_maze.x1 = in->readSint16BE(); _vm->_maze.y1 = in->readSint16BE(); _vm->_maze.x2 = in->readSint16BE(); _vm->_maze.y2 = in->readSint16BE(); _vm->_maze.x3 = in->readSint16BE(); _vm->_maze.x4 = in->readSint16BE(); _vm->_maze.firstScreenIndex = in->readByte(); _vm->_scheduler->restoreScreen(*_vm->_screen_p); if ((_vm->getGameStatus().viewState = (vstate_t) in->readByte()) != kViewPlay) _vm->_screen->hideCursor(); delete in; return true; }
/** * Save game to supplied slot */ bool FileManager::saveGame(const int16 slot, const Common::String &descrip) { debugC(1, kDebugFile, "saveGame(%d, %s)", slot, descrip.c_str()); const EnginePlugin *plugin = NULL; int16 savegameId; Common::String savegameDescription; EngineMan.findGame(_vm->getGameId(), &plugin); if (slot == -1) { GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save"); dialog->setSaveMode(true); savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); savegameDescription = dialog->getResultString(); delete dialog; } else { savegameId = slot; if (!descrip.empty()) { savegameDescription = descrip; } else { savegameDescription = Common::String::format("Quick save #%d", slot); } } if (savegameId < 0) // dialog aborted return false; Common::String savegameFile = _vm->getSavegameFilename(savegameId); Common::SaveFileManager *saveMan = g_system->getSavefileManager(); Common::OutSaveFile *out = saveMan->openForSaving(savegameFile); if (!out) { warning("Can't create file '%s', game not saved", savegameFile.c_str()); return false; } // Write version. We can't restore from obsolete versions out->writeByte(kSavegameVersion); if (savegameDescription == "") { savegameDescription = "Untitled savegame"; } out->writeSint16BE(savegameDescription.size() + 1); out->write(savegameDescription.c_str(), savegameDescription.size() + 1); Graphics::saveThumbnail(*out); TimeDate curTime; _vm->_system->getTimeAndDate(curTime); uint32 saveDate = (curTime.tm_mday & 0xFF) << 24 | ((curTime.tm_mon + 1) & 0xFF) << 16 | ((curTime.tm_year + 1900) & 0xFFFF); uint16 saveTime = (curTime.tm_hour & 0xFF) << 8 | ((curTime.tm_min) & 0xFF); out->writeUint32BE(saveDate); out->writeUint16BE(saveTime); _vm->_object->saveObjects(out); const status_t &gameStatus = _vm->getGameStatus(); // Save whether hero image is swapped out->writeByte(_vm->_heroImage); // Save score out->writeSint16BE(_vm->getScore()); // Save story mode out->writeByte((gameStatus.storyModeFl) ? 1 : 0); // Save jumpexit mode out->writeByte((_vm->_mouse->getJumpExitFl()) ? 1 : 0); // Save gameover status out->writeByte((gameStatus.gameOverFl) ? 1 : 0); // Save screen states for (int i = 0; i < _vm->_numStates; i++) out->writeByte(_vm->_screenStates[i]); _vm->_scheduler->saveSchedulerData(out); // Save palette table _vm->_screen->savePal(out); // Save maze status out->writeByte((_vm->_maze.enabledFl) ? 1 : 0); out->writeByte(_vm->_maze.size); out->writeSint16BE(_vm->_maze.x1); out->writeSint16BE(_vm->_maze.y1); out->writeSint16BE(_vm->_maze.x2); out->writeSint16BE(_vm->_maze.y2); out->writeSint16BE(_vm->_maze.x3); out->writeSint16BE(_vm->_maze.x4); out->writeByte(_vm->_maze.firstScreenIndex); out->writeByte((byte)_vm->getGameStatus().viewState); out->finalize(); delete out; return true; }
bool Keyboard::getKey(Common::Event &event) { Common::KeyCode keycode = event.kbd.keycode; if ((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) _keyAlt = true; else _keyAlt = false; switch (keycode) { case Common::KEYCODE_F1: if (event.type == Common::EVENT_KEYUP) return false; // Display ScummVM version and translation strings for (int i = 0; i < 5; i++) _vm->_commandHandler->addCommand(kCmdInf, 1, kShowScummVMVersion + i, NULL); return false; case Common::KEYCODE_F5: if (_vm->canSaveGameStateCurrently()) { const EnginePlugin *plugin = NULL; EngineMan.findGame(_vm->_gameDescription->gameid, &plugin); GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save"); dialog->setSaveMode(true); int16 savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); Common::String savegameDescription = dialog->getResultString(); delete dialog; if (savegameId != -1) _vm->saveGameState(savegameId, savegameDescription); } return false; case Common::KEYCODE_F7: if (_vm->canLoadGameStateCurrently()) { const EnginePlugin *plugin = NULL; EngineMan.findGame(_vm->_gameDescription->gameid, &plugin); GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore"); dialog->setSaveMode(false); int16 savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); delete dialog; if (savegameId != -1) _vm->loadGameState(savegameId); } return false; case Common::KEYCODE_d: if (event.kbd.flags & Common::KBD_CTRL) { // Start the debugger _vm->getDebugger()->attach(); _vm->getDebugger()->onFrame(); return false; } break; case Common::KEYCODE_x: if (event.kbd.flags & Common::KBD_ALT) { _vm->quit(); return false; } break; case Common::KEYCODE_0: case Common::KEYCODE_1: case Common::KEYCODE_2: case Common::KEYCODE_3: case Common::KEYCODE_4: if (event.kbd.flags & Common::KBD_ALT) { _vm->_commandHandler->addCommand(kCmdLevel, -1, keycode - '0', NULL); return false; } default: break; } return true; }