mirror of https://github.com/stella-emu/stella.git
Completely remove ability to use a per-ROM properties file.
This 'feature' now seems unnecessary, and it complicates the code by having it.
This commit is contained in:
parent
77c8da55f3
commit
7ae6d84739
|
@ -1518,12 +1518,6 @@
|
|||
<td>Shift-Control + f</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Save current game's properties to a separate properties file</td>
|
||||
<td>Control + s</td>
|
||||
<td>Control + s</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Switch mouse between controller emulation modes (see <b>Game Properties - <a href="#Controller">Controller</a></b>)</td>
|
||||
<td>Control + 0</td>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<PropertiesSet>(propertiesFile());
|
||||
// Create the ROM properties database
|
||||
myPropSet = make_unique<PropertiesSet>(myPropertiesFile);
|
||||
|
||||
#ifdef CHEATCODE_SUPPORT
|
||||
myCheatManager = make_unique<CheatManager>(*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<PropertiesSet>(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<Console> 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<Console> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<PropertiesSet> myPropSet;
|
||||
|
||||
// Pointer to the game's PropertiesSet object
|
||||
unique_ptr<PropertiesSet> myGamePropSet;
|
||||
|
||||
// MD5 of the currently loaded game PropertiesSet object
|
||||
string myGamePropSetMD5;
|
||||
|
||||
// Pointer to the (currently defined) Console object
|
||||
unique_ptr<Console> myConsole;
|
||||
|
||||
|
@ -510,7 +490,6 @@ class OSystem
|
|||
string myConfigFile;
|
||||
string myPaletteFile;
|
||||
string myPropertiesFile;
|
||||
string myGamePropertiesFile;
|
||||
|
||||
FilesystemNode myRomFile;
|
||||
string myRomMD5;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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<string, Properties>;
|
||||
|
||||
|
|
|
@ -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())
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue