115 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from .locations.items import *
 | |
| from .utils import formatText
 | |
| from BaseClasses import ItemClassification
 | |
| from ..Locations import LinksAwakeningLocation
 | |
| 
 | |
| 
 | |
| 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"),
 | |
| ]
 | |
| 
 | |
| 
 | |
| def addHints(rom, rnd, hint_texts):
 | |
|     hint_texts_copy = hint_texts.copy()
 | |
|     text_ids = hint_text_ids.copy()
 | |
|     rnd.shuffle(text_ids)
 | |
|     for text_id in text_ids:
 | |
|         hint = hint_texts_copy.pop()
 | |
|         if not hint:
 | |
|             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")
 | |
| 
 | |
| 
 | |
| 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
 | 
