Merge branch 'DoorDevUnstable' into KeyLogicAttempt1
This commit is contained in:
@@ -131,6 +131,7 @@ class World(object):
|
|||||||
set_player_attr('treasure_hunt_total', 0)
|
set_player_attr('treasure_hunt_total', 0)
|
||||||
set_player_attr('potshuffle', False)
|
set_player_attr('potshuffle', False)
|
||||||
set_player_attr('pot_contents', None)
|
set_player_attr('pot_contents', None)
|
||||||
|
set_player_attr('fakeboots', False)
|
||||||
|
|
||||||
set_player_attr('shopsanity', False)
|
set_player_attr('shopsanity', False)
|
||||||
set_player_attr('keydropshuffle', False)
|
set_player_attr('keydropshuffle', False)
|
||||||
|
|||||||
3
CLI.py
3
CLI.py
@@ -97,7 +97,7 @@ def parse_cli(argv, no_defaults=False):
|
|||||||
'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid',
|
'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid',
|
||||||
'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory',
|
'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory',
|
||||||
'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max',
|
'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max',
|
||||||
'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks',
|
'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'fakeboots',
|
||||||
'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters',
|
'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters',
|
||||||
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
|
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
|
||||||
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep',
|
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep',
|
||||||
@@ -144,6 +144,7 @@ def parse_settings():
|
|||||||
"shuffleganon": True,
|
"shuffleganon": True,
|
||||||
"shuffle": "vanilla",
|
"shuffle": "vanilla",
|
||||||
"shufflelinks": False,
|
"shufflelinks": False,
|
||||||
|
"fakeboots": False,
|
||||||
|
|
||||||
"shufflepots": False,
|
"shufflepots": False,
|
||||||
"shuffleenemies": "none",
|
"shuffleenemies": "none",
|
||||||
|
|||||||
1
Main.py
1
Main.py
@@ -90,6 +90,7 @@ def main(args, seed=None, fish=None):
|
|||||||
world.treasure_hunt_count = args.triforce_goal.copy()
|
world.treasure_hunt_count = args.triforce_goal.copy()
|
||||||
world.treasure_hunt_total = args.triforce_pool.copy()
|
world.treasure_hunt_total = args.triforce_pool.copy()
|
||||||
world.shufflelinks = args.shufflelinks.copy()
|
world.shufflelinks = args.shufflelinks.copy()
|
||||||
|
world.fakeboots = args.fakeboots.copy()
|
||||||
|
|
||||||
world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)}
|
world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)}
|
||||||
|
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ def roll_settings(weights):
|
|||||||
ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off'
|
ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off'
|
||||||
|
|
||||||
ret.shufflelinks = get_choice('shufflelinks') == 'on'
|
ret.shufflelinks = get_choice('shufflelinks') == 'on'
|
||||||
|
ret.fakeboots = get_choice('fakeboots') == 'on'
|
||||||
ret.shopsanity = get_choice('shopsanity') == 'on'
|
ret.shopsanity = get_choice('shopsanity') == 'on'
|
||||||
ret.keydropshuffle = get_choice('keydropshuffle') == 'on'
|
ret.keydropshuffle = get_choice('keydropshuffle') == 'on'
|
||||||
ret.mixed_travel = get_choice('mixed_travel') if 'mixed_travel' in weights else 'prevent'
|
ret.mixed_travel = get_choice('mixed_travel') if 'mixed_travel' in weights else 'prevent'
|
||||||
|
|||||||
@@ -24,6 +24,18 @@ Thanks to qadan, cheuer, & compiling
|
|||||||
* Fixed an issue with the credit stats specific to DR (e.g. collection rate total)
|
* Fixed an issue with the credit stats specific to DR (e.g. collection rate total)
|
||||||
* More helpful error message when bps is missing?
|
* More helpful error message when bps is missing?
|
||||||
* Minor generation issues involving enemizer and the link sprite
|
* Minor generation issues involving enemizer and the link sprite
|
||||||
|
* Baserom updates (from Bonta, kan, qwertymodo, ardnaxelark)
|
||||||
|
* Boss icon on dungeon map (if you have a compass)
|
||||||
|
* Progressive bow sprite replacement
|
||||||
|
* Quickswap - consecutive special swaps
|
||||||
|
* Bonk Counter
|
||||||
|
* One mind
|
||||||
|
* MSU fix
|
||||||
|
* Chest turn tracking (not yet in credits)
|
||||||
|
* Damaged and magic stats in credits (gt bk removed)
|
||||||
|
* Fix for infinite bombs
|
||||||
|
* Fake boots option
|
||||||
|
* Always allowed medallions for swordless (no option yet)
|
||||||
* 0.4.0.7
|
* 0.4.0.7
|
||||||
* Reduce flashing option added
|
* Reduce flashing option added
|
||||||
* Sprite author credit added
|
* Sprite author credit added
|
||||||
|
|||||||
27
Rom.py
27
Rom.py
@@ -18,7 +18,6 @@ except ImportError:
|
|||||||
from BaseClasses import CollectionState, ShopType, Region, Location, Door, DoorType, RegionType, PotItem
|
from BaseClasses import CollectionState, ShopType, Region, Location, Door, DoorType, RegionType, PotItem
|
||||||
from DoorShuffle import compass_data, DROptions, boss_indicator
|
from DoorShuffle import compass_data, DROptions, boss_indicator
|
||||||
from Dungeons import dungeon_music_addresses
|
from Dungeons import dungeon_music_addresses
|
||||||
from KeyDoorShuffle import count_locations_exclude_logic
|
|
||||||
from Regions import location_table, shop_to_location_table, retro_shops
|
from Regions import location_table, shop_to_location_table, retro_shops
|
||||||
from RoomData import DoorKind
|
from RoomData import DoorKind
|
||||||
from Text import MultiByteTextMapper, CompressedTextMapper, text_addresses, Credits, TextTable
|
from Text import MultiByteTextMapper, CompressedTextMapper, text_addresses, Credits, TextTable
|
||||||
@@ -31,7 +30,7 @@ from EntranceShuffle import door_addresses, exit_ids
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = '712324ad3ca7bff751d9f62812a2c3b6'
|
RANDOMIZERBASEHASH = '736978dd2b3a2bb109ac80ed7c048e67'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -809,7 +808,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
write_int16(rom, 0x187010, credits_total) # dynamic credits
|
write_int16(rom, 0x187010, credits_total) # dynamic credits
|
||||||
if credits_total != 216:
|
if credits_total != 216:
|
||||||
# collection rate address:
|
# collection rate address:
|
||||||
cr_address = 0x2391FA
|
cr_address = 0x2391F2
|
||||||
cr_pc = cr_address - 0x120000 # convert to pc
|
cr_pc = cr_address - 0x120000 # convert to pc
|
||||||
mid_top, mid_bot = credits_digit((credits_total // 10) % 10)
|
mid_top, mid_bot = credits_digit((credits_total // 10) % 10)
|
||||||
last_top, last_bot = credits_digit(credits_total % 10)
|
last_top, last_bot = credits_digit(credits_total % 10)
|
||||||
@@ -820,25 +819,6 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.write_byte(cr_pc+0x3a, mid_bot)
|
rom.write_byte(cr_pc+0x3a, mid_bot)
|
||||||
rom.write_byte(cr_pc+0x3b, last_bot)
|
rom.write_byte(cr_pc+0x3b, last_bot)
|
||||||
|
|
||||||
if world.keydropshuffle[player] or world.doorShuffle[player] != 'vanilla':
|
|
||||||
gt = world.dungeon_layouts[player]['Ganons Tower']
|
|
||||||
gt_logic = world.key_logic[player]['Ganons Tower']
|
|
||||||
total = 0
|
|
||||||
for region in gt.master_sector.regions:
|
|
||||||
total += count_locations_exclude_logic(region.locations, gt_logic)
|
|
||||||
# rom.write_byte(0x187012, total) # dynamic credits
|
|
||||||
# gt big key address:
|
|
||||||
gtbk_address = 0x23911C
|
|
||||||
gtbk_pc = gtbk_address - 0x120000 # convert to pc
|
|
||||||
mid_top, mid_bot = credits_digit(total // 10)
|
|
||||||
last_top, last_bot = credits_digit(total % 10)
|
|
||||||
# top half
|
|
||||||
rom.write_byte(gtbk_pc+0x1c, mid_top)
|
|
||||||
rom.write_byte(gtbk_pc+0x1d, last_top)
|
|
||||||
# bottom half
|
|
||||||
rom.write_byte(gtbk_pc+0x3a, mid_bot)
|
|
||||||
rom.write_byte(gtbk_pc+0x3b, last_bot)
|
|
||||||
|
|
||||||
# patch medallion requirements
|
# patch medallion requirements
|
||||||
if world.required_medallions[player][0] == 'Bombos':
|
if world.required_medallions[player][0] == 'Bombos':
|
||||||
rom.write_byte(0x180022, 0x00) # requirement
|
rom.write_byte(0x180022, 0x00) # requirement
|
||||||
@@ -1182,6 +1162,9 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.write_byte(0x18017E, 0x01) # Fairy fountains only trade in bottles
|
rom.write_byte(0x18017E, 0x01) # Fairy fountains only trade in bottles
|
||||||
|
|
||||||
# Starting equipment
|
# Starting equipment
|
||||||
|
if world.fakeboots[player]:
|
||||||
|
rom.write_byte(0x18008E, 0x01)
|
||||||
|
|
||||||
equip = [0] * (0x340 + 0x4F)
|
equip = [0] * (0x340 + 0x4F)
|
||||||
equip[0x36C] = 0x18
|
equip[0x36C] = 0x18
|
||||||
equip[0x36D] = 0x18
|
equip[0x36D] = 0x18
|
||||||
|
|||||||
Binary file not shown.
@@ -310,6 +310,10 @@
|
|||||||
"action": "store_true",
|
"action": "store_true",
|
||||||
"type": "bool"
|
"type": "bool"
|
||||||
},
|
},
|
||||||
|
"fakeboots": {
|
||||||
|
"action": "store_true",
|
||||||
|
"type": "bool"
|
||||||
|
},
|
||||||
"calc_playthrough": {
|
"calc_playthrough": {
|
||||||
"action": "store_false",
|
"action": "store_false",
|
||||||
"type": "bool"
|
"type": "bool"
|
||||||
|
|||||||
@@ -262,6 +262,7 @@
|
|||||||
"Keys are universal, shooting arrows costs rupees,",
|
"Keys are universal, shooting arrows costs rupees,",
|
||||||
"and a few other little things make this more like Zelda-1. (default: %(default)s)"
|
"and a few other little things make this more like Zelda-1. (default: %(default)s)"
|
||||||
],
|
],
|
||||||
|
"fakeboots": [ " Players starts with fake boots that allow dashing but no item checks (default: %(default)s"],
|
||||||
"startinventory": [ "Specifies a list of items that will be in your starting inventory (separated by commas). (default: %(default)s)" ],
|
"startinventory": [ "Specifies a list of items that will be in your starting inventory (separated by commas). (default: %(default)s)" ],
|
||||||
"usestartinventory": [ "Toggle usage of Starting Inventory." ],
|
"usestartinventory": [ "Toggle usage of Starting Inventory." ],
|
||||||
"custom": [ "Not supported." ],
|
"custom": [ "Not supported." ],
|
||||||
|
|||||||
@@ -189,6 +189,7 @@
|
|||||||
|
|
||||||
"randomizer.item.hints": "Include Helpful Hints",
|
"randomizer.item.hints": "Include Helpful Hints",
|
||||||
"randomizer.item.retro": "Retro mode (universal keys)",
|
"randomizer.item.retro": "Retro mode (universal keys)",
|
||||||
|
"randomizer.item.fakeboots": "Start with Fake Boots",
|
||||||
|
|
||||||
"randomizer.item.worldstate": "World State",
|
"randomizer.item.worldstate": "World State",
|
||||||
"randomizer.item.worldstate.standard": "Standard",
|
"randomizer.item.worldstate.standard": "Standard",
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
"shopsanity": { "type": "checkbox" },
|
"shopsanity": { "type": "checkbox" },
|
||||||
"hints": {
|
"hints": {
|
||||||
"type": "checkbox"
|
"type": "checkbox"
|
||||||
}
|
},
|
||||||
|
"fakeboots": { "type": "checkbox" }
|
||||||
},
|
},
|
||||||
"leftItemFrame": {
|
"leftItemFrame": {
|
||||||
"worldstate": {
|
"worldstate": {
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ SETTINGSTOPROCESS = {
|
|||||||
"hints": "hints",
|
"hints": "hints",
|
||||||
"retro": "retro",
|
"retro": "retro",
|
||||||
"shopsanity": "shopsanity",
|
"shopsanity": "shopsanity",
|
||||||
|
"fakeboots": "fakeboots",
|
||||||
"worldstate": "mode",
|
"worldstate": "mode",
|
||||||
"logiclevel": "logic",
|
"logiclevel": "logic",
|
||||||
"goal": "goal",
|
"goal": "goal",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from tkinter import ttk, Frame, E, W, LEFT, RIGHT
|
from tkinter import ttk, Frame, E, W, LEFT, RIGHT, Label
|
||||||
import source.gui.widgets as widgets
|
import source.gui.widgets as widgets
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
@@ -17,6 +17,9 @@ def item_page(parent):
|
|||||||
self.frames["checkboxes"] = Frame(self)
|
self.frames["checkboxes"] = Frame(self)
|
||||||
self.frames["checkboxes"].pack(anchor=W)
|
self.frames["checkboxes"].pack(anchor=W)
|
||||||
|
|
||||||
|
various_options = Label(self.frames["checkboxes"], text="")
|
||||||
|
various_options.pack(side=LEFT)
|
||||||
|
|
||||||
self.frames["leftItemFrame"] = Frame(self)
|
self.frames["leftItemFrame"] = Frame(self)
|
||||||
self.frames["rightItemFrame"] = Frame(self)
|
self.frames["rightItemFrame"] = Frame(self)
|
||||||
self.frames["leftItemFrame"].pack(side=LEFT)
|
self.frames["leftItemFrame"].pack(side=LEFT)
|
||||||
@@ -34,7 +37,7 @@ def item_page(parent):
|
|||||||
self.widgets[key] = dictWidgets[key]
|
self.widgets[key] = dictWidgets[key]
|
||||||
packAttrs = {"anchor":E}
|
packAttrs = {"anchor":E}
|
||||||
if self.widgets[key].type == "checkbox":
|
if self.widgets[key].type == "checkbox":
|
||||||
packAttrs["anchor"] = W
|
packAttrs["side"] = LEFT
|
||||||
self.widgets[key].pack(packAttrs)
|
self.widgets[key].pack(packAttrs)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|||||||
Reference in New Issue
Block a user