def main(): app = QApplication([]) Col = MainWindow.MainController() runAnimation() Col.view.showMaximized() app.exec_()
def runAnimation(): Col = MainWindow.MainController() # 开机动画 splash = QSplashScreen() scale = 0.5 mgnWidth = int(Data.getWindowWidth() * scale) mgnHeight = int(Data.getWindowHeight() * scale) size = QSize(mgnWidth, mgnHeight) splash.show() for name in os.listdir(filePath + r"\res\ZeusDesign\startup_seq"): path = filePath + r"\res\ZeusDesign\startup_seq\\" + name image = QImage(path) pixmap = QPixmap.fromImage(image.scaled(size, Qt.IgnoreAspectRatio)) splash.setPixmap(pixmap) time.sleep(0.01) splash.finish(Col.view)
def __init__(self): #Create data directories. Included in windows even though #the project won't work in windows yet self.frames = 0 self.oldtime = 0 SettingsXML = self.Get_Settings() Globals.SettingsXML = SettingsXML self.window = MainWindow() self.ErrorMsg = None self.system = None Globals.load_game = partial(self.load_game, self) Globals.load_game = self.load_game Globals.Mainwindow = self.window Globals.Mouse = PyMouse() Globals.Joysticks = [ pygame.joystick.Joystick(i) for i in xrange(pygame.joystick.get_count()) ] [i.init() for i in Globals.Joysticks] self.state_slot = 0 if not os.path.isdir(Globals.DataDir + "temp"): os.mkdir(Globals.DataDir + "temp") if not os.path.isdir(Globals.DataDir + "Systems"): os.mkdir(Globals.DataDir + "Systems") if not os.path.isdir(Globals.DataDir + "Games"): os.mkdir(Globals.DataDir + "Games") SystemSettingsTree = { ("", 1, ("name", ), SettingsCheck.SystemExistSanityCheck): None } CoreSettingsTree = { ("", 1, ("name", "system"), SettingsCheck.CoreNameSanityCheck): None } for i in os.listdir(Globals.DataDir + "Systems"): if os.path.isdir(Globals.DataDir + "Systems/" + i): try: with open(Globals.DataDir + "Systems/" + i + "/system.xml", 'r') as settingsfile: SystemXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings(SystemSettingsTree, SystemXML): Globals.Systems.append((i)[7:]) for j in os.listdir(Globals.DataDir + "Systems/" + i): if os.path.isdir(Globals.DataDir + "Systems/" + i + "/" + j): try: settingsfile = open( Globals.DataDir + "Systems/" + i + "/" + j + "/core.xml", 'r') with open( Globals.DataDir + "Systems/" + i + "/" + j + "/core.xml", 'r') as settingsfile: CoreXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings( CoreSettingsTree, CoreXML): Globals.Cores.append(i[7:] + "/" + j[5:]) except: pass except: pass self.systemrunning = False GamesXML = self.Get_Games() Globals.GamesXML = GamesXML Globals.Update_Games() Globals.WindowHeight = int( Globals.SettingsXML.find("Window").get("height")) Globals.WindowWidth = int( Globals.SettingsXML.find("Window").get("width")) self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight) self.window.connect('check-resize', self.Window_Size_Changed) self.window.connect("delete-event", self.on_kill) self.window.connect("destroy", self.on_kill) self.window.show_all() Globals.Hotkeys = self.generateControls( Globals.SettingsXML.find("Hotkeys")) self.timeout = GObject.timeout_add(16, self.runframe)
class GSEF(object): def __init__(self): #Create data directories. Included in windows even though #the project won't work in windows yet self.frames = 0 self.oldtime = 0 SettingsXML = self.Get_Settings() Globals.SettingsXML = SettingsXML self.window = MainWindow() self.ErrorMsg = None self.system = None Globals.load_game = partial(self.load_game, self) Globals.load_game = self.load_game Globals.Mainwindow = self.window Globals.Mouse = PyMouse() Globals.Joysticks = [ pygame.joystick.Joystick(i) for i in xrange(pygame.joystick.get_count()) ] [i.init() for i in Globals.Joysticks] self.state_slot = 0 if not os.path.isdir(Globals.DataDir + "temp"): os.mkdir(Globals.DataDir + "temp") if not os.path.isdir(Globals.DataDir + "Systems"): os.mkdir(Globals.DataDir + "Systems") if not os.path.isdir(Globals.DataDir + "Games"): os.mkdir(Globals.DataDir + "Games") SystemSettingsTree = { ("", 1, ("name", ), SettingsCheck.SystemExistSanityCheck): None } CoreSettingsTree = { ("", 1, ("name", "system"), SettingsCheck.CoreNameSanityCheck): None } for i in os.listdir(Globals.DataDir + "Systems"): if os.path.isdir(Globals.DataDir + "Systems/" + i): try: with open(Globals.DataDir + "Systems/" + i + "/system.xml", 'r') as settingsfile: SystemXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings(SystemSettingsTree, SystemXML): Globals.Systems.append((i)[7:]) for j in os.listdir(Globals.DataDir + "Systems/" + i): if os.path.isdir(Globals.DataDir + "Systems/" + i + "/" + j): try: settingsfile = open( Globals.DataDir + "Systems/" + i + "/" + j + "/core.xml", 'r') with open( Globals.DataDir + "Systems/" + i + "/" + j + "/core.xml", 'r') as settingsfile: CoreXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings( CoreSettingsTree, CoreXML): Globals.Cores.append(i[7:] + "/" + j[5:]) except: pass except: pass self.systemrunning = False GamesXML = self.Get_Games() Globals.GamesXML = GamesXML Globals.Update_Games() Globals.WindowHeight = int( Globals.SettingsXML.find("Window").get("height")) Globals.WindowWidth = int( Globals.SettingsXML.find("Window").get("width")) self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight) self.window.connect('check-resize', self.Window_Size_Changed) self.window.connect("delete-event", self.on_kill) self.window.connect("destroy", self.on_kill) self.window.show_all() Globals.Hotkeys = self.generateControls( Globals.SettingsXML.find("Hotkeys")) self.timeout = GObject.timeout_add(16, self.runframe) def on_kill(self, *args): if Globals.system: Globals.system.close() Globals.system = None Gtk.main_quit() def runframe(self): if Globals.Hotkeys["Save State"].changed_this_frame and Globals.Hotkeys[ "Save State"].get_state(): Globals.system.save_state("state {}".format(self.state_slot)) if Globals.Hotkeys["Load State"].changed_this_frame and Globals.Hotkeys[ "Load State"].get_state(): Globals.system.load_state("state {}".format(self.state_slot)) if Globals.Hotkeys[ "Increment State Slot"].changed_this_frame and Globals.Hotkeys[ "Increment State Slot"].get_state(): self.state_slot += 1 self.window.statusLabel.add_text_timer( "State slot {} selected".format(self.state_slot), 3000) if Globals.Hotkeys[ "Decrement State Slot"].changed_this_frame and Globals.Hotkeys[ "Decrement State Slot"].get_state(): self.state_slot = max(0, self.state_slot - 1) self.window.statusLabel.add_text_timer( "State slot {} selected".format(self.state_slot), 3000) if Globals.system and Globals.Hotkeys["Rewind"].get_state() and len( Globals.StateSizes): Globals.system.rewinding = True Globals.system.unserialize(Globals.StateData[0]) if len(Globals.StateData) > 1: if isinstance(Globals.StateData[1], xordiff.numpyxor): Globals.StateData[1] = Globals.StateData[1].undiff( Globals.StateData[0]) Globals.StateSizes[1] = Globals.StateData[1] del (Globals.StateData[0]) del (Globals.StateSizes[0]) elif Globals.system: Globals.system.rewinding = False rewind = Globals.SettingsXML.find("Rewind") if rewind.get( "Enabled" ) == "True" and Globals.system and not Globals.system.rewinding: frames = int(rewind.get("Frames")) size = int(rewind.get("Size")) if not self.frames % frames: statedata = Globals.system.serialize() datalen = statedata.nbytes if len(Globals.StateData) and rewind.get("Compress") == "True": Globals.StateData[0] = xordiff.numpyxor( Globals.StateData[0], statedata) Globals.StateSizes[0] = Globals.StateData[0].nbytes Globals.StateData.insert(0, statedata) Globals.StateSizes.insert(0, datalen) while sum(Globals.StateSizes) > size * 1048576: Globals.StateData.pop() Globals.StateSizes.pop() pygame.event.pump() Globals.OldJoystickStates = Globals.JoystickStates Globals.JoystickStates = [] for joystick in Globals.Joysticks: Buttons = [] Axes = [] Hats = [] for i in xrange(0, joystick.get_numaxes()): Axes.append(joystick.get_axis(i)) for i in xrange(0, joystick.get_numhats()): Hats.append(joystick.get_hat(i)) for i in xrange(0, joystick.get_numbuttons()): Buttons.append(joystick.get_button(i)) Globals.JoystickStates.append({ "Buttons": Buttons, "Axes": Axes, "Hats": Hats }) if Globals.system and Globals.system.running: Globals.system.run_frame() self.frames += 1 if int(time.time()) != self.oldtime: self.framerate = self.frames self.frames = 0 self.window.FPSlabel.set_text("FPS: {}".format(self.framerate)) self.oldtime = int(time.time()) return True def Get_Games(self): ValidGames = False GamesXML = None try: with open(Globals.DataDir + "Games/Games.xml", "r") as GamesFile: GamesText = GamesFile.read() ValidGames = True except IOError: pass #Description to follow through the settings tree for testing sanity GamesTree = { ("System", 0, ("name", ), SettingsCheck.SystemExistSanityCheck): { ("Game", 0, ("name", ), SettingsCheck.GameNameSanityCheck): { ("Patch", 0, ("name", ), SettingsCheck.PatchNameSanityCheck): None } } } GameTree = { ("", 1, ("name", "core", "filename", "system"), SettingsCheck.GameSettingsSanityCheck): { ("Controls", 1, ("inherit", ), None): None } } PatchSanityLam = lambda game, name, format, filename, system: os.path.isfile( Globals.DataDir + "Games/" + system + "/" + game + "/patches/" + name + "/" + filename) PatchTree = { ("", 1, ("game", "name", "format", "filename", "system"), PatchSanityLam): { ("Controls", 1, ("inherit", ), None): None } } #Make sure the settings file is valid XML if ValidGames: try: GamesXML = ET.XML(GamesText) except ET.ParseError: ValidGames = False #Validate the the settings use sane values if ValidGames: ValidGames = SettingsCheck.check_settings(GamesTree, GamesXML) #If the games XML file isn't sane, repopulate it manually if not ValidGames: popup = ErrorPopupWindow( "Games not found", "Game definitions not found, repopulating manually") popup.set_transient_for(self.window) popup.show_all() systemlam = lambda x: os.path.isdir( Globals.DataDir + "Games/" + x) and os.path.isdir( Globals.DataDir + "Systems/System_" + x) gamelam = lambda x: os.path.isdir(Globals.DataDir + "Games/" + system + "/" + x) patchlam = lambda x: os.path.isdir(Globals.DataDir + "Games/" + system + "/" + game + "/" + x) GamesXML = ET.XML("<Games/>") for system in filter(systemlam, os.listdir(Globals.DataDir + "Games")): SystemXML = ET.XML("<System/>") SystemXML.set("name", system) for game in filter( gamelam, os.listdir(Globals.DataDir + "Games/" + system)): try: with open( Globals.DataDir + "Games/" + system + "/" + game + "/game.xml", 'r') as GameSettingsFile: GameSettingsText = GameSettingsFile.read() GameSettingsXML = ET.XML(GameSettingsText) GameSane = SettingsCheck.check_settings( GameTree, GameSettingsXML) if GameSane: GameXML = ET.XML("<Game/>") GameXML.set("name", game) GameXML.set("core", GameSettingsXML.get("core")) for patch in filter( patchlam, os.listdir(Globals.DataDir + "Games/" + system + "/" + game + "/patches")): try: with open( Globals.DataDir + "Games/" + system + "/" + game + "/patches/" + patch + "/patch.xml", 'r') as PatchSettingsFile: PatchSettingsText = PatchSettingsFile.read( ) PatchSettingsXML = ET.XML( PatchSettingsText) PatchSane = SettingsCheck.check_settings( PatchTree, PatchSettingsXML) if PatchSane: PatchXML = ET.XML("<Patch/>") PatchXML.set("name", patch) PatchXML.set( "format", PatchSettingsXML.get("format")) GameXML.append(PatchXML) except: pass SystemXML.append(GameXML) except: pass GamesXML.append(SystemXML) return GamesXML def Get_Settings(self): ValidSettings = False SettingsXML = None try: with open(Globals.DataDir + "Settings.xml", "r") as SettingsFile: SettingsText = SettingsFile.read() ValidSettings = True except IOError: SettingsText = DefaultSettings ValidSettings = True #Description to follow through the settings tree for testing sanity SettingsTree = { ("Paths", 1, (), None): { ("LastAccessedSystem", 1, ("path", ), SettingsCheck.DirectoryPathSanityCheck): None, ("LastAccessedCore", 1, ("path", ), SettingsCheck.DirectoryPathSanityCheck): None }, ("Window", 1, ("width", "height"), SettingsCheck.WindowSizeSanityCheck): None, ("AspectRatio", 1, ("keep", ), lambda x: x == "True" or x == "False"): None, ("Hotkeys", 1, (), None): { ("Button", 9, ("Mapping", "name"), None): None }, ("Rewind", 1, ("Frames", "Size", "Enabled", "Compress"), lambda f, s, e, c: f.isdigit( ) and s.isdigit() and (e == "False" or e == "True") and (c == "False" or c == "True")): None } SettingsXML = ET.XML(SettingsText) #Make sure the settings file is valid XML if ValidSettings: try: SettingsXML = ET.XML(SettingsText) except ET.ParseError: ValidSettings = False #Validate the the settings use sane values if ValidSettings: ValidSettings = SettingsCheck.check_settings( SettingsTree, SettingsXML) #If the settings aren't sane, replace them with the standard settings #May change later to only replace the parts that are not sane if not ValidSettings: try: SettingsXML = ET.XML(DefaultSettings) with open(Globals.DataDir + "Settings.xml", "w") as SettingsFile: SettingsFile.write(DefaultSettings) popup = ErrorPopupWindow( "Settings Not Found", "Settings not found or corrupt, using default settings") popup.show_all() except: self.ErrorMsg = "Failed to write to settings file" return SettingsXML #When the window resizes, we need to change the preferred window size to that #That way when they come back, the window will be the same size def Window_Size_Changed(self, window): size = window.get_size() Globals.WindowHeight = size[1] Globals.WindowWidth = size[0] windowxml = Globals.SettingsXML.find("Window") windowxml.set("width", str(size[0])) windowxml.set("height", str(size[1])) def Run(self): Gtk.main() #Write out the changed settings, however they were changed with open(Globals.DataDir + "Settings.xml", "w") as SettingsFile: SettingsFile.write(ET.tostring(Globals.SettingsXML)) with open(Globals.DataDir + "Games/Games.xml", "w") as GamesFile: GamesFile.write(ET.tostring(Globals.GamesXML)) #self.loopingpipe.send(("kill",)) def load_game(self, systemname, corename, gamename, patchname): Globals.StateData = [] Globals.StateSizes = [] if Globals.system != None: Globals.system.close() Globals.system = System(systemname) else: Globals.system = System(systemname) Globals.system.load_core(corename) gamepath = "{0}Games/{1}/{2}/".format(Globals.DataDir, systemname, gamename) sysxmlpath = "{0}Systems/System_{1}/system.xml".format( Globals.DataDir, systemname) patchpath = "{0}{1}".format(gamepath, patchname) controlpath = "{0}game.xml".format(gamepath) savespath = "{}savestates".format(gamepath) try: os.makedirs(savespath) except: pass with open(controlpath, 'r') as controlxmlfile: controlxml = ET.XML(controlxmlfile.read()) if controlxml.find("Controls").get("inherit") == "True": with open(sysxmlpath, 'r') as controlxmlfile: controlxml = ET.XML(controlxmlfile.read()) controlxml = controlxml.find("Controls") Globals.Hotkeys = self.generateControls( Globals.SettingsXML.find("Hotkeys")) Globals.Controls = self.generateControls(controlxml) patcher = None #Add patch stuff later Globals.system.update_controls(Globals.Controls) Globals.system.load_game(gamepath, patchpath, patcher) framerate = Globals.system.get_framerate() self.window.statusLabel.add_text_timer("Loaded {}".format(gamename), 3000) GObject.source_remove(self.timeout) self.timeout = GObject.timeout_add( int(1000 // Globals.system.get_framerate()), self.runframe) def generateControls(self, XMLItem): def generateControlsR(XMLItem, parent=None): if XMLItem.get("Mapping"): digital = False if XMLItem.get("type") == "Digital": digital = True return Control(XMLItem.get("Mapping"), XMLItem.tag, XMLItem.get("name"), digital) controls = {} for i in list(XMLItem): controls[i.get('name')] = generateControlsR(i) return controls controls = {} for i in list(XMLItem): controls[i.get("name")] = generateControlsR(i) return controls
from tkinter import Tk from tkinter import messagebox import sys if __name__ == '__main__': logObj = Logger() try: database = dm.Database(logObj) except: root = Tk() root.withdraw() messagebox.showerror( "Hiba", "A rendszer nem tud csatlakozni az adatbázishoz.") sys.exit(1) loginWindow = lw.LoginWindow(logObj, database) try: user = us.User(logObj, loginWindow.user, database, loginWindow.isFirstTime) except AttributeError: sys.exit(0) try: mainWindow = mw.MainWindow(logObj, user, database) except TclError: pass database.dbConnection.close()
from Windows import MainWindow reload(MainWindow) Col = MainWindow.MainController() Col.view.showMaximized()
# -*- coding: utf-8 -*- ## GUI应用程序主程序入口 import sys from PySide2.QtWidgets import QApplication from SplashScreen import SplashScreen from Windows import MainWindow app = QApplication(sys.argv) # 创建GUI应用程序 splash = SplashScreen() mainWindow = MainWindow() # 创建主窗体 mainWindow.show() # 显示主窗体 sys.exit(app.exec_())
def __init__(self): #Create data directories. Included in windows even though #the project won't work in windows yet self.frames= 0 self.oldtime = 0 SettingsXML = self.Get_Settings() Globals.SettingsXML = SettingsXML self.window = MainWindow() self.ErrorMsg = None self.system = None Globals.load_game = partial(self.load_game,self) Globals.load_game = self.load_game Globals.Mainwindow = self.window Globals.Mouse = PyMouse() Globals.Joysticks = [pygame.joystick.Joystick(i) for i in xrange(pygame.joystick.get_count())] [i.init() for i in Globals.Joysticks] self.state_slot = 0 if not os.path.isdir(Globals.DataDir+"temp"): os.mkdir(Globals.DataDir+"temp") if not os.path.isdir(Globals.DataDir+"Systems"): os.mkdir(Globals.DataDir+"Systems") if not os.path.isdir(Globals.DataDir+"Games"): os.mkdir(Globals.DataDir+"Games") SystemSettingsTree = {("",1,("name",), SettingsCheck.SystemExistSanityCheck): None} CoreSettingsTree = {("",1,("name","system"),SettingsCheck.CoreNameSanityCheck) : None} for i in os.listdir(Globals.DataDir+"Systems"): if os.path.isdir(Globals.DataDir+"Systems/"+i): try: with open(Globals.DataDir+"Systems/"+i+"/system.xml",'r') as settingsfile: SystemXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings(SystemSettingsTree, SystemXML): Globals.Systems.append((i)[7:]) for j in os.listdir(Globals.DataDir+"Systems/"+i): if os.path.isdir(Globals.DataDir+"Systems/"+i+"/"+j): try: settingsfile = open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r') with open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r') as settingsfile: CoreXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings(CoreSettingsTree, CoreXML): Globals.Cores.append(i[7:]+"/"+j[5:]) except: pass except: pass self.systemrunning=False GamesXML = self.Get_Games() Globals.GamesXML = GamesXML Globals.Update_Games() Globals.WindowHeight = int(Globals.SettingsXML.find("Window").get("height")) Globals.WindowWidth = int(Globals.SettingsXML.find("Window").get("width")) self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight) self.window.connect('check-resize', self.Window_Size_Changed) self.window.connect("delete-event", self.on_kill) self.window.connect("destroy", self.on_kill) self.window.show_all() Globals.Hotkeys = self.generateControls(Globals.SettingsXML.find("Hotkeys")) self.timeout = GObject.timeout_add(16,self.runframe)
class GSEF(object): def __init__(self): #Create data directories. Included in windows even though #the project won't work in windows yet self.frames= 0 self.oldtime = 0 SettingsXML = self.Get_Settings() Globals.SettingsXML = SettingsXML self.window = MainWindow() self.ErrorMsg = None self.system = None Globals.load_game = partial(self.load_game,self) Globals.load_game = self.load_game Globals.Mainwindow = self.window Globals.Mouse = PyMouse() Globals.Joysticks = [pygame.joystick.Joystick(i) for i in xrange(pygame.joystick.get_count())] [i.init() for i in Globals.Joysticks] self.state_slot = 0 if not os.path.isdir(Globals.DataDir+"temp"): os.mkdir(Globals.DataDir+"temp") if not os.path.isdir(Globals.DataDir+"Systems"): os.mkdir(Globals.DataDir+"Systems") if not os.path.isdir(Globals.DataDir+"Games"): os.mkdir(Globals.DataDir+"Games") SystemSettingsTree = {("",1,("name",), SettingsCheck.SystemExistSanityCheck): None} CoreSettingsTree = {("",1,("name","system"),SettingsCheck.CoreNameSanityCheck) : None} for i in os.listdir(Globals.DataDir+"Systems"): if os.path.isdir(Globals.DataDir+"Systems/"+i): try: with open(Globals.DataDir+"Systems/"+i+"/system.xml",'r') as settingsfile: SystemXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings(SystemSettingsTree, SystemXML): Globals.Systems.append((i)[7:]) for j in os.listdir(Globals.DataDir+"Systems/"+i): if os.path.isdir(Globals.DataDir+"Systems/"+i+"/"+j): try: settingsfile = open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r') with open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r') as settingsfile: CoreXML = ET.XML(settingsfile.read()) if SettingsCheck.check_settings(CoreSettingsTree, CoreXML): Globals.Cores.append(i[7:]+"/"+j[5:]) except: pass except: pass self.systemrunning=False GamesXML = self.Get_Games() Globals.GamesXML = GamesXML Globals.Update_Games() Globals.WindowHeight = int(Globals.SettingsXML.find("Window").get("height")) Globals.WindowWidth = int(Globals.SettingsXML.find("Window").get("width")) self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight) self.window.connect('check-resize', self.Window_Size_Changed) self.window.connect("delete-event", self.on_kill) self.window.connect("destroy", self.on_kill) self.window.show_all() Globals.Hotkeys = self.generateControls(Globals.SettingsXML.find("Hotkeys")) self.timeout = GObject.timeout_add(16,self.runframe) def on_kill(self, *args): if Globals.system: Globals.system.close() Globals.system = None Gtk.main_quit() def runframe(self): if Globals.Hotkeys["Save State"].changed_this_frame and Globals.Hotkeys["Save State"].get_state(): Globals.system.save_state("state {}".format(self.state_slot)) if Globals.Hotkeys["Load State"].changed_this_frame and Globals.Hotkeys["Load State"].get_state(): Globals.system.load_state("state {}".format(self.state_slot)) if Globals.Hotkeys["Increment State Slot"].changed_this_frame and Globals.Hotkeys["Increment State Slot"].get_state(): self.state_slot += 1 self.window.statusLabel.add_text_timer("State slot {} selected".format(self.state_slot), 3000) if Globals.Hotkeys["Decrement State Slot"].changed_this_frame and Globals.Hotkeys["Decrement State Slot"].get_state(): self.state_slot = max(0, self.state_slot-1) self.window.statusLabel.add_text_timer("State slot {} selected".format(self.state_slot), 3000) if Globals.system and Globals.Hotkeys["Rewind"].get_state() and len(Globals.StateSizes): Globals.system.rewinding = True Globals.system.unserialize(Globals.StateData[0]) if len(Globals.StateData) > 1: if isinstance(Globals.StateData[1], xordiff.numpyxor): Globals.StateData[1] = Globals.StateData[1].undiff(Globals.StateData[0]) Globals.StateSizes[1] = Globals.StateData[1] del(Globals.StateData[0]) del(Globals.StateSizes[0]) elif Globals.system: Globals.system.rewinding = False rewind = Globals.SettingsXML.find("Rewind") if rewind.get("Enabled") == "True" and Globals.system and not Globals.system.rewinding: frames = int(rewind.get("Frames")) size = int(rewind.get("Size")) if not self.frames % frames: statedata = Globals.system.serialize() datalen = statedata.nbytes if len(Globals.StateData) and rewind.get("Compress") == "True": Globals.StateData[0] = xordiff.numpyxor(Globals.StateData[0], statedata) Globals.StateSizes[0] = Globals.StateData[0].nbytes Globals.StateData.insert(0,statedata) Globals.StateSizes.insert(0,datalen) while sum(Globals.StateSizes) > size*1048576: Globals.StateData.pop() Globals.StateSizes.pop() pygame.event.pump() Globals.OldJoystickStates = Globals.JoystickStates Globals.JoystickStates = [] for joystick in Globals.Joysticks: Buttons = [] Axes = [] Hats = [] for i in xrange(0, joystick.get_numaxes()): Axes.append(joystick.get_axis(i)) for i in xrange(0, joystick.get_numhats()): Hats.append(joystick.get_hat(i)) for i in xrange(0, joystick.get_numbuttons()): Buttons.append(joystick.get_button(i)) Globals.JoystickStates.append({"Buttons":Buttons,"Axes":Axes, "Hats": Hats}) if Globals.system and Globals.system.running: Globals.system.run_frame() self.frames += 1 if int(time.time()) != self.oldtime: self.framerate = self.frames self.frames = 0 self.window.FPSlabel.set_text("FPS: {}".format(self.framerate)) self.oldtime = int(time.time()) return True def Get_Games(self): ValidGames = False GamesXML = None try: with open(Globals.DataDir+"Games/Games.xml", "r") as GamesFile: GamesText = GamesFile.read() ValidGames = True except IOError: pass #Description to follow through the settings tree for testing sanity GamesTree = {("System",0,("name",),SettingsCheck.SystemExistSanityCheck) : {("Game",0,("name",),SettingsCheck.GameNameSanityCheck): {("Patch",0,("name",),SettingsCheck.PatchNameSanityCheck):None} } } GameTree = {("",1,("name","core","filename","system"),SettingsCheck.GameSettingsSanityCheck) : {("Controls",1,("inherit",),None): None } } PatchSanityLam = lambda game,name,format,filename,system: os.path.isfile(Globals.DataDir+"Games/"+system+"/"+game+"/patches/"+name+"/"+filename) PatchTree = {("",1,("game","name","format","filename","system"),PatchSanityLam) : {("Controls",1,("inherit",),None): None } } #Make sure the settings file is valid XML if ValidGames: try: GamesXML = ET.XML(GamesText) except ET.ParseError: ValidGames = False #Validate the the settings use sane values if ValidGames: ValidGames = SettingsCheck.check_settings(GamesTree,GamesXML) #If the games XML file isn't sane, repopulate it manually if not ValidGames: popup = ErrorPopupWindow("Games not found","Game definitions not found, repopulating manually") popup.set_transient_for(self.window) popup.show_all() systemlam = lambda x: os.path.isdir(Globals.DataDir+"Games/"+x) and os.path.isdir(Globals.DataDir+"Systems/System_"+x) gamelam = lambda x: os.path.isdir(Globals.DataDir+"Games/"+system+"/"+x) patchlam = lambda x: os.path.isdir(Globals.DataDir+"Games/"+system+"/"+game+"/"+x) GamesXML = ET.XML("<Games/>") for system in filter(systemlam, os.listdir(Globals.DataDir+"Games")): SystemXML = ET.XML("<System/>") SystemXML.set("name",system) for game in filter(gamelam,os.listdir(Globals.DataDir+"Games/"+system)): try: with open(Globals.DataDir+"Games/"+system+"/"+game+"/game.xml",'r') as GameSettingsFile: GameSettingsText = GameSettingsFile.read() GameSettingsXML = ET.XML(GameSettingsText) GameSane = SettingsCheck.check_settings(GameTree, GameSettingsXML) if GameSane: GameXML = ET.XML("<Game/>") GameXML.set("name",game) GameXML.set("core",GameSettingsXML.get("core")) for patch in filter(patchlam,os.listdir(Globals.DataDir+"Games/"+system+"/"+game+"/patches")): try: with open(Globals.DataDir+"Games/"+system+"/"+game+"/patches/"+patch+"/patch.xml",'r') as PatchSettingsFile: PatchSettingsText = PatchSettingsFile.read() PatchSettingsXML = ET.XML(PatchSettingsText) PatchSane = SettingsCheck.check_settings(PatchTree, PatchSettingsXML) if PatchSane: PatchXML = ET.XML("<Patch/>") PatchXML.set("name",patch) PatchXML.set("format",PatchSettingsXML.get("format")) GameXML.append(PatchXML) except: pass SystemXML.append(GameXML) except: pass GamesXML.append(SystemXML) return GamesXML def Get_Settings(self): ValidSettings = False SettingsXML = None try: with open(Globals.DataDir+"Settings.xml", "r") as SettingsFile: SettingsText = SettingsFile.read() ValidSettings = True except IOError: SettingsText = DefaultSettings ValidSettings = True #Description to follow through the settings tree for testing sanity SettingsTree = {("Paths",1,(),None) : {("LastAccessedSystem",1,("path",),SettingsCheck.DirectoryPathSanityCheck):None, ("LastAccessedCore",1,("path",),SettingsCheck.DirectoryPathSanityCheck):None }, ("Window",1,("width","height"),SettingsCheck.WindowSizeSanityCheck) :None, ("AspectRatio",1,("keep",), lambda x: x == "True" or x == "False") : None, ("Hotkeys",1,(),None) : {("Button",9,("Mapping","name"),None) : None}, ("Rewind",1,("Frames","Size","Enabled","Compress"), lambda f, s, e, c: f.isdigit() and s.isdigit() and (e == "False" or e == "True") and (c == "False" or c == "True")) : None } SettingsXML = ET.XML(SettingsText) #Make sure the settings file is valid XML if ValidSettings: try: SettingsXML = ET.XML(SettingsText) except ET.ParseError: ValidSettings = False #Validate the the settings use sane values if ValidSettings: ValidSettings = SettingsCheck.check_settings(SettingsTree,SettingsXML) #If the settings aren't sane, replace them with the standard settings #May change later to only replace the parts that are not sane if not ValidSettings: try: SettingsXML = ET.XML(DefaultSettings) with open(Globals.DataDir+"Settings.xml", "w") as SettingsFile: SettingsFile.write(DefaultSettings) popup = ErrorPopupWindow("Settings Not Found","Settings not found or corrupt, using default settings") popup.show_all() except: self.ErrorMsg = "Failed to write to settings file" return SettingsXML #When the window resizes, we need to change the preferred window size to that #That way when they come back, the window will be the same size def Window_Size_Changed(self,window): size = window.get_size() Globals.WindowHeight = size[1] Globals.WindowWidth = size[0] windowxml = Globals.SettingsXML.find("Window") windowxml.set("width",str(size[0])) windowxml.set("height",str(size[1])) def Run(self): Gtk.main() #Write out the changed settings, however they were changed with open(Globals.DataDir+"Settings.xml", "w") as SettingsFile: SettingsFile.write(ET.tostring(Globals.SettingsXML)) with open(Globals.DataDir+"Games/Games.xml", "w") as GamesFile: GamesFile.write(ET.tostring(Globals.GamesXML)) #self.loopingpipe.send(("kill",)) def load_game(self,systemname,corename,gamename,patchname): Globals.StateData = [] Globals.StateSizes = [] if Globals.system != None: Globals.system.close() Globals.system = System(systemname) else: Globals.system = System(systemname) Globals.system.load_core(corename) gamepath = "{0}Games/{1}/{2}/".format(Globals.DataDir,systemname,gamename) sysxmlpath = "{0}Systems/System_{1}/system.xml".format(Globals.DataDir,systemname) patchpath = "{0}{1}".format(gamepath,patchname) controlpath = "{0}game.xml".format(gamepath) savespath = "{}savestates".format(gamepath) try: os.makedirs(savespath) except: pass with open(controlpath,'r') as controlxmlfile: controlxml = ET.XML(controlxmlfile.read()) if controlxml.find("Controls").get("inherit") == "True": with open(sysxmlpath,'r') as controlxmlfile: controlxml = ET.XML(controlxmlfile.read()) controlxml = controlxml.find("Controls") Globals.Hotkeys = self.generateControls(Globals.SettingsXML.find("Hotkeys")) Globals.Controls = self.generateControls(controlxml) patcher = None #Add patch stuff later Globals.system.update_controls(Globals.Controls) Globals.system.load_game(gamepath,patchpath,patcher) framerate = Globals.system.get_framerate() self.window.statusLabel.add_text_timer("Loaded {}".format(gamename), 3000) GObject.source_remove(self.timeout) self.timeout = GObject.timeout_add(int(1000//Globals.system.get_framerate()),self.runframe) def generateControls(self,XMLItem): def generateControlsR(XMLItem, parent=None): if XMLItem.get("Mapping"): digital = False if XMLItem.get("type") == "Digital": digital = True return Control(XMLItem.get("Mapping"), XMLItem.tag, XMLItem.get("name"), digital) controls = {} for i in list(XMLItem): controls[i.get('name')] = generateControlsR(i) return controls controls = {} for i in list(XMLItem): controls[i.get("name")] = generateControlsR(i) return controls