| 
									
										
										
										
											2023-03-21 01:26:03 +09:00
										 |  |  | from .locations.items import * | 
					
						
							|  |  |  | from .utils import formatText | 
					
						
							| 
									
										
										
										
											2025-07-26 16:16:00 -04:00
										 |  |  | from BaseClasses import ItemClassification | 
					
						
							|  |  |  | from ..Locations import LinksAwakeningLocation | 
					
						
							| 
									
										
										
										
											2023-03-21 01:26:03 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | hint_text_ids = [ | 
					
						
							|  |  |  |     # Overworld owl statues | 
					
						
							|  |  |  |     0x1B6, 0x1B7, 0x1B8, 0x1B9, 0x1BA, 0x1BB, 0x1BC, 0x1BD, 0x1BE, 0x22D, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     0x288, 0x280,  # D1 | 
					
						
							|  |  |  |     0x28A, 0x289, 0x281,  # D2 | 
					
						
							|  |  |  |     0x282, 0x28C, 0x28B,  # D3 | 
					
						
							|  |  |  |     0x283,  # D4 | 
					
						
							|  |  |  |     0x28D, 0x284,  # D5 | 
					
						
							|  |  |  |     0x285, 0x28F, 0x28E,  # D6 | 
					
						
							|  |  |  |     0x291, 0x290, 0x286,  # D7 | 
					
						
							|  |  |  |     0x293, 0x287, 0x292,  # D8 | 
					
						
							|  |  |  |     0x263,  # D0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Hint books | 
					
						
							|  |  |  |     0x267,  # color dungeon | 
					
						
							|  |  |  |     0x201,  # Pre open: 0x200 | 
					
						
							|  |  |  |     0x203,  # Pre open: 0x202 | 
					
						
							|  |  |  |     0x205,  # Pre open: 0x204 | 
					
						
							|  |  |  |     0x207,  # Pre open: 0x206 | 
					
						
							|  |  |  |     0x209,  # Pre open: 0x208 | 
					
						
							|  |  |  |     0x20B,  # Pre open: 0x20A | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | hint_items = (POWER_BRACELET, SHIELD, BOW, HOOKSHOT, MAGIC_ROD, PEGASUS_BOOTS, OCARINA, FEATHER, SHOVEL, | 
					
						
							|  |  |  |               MAGIC_POWDER, SWORD, FLIPPERS, TAIL_KEY, ANGLER_KEY, FACE_KEY, | 
					
						
							|  |  |  |               BIRD_KEY, SLIME_KEY, GOLD_LEAF, BOOMERANG, BOWWOW) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | hints = [ | 
					
						
							|  |  |  |     "{0} is at {1}", | 
					
						
							|  |  |  |     "If you want {0} start looking in {1}", | 
					
						
							|  |  |  |     "{1} holds {0}", | 
					
						
							|  |  |  |     "They say that {0} is at {1}", | 
					
						
							|  |  |  |     "You might want to look in {1} for a secret", | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | useless_hint = [ | 
					
						
							|  |  |  |     ("Egg", "Mt. Tamaranch"), | 
					
						
							|  |  |  |     ("Marin", "Mabe Village"), | 
					
						
							|  |  |  |     ("Marin", "Mabe Village"), | 
					
						
							|  |  |  |     ("Witch", "Koholint Prairie"), | 
					
						
							|  |  |  |     ("Mermaid", "Martha's Bay"), | 
					
						
							|  |  |  |     ("Nothing", "Tabahl Wasteland"), | 
					
						
							|  |  |  |     ("Animals", "Animal Village"), | 
					
						
							|  |  |  |     ("Sand", "Yarna Desert"), | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-26 16:16:00 -04:00
										 |  |  | def addHints(rom, rnd, hint_texts): | 
					
						
							|  |  |  |     hint_texts_copy = hint_texts.copy() | 
					
						
							| 
									
										
										
										
											2023-03-21 01:26:03 +09:00
										 |  |  |     text_ids = hint_text_ids.copy() | 
					
						
							|  |  |  |     rnd.shuffle(text_ids) | 
					
						
							|  |  |  |     for text_id in text_ids: | 
					
						
							| 
									
										
										
										
											2025-07-26 16:16:00 -04:00
										 |  |  |         hint = hint_texts_copy.pop() | 
					
						
							| 
									
										
										
										
											2023-07-13 18:14:04 -07:00
										 |  |  |         if not hint: | 
					
						
							| 
									
										
										
										
											2023-03-21 01:26:03 +09:00
										 |  |  |             hint = rnd.choice(hints).format(*rnd.choice(useless_hint)) | 
					
						
							|  |  |  |         rom.texts[text_id] = formatText(hint) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for text_id in range(0x200, 0x20C, 2): | 
					
						
							|  |  |  |         rom.texts[text_id] = formatText("Read this book?", ask="YES  NO") | 
					
						
							| 
									
										
										
										
											2025-07-26 16:16:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def generate_hint_texts(world): | 
					
						
							|  |  |  |     JUNK_HINT = 0.33 | 
					
						
							|  |  |  |     RANDOM_HINT= 0.66 | 
					
						
							|  |  |  |     # USEFUL_HINT = 1.0 | 
					
						
							|  |  |  |     # TODO: filter events, filter unshuffled keys | 
					
						
							|  |  |  |     all_items = world.multiworld.get_items() | 
					
						
							|  |  |  |     our_items = [item for item in all_items | 
					
						
							|  |  |  |                  if item.player == world.player | 
					
						
							|  |  |  |                  and item.location | 
					
						
							|  |  |  |                  and item.code is not None | 
					
						
							|  |  |  |                  and item.location.show_in_spoiler] | 
					
						
							|  |  |  |     our_useful_items = [item for item in our_items if ItemClassification.progression in item.classification] | 
					
						
							|  |  |  |     hint_texts = [] | 
					
						
							|  |  |  |     def gen_hint(): | 
					
						
							|  |  |  |         chance = world.random.uniform(0, 1) | 
					
						
							|  |  |  |         if chance < JUNK_HINT: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  |         elif chance < RANDOM_HINT: | 
					
						
							|  |  |  |             location = world.random.choice(our_items).location | 
					
						
							|  |  |  |         else: # USEFUL_HINT | 
					
						
							|  |  |  |             location = world.random.choice(our_useful_items).location | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if location.item.player == world.player: | 
					
						
							|  |  |  |             name = "Your" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             name = f"{world.multiworld.player_name[location.item.player]}'s" | 
					
						
							|  |  |  |             # filter out { and } since they cause issues with string.format later on | 
					
						
							|  |  |  |             name = name.replace("{", "").replace("}", "") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if isinstance(location, LinksAwakeningLocation): | 
					
						
							|  |  |  |             location_name = location.ladxr_item.metadata.name | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             location_name = location.name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         hint = f"{name} {location.item} is at {location_name}" | 
					
						
							|  |  |  |         if location.player != world.player: | 
					
						
							|  |  |  |             # filter out { and } since they cause issues with string.format later on | 
					
						
							|  |  |  |             player_name = world.multiworld.player_name[location.player].replace("{", "").replace("}", "") | 
					
						
							|  |  |  |             hint += f" in {player_name}'s world" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Cap hint size at 85 | 
					
						
							|  |  |  |         # Realistically we could go bigger but let's be safe instead | 
					
						
							|  |  |  |         hint = hint[:85] | 
					
						
							|  |  |  |         return hint | 
					
						
							|  |  |  |     for _ in hint_text_ids: | 
					
						
							|  |  |  |         hint_texts.append(gen_hint()) | 
					
						
							|  |  |  |     return hint_texts |