diff --git a/args/challenges.py b/args/challenges.py index 8ebbbc9f..9ed33bfa 100644 --- a/args/challenges.py +++ b/args/challenges.py @@ -17,6 +17,8 @@ def parse(parser): help = "Remove character/esper rewards from: Auction House, Collapsing House, Figaro Castle Throne, Gau's Father's House, Kohlingen Inn, Narshe Weapon Shop, Sealed Gate, South Figaro Basement") challenges.add_argument("-pd", "--permadeath", action = "store_true", help = "Life spells cannot be learned. Fenix Downs unavailable (except from starting items). Buckets/inns/tents/events do not revive characters. Phoenix casts Life 3 on party instead of Life") + challenges.add_argument("-np", "--no-peeking", action = "store_true", + help = "Sprites in peekable checks are left a mystery until reward.") def process(args): pass @@ -38,6 +40,8 @@ def flags(args): flags += " -nfce" if args.permadeath: flags += " -pd" + if args.no_peeking: + flags += " -np" return flags @@ -50,6 +54,7 @@ def options(args): ("No Free Paladin Shields", args.no_free_paladin_shields), ("No Free Characters/Espers", args.no_free_characters_espers), ("Permadeath", args.permadeath), + ("No Peeking", args.no_peeking) ] def menu(args): diff --git a/data/characters.py b/data/characters.py index 5476e9b3..26fc741f 100644 --- a/data/characters.py +++ b/data/characters.py @@ -192,3 +192,9 @@ def get_random_esper_item_sprite(self): def get_palette(self, character): return self.character_palettes.get(character) + + # Convenience methods for no peeking + def get_no_peeking_sprite(self): + return self.IMP + def get_no_peeking_name(self): + return "KAPPA" diff --git a/event/ancient_castle.py b/event/ancient_castle.py index 4bbdd997..ad66561f 100644 --- a/event/ancient_castle.py +++ b/event/ancient_castle.py @@ -20,6 +20,9 @@ def init_event_bits(self, space): ) def mod(self): + self.statue_npc_id = 0x11 + self.statue_npc = self.maps.get_npc(0x198, self.statue_npc_id) + self.dialog_mod() if self.reward.type == RewardType.CHARACTER: @@ -37,9 +40,9 @@ def dialog_mod(self): space = Reserve(0xc1f73, 0xc1f75, "ancient castle a tear comes from the stone", field.NOP()) def character_mod(self, character): - statue_npc_id = 0x11 - statue_npc = self.maps.get_npc(0x198, statue_npc_id) - statue_npc.sprite = character + self.statue_npc.sprite = character + if self.args.no_peeking: + self.statue_npc.sprite = self.characters.get_no_peeking_sprite() space = Reserve(0xc1f72, 0xc1f72, "ancient castle pause after tear", field.NOP()) @@ -47,8 +50,8 @@ def character_mod(self, character): # for command 0x61 some colors are # 00 = black, 01 = red, 02 = green, 03 = yellow, 04 = blue, 05 = purple, # # 06 = teal, 07 = gray, 08 = teal, 09 = blue/purple, 0a = darker yellow src = [ - field.SetPalette(statue_npc_id, self.characters.get_palette(character)), - field.EntityAct(statue_npc_id, True, + field.SetPalette(self.statue_npc_id, self.characters.get_palette(self.statue_npc.sprite)), + field.EntityAct(self.statue_npc_id, True, field_entity.AnimateKneeling(), field_entity.Pause(20), field_entity.AnimateStandingHeadDown(), @@ -71,8 +74,8 @@ def character_mod(self, character): field.WaitForFade(), field.ClearEventBit(npc_bit.MARIA_STATUE_ANCIENT_CASTLE), - field.HideEntity(statue_npc_id), - field.DeleteEntity(statue_npc_id), + field.HideEntity(self.statue_npc_id), + field.DeleteEntity(self.statue_npc_id), field.RecruitAndSelectParty(character), @@ -90,6 +93,9 @@ def character_mod(self, character): ) def esper_mod(self, esper): + if self.args.no_peeking: + self.statue_npc.sprite = self.characters.get_no_peeking_sprite() + space = Reserve(0xc1f7e, 0xc1f84, "ancient castle display receive raiden dialog and take odin", field.NOP()) space.write( field.Dialog(self.espers.get_receive_esper_dialog(esper)), @@ -97,6 +103,9 @@ def esper_mod(self, esper): ) def item_mod(self, item): + if self.args.no_peeking: + self.statue_npc.sprite = self.characters.get_no_peeking_sprite() + space = Reserve(0xc1f76, 0xc1f84, "ancient castle display receive raiden dialog and take odin", field.NOP()) space.write( field.Dialog(self.items.get_receive_dialog(item)), diff --git a/event/collapsing_house.py b/event/collapsing_house.py index 75cf0068..a68281ae 100644 --- a/event/collapsing_house.py +++ b/event/collapsing_house.py @@ -157,7 +157,9 @@ def character_mod(self, character): sabin_npc_id = 0x11 sabin_npc = self.maps.get_npc(0x131, sabin_npc_id) sabin_npc.sprite = character - sabin_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + sabin_npc.sprite = self.characters.get_no_peeking_sprite() + sabin_npc.palette = self.characters.get_palette(sabin_npc.sprite) space = Reserve(0xc5a9d, 0xc5aba, "collapsing house add char", field.NOP()) space.write( @@ -168,7 +170,11 @@ def esper_item_mod(self): sabin_npc_id = 0x11 sabin_npc = self.maps.get_npc(0x131, sabin_npc_id) - sabin_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + sabin_npc.sprite = self.characters.get_no_peeking_sprite() + else: + sabin_npc.sprite = self.characters.get_random_esper_item_sprite() + sabin_npc.palette = self.characters.get_palette(sabin_npc.sprite) # ovewrite adding sabin with fading out screen and updating event bits diff --git a/event/daryl_tomb.py b/event/daryl_tomb.py index ed25d979..2af01857 100644 --- a/event/daryl_tomb.py +++ b/event/daryl_tomb.py @@ -73,6 +73,9 @@ def dullahan_battle_mod(self): ) def daryl_sleeps_here_mod(self, new_name): + if self.args.no_peeking: + new_name = self.characters.get_no_peeking_name() + num_spaces = 15 - len(new_name) # try to center dialog daryl_sleeps_here_dialog_id = 2461 # previously 2464 diff --git a/event/doma_wor.py b/event/doma_wor.py index ac17ea41..fedf11dd 100644 --- a/event/doma_wor.py +++ b/event/doma_wor.py @@ -200,20 +200,24 @@ def wrexsoul_battle_mod(self): ) def cyan_character_mod(self, character): - self.cyan_phantom_train_npc.sprite = character - self.cyan_phantom_train_npc.palette = self.characters.get_palette(character) - self.cyan_mines_npc.sprite = character - self.cyan_mines_npc.palette = self.characters.get_palette(character) - self.cyan_outside_mines_npc.sprite = character - self.cyan_outside_mines_npc.palette = self.characters.get_palette(character) - self.cyan_fishing_npc.sprite = character - self.cyan_fishing_npc.palette = self.characters.get_palette(character) - self.cyan_training_npc.sprite = character - self.cyan_training_npc.palette = self.characters.get_palette(character) - self.cyan_bedroom_npc.sprite = character - self.cyan_bedroom_npc.palette = self.characters.get_palette(character) - self.cyan_throne_room_npc.sprite = character - self.cyan_throne_room_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + + self.cyan_phantom_train_npc.sprite = sprite + self.cyan_phantom_train_npc.palette = self.characters.get_palette(sprite) + self.cyan_mines_npc.sprite = sprite + self.cyan_mines_npc.palette = self.characters.get_palette(sprite) + self.cyan_outside_mines_npc.sprite = sprite + self.cyan_outside_mines_npc.palette = self.characters.get_palette(sprite) + self.cyan_fishing_npc.sprite = sprite + self.cyan_fishing_npc.palette = self.characters.get_palette(sprite) + self.cyan_training_npc.sprite = sprite + self.cyan_training_npc.palette = self.characters.get_palette(sprite) + self.cyan_bedroom_npc.sprite = sprite + self.cyan_bedroom_npc.palette = self.characters.get_palette(sprite) + self.cyan_throne_room_npc.sprite = sprite + self.cyan_throne_room_npc.palette = self.characters.get_palette(sprite) space = Reserve(0xb9818, 0xb982f, "doma wor split up party after wrexsoul battle", field.NOP()) space.write( @@ -228,7 +232,10 @@ def cyan_character_mod(self, character): ) def random_cyan_npc_mod(self): - sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + else: + sprite = self.characters.get_random_esper_item_sprite() palette = self.characters.get_palette(sprite) self.cyan_phantom_train_npc.sprite = sprite diff --git a/event/esper_mountain.py b/event/esper_mountain.py index 59c209e7..9587614d 100644 --- a/event/esper_mountain.py +++ b/event/esper_mountain.py @@ -138,17 +138,21 @@ def esper_event_mod(self): self.maps.delete_event(0x177, 15, 17) def character_mod(self, character): - self.entrance_relm_npc.sprite = character - self.entrance_relm_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() - self.outside1_relm_npc.sprite = character - self.outside1_relm_npc.palette = self.characters.get_palette(character) + self.entrance_relm_npc.sprite = sprite + self.entrance_relm_npc.palette = self.characters.get_palette(sprite) - self.outside2_relm_npc.sprite = character - self.outside2_relm_npc.palette = self.characters.get_palette(character) + self.outside1_relm_npc.sprite = sprite + self.outside1_relm_npc.palette = self.characters.get_palette(sprite) - self.statue_room_relm_npc.sprite = character - self.statue_room_relm_npc.palette = self.characters.get_palette(character) + self.outside2_relm_npc.sprite = sprite + self.outside2_relm_npc.palette = self.characters.get_palette(sprite) + + self.statue_room_relm_npc.sprite = sprite + self.statue_room_relm_npc.palette = self.characters.get_palette(sprite) space = Reserve(0xbf0d9, 0xbf167, "esper mountain finish ultros scene", field.NOP()) space.write( @@ -161,7 +165,10 @@ def character_mod(self, character): ) def relm_npc_mod(self): - random_sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + random_sprite = self.characters.get_no_peeking_sprite() + else: + random_sprite = self.characters.get_random_esper_item_sprite() self.entrance_relm_npc.sprite = random_sprite self.entrance_relm_npc.palette = self.characters.get_palette(random_sprite) diff --git a/event/fanatics_tower.py b/event/fanatics_tower.py index 68089485..14cda4e7 100644 --- a/event/fanatics_tower.py +++ b/event/fanatics_tower.py @@ -137,8 +137,12 @@ def magimaster_battle_mod(self): ) def character_mod(self, character): - self.strago_npc.sprite = character - self.strago_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + + self.strago_npc.sprite = sprite + self.strago_npc.palette = self.characters.get_palette(sprite) space = Reserve(0xc540d, 0xc542a, "fanatics tower add character", field.NOP()) space.write( @@ -146,7 +150,10 @@ def character_mod(self, character): ) def esper_item_mod(self, esper_item_instructions): - self.strago_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.strago_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.strago_npc.sprite = self.characters.get_random_esper_item_sprite() self.strago_npc.palette = self.characters.get_palette(self.strago_npc.sprite) space = Reserve(0xc5409, 0xc542a, "fanatics tower esper/item reward", field.NOP()) diff --git a/event/figaro_castle_wob.py b/event/figaro_castle_wob.py index 9b151f56..9bbbf644 100644 --- a/event/figaro_castle_wob.py +++ b/event/figaro_castle_wob.py @@ -56,7 +56,9 @@ def guard_mod(self): def character_mod(self, character): self.edgar_npc.sprite = character - self.edgar_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.edgar_npc.sprite = self.characters.get_no_peeking_sprite() + self.edgar_npc.palette = self.characters.get_palette(self.edgar_npc.sprite) src = [ field.SetEventBit(event_bit.NAMED_EDGAR), @@ -77,7 +79,10 @@ def character_mod(self, character): ) def esper_item_mod(self, esper_item_instructions): - self.edgar_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.edgar_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.edgar_npc.sprite = self.characters.get_random_esper_item_sprite() self.edgar_npc.palette = self.characters.get_palette(self.edgar_npc.sprite) src = [ diff --git a/event/figaro_castle_wor.py b/event/figaro_castle_wor.py index b0beeefb..1f54c9aa 100644 --- a/event/figaro_castle_wor.py +++ b/event/figaro_castle_wor.py @@ -102,10 +102,14 @@ def tentacles_battle_mod(self): ) def character_mod(self, character): - self.gerad_figaro_cave_npc.sprite = character - self.gerad_figaro_cave_npc.palette = self.characters.get_palette(character) - self.gerad_engine_room_npc.sprite = character - self.gerad_engine_room_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + + self.gerad_figaro_cave_npc.sprite = sprite + self.gerad_figaro_cave_npc.palette = self.characters.get_palette(sprite) + self.gerad_engine_room_npc.sprite = sprite + self.gerad_engine_room_npc.palette = self.characters.get_palette(sprite) space = Reserve(0xa6aed, 0xa6bdb, "figaro castle wor scenes after tentacles", field.NOP()) space.write( @@ -119,7 +123,11 @@ def character_mod(self, character): ) def gerad_npc_mod(self): - random_sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + random_sprite = self.characters.get_no_peeking_sprite() + else: + random_sprite = self.characters.get_random_esper_item_sprite() + self.gerad_figaro_cave_npc.sprite = random_sprite self.gerad_figaro_cave_npc.palette = self.characters.get_palette(random_sprite) self.gerad_engine_room_npc.sprite = random_sprite diff --git a/event/gau_father_house.py b/event/gau_father_house.py index f1bb4ea6..59d8ee9c 100644 --- a/event/gau_father_house.py +++ b/event/gau_father_house.py @@ -59,8 +59,11 @@ def entrance_event_mod(self): ) def character_mod(self, character): - self.shadow_npc.sprite = character - self.shadow_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + self.shadow_npc.sprite = sprite + self.shadow_npc.palette = self.characters.get_palette(sprite) space = Reserve(0xb0a5f, 0xb0aed, "gau father house wob recruit shadow", field.NOP()) space.write( @@ -69,7 +72,10 @@ def character_mod(self, character): ) def esper_item_mod(self, esper_item_instructions): - self.shadow_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.shadow_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.shadow_npc.sprite = self.characters.get_random_esper_item_sprite() self.shadow_npc.palette = self.characters.get_palette(self.shadow_npc.sprite) space = Reserve(0xb0a5f, 0xb0af9, "gau father house wob esper item reward", field.NOP()) diff --git a/event/imperial_camp.py b/event/imperial_camp.py index 8699478f..85f8bd38 100644 --- a/event/imperial_camp.py +++ b/event/imperial_camp.py @@ -127,6 +127,10 @@ def leo_and_chasing_kefka_mod(self): space.write(field_entity.SetSpeed(field_entity.Speed.FAST)) def cyan_battles_mod(self, sprite, palette): + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + palette = self.characters.get_palette(sprite) + cyan_npc_id = 0x12 cyan_npc = self.maps.get_npc(0x077, cyan_npc_id) cyan_npc.sprite = sprite diff --git a/event/kohlingen.py b/event/kohlingen.py index 0c366e32..09897141 100644 --- a/event/kohlingen.py +++ b/event/kohlingen.py @@ -85,7 +85,9 @@ def inn_sleep_mod(self): def character_mod(self, character): self.shadow_npc.sprite = character - self.shadow_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.shadow_npc.sprite = self.characters.get_no_peeking_sprite() + self.shadow_npc.palette = self.characters.get_palette(self.shadow_npc.sprite) space = Reserve(0xc6f84, 0xc6f8b, "kohlingen talk to shadow", field.NOP()) space.add_label("RECEIVE_REWARD", 0xc704f) @@ -101,7 +103,10 @@ def character_mod(self, character): ) def esper_item_mod(self, esper_item_instructions): - self.shadow_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.shadow_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.shadow_npc.sprite = self.characters.get_random_esper_item_sprite() self.shadow_npc.palette = self.characters.get_palette(self.shadow_npc.sprite) space = Reserve(0xc6f84, 0xc6f8b, "kohlingen talk to shadow", field.NOP()) diff --git a/event/lone_wolf.py b/event/lone_wolf.py index ce93f05b..11b22f9b 100644 --- a/event/lone_wolf.py +++ b/event/lone_wolf.py @@ -72,7 +72,9 @@ def chase_mod(self): def character_mod(self, character): self.mog_npc.sprite = character - self.mog_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.mog_npc.sprite = self.characters.get_no_peeking_sprite() + self.mog_npc.palette = self.characters.get_palette(self.mog_npc.sprite) space = Reserve(0xcd5e5, 0xcd5f3, "lone wolf create char and make available", field.NOP()) space.write( @@ -103,6 +105,12 @@ def character_mod(self, character): ) def esper_item_mod(self, add_esper_item, sound_dialog_esper_item): + if self.args.no_peeking: + self.mog_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.mog_npc.sprite = self.characters.get_random_esper_item_sprite() + self.mog_npc.palette = self.characters.get_palette(self.mog_npc.sprite) + space = Reserve(0xcd5df, 0xcd5f3, "lone wolf assign character properties", field.NOP()) space = Reserve(0xcd693, 0xcd695, "char chosen dialog before lone wolf falls", field.NOP()) @@ -119,9 +127,6 @@ def esper_item_mod(self, add_esper_item, sound_dialog_esper_item): ) def esper_mod(self, esper): - self.mog_npc.sprite = self.characters.get_random_esper_item_sprite() - self.mog_npc.palette = self.characters.get_palette(self.mog_npc.sprite) - self.esper_item_mod([ field.AddEsper(esper, sound_effect = False), ], @@ -131,9 +136,6 @@ def esper_mod(self, esper): ]) def item_mod(self, item): - self.mog_npc.sprite = self.characters.get_random_esper_item_sprite() - self.mog_npc.palette = self.characters.get_palette(self.mog_npc.sprite) - self.esper_item_mod([ field.AddItem(item, sound_effect = False), ], diff --git a/event/mobliz_wor.py b/event/mobliz_wor.py index d794ff8d..f90a5add 100644 --- a/event/mobliz_wor.py +++ b/event/mobliz_wor.py @@ -103,9 +103,15 @@ def terra_npc_mod(self, sprite, palette): self.terra_with_katarin_npc.palette = palette def character_mod(self, character): - self.terra_npc_mod(character, self.characters.get_palette(character)) - - char_default_name = self.characters.get_default_name(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + self.terra_npc_mod(sprite, self.characters.get_palette(sprite)) + + if self.args.no_peeking: + char_default_name = self.characters.get_no_peeking_name() + else: + char_default_name = self.characters.get_default_name(character) self.dialogs.set_text(2307, "You're not gonna take <" + char_default_name + "> away, are you?") self.dialogs.set_text(2315, "I'm not gonna cry.If I do, <" + char_default_name + ">'ll feel sad…") @@ -138,7 +144,11 @@ def character_mod(self, character): ) def esper_item_mod(self, esper_item_name, esper_item_instructions): - random_sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + random_sprite = self.characters.get_no_peeking_sprite() + esper_item_name = self.characters.get_no_peeking_name() + else: + random_sprite = self.characters.get_random_esper_item_sprite() self.terra_npc_mod(random_sprite, self.characters.get_palette(random_sprite)) # change children's dialog to replace terra's name with the esper/item name for fun diff --git a/event/mt_kolts.py b/event/mt_kolts.py index cbaff87d..d51e8c74 100644 --- a/event/mt_kolts.py +++ b/event/mt_kolts.py @@ -18,7 +18,6 @@ def mod(self): if self.args.character_gating: self.add_gating_condition() - self.shadow_vargas_mod() self.vargas_battle_mod() self.entrance_exit_mod() @@ -48,12 +47,17 @@ def add_gating_condition(self): field.Branch(vargas_appears), ) - def shadow_vargas_mod(self): - # shadowy vargas uses sabin's sprite with an all black palette + def shadow_vargas_mod(self, sprite): + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + + # change shadowy vargas to use the given sprite rather than uses sabin's sprite # character npc palettes are updated to match the character in npc data, change vargas back to black palette vargas_shadow_npc1 = self.maps.get_npc(0x060, self.vargas_npc_id) + vargas_shadow_npc1.sprite = sprite vargas_shadow_npc1.palette = 0x06 vargas_shadow_npc2 = self.maps.get_npc(0x061, self.vargas_npc_id) + vargas_shadow_npc2.sprite = sprite vargas_shadow_npc2.palette = 0x06 def vargas_battle_mod(self): @@ -140,6 +144,9 @@ def entrance_exit_mod(self): self.maps.add_event(0x64, new_event) def character_mod(self, character): + # Change shadow to peek the character + self.shadow_vargas_mod(character) + boss_pack_id = self.get_boss("Vargas") space = Reserve(0xa82a3, 0xa831f, "mt kolts invoke vargas battle", field.NOP()) @@ -255,6 +262,9 @@ def character_mod(self, character): space = Reserve(0xa83a0, 0xa83a2, "mt kolts Bodybuilder?!", field.NOP()) def esper_item_mod(self, esper_item_instructions): + # Change shadow to peek that it's a esper/item + self.shadow_vargas_mod(self.characters.get_random_esper_item_sprite()) + boss_pack_id = self.get_boss("Vargas") # scene with vargas and sabin diff --git a/event/mt_zozo.py b/event/mt_zozo.py index fdbdc6fb..4aed8fdc 100644 --- a/event/mt_zozo.py +++ b/event/mt_zozo.py @@ -111,6 +111,8 @@ def letter_mod(self, char_name = ""): letter_text = "Dear Lola,I am writing to beg for your forgiveness. I am guilty of perpetuating a terrible lie…I have only now realized the error of my ways. I hope I can correct a great wrong.Your boyfriend, who you thought was in Mobliz, passed away some time ago. I have been writing in his stead…We humans tend to allow the past to destroy our lives.I implore you not to let this happen.It is time to look forward, to rediscover love, and embrace the beauty of life.You have so much of life left to live…" if char_name != "": letter_text += "< ><" + char_name + ">" + else: + letter_text += "" self.dialogs.set_text(2568, letter_text) def character_mod(self, character): diff --git a/event/narshe_battle.py b/event/narshe_battle.py index 59777176..23eb79e3 100644 --- a/event/narshe_battle.py +++ b/event/narshe_battle.py @@ -229,17 +229,23 @@ def end_event_mod(self, reward_instructions): ) def character_mod(self, character): - self.banon_before_battle_npc.sprite = character - self.banon_before_battle_npc.palette = self.characters.get_palette(character) - self.banon_during_battle_npc.sprite = character - self.banon_during_battle_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + self.banon_before_battle_npc.sprite = sprite + self.banon_before_battle_npc.palette = self.characters.get_palette(sprite) + self.banon_during_battle_npc.sprite = sprite + self.banon_during_battle_npc.palette = self.characters.get_palette(sprite) self.end_event_mod([ field.RecruitCharacter(character), ]) def esper_item_mod(self, esper_item_instructions): - random_sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + random_sprite = self.characters.get_no_peeking_sprite() + else: + random_sprite = self.characters.get_random_esper_item_sprite() self.banon_before_battle_npc.sprite = random_sprite self.banon_before_battle_npc.palette = self.characters.get_palette(self.banon_before_battle_npc.sprite) self.banon_during_battle_npc.sprite = random_sprite diff --git a/event/owzer_mansion.py b/event/owzer_mansion.py index c0e53dec..3ca95b74 100644 --- a/event/owzer_mansion.py +++ b/event/owzer_mansion.py @@ -111,7 +111,9 @@ def chadarnook_battle_mod(self): def character_mod(self, character): self.relm_npc.sprite = character - self.relm_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.relm_npc.sprite = self.characters.get_no_peeking_sprite() + self.relm_npc.palette = self.characters.get_palette(self.relm_npc.sprite) space = Reserve(0xb4de1, 0xb4de7, "owzer mansion get startlet esper", field.NOP()) @@ -121,7 +123,10 @@ def character_mod(self, character): ) def esper_mod(self, esper): - self.relm_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.relm_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.relm_npc.sprite = self.characters.get_random_esper_item_sprite() self.relm_npc.palette = self.characters.get_palette(self.relm_npc.sprite) space = Reserve(0xb4de3, 0xb4de7, "owzer mansion get esper", field.NOP()) @@ -133,7 +138,10 @@ def esper_mod(self, esper): space = Reserve(0xb4dfd, 0xb4e1c, "owzer mansion add relm", field.NOP()) def item_mod(self, item): - self.relm_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.relm_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.relm_npc.sprite = self.characters.get_random_esper_item_sprite() self.relm_npc.palette = self.characters.get_palette(self.relm_npc.sprite) space = Reserve(0xb4de3, 0xb4de7, "owzer mansion get item", field.NOP()) diff --git a/event/phantom_train.py b/event/phantom_train.py index 1ddf3425..654b590b 100644 --- a/event/phantom_train.py +++ b/event/phantom_train.py @@ -17,6 +17,9 @@ def init_event_bits(self, space): ) def mod(self): + self.ghost_npc_id = 0x10 + self.ghost_npc = self.maps.get_npc(0x98, self.ghost_npc_id) + self._load_world_map() self.forest_spring_mod() self.ghost_shop_forest_mod() @@ -76,12 +79,14 @@ def _load_world_map(self): self.load_world_map = space.start_address def esper_item_mod(self, esper_item_instructions): - ghost_npc_id = 0x10 + if self.args.no_peeking: + self.ghost_npc.sprite = self.characters.get_no_peeking_sprite() + self.ghost_npc.palette = self.characters.get_palette(self.ghost_npc.sprite) src = [ esper_item_instructions, - field.HideEntity(ghost_npc_id), + field.HideEntity(self.ghost_npc_id), field.SetEventBit(event_bit.GOT_PHANTOM_TRAIN_REWARD), field.FinishCheck(), field.Return(), @@ -99,7 +104,7 @@ def esper_item_mod(self, esper_item_instructions): inside_last_car_entrance_event = space.next_address space.write( field.ReturnIfEventBitClear(event_bit.GOT_PHANTOM_TRAIN_REWARD), - field.HideEntity(ghost_npc_id), + field.HideEntity(self.ghost_npc_id), field.Return(), ) self.maps.set_entrance_event(0x98, inside_last_car_entrance_event - EVENT_CODE_START) @@ -117,17 +122,17 @@ def item_mod(self, item): ]) def character_mod(self, character): - ghost_npc_id = 0x10 - ghost_npc = self.maps.get_npc(0x98, ghost_npc_id) - ghost_npc.sprite = character - ghost_npc.palette = self.characters.get_palette(character) + self.ghost_npc.sprite = character + if self.args.no_peeking: + self.ghost_npc.sprite = self.characters.get_no_peeking_sprite() + self.ghost_npc.palette = self.characters.get_palette(self.ghost_npc.sprite) self.dialogs.set_text(716, "Bring it along?(Sure)(No way)") space = Reserve(0xbaca0, 0xbacce, "phantom train add character", field.NOP()) space.write( field.RecruitAndSelectParty(character), - field.HideEntity(ghost_npc_id), + field.HideEntity(self.ghost_npc_id), field.SetEventBit(event_bit.GOT_PHANTOM_TRAIN_REWARD), field.FadeInScreen(), field.FinishCheck(), @@ -138,7 +143,7 @@ def character_mod(self, character): inside_last_car_entrance_event = space.next_address space.write( field.ReturnIfEventBitClear(event_bit.character_available(character)), - field.HideEntity(ghost_npc_id), + field.HideEntity(self.ghost_npc_id), field.Return(), ) self.maps.set_entrance_event(0x98, inside_last_car_entrance_event - EVENT_CODE_START) diff --git a/event/south_figaro.py b/event/south_figaro.py index 25dcb3f8..4ced7ba2 100644 --- a/event/south_figaro.py +++ b/event/south_figaro.py @@ -64,7 +64,9 @@ def entrance_event_mod(self): def character_mod(self, character): self.celes_npc.sprite = character - self.celes_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.celes_npc.sprite = self.characters.get_no_peeking_sprite() + self.celes_npc.palette = self.characters.get_palette(self.celes_npc.sprite) src = [ field.RecruitAndSelectParty(character), @@ -87,7 +89,10 @@ def character_mod(self, character): self.celes_npc.set_event_address(celes_npc_event) def esper_item_mod(self, esper_item_instructions): - self.celes_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.celes_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.celes_npc.sprite = self.characters.get_random_esper_item_sprite() self.celes_npc.palette = self.characters.get_palette(self.celes_npc.sprite) src = [ diff --git a/event/tzen.py b/event/tzen.py index 6e2434cc..af8e1da9 100644 --- a/event/tzen.py +++ b/event/tzen.py @@ -17,6 +17,9 @@ def mod(self): self.wob_price = randint(1, field.RemoveGP.MAX) self.wor_price = randint(1, field.RemoveGP.MAX) + no_peek_name = self.characters.get_no_peeking_name() + self.no_peek_wob_dialog = f"For {self.wob_price} GP {no_peek_name} is yours. Yes No" + if self.reward.type == RewardType.ESPER: self.esper_mod(self.reward.id) elif self.reward.type == RewardType.ITEM: @@ -62,14 +65,20 @@ def esper_item_mod(self, wob_dialog, reward_instructions): ) def esper_mod(self, esper): - wob_dialog = f"For {self.wob_price} GP this glowing stone\'s yours. Yes No" + if self.args.no_peeking: + wob_dialog = self.no_peek_wob_dialog + else: + wob_dialog = f"For {self.wob_price} GP this glowing stone\'s yours. Yes No" self.esper_item_mod(wob_dialog, [ field.AddEsper(esper), field.Dialog(self.espers.get_receive_esper_dialog(esper)), ]) def item_mod(self, item): - wob_dialog = f"For {self.wob_price} GP this is yours. Yes No" + if self.args.no_peeking: + wob_dialog = self.no_peek_wob_dialog + else: + wob_dialog = f"For {self.wob_price} GP this is yours. Yes No" self.esper_item_mod(wob_dialog, [ field.AddItem(item), field.Dialog(self.items.get_receive_dialog(item)), diff --git a/event/umaro_cave.py b/event/umaro_cave.py index eafe827b..5bf13333 100644 --- a/event/umaro_cave.py +++ b/event/umaro_cave.py @@ -68,11 +68,14 @@ def umaro_battle_mod(self): ) def character_mod(self, character): - self.umaro_cave_npc.sprite = character - self.umaro_cave_npc.palette = self.characters.get_palette(character) - - self.umaro_wob_npc.sprite = character - self.umaro_wob_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + self.umaro_cave_npc.sprite = sprite + self.umaro_cave_npc.palette = self.characters.get_palette(sprite) + + self.umaro_wob_npc.sprite = sprite + self.umaro_wob_npc.palette = self.characters.get_palette(sprite) # TODO hide umaro in wob? (his npc bit is shared...) # change the entrance event to somewhere with more space where can check for umaro recruited? @@ -105,11 +108,16 @@ def character_mod(self, character): ) def esper_item_mod(self, add_instructions, dialog_instructions): - # remove umaro from wob - space = Reserve(0xc3871, 0xc388d, "narshe wob umaro appearance", field.NOP()) - space.write( - field.HideEntity(self.umaro_wob_npc_id), - ) + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + self.umaro_wob_npc.sprite = sprite + self.umaro_wob_npc.palette = self.characters.get_palette(sprite) + else: + # remove umaro from wob + space = Reserve(0xc3871, 0xc388d, "narshe wob umaro appearance", field.NOP()) + space.write( + field.HideEntity(self.umaro_wob_npc_id), + ) space = Reserve(0xcd731, 0xcd733, "narshe wor receive esper dialog bone carving", field.NOP()) space.write( diff --git a/event/veldt_cave_wor.py b/event/veldt_cave_wor.py index 369cdd22..6e69490c 100644 --- a/event/veldt_cave_wor.py +++ b/event/veldt_cave_wor.py @@ -113,10 +113,13 @@ def move_to_thamasa(self, reward_instructions): ) def character_mod(self, character): - self.shadow_npc.sprite = character - self.shadow_npc.palette = self.characters.get_palette(character) - self.relm_npc.sprite = character - self.relm_npc.palette = self.characters.get_palette(character) + sprite = character + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + self.shadow_npc.sprite = sprite + self.shadow_npc.palette = self.characters.get_palette(sprite) + self.relm_npc.sprite = sprite + self.relm_npc.palette = self.characters.get_palette(sprite) self.move_to_thamasa([ field.RecruitAndSelectParty(character), @@ -130,15 +133,22 @@ def esper_item_mod(self, esper_item_instructions): ]) def esper_mod(self, esper): - self.shadow_npc.sprite = 91 - self.shadow_npc.palette = 2 - self.shadow_npc.split_sprite = 1 - self.shadow_npc.direction = direction.UP - - self.relm_npc.sprite = 91 - self.relm_npc.palette = 2 - self.relm_npc.split_sprite = 1 - self.relm_npc.direction = direction.UP + sprite = 91 + palette = 2 + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + palette = self.characters.get_palette(sprite) + else: + self.shadow_npc.split_sprite = 1 + self.shadow_npc.direction = direction.UP + self.relm_npc.split_sprite = 1 + self.relm_npc.direction = direction.UP + + self.shadow_npc.sprite = sprite + self.shadow_npc.palette = palette + + self.relm_npc.sprite = sprite + self.relm_npc.palette = palette self.esper_item_mod([ field.AddEsper(esper), @@ -146,7 +156,10 @@ def esper_mod(self, esper): ]) def item_mod(self, item): - random_sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + random_sprite = self.characters.get_no_peeking_sprite() + else: + random_sprite = self.characters.get_random_esper_item_sprite() self.shadow_npc.sprite = random_sprite self.shadow_npc.palette = self.characters.get_palette(self.shadow_npc.sprite) diff --git a/event/whelk.py b/event/whelk.py index 91966d70..48ac14b0 100644 --- a/event/whelk.py +++ b/event/whelk.py @@ -82,6 +82,10 @@ def add_npc(self, sprite, palette): return self.maps.append_npc(0x2b, new_npc) def add_guard_npc(self, sprite = 52, palette = 0): + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + palette = self.characters.get_palette(sprite) + guard_npc_id = self.add_npc(sprite, palette) # change guard npc id to correct new npc id diff --git a/event/zone_eater.py b/event/zone_eater.py index fcb94b54..e47b5319 100644 --- a/event/zone_eater.py +++ b/event/zone_eater.py @@ -61,7 +61,9 @@ def add_gating_condition(self): def character_mod(self, character): self.gogo_npc.sprite = character - self.gogo_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.gogo_npc.sprite = self.characters.get_no_peeking_sprite() + self.gogo_npc.palette = self.characters.get_palette(self.gogo_npc.sprite) space = Reserve(0xb81ce, 0xb81ff, "zone eater recruit gogo", field.NOP()) space.write( @@ -88,10 +90,14 @@ def esper_item_mod(self, esper_item_instructions): ) def esper_mod(self, esper): - self.gogo_npc.sprite = 91 - self.gogo_npc.palette = 2 - self.gogo_npc.split_sprite = 1 - self.gogo_npc.direction = direction.UP + if self.args.no_peeking: + self.gogo_npc.sprite = self.characters.get_no_peeking_sprite() + self.gogo_npc.palette = self.characters.get_palette(self.gogo_npc.sprite) + else: + self.gogo_npc.sprite = 91 + self.gogo_npc.palette = 2 + self.gogo_npc.split_sprite = 1 + self.gogo_npc.direction = direction.UP self.esper_item_mod([ field.DisableEntityCollision(self.gogo_npc_id), @@ -106,7 +112,10 @@ def esper_mod(self, esper): ]) def item_mod(self, item): - self.gogo_npc.sprite = self.characters.get_random_esper_item_sprite() + if self.args.no_peeking: + self.gogo_npc.sprite = self.characters.get_no_peeking_sprite() + else: + self.gogo_npc.sprite = self.characters.get_random_esper_item_sprite() self.gogo_npc.palette = self.characters.get_palette(self.gogo_npc.sprite) self.esper_item_mod([ diff --git a/event/zozo.py b/event/zozo.py index 4937a024..5803f8f4 100644 --- a/event/zozo.py +++ b/event/zozo.py @@ -31,6 +31,7 @@ def mod(self): self.ramuh_npc_id = 0x11 self.ramuh_npc = self.maps.get_npc(0x0e2, self.ramuh_npc_id) self.ramuh_magicite_npc_id = 0x12 + self.ramuh_magicite_npc = self.maps.get_npc(0x0e2, self.ramuh_magicite_npc_id) if self.args.character_gating: self.add_gating_condition() @@ -77,7 +78,9 @@ def dadaluma_battle_mod(self): def character_mod(self, character): self.ramuh_npc.sprite = character - self.ramuh_npc.palette = self.characters.get_palette(character) + if self.args.no_peeking: + self.ramuh_npc.sprite = self.characters.get_no_peeking_sprite() + self.ramuh_npc.palette = self.characters.get_palette(self.ramuh_npc.sprite) src = [ field.SetEventBit(event_bit.GOT_ZOZO_REWARD), @@ -95,6 +98,16 @@ def character_mod(self, character): self.ramuh_npc.set_event_address(recruit_character) def esper_mod(self, esper): + if self.args.no_peeking: + sprite = self.characters.get_no_peeking_sprite() + palette = self.characters.get_palette(sprite) + self.ramuh_npc.sprite = sprite + self.ramuh_npc.palette = palette + self.ramuh_magicite_npc.sprite = sprite + self.ramuh_magicite_npc.palette = palette + self.ramuh_magicite_npc.direction = direction.DOWN + self.ramuh_magicite_npc.split_sprite = 0 + space = Reserve(0xaa7fd, 0xaa803, "receive ramuh esper dialog", field.NOP()) space = Reserve(0xaa808, 0xaa808, "zozo pause before receiving esper", field.NOP()) @@ -119,10 +132,14 @@ def esper_mod(self, esper): ) def item_mod(self, item): - self.ramuh_npc.sprite = 106 - self.ramuh_npc.palette = 6 - self.ramuh_npc.split_sprite = 1 - self.ramuh_npc.direction = direction.DOWN + if self.args.no_peeking: + self.ramuh_npc.sprite = self.characters.get_no_peeking_sprite() + self.ramuh_npc.palette = self.characters.get_palette(self.ramuh_npc.sprite) + else: + self.ramuh_npc.sprite = 106 + self.ramuh_npc.palette = 6 + self.ramuh_npc.split_sprite = 1 + self.ramuh_npc.direction = direction.DOWN src = [ field.AddItem(item),