From 979a710d5cf1429dc47e63c9947d0fa008afa852 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Sun, 9 Mar 2025 16:50:55 -0500 Subject: [PATCH] Crystal book setting --- BaseClasses.py | 3 +++ CLI.py | 3 ++- Main.py | 3 +++ Rom.py | 6 +++++- data/base2current.bps | Bin 134076 -> 134136 bytes resources/app/cli/args.json | 4 ++++ resources/app/cli/lang/en.json | 1 + 7 files changed, 18 insertions(+), 2 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index f0f48418..f1232175 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -171,6 +171,7 @@ class World(object): set_player_attr('pseudoboots', False) set_player_attr('mirrorscroll', False) set_player_attr('dark_rooms', 'require_lamp') + set_player_attr('crystal_book', False) set_player_attr('collection_rate', False) set_player_attr('colorizepots', True) set_player_attr('pot_pool', {}) @@ -3065,6 +3066,7 @@ class Spoiler(object): 'pseudoboots': self.world.pseudoboots, 'mirrorscroll': self.world.mirrorscroll, 'dark_rooms': self.world.dark_rooms, + 'crystal_book': self.world.crystal_book, 'triforcegoal': self.world.treasure_hunt_count, 'triforcepool': self.world.treasure_hunt_total, 'race': self.world.settings.world_rep['meta']['race'], @@ -3315,6 +3317,7 @@ class Spoiler(object): outfile.write('Pseudoboots:'.ljust(line_width) + '%s\n' % yn(self.metadata['pseudoboots'][player])) outfile.write('Mirror Scroll:'.ljust(line_width) + '%s\n' % yn(self.metadata['mirrorscroll'][player])) outfile.write('Dark Rooms:'.ljust(line_width) + '%s\n' % self.metadata['dark_rooms'][player]) + outfile.write('Crystal Book:'.ljust(line_width) + '%s\n' % yn(self.metadata['crystal_book'][player])) outfile.write('Hints:'.ljust(line_width) + '%s\n' % yn(self.metadata['hints'][player])) outfile.write('Race:'.ljust(line_width) + '%s\n' % yn(self.world.settings.world_rep['meta']['race'])) diff --git a/CLI.py b/CLI.py index 07e499e0..8d8e3f1b 100644 --- a/CLI.py +++ b/CLI.py @@ -139,7 +139,7 @@ def parse_cli(argv, no_defaults=False): 'triforce_max_difference', 'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max', 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'shuffletavern', 'skullwoods', 'linked_drops', - 'pseudoboots', 'mirrorscroll', "dark_rooms", 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', + 'pseudoboots', 'mirrorscroll', 'dark_rooms', 'crystal_book', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle', @@ -211,6 +211,7 @@ def parse_settings(): "pseudoboots": False, "mirrorscroll": False, "dark_rooms": "require_lamp", + "crystal_book": False, "shuffleenemies": "none", "shufflebosses": "none", diff --git a/Main.py b/Main.py index f908e702..0699aadb 100644 --- a/Main.py +++ b/Main.py @@ -509,6 +509,7 @@ def init_world(args, fish): world.pseudoboots = args.pseudoboots.copy() world.mirrorscroll = args.mirrorscroll.copy() world.dark_rooms = args.dark_rooms.copy() + world.crystal_book = args.crystal_book.copy() world.overworld_map = args.overworld_map.copy() world.take_any = args.take_any.copy() world.restrict_boss_items = args.restrict_boss_items.copy() @@ -605,6 +606,7 @@ def copy_world(world): ret.pseudoboots = world.pseudoboots.copy() ret.mirrorscroll = world.mirrorscroll.copy() ret.dark_rooms = world.dark_rooms.copy() + ret.crystal_book = world.crystal_book.copy() ret.overworld_map = world.overworld_map.copy() ret.take_any = world.take_any.copy() ret.boss_shuffle = world.boss_shuffle.copy() @@ -826,6 +828,7 @@ def copy_world_premature(world, player): ret.pseudoboots = world.pseudoboots.copy() ret.mirrorscroll = world.mirrorscroll.copy() ret.dark_rooms = world.dark_rooms.copy() + ret.crystal_book = world.crystal_book.copy() ret.overworld_map = world.overworld_map.copy() ret.take_any = world.take_any.copy() ret.boss_shuffle = world.boss_shuffle.copy() diff --git a/Rom.py b/Rom.py index e4a999e6..9a8412af 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '5d715dfd920f9eadf5db51b5719e1ff6' +RANDOMIZERBASEHASH = 'd4315f2f34fae3ac852d433fa990888b' class JsonRom(object): @@ -1231,6 +1231,10 @@ def patch_rom(world, rom, player, team, is_mystery=False): # Starting equipment if world.pseudoboots[player]: rom.write_byte(0x18008E, 0x01) + + if world.crystal_book[player]: + rom.write_byte(0x1800A6, 0x01) + rom.initial_sram.set_starting_equipment(world, player) rom.write_byte(0x18004A, 0x00 if world.mode[player] != 'inverted' else 0x01) # Inverted mode diff --git a/data/base2current.bps b/data/base2current.bps index 91674e9bcb7bc40e649e799fcacc768fe4597566..66debc2c52ed2102ceec5fb0a51677eb969fcab6 100644 GIT binary patch delta 165 zcmV;W09yaNmk9Wm2(Tan1nIjLM6)CV3I_*~fg)V{qy)1u3gRCLxRoMi`=qcBD6{8XKARKxFWUyorYpydIOhzN0*H_fB_hm zbY6t9Yo+ih56}{?rGT*T43%&;zAsYpI?|T7VxRk0w-?w{~g)nH2_ZK#`YU TGPf0g0iTNq!O=!zvgY1b5Ew>`pd ze~XzCucd&n@C=p*ScRQ*1JDDdXKSgRNm_shBacFgx3X#hnH2_lKarPfF}G2G0iTNq LK%8TPj~FQmczr18 diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index e58cb67b..79da8dd7 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -566,6 +566,10 @@ "always_in_logic" ] }, + "crystal_book": { + "action": "store_true", + "type": "bool" + }, "calc_playthrough": { "action": "store_false", "type": "bool" diff --git a/resources/app/cli/lang/en.json b/resources/app/cli/lang/en.json index f3812416..182cc4ec 100644 --- a/resources/app/cli/lang/en.json +++ b/resources/app/cli/lang/en.json @@ -401,6 +401,7 @@ "NoDarkRooms: Dark rooms are changed to no longer be dark, and are always in logic", "AlwaysInLogic: Dark rooms are always considered to be in logic, even if the player cannot see" ], + "crystal_book": [ " Book can be used indoors to flip the state of colored pegs (default: %(default)s)"], "bombbag": ["Start with 0 bomb capacity. Two capacity upgrades (+10) are added to the pool (default: %(default)s)" ], "any_enemy_logic": [ "How to handle potential traversal between dungeon in Crossed door shuffle",