rlm@176
|
1 (ns com.aurellem.gb.pokemon
|
rlm@190
|
2 (:use (com.aurellem.gb gb-driver util constants characters
|
rlm@190
|
3 moves types items status dv species
|
rlm@191
|
4 experience
|
rlm@190
|
5 ))
|
rlm@176
|
6 (:import [com.aurellem.gb.gb_driver SaveState]))
|
rlm@176
|
7
|
rlm@176
|
8 (def pokemon-names-start 0xD2B4)
|
rlm@176
|
9
|
rlm@179
|
10 (defn set-party-number
|
rlm@179
|
11 ([^SaveState state new-party-num]
|
rlm@179
|
12 (set-memory state 0xD162 new-party-num))
|
rlm@179
|
13 ([new-party-num]
|
rlm@179
|
14 (set-party-number @current-state new-party-num)))
|
rlm@176
|
15
|
rlm@176
|
16 (def party-number-address 0xD162)
|
rlm@176
|
17
|
rlm@176
|
18 (defn party-number
|
rlm@176
|
19 ([^SaveState state]
|
rlm@176
|
20 (aget (memory state) party-number-address))
|
rlm@176
|
21 ([] (party-number @current-state)))
|
rlm@176
|
22
|
rlm@176
|
23 (defn party-names
|
rlm@176
|
24 ([^SaveState state]
|
rlm@176
|
25 (let [raw-names
|
rlm@176
|
26 (subvec (vec (memory state))
|
rlm@176
|
27 pokemon-names-start
|
rlm@176
|
28 (+ pokemon-names-start
|
rlm@176
|
29 (* name-width 6)))]
|
rlm@176
|
30 (map
|
rlm@176
|
31 read-name
|
rlm@176
|
32 (take
|
rlm@176
|
33 (party-number state)
|
rlm@176
|
34 (partition name-width
|
rlm@176
|
35 raw-names)))))
|
rlm@176
|
36 ([] (party-names @current-state)))
|
rlm@176
|
37
|
rlm@191
|
38 (defn pokemon-nickname
|
rlm@191
|
39 ([^SaveState state poke-num]
|
rlm@191
|
40 (nth (party-names state) poke-num))
|
rlm@191
|
41 ([poke-num]
|
rlm@191
|
42 (pokemon-nickname @current-state poke-num)))
|
rlm@191
|
43
|
rlm@176
|
44 (defn rename-pokemon
|
rlm@176
|
45 ([^SaveState state n new-name]
|
rlm@176
|
46 (assert (<= 0 n (dec (party-number state))))
|
rlm@176
|
47 (assert (<= (count new-name) max-name-length))
|
rlm@176
|
48 (set-memory-range
|
rlm@176
|
49 state
|
rlm@176
|
50 (+ (* n name-width) pokemon-names-start)
|
rlm@176
|
51 (concat (str->character-codes new-name) [end-of-name-marker])))
|
rlm@176
|
52 ([n new-name]
|
rlm@176
|
53 (rename-pokemon @current-state n new-name)))
|
rlm@176
|
54
|
rlm@176
|
55 (def OT-start 0xD272)
|
rlm@176
|
56
|
rlm@176
|
57 (defn original-trainers
|
rlm@176
|
58 ([^SaveState state]
|
rlm@176
|
59 (let [raw-names
|
rlm@176
|
60 (subvec (vec (memory state))
|
rlm@176
|
61 OT-start
|
rlm@176
|
62 (+ OT-start
|
rlm@176
|
63 (* name-width 6)))]
|
rlm@176
|
64 (map read-name
|
rlm@176
|
65 (take (party-number state)
|
rlm@176
|
66 (partition name-width raw-names)))))
|
rlm@176
|
67 ([] (original-trainers @current-state)))
|
rlm@176
|
68
|
rlm@176
|
69 (defn set-original-trainer
|
rlm@176
|
70 "Set the OT name for a pokemon.
|
rlm@176
|
71 Note that a pokemon is still considered 'yours' if
|
rlm@176
|
72 the OT ID is the same as your own."
|
rlm@176
|
73 ([^SaveState state poke-num new-name]
|
rlm@176
|
74 (assert (<= 0 poke-num (dec (party-number state))))
|
rlm@176
|
75 (assert (<= (count new-name) max-name-length))
|
rlm@176
|
76 (set-memory-range
|
rlm@176
|
77 state
|
rlm@176
|
78 (+ (* poke-num name-width) OT-start)
|
rlm@176
|
79 (concat (str->character-codes new-name) [end-of-name-marker])))
|
rlm@176
|
80 ([n new-name]
|
rlm@176
|
81 (set-original-trainer @current-state n new-name)))
|
rlm@176
|
82
|
rlm@176
|
83 (def OT-ID-addresses [0xD176 0xD1A2 0xD1CE 0xD1FA 0xD228 0xD252])
|
rlm@176
|
84
|
rlm@176
|
85 (defn set-pokemon-id
|
rlm@176
|
86 ([^SaveState state n new-id]
|
rlm@176
|
87 (assert (<= 0 n (dec (party-number state))))
|
rlm@176
|
88 (assert (<= 0 new-id 0xFFFF))
|
rlm@176
|
89 (set-memory-range
|
rlm@176
|
90 state
|
rlm@176
|
91 (OT-ID-addresses n)
|
rlm@176
|
92 [(bit-shift-right (bit-and new-id 0xFF00) 8)
|
rlm@176
|
93 (bit-and new-id 0xFF)
|
rlm@176
|
94 ]))
|
rlm@176
|
95 ([n new-id]
|
rlm@176
|
96 (set-pokemon-id @current-state n new-id)))
|
rlm@176
|
97
|
rlm@176
|
98 (def unknown "[[[UNKNOWN]]]")
|
rlm@176
|
99
|
rlm@176
|
100 (def unknown "")
|
rlm@176
|
101
|
rlm@189
|
102 (def pokemon-1-record
|
rlm@176
|
103 {0xD16A "Color Map" ;; 0
|
rlm@176
|
104 0xD16B "Current-HP (h)" ;; 1
|
rlm@176
|
105 0xD16C "Current-HP (l)" ;; 2
|
rlm@182
|
106 0XD16D "Unused" ;; 3
|
rlm@178
|
107 0xD16E "Status" ;; 4
|
rlm@182
|
108 0xD16F "Type 1" ;; 5
|
rlm@182
|
109 0xD170 "Type 2" ;; 6
|
rlm@182
|
110 0xD171 "scratch/C.R." ;; 7
|
rlm@176
|
111 0xD172 "Move 1 ID" ;; 8
|
rlm@176
|
112 0xD173 "Move 2 ID" ;; 9
|
rlm@176
|
113 0xD174 "Move 3 ID" ;; 10
|
rlm@176
|
114 0xD175 "Move 4 ID" ;; 11
|
rlm@176
|
115 0xD176 "OT-ID (h)" ;; 12
|
rlm@176
|
116 0xD177 "OT-ID (l)" ;; 13
|
rlm@176
|
117 0xD178 "Exp. Points (h)" ;; 14
|
rlm@176
|
118 0xD179 "Exp. Points (m)" ;; 15
|
rlm@176
|
119 0xD17A "Exp. Points (l)" ;; 16
|
rlm@176
|
120 0xD17B "HP Exp. (h)" ;; 17
|
rlm@176
|
121 0xD17C "HP Exp. (l)" ;; 18
|
rlm@176
|
122 0xD17D "Attack Exp. (h)" ;; 19
|
rlm@176
|
123 0xD17E "Attack Exp. (l)" ;; 20
|
rlm@176
|
124 0xD17F "Defense Exp. (h)" ;; 21
|
rlm@176
|
125 0xD180 "Defense Exp. (l)" ;; 22
|
rlm@176
|
126 0xD181 "Speed Exp. (h)" ;; 23
|
rlm@176
|
127 0xD182 "Speed Exp. (l)" ;; 24
|
rlm@176
|
128 0xD183 "Special Exp. (h)" ;; 25
|
rlm@176
|
129 0xD184 "Special Exp. (l)" ;; 26
|
rlm@176
|
130 0xD185 "DV Atk/Def" ;; 27
|
rlm@176
|
131 0xD186 "DV Speed/Spc" ;; 28
|
rlm@176
|
132 0xD187 "PP Move 1" ;; 29
|
rlm@176
|
133 0xD188 "PP Move 2" ;; 30
|
rlm@176
|
134 0xD189 "PP Move 3" ;; 31
|
rlm@176
|
135 0xD18A "PP Move 4" ;; 32
|
rlm@176
|
136 0xD18B "Current Level" ;; 33
|
rlm@176
|
137 0xD18C "HP Total (h)" ;; 34
|
rlm@176
|
138 0xD18D "HP Total (l)" ;; 35
|
rlm@176
|
139 0xD18E "Attack (h)" ;; 36
|
rlm@176
|
140 0xD18F "Attack (l)" ;; 37
|
rlm@176
|
141 0xD190 "Defense (h)" ;; 38
|
rlm@176
|
142 0xD191 "Defense (l)" ;; 39
|
rlm@176
|
143 0xD192 "Speed (h)" ;; 40
|
rlm@176
|
144 0xD193 "Speed (l)" ;; 41
|
rlm@176
|
145 0xD194 "Special (h)" ;; 42
|
rlm@176
|
146 0xD195 "Special (l)" ;; 43
|
rlm@176
|
147 })
|
rlm@176
|
148
|
rlm@189
|
149 (defn pokemon-record
|
rlm@176
|
150 ([^SaveState state pokemon-num]
|
rlm@176
|
151 (assert (<= 0 pokemon-num 5))
|
rlm@176
|
152 (let [base (+ (* pokemon-num pokemon-record-width) 0xD16A)]
|
rlm@176
|
153 (subvec (vec (memory state)) base
|
rlm@176
|
154 (+ base pokemon-record-width))))
|
rlm@189
|
155 ([pokemon-num] (pokemon-record @current-state pokemon-num)))
|
rlm@176
|
156
|
rlm@189
|
157 (defn set-pokemon-record
|
rlm@176
|
158 ([^SaveState state pokemon-num new-data]
|
rlm@176
|
159 (assert (<= 0 pokemon-num 5))
|
rlm@176
|
160 (let [base (+ (* pokemon-num pokemon-record-width) 0xD16A)]
|
rlm@176
|
161 (set-memory-range state base new-data)))
|
rlm@176
|
162 ([pokemon-num new-data]
|
rlm@189
|
163 (set-pokemon-record @current-state pokemon-num new-data)))
|
rlm@176
|
164
|
rlm@189
|
165 (defn print-pokemon-record
|
rlm@176
|
166 ([^SaveState state pokemon-num]
|
rlm@176
|
167 (assert (<= 0 pokemon-num 5))
|
rlm@189
|
168 (let [poke-data (pokemon-record state pokemon-num)
|
rlm@189
|
169 backbone (sort (keys pokemon-1-record))]
|
rlm@176
|
170 (println "Pokemon " pokemon-num " -- "
|
rlm@176
|
171 (nth (party-names state)
|
rlm@176
|
172 pokemon-num) \newline)
|
rlm@176
|
173
|
rlm@176
|
174 (println " Desc. | Hex | Dec | Binary |")
|
rlm@176
|
175 (println "-------------------+------+-----+----------+")
|
rlm@176
|
176 (dorun
|
rlm@176
|
177 (map
|
rlm@176
|
178 (comp println
|
rlm@176
|
179 (fn [desc data]
|
rlm@176
|
180 (format "%-16s | 0x%02X | %3d | %s |"
|
rlm@176
|
181 desc data data
|
rlm@176
|
182 (let [s (Integer/toBinaryString data)]
|
rlm@176
|
183 (apply
|
rlm@176
|
184 str
|
rlm@176
|
185 (concat (repeat (- 8 (count s)) "0" )
|
rlm@176
|
186 s))))))
|
rlm@189
|
187 (map pokemon-1-record backbone)
|
rlm@176
|
188 poke-data))))
|
rlm@176
|
189 ([pokemon-num]
|
rlm@189
|
190 (print-pokemon-record @current-state pokemon-num)))
|
rlm@190
|
191
|
rlm@190
|
192 (def mint-berry-item-code-gsc 0x54)
|
rlm@190
|
193
|
rlm@191
|
194 (defn pokemon-info
|
rlm@191
|
195 ([^SaveState state poke-num]
|
rlm@191
|
196 (assert (<= 0 poke-num 5))
|
rlm@191
|
197 (let [dv-values (read-DV state poke-num)
|
rlm@191
|
198 type (read-type state poke-num)
|
rlm@191
|
199 species (read-species state poke-num)
|
rlm@191
|
200 species2 (read-species2 state poke-num)
|
rlm@191
|
201 moves (read-moves state poke-num)
|
rlm@191
|
202 moves-pp (mapv (partial read-pp state
|
rlm@191
|
203 poke-num)
|
rlm@191
|
204 (range (count moves)))
|
rlm@191
|
205 nickname (pokemon-nickname state poke-num)
|
rlm@191
|
206 status (read-status state poke-num)
|
rlm@191
|
207 experience (read-experience state poke-num)
|
rlm@191
|
208 ]
|
rlm@190
|
209
|
rlm@191
|
210 {:name nickname
|
rlm@191
|
211 :species species
|
rlm@191
|
212 :species2 species2
|
rlm@191
|
213 :type type
|
rlm@191
|
214 :dv dv-values
|
rlm@191
|
215 :moves (zipmap moves moves-pp)
|
rlm@190
|
216
|
rlm@191
|
217 :satus status
|
rlm@191
|
218 :experience experience
|
rlm@191
|
219 }
|
rlm@191
|
220 ))
|
rlm@191
|
221 ([poke-num]
|
rlm@191
|
222 (pokemon-info @current-state poke-num)))
|
rlm@191
|
223
|