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);
}