 81a239325d
			
		
	
	81a239325d
	
	
	
		
			
			Adds Link's Awakening: DX. Fully imports and forks LADXR, with permission - https://github.com/daid/LADXR
		
			
				
	
	
		
			223 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import Optional
 | |
| 
 | |
| from .locations.items import *
 | |
| 
 | |
| _NAMES = {
 | |
|     SWORD: "Sword",
 | |
|     BOMB: "Bombs",
 | |
|     POWER_BRACELET: "Power Bracelet",
 | |
|     SHIELD: "Shield",
 | |
|     BOW: "Bow",
 | |
|     HOOKSHOT: "Hookshot",
 | |
|     MAGIC_ROD: "Magic Rod",
 | |
|     PEGASUS_BOOTS: "Pegasus Boots",
 | |
|     OCARINA: "Ocarina",
 | |
|     FEATHER: "Roc's Feather",
 | |
|     SHOVEL: "Shovel",
 | |
|     MAGIC_POWDER: "Magic Powder",
 | |
|     BOOMERANG: "Boomerang",
 | |
|     ROOSTER: "Flying Rooster",
 | |
| 
 | |
|     FLIPPERS: "Flippers",
 | |
|     SLIME_KEY: "Slime key",
 | |
|     TAIL_KEY: "Tail key",
 | |
|     ANGLER_KEY: "Angler key",
 | |
|     FACE_KEY: "Face key",
 | |
|     BIRD_KEY: "Bird key",
 | |
|     GOLD_LEAF: "Golden leaf",
 | |
| 
 | |
|     "RUPEE": "Rupee",
 | |
|     "RUPEES": "Rupees",
 | |
|     RUPEES_50: "50 Rupees",
 | |
|     RUPEES_20: "20 Rupees",
 | |
|     RUPEES_100: "100 Rupees",
 | |
|     RUPEES_200: "200 Rupees",
 | |
|     RUPEES_500: "500 Rupees",
 | |
|     SEASHELL: "Secret Seashell",
 | |
| 
 | |
|     KEY: "Small Key",
 | |
|     KEY1: "Key for Tail Cave",
 | |
|     KEY2: "Key for Bottle Grotto",
 | |
|     KEY3: "Key for Key Cavern",
 | |
|     KEY4: "Key for Angler's Tunnel",
 | |
|     KEY5: "Key for Catfish's Maw",
 | |
|     KEY6: "Key for Face Shrine",
 | |
|     KEY7: "Key for Eagle's Tower",
 | |
|     KEY8: "Key for Turtle Rock",
 | |
|     KEY9: "Key for Color Dungeon",
 | |
| 
 | |
|     MAP: "Dungeon Map",
 | |
|     MAP1: "Map for Tail Cave",
 | |
|     MAP2: "Map for Bottle Grotto",
 | |
|     MAP3: "Map for Key Cavern",
 | |
|     MAP4: "Map for Angler's Tunnel",
 | |
|     MAP5: "Map for Catfish's Maw",
 | |
|     MAP6: "Map for Face Shrine",
 | |
|     MAP7: "Map for Eagle's Tower",
 | |
|     MAP8: "Map for Turtle Rock",
 | |
|     MAP9: "Map for Color Dungeon",
 | |
| 
 | |
|     COMPASS: "Dungeon Compass",
 | |
|     COMPASS1: "Compass for Tail Cave",
 | |
|     COMPASS2: "Compass for Bottle Grotto",
 | |
|     COMPASS3: "Compass for Key Cavern",
 | |
|     COMPASS4: "Compass for Angler's Tunnel",
 | |
|     COMPASS5: "Compass for Catfish's Maw",
 | |
|     COMPASS6: "Compass for Face Shrine",
 | |
|     COMPASS7: "Compass for Eagle's Tower",
 | |
|     COMPASS8: "Compass for Turtle Rock",
 | |
|     COMPASS9: "Compass for Color Dungeon",
 | |
| 
 | |
|     STONE_BEAK: "Stone Beak",
 | |
|     STONE_BEAK1: "Stone Beak for Tail Cave",
 | |
|     STONE_BEAK2: "Stone Beak for Bottle Grotto",
 | |
|     STONE_BEAK3: "Stone Beak for Key Cavern",
 | |
|     STONE_BEAK4: "Stone Beak for Angler's Tunnel",
 | |
|     STONE_BEAK5: "Stone Beak for Catfish's Maw",
 | |
|     STONE_BEAK6: "Stone Beak for Face Shrine",
 | |
|     STONE_BEAK7: "Stone Beak for Eagle's Tower",
 | |
|     STONE_BEAK8: "Stone Beak for Turtle Rock",
 | |
|     STONE_BEAK9: "Stone Beak for Color Dungeon",
 | |
| 
 | |
|     NIGHTMARE_KEY: "Nightmare Key",
 | |
|     NIGHTMARE_KEY1: "Nightmare Key for Tail Cave",
 | |
|     NIGHTMARE_KEY2: "Nightmare Key for Bottle Grotto",
 | |
|     NIGHTMARE_KEY3: "Nightmare Key for Key Cavern",
 | |
|     NIGHTMARE_KEY4: "Nightmare Key for Angler's Tunnel",
 | |
|     NIGHTMARE_KEY5: "Nightmare Key for Catfish's Maw",
 | |
|     NIGHTMARE_KEY6: "Nightmare Key for Face Shrine",
 | |
|     NIGHTMARE_KEY7: "Nightmare Key for Eagle's Tower",
 | |
|     NIGHTMARE_KEY8: "Nightmare Key for Turtle Rock",
 | |
|     NIGHTMARE_KEY9: "Nightmare Key for Color Dungeon",
 | |
| 
 | |
|     HEART_PIECE: "Piece of Heart",
 | |
|     BOWWOW: "Bowwow",
 | |
|     ARROWS_10: "10 Arrows",
 | |
|     SINGLE_ARROW: "Single Arrow",
 | |
|     MEDICINE: "Medicine",
 | |
| 
 | |
|     MAX_POWDER_UPGRADE: "Magic Powder upgrade",
 | |
|     MAX_BOMBS_UPGRADE: "Bombs upgrade",
 | |
|     MAX_ARROWS_UPGRADE: "Arrows upgrade",
 | |
| 
 | |
|     RED_TUNIC: "Red Tunic",
 | |
|     BLUE_TUNIC: "Blue Tunic",
 | |
| 
 | |
|     HEART_CONTAINER: "Heart Container",
 | |
|     BAD_HEART_CONTAINER: "Anti-Heart Container",
 | |
| 
 | |
|     TOADSTOOL: "Toadstool",
 | |
| 
 | |
|     SONG1: "Ballad of the Wind Fish",
 | |
|     SONG2: "Manbo's Mambo",
 | |
|     SONG3: "Frog's Song of Soul",
 | |
| 
 | |
|     INSTRUMENT1: "Full Moon Cello",
 | |
|     INSTRUMENT2: "Conch Horn",
 | |
|     INSTRUMENT3: "Sea Lily's Bell",
 | |
|     INSTRUMENT4: "Surf Harp",
 | |
|     INSTRUMENT5: "Wind Marimba",
 | |
|     INSTRUMENT6: "Coral Triangle",
 | |
|     INSTRUMENT7: "Organ of Evening Calm",
 | |
|     INSTRUMENT8: "Thunder Drum",
 | |
| 
 | |
|     TRADING_ITEM_YOSHI_DOLL: "Yoshi Doll",
 | |
|     TRADING_ITEM_RIBBON: "Ribbon",
 | |
|     TRADING_ITEM_DOG_FOOD: "Dog Food",
 | |
|     TRADING_ITEM_BANANAS: "Bananas",
 | |
|     TRADING_ITEM_STICK: "Stick",
 | |
|     TRADING_ITEM_HONEYCOMB: "Honeycomb",
 | |
|     TRADING_ITEM_PINEAPPLE: "Pineapple",
 | |
|     TRADING_ITEM_HIBISCUS: "Hibiscus",
 | |
|     TRADING_ITEM_LETTER: "Letter",
 | |
|     TRADING_ITEM_BROOM: "Broom",
 | |
|     TRADING_ITEM_FISHING_HOOK: "Fishing Hook",
 | |
|     TRADING_ITEM_NECKLACE: "Necklace",
 | |
|     TRADING_ITEM_SCALE: "Scale",
 | |
|     TRADING_ITEM_MAGNIFYING_GLASS: "Magnifying Lens",
 | |
|     GEL: "Slimy Surprise",
 | |
|     MESSAGE: "A Special Message From Our Sponsors"
 | |
| }
 | |
