mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
![]() |
import io, re, json
|
||
|
import os, sys
|
||
|
import subprocess
|
||
|
import Utils
|
||
|
from functools import lru_cache
|
||
|
|
||
|
__version__ = Utils.__version__ + ' f.LUM'
|
||
|
|
||
|
def data_path(*args):
|
||
|
return Utils.local_path('worlds', 'oot', '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")
|
||
|
|
||
|
def is_bundled():
|
||
|
return getattr(sys, 'frozen', False)
|
||
|
|
||
|
# 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
|