import io, re, json import os, sys import subprocess import Utils from functools import lru_cache __version__ = '6.1.0 f.LUM' def data_path(*args): return os.path.join(os.path.dirname(__file__), 'data', *args) @lru_cache(maxsize=13) # Cache Overworld.json and the 12 dungeons def read_json(file_path): json_string = "" with io.open(file_path, 'r') as file: for line in file.readlines(): json_string += line.split('#')[0].replace('\n', ' ') json_string = re.sub(' +', ' ', json_string) try: return json.loads(json_string) except json.JSONDecodeError as error: raise Exception("JSON parse error around text:\n" + \ json_string[error.pos - 35:error.pos + 35] + "\n" + \ " ^^\n") # From the pyinstaller Wiki: https://github.com/pyinstaller/pyinstaller/wiki/Recipe-subprocess # Create a set of arguments which make a ``subprocess.Popen`` (and # variants) call work with or without Pyinstaller, ``--noconsole`` or # not, on Windows and Linux. Typical use:: # subprocess.call(['program_to_run', 'arg_1'], **subprocess_args()) def subprocess_args(include_stdout=True): # The following is true only on Windows. if hasattr(subprocess, 'STARTUPINFO'): # On Windows, subprocess calls will pop up a command window by default # when run from Pyinstaller with the ``--noconsole`` option. Avoid this # distraction. si = subprocess.STARTUPINFO() si.dwFlags |= subprocess.STARTF_USESHOWWINDOW # Windows doesn't search the path by default. Pass it an environment so # it will. env = os.environ else: si = None env = None # ``subprocess.check_output`` doesn't allow specifying ``stdout``:: # So, add it only if it's needed. if include_stdout: ret = {'stdout': subprocess.PIPE} else: ret = {} # On Windows, running this from the binary produced by Pyinstaller # with the ``--noconsole`` option requires redirecting everything # (stdin, stdout, stderr) to avoid an OSError exception # "[Error 6] the handle is invalid." ret.update({'stdin': subprocess.PIPE, 'stderr': subprocess.PIPE, 'startupinfo': si, 'env': env}) return ret def get_version_bytes(a): version_bytes = [0x00, 0x00, 0x00] if not a: return version_bytes sa = a.replace('v', '').replace(' ', '.').split('.') for i in range(0, 3): try: version_byte = int(sa[i]) except ValueError: break version_bytes[i] = version_byte return version_bytes def compare_version(a, b): if not a and not b: return 0 elif a and not b: return 1 elif not a and b: return -1 sa = get_version_bytes(a) sb = get_version_bytes(b) for i in range(0, 3): if sa[i] > sb[i]: return 1 if sa[i] < sb[i]: return -1 return 0