Use proper OS-specific path uris in many more places
also move path.join into local_path and output_path to simplify use
This commit is contained in:
		
							parent
							
								
									08f8677433
								
							
						
					
					
						commit
						2096d6ae5b
					
				
							
								
								
									
										8
									
								
								Gui.py
								
								
								
								
							
							
						
						
									
										8
									
								
								Gui.py
								
								
								
								
							| 
						 | 
				
			
			@ -1566,22 +1566,22 @@ class SpriteSelector(object):
 | 
			
		|||
    @property
 | 
			
		||||
    def alttpr_sprite_dir(self):
 | 
			
		||||
        if is_bundled():
 | 
			
		||||
            return output_path("sprites/alttpr")
 | 
			
		||||
            return output_path("sprites", "alttpr")
 | 
			
		||||
        return self.local_alttpr_sprite_dir
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def local_alttpr_sprite_dir(self):
 | 
			
		||||
        return local_path("data/sprites/alttpr")
 | 
			
		||||
        return local_path("data", "sprites", "alttpr")
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def custom_sprite_dir(self):
 | 
			
		||||
        if is_bundled():
 | 
			
		||||
            return output_path("sprites/custom")
 | 
			
		||||
            return output_path("sprites", "custom")
 | 
			
		||||
        return self.local_custom_sprite_dir
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def local_custom_sprite_dir(self):
 | 
			
		||||
        return local_path("data/sprites/custom")
 | 
			
		||||
        return local_path("data", "sprites", "custom")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_image_for_sprite(sprite):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,10 +5,10 @@ import tkinter as tk
 | 
			
		|||
from Utils import local_path
 | 
			
		||||
 | 
			
		||||
def set_icon(window):
 | 
			
		||||
    er16 = tk.PhotoImage(file=local_path('data/ER16.gif'))
 | 
			
		||||
    er32 = tk.PhotoImage(file=local_path('data/ER32.gif'))
 | 
			
		||||
    er48 = tk.PhotoImage(file=local_path('data/ER32.gif'))
 | 
			
		||||
    window.tk.call('wm', 'iconphoto', window._w, er16, er32, er48) # pylint: disable=protected-access
 | 
			
		||||
    er16 = tk.PhotoImage(file=local_path('data', 'ER16.gif'))
 | 
			
		||||
    er32 = tk.PhotoImage(file=local_path('data', 'ER32.gif'))
 | 
			
		||||
    er48 = tk.PhotoImage(file=local_path('data', 'ER32.gif'))
 | 
			
		||||
    window.tk.call('wm', 'iconphoto', window._w, er16, er32, er48)  # pylint: disable=protected-access
 | 
			
		||||
 | 
			
		||||
# Although tkinter is intended to be thread safe, there are many reports of issues
 | 
			
		||||
# some which may be platform specific, or depend on if the TCL library was compiled without
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								Rom.py
								
								
								
								
							
							
						
						
									
										22
									
								
								Rom.py
								
								
								
								
							| 
						 | 
				
			
			@ -19,8 +19,10 @@ from Regions import location_table
 | 
			
		|||
from Text import MultiByteTextMapper, CompressedTextMapper, text_addresses, Credits, TextTable
 | 
			
		||||
from Text import Uncle_texts, Ganon1_texts, TavernMan_texts, Sahasrahla2_texts, Triforce_texts, Blind_texts, BombShop2_texts, junk_texts
 | 
			
		||||
 | 
			
		||||
from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths_texts, DeathMountain_texts, LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts, Sahasrahla_names
 | 
			
		||||
from Utils import output_path, local_path, int16_as_bytes, int32_as_bytes, snes_to_pc
 | 
			
		||||
from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths_texts, DeathMountain_texts, \
 | 
			
		||||
    LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, \
 | 
			
		||||
    SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts, Sahasrahla_names
 | 
			
		||||
from Utils import output_path, local_path, int16_as_bytes, int32_as_bytes, snes_to_pc, is_bundled
 | 
			
		||||
from Items import ItemFactory
 | 
			
		||||
from EntranceShuffle import door_addresses
 | 
			
		||||
import Patch
 | 
			
		||||