| 
 | |
| 
 | |
| def setReplacementName(key: str, value: str) -> None:
 | |
|     _NAMES[key] = value
 | |
| 
 | |
| 
 | |
| def formatText(instr: str, *, center: bool = False, ask: Optional[str] = None) -> bytes:
 | |
|     instr = instr.format(**_NAMES)
 | |
|     s = instr.encode("ascii")
 | |
|     s = s.replace(b"'", b"^")
 | |
| 
 | |
|     def padLine(line: bytes) -> bytes:
 | |
|         return line + b' ' * (16 - len(line))
 | |
|     if center:
 | |
|         def padLine(line: bytes) -> bytes:
 | |
|             padding = (16 - len(line))
 | |
|             return b' ' * (padding // 2) + line + b' ' * (padding - padding // 2)
 | |
| 
 | |
|     result = b''
 | |
|     for line in s.split(b'\n'):
 | |
|         result_line = b''
 | |
|         for word in line.split(b' '):
 | |
|             if len(result_line) + 1 + len(word) > 16:
 | |
|                 result += padLine(result_line)
 | |
|                 result_line = b''
 | |
|             elif result_line:
 | |
|                 result_line += b' '
 | |
|             result_line += word
 | |
|         if result_line:
 | |
|             result += padLine(result_line)
 | |
|     if ask is not None:
 | |
|         askbytes = ask.encode("ascii")
 | |
|         result = result.rstrip()
 | |
|         while len(result) % 32 != 16:
 | |
|             result += b' '
 | |
|         return result + b'    ' + askbytes + b'\xfe'
 | |
|     return result.rstrip() + b'\xff'
 | |
| 
 | |
| 
 | |
| def tileDataToString(data: bytes, key: str = " 123") -> str:
 | |
|     result = ""
 | |
|     for n in range(0, len(data), 2):
 | |
|         a = data[n]
 | |
|         b = data[n+1]
 | |
|         for m in range(8):
 | |
|             bit = 0x80 >> m
 | |
|             if (a & bit) and (b & bit):
 | |
|                 result += key[3]
 | |
|             elif (b & bit):
 | |
|                 result += key[2]
 | |
|             elif (a & bit):
 | |
|                 result += key[1]
 | |
|             else:
 | |
|                 result += key[0]
 | |
|         result += "\n"
 | |
|     return result.rstrip("\n")
 | |
| 
 | |
| 
 | |
| def createTileData(data: str, key: str = " 123") -> bytes:
 | |
|     result = []
 | |
|     for line in data.split("\n"):
 | |
|         line = line + "        "
 | |
|         a = 0
 | |
|         b = 0
 | |
|         for n in range(8):
 | |
|             if line[n] == key[3]:
 | |
|                 a |= 0x80 >> n
 | |
|                 b |= 0x80 >> n
 | |
|             elif line[n] == key[2]:
 | |
|                 b |= 0x80 >> n
 | |
|             elif line[n] == key[1]:
 | |
|                 a |= 0x80 >> n
 | |
|         result.append(a)
 | |
|         result.append(b)
 | |
|     assert (len(result) % 16) == 0, len(result)
 | |
|     return bytes(result)
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     data = formatText("It is dangurous to go alone.\nTake\nthis\na\nline.")
 | |
|     for i in range(0, len(data), 16):
 | |
|         print(data[i:i+16])
 |