def bootstrap(renpy_base): global renpy # W0602 import renpy.log #@UnusedImport os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) renpy_base = unicode(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = { } execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app")+4] if os.path.exists(alt_path + "/environment.txt"): evars = { } execfile(alt_path + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] # Parse the arguments. import renpy.arguments args = renpy.arguments.bootstrap() # Since we don't have time to fully initialize before running the presplash # command, handle it specially. if args.command == "presplash": import renpy.display.presplash renpy.display.presplash.show(sys.argv[3]) if args.trace: enable_trace(args.trace) if args.basedir: basedir = os.path.abspath(args.basedir).decode(FSENCODING) else: basedir = renpy_base gamedirs = [ name ] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend([ 'game', 'data', 'launcher/game' ]) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # Force windib on windows, unless the user explicitly overrides. if renpy.windows and not 'SDL_VIDEODRIVER' in os.environ: os.environ['SDL_VIDEODRIVER'] = 'windib' # If we're not given a command, show the presplash. if args.command == "run": import renpy.display.presplash #@Reimport renpy.display.presplash.start(basedir, gamedir) # If we're on a mac, install our own os.start. if renpy.macintosh: os.startfile = mac_start # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame; pygame except: print >>sys.stderr, """\ Could not import pygame. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. """ raise # Load up all of Ren'Py, in the right order. import renpy #@Reimport renpy.import_all() renpy.loader.init_importer() keep_running = True try: while keep_running: try: renpy.game.args = args renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = [ ] renpy.main.main() keep_running = False except KeyboardInterrupt: traceback.print_exc() break except renpy.game.UtterRestartException: if renpy.display.draw: renpy.display.draw.deinit() renpy.display.draw.quit() # On an UtterRestart, reload Ren'Py. renpy.reload_all() continue except renpy.game.QuitException: keep_running = False except renpy.game.ParseErrorException: keep_running = False except Exception, e: report_exception(e) keep_running = False sys.exit(0)
def bootstrap(renpy_base): global renpy # W0602 import renpy.log # @UnusedImport # Remove a legacy environment setting. if os.environ.get(b"SDL_VIDEODRIVER", "") == "windib": del os.environ[b"SDL_VIDEODRIVER"] renpy_base = unicode(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = { } execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app")+4] if os.path.exists(alt_path + "/environment.txt"): evars = { } execfile(alt_path + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] # Parse the arguments. import renpy.arguments args = renpy.arguments.bootstrap() if args.trace: enable_trace(args.trace) if args.basedir: basedir = os.path.abspath(args.basedir).decode(FSENCODING) else: basedir = renpy_base if not os.path.exists(basedir): sys.stderr.write("Base directory %r does not exist. Giving up.\n" % (basedir,)) sys.exit(1) gamedirs = [ name ] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend([ 'game', 'data', 'launcher/game' ]) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) if renpy.macintosh: # If we're on a mac, install our own os.start. os.startfile = mac_start # Are we starting from inside a mac app resources directory? if basedir.endswith("Contents/Resources/autorun"): renpy.macapp = True # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame_sdl2 pygame_sdl2.import_as_pygame() except: print("""\ Could not import pygame_sdl2. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. You may be using a system install of python. Please run {0}.sh, {0}.exe, or {0}.app instead. """.format(name), file=sys.stderr) raise # If we're not given a command, show the presplash. if args.command == "run" and not renpy.mobile: import renpy.display.presplash # @Reimport renpy.display.presplash.start(basedir, gamedir) # Ditto for the Ren'Py module. try: import _renpy; _renpy except: print("""\ Could not import _renpy. Please ensure that this program has been built and unpacked properly. You may be using a system install of python. Please run {0}.sh, {0}.exe, or {0}.app instead. """.format(name), file=sys.stderr) raise # Load up all of Ren'Py, in the right order. import renpy # @Reimport renpy.import_all() renpy.loader.init_importer() exit_status = None try: while exit_status is None: exit_status = 1 try: renpy.game.args = args renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = [ ] if renpy.android: renpy.config.logdir = os.environ['ANDROID_PUBLIC'] else: renpy.config.logdir = basedir if not os.path.exists(renpy.config.logdir): os.makedirs(renpy.config.logdir, 0o777) renpy.main.main() exit_status = 0 except KeyboardInterrupt: raise except renpy.game.UtterRestartException: # On an UtterRestart, reload Ren'Py. renpy.reload_all() exit_status = None except renpy.game.QuitException as e: exit_status = e.status if e.relaunch: if hasattr(sys, "renpy_executable"): subprocess.Popen([sys.renpy_executable] + sys.argv[1:]) else: subprocess.Popen([sys.executable, "-EO"] + sys.argv) except renpy.game.ParseErrorException: pass except Exception as e: renpy.error.report_exception(e) pass sys.exit(exit_status) finally: if "RENPY_SHUTDOWN_TRACE" in os.environ: enable_trace(int(os.environ["RENPY_SHUTDOWN_TRACE"])) renpy.display.im.cache.quit() if renpy.display.draw: renpy.display.draw.quit() # Prevent subprocess from throwing errors while trying to run it's # __del__ method during shutdown. subprocess.Popen.__del__ = popen_del
def bootstrap(renpy_base): global renpy # W0602 import renpy.log #@UnusedImport os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) renpy_base = unicode(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = { } execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app")+4] if os.path.exists(alt_path + "/environment.txt"): evars = { } execfile(alt_path + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] op = optparse.OptionParser() op.add_option('--arg', dest='args', default=[], action='append', help='Append an argument to a list that can be accessed as config.args.') op.add_option('--version', dest='version', default=False, action='store_true', help="Display the version of Ren'Py") op.add_option('--game', dest='game', default=None, help='The directory the game is in.') op.add_option("--savedir", dest='savedir', default=None, action='store', help='The directory in which to save data. Defaults to the saves directory under the game directory.') op.add_option('--lock', dest='lock', default=None, action='store', help=optparse.SUPPRESS_HELP) op.add_option('--python', dest='python', default=None, help=optparse.SUPPRESS_HELP) op.add_option('--compile', dest='compile', default=False, action='store_true', help="Causes Ren'Py to compile all .rpy files to .rpyc files, and then quit.") op.add_option('--lint', dest='lint', default=False, action='store_true', help='Run a number of expensive tests, to try to detect errors in the script.') op.add_option('--profile', dest='profile', action='store_true', default=False, help='Causes the amount of time it takes to draw the screen to be profiled.') op.add_option('--trace', dest='trace', action='count', default=0, help='Dump internal trace data to trace.txt. Use twice to dump in absurd detail.') op.add_option('--leak', dest='leak', action='store_true', default=False, help=optparse.SUPPRESS_HELP) op.add_option('--warp', dest='warp', default=None, help='This takes as an argument a filename:linenumber pair, and tries to warp to the statement before that line number.') op.add_option('--remote', dest='remote', action='store_true', help="Allows Ren'Py to be fed commands on stdin.") op.add_option('--rmpersistent', dest='rmpersistent', action='store_true', help="Deletes the persistent data, and exits.") op.add_option('--presplash', dest='presplash', default=None, help="Used internally to display the presplash screen.") op.add_option('--log-startup', dest='log_startup', action='store_true', default=os.environ.get("RENPY_LOG_STARTUP", None), help="Causes Ren'Py to log startup timings to its log.") op.add_option('--debug-image-cache', dest='debug_image_cache', action='store_true', default=False, help="Causes Ren'Py to log startup timings to its log.") options, args = op.parse_args() if options.presplash: import renpy.display.presplash renpy.display.presplash.show(options.presplash) if options.trace: enable_trace(options.trace) if options.python: import __main__ sys.argv = [ options.python ] + args execfile(options.python, __main__.__dict__, __main__.__dict__) sys.exit(0) args = list(args) if len(args) >= 1: basedir = os.path.abspath(args[0]).decode(FSENCODING) else: basedir = renpy_base # If we made it this far, we will be running the game, or at least # doing a lint. # os.chdir(renpy_base) # Look for the game directory. if options.game: gamedir = options.game.decode(FSENCODING) else: gamedirs = [ name ] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend([ 'game', 'data', 'launcher']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # Force windib on windows, unless the user explicitly overrides. if hasattr(sys, 'winver') and not 'SDL_VIDEODRIVER' in os.environ: os.environ['SDL_VIDEODRIVER'] = 'windib' # Show the presplash. if not options.lint and not options.compile and not options.version and not options.rmpersistent: import renpy.display.presplash #@Reimport renpy.display.presplash.start(gamedir) # If we're on a mac, install our own os.start. if sys.platform == "darwin": os.startfile = mac_start # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame; pygame except: print >>sys.stderr, """\ Could not import pygame. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. """ raise # Load up all of Ren'Py, in the right order. import renpy #@Reimport renpy.import_all() if options.version: print renpy.version sys.exit(0) keep_running = True try: while keep_running: try: renpy.game.options = options renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = options.args renpy.main.main() keep_running = False except KeyboardInterrupt: traceback.print_exc() break except renpy.game.UtterRestartException: if renpy.display.draw: renpy.display.draw.deinit() renpy.display.draw.quit() # On an UtterRestart, reload Ren'Py. renpy.reload_all() continue except renpy.game.QuitException: keep_running = False except renpy.game.ParseErrorException: keep_running = False except Exception, e: report_exception(e) keep_running = False sys.exit(0)
def bootstrap(renpy_base): global renpy # W0602 import renpy.log # @UnusedImport # Remove a legacy environment setting. if os.environ.get(b"SDL_VIDEODRIVER", "") == "windib": del os.environ[b"SDL_VIDEODRIVER"] renpy_base = str(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = {} exec( compile( open(renpy_base + "/environment.txt").read(), renpy_base + "/environment.txt", 'exec'), evars) for k, v in evars.items(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app") + 4] if os.path.exists(alt_path + "/environment.txt"): evars = {} exec( compile( open(alt_path + "/environment.txt").read(), alt_path + "/environment.txt", 'exec'), evars) for k, v in evars.items(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] # Parse the arguments. import renpy.arguments args = renpy.arguments.bootstrap() if args.trace: enable_trace(args.trace) if args.basedir: basedir = os.path.abspath(args.basedir).decode(FSENCODING) else: basedir = renpy_base if not os.path.exists(basedir): sys.stderr.write("Base directory %r does not exist. Giving up.\n" % (basedir, )) sys.exit(1) gamedirs = [name] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend(['game', 'data', 'launcher/game']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) if renpy.macintosh: # If we're on a mac, install our own os.start. os.startfile = mac_start # Are we starting from inside a mac app resources directory? if basedir.endswith("Contents/Resources/autorun"): renpy.macapp = True # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame_sdl2 if not ("pygame" in sys.modules): pygame_sdl2.import_as_pygame() except: print("""\ Could not import pygame_sdl2. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. You may be using a system install of python. Please run {0}.sh, {0}.exe, or {0}.app instead. """.format(name), file=sys.stderr) raise # If we're not given a command, show the presplash. if args.command == "run" and not renpy.mobile: import renpy.display.presplash # @Reimport renpy.display.presplash.start(basedir, gamedir) # Ditto for the Ren'Py module. try: import _renpy _renpy except: print("""\ Could not import _renpy. Please ensure that this program has been built and unpacked properly. You may be using a system install of python. Please run {0}.sh, {0}.exe, or {0}.app instead. """.format(name), file=sys.stderr) raise # Load up all of Ren'Py, in the right order. import renpy # @Reimport renpy.import_all() renpy.loader.init_importer() exit_status = None try: while exit_status is None: exit_status = 1 try: renpy.game.args = args renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = [] if renpy.android: renpy.config.logdir = os.environ['ANDROID_PUBLIC'] else: renpy.config.logdir = basedir if not os.path.exists(renpy.config.logdir): os.makedirs(renpy.config.logdir, 0o777) renpy.main.main() exit_status = 0 except KeyboardInterrupt: raise except renpy.game.UtterRestartException: # On an UtterRestart, reload Ren'Py. renpy.reload_all() exit_status = None except renpy.game.QuitException as e: exit_status = e.status if e.relaunch: if hasattr(sys, "renpy_executable"): subprocess.Popen([sys.renpy_executable] + sys.argv[1:]) else: subprocess.Popen([sys.executable, "-EO"] + sys.argv) except renpy.game.ParseErrorException: pass except Exception as e: renpy.error.report_exception(e) pass sys.exit(exit_status) finally: if "RENPY_SHUTDOWN_TRACE" in os.environ: enable_trace(int(os.environ["RENPY_SHUTDOWN_TRACE"])) renpy.display.im.cache.quit() if renpy.display.draw: renpy.display.draw.quit() # Prevent subprocess from throwing errors while trying to run it's # __del__ method during shutdown. subprocess.Popen.__del__ = popen_del
def bootstrap(renpy_base): global renpy # W0602 import renpy.log #@UnusedImport os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) renpy_base = unicode(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = {} execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app") + 4] if os.path.exists(alt_path + "/environment.txt"): evars = {} execfile(alt_path + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] # Parse the arguments. import renpy.arguments args = renpy.arguments.bootstrap() # Since we don't have time to fully initialize before running the presplash # command, handle it specially. if args.command == "presplash": import renpy.display.presplash renpy.display.presplash.show(sys.argv[3]) if args.trace: enable_trace(args.trace) if args.basedir: basedir = os.path.abspath(args.basedir).decode(FSENCODING) else: basedir = renpy_base gamedirs = [name] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend(['game', 'data', 'launcher/game']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # Force windib on windows, unless the user explicitly overrides. if renpy.windows and not 'SDL_VIDEODRIVER' in os.environ: os.environ['SDL_VIDEODRIVER'] = 'windib' # If we're not given a command, show the presplash. if args.command == "run": import renpy.display.presplash #@Reimport renpy.display.presplash.start(basedir, gamedir) # If we're on a mac, install our own os.start. if renpy.macintosh: os.startfile = mac_start # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame pygame except: print >> sys.stderr, """\ Could not import pygame. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. """ raise # Load up all of Ren'Py, in the right order. import renpy #@Reimport renpy.import_all() keep_running = True try: while keep_running: try: renpy.game.args = args renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = [] renpy.main.main() keep_running = False except KeyboardInterrupt: traceback.print_exc() break except renpy.game.UtterRestartException: if renpy.display.draw: renpy.display.draw.deinit() renpy.display.draw.quit() # On an UtterRestart, reload Ren'Py. renpy.reload_all() continue except renpy.game.QuitException: keep_running = False except renpy.game.ParseErrorException: keep_running = False except Exception, e: report_exception(e) keep_running = False sys.exit(0)
def bootstrap(renpy_base): global renpy # W0602 os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = {} execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] op = optparse.OptionParser() op.add_option( '--arg', dest='args', default=[], action='append', help='Append an argument to a list that can be accessed as config.args.' ) op.add_option('--version', dest='version', default=False, action='store_true', help="Display the version of Ren'Py") op.add_option('--game', dest='game', default=None, help='The directory the game is in.') op.add_option( "--savedir", dest='savedir', default=None, action='store', help= 'The directory in which to save data. Defaults to the saves directory under the game directory.' ) op.add_option('--lock', dest='lock', default=None, action='store', help=optparse.SUPPRESS_HELP) op.add_option('--python', dest='python', default=None, help=optparse.SUPPRESS_HELP) op.add_option( '--compile', dest='compile', default=False, action='store_true', help= "Causes Ren'Py to compile all .rpy files to .rpyc files, and then quit." ) op.add_option( '--lint', dest='lint', default=False, action='store_true', help= 'Run a number of expensive tests, to try to detect errors in the script.' ) op.add_option( '--profile', dest='profile', action='store_true', default=False, help= 'Causes the amount of time it takes to draw the screen to be profiled.' ) op.add_option( '--trace', dest='trace', action='count', default=0, help= 'Dump internal trace data to trace.txt. Use twice to dump in absurd detail.' ) op.add_option('--leak', dest='leak', action='store_true', default=False, help=optparse.SUPPRESS_HELP) op.add_option( '--warp', dest='warp', default=None, help= 'This takes as an argument a filename:linenumber pair, and tries to warp to the statement before that line number.' ) op.add_option('--remote', dest='remote', action='store_true', help="Allows Ren'Py to be fed commands on stdin.") op.add_option('--rmpersistent', dest='rmpersistent', action='store_true', help="Deletes the persistent data, and exits.") op.add_option('--presplash', dest='presplash', default=None, help="Used internally to display the presplash screen.") options, args = op.parse_args() if options.presplash: import renpy.display.presplash renpy.display.presplash.show(options.presplash) if options.trace: enable_trace(options.trace) if options.python: import __main__ sys.argv = [options.python] + args execfile(options.python, __main__.__dict__, __main__.__dict__) sys.exit(0) args = list(args) if len(args) >= 1: basedir = os.path.abspath(args[0]) else: basedir = renpy_base # If we made it this far, we will be running the game, or at least # doing a lint. # os.chdir(renpy_base) # Look for the game directory. if options.game: gamedir = options.game else: gamedirs = [name] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend(['game', 'data', 'launcher']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # Force windib on windows, unless the user explicitly overrides. if hasattr(sys, 'winver') and not 'SDL_VIDEODRIVER' in os.environ: os.environ['SDL_VIDEODRIVER'] = 'windib' # Show the presplash. if not options.lint and not options.compile and not options.version and not options.rmpersistent: import renpy.display.presplash # W0404 renpy.display.presplash.start(gamedir) # Fix an exception thrown by garbage collection. import subprocess # W0403 subprocess.Popen.__del__ = popen_del # E1101 # If we're on a mac, install our own os.start. if sys.platform == "darwin": os.startfile = mac_start # Load up all of Ren'Py, in the right order. import renpy renpy.import_all() if options.version: print renpy.version sys.exit(0) keep_running = True report_error = None while keep_running: try: renpy.game.options = options renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = options.args renpy.main.main() keep_running = False except KeyboardInterrupt: import traceback traceback.print_exc() break except renpy.game.UtterRestartException: # Only works after a full restart. report_error = renpy.display.error.ReportError() # On an UtterRestart, reload Ren'Py. renpy.reload_all() continue except renpy.game.ParseErrorException: if report_error and report_error.report('a parse error'): renpy.reload_all() keep_running = True else: keep_running = False except Exception, e: report_exception(e) if report_error and report_error.report('an exception'): renpy.reload_all() keep_running = True else: keep_running = False
def bootstrap(renpy_base): global renpy # W0602 import renpy.log #@UnusedImport os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) renpy_base = unicode(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = {} execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app") + 4] if os.path.exists(alt_path + "/environment.txt"): evars = {} execfile(alt_path + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] op = optparse.OptionParser() op.add_option( '--arg', dest='args', default=[], action='append', help='Append an argument to a list that can be accessed as config.args.' ) op.add_option('--version', dest='version', default=False, action='store_true', help="Display the version of Ren'Py") op.add_option('--game', dest='game', default=None, help='The directory the game is in.') op.add_option( "--savedir", dest='savedir', default=None, action='store', help= 'The directory in which to save data. Defaults to the saves directory under the game directory.' ) op.add_option('--lock', dest='lock', default=None, action='store', help=optparse.SUPPRESS_HELP) op.add_option('--python', dest='python', default=None, help=optparse.SUPPRESS_HELP) op.add_option( '--compile', dest='compile', default=False, action='store_true', help= "Causes Ren'Py to compile all .rpy files to .rpyc files, and then quit." ) op.add_option( '--lint', dest='lint', default=False, action='store_true', help= 'Run a number of expensive tests, to try to detect errors in the script.' ) op.add_option( '--profile', dest='profile', action='store_true', default=False, help= 'Causes the amount of time it takes to draw the screen to be profiled.' ) op.add_option( '--trace', dest='trace', action='count', default=0, help= 'Dump internal trace data to trace.txt. Use twice to dump in absurd detail.' ) op.add_option('--leak', dest='leak', action='store_true', default=False, help=optparse.SUPPRESS_HELP) op.add_option( '--warp', dest='warp', default=None, help= 'This takes as an argument a filename:linenumber pair, and tries to warp to the statement before that line number.' ) op.add_option('--remote', dest='remote', action='store_true', help="Allows Ren'Py to be fed commands on stdin.") op.add_option('--rmpersistent', dest='rmpersistent', action='store_true', help="Deletes the persistent data, and exits.") op.add_option('--presplash', dest='presplash', default=None, help="Used internally to display the presplash screen.") op.add_option('--log-startup', dest='log_startup', action='store_true', default=os.environ.get("RENPY_LOG_STARTUP", None), help="Causes Ren'Py to log startup timings to its log.") op.add_option('--debug-image-cache', dest='debug_image_cache', action='store_true', default=False, help="Causes Ren'Py to log startup timings to its log.") options, args = op.parse_args() if options.presplash: import renpy.display.presplash renpy.display.presplash.show(options.presplash) if options.trace: enable_trace(options.trace) if options.python: import __main__ sys.argv = [options.python] + args execfile(options.python, __main__.__dict__, __main__.__dict__) sys.exit(0) args = list(args) if len(args) >= 1: basedir = os.path.abspath(args[0]).decode(FSENCODING) else: basedir = renpy_base # If we made it this far, we will be running the game, or at least # doing a lint. # os.chdir(renpy_base) # Look for the game directory. if options.game: gamedir = options.game.decode(FSENCODING) else: gamedirs = [name] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend(['game', 'data', 'launcher']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # Force windib on windows, unless the user explicitly overrides. if hasattr(sys, 'winver') and not 'SDL_VIDEODRIVER' in os.environ: os.environ['SDL_VIDEODRIVER'] = 'windib' # Show the presplash. if not options.lint and not options.compile and not options.version and not options.rmpersistent: import renpy.display.presplash #@Reimport renpy.display.presplash.start(gamedir) # If we're on a mac, install our own os.start. if sys.platform == "darwin": os.startfile = mac_start # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame pygame except: print >> sys.stderr, """\ Could not import pygame. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. """ raise # Load up all of Ren'Py, in the right order. import renpy #@Reimport renpy.import_all() if options.version: print renpy.version sys.exit(0) keep_running = True try: while keep_running: try: renpy.game.options = options renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = options.args renpy.main.main() keep_running = False except KeyboardInterrupt: traceback.print_exc() break except renpy.game.UtterRestartException: if renpy.display.draw: renpy.display.draw.deinit() renpy.display.draw.quit() # On an UtterRestart, reload Ren'Py. renpy.reload_all() continue except renpy.game.QuitException: keep_running = False except renpy.game.ParseErrorException: keep_running = False except Exception, e: report_exception(e) keep_running = False sys.exit(0)
def bootstrap(renpy_base): global renpy # W0602 import renpy.log #@UnusedImport os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) renpy_base = unicode(renpy_base, FSENCODING, "replace") # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = {} execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Also look for it in an alternate path (the path that contains the # .app file.), if on a mac. alt_path = os.path.abspath("renpy_base") if ".app" in alt_path: alt_path = alt_path[:alt_path.find(".app") + 4] if os.path.exists(alt_path + "/environment.txt"): evars = {} execfile(alt_path + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] # Parse the arguments. import renpy.arguments args = renpy.arguments.bootstrap() # Since we don't have time to fully initialize before running the presplash # command, handle it specially. if args.command == "presplash": import renpy.display.presplash renpy.display.presplash.show(sys.argv[3]) if args.trace: enable_trace(args.trace) if args.basedir: basedir = os.path.abspath(args.basedir).decode(FSENCODING) else: basedir = renpy_base if not os.path.exists(basedir): sys.stderr.write("Base directory %r does not exist. Giving up.\n" % (basedir, )) sys.exit(1) gamedirs = [name] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend(['game', 'data', 'launcher/game']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # If we're not given a command, show the presplash. if args.command == "run": import renpy.display.presplash #@Reimport renpy.display.presplash.start(basedir, gamedir) # If we're on a mac, install our own os.start. if renpy.macintosh: os.startfile = mac_start # Check that we have installed pygame properly. This also deals with # weird cases on Windows and Linux where we can't import modules. (On # windows ";" is a directory separator in PATH, so if it's in a parent # directory, we won't get the libraries in the PATH, and hence pygame # won't import.) try: import pygame_sdl2 pygame_sdl2.import_as_pygame() except: print >> sys.stderr, """\ Could not import pygame_sdl2. Please ensure that this program has been built and unpacked properly. Also, make sure that the directories containing this program do not contain : or ; in their names. You may be using a system install of python. Please run {0}.sh, {0}.exe, or {0}.app instead. """.format(name) raise # Ditto for the Ren'Py module. try: import _renpy _renpy except: print >> sys.stderr, """\ Could not import _renpy. Please ensure that this program has been built and unpacked properly. You may be using a system install of python. Please run {0}.sh, {0}.exe, or {0}.app instead. """.format(name) raise # Load up all of Ren'Py, in the right order. import renpy #@Reimport renpy.import_all() renpy.loader.init_importer() exit_status = None try: while exit_status is None: exit_status = 1 try: renpy.game.args = args renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = [] if renpy.android: renpy.config.logdir = os.environ['ANDROID_PUBLIC'] else: renpy.config.logdir = basedir if not os.path.exists(renpy.config.logdir): os.makedirs(renpy.config.logdir, 0777) renpy.main.main() exit_status = 0 except KeyboardInterrupt: raise except renpy.game.UtterRestartException: # On an UtterRestart, reload Ren'Py. renpy.reload_all() exit_status = None except renpy.game.QuitException as e: exit_status = e.status if e.relaunch: subprocess.Popen([sys.executable, "-EO"] + sys.argv) except renpy.game.ParseErrorException: pass except Exception, e: renpy.error.report_exception(e) pass sys.exit(exit_status)
def bootstrap(renpy_base): global renpy # W0602 os.environ["RENPY_BASE"] = os.path.abspath(renpy_base) # If environment.txt exists, load it into the os.environ dictionary. if os.path.exists(renpy_base + "/environment.txt"): evars = { } execfile(renpy_base + "/environment.txt", evars) for k, v in evars.iteritems(): if k not in os.environ: os.environ[k] = str(v) # Get a working name for the game. name = os.path.basename(sys.argv[0]) if name.find(".") != -1: name = name[:name.find(".")] op = optparse.OptionParser() op.add_option('--arg', dest='args', default=[], action='append', help='Append an argument to a list that can be accessed as config.args.') op.add_option('--version', dest='version', default=False, action='store_true', help="Display the version of Ren'Py") op.add_option('--game', dest='game', default=None, help='The directory the game is in.') op.add_option("--savedir", dest='savedir', default=None, action='store', help='The directory in which to save data. Defaults to the saves directory under the game directory.') op.add_option('--lock', dest='lock', default=None, action='store', help=optparse.SUPPRESS_HELP) op.add_option('--python', dest='python', default=None, help=optparse.SUPPRESS_HELP) op.add_option('--compile', dest='compile', default=False, action='store_true', help="Causes Ren'Py to compile all .rpy files to .rpyc files, and then quit.") op.add_option('--lint', dest='lint', default=False, action='store_true', help='Run a number of expensive tests, to try to detect errors in the script.') op.add_option('--profile', dest='profile', action='store_true', default=False, help='Causes the amount of time it takes to draw the screen to be profiled.') op.add_option('--trace', dest='trace', action='count', default=0, help='Dump internal trace data to trace.txt. Use twice to dump in absurd detail.') op.add_option('--leak', dest='leak', action='store_true', default=False, help=optparse.SUPPRESS_HELP) op.add_option('--warp', dest='warp', default=None, help='This takes as an argument a filename:linenumber pair, and tries to warp to the statement before that line number.') op.add_option('--remote', dest='remote', action='store_true', help="Allows Ren'Py to be fed commands on stdin.") op.add_option('--rmpersistent', dest='rmpersistent', action='store_true', help="Deletes the persistent data, and exits.") op.add_option('--presplash', dest='presplash', default=None, help="Used internally to display the presplash screen.") options, args = op.parse_args() if options.presplash: import renpy.display.presplash renpy.display.presplash.show(options.presplash) if options.trace: enable_trace(options.trace) if options.python: import __main__ sys.argv = [ options.python ] + args execfile(options.python, __main__.__dict__, __main__.__dict__) sys.exit(0) args = list(args) if len(args) >= 1: basedir = os.path.abspath(args[0]) else: basedir = renpy_base # If we made it this far, we will be running the game, or at least # doing a lint. # os.chdir(renpy_base) # Look for the game directory. if options.game: gamedir = options.game else: gamedirs = [ name ] game_name = name while game_name: prefix = game_name[0] game_name = game_name[1:] if prefix == ' ' or prefix == '_': gamedirs.append(game_name) gamedirs.extend([ 'game', 'data', 'launcher']) for i in gamedirs: if i == "renpy": continue gamedir = basedir + "/" + i if os.path.isdir(gamedir): break else: gamedir = basedir sys.path.insert(0, basedir) # Force windib on windows, unless the user explicitly overrides. if hasattr(sys, 'winver') and not 'SDL_VIDEODRIVER' in os.environ: os.environ['SDL_VIDEODRIVER'] = 'windib' # Show the presplash. if not options.lint and not options.compile and not options.version and not options.rmpersistent: import renpy.display.presplash # W0404 renpy.display.presplash.start(gamedir) # Fix an exception thrown by garbage collection. import subprocess # W0403 subprocess.Popen.__del__ = popen_del # E1101 # If we're on a mac, install our own os.start. if sys.platform == "darwin": os.startfile = mac_start # Load up all of Ren'Py, in the right order. import renpy renpy.import_all() if options.version: print renpy.version sys.exit(0) keep_running = True report_error = None while keep_running: try: renpy.game.options = options renpy.config.renpy_base = renpy_base renpy.config.basedir = basedir renpy.config.gamedir = gamedir renpy.config.args = options.args renpy.main.main() keep_running = False except KeyboardInterrupt: import traceback traceback.print_exc() break except renpy.game.UtterRestartException: # Only works after a full restart. report_error = renpy.display.error.ReportError() # On an UtterRestart, reload Ren'Py. renpy.reload_all() continue except renpy.game.ParseErrorException: if report_error and report_error.report('a parse error'): renpy.reload_all() keep_running = True else: keep_running = False except Exception, e: report_exception(e) if report_error and report_error.report('an exception'): renpy.reload_all() keep_running = True else: keep_running = False