Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions args/challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -38,6 +40,8 @@ def flags(args):
flags += " -nfce"
if args.permadeath:
flags += " -pd"
if args.no_peeking:
flags += " -np"

return flags

Expand All @@ -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):
Expand Down
6 changes: 6 additions & 0 deletions data/characters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
23 changes: 16 additions & 7 deletions event/ancient_castle.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -37,18 +40,18 @@ 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())

# NOTE: statue/character turned gray at 0xc19fd
# 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(),
Expand All @@ -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),

Expand All @@ -90,13 +93,19 @@ 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)),
field.AddEsper(esper, sound_effect = False),
)

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)),
Expand Down
10 changes: 8 additions & 2 deletions event/collapsing_house.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions event/daryl_tomb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 22 additions & 15 deletions event/doma_wor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand Down
25 changes: 16 additions & 9 deletions event/esper_mountain.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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)
Expand Down
13 changes: 10 additions & 3 deletions event/fanatics_tower.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,16 +137,23 @@ 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(
field.RecruitAndSelectParty(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())
Expand Down
9 changes: 7 additions & 2 deletions event/figaro_castle_wob.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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 = [
Expand Down
18 changes: 13 additions & 5 deletions event/figaro_castle_wor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand Down
12 changes: 9 additions & 3 deletions event/gau_father_house.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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())
Expand Down
4 changes: 4 additions & 0 deletions event/imperial_camp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 7 additions & 2 deletions event/kohlingen.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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())
Expand Down
Loading