mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-10 11:51:52 +00:00
- Implemented savegame deletion for SQ4 floppy
- Added a more proper way to disable the "Change Directory" button, by checking its name, rather than the string it contains svn-id: r45504
This commit is contained in:
parent
6eea032245
commit
ebfcea35ec
@ -800,11 +800,31 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) {
|
||||
}
|
||||
case K_FILEIO_UNLINK : {
|
||||
Common::String name = s->_segMan->getString(argv[1]);
|
||||
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
|
||||
// SQ4 floppy prepends /\ to the filenames
|
||||
if (name.hasPrefix("/\\")) {
|
||||
name.deleteChar(0);
|
||||
name.deleteChar(0);
|
||||
}
|
||||
|
||||
// Special case for SQ4 floppy: This game has hardcoded names for all of its
|
||||
// savegames, and they are all named "sq4sg.xxx", where xxx is the slot. We just
|
||||
// take the slot number here, and delete the appropriate save game
|
||||
if (name.hasPrefix("sq4sg.")) {
|
||||
// Special handling for SQ4... get the slot number and construct the save game name
|
||||
int slotNum = atoi(name.c_str() + name.size() - 3);
|
||||
Common::Array<SavegameDesc> saves;
|
||||
listSavegames(saves);
|
||||
int savedir_nr = saves[slotNum].id;
|
||||
name = ((Sci::SciEngine*)g_engine)->getSavegameName(savedir_nr);
|
||||
saveFileMan->removeSavefile(name);
|
||||
} else {
|
||||
const Common::String wrappedName = ((Sci::SciEngine*)g_engine)->wrapFilename(name);
|
||||
saveFileMan->removeSavefile(wrappedName);
|
||||
}
|
||||
|
||||
debug(3, "K_FILEIO_UNLINK(%s)", name.c_str());
|
||||
|
||||
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
|
||||
const Common::String wrappedName = ((Sci::SciEngine*)g_engine)->wrapFilename(name);
|
||||
saveFileMan->removeSavefile(wrappedName);
|
||||
// TODO/FIXME: Should we return something (like, a bool indicating
|
||||
// whether deleting the save succeeded or failed)?
|
||||
break;
|
||||
|
@ -621,44 +621,14 @@ reg_t kAssertPalette(EngineState *s, int argc, reg_t *argv) {
|
||||
return s->r_acc;
|
||||
}
|
||||
|
||||
static void disableCertainButtons(EngineState *s, Common::String gameName, reg_t obj) {
|
||||
reg_t text_pos = GET_SEL32(s->_segMan, obj, text);
|
||||
Common::String text;
|
||||
if (!text_pos.isNull())
|
||||
text = s->_segMan->getString(text_pos);
|
||||
Common::String englishText = s->getLanguageString(text.c_str(), K_LANG_ENGLISH);
|
||||
englishText.trim();
|
||||
int type = GET_SEL32V(s->_segMan, obj, type);
|
||||
int state = GET_SEL32V(s->_segMan, obj, state);
|
||||
|
||||
/*
|
||||
* WORKAROUND: The function is a "prevent the user from doing something
|
||||
* nasty" type of thing, and goes back to the ugly way in which savegame
|
||||
* deletion is implemented in SCI (and even worse in SQ4/Floppy, for
|
||||
* which the workaround is intended). The result is basically that you
|
||||
* can't implement savegame deletion for SQ4/Floppy unless you duplicate
|
||||
* the exact naming scheme of savefiles (i.e. savefiles must be named
|
||||
* SQ4SG.<number>) and the exact file format of the savegame index
|
||||
* (SQ4SG.DIR). From the earlier discussions on file I/O handling -
|
||||
* before as well as after the merge - I gather that this is not an
|
||||
* option.
|
||||
*
|
||||
* SQ4/Floppy is special, being the first game to implement savegame
|
||||
* deletion at all. For later games, we manage to implement deletion by
|
||||
* using gross hacks in kDeviceInfo() (essentially repurposing a few
|
||||
* subfunctions). I decided at the time that SQ4/Floppy was not worth the
|
||||
* effort (see above), and to simply disable the delete functionality for
|
||||
* that game - bringing the save/load dialog on a par with SCI0.
|
||||
*/
|
||||
if (type == SCI_CONTROLS_TYPE_BUTTON && (gameName == "sq4") &&
|
||||
getSciVersion() < SCI_VERSION_1_1 && englishText == "Delete") {
|
||||
PUT_SEL32V(s->_segMan, obj, state, (state | kControlStateDisabled) & ~kControlStateEnabled);
|
||||
}
|
||||
static void disableCertainButtons(SegManager *segMan, reg_t obj) {
|
||||
Common::String objName = segMan->getObjectName(obj);
|
||||
|
||||
// Disable the "Change Directory" button, as we don't allow the game engine to
|
||||
// change the directory where saved games are placed
|
||||
if (type == SCI_CONTROLS_TYPE_BUTTON && englishText == "Change\r\nDirectory") {
|
||||
PUT_SEL32V(s->_segMan, obj, state, (state | kControlStateDisabled) & ~kControlStateEnabled);
|
||||
if (objName == "changeDirI") {
|
||||
int state = GET_SEL32V(segMan, obj, state);
|
||||
PUT_SEL32V(segMan, obj, state, (state | kControlStateDisabled) & ~kControlStateEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
@ -783,7 +753,7 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) {
|
||||
reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) {
|
||||
reg_t controlObject = argv[0];
|
||||
|
||||
disableCertainButtons(s, s->_gameName, controlObject);
|
||||
disableCertainButtons(s->_segMan, controlObject);
|
||||
_k_GenericDrawControl(s, controlObject, false);
|
||||
return NULL_REG;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user