Mercurial > vba-clojure
diff clojure/com/aurellem/exp/pokemon.clj @ 148:06426d25c65b
can now get/set pokemon OT name
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Mon, 19 Mar 2012 23:14:21 -0500 |
parents | 279e9ee6fccb |
children | 79ffbd639b41 |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/exp/pokemon.clj Mon Mar 19 22:42:36 2012 -0500 1.2 +++ b/clojure/com/aurellem/exp/pokemon.clj Mon Mar 19 23:14:21 2012 -0500 1.3 @@ -92,14 +92,14 @@ 1.4 (def max-name-length 10) 1.5 (def name-width 11) 1.6 1.7 -(defn read-pokemon-name [codes] 1.8 +(defn read-name [codes] 1.9 (character-codes->str 1.10 (take-while 1.11 (partial not= end-of-name-marker) codes))) 1.12 1.13 1.14 (defn sixth-pokemon-name [^SaveState state] 1.15 - (read-pokemon-name 1.16 + (read-name 1.17 (subvec (vec (memory state)) 1.18 sixth-pokemon-name-start 1.19 (+ (inc max-name-length) 1.20 @@ -127,16 +127,12 @@ 1.21 ([begin end] 1.22 (print-text @current-state begin end))) 1.23 1.24 - 1.25 - 1.26 - 1.27 (defn examine-name-memory [] 1.28 (print-text 1.29 named-A 1.30 (- sixth-pokemon-name-start 100) 1.31 (+ sixth-pokemon-name-start 100))) 1.32 1.33 - 1.34 ;; results: 1.35 ;; 0xD287: end-of-name-sentinel 1.36 ;; 0xD288: R 1.37 @@ -436,13 +432,62 @@ 1.38 (subvec (vec (memory state)) 1.39 pokemon-names-start 1.40 (+ pokemon-names-start 1.41 - (* name-width 6)))] 1.42 + (* name-width 6)))] 1.43 (map 1.44 - read-pokemon-name 1.45 + read-name 1.46 (take 1.47 (party-number state) 1.48 (partition name-width 1.49 raw-names))))) 1.50 ([] (party-names @current-state))) 1.51 1.52 - 1.53 \ No newline at end of file 1.54 + 1.55 +(defn rename-pokemon 1.56 + ([^SaveState state n new-name] 1.57 + (assert (<= 0 n (dec (party-number state)))) 1.58 + (assert (<= (count new-name) max-name-length)) 1.59 + (set-memory-range 1.60 + state 1.61 + (+ (* n name-width) pokemon-names-start) 1.62 + (concat (str->character-codes new-name) [end-of-name-marker]))) 1.63 + ([n new-name] 1.64 + (rename-pokemon @current-state n new-name))) 1.65 + 1.66 + 1.67 +;; on further analysis, it appears that the original 1.68 +;; trainer info for each pokemon is also stored together, 1.69 +;; starting at 0xD272 and continuing to 0xD2B3, with 1.70 +;; 11 bytes reserved for each OT name. 1.71 + 1.72 +(def OT-start 0xD272) 1.73 + 1.74 +(defn original-trainers 1.75 + ([^SaveState state] 1.76 + (let [raw-names 1.77 + (subvec (vec (memory state)) 1.78 + OT-start 1.79 + (+ OT-start 1.80 + (* name-width 6)))] 1.81 + (map read-name 1.82 + (take (party-number state) 1.83 + (partition name-width raw-names))))) 1.84 + ([] (original-trainers @current-state))) 1.85 + 1.86 +(defn set-original-trainer 1.87 + "Set the OT name for a pokemon. 1.88 + Note that a pokemon is still considered 'yours' if 1.89 + the OT ID is the same as your own." 1.90 + ([^SaveState state n new-name] 1.91 + (assert (<= 0 n (dec (party-number state)))) 1.92 + (assert (<= (count new-name) max-name-length)) 1.93 + (set-memory-range 1.94 + state 1.95 + (+ (* n name-width) OT-start) 1.96 + (concat (str->character-codes new-name) [end-of-name-marker]))) 1.97 + ([n new-name] 1.98 + (set-original-trainer @current-state n new-name))) 1.99 + 1.100 +;; PIKACHU stops following if you set it's OT to another name 1.101 +;; and then back to you own. 1.102 +;; But not if you set it to your own name, obviously. 1.103 + 1.104 \ No newline at end of file