diff --git a/docs/index.html b/docs/index.html index 90e9df308..c1d77fd7d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1518,12 +1518,6 @@ Shift-Control + f - - Save current game's properties to a separate properties file - Control + s - Control + s - - Switch mouse between controller emulation modes (see Game Properties - Controller) Control + 0 diff --git a/src/common/PKeyboardHandler.cxx b/src/common/PKeyboardHandler.cxx index 779a01566..66cc4b970 100644 --- a/src/common/PKeyboardHandler.cxx +++ b/src/common/PKeyboardHandler.cxx @@ -524,21 +524,6 @@ void PhysicalKeyboardHandler::handleEvent(StellaKey key, StellaMod mod, bool sta myOSystem.console().changeHeight(-1); break; - case KBDK_S: // Ctrl-s saves properties to a file - { - string filename = myOSystem.baseDir() + - myOSystem.console().properties().get(Cartridge_Name) + ".pro"; - ofstream out(filename); - if(out) - { - out << myOSystem.console().properties(); - myOSystem.frameBuffer().showMessage("Properties saved"); - } - else - myOSystem.frameBuffer().showMessage("Error saving properties"); - break; - } - default: handled = false; break; diff --git a/src/emucore/OSystem.cxx b/src/emucore/OSystem.cxx index f4ef445bc..3363e1e99 100644 --- a/src/emucore/OSystem.cxx +++ b/src/emucore/OSystem.cxx @@ -132,8 +132,8 @@ bool OSystem::create() myEventHandler = MediaFactory::createEventHandler(*this); myEventHandler->initialize(); - // Create a properties set for us to use and set it up - myPropSet = make_unique(propertiesFile()); + // Create the ROM properties database + myPropSet = make_unique(myPropertiesFile); #ifdef CHEATCODE_SUPPORT myCheatManager = make_unique(*this); @@ -220,56 +220,6 @@ void OSystem::setConfigPaths() mySettings->setValue("propsfile", node.getShortPath()); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -PropertiesSet& OSystem::propSet(const string& md5) -{ - FilesystemNode node = FilesystemNode(); - - return propSet(md5, node); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -PropertiesSet& OSystem::propSet(const string& md5, const FilesystemNode& node) -{ - if(md5 == EmptyString) - return *myPropSet; - else if(md5 == myGamePropSetMD5) - return *myGamePropSet; - else if (!node.exists()) - return *myPropSet; - - // Get a valid set of game specific properties - Properties props; - string path = myBaseDir + node.getNameWithExt(".pro"); - - // Create a properties set based on ROM name - FilesystemNode propNode = FilesystemNode(path); - myGamePropertiesFile = propNode.getPath(); - - myGamePropSet = make_unique(myGamePropertiesFile); - - // Check if game specific property file exists and has matching md5 - if(myGamePropSet->size() && myGamePropSet->getMD5(md5, props)) - { - myGamePropSetMD5 = md5; - return *myGamePropSet; - } - else - { - myGamePropSetMD5 = ""; - return *myPropSet; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void OSystem::saveGamePropSet(const string& md5) -{ - if(myGamePropSet->size() && md5 == myGamePropSetMD5) - { - myGamePropSet->save(myGamePropertiesFile); - } -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void OSystem::setBaseDir(const string& basedir) { @@ -504,13 +454,6 @@ unique_ptr OSystem::openConsole(const FilesystemNode& romfile, string& // For initial creation of the Cart, we're only concerned with the BS type Properties props; - // Load and use game specific props if existing - FilesystemNode node = FilesystemNode(romfile); - - string path = myBaseDir + node.getNameWithExt(".pro"); - PropertiesSet& propset = propSet(md5, romfile); - propset.getMD5(md5, props); - // Local helper method auto CMDLINE_PROPS_UPDATE = [&](const string& name, PropertyType prop) { @@ -531,12 +474,12 @@ unique_ptr OSystem::openConsole(const FilesystemNode& romfile, string& // and that the md5 (and hence the cart) has changed if(props.get(Cartridge_MD5) != cartmd5) { - if(!propset.getMD5(cartmd5, props)) + if(!myPropSet->getMD5(cartmd5, props)) { // Cart md5 wasn't found, so we create a new props for it props.set(Cartridge_MD5, cartmd5); props.set(Cartridge_Name, props.get(Cartridge_Name)+cart->multiCartID()); - propset.insert(props, false); + myPropSet->insert(props, false); } } diff --git a/src/emucore/OSystem.hxx b/src/emucore/OSystem.hxx index b192b2b3d..25072c730 100644 --- a/src/emucore/OSystem.hxx +++ b/src/emucore/OSystem.hxx @@ -112,13 +112,7 @@ class OSystem @return The properties set object */ - PropertiesSet& propSet(const string& md5 = EmptyString); - PropertiesSet& propSet(const string& md5, const FilesystemNode& node); - - /** - Save the game specific property file. - */ - void saveGamePropSet(const string& md5); + PropertiesSet& propSet() const { return *myPropSet; } /** Get the console of the system. The console won't always exist, @@ -270,14 +264,6 @@ class OSystem */ const string& paletteFile() const { return myPaletteFile; } - /** - This method should be called to get the full path of the - properties file (stella.pro). - - @return String representing the full path of the properties filename. - */ - const string& propertiesFile() const { return myPropertiesFile; } - /** This method should be called to get the full path of the currently loaded ROM. @@ -448,12 +434,6 @@ class OSystem // Pointer to the PropertiesSet object unique_ptr myPropSet; - // Pointer to the game's PropertiesSet object - unique_ptr myGamePropSet; - - // MD5 of the currently loaded game PropertiesSet object - string myGamePropSetMD5; - // Pointer to the (currently defined) Console object unique_ptr myConsole; @@ -510,7 +490,6 @@ class OSystem string myConfigFile; string myPaletteFile; string myPropertiesFile; - string myGamePropertiesFile; FilesystemNode myRomFile; string myRomMD5; diff --git a/src/emucore/PropsSet.cxx b/src/emucore/PropsSet.cxx index 1bb239fa4..742f51870 100644 --- a/src/emucore/PropsSet.cxx +++ b/src/emucore/PropsSet.cxx @@ -170,13 +170,6 @@ void PropertiesSet::insert(const Properties& properties, bool save) } } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void PropertiesSet::removeMD5(const string& md5) -{ - // We only remove from the external list - myExternalProps.erase(md5); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void PropertiesSet::print() const { diff --git a/src/emucore/PropsSet.hxx b/src/emucore/PropsSet.hxx index 9fc2cf927..12cb722ac 100644 --- a/src/emucore/PropsSet.hxx +++ b/src/emucore/PropsSet.hxx @@ -100,23 +100,11 @@ class PropertiesSet */ void insert(const Properties& properties, bool save = true); - /** - Marks the property with the given MD5 as being removed. - - @param md5 The md5 of the property to remove - */ - void removeMD5(const string& md5); - /** Prints the contents of the PropertiesSet as a flat file. */ void print() const; - /** - Return the size of the myExternalProps list - */ - uInt64 size() const { return myExternalProps.size(); } - private: using PropsList = std::map; diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index bad62b175..89a967b44 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -363,7 +363,7 @@ void GameInfoDialog::loadConfig() else { const string& md5 = instance().launcher().selectedRomMD5(); - instance().propSet(md5).getMD5(md5, myGameProperties); + instance().propSet().getMD5(md5, myGameProperties); } loadCartridgeProperties(myGameProperties); @@ -375,16 +375,16 @@ void GameInfoDialog::loadConfig() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void GameInfoDialog::loadCartridgeProperties(Properties properties) +void GameInfoDialog::loadCartridgeProperties(const Properties& props) { - myName->setText(properties.get(Cartridge_Name)); - myMD5->setText(properties.get(Cartridge_MD5)); - myManufacturer->setText(properties.get(Cartridge_Manufacturer)); - myModelNo->setText(properties.get(Cartridge_ModelNo)); - myRarity->setText(properties.get(Cartridge_Rarity)); - myNote->setText(properties.get(Cartridge_Note)); - mySound->setState(properties.get(Cartridge_Sound) == "STEREO"); - myType->setSelected(properties.get(Cartridge_Type), "AUTO"); + myName->setText(props.get(Cartridge_Name)); + myMD5->setText(props.get(Cartridge_MD5)); + myManufacturer->setText(props.get(Cartridge_Manufacturer)); + myModelNo->setText(props.get(Cartridge_ModelNo)); + myRarity->setText(props.get(Cartridge_Rarity)); + myNote->setText(props.get(Cartridge_Note)); + mySound->setState(props.get(Cartridge_Sound) == "STEREO"); + myType->setSelected(props.get(Cartridge_Type), "AUTO"); if(instance().hasConsole() && myType->getSelectedTag().toString() == "AUTO") { @@ -400,23 +400,23 @@ void GameInfoDialog::loadCartridgeProperties(Properties properties) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void GameInfoDialog::loadConsoleProperties(Properties properties) +void GameInfoDialog::loadConsoleProperties(const Properties& props) { - myLeftDiffGroup->setSelected(properties.get(Console_LeftDifficulty) == "A" ? 0 : 1); - myRightDiffGroup->setSelected(properties.get(Console_RightDifficulty) == "A" ? 0 : 1); - myTVTypeGroup->setSelected(properties.get(Console_TelevisionType) == "BW" ? 1 : 0); + myLeftDiffGroup->setSelected(props.get(Console_LeftDifficulty) == "A" ? 0 : 1); + myRightDiffGroup->setSelected(props.get(Console_RightDifficulty) == "A" ? 0 : 1); + myTVTypeGroup->setSelected(props.get(Console_TelevisionType) == "BW" ? 1 : 0); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void GameInfoDialog::loadControllerProperties(Properties properties) +void GameInfoDialog::loadControllerProperties(const Properties& props) { - myP0Controller->setSelected(properties.get(Controller_Left), "JOYSTICK"); - myP1Controller->setSelected(properties.get(Controller_Right), "JOYSTICK"); - mySwapPorts->setState(properties.get(Console_SwapPorts) == "YES"); - mySwapPaddles->setState(properties.get(Controller_SwapPaddles) == "YES"); + myP0Controller->setSelected(props.get(Controller_Left), "JOYSTICK"); + myP1Controller->setSelected(props.get(Controller_Right), "JOYSTICK"); + mySwapPorts->setState(props.get(Console_SwapPorts) == "YES"); + mySwapPaddles->setState(props.get(Controller_SwapPaddles) == "YES"); // MouseAxis property (potentially contains 'range' information) - istringstream m_axis(properties.get(Controller_MouseAxis)); + istringstream m_axis(props.get(Controller_MouseAxis)); string m_control, m_range; m_axis >> m_control; bool autoAxis = BSPF::equalsIgnoreCase(m_control, "AUTO"); @@ -446,9 +446,9 @@ void GameInfoDialog::loadControllerProperties(Properties properties) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void GameInfoDialog::loadDisplayProperties(Properties properties) +void GameInfoDialog::loadDisplayProperties(const Properties& props) { - myFormat->setSelected(properties.get(Display_Format), "AUTO"); + myFormat->setSelected(props.get(Display_Format), "AUTO"); if(instance().hasConsole() && myFormat->getSelectedTag().toString() == "AUTO") { const string& format = instance().console().about().DisplayFormat; @@ -458,7 +458,7 @@ void GameInfoDialog::loadDisplayProperties(Properties properties) else myFormatDetected->setLabel(""); - const string& ystart = properties.get(Display_YStart); + const string& ystart = props.get(Display_YStart); myYStart->setValue(atoi(ystart.c_str())); myYStart->setValueLabel(ystart == "0" ? "Auto" : ystart); myYStart->setValueUnit(ystart == "0" ? "" : "px"); @@ -471,7 +471,7 @@ void GameInfoDialog::loadDisplayProperties(Properties properties) else myYStartDetected->setLabel(""); - const string& height = properties.get(Display_Height); + const string& height = props.get(Display_Height); myHeight->setValue(atoi(height.c_str())); myHeight->setValueLabel(height == "0" ? "Auto" : height); myHeight->setValueUnit(height == "0" ? "" : "px"); @@ -485,11 +485,11 @@ void GameInfoDialog::loadDisplayProperties(Properties properties) else myHeightDetected->setLabel(""); - bool usePhosphor = properties.get(Display_Phosphor) == "YES"; + bool usePhosphor = props.get(Display_Phosphor) == "YES"; myPhosphor->setState(usePhosphor); myPPBlend->setEnabled(usePhosphor); - const string& blend = properties.get(Display_PPBlend); + const string& blend = props.get(Display_PPBlend); myPPBlend->setValue(atoi(blend.c_str())); myPPBlend->setValueLabel(blend == "0" ? "Default" : blend); myPPBlend->setValueUnit(blend == "0" ? "" : "%"); @@ -539,10 +539,8 @@ void GameInfoDialog::saveConfig() myGameProperties.set(Display_PPBlend, myPPBlend->getValueLabel() == "Default" ? "0" : myPPBlend->getValueLabel()); - const string& md5 = myGameProperties.get(Cartridge_MD5); - // always insert, doesn't hurt - instance().propSet(md5).insert(myGameProperties); - instance().saveGamePropSet(myGameProperties.get(Cartridge_MD5)); + // Always insert; if the properties are already present, nothing will happen + instance().propSet().insert(myGameProperties); // In any event, inform the Console if(instance().hasConsole()) @@ -583,9 +581,9 @@ void GameInfoDialog::setDefaults() { // Load the default properties Properties defaultProperties; - string md5 = myGameProperties.get(Cartridge_MD5); + const string& md5 = myGameProperties.get(Cartridge_MD5); - instance().propSet(md5).getMD5(md5, defaultProperties, true); + instance().propSet().getMD5(md5, defaultProperties, true); switch(myTab->getActiveTab()) { diff --git a/src/gui/GameInfoDialog.hxx b/src/gui/GameInfoDialog.hxx index bce9d86d5..4fa1418ca 100644 --- a/src/gui/GameInfoDialog.hxx +++ b/src/gui/GameInfoDialog.hxx @@ -46,13 +46,13 @@ class GameInfoDialog : public Dialog, public CommandSender void setDefaults() override; // load the properties for the 'Cartridge' tab - void loadCartridgeProperties(Properties properties); + void loadCartridgeProperties(const Properties& props); // load the properties for the 'Console' tab - void loadConsoleProperties(Properties properties); + void loadConsoleProperties(const Properties& props); // load the properties for the 'Controller' tab - void loadControllerProperties(Properties properties); + void loadControllerProperties(const Properties& props); // load the properties for the 'Display' tab - void loadDisplayProperties(Properties properties); + void loadDisplayProperties(const Properties& props); void updateControllerStates(); void eraseEEPROM(); diff --git a/src/gui/LauncherDialog.cxx b/src/gui/LauncherDialog.cxx index fc964af32..58be4f23b 100644 --- a/src/gui/LauncherDialog.cxx +++ b/src/gui/LauncherDialog.cxx @@ -332,7 +332,7 @@ void LauncherDialog::loadRomInfo() // Get the properties for this entry Properties props; - instance().propSet(myGameList->md5(item), node).getMD5WithInsert(node, myGameList->md5(item), props); + instance().propSet().getMD5WithInsert(node, myGameList->md5(item), props); myRomInfoWidget->setProperties(props); }