rlm@145: (ns com.aurellem.gb.characters rlm@176: (:use (com.aurellem.gb gb-driver constants)) rlm@145: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@145: ocsenave@213: ocsenave@213: (def pronouns ocsenave@213: ;; Note: 0x0 seems to be the end-of-name sentinel ocsenave@213: { ocsenave@213: ;; what is 0x57? what is 0x0? ocsenave@213: :RED [0x52] ocsenave@213: :BLUE [0x53] ocsenave@213: :opponent [0x01 0x49 0xD0 0x0] ocsenave@213: :turn-pokemon [0x5A] ocsenave@213: :off-turn-pokemon [0x59] ocsenave@213: :your-pokemon [0x01 0x08 0xD0 0x0] ocsenave@213: :opponent-pokemon [0x50 0x01 0xD9 0xCF 0x0] ocsenave@213: :n-times [0x50 0x09 0x05 0xCD 0x11 0x0] ocsenave@213: }) ocsenave@213: ocsenave@234: ocsenave@234: ocsenave@234: (def meta-characters ocsenave@234: {0x00 "non-meta text follows" ocsenave@234: 0x01 "load text from RAM (nn)" ocsenave@234: 0x02 "BCD number (nn)C" ;; C is 3 flags and 5 length bits." ocsenave@234: 0x03 "store text in RAM (nn)" ocsenave@234: 0x04 "draw box (nn)WH" ocsenave@234: 0x05 "BEGIN text on textbox line 2" ocsenave@234: 0x06 "wait for A or B" ocsenave@234: 0x07 "scrolling text" ocsenave@234: 0x08 "BEGIN routine" ocsenave@234: 0x09 "load RAM (nn) hex-to-dec. (nn)BC. B is bytes to read, C is ocsenave@234: digits to display" ocsenave@234: 0x0A "wait 30 vblanks iff you pressed A or B" ocsenave@234: ocsenave@234: 0x0B "sound: got item" ocsenave@234: 0x0E "sound: learned skill" ocsenave@234: 0x0F "sound: got rarecandy" ;; incidentally, same as 'got item' ocsenave@234: 0x10 "sound: caught pokemon!" ocsenave@234: 0x11 "sound: gave OAK the parcel" ocsenave@234: 0x12 "sound: same as 0x10???" ocsenave@234: 0x13 "sound: new data added" ocsenave@234: 0x14 "sound: cry-nidorina" ocsenave@234: 0x15 "sound: cry-pidgeot" ocsenave@234: 0x16 "sound: cry-dewgong" ocsenave@234: ocsenave@234: 0x4E "new line" ocsenave@234: 0x51 "new page" ocsenave@234: 0x55 "scroll page" ocsenave@234: 0x50 "END command" ;; the pair 0x50 0x50 ?? ocsenave@234: 0x57 "END command" ocsenave@234: 0x58 "END after you press A or B" ocsenave@234: }) ocsenave@234: ocsenave@234: ocsenave@234: ocsenave@234: rlm@225: (def end-of-name-sentinel 0x00) ocsenave@213: rlm@145: (def character-code->character rlm@145: { ocsenave@213: 0x0 "" ;; separator character? ocsenave@213: 0x58 "\n" rlm@225: ;;0x00 "<";;"end-of-name-sentinel" ;; begin messsage ocsenave@259: 0x49 "\n //" ;; ocsenave: pagebreak pokedex ocsenave@259: 0x4E "\n..." ; ocsenave: clearscroll pokedex page ocsenave@259: 0x4F "\n" ; newline ocsenave@259: 0x50 "#";;"end-of-pokemon-name-sentinel" ocsenave@259: 0x51 "\n\n" ;; ocsenave: clear screen ocsenave@213: 0x52 "[RED]" ;;ocsenave: placeholder for your name? ocsenave@194: 0x54 "[POKE]" ocsenave@259: 0x55 "_" ;; ocsenave: breaking space? ocsenave@259: 0x57 ">" ;; ocsenave: end message ocsenave@259: 0x5F ">" ;; ocsenave: end pokedex entry?? rlm@145: 0x60 "A-bold" rlm@145: 0x61 "B-bold" rlm@145: 0x62 "C-bold" rlm@145: 0x63 "D-bold" rlm@145: 0x64 "E-bold" rlm@145: 0x65 "F-bold" rlm@145: 0x66 "G-bold" rlm@145: 0x67 "H-bold" rlm@145: 0x68 "I-bold" rlm@145: 0x69 "V-bold" rlm@145: 0x6A "S-bold" rlm@145: 0x6B "L-bold" rlm@145: 0x6C "M-bold" ocsenave@194: 0x7F " " ;space rlm@145: 0x80 "A" rlm@145: 0x81 "B" rlm@145: 0x82 "C" rlm@145: 0x83 "D" rlm@145: 0x84 "E" rlm@145: 0x85 "F" rlm@145: 0x86 "G" rlm@145: 0x87 "H" rlm@145: 0x88 "I" rlm@145: 0x89 "J" rlm@145: 0x8A "K" rlm@145: 0x8B "L" rlm@145: 0x8C "M" rlm@145: 0x8D "N" rlm@145: 0x8E "O" rlm@145: 0x8F "P" rlm@145: 0x90 "Q" rlm@145: 0x91 "R" rlm@145: 0x92 "S" rlm@145: 0x93 "T" rlm@145: 0x94 "U" rlm@145: 0x95 "V" rlm@145: 0x96 "W" rlm@145: 0x97 "X" rlm@145: 0x98 "Y" rlm@145: 0x99 "Z" rlm@145: 0x9A "(" rlm@145: 0x9B ")" rlm@145: 0x9C ":" rlm@145: 0x9D ";" rlm@145: 0xA0 "a" rlm@145: 0xA1 "b" rlm@145: 0xA2 "c" rlm@145: 0xA3 "d" rlm@145: 0xA4 "e" rlm@145: 0xA5 "f" rlm@145: 0xA6 "g" rlm@145: 0xA7 "h" rlm@145: 0xA8 "i" rlm@145: 0xA9 "j" rlm@145: 0xAA "k" rlm@145: 0xAB "l" rlm@145: 0xAC "m" rlm@145: 0xAD "n" rlm@145: 0xAE "o" rlm@145: 0xAF "p" rlm@145: 0xB0 "q" rlm@145: 0xB1 "r" rlm@145: 0xB2 "s" rlm@145: 0xB3 "t" rlm@145: 0xB4 "u" rlm@145: 0xB5 "v" rlm@145: 0xB6 "w" rlm@145: 0xB7 "x" rlm@145: 0xB8 "y" rlm@145: 0xB9 "z" rlm@253: 0xBA "é" ocsenave@194: 0xBB "'d" ;ocsenave ocsenave@194: 0xBC "'l" ;ocsenave ocsenave@194: 0xBD "'s" ;ocsenave ocsenave@194: 0xBE "'t" ;ocsenave ocsenave@194: 0xBF "'v" ; ocsenave ocsenave@194: rlm@145: 0xE0 "'" rlm@145: 0xE1 "PK" rlm@145: 0xE2 "MN" rlm@148: 0xE3 "-" ocsenave@194: 0xE4 "'r" ;ocsenave ocsenave@194: 0xE5 "'m" ;ocsenave rlm@145: 0xE6 "?" rlm@145: 0xE7 "!" rlm@145: 0xE8 "." rlm@253: 0xEF "♂" ocsenave@194: 0xF0 "$" ;;"pokemon-money-symbol" rlm@145: 0xF1 "." rlm@145: 0xF2 "/" rlm@145: 0xF3 "," ocsenave@194: 0xF4 ", " rlm@253: 0xF5 "♀" rlm@145: 0xF6 "0 " rlm@145: 0xF7 "1" rlm@145: 0xF8 "2" rlm@145: 0xF9 "3" rlm@145: 0xFA "4" rlm@145: 0xFB "5" rlm@145: 0xFC "6" rlm@145: 0xFD "7" rlm@145: 0xFE "8" rlm@145: 0xFF "9" rlm@145: }) rlm@145: rlm@145: (def character->character-code rlm@145: (zipmap (vals character-code->character) rlm@145: (keys character-code->character))) rlm@145: rlm@145: (defn str->character-codes [s] rlm@145: (map character->character-code (map str s))) rlm@145: rlm@145: (defn character-codes->str [codes] rlm@145: (apply str rlm@145: (map #(character-code->character rlm@145: % rlm@145: (format "[0x%02X]" %)) rlm@145: codes))) rlm@145: rlm@176: (defn print-text rlm@176: ([^SaveState state begin end] rlm@176: (dorun rlm@176: (map (fn [character-code line] rlm@176: (println rlm@176: (format "0x%04X: " line) rlm@176: (str (character-code->character character-code)))) rlm@176: (subvec (vec (memory state)) begin end) rlm@176: (range begin end))) rlm@176: state) rlm@176: ([begin end] rlm@176: (print-text @current-state begin end))) rlm@176: rlm@176: (defn read-name [codes] rlm@176: (character-codes->str rlm@176: (take-while rlm@176: (partial not= end-of-name-marker) codes)))