| 
						 | 
				
			
			@ -78,12 +80,12 @@ class LocalRom(object):
 | 
			
		|||
 | 
			
		||||
            if self.verify(buffer):
 | 
			
		||||
                self.buffer = buffer
 | 
			
		||||
                if not os.path.exists(local_path(os.path.join('data', 'basepatch.bmbp'))):
 | 
			
		||||
                if not os.path.exists(local_path('data', 'basepatch.bmbp')):
 | 
			
		||||
                    Patch.create_patch_file(local_path('basepatch.sfc'))
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        if os.path.isfile(local_path(os.path.join('data', 'basepatch.bmbp'))):
 | 
			
		||||
            _, target, buffer = Patch.create_rom_bytes(local_path(os.path.join('data', 'basepatch.bmbp')))
 | 
			
		||||
        if os.path.isfile(local_path('data', 'basepatch.bmbp')):
 | 
			
		||||
            _, target, buffer = Patch.create_rom_bytes(local_path('data', 'basepatch.bmbp'))
 | 
			
		||||
            if self.verify(buffer):
 | 
			
		||||
                self.buffer = bytearray(buffer)
 | 
			
		||||
                with open(local_path('basepatch.sfc'), 'wb') as stream:
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +101,7 @@ class LocalRom(object):
 | 
			
		|||
        self.buffer.extend(bytearray([0x00]) * (0x200000 - len(self.buffer)))
 | 
			
		||||
 | 
			
		||||
        # load randomizer patches
 | 
			
		||||
        with open(local_path('data/base2current.json')) as stream:
 | 
			
		||||
        with open(local_path('data', 'base2current.json')) as stream:
 | 
			
		||||
            patches = json.load(stream)
 | 
			
		||||
        for patch in patches:
 | 
			
		||||
            if isinstance(patch, dict):
 | 
			
		||||
| 
						 | 
				
			
			@ -111,8 +113,8 @@ class LocalRom(object):
 | 
			
		|||
            with open(local_path('basepatch.sfc'), 'wb') as stream:
 | 
			
		||||
                stream.write(self.buffer)
 | 
			
		||||
            Patch.create_patch_file(local_path('basepatch.sfc'),
 | 
			
		||||
                                    destination=local_path(os.path.join('data', 'basepatch.bmbp')))
 | 
			
		||||
            os.remove(local_path('data/base2current.json'))
 | 
			
		||||
                                    destination=local_path('data', 'basepatch.bmbp'))
 | 
			
		||||
            os.remove(local_path('data', 'base2current.json'))
 | 
			
		||||
        else:
 | 
			
		||||
            raise RuntimeError(
 | 
			
		||||
                'Provided Base Rom unsuitable for patching. Please provide a JAP(1.0) "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc" rom to use as a base.')
 | 
			
		||||
