void ResourceTree::fetchMore(const QModelIndex &index) { if (!index.isValid()) return; ResourceTreeItem *item = itemFromIndex(index); // We already added the archive members. Nothing to do Archive &archive = item->getArchive(); if (archive.addedMembers) return; _mainWindow->statusPush(tr("Loading archive") + item->getName() + "..."); BOOST_SCOPE_EXIT((&_mainWindow)) { _mainWindow->statusPop(); } BOOST_SCOPE_EXIT_END if (item->getFileType() == Aurora::kFileTypeBIF) { for (ResourceTreeItem *keyItem : _keys) { Aurora::KEYFile *keyFile = static_cast<Aurora::KEYFile *>(getArchive(*keyItem)); const auto &dataFiles = keyFile->getDataFileList(); for (const Common::UString &dataFile : dataFiles) { if (dataFile.endsWith(USTR(item->getName()))) { archive.data = keyFile; insertItemsFromArchive(archive, *item, index); } } } return; } // Load the archive, if necessary if (!archive.data) { try { archive.data = getArchive(*item); } catch (Common::Exception &e) { // If that fails, print the error and treat this archive as empty e.add("Failed to load archive \"%s\"", item->getName().toStdString().c_str()); Common::printException(e, "WARNING: "); return; } } insertItemsFromArchive(archive, *item, index); archive.addedMembers = true; }
// ----------------------------------------------------------------------------- // Opens [dir] as a DirArchive and adds it to the list. // Returns a pointer to the archive or nullptr if an error occurred. // ----------------------------------------------------------------------------- Archive* ArchiveManager::openDirArchive(const string& dir, bool manage, bool silent) { auto new_archive = getArchive(dir); LOG_MESSAGE(1, "Opening directory %s as archive", dir); // If the archive is already open, just return it if (new_archive) { // Announce open if (!silent) { MemChunk mc; uint32_t index = archiveIndex(new_archive); mc.write(&index, 4); announce("archive_opened", mc); } return new_archive; } new_archive = new DirArchive(); // If it opened successfully, add it to the list if needed & return it, // Otherwise, delete it and return nullptr if (new_archive->open(dir)) { if (manage) { // Add the archive addArchive(new_archive); // Announce open if (!silent) { MemChunk mc; uint32_t index = archiveIndex(new_archive); mc.write(&index, 4); announce("archive_opened", mc); } // Add to recent files addRecentFile(dir); } // Return the opened archive return new_archive; } else { LOG_MESSAGE(1, "Error: " + Global::error); delete new_archive; return nullptr; } }
IArchive* ArchiveMgr::getArchive(const string& archiveName) { eType type = archiveNameToType(archiveName); return getArchive(type); }
// ----------------------------------------------------------------------------- // Opens and adds a archive to the list, returns a pointer to the newly opened // and added archive, or nullptr if an error occurred // ----------------------------------------------------------------------------- Archive* ArchiveManager::openArchive(const string& filename, bool manage, bool silent) { // Check for directory if (!wxFile::Exists(filename) && wxDirExists(filename)) return openDirArchive(filename, manage, silent); auto new_archive = getArchive(filename); LOG_MESSAGE(1, "Opening archive %s", filename); // If the archive is already open, just return it if (new_archive) { // Announce open if (!silent) { MemChunk mc; uint32_t index = archiveIndex(new_archive); mc.write(&index, 4); announce("archive_opened", mc); } return new_archive; } // Determine file format if (WadArchive::isWadArchive(filename)) new_archive = new WadArchive(); else if (ZipArchive::isZipArchive(filename)) new_archive = new ZipArchive(); else if (ResArchive::isResArchive(filename)) new_archive = new ResArchive(); else if (DatArchive::isDatArchive(filename)) new_archive = new DatArchive(); else if (LibArchive::isLibArchive(filename)) new_archive = new LibArchive(); else if (PakArchive::isPakArchive(filename)) new_archive = new PakArchive(); else if (BSPArchive::isBSPArchive(filename)) new_archive = new BSPArchive(); else if (GrpArchive::isGrpArchive(filename)) new_archive = new GrpArchive(); else if (RffArchive::isRffArchive(filename)) new_archive = new RffArchive(); else if (GobArchive::isGobArchive(filename)) new_archive = new GobArchive(); else if (LfdArchive::isLfdArchive(filename)) new_archive = new LfdArchive(); else if (HogArchive::isHogArchive(filename)) new_archive = new HogArchive(); else if (ADatArchive::isADatArchive(filename)) new_archive = new ADatArchive(); else if (Wad2Archive::isWad2Archive(filename)) new_archive = new Wad2Archive(); else if (WadJArchive::isWadJArchive(filename)) new_archive = new WadJArchive(); else if (WolfArchive::isWolfArchive(filename)) new_archive = new WolfArchive(); else if (GZipArchive::isGZipArchive(filename)) new_archive = new GZipArchive(); else if (BZip2Archive::isBZip2Archive(filename)) new_archive = new BZip2Archive(); else if (TarArchive::isTarArchive(filename)) new_archive = new TarArchive(); else if (DiskArchive::isDiskArchive(filename)) new_archive = new DiskArchive(); else if (PodArchive::isPodArchive(filename)) new_archive = new PodArchive(); else if (ChasmBinArchive::isChasmBinArchive(filename)) new_archive = new ChasmBinArchive(); else if (SiNArchive::isSiNArchive(filename)) new_archive = new SiNArchive(); else { // Unsupported format Global::error = "Unsupported or invalid Archive format"; return nullptr; } // If it opened successfully, add it to the list if needed & return it, // Otherwise, delete it and return nullptr if (new_archive->open(filename)) { if (manage) { // Add the archive addArchive(new_archive); // Announce open if (!silent) { MemChunk mc; uint32_t index = archiveIndex(new_archive); mc.write(&index, 4); announce("archive_opened", mc); } // Add to recent files addRecentFile(filename); } // Return the opened archive return new_archive; } else { LOG_MESSAGE(1, "Error: " + Global::error); delete new_archive; return nullptr; } }
bool Menu::handleEvent(StartMenuAction action, Common::EventType type) { bool clicked = (type == Common::EVENT_LBUTTONUP); switch(action) { default: hideOverlays(); break; ////////////////////////////////////////////////////////////////////////// case kMenuCredits: if (hasTimeDelta()) { hideOverlays(); break; } if (clicked) { showFrame(kOverlayEggButtons, kButtonCreditsPushed, true); showFrame(kOverlayTooltip, -1, true); getSound()->playSound(kEntityPlayer, "LIB046"); hideOverlays(); _isShowingCredits = true; _creditsSequenceIndex = 0; showFrame(kOverlayCredits, 0, true); } else { // TODO check flags ? showFrame(kOverlayEggButtons, kButtonCredits, true); showFrame(kOverlayTooltip, kTooltipCredits, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuQuitGame: showFrame(kOverlayTooltip, kTooltipQuit, true); if (clicked) { showFrame(kOverlayButtons, kButtonQuitPushed, true); getSound()->clearStatus(); getSound()->updateQueue(); getSound()->playSound(kEntityPlayer, "LIB046"); // FIXME uncomment when sound queue is properly implemented /*while (getSound()->isBuffered("LIB046")) getSound()->updateQueue();*/ getFlags()->shouldRedraw = false; Engine::quitGame(); return false; } else { showFrame(kOverlayButtons, kButtonQuit, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuCase4: if (clicked) _index = 0; // fall down to kMenuContinue ////////////////////////////////////////////////////////////////////////// case kMenuContinue: { if (hasTimeDelta()) { hideOverlays(); break; } // Determine the proper CD archive ArchiveIndex cd = kArchiveCd1; if (getProgress().chapter > kChapter1) cd = (getProgress().chapter > kChapter3) ? kArchiveCd3 : kArchiveCd2; // Show tooltips & buttons to start a game, continue a game or load the proper cd if (ResourceManager::isArchivePresent(cd)) { if (_isGameStarted) { showFrame(kOverlayEggButtons, kButtonContinue, true); if (_lastIndex == _index) { showFrame(kOverlayTooltip, getSaveLoad()->isGameFinished(_index, _lastIndex) ? kTooltipViewGameEnding : kTooltipContinueGame, true); } else { showFrame(kOverlayTooltip, kTooltipContinueRewoundGame, true); } } else { showFrame(kOverlayEggButtons, kButtonShield, true); showFrame(kOverlayTooltip, kTooltipPlayNewGame, true); } } else { showFrame(kOverlayEggButtons, -1, true); showFrame(kOverlayTooltip, cd - 1, true); } if (!clicked) break; // Try loading the archive file if (!_engine->getResourceManager()->loadArchive(cd)) break; // Load the train data file and setup game getScenes()->loadSceneDataFile(cd); showFrame(kOverlayTooltip, -1, true); getSound()->playSound(kEntityPlayer, "LIB046"); // Setup new game getSavePoints()->reset(); setLogicEventHandlers(); if (_index) { getSound()->processEntry(SoundManager::kSoundType11); } else { if (!getFlags()->mouseRightClick) { getScenes()->loadScene((SceneIndex)(5 * _gameId + 3)); if (!getFlags()->mouseRightClick) { getScenes()->loadScene((SceneIndex)(5 * _gameId + 4)); if (!getFlags()->mouseRightClick) { getScenes()->loadScene((SceneIndex)(5 * _gameId + 5)); if (!getFlags()->mouseRightClick) { getSound()->processEntry(SoundManager::kSoundType11); // Show intro Animation animation; if (animation.load(getArchive("1601.nis"))) animation.play(); getEvent(kEventIntro) = 1; } } } } if (!getEvent(kEventIntro)) { getEvent(kEventIntro) = 1; getSound()->processEntry(SoundManager::kSoundType11); } } // Setup game getFlags()->isGameRunning = true; startGame(); if (!_isShowingMenu) getInventory()->show(); return false; } ////////////////////////////////////////////////////////////////////////// case kMenuSwitchSaveGame: if (hasTimeDelta()) { hideOverlays(); break; } if (clicked) { showFrame(kOverlayAcorn, 1, true); showFrame(kOverlayTooltip, -1, true); getSound()->playSound(kEntityPlayer, "LIB047"); // Setup new menu screen switchGame(); setup(); // Set fight state to 0 getFight()->resetState(); return true; } // TODO Check for flag showFrame(kOverlayAcorn, 0, true); if (_isGameStarted) { showFrame(kOverlayTooltip, kTooltipSwitchBlueGame, true); break; } if (_gameId == kGameGold) { showFrame(kOverlayTooltip, kTooltipSwitchBlueGame, true); break; } if (!SaveLoad::isSavegameValid(getNextGameId())) { showFrame(kOverlayTooltip, kTooltipStartAnotherGame, true); break; } // Stupid tooltips ids are not in order, so we can't just increment them... switch(_gameId) { default: break; case kGameBlue: showFrame(kOverlayTooltip, kTooltipSwitchRedGame, true); break; case kGameRed: showFrame(kOverlayTooltip, kTooltipSwitchGreenGame, true); break; case kGameGreen: showFrame(kOverlayTooltip, kTooltipSwitchPurpleGame, true); break; case kGamePurple: showFrame(kOverlayTooltip, kTooltipSwitchTealGame, true); break; case kGameTeal: showFrame(kOverlayTooltip, kTooltipSwitchGoldGame, true); break; } break; ////////////////////////////////////////////////////////////////////////// case kMenuRewindGame: if (!_index || _currentTime < _time) { hideOverlays(); break; } if (clicked) { if (hasTimeDelta()) _handleTimeDelta = false; showFrame(kOverlayEggButtons, kButtonRewindPushed, true); showFrame(kOverlayTooltip, -1, true); getSound()->playSound(kEntityPlayer, "LIB046"); rewindTime(); _handleTimeDelta = false; } else { showFrame(kOverlayEggButtons, kButtonRewind, true); showFrame(kOverlayTooltip, kTooltipRewind, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuForwardGame: if (_lastIndex <= _index || _currentTime > _time) { hideOverlays(); break; } if (clicked) { if (hasTimeDelta()) _handleTimeDelta = false; showFrame(kOverlayEggButtons, kButtonForwardPushed, true); showFrame(kOverlayTooltip, -1, true); getSound()->playSound(kEntityPlayer, "LIB046"); forwardTime(); _handleTimeDelta = false; } else { showFrame(kOverlayEggButtons, kButtonForward, true); showFrame(kOverlayTooltip, kTooltipFastForward, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuParis: moveToCity(kParis, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuStrasBourg: moveToCity(kStrasbourg, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuMunich: moveToCity(kMunich, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuVienna: moveToCity(kVienna, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuBudapest: moveToCity(kBudapest, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuBelgrade: moveToCity(kBelgrade, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuConstantinople: moveToCity(kConstantinople, clicked); break; ////////////////////////////////////////////////////////////////////////// case kMenuDecreaseVolume: if (hasTimeDelta()) { hideOverlays(); break; } // Cannot decrease volume further if (getVolume() == 0) { showFrame(kOverlayButtons, kButtonVolume, true); showFrame(kOverlayTooltip, -1, true); break; } showFrame(kOverlayTooltip, kTooltipVolumeDown, true); // Show highlight on button & adjust volume if needed if (clicked) { showFrame(kOverlayButtons, kButtonVolumeDownPushed, true); getSound()->playSound(kEntityPlayer, "LIB046"); setVolume(getVolume() - 1); getSaveLoad()->saveVolumeBrightness(); uint32 nextFrameCount = getFrameCount() + 15; while (nextFrameCount > getFrameCount()) { _engine->pollEvents(); getSound()->updateQueue(); } } else { showFrame(kOverlayButtons, kButtonVolumeDown, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuIncreaseVolume: if (hasTimeDelta()) { hideOverlays(); break; } // Cannot increase volume further if (getVolume() >= 7) { showFrame(kOverlayButtons, kButtonVolume, true); showFrame(kOverlayTooltip, -1, true); break; } showFrame(kOverlayTooltip, kTooltipVolumeUp, true); // Show highlight on button & adjust volume if needed if (clicked) { showFrame(kOverlayButtons, kButtonVolumeUpPushed, true); getSound()->playSound(kEntityPlayer, "LIB046"); setVolume(getVolume() + 1); getSaveLoad()->saveVolumeBrightness(); uint32 nextFrameCount = getFrameCount() + 15; while (nextFrameCount > getFrameCount()) { _engine->pollEvents(); getSound()->updateQueue(); } } else { showFrame(kOverlayButtons, kButtonVolumeUp, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuDecreaseBrightness: if (hasTimeDelta()) { hideOverlays(); break; } // Cannot increase brightness further if (getBrightness() == 0) { showFrame(kOverlayButtons, kButtonBrightness, true); showFrame(kOverlayTooltip, -1, true); break; } showFrame(kOverlayTooltip, kTooltipBrightnessDown, true); // Show highlight on button & adjust brightness if needed if (clicked) { showFrame(kOverlayButtons, kButtonBrightnessDownPushed, true); getSound()->playSound(kEntityPlayer, "LIB046"); setBrightness(getBrightness() - 1); getSaveLoad()->saveVolumeBrightness(); // Reshow the background and frames (they will pick up the new brightness through the GraphicsManager) _engine->getGraphicsManager()->draw(getScenes()->get((SceneIndex)(_isGameStarted ? _gameId * 5 + 1 : _gameId * 5 + 2)), GraphicsManager::kBackgroundC, true); showFrame(kOverlayTooltip, kTooltipBrightnessDown, false); showFrame(kOverlayButtons, kButtonBrightnessDownPushed, false); } else { showFrame(kOverlayButtons, kButtonBrightnessDown, true); } break; ////////////////////////////////////////////////////////////////////////// case kMenuIncreaseBrightness: if (hasTimeDelta()) { hideOverlays(); break; } // Cannot increase brightness further if (getBrightness() >= 6) { showFrame(kOverlayButtons, kButtonBrightness, true); showFrame(kOverlayTooltip, -1, true); break; } showFrame(kOverlayTooltip, kTooltipBrightnessUp, true); // Show highlight on button & adjust brightness if needed if (clicked) { showFrame(kOverlayButtons, kButtonBrightnessUpPushed, true); getSound()->playSound(kEntityPlayer, "LIB046"); setBrightness(getBrightness() + 1); getSaveLoad()->saveVolumeBrightness(); // Reshow the background and frames (they will pick up the new brightness through the GraphicsManager) _engine->getGraphicsManager()->draw(getScenes()->get((SceneIndex)(_isGameStarted ? _gameId * 5 + 1 : _gameId * 5 + 2)), GraphicsManager::kBackgroundC, true); showFrame(kOverlayTooltip, kTooltipBrightnessUp, false); showFrame(kOverlayButtons, kButtonBrightnessUpPushed, false); } else { showFrame(kOverlayButtons, kButtonBrightnessUp, true); } break; } return true; }
////////////////////////////////////////////////////////////////////////// // Show the intro and load the main menu scene void Menu::show(bool doSavegame, SavegameType type, uint32 value) { if (_isShowingMenu) return; _isShowingMenu = true; getEntities()->reset(); // If no blue savegame exists, this might be the first time we start the game, so we show the full intro if (!getFlags()->mouseRightClick) { if (!SaveLoad::isSavegameValid(kGameBlue) && _engine->getResourceManager()->loadArchive(kArchiveCd1)) { if (!_hasShownIntro) { // Show Broderbrund logo Animation animation; if (animation.load(getArchive("1930.nis"))) animation.play(); getFlags()->mouseRightClick = false; // Play intro music getSound()->playSoundWithSubtitles("MUS001.SND", SoundManager::kFlagMusic, kEntityPlayer); // Show The Smoking Car logo if (animation.load(getArchive("1931.nis"))) animation.play(); _hasShownIntro = true; } } else { // Only show the quick intro if (!_hasShownStartScreen) { getSound()->playSoundWithSubtitles("MUS018.SND", SoundManager::kFlagMusic, kEntityPlayer); getScenes()->loadScene(kSceneStartScreen); // Original game waits 60 frames and loops Sound::unknownFunction1 unless the right button is pressed uint32 nextFrameCount = getFrameCount() + 60; while (getFrameCount() < nextFrameCount) { _engine->pollEvents(); if (getFlags()->mouseRightClick) break; getSound()->updateQueue(); } } } } _hasShownStartScreen = true; // Init Menu init(doSavegame, type, value); // Setup sound getSound()->unknownFunction4(); getSound()->resetQueue(SoundManager::kSoundType11, SoundManager::kSoundType13); if (getSound()->isBuffered("TIMER")) getSound()->removeFromQueue("TIMER"); // Init flags & misc _isShowingCredits = false; _handleTimeDelta = hasTimeDelta(); getInventory()->unselectItem(); // Set Cursor type _engine->getCursor()->setStyle(kCursorNormal); _engine->getCursor()->show(true); setup(); checkHotspots(); // Set event handlers SET_EVENT_HANDLERS(Menu, this); }
Alembic::Abc::IArchive IFactory::getArchive( const std::string & iFileName ) { CoreType coreType; return getArchive( iFileName, coreType ); }