Archipelago/Text.py

319 lines
11 KiB
Python
Raw Normal View History

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)