Archipelago/Text.py

319 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

text_addresses = {'Altar': (0x180300, 256),
'Triforce': (0x180400, 256),
'Uncle': (0x180500, 256),
'Ganon1': (0x180600, 256),
'Ganon2': (0x180700, 256),
'Blind': (0x180800, 256),
'TavernMan': (0x180C00, 256),
'Sahasrahla1': (0x180A00, 256),
'Sahasrahla2': (0x180B00, 256),
'BombShop1': (0x180E00, 256),
'BombShop2': (0x180D00, 256),
'PyramidFairy': (0x180900, 256)}
altar_text = {'Fighter Sword': 'A pathetic\nsword rests\nhere!',
'Master Sword': 'I thought this\nwas meant to\nbe randomized?',
'Tempered Sword': 'I stole the\nblacksmith\'s\njob!',
'Golden Sword': 'The butter\nsword rests\nhere!',
'Blue Shield': 'Now you can\ndefend against\npebbles!',
'Red Shield': 'Now you can\ndefend against\nfireballs!',
'Mirror Shield': 'Now you can\ndefend against\nlasers!',
'Fir eRod': 'I\'m the hot\nrod. I make\nthings burn!',
'Ice Rod': 'I\'m the cold\nrod. I make\nthings freeze!',
'Hammer': 'stop\nhammer time!',
'Hookshot': 'BOING!!!\nBOING!!!\nBOING!!!',
'Bow': 'You have\nchosen the\narcher class.',
'Blue Boomerang': 'No matter what\nyou do, blue\nreturns to you',
'Red Boomerang': 'No matter what\nyou do, red\nreturns to you',
'Magic Powder': 'you can turn\nanti-faeries\ninto fairies',
'Bombos': 'Burn, baby,\nburn! Fear my\nring of fire!',
'Ether': 'Zero Kelvin!\nAbsolute zero!\nFear the cold!',
'Quake': 'Maxing out the\nRichter scale\nis what I do!',
'Lamp': 'Baby, baby,\nbaby.\nLight my way!',
'Shovel': 'Can\n You\n Dig it?',
'Cane of Somaria': 'I make blocks\nto hold down\nswitches!',
'Cane of Byrna': 'Use this to\nbecome\ninvincible!',
'Cape': 'Wear this to\nbecome\ninvisible!',
'Magic Mirror': 'Isn\'t your\nreflection so\npretty?',
'Power Glove': 'Now you can\nlift weak\nstuff!',
'Titans Mitt': 'Now you can\nlift heavy\nstuff!',
'Book of Mudora': 'This is a\nparadox?!',
'Flippers': 'fancy a swim?',
'Moon Pearl': ' Bunny Link\n be\n gone!',
'Bug Catching Net': 'Let\'s catch\nsome bees and\nfaeries!',
'Blue Mail': 'Now you\'re a\nblue elf!',
'Red Mail': 'Now you\'re a\nred elf!',
'Piece of Heart': 'Just a little\npiece of love!',
'Boss Heart Container': 'Maximum health\nincreased!\nYeah!',
'Single Bomb': 'I make things\ngo BOOM! But\njust once.',
'Bombs (3)': 'I make things\ngo triple\nBOOM!!!',
'Mushroom': 'I\'m a fun guy!\n\nI\'m a funghi!',
'Bottle': 'Now you can\nstore potions\nand stuff!',
'Single Arrow': 'a lonely arrow\nsits here.',
'Arrows (10)': 'This will give\nyou ten shots\nwith your bow!',
'Rupee (1)': 'Just pocket\nchange. Move\nright along.',
'Rupees (5)': 'Just pocket\nchange. Move\nright along.',
'Rupees (20)': 'Just couch\ncash. Move\nright along.',
'Rupees (50)': 'Just couch\ncash. Move\nright along.',
'Rupees (100)': 'A rupee stash!\nHell yeah!',
'Rupees (300)': 'A rupee hoard!\nHell yeah!',
'Ocarina': 'Save the duck\nand fly to\nfreedom!',
'Pegasus Boots': 'Gotta go fast!',
'Bomb Upgrade (+5)': 'increase bomb\nstorage, low\nlow price',
'Bomb Upgrade (+10)': 'increase bomb\nstorage, low\nlow price',
'Arrow Upgrade (+5)': 'increase arrow\nstorage, low\nlow price',
'Arrow Upgrade (+10)': 'increase arrow\nstorage, low\nlow price',
'Silver Arrows': 'Do you fancy\nsilver tipped\narrows?',
'Magic Upgrade (1/2)': 'Your magic\npower has been\ndoubled!',
'Magic Upgrade (1/4)': 'Your magic\npower has been\nquadrupled!',
'Progressive Sword': 'a better copy\nof your sword\nfor your time',
'Progressive Shield': 'have a better\nblocker in\nfront of you',
'Progressive Armor': 'time for a\nchange of\nclothes?',
'Progressive Glove': 'a way to lift\nheavier things',
'Triforce': '\n YOU WIN!',
'Nothing': 'Some Hot Air'}
def string_to_alttp_text(s, maxbytes=256):
lines = s.upper().split('\n')
outbuf = bytearray()
lineindex = 0
while lines:
linespace = 14
line = lines.pop(0)
words = line.split(' ')
outbuf.append(0x74 if lineindex == 0 else 0x75 if lineindex == 1 else 0x76) # line starter
while words:
word = words.pop(0)
# sanity check: if the word we have is more than 14 characters, we take as much as we can still fit and push the rest back for later
if len(word) > 14:
if linespace < 14:
word = ' ' + word
word_first = word[:linespace]
words.insert(0, word[linespace:])
lines.insert(0, ' '.join(words))
write_word(outbuf, word_first)
break
if len(word) <= (linespace if linespace == 14 else linespace - 1):
if linespace < 14:
word = ' ' + word
linespace -= len(word)
write_word(outbuf, word)
else:
# ran out of space, push word and lines back and continue with next line
words.insert(0, word)
lines.insert(0, ' '.join(words))
break
lineindex += 1
if lineindex % 3 == 0 and lines:
outbuf.append(0x7E)
if lineindex >= 3 and lines:
outbuf.append(0x73)
# check for max length
if len(outbuf) > maxbytes - 1:
outbuf = outbuf[:maxbytes - 1]
# make sure we interpret the end of box character
if outbuf[-1] == 0x00:
outbuf[-1] = 0x73
outbuf.append(0x7F)
return outbuf
def write_word(buf, word):
for char in word:
buf.extend([0x00, char_to_alttp_char(char)])
char_map = {' ': 0xFF,
'?': 0xC6,
'!': 0xC7,
',': 0xC8,
'-': 0xC9,
'': 0xCC,
'.': 0xCD,
'~': 0xCE,
'': 0xCE,
"'": 0xD8,
'': 0xD8,
'': 0xE0,
'': 0xE1,
'': 0xE2,
'': 0xE3,
'': 0x00,
'': 0x01,
'': 0x02,
'': 0x03,
'': 0x04,
'': 0x05,
'': 0x06,
'': 0x07,
'': 0x08,
'': 0x09,
'': 0x0A,
'': 0x0B,
'': 0x0C,
'': 0x0D,
'': 0x0E,
'': 0x0F,
'': 0x10,
'': 0x11,
'': 0x12,
'': 0x13,
'': 0x14,
'': 0x15,
'': 0x16,
'': 0x17,
'': 0x18,
'': 0x19,
'': 0x1A,
'': 0x1B,
'': 0x1C,
'': 0x1D,
'': 0x1E,
'': 0x1F,
'': 0x20,
'': 0x21,
'': 0x22,
'': 0x23,
'': 0x24,
'': 0x25,
'': 0x26,
'': 0x27,
'': 0x28,
'': 0x29,
'': 0x2A,
'': 0x2B,
'': 0x2C,
'': 0x2D,
'': 0x2E,
'': 0x2F,
'': 0x30,
'': 0x31,
'': 0x32,
'': 0x33,
'': 0x34,
'': 0x35,
'': 0x36,
'': 0x37,
'': 0x38,
'': 0x39,
'': 0x3A,
'': 0x3B,
'': 0x3C,
'': 0x3D,
'': 0x3E,
'': 0x3F,
'': 0x40,
'': 0x41,
'': 0x42,
'': 0x43,
'': 0x44,
'': 0x45,
'': 0x46,
'': 0x47,
'': 0x48,
'': 0x49,
'': 0x4A,
'': 0x4B,
'': 0x4C,
'': 0x4D,
'': 0x4E,
'': 0x4F,
'': 0x50,
'': 0x51,
'': 0x52,
'': 0x53,
'': 0x54,
'': 0x55,
'': 0x56,
'': 0x57,
'': 0x58,
'': 0x59,
'': 0x5A,
'': 0x5B,
'': 0x5C,
'': 0x5D,
'': 0x5E,
'': 0x5F,
'': 0x60,
'': 0x61,
'': 0x62,
'': 0x63,
'': 0x64,
'': 0x65,
'': 0x66,
'': 0x67,
'': 0x68,
'': 0x69,
'': 0x6A,
'': 0x6B,
'': 0x6C,
'': 0x6D,
'': 0x6E,
'': 0x6F,
'': 0x70,
'': 0x71,
'': 0x72,
'': 0x73,
'': 0x74,
'': 0x75,
'': 0x76,
'': 0x77,
'': 0x78,
'': 0x79,
'': 0x7A,
'': 0x7B,
'': 0x7C,
'': 0x7D,
'': 0x7E,
'': 0x80,
'': 0x81,
'': 0x82,
'': 0x83,
'': 0x84,
'': 0x85,
'': 0x86,
'': 0x87,
'': 0x88,
'': 0x89,
'': 0x8A,
'': 0x8B,
'': 0x8C,
'': 0x8D,
'': 0x8E,
'': 0x8F,
'': 0x90,
'': 0x91,
'': 0x92,
'': 0x93,
'': 0x94,
'': 0x95,
'': 0x96,
'': 0x97,
'': 0x98,
'': 0x99,
'': 0x9A,
'': 0x9B,
'': 0x9C,
'': 0x9D,
'': 0x9E,
'': 0x9F}
def char_to_alttp_char(char):
if 0x30 <= ord(char) <= 0x39:
return ord(char) + 0x70
if 0x41 <= ord(char) <= 0x5A:
return ord(char) + 0x69
return char_map.get(char, 0xFF)