def _do_save(self, savegame): """Actual save code. @param savegame: absolute path""" assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) self.savecounter += 1 db = DbReader(savegame) except IOError as e: # usually invalid filename headline = _("Failed to create savegame file") descr = _("There has been an error while creating your savegame file.") advice = _("This usually means that the savegame name contains unsupported special characters.") self.gui.show_error_popup(headline, descr, advice, unicode(e)) return self.save() # retry with new savegamename entered by the user # this must not happen with quicksave/autosave except ZeroDivisionError as err: # TODO: # this should say WindowsError, but that somehow now leads to a NameError if err.winerror == 5: self.gui.show_error_popup(_("Access is denied"), \ _("The savegame file is probably read-only.")) return self.save() elif err.winerror == 32: self.gui.show_error_popup(_("File used by another process"), \ _("The savegame file is currently used by another program.")) return self.save() raise try: read_savegame_template(db) db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) LastActivePlayerSettlementManager().save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) rng_state = json.dumps( self.random.getstate() ) SavegameManager.write_metadata(db, self.savecounter, rng_state) # make sure everything get's written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False
def _do_save(self, savegame): """Actual save code. @param savegame: absolute path""" assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) self.savecounter += 1 db = DbReader(savegame) except IOError as e: # usually invalid filename headline = T("Failed to create savegame file") descr = T( "There has been an error while creating your savegame file.") advice = T( "This usually means that the savegame name contains unsupported special characters." ) self.ingame_gui.open_error_popup(headline, descr, advice, unicode(e)) # retry with new savegamename entered by the user # (this must not happen with quicksave/autosave) return self.save() except OSError as e: if e.errno != errno.EACCES: raise self.ingame_gui.open_error_popup( T("Access is denied"), T("The savegame file could be read-only or locked by another process." )) return self.save() try: read_savegame_template(db) db("BEGIN") self.world.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) # Store RNG state rng_state = json.dumps(self.random.getstate()) SavegameManager.write_metadata(db, self.savecounter, rng_state) # Make sure everything gets written now db("COMMIT") db.close() return True except Exception: self.log.error("Save Exception:") traceback.print_exc() # remove invalid savegamefile (but close db connection before deleting) db.close() os.unlink(savegame) return False
def save(self, savegamename=None): """Saves a game @param savegamename: string with the full path of the savegame file or None to let user pick one @return: bool, whether save was successfull """ if savegamename is None: savegamename = self.gui.show_select_savegame(mode='save') if savegamename is None: return False # user aborted dialog savegamename = SavegameManager.create_filename(savegamename) savegame = savegamename assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) shutil.copyfile(PATHS.SAVEGAME_TEMPLATE, savegame) self.savecounter += 1 db = DbReader(savegame) except IOError: # usually invalid filename self.gui.show_popup(_("Invalid filename"), _("You entered an invalid filename.")) return self.save( ) # retry with new savegamename entered by the user # this must not happen with quicksave/autosave try: db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) SavegameManager.write_metadata(db, self.savecounter) # make sure everything get's written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False
def _do_save(self, savegame): """Actual save code. @param savegame: absolute path""" assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) self.savecounter += 1 db = DbReader(savegame) except IOError as e: # usually invalid filename headline = _("Failed to create savegame file") descr = _("There has been an error while creating your savegame file.") advice = _("This usually means that the savegame name contains unsupported special characters.") self.ingame_gui.show_error_popup(headline, descr, advice, unicode(e)) # retry with new savegamename entered by the user # (this must not happen with quicksave/autosave) return self.save() except OSError as e: if e.errno != errno.EACCES: raise self.ingame_gui.show_error_popup( _("Access is denied"), _("The savegame file could be read-only or locked by another process.") ) return self.save() try: read_savegame_template(db) db("BEGIN") self.world.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) # Store RNG state rng_state = json.dumps(self.random.getstate()) SavegameManager.write_metadata(db, self.savecounter, rng_state) # Make sure everything gets written now db("COMMIT") db.close() return True except Exception: self.log.error("Save Exception:") traceback.print_exc() # remove invalid savegamefile (but close db connection before deleting) db.close() os.unlink(savegame) return False
def save(self, savegamename=None): """Saves a game @param savegamename: string with the full path of the savegame file or None to let user pick one @return: bool, whether save was successfull """ if savegamename is None: savegamename = self.gui.show_select_savegame(mode='save') if savegamename is None: return False # user aborted dialog savegamename = SavegameManager.create_filename(savegamename) savegame = savegamename assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) shutil.copyfile(PATHS.SAVEGAME_TEMPLATE, savegame) self.savecounter += 1 db = DbReader(savegame) except IOError: # usually invalid filename self.gui.show_popup(_("Invalid filename"), _("You entered an invalid filename.")) return self.save() # retry with new savegamename entered by the user # this must not happen with quicksave/autosave try: db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) SavegameManager.write_metadata(db, self.savecounter) # make sure everything get's written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False
return self.save() raise try: db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) SavegameManager.write_metadata(db, self.savecounter) # make sure everything get's written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False
_("The savegame file is currently used by another program.")) return self.save() raise try: db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) rng_state = json.dumps( self.random.getstate() ) SavegameManager.write_metadata(db, self.savecounter, rng_state) # make sure everything get's written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False
def _do_save(self, savegame): """Actual save code. @param savegame: absolute path""" assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) self.savecounter += 1 db = DbReader(savegame) except IOError as e: # usually invalid filename headline = _("Failed to create savegame file") descr = _( "There has been an error while creating your savegame file.") advice = _( "This usually means that the savegame name contains unsupported special characters." ) self.gui.show_error_popup(headline, descr, advice, unicode(e)) return self.save( ) # retry with new savegamename entered by the user # this must not happen with quicksave/autosave except OSError as e: if e.errno == errno.EACCES: self.gui.show_error_popup( _("Access is denied"), _("The savegame file could be read-only or locked by another process." )) return self.save() raise try: read_savegame_template(db) db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) LastActivePlayerSettlementManager().save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) rng_state = json.dumps(self.random.getstate()) SavegameManager.write_metadata(db, self.savecounter, rng_state) # make sure everything gets written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False
def _do_save(self, savegame): """Actual save code. @param savegame: absolute path""" assert os.path.isabs(savegame) self.log.debug("Session: Saving to %s", savegame) try: if os.path.exists(savegame): os.unlink(savegame) self.savecounter += 1 db = DbReader(savegame) except IOError as e: # usually invalid filename headline = _("Failed to create savegame file") descr = _("There has been an error while creating your savegame file.") advice = _("This usually means that the savegame name contains unsupported special characters.") self.ingame_gui.show_error_popup(headline, descr, advice, unicode(e)) # retry with new savegamename entered by the user # (this must not happen with quicksave/autosave) return self.save() except OSError as e: if e.errno != errno.EACCES: raise self.ingame_gui.show_error_popup( _("Access is denied"), _("The savegame file could be read-only or locked by another process.") ) return self.save() try: read_savegame_template(db) db("BEGIN") self.world.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) # Store instances that are selected right now. for instance in self.selected_instances: db("INSERT INTO selected (`group`, id) VALUES (NULL, ?)", instance.worldid) # If a single instance is selected, also store the currently displayed tab. # (Else, upon restoring, we display a multi-selection tab.) tabname = None if len(self.selected_instances) == 1: tabclass = self.ingame_gui.get_cur_menu().current_tab tabname = tabclass.__class__.__name__ db("INSERT INTO metadata (name, value) VALUES (?, ?)", "selected_tab", tabname) # Store user defined unit selection groups (Ctrl+number) for (number, group) in enumerate(self.selection_groups): for instance in group: db("INSERT INTO selected (`group`, id) VALUES (?, ?)", number, instance.worldid) # Store RNG state rng_state = json.dumps(self.random.getstate()) SavegameManager.write_metadata(db, self.savecounter, rng_state) # Make sure everything gets written now db("COMMIT") db.close() return True except Exception: self.log.error("Save Exception:") traceback.print_exc() # remove invalid savegamefile (but close db connection before deleting) db.close() os.unlink(savegame) return False
self.gui.show_error_popup(_("File used by another process"), \ _("The savegame file is currently used by another program.")) return self.save() raise try: db("BEGIN") self.world.save(db) #self.manager.save(db) self.view.save(db) self.ingame_gui.save(db) self.scenario_eventhandler.save(db) for instance in self.selected_instances: db("INSERT INTO selected(`group`, id) VALUES(NULL, ?)", instance.worldid) for group in xrange(len(self.selection_groups)): for instance in self.selection_groups[group]: db("INSERT INTO selected(`group`, id) VALUES(?, ?)", group, instance.worldid) SavegameManager.write_metadata(db, self.savecounter) # make sure everything get's written now db("COMMIT") db.close() return True except: print "Save Exception" traceback.print_exc() db.close() # close db before delete os.unlink(savegame) # remove invalid savegamefile return False