diff --git a/BaseClasses.py b/BaseClasses.py index 9f1b3706..d8fb6307 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -85,6 +85,7 @@ class World(object): self.bosses_ganon = {} self.bosshunt_include_agas = {} self.ganon_item = {} + self.require_ganon_item = {} self.ganon_item_orig = {} self.custom = custom self.customitemarray = customitemarray @@ -186,6 +187,7 @@ class World(object): set_player_attr('bosses_ganon', 8) set_player_attr('bosshunt_include_agas', False) set_player_attr('ganon_item', 'silver') + set_player_attr('require_ganon_item', False) set_player_attr('crystals_ganon_orig', {}) set_player_attr('crystals_gt_orig', {}) set_player_attr('ganon_item_orig', 'silver') @@ -3154,6 +3156,7 @@ class Spoiler(object): 'ganon_bosses': self.world.bosses_ganon, 'bosshunt_include_agas': self.world.bosshunt_include_agas, 'ganon_item': self.world.ganon_item, + 'require_ganon_item': self.world.require_ganon_item, 'open_pyramid': self.world.open_pyramid, 'accessibility': self.world.accessibility, 'restricted_boss_items': self.world.restrict_boss_items, @@ -3391,7 +3394,8 @@ class Spoiler(object): if custom['murahgoal'] and 'requirements' in custom['murahgoal']: outfile.write('Murahdahla Requirement:'.ljust(line_width) + 'custom\n') outfile.write(' %s\n' % custom['murahgoal']['goaltext']) - outfile.write('Item Required for Ganon:'.ljust(line_width) + '%s\n' % str(self.world.ganon_item_orig[player])) + outfile.write('Item to Hurt Stunned Ganon:'.ljust(line_width) + '%s\n' % str(self.world.ganon_item_orig[player])) + outfile.write('Item Required for Ganon:'.ljust(line_width) + '%s\n' % yn(self.world.require_ganon_item[player])) outfile.write('Swords:'.ljust(line_width) + '%s\n' % self.metadata['weapons'][player]) outfile.write('\n') outfile.write('Accessibility:'.ljust(line_width) + '%s\n' % self.metadata['accessibility'][player]) diff --git a/CLI.py b/CLI.py index 889ca73d..477684a4 100644 --- a/CLI.py +++ b/CLI.py @@ -159,7 +159,8 @@ def parse_cli(argv, no_defaults=False): 'take_any', 'boots_hint', 'shuffle_followers', 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'bosses_ganon', - 'bosshunt_include_agas', 'ganon_item', 'openpyramid', + 'bosshunt_include_agas', 'ganon_item', + 'require_ganon_item', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'prizeshuffle', 'showloot', 'loothud', 'showmap', 'startinventory', 'usestartinventory', @@ -220,6 +221,7 @@ def parse_settings(): "bosses_ganon": "8", "bosshunt_include_agas": False, "ganon_item": "silver", + "require_ganon_item": False, "swords": "random", "flute_mode": "normal", "bow_mode": "progressive", diff --git a/ItemList.py b/ItemList.py index 406c8261..9aa9b5ac 100644 --- a/ItemList.py +++ b/ItemList.py @@ -944,6 +944,7 @@ def customize_shops(world, player): rep_price = final_price(loc.name, item.price, world, player) shop.add_inventory(idx, upgrade.name, up_price, 6, item.name, rep_price, player=item.player) + upgrade.world = loc.item.world loc.item = upgrade upgrade.location = loc if not found_arrow_upgrade and len(possible_replacements) > 0: @@ -959,6 +960,7 @@ def customize_shops(world, player): shop.add_inventory(idx, upgrade.name, up_price, 6, item.name, rep_price, player=item.player) loc.item = upgrade + upgrade.world = loc.item.world upgrade.location = loc change_shop_items_to_rupees(world, player, shops_to_customize) balance_prices(world, player) @@ -995,9 +997,11 @@ def change_shop_items_to_rupees(world, player, shops): for location in locations: if location.item.name in shop_transfer.keys() and (location.parent_region.name not in shops or location.name == 'Potion Shop'): new_item = ItemFactory(shop_transfer[location.item.name], location.item.player) + new_item.world = location.item.world location.item = new_item if location.parent_region.name == 'Capacity Upgrade' and location.item.name in cap_blacklist: new_item = ItemFactory('Rupees (300)', location.item.player) + new_item.world = location.item.world location.item = new_item shop = world.get_region('Capacity Upgrade', player).shop slot = shop_to_location_table['Capacity Upgrade'].index(location.name) diff --git a/Items.py b/Items.py index 8c6a7ce7..87cfbc62 100644 --- a/Items.py +++ b/Items.py @@ -172,6 +172,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class 'Red Potion': (False, False, None, 0x2E, 150, 'Hearty red goop!', 'and the red goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has red goo again', 'a red potion'), 'Green Potion': (False, False, None, 0x2F, 60, 'Refreshing green goop!', 'and the green goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has green goo again', 'a green potion'), 'Blue Potion': (False, False, None, 0x30, 160, 'Delicious blue goop!', 'and the blue goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has blue goo again', 'a blue potion'), + 'Orange Potion': (False, False, None, 0x66, 1000, 'Energizing orange goop!', 'and the orange goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has orange goo again', 'an orange potion'), 'Bee': (False, False, None, 0x0E, 10, 'I will sting your foes a few times', 'and the sting buddy', 'the beekeeper kid', 'insect for sale', 'shroom pollenation', 'bottle boy has mad bee again', 'a bee'), 'Good Bee': (False, False, None, 0xD6, 10, 'I will sting your foes a lot', 'and the cold buddy', 'the beekeeper kid', 'cold insect for sale', 'shroom pollenation', 'bottle boy has cold bee again', 'a good bee'), 'Small Heart': (False, False, None, 0x42, 10, 'Just a little\npiece of love!', 'and the heart', 'the life-giving kid', 'little love for sale', 'fungus for life', 'life boy feels some love again', 'a refill heart'), diff --git a/Main.py b/Main.py index f19c75d9..851c451c 100644 --- a/Main.py +++ b/Main.py @@ -336,10 +336,29 @@ def main(args, seed=None, fish=None): for player in range(1, world.players+1): if world.shopsanity[player]: customize_shops(world, player) + if not args.skip_money_balance and args.algorithm in ['balanced', 'equitable']: balance_money_progression(world) ensure_good_items(world, True) + for player in range(1, world.players+1): + if args.orange_potion and world.difficulty[player] == "normal": + cap_shop = world.get_region('Capacity Upgrade', player).shop + potion = { + 'item': "Orange Potion", + 'price': 1000, + 'max': 0, + 'replacement': None, + 'replacement_price': 0, + 'create_location': False, + 'player': 0, + } + if cap_shop.inventory[0] is None: + cap_shop.inventory[0] = potion + else: + cap_shop.inventory.insert(1, potion) + + if args.print_custom_yaml: world.settings.record_info(world) world.settings.record_overworld(world) @@ -482,7 +501,7 @@ def export_yaml(args, fish): for player in range(1, world.players + 1): world.difficulty_requirements[player] = difficulties[world.difficulty[player]] - + set_starting_inventory(world, args) world.settings = CustomSettings() @@ -527,6 +546,7 @@ def init_world(args, fish): world.crystals_ganon_orig = args.crystals_ganon.copy() world.crystals_gt_orig = args.crystals_gt.copy() world.ganon_item_orig = args.ganon_item.copy() + world.require_ganon_item = args.require_ganon_item.copy() world.bosses_ganon = {player: int(args.bosses_ganon[player]) for player in range(1, world.players + 1)} world.bosshunt_include_agas = args.bosshunt_include_agas.copy() world.owTerrain = args.ow_terrain.copy() @@ -852,6 +872,7 @@ def copy_world(world): ret.bosses_ganon = world.bosses_ganon.copy() ret.bosshunt_include_agas = world.bosshunt_include_agas.copy() ret.ganon_item = world.ganon_item.copy() + ret.require_ganon_item = world.require_ganon_item.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() ret.crystals_gt_orig = world.crystals_gt_orig.copy() ret.ganon_item_orig = world.ganon_item_orig.copy() @@ -1086,6 +1107,7 @@ def copy_world_premature(world, player, create_flute_exits=True): ret.bosses_ganon = world.bosses_ganon.copy() ret.bosshunt_include_agas = world.bosshunt_include_agas.copy() ret.ganon_item = world.ganon_item.copy() + ret.require_ganon_item = world.require_ganon_item.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() ret.crystals_gt_orig = world.crystals_gt_orig.copy() ret.ganon_item_orig = world.ganon_item_orig.copy() diff --git a/Rom.py b/Rom.py index ccdc341b..4b620e9a 100644 --- a/Rom.py +++ b/Rom.py @@ -85,7 +85,7 @@ from Utils import int16_as_bytes, int32_as_bytes, local_path, snes_to_pc from Versions import DRVersion, GKVersion, ORVersion JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '9c603108cc074d98c06d1e200e777e4a' +RANDOMIZERBASEHASH = '589a044786a63d98aff0e44b51a6a339' class JsonRom(object): @@ -1450,9 +1450,14 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None): "bee": 0x10, "somaria": 0x11, "byrna": 0x12, - "none": 0xFF, + "none": 0x7F, } - rom.write_byte(0x18002E, ganon_item_byte[world.ganon_item[player]]) + ganon_item_value = ganon_item_byte[world.ganon_item[player]] + if world.require_ganon_item[player] and world.ganon_item[player] != "none": + if world.swords[player] != "swordless" or world.ganon_item[player] not in ["bombos", "ether", "quake"]: + ganon_item_value |= 0x80 + + rom.write_byte(0x18002E, ganon_item_value) # block HC upstairs doors in rain state in standard mode prevent_rain = world.mode[player] == 'standard' and world.shuffle[player] != 'vanilla' and world.logic[player] != 'nologic' @@ -2021,7 +2026,15 @@ def write_custom_shops(rom, world, player): if world.shopsanity[player] or shop.type == ShopType.TakeAny: rom.write_byte(0x186E40 + shop.sram_address + index, 1) if world.shopsanity[player] and shop.region.name in shop_to_location_table: - loc_item = world.get_location(shop_to_location_table[shop.region.name][index], player).item + if shop.region.name == "Capacity Upgrade" and shop.item_count == 3: + if index == 1: + loc_item = ItemFactory(item['item'], player) + else: + if index == 2: + index = 1 + loc_item = world.get_location(shop_to_location_table[shop.region.name][index], player).item + else: + loc_item = world.get_location(shop_to_location_table[shop.region.name][index], player).item elif world.shopsanity[player] and shop.region.name in retro_shops: loc_item = world.get_location(retro_shops[shop.region.name][index], player).item else: @@ -2037,7 +2050,7 @@ def write_custom_shops(rom, world, player): replace_price = int16_as_bytes(item['replacement_price']) item_max = item['max'] item_player = 0 if item['player'] == player else item['player'] - item_data = [shop_id, item_id] + price + [item_max, replace] + replace_price + [item_player] + item_data = [shop_id, item_id] + price + [item_max, replace] + replace_price + [item_player] items_data.extend(item_data) rom.write_bytes(0x184800, shop_data) @@ -2912,7 +2925,7 @@ def write_strings(rom, world, player, team, is_mystery=False): tt['sign_ganon'] = 'Ganon only respects those who have done everything.' tt['ganon_fall_in'] = Ganon1_texts[random.randint(0, len(Ganon1_texts) - 1)] tt['ganon_fall_in_alt'] = 'You cannot defeat me until you finish your goal!' - tt['ganon_phase_3_alt'] = 'Got wax in\nyour ears?\nI can not die!' + tt['ganon_phase_3_alt'] = 'Got wax in\nyour ears?\nI cannot die!' def get_custom_goal_text(type): goal_text = world.custom_goals[player][type]['goaltext'] @@ -2931,7 +2944,13 @@ def write_strings(rom, world, player, team, is_mystery=False): if world.custom_goals[player]['murahgoal'] and 'goaltext' in world.custom_goals[player]['murahgoal']: tt['murahdahla'] = get_custom_goal_text('murahgoal') - tt['kakariko_tavern_fisherman'] = TavernMan_texts[random.randint(0, len(TavernMan_texts) - 1)] + tavern_texts = random.sample(TavernMan_texts, 5) + + tt['tavern_old_man_awake'] = tavern_texts.pop() + tt['tavern_old_man_unactivated_flute'] = tavern_texts.pop() + tt['tavern_old_man_know_tree_unactivated_flute'] = tavern_texts.pop() + tt['tavern_old_man_have_flute'] = tavern_texts.pop() + tt['kakariko_tavern_fisherman'] = tavern_texts.pop() pedestalitem = world.get_location('Master Sword Pedestal', player).item pedestal_text = 'Some Hot Air' if pedestalitem is None else hint_text(pedestalitem, True) if pedestalitem.pedestal_hint_text is not None else 'Unknown Item' diff --git a/Rules.py b/Rules.py index 32802638..9f8457b7 100644 --- a/Rules.py +++ b/Rules.py @@ -1026,10 +1026,11 @@ def global_rules(world, player): world.get_location('Ganon', player), lambda state: state.has_beam_sword(player) and state.has_fire_source(player) - and (state.has('Tempered Sword', player) or state.has('Golden Sword', player) - or state.can_hit_stunned_ganon(player) - or state.has('Lamp', player) - or state.can_extend_magic(player, 12))) # need to light torch a sufficient amount of times + and (state.can_hit_stunned_ganon(player) or ( + not world.require_ganon_item[player] and ( + state.has('Tempered Sword', player) or state.has('Golden Sword', player) + or state.has('Lamp', player) + or state.can_extend_magic(player, 12))))) # need to light torch a sufficient amount of times set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has_beam_sword(player)) # need to damage ganon to get tiles to drop diff --git a/Text.py b/Text.py index 761f2f17..ee72c4c0 100644 --- a/Text.py +++ b/Text.py @@ -50,18 +50,18 @@ Uncle_texts = [ "Don't worry.\nI got this\ncovered.", "Race you to\nthe castle!", "\n Hi", - "I'M JUST GOING\nOUT FOR A\nPACK OF SMOKES", + "I'm just going\nout for a\npack of smokes.", "It's dangerous\nto go alone.\nSee ya!", - "ARE YOU A BAD\nENOUGH DUDE TO\nRESCUE ZELDA?", + "Are you a bad\nenough dude to\nrescue Zelda?", "\n\n I AM ERROR", "This seed is\nsub 2 hours,\nguaranteed.", "The chest is\na secret to\neverybody.", "I'm off to\nfind the\nwind fish.", "The shortcut\nto Ganon\nis this way!", - "THE MOON IS\nCRASHING! RUN\nFOR YOUR LIFE!", + "The moon is\ncrashing! Run\nfor your life!", "Time to fight\nhe who must\nnot be named.", - "RED MAIL\nIS FOR\nCOWARDS.", - "HEY!\n\nLISTEN!", + "Red mail\nis for\ncowards.", + "Hey!\n\nListen!", "Well\nexcuuuuuse me,\nprincess!", "5,000 Rupee\nreward for >\nYou're boned.", "Welcome to\nStoops Lonk's\nHoose", @@ -230,97 +230,92 @@ Ganon1_texts = [ ] Ganon_Phase_3_No_Silvers_texts = [ - "Did you find\nthe arrows on\nPlanet Zebes?", + "Did you find\nthe arrows\non Planet Zebes?", "Did you find\nthe arrows?\nI think not.", - "Silver arrows?\nI have never\nheard of them", + "Silver arrows?\nI have never\nheard of them.", "Did you find\nthe arrows on\nThe Moon?", - "Did you find\nthe arrows\nIn dev null?", - "I have sold\nthe arrows for\na green big 20", + "Did you find\nthe arrows\nin /dev/null?", + "I have sold\nthe arrows for\na green big 20.", "Did you find\nthe arrows in\nCount Dracula?", - "Error 404\nSilver arrows\nnot found.", - "No arrows for\nyou today.\nSorry.", + " Error 404\nSilver Arrows\n Not Found", + "No arrows\nfor you today.\nSorry.", "No arrows?\nCheck your\njunk mail." - "Did you find\nthe arrows in\nJabu's belly?", - "Silver is not\nan appropriate\narrow material", - "Did you find\nthe arrows in\nNarnia?", - "DID YOU FIND\nTHE ARROWS IN\nKEFKA'S TOWER", - "Did you find\nthe arrows in\nyour Recycle Bin?", + "Did you find\nthe arrows\nin Jabu's belly?", + "Silver is not\nan appropriate\narrow material.", + "Did you find\nthe arrows\nin nNarnia?", + "Did you find\nthe arrows\nin nKefka's Tower.", + "Did you find\nthe arrows\nin nyour Recycle Bin?", "Silver Arrows?\n\nLUL", - "Imagine\nfinding the\narrows", - "Did you find\nsilvers in\nscenic Ohio?", - "Did you find\nthe arrows in\n*mumblemumble*", - "Did you find\nthe arrows in\nthe hourglass?", - "Silver Arrows\nare so v30", - "OH, NO, THEY\nACTUALLY SAID\nSILVER MARROW", - "SURELY THE\nLEFTMOST TILES\nWILL STAY UP", - "Did you find\nthe arrows in\nWorld 4-2?", - "SILLY HERO,\nSILVER IS FOR\nWEREWOLVES!", - "Did you find\nthe silvers in\nGanti's ears", + "\nImagine finding\nthe arrows.", + "Did you find\nthe arrows\nin scenic Ohio?", + "Did you find\nthe arrows\nin •mumblemumble•", + "Did you find\nthe arrows\nin the hourglass?", + "\nSilver Arrows\nare so main branch.", + "Did you find\nthe arrows\nin World 4-2?", + "Did you find\nthe arrows\nin Ghanti's ears?", ] Ganon_Phase_3_No_Weakness_texts = [ - "Error 404\nWeakness\nnot found.", - "No weakness\nfor you today.\nSorry", - "Careful, all\nthat spinning\nmakes me dizzy", - "Are you ready\nTo spin\nTo win?", - "\nSpin To Win!\n", - "SURELY THE\nLEFTMOST TILES\nWILL STAY UP", - "You Spin Me\nRight Round\nLike A Record", - "SILLY HERO,\nSILVER IS FOR\nWEREWOLVES!", + "\n Error 404\nWeakness Not Found", + "No weakness\nfor you today.\nSorry.", + "Careful, all\nthat spinning\nmakes me dizzy.", + "Are you ready\nto spin\nto win?", + "\n Spin To Win!\n", + "Surely the\nleftmost tiles\nwill stay up!", + "You spin me\nright round\nlike a record.", + "Oh, no, they\nactually said\nsilver •marrow•.", + "Silly hero,\nsilver is for\nwerewolves!", ] TavernMan_texts = [ - "What do you\ncall a blind\ndinosaur?\na doyouthink-\nhesaurus.", - "A blind man\nwalks into\na bar.\nAnd a table.\nAnd a chair.", - "What do ducks\nlike to eat?\n\nQuackers!", - "How do you\nset up a party\nin space?\n\nYou planet!", - "I'm glad I\nknow sign\nlanguage.\nIt's pretty\nhandy.", - "What did Zelda\nsay to Link at\na secure door?\n\nTRIFORCE!", - "I am on a\nseafood diet.\n\nEvery time\nI see food,\nI eat it.", - "I've decided\nto sell my\nvacuum.\nIt was just\ngathering\ndust.", - "What's the best\ntime to go to\nthe dentist?\n\nTooth-hurtie!", - "Why can't a\nbike stand on\nits own?\n\nIt's two-tired!", - "If you haven't\nfound Quake\nyet…\nit's not your\nfault.", - "Why is Peter\nPan always\nflying?\nBecause he\nNeverlands!", - "I once told a\njoke to Armos.\n\nBut he\nremained\nstone-faced!", - "Lanmola was\nlate to our\ndinner party.\nHe just came\nfor the desert", - "Moldorm is\nsuch a\nprankster.\nAnd I fall for\nit every time!", - "Helmasaur is\nthrowing a\nparty.\nI hope it's\na masquerade!", - "I'd like to\nknow Arrghus\nbetter.\nBut he won't\ncome out of\nhis shell!", - "Mothula didn't\nhave much fun\nat the party.\nHe's immune to\nspiked punch!", - "Don't set me\nup with that\nchick from\nSteve's Town.\n\n\nI'm not\ninterested in\na Blind date!", - "Kholdstare is\nafraid to go\nto the circus.\nHungry kids\nthought he was\ncotton candy!", - "I asked who\nVitreous' best\nfriends are.\nHe said,\n'Me, Myself,\nand Eye!'", - "Trinexx can be\na hothead or\nhe can be an\nice guy. In\nthe end, he's\na solid\nindividual!", - "Bari thought I\nhad moved out\nof town.\nHe was shocked\nto see me!", - "I can only get\nWeetabix\naround here.\nI have to go\nto Steve's\nTown for Count\nChocula!", - "Don't argue\nwith a frozen\nDeadrock.\nHe'll never\nchange his\nposition!", - "I offered a\ndrink to a\nself-loathing\nGhini.\nHe said he\ndidn't like\nspirits!", - "I was supposed\nto meet Gibdo\nfor lunch.\nBut he got\nwrapped up in\nsomething!", - "Goriya sure\nhas changed\nin this game.\nI hope he\ncomes back\naround!", - "Hinox actually\nwants to be a\nlawyer.\nToo bad he\nbombed the\nBar exam!", - "I'm surprised\nMoblin's tusks\nare so gross.\nHe always has\nhis Trident\nwith him!", - "Don't tell\nStalfos I'm\nhere.\nHe has a bone\nto pick with\nme!", - "I got\nWallmaster to\nhelp me move\nfurniture.\nHe was really\nhandy!", - "Wizzrobe was\njust here.\nHe always\nvanishes right\nbefore we get\nthe check!", - "I shouldn't\nhave picked up\nZora's tab.\nThat guy\ndrinks like\na fish!", - "I was sharing\na drink with\nPoe.\nFor no reason,\nhe left in a\nheartbeat!", - "Don't trust\nhorsemen on\nDeath Mountain.\nThey're Lynel\nthe time!", - "Today's\nspecial is\nbattered bat.\nGot slapped\nfor offering a\nlady a Keese!", - "Don't walk\nunder\npropellered\npineapples.\nYou may end up\nwearing\na pee hat!", - "My girlfriend\nburrowed under\nthe sand.\nSo I decided\nto Leever!", - "Geldman wants\nto be a\nBroadway star.\nHe's always\npracticing\nJazz Hands!", - "Octoballoon\nmust be mad\nat me.\nHe blows up\nat the sight\nof me!", - "Toppo is a\ntotal pothead.\n\nHe hates it\nwhen you take\naway his grass", - "I lost my\nshield by\nthat house.\nWhy did they\nput up a\nPikit fence?!", - "Know that fox\nin Steve's\nTown?\nHe'll Pikku\npockets if you\naren't careful", - "Dash through\nDark World\nbushes.\nYou'll see\nGanon is tryin\nto Stal you!", - "Eyegore!\n\nYou gore!\nWe all gore\nthose jerks\nwith arrows!", - "I like my\nwhiskey neat.\n\nSome prefer it\nOctoroks!", - "I consoled\nFreezor over a\ncup of coffee.\nHis problems\njust seemed to\nmelt away!", - "Magic droplets\nof water don't\nshut up.\nThey just\nKyameron!", - "I bought hot\nwings for\nSluggula.\nThey gave him\nexplosive\ndiarrhea!", - "Hardhat Beetle\nwon't\nLet It Be?\nTell it to Get\nBack or give\nit a Ticket to\nRide down\na hole!", + "What do you call a blind dinosaur?\n\nA doyouthink-\nhesaurus.", + "What do ducks like to eat?\n\nQuackers!", + "How do you set up a party in space?\n\nYou planet!", + "I'm glad I know sign language.\nIt's pretty handy.", + "What did Zelda say to Link at a secure door?\n\nTriforce!", + "I am on a seafood diet.\n\nEvery time I see food, I eat it.", + "I've decided to sell my vacuum.\n\nIt was just gathering dust.", + "What's the best time to go to the dentist?\n\nTooth-hurtie!", + "Why can't a bike stand on its own?\n\nIt's two-tired!", + "If you haven't found Quake yet…\n\nit's not your fault.", + "Why is Peter Pan always flying?\n\nBecause he Neverlands!", + "I once told a joke to Armos.\n\nBut he remained stone-faced!", + "Lanmola was late to our dinner party.\n\nHe just came for the desert", + "Moldorm is such a prankster.\n\nAnd I fall for it every time!", + "Helmasaur is throwing a party.\n\nI hope it's a masquerade!", + "I'd like to know Arrghus better.\n\nBut he won't come out of his shell!", + "Mothula didn't have much fun at the party.\n\nHe's immune to spiked punch!", + "Kholdstare is afraid to go to the circus.\n\nHungry kids thought he was cotton candy!", + "I asked who Vitreous' best friends are.\n\nHe said, \"Me, Myself, and Eye!\"", + "Trinexx can be a hothead or he can be an ice guy. In the end, he's a solid individual!", + "Bari thought I had moved out of town.\n\nHe was shocked to see me!", + "Don't argue with a frozen Deadrock.\n\nHe'll never change his position!", + "I offered a drink to a self-loathing Ghini.\n\nHe said he didn't like spirits!", + "I was supposed to meet Gibdo for lunch.\n\nBut he got wrapped up in something!", + "Goriya sure has changed in this game.\n\nI hope he comes back around!", + "Hinox actually wants to be a lawyer.\n\nToo bad he bombed the bar exam!", + "I'm surprised Moblin's tusks are so gross.\n\nHe always has his Trident with him!", + "Don't tell Stalfos I'm here.\n\nHe has a bone to pick with me!", + "I got Wallmaster to help me move furniture.\n\nHe was really handy!", + "Wizzrobe was just here.\n\nHe always vanishes right before we get the check!", + "I shouldn't have picked up Zora's tab.\n\nThat guy drinks like a fish!", + "I was sharing a drink with Poe.\n\nFor no reason, he left in a heartbeat!", + "Don't trust horsemen on Death Mountain.\n\nThey're Lynel the time!", + "Today's special is battered bat.\n\nGot slapped for offering a lady a Keese!", + "Don't walk under propellered pineapples.\n\nYou may end up wearing a pee hat!", + "My girlfriend burrowed under the sand.\n\nSo I decided to Leever!", + "Geldman wants to be a Broadway star.\n\nHe's always practicing Jazz Hands!", + "Octoballoon must be mad at me.\n\nHe blows up at the sight of me!", + "Toppo is a total pothead.\n\nHe hates it when you take away his grass", + "I lost my shield by that house.\n\nWhy did they put up a Pikit fence?!", + "Know that fox in Steve's Town?\n\nHe'll Pikku pockets if you aren't careful", + "Dash through Dark World bushes.\n\nYou'll see Ganon is tryin to Stal you!", + "Eyegore!\n\nYou gore!\n\nWe all gore those jerks with arrows!", + "I like my whiskey neat.\n\nSome prefer it Octoroks!", + "I consoled Freezor over a cup of coffee.\n\nHis problems just seemed to melt away!", + "Magic droplets of water don't shut up.\n\nThey just Kyameron!", + "I bought hot wings for Sluggula.\n\nThey gave him explosive diarrhea!", + "Hardhat Beatle won't Let It Be?\n\nTell it to Get Back or give it a Ticket to Ride down a hole!", ] junk_texts = [ @@ -349,16 +344,15 @@ junk_texts = [ ] KingsReturn_texts = [ - 'Who is this even', + "Who is this even", 'When did he get here', - 'The Harem' ] * 2 + [ - "the return of the king", - "fellowship of the ring", - "the two towers", + "The Return of the King", + "Fellowship of the Ring", + "The Two Towers", ] Sanctuary_texts = [ - 'A Priest\'s love' + "a priest's love" ] * 2 + [ "the loyal priest", "read a book", @@ -488,7 +482,7 @@ class Credits(object): ], 'pedestal': [ SceneSmallCreditLine(19, 'and the master sword'), - SceneSmallAltCreditLine(21, 'sleeps again···'), + SceneSmallAltCreditLine(21, 'sleeps again…'), SceneLargeCreditLine(23, 'Forever!'), ], } @@ -832,6 +826,8 @@ class CharTextMapper(object): class RawMBTextMapper(CharTextMapper): char_map = {' ': 0xFF, + '/': 0x97, + '•': 0x98, '≥': 0x99, # Cursor '『': 0xC4, '』': 0xC5, @@ -1315,7 +1311,8 @@ class GoldCreditMapper(CharTextMapper): class GreenCreditMapper(CharTextMapper): char_map = {' ': 0x9F, - '.': 0x52, + '…': 0xFD, + '.': 0xFE, '·': 0x52} alpha_offset = -0x29 alpha_lower_offset = -0x29 @@ -2057,5 +2054,6 @@ class TextTable(object): text['ganon_phase_3_silvers'] = CompressedTextMapper.convert("Oh no! Silver! My one true weakness!") text['murahdahla'] = CompressedTextMapper.convert("Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! You can see me? I knew I should have\nhidden in a hollow tree.") text['mastersword_pedestal_goal'] = CompressedTextMapper.convert("To claim thy reward, you must present all 3 Pendants of Virtue.") - text['end_pad_data'] = bytearray([0xfb]) + text['orange_potion_refill'] = CompressedTextMapper.convert("This rare orange potion will give you infinite magic, but only until you die or quit the game.") + text['end_pad_data'] = bytearray([0xFB]) text['terminator'] = bytearray([0xFF, 0xFF]) diff --git a/data/base2current.bps b/data/base2current.bps index aeadbac3..77850823 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index 0918413b..ab174c5b 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -378,6 +378,10 @@ "none" ] }, + "require_ganon_item": { + "action": "store_true", + "type": "bool" + }, "beemizer": { "choices": [ "4", "3", "2", "1", "0" @@ -759,6 +763,10 @@ "type": "str", "help": "suppress" }, + "orange_potion": { + "action": "store_true", + "help": "suppress" + }, "settingsonload": { "choices": [ "default",