Merge branch 'DoorDev' into DoorDevUnstable
# Conflicts: # Main.py # RELEASENOTES.md
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -36,3 +36,4 @@ get-pip.py
|
|||||||
|
|
||||||
venv
|
venv
|
||||||
test
|
test
|
||||||
|
data/base2current.json
|
||||||
|
|||||||
@@ -1377,6 +1377,11 @@ class Door(object):
|
|||||||
else:
|
else:
|
||||||
self.passage = False
|
self.passage = False
|
||||||
|
|
||||||
|
def kind(self, world):
|
||||||
|
if self.roomIndex != -1 and self.doorListPos != -1:
|
||||||
|
return world.get_room(self.roomIndex, self.player).kind(self)
|
||||||
|
return None
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return isinstance(other, self.__class__) and self.name == other.name
|
return isinstance(other, self.__class__) and self.name == other.name
|
||||||
|
|
||||||
|
|||||||
27
CLI.py
27
CLI.py
@@ -6,7 +6,6 @@ import textwrap
|
|||||||
import shlex
|
import shlex
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import source.classes.constants as CONST
|
|
||||||
from source.classes.BabelFish import BabelFish
|
from source.classes.BabelFish import BabelFish
|
||||||
|
|
||||||
from Utils import update_deprecated_args
|
from Utils import update_deprecated_args
|
||||||
@@ -17,6 +16,7 @@ class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter):
|
|||||||
def _get_help_string(self, action):
|
def _get_help_string(self, action):
|
||||||
return textwrap.dedent(action.help)
|
return textwrap.dedent(action.help)
|
||||||
|
|
||||||
|
|
||||||
def parse_cli(argv, no_defaults=False):
|
def parse_cli(argv, no_defaults=False):
|
||||||
def defval(value):
|
def defval(value):
|
||||||
return value if not no_defaults else None
|
return value if not no_defaults else None
|
||||||
@@ -28,10 +28,15 @@ def parse_cli(argv, no_defaults=False):
|
|||||||
fish = BabelFish(lang=lang)
|
fish = BabelFish(lang=lang)
|
||||||
|
|
||||||
# we need to know how many players we have first
|
# we need to know how many players we have first
|
||||||
|
# also if we're loading our own settings file, we should do that now
|
||||||
parser = argparse.ArgumentParser(add_help=False)
|
parser = argparse.ArgumentParser(add_help=False)
|
||||||
|
parser.add_argument('--settingsfile', help="input json file of settings", type=str)
|
||||||
parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255))
|
parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255))
|
||||||
multiargs, _ = parser.parse_known_args(argv)
|
multiargs, _ = parser.parse_known_args(argv)
|
||||||
|
|
||||||
|
if multiargs.settingsfile:
|
||||||
|
settings = apply_settings_file(settings, multiargs.settingsfile)
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
|
parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
|
||||||
|
|
||||||
# get args
|
# get args
|
||||||
@@ -73,6 +78,7 @@ def parse_cli(argv, no_defaults=False):
|
|||||||
parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255))
|
parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255))
|
||||||
parser.add_argument('--securerandom', default=defval(settings["securerandom"]), action='store_true')
|
parser.add_argument('--securerandom', default=defval(settings["securerandom"]), action='store_true')
|
||||||
parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1))
|
parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1))
|
||||||
|
parser.add_argument('--settingsfile', dest="filename", help="input json file of settings", type=str)
|
||||||
|
|
||||||
if multiargs.multi:
|
if multiargs.multi:
|
||||||
for player in range(1, multiargs.multi + 1):
|
for player in range(1, multiargs.multi + 1):
|
||||||
@@ -104,6 +110,15 @@ def parse_cli(argv, no_defaults=False):
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def apply_settings_file(settings, settings_path):
|
||||||
|
if os.path.exists(settings_path):
|
||||||
|
with open(settings_path) as json_file:
|
||||||
|
data = json.load(json_file)
|
||||||
|
for k, v in data.items():
|
||||||
|
settings[k] = v
|
||||||
|
return settings
|
||||||
|
|
||||||
|
|
||||||
def parse_settings():
|
def parse_settings():
|
||||||
# set default settings
|
# set default settings
|
||||||
settings = {
|
settings = {
|
||||||
@@ -266,17 +281,15 @@ def parse_settings():
|
|||||||
|
|
||||||
# read saved settings file if it exists and set these
|
# read saved settings file if it exists and set these
|
||||||
settings_path = os.path.join(".", "resources", "user", "settings.json")
|
settings_path = os.path.join(".", "resources", "user", "settings.json")
|
||||||
if os.path.exists(settings_path):
|
settings = apply_settings_file(settings, settings_path)
|
||||||
with(open(settings_path)) as json_file:
|
|
||||||
data = json.load(json_file)
|
|
||||||
for k, v in data.items():
|
|
||||||
settings[k] = v
|
|
||||||
return settings
|
return settings
|
||||||
|
|
||||||
# Priority fallback is:
|
# Priority fallback is:
|
||||||
# 1: CLI
|
# 1: CLI
|
||||||
# 2: Settings file
|
# 2: Settings file(s)
|
||||||
# 3: Canned defaults
|
# 3: Canned defaults
|
||||||
|
|
||||||
|
|
||||||
def get_args_priority(settings_args, gui_args, cli_args):
|
def get_args_priority(settings_args, gui_args, cli_args):
|
||||||
args = {}
|
args = {}
|
||||||
args["settings"] = parse_settings() if settings_args is None else settings_args
|
args["settings"] = parse_settings() if settings_args is None else settings_args
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ New item counter modified to show total
|
|||||||
|
|
||||||
* 0.3.1.5-u
|
* 0.3.1.5-u
|
||||||
* Ganon hints fixed for shops
|
* Ganon hints fixed for shops
|
||||||
|
* Added support for a settings file so SahasrahBot and the main website can use it easier. (Thanks Synack)
|
||||||
* 0.3.1.4-u
|
* 0.3.1.4-u
|
||||||
* Fix for Blind when shuffled to TT and another dungeon
|
* Fix for Blind when shuffled to TT and another dungeon
|
||||||
* Remove use of RaceRandom
|
* Remove use of RaceRandom
|
||||||
|
|||||||
46
Utils.py
46
Utils.py
@@ -6,20 +6,25 @@ import sys
|
|||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
def int16_as_bytes(value):
|
def int16_as_bytes(value):
|
||||||
value = value & 0xFFFF
|
value = value & 0xFFFF
|
||||||
return [value & 0xFF, (value >> 8) & 0xFF]
|
return [value & 0xFF, (value >> 8) & 0xFF]
|
||||||
|
|
||||||
|
|
||||||
def int32_as_bytes(value):
|
def int32_as_bytes(value):
|
||||||
value = value & 0xFFFFFFFF
|
value = value & 0xFFFFFFFF
|
||||||
return [value & 0xFF, (value >> 8) & 0xFF, (value >> 16) & 0xFF, (value >> 24) & 0xFF]
|
return [value & 0xFF, (value >> 8) & 0xFF, (value >> 16) & 0xFF, (value >> 24) & 0xFF]
|
||||||
|
|
||||||
|
|
||||||
def pc_to_snes(value):
|
def pc_to_snes(value):
|
||||||
return ((value << 1) & 0x7F0000) | (value & 0x7FFF) | 0x8000
|
return ((value << 1) & 0x7F0000) | (value & 0x7FFF) | 0x8000
|
||||||
|
|
||||||
|
|
||||||
def snes_to_pc(value):
|
def snes_to_pc(value):
|
||||||
return ((value & 0x7F0000) >> 1) | (value & 0x7FFF)
|
return ((value & 0x7F0000) >> 1) | (value & 0x7FFF)
|
||||||
|
|
||||||
|
|
||||||
def parse_player_names(names, players, teams):
|
def parse_player_names(names, players, teams):
|
||||||
names = [n for n in re.split(r'[, ]', names) if n]
|
names = [n for n in re.split(r'[, ]', names) if n]
|
||||||
ret = []
|
ret = []
|
||||||
@@ -32,9 +37,11 @@ def parse_player_names(names, players, teams):
|
|||||||
names = names[players:]
|
names = names[players:]
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def is_bundled():
|
def is_bundled():
|
||||||
return getattr(sys, 'frozen', False)
|
return getattr(sys, 'frozen', False)
|
||||||
|
|
||||||
|
|
||||||
def local_path(path):
|
def local_path(path):
|
||||||
# just do stuff here and bail
|
# just do stuff here and bail
|
||||||
return os.path.join(".", path)
|
return os.path.join(".", path)
|
||||||
@@ -51,44 +58,19 @@ def local_path(path):
|
|||||||
|
|
||||||
return os.path.join(local_path.cached_path, path)
|
return os.path.join(local_path.cached_path, path)
|
||||||
|
|
||||||
|
|
||||||
local_path.cached_path = None
|
local_path.cached_path = None
|
||||||
|
|
||||||
|
|
||||||
def output_path(path):
|
def output_path(path):
|
||||||
# just do stuff here and bail
|
if output_path.cached_path is None:
|
||||||
return os.path.join(".", path)
|
|
||||||
|
|
||||||
if output_path.cached_path is not None:
|
|
||||||
return os.path.join(output_path.cached_path, path)
|
|
||||||
|
|
||||||
if not is_bundled():
|
|
||||||
output_path.cached_path = '.'
|
output_path.cached_path = '.'
|
||||||
return os.path.join(output_path.cached_path, path)
|
return os.path.join(output_path.cached_path, path)
|
||||||
else:
|
|
||||||
# has been packaged, so cannot use CWD for output.
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
#windows
|
|
||||||
documents = os.path.join(os.path.expanduser("~"),"Documents")
|
|
||||||
elif sys.platform == 'darwin':
|
|
||||||
from AppKit import NSSearchPathForDirectoriesInDomains # pylint: disable=import-error
|
|
||||||
# http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSearchPathForDirectoriesInDomains
|
|
||||||
NSDocumentDirectory = 9
|
|
||||||
NSUserDomainMask = 1
|
|
||||||
# True for expanding the tilde into a fully qualified path
|
|
||||||
documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0]
|
|
||||||
elif sys.platform.find("linux") or sys.platform.find("ubuntu") or sys.platform.find("unix"):
|
|
||||||
documents = os.path.join(os.path.expanduser("~"),"Documents")
|
|
||||||
else:
|
|
||||||
raise NotImplementedError('Not supported yet')
|
|
||||||
|
|
||||||
output_path.cached_path = os.path.join(documents, 'ALttPDoorRandomizer')
|
|
||||||
if not os.path.exists(output_path.cached_path):
|
|
||||||
os.makedirs(output_path.cached_path)
|
|
||||||
if not os.path.join(output_path.cached_path, path):
|
|
||||||
os.makedirs(os.path.join(output_path.cached_path, path))
|
|
||||||
return os.path.join(output_path.cached_path, path)
|
|
||||||
|
|
||||||
output_path.cached_path = None
|
output_path.cached_path = None
|
||||||
|
|
||||||
|
|
||||||
def open_file(filename):
|
def open_file(filename):
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
os.startfile(filename)
|
os.startfile(filename)
|
||||||
@@ -96,6 +78,7 @@ def open_file(filename):
|
|||||||
open_command = 'open' if sys.platform == 'darwin' else 'xdg-open'
|
open_command = 'open' if sys.platform == 'darwin' else 'xdg-open'
|
||||||
subprocess.call([open_command, filename])
|
subprocess.call([open_command, filename])
|
||||||
|
|
||||||
|
|
||||||
def close_console():
|
def close_console():
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
# windows
|
# windows
|
||||||
@@ -105,6 +88,7 @@ def close_console():
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def make_new_base2current(old_rom='Zelda no Densetsu - Kamigami no Triforce (Japan).sfc', new_rom='working.sfc'):
|
def make_new_base2current(old_rom='Zelda no Densetsu - Kamigami no Triforce (Japan).sfc', new_rom='working.sfc'):
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
import json
|
import json
|
||||||
@@ -241,7 +225,6 @@ def room_palette_data(old_rom):
|
|||||||
print(f'{hex(header_offset)}: {[hex(x) for x in rooms]}')
|
print(f'{hex(header_offset)}: {[hex(x) for x in rooms]}')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Palette notes:
|
# Palette notes:
|
||||||
# HC: 0
|
# HC: 0
|
||||||
# Sewer/Dungeon: 1
|
# Sewer/Dungeon: 1
|
||||||
@@ -306,6 +289,7 @@ def print_wiki_doors_by_region(d_regions, world, player):
|
|||||||
with open(os.path.join(".", "resources", "user", "regions-" + d + ".txt"), "w+") as f:
|
with open(os.path.join(".", "resources", "user", "regions-" + d + ".txt"), "w+") as f:
|
||||||
f.write(toprint)
|
f.write(toprint)
|
||||||
|
|
||||||
|
|
||||||
def update_deprecated_args(args):
|
def update_deprecated_args(args):
|
||||||
if args:
|
if args:
|
||||||
argVars = vars(args)
|
argVars = vars(args)
|
||||||
@@ -376,6 +360,7 @@ def update_deprecated_args(args):
|
|||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
|
||||||
def print_wiki_doors_by_room(d_regions, world, player):
|
def print_wiki_doors_by_room(d_regions, world, player):
|
||||||
for d, region_list in d_regions.items():
|
for d, region_list in d_regions.items():
|
||||||
tile_map = {}
|
tile_map = {}
|
||||||
@@ -415,6 +400,7 @@ def print_wiki_doors_by_room(d_regions, world, player):
|
|||||||
with open(os.path.join(".", "resources", "user", "rooms-" + d + ".txt"), "w+") as f:
|
with open(os.path.join(".", "resources", "user", "rooms-" + d + ".txt"), "w+") as f:
|
||||||
f.write(toprint)
|
f.write(toprint)
|
||||||
|
|
||||||
|
|
||||||
def print_xml_doors(d_regions, world, player):
|
def print_xml_doors(d_regions, world, player):
|
||||||
root = ET.Element('root')
|
root = ET.Element('root')
|
||||||
for d, region_list in d_regions.items():
|
for d, region_list in d_regions.items():
|
||||||
|
|||||||
1
_config.yml
Normal file
1
_config.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
theme: jekyll-theme-slate
|
||||||
@@ -7,6 +7,8 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from Utils import output_path
|
||||||
|
|
||||||
def adjust_page(top, parent, settings):
|
def adjust_page(top, parent, settings):
|
||||||
# Adjust page
|
# Adjust page
|
||||||
self = ttk.Frame(parent)
|
self = ttk.Frame(parent)
|
||||||
@@ -90,6 +92,8 @@ def adjust_page(top, parent, settings):
|
|||||||
|
|
||||||
# These are the options to Adjust
|
# These are the options to Adjust
|
||||||
def adjustRom():
|
def adjustRom():
|
||||||
|
if output_path.cached_path is None:
|
||||||
|
output_path.cached_path = top.settings["outputpath"]
|
||||||
options = {
|
options = {
|
||||||
"heartbeep": "heartbeep",
|
"heartbeep": "heartbeep",
|
||||||
"heartcolor": "heartcolor",
|
"heartcolor": "heartcolor",
|
||||||
|
|||||||
@@ -146,10 +146,13 @@ def bottom_frame(self, parent, args=None):
|
|||||||
self.widgets[widget].pieces["button"].pack(side=LEFT)
|
self.widgets[widget].pieces["button"].pack(side=LEFT)
|
||||||
|
|
||||||
def open_output():
|
def open_output():
|
||||||
|
if output_path.cached_path is None:
|
||||||
if args and args.outputpath:
|
if args and args.outputpath:
|
||||||
open_file(output_path(args.outputpath))
|
output_path.cached_path = args.outputpath
|
||||||
else:
|
else:
|
||||||
open_file(output_path(parent.settings["outputpath"]))
|
output_path.cached_path = parent.settings["outputpath"]
|
||||||
|
|
||||||
|
open_file(output_path('.'))
|
||||||
|
|
||||||
## Output Button
|
## Output Button
|
||||||
# widget ID
|
# widget ID
|
||||||
|
|||||||
Reference in New Issue
Block a user