| 
						 | 
				
			
			@ -355,7 +357,7 @@ def _populate_sprite_table():
 | 
			
		|||
                    logging.debug(f"Spritefile {file} could not be loaded as a valid sprite.")
 | 
			
		||||
 | 
			
		||||
            with concurrent.futures.ThreadPoolExecutor() as pool:
 | 
			
		||||
                for dir in [local_path('data/sprites/alttpr'), local_path('data/sprites/custom')]:
 | 
			
		||||
                for dir in [local_path('data', 'sprites', 'alttpr'), local_path('data', 'sprites', 'custom')]:
 | 
			
		||||
                    for file in os.listdir(dir):
 | 
			
		||||
                        pool.submit(load_sprite_from_file, os.path.join(dir, file))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -430,7 +432,7 @@ class Sprite(object):
 | 
			
		|||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def default_link_sprite():
 | 
			
		||||
        return Sprite(local_path('data/default.zspr'))
 | 
			
		||||
        return Sprite(local_path('data', 'default.zspr'))
 | 
			
		||||
 | 
			
		||||
    def decode8(self, pos):
 | 
			
		||||
        arr = [[0 for _ in range(8)] for _ in range(8)]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								Utils.py
								
								
								
								
							
							
						
						
									
										13
									
								
								Utils.py
								
								
								
								
							| 
						 | 
				
			
			@ -61,9 +61,9 @@ def is_bundled() -> bool:
 | 
			
		|||
    return getattr(sys, 'frozen', False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def local_path(path):
 | 
			
		||||
def local_path(*path):
 | 
			
		||||
    if local_path.cached_path:
 | 
			
		||||
        return os.path.join(local_path.cached_path, path)
 | 
			
		||||
        return os.path.join(local_path.cached_path, *path)
 | 
			
		||||
 | 
			
		||||
    elif is_bundled():
 | 
			
		||||
        if hasattr(sys, "_MEIPASS"):
 | 
			
		||||
| 
						 | 
				
			
			@ -77,15 +77,16 @@ def local_path(path):
 | 
			
		|||
        import __main__
 | 
			
		||||
        local_path.cached_path = os.path.dirname(os.path.abspath(__main__.__file__))
 | 
			
		||||
 | 
			
		||||
    return os.path.join(local_path.cached_path, path)
 | 
			
		||||
    return os.path.join(local_path.cached_path, *path)
 | 
			
		||||
 | 
			
		||||
local_path.cached_path = None
 | 
			
		||||
 | 
			
		||||
def output_path(path):
 | 
			
		||||
 | 
			
		||||
def output_path(*path):
 | 
			
		||||
    if output_path.cached_path:
 | 
			
		||||
        return os.path.join(output_path.cached_path, path)
 | 
			
		||||
        return os.path.join(output_path.cached_path, *path)
 | 
			
		||||
    output_path.cached_path = local_path(get_options()["general_options"]["output_path"])
 | 
			
		||||
    path = os.path.join(output_path.cached_path, path)
 | 
			
		||||
    path = os.path.join(output_path.cached_path, *path)
 | 
			
		||||
    os.makedirs(os.path.dirname(path), exist_ok=True)
 | 
			
		||||
    return path
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								WebUI.py
								
								
								
								
							
							
						
						
									
										2
									
								
								WebUI.py
								
								
								
								
							| 
						 | 
				
			
			@ -143,7 +143,7 @@ class RequestHandler(http.server.SimpleHTTPRequestHandler):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
Handler = partial(RequestHandler,
 | 
			
		||||
                  directory=Utils.local_path(os.path.join("data", "web", "public")))
 | 
			
		||||
                  directory=Utils.local_path("data", "web", "public"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def start_server(socket_port: int, on_start=lambda: None):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,3 +5,4 @@ fuzzywuzzy>=0.18.0
 | 
			
		|||
bsdiff4>=1.2.0
 | 
			
		||||
prompt_toolkit>=3.0.6
 | 
			
		||||
appdirs>=1.4.4
 | 
			
		||||
maseya-z3pr>=1.0.0.dev5
 | 
			
		||||
							
								
								
									
										9
									
								
								setup.py
								
								
								
								
							
							
						
						
									
										9
									
								
								setup.py
								
								
								
								
							| 
						 | 
				
			
			@ -80,7 +80,7 @@ cx_Freeze.setup(
 | 
			
		|||
        "build_exe": {
 | 
			
		||||
            "includes": [],
 | 
			
		||||
            "zip_include_packages": ["*"],
 | 
			
		||||
            "zip_exclude_packages": ["maseya"],
 | 
			
		||||
            "zip_exclude_packages": [],
 | 
			
		||||
            "include_files": [],
 | 
			
		||||
            "include_msvcr": True,
 | 
			
		||||
            "replace_paths": [("*", "")],
 | 
			
		||||
| 
						 | 
				
			
			@ -91,15 +91,14 @@ cx_Freeze.setup(
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def installfile(path):
 | 
			
		||||
def installfile(path, keep_content=False):
 | 
			
		||||
    lbuildfolder = buildfolder
 | 
			
		||||
    print('copying', path, '->', lbuildfolder)
 | 
			
		||||
    if path.is_dir():
 | 
			
		||||
        lbuildfolder /= path.name
 | 
			
		||||
        if lbuildfolder.is_dir():
 | 
			
		||||
        if lbuildfolder.is_dir() and not keep_content:
 | 
			
		||||
            shutil.rmtree(lbuildfolder)
 | 
			
		||||
        shutil.copytree(path, lbuildfolder)
 | 
			
		||||
        shutil.copytree(path, lbuildfolder, dirs_exist_ok=True)
 | 
			
		||||
    elif path.is_file():
 | 
			
		||||
        shutil.copy(path, lbuildfolder)
 | 
			
		||||
    else:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue