rlm@176: (ns com.aurellem.gb.pokemon rlm@176: (:use (com.aurellem.gb gb-driver util constants characters)) rlm@176: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@176: rlm@176: (def pokemon-names-start 0xD2B4) rlm@176: rlm@179: (defn set-party-number rlm@179: ([^SaveState state new-party-num] rlm@179: (set-memory state 0xD162 new-party-num)) rlm@179: ([new-party-num] rlm@179: (set-party-number @current-state new-party-num))) rlm@176: rlm@176: (def party-number-address 0xD162) rlm@176: rlm@176: (defn party-number rlm@176: ([^SaveState state] rlm@176: (aget (memory state) party-number-address)) rlm@176: ([] (party-number @current-state))) rlm@176: rlm@176: (defn party-names rlm@176: ([^SaveState state] rlm@176: (let [raw-names rlm@176: (subvec (vec (memory state)) rlm@176: pokemon-names-start rlm@176: (+ pokemon-names-start rlm@176: (* name-width 6)))] rlm@176: (map rlm@176: read-name rlm@176: (take rlm@176: (party-number state) rlm@176: (partition name-width rlm@176: raw-names))))) rlm@176: ([] (party-names @current-state))) rlm@176: rlm@176: (defn rename-pokemon rlm@176: ([^SaveState state n new-name] rlm@176: (assert (<= 0 n (dec (party-number state)))) rlm@176: (assert (<= (count new-name) max-name-length)) rlm@176: (set-memory-range rlm@176: state rlm@176: (+ (* n name-width) pokemon-names-start) rlm@176: (concat (str->character-codes new-name) [end-of-name-marker]))) rlm@176: ([n new-name] rlm@176: (rename-pokemon @current-state n new-name))) rlm@176: rlm@176: (def OT-start 0xD272) rlm@176: rlm@176: (defn original-trainers rlm@176: ([^SaveState state] rlm@176: (let [raw-names rlm@176: (subvec (vec (memory state)) rlm@176: OT-start rlm@176: (+ OT-start rlm@176: (* name-width 6)))] rlm@176: (map read-name rlm@176: (take (party-number state) rlm@176: (partition name-width raw-names))))) rlm@176: ([] (original-trainers @current-state))) rlm@176: rlm@176: (defn set-original-trainer rlm@176: "Set the OT name for a pokemon. rlm@176: Note that a pokemon is still considered 'yours' if rlm@176: the OT ID is the same as your own." rlm@176: ([^SaveState state poke-num new-name] rlm@176: (assert (<= 0 poke-num (dec (party-number state)))) rlm@176: (assert (<= (count new-name) max-name-length)) rlm@176: (set-memory-range rlm@176: state rlm@176: (+ (* poke-num name-width) OT-start) rlm@176: (concat (str->character-codes new-name) [end-of-name-marker]))) rlm@176: ([n new-name] rlm@176: (set-original-trainer @current-state n new-name))) rlm@176: rlm@176: (def OT-ID-addresses [0xD176 0xD1A2 0xD1CE 0xD1FA 0xD228 0xD252]) rlm@176: rlm@176: (defn set-pokemon-id rlm@176: ([^SaveState state n new-id] rlm@176: (assert (<= 0 n (dec (party-number state)))) rlm@176: (assert (<= 0 new-id 0xFFFF)) rlm@176: (set-memory-range rlm@176: state rlm@176: (OT-ID-addresses n) rlm@176: [(bit-shift-right (bit-and new-id 0xFF00) 8) rlm@176: (bit-and new-id 0xFF) rlm@176: ])) rlm@176: ([n new-id] rlm@176: (set-pokemon-id @current-state n new-id))) rlm@176: rlm@176: (def unknown "[[[UNKNOWN]]]") rlm@176: rlm@176: (def unknown "") rlm@176: rlm@176: (def pokemon-1-info rlm@176: {0xD16A "Color Map" ;; 0 rlm@176: 0xD16B "Current-HP (h)" ;; 1 rlm@176: 0xD16C "Current-HP (l)" ;; 2 ocsenave@185: 0XD16D "Unused" ;; 3 rlm@178: 0xD16E "Status" ;; 4 ocsenave@185: 0xD16F "Type 1" ;; 5 ocsenave@185: 0xD170 "Type 2" ;; 6 ocsenave@185: 0xD171 "scratch/C.R." ;; 7 rlm@176: 0xD172 "Move 1 ID" ;; 8 rlm@176: 0xD173 "Move 2 ID" ;; 9 rlm@176: 0xD174 "Move 3 ID" ;; 10 rlm@176: 0xD175 "Move 4 ID" ;; 11 rlm@176: 0xD176 "OT-ID (h)" ;; 12 rlm@176: 0xD177 "OT-ID (l)" ;; 13 rlm@176: 0xD178 "Exp. Points (h)" ;; 14 rlm@176: 0xD179 "Exp. Points (m)" ;; 15 rlm@176: 0xD17A "Exp. Points (l)" ;; 16 rlm@176: 0xD17B "HP Exp. (h)" ;; 17 rlm@176: 0xD17C "HP Exp. (l)" ;; 18 rlm@176: 0xD17D "Attack Exp. (h)" ;; 19 rlm@176: 0xD17E "Attack Exp. (l)" ;; 20 rlm@176: 0xD17F "Defense Exp. (h)" ;; 21 rlm@176: 0xD180 "Defense Exp. (l)" ;; 22 rlm@176: 0xD181 "Speed Exp. (h)" ;; 23 rlm@176: 0xD182 "Speed Exp. (l)" ;; 24 rlm@176: 0xD183 "Special Exp. (h)" ;; 25 rlm@176: 0xD184 "Special Exp. (l)" ;; 26 rlm@176: 0xD185 "DV Atk/Def" ;; 27 rlm@176: 0xD186 "DV Speed/Spc" ;; 28 rlm@176: 0xD187 "PP Move 1" ;; 29 rlm@176: 0xD188 "PP Move 2" ;; 30 rlm@176: 0xD189 "PP Move 3" ;; 31 rlm@176: 0xD18A "PP Move 4" ;; 32 rlm@176: 0xD18B "Current Level" ;; 33 rlm@176: 0xD18C "HP Total (h)" ;; 34 rlm@176: 0xD18D "HP Total (l)" ;; 35 rlm@176: 0xD18E "Attack (h)" ;; 36 rlm@176: 0xD18F "Attack (l)" ;; 37 rlm@176: 0xD190 "Defense (h)" ;; 38 rlm@176: 0xD191 "Defense (l)" ;; 39 rlm@176: 0xD192 "Speed (h)" ;; 40 rlm@176: 0xD193 "Speed (l)" ;; 41 rlm@176: 0xD194 "Special (h)" ;; 42 rlm@176: 0xD195 "Special (l)" ;; 43 rlm@176: }) rlm@176: rlm@176: (defn pokemon-data rlm@176: ([^SaveState state pokemon-num] rlm@176: (assert (<= 0 pokemon-num 5)) rlm@176: (let [base (+ (* pokemon-num pokemon-record-width) 0xD16A)] rlm@176: (subvec (vec (memory state)) base rlm@176: (+ base pokemon-record-width)))) rlm@176: ([pokemon-num] (pokemon-data @current-state pokemon-num))) rlm@176: rlm@176: (defn set-pokemon-data rlm@176: ([^SaveState state pokemon-num new-data] rlm@176: (assert (<= 0 pokemon-num 5)) rlm@176: (let [base (+ (* pokemon-num pokemon-record-width) 0xD16A)] rlm@176: (set-memory-range state base new-data))) rlm@176: ([pokemon-num new-data] rlm@176: (set-pokemon-data @current-state pokemon-num new-data))) rlm@176: rlm@176: (defn print-pokemon-data rlm@176: ([^SaveState state pokemon-num] rlm@176: (assert (<= 0 pokemon-num 5)) rlm@176: (let [poke-data (pokemon-data state pokemon-num) rlm@176: backbone (sort (keys pokemon-1-info))] rlm@176: (println "Pokemon " pokemon-num " -- " rlm@176: (nth (party-names state) rlm@176: pokemon-num) \newline) rlm@176: rlm@176: (println " Desc. | Hex | Dec | Binary |") rlm@176: (println "-------------------+------+-----+----------+") rlm@176: (dorun rlm@176: (map rlm@176: (comp println rlm@176: (fn [desc data] rlm@176: (format "%-16s | 0x%02X | %3d | %s |" rlm@176: desc data data rlm@176: (let [s (Integer/toBinaryString data)] rlm@176: (apply rlm@176: str rlm@176: (concat (repeat (- 8 (count s)) "0" ) rlm@176: s)))))) rlm@176: (map pokemon-1-info backbone) rlm@176: poke-data)))) rlm@176: ([pokemon-num] rlm@176: (print-pokemon-data @current-state pokemon-num)))