diff clojure/com/aurellem/gb/hxc.clj @ 285:33c546273619

Found the hardcoded pokedex order!! Added/modified a number of functions to take advantage of this new data.
author Dylan Holmes <ocsenave@gmail.com>
date Wed, 28 Mar 2012 05:56:37 -0500
parents 516acb83410f
children eec3e69500d9
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/gb/hxc.clj	Wed Mar 28 05:08:24 2012 -0500
     1.2 +++ b/clojure/com/aurellem/gb/hxc.clj	Wed Mar 28 05:56:37 2012 -0500
     1.3 @@ -213,11 +213,20 @@
     1.4    (hxc-thunk-words 0x27E77 196))
     1.5  
     1.6  
     1.7 -(def hxc-pokedex-text
     1.8 +(def hxc-pokedex-text*
     1.9    "The hardcoded pokedex entries in memory. List begins at
    1.10  ROM@B8000, shortly before move names."
    1.11    (hxc-thunk-words 0xB8000 14754))
    1.12  
    1.13 +(defn hxc-pokedex-text
    1.14 +  "The hardcoded pokedex entries in memory, presented as an
    1.15 +associative hash map. List begins at ROM@B8000."
    1.16 +  ([] (hxc-pokedex-text com.aurellem.gb.gb-driver/original-rom))
    1.17 +  ([rom]
    1.18 +     (zipmap
    1.19 +      (hxc-pokedex-names rom)
    1.20 +      (cons nil ;; for missingno.
    1.21 +            (hxc-pokedex-text* rom)))))
    1.22  
    1.23  ;; In red/blue, pokedex stats are in internal order.
    1.24  ;; In yellow, pokedex stats are in pokedex order.
    1.25 @@ -229,8 +238,9 @@
    1.26    ;; since hxc-pokenames includes several missingno"
    1.27    ([] (hxc-pokedex-stats com.aurellem.gb.gb-driver/original-rom))
    1.28    ([rom]
    1.29 -     (let [poketext (hxc-pokedex-text)
    1.30 +     (let [poketext (hxc-pokedex-text rom)
    1.31             pkmn-count (count poketext)
    1.32 +           pokedex-names (zipmap (range) (hxc-pokedex-names rom))
    1.33             ]
    1.34       ((fn capture-stats
    1.35          [n stats data]
    1.36 @@ -250,9 +260,9 @@
    1.37                    (split-with (partial not= 0x50) data)]
    1.38                (recur (dec n)
    1.39                       (assoc stats
    1.40 -                       (- pkmn-count n)
    1.41 +                       (pokedex-names (- pkmn-count (dec n)))
    1.42                         {:species
    1.43 -                        (character-codes->str species)
    1.44 +                        (format-name (character-codes->str species))
    1.45                          :height-ft
    1.46                          height-ft
    1.47                          :height-in
    1.48 @@ -393,7 +403,7 @@
    1.49  (defn hxc-pokenames
    1.50    "The hardcoded names of the 190 species in memory. List begins at
    1.51  ROM@E8000. Although names in memory are padded with 0x50 to be 10 characters
    1.52 -  long, these names are stripped of padding."
    1.53 +  long, these names are stripped of padding. See also, hxc-pokedex-names"
    1.54    ([]
    1.55       (hxc-pokenames com.aurellem.gb.gb-driver/original-rom))
    1.56    ([rom]
    1.57 @@ -408,6 +418,22 @@
    1.58  
    1.59  
    1.60  
    1.61 +(defn hxc-pokedex-names
    1.62 +  "The names of the pokemon in hardcoded pokedex order. List begins at
    1.63 +ROM@410B1. See also, hxc-pokenames."
    1.64 +  ([] (hxc-pokedex-names
    1.65 +       com.aurellem.gb.gb-driver/original-rom))
    1.66 +  ([rom]
    1.67 +     (let [names (hxc-pokenames rom)]
    1.68 +       (#(mapv %
    1.69 +               ((comp range count keys) %))
    1.70 +        (zipmap
    1.71 +         (take (count names)
    1.72 +               (drop 0x410b1 rom))
    1.73 +         
    1.74 +         (map format-name names))))))
    1.75 +
    1.76 +
    1.77  
    1.78  (defn internal-id
    1.79    ([rom]
    1.80 @@ -416,7 +442,9 @@
    1.81        (range)))
    1.82    ([]
    1.83       (internal-id com.aurellem.gb.gb-driver/original-rom)))
    1.84 -  
    1.85 +
    1.86 +
    1.87 +
    1.88  
    1.89  
    1.90  ;; nidoran gender change upon levelup
    1.91 @@ -597,6 +625,7 @@
    1.92    ([rom]
    1.93       (let [entry-size 28
    1.94             pkmn-count (count (hxc-pokedex-text rom))
    1.95 +           pokemon (rest (hxc-pokedex-names))
    1.96             types (apply assoc {}
    1.97                          (interleave
    1.98                           (range)
    1.99 @@ -607,87 +636,88 @@
   1.100                           (map format-name
   1.101                                (hxc-move-names rom))))
   1.102             ]
   1.103 -       (map
   1.104 -        
   1.105 -        (fn [[n
   1.106 -              rating-hp
   1.107 -              rating-atk
   1.108 -              rating-def
   1.109 -              rating-speed
   1.110 -              rating-special
   1.111 -              type-1
   1.112 -              type-2
   1.113 -              rarity
   1.114 -              rating-xp
   1.115 -              pic-dimensions ;; tile_width|tile_height (8px/tile)
   1.116 -              ptr-pic-obverse-1
   1.117 -              ptr-pic-obverse-2
   1.118 -              ptr-pic-reverse-1
   1.119 -              ptr-pic-reverse-2
   1.120 -              move-1
   1.121 -              move-2
   1.122 -              move-3
   1.123 -              move-4
   1.124 -              growth-rate
   1.125 -              &
   1.126 -              TMs|HMs]]
   1.127 -          (let
   1.128 -              [base-moves
   1.129 -               (mapv moves
   1.130 -                ((comp
   1.131 -                  ;; since the game uses zero as a delimiter,
   1.132 -                  ;; it must also increment all move indices by 1.
   1.133 -                  ;; heren we decrement to correct this.
   1.134 -                  (partial map dec)
   1.135 -                  (partial take-while (comp not zero?)))
   1.136 -                 [move-1 move-2 move-3 move-4]))
   1.137 -
   1.138 -               types
   1.139 -               (set (list (types type-1)
   1.140 -                          (types type-2)))
   1.141 -               TMs|HMs
   1.142 -               (map
   1.143 -                (comp
   1.144 -                 (partial map first)
   1.145 -                 (partial remove (comp zero? second)))
   1.146 -                (split-at
   1.147 -                 50
   1.148 -                 (map vector
   1.149 -                      (rest(range))
   1.150 -                      (reduce concat
   1.151 -                              (map
   1.152 -                               #(take 8
   1.153 -                                      (concat (bit-list %)
   1.154 -                                              (repeat 0)))
   1.155 -                               
   1.156 +       (zipmap
   1.157 +        pokemon
   1.158 +        (map
   1.159 +         (fn [[n
   1.160 +               rating-hp
   1.161 +               rating-atk
   1.162 +               rating-def
   1.163 +               rating-speed
   1.164 +               rating-special
   1.165 +               type-1
   1.166 +               type-2
   1.167 +               rarity
   1.168 +               rating-xp
   1.169 +               pic-dimensions ;; tile_width|tile_height (8px/tile)
   1.170 +               ptr-pic-obverse-1
   1.171 +               ptr-pic-obverse-2
   1.172 +               ptr-pic-reverse-1
   1.173 +               ptr-pic-reverse-2
   1.174 +               move-1
   1.175 +               move-2
   1.176 +               move-3
   1.177 +               move-4
   1.178 +               growth-rate
   1.179 +               &
   1.180 +               TMs|HMs]]
   1.181 +           (let
   1.182 +               [base-moves
   1.183 +                (mapv moves
   1.184 +                      ((comp
   1.185 +                        ;; since the game uses zero as a delimiter,
   1.186 +                        ;; it must also increment all move indices by 1.
   1.187 +                        ;; heren we decrement to correct this.
   1.188 +                        (partial map dec)
   1.189 +                        (partial take-while (comp not zero?)))
   1.190 +                       [move-1 move-2 move-3 move-4]))
   1.191 +                
   1.192 +                types
   1.193 +                (set (list (types type-1)
   1.194 +                           (types type-2)))
   1.195 +                TMs|HMs
   1.196 +                (map
   1.197 +                 (comp
   1.198 +                  (partial map first)
   1.199 +                  (partial remove (comp zero? second)))
   1.200 +                 (split-at
   1.201 +                  50
   1.202 +                  (map vector
   1.203 +                       (rest(range))
   1.204 +                       (reduce concat
   1.205 +                               (map
   1.206 +                                #(take 8
   1.207 +                                       (concat (bit-list %)
   1.208 +                                               (repeat 0)))
   1.209 +                                
   1.210                                  TMs|HMs)))))
   1.211 -               
   1.212 -               TMs  (vec (first TMs|HMs))
   1.213 -               HMs (take 5 (map (partial + -50) (vec (second TMs|HMs))))
   1.214 -
   1.215 -               
   1.216 -               ]
   1.217 -
   1.218 -          
   1.219 -          {:dex# n
   1.220 -           :base-moves base-moves
   1.221 -           :types types
   1.222 -           :TMs TMs
   1.223 -           :HMs HMs
   1.224 -           :base-hp rating-hp
   1.225 -           :base-atk rating-atk
   1.226 -           :base-def rating-def
   1.227 -           :base-speed rating-speed
   1.228 -           :base-special rating-special
   1.229 -           }))
   1.230 -              
   1.231 -             (partition entry-size
   1.232 -                        (take (* entry-size pkmn-count)
   1.233 -                              (drop 0x383DE
   1.234 -                                    rom)))))))
   1.235 -                       
   1.236 -
   1.237 -
   1.238 +                
   1.239 +                TMs  (vec (first TMs|HMs))
   1.240 +                HMs (take 5 (map (partial + -50) (vec (second TMs|HMs))))
   1.241 +                
   1.242 +                
   1.243 +                ]
   1.244 +             
   1.245 +             
   1.246 +             {:dex# n
   1.247 +              :base-moves base-moves
   1.248 +              :types types
   1.249 +              :TMs TMs
   1.250 +              :HMs HMs
   1.251 +              :base-hp rating-hp
   1.252 +              :base-atk rating-atk
   1.253 +              :base-def rating-def
   1.254 +              :base-speed rating-speed
   1.255 +              :base-special rating-special
   1.256 +              }))
   1.257 +         
   1.258 +         (partition entry-size
   1.259 +                    (take (* entry-size pkmn-count)
   1.260 +                          (drop 0x383DE
   1.261 +                                rom))))))))
   1.262 +  
   1.263 +  
   1.264 +  
   1.265  (defn hxc-item-prices
   1.266    "The hardcoded list of item prices in memory. List begins at ROM@4495"
   1.267    ([] (hxc-item-prices com.aurellem.gb.gb-driver/original-rom))
   1.268 @@ -742,6 +772,15 @@
   1.269  ;; ********************** MANIPULATION FNS
   1.270  
   1.271  
   1.272 +(defn same-type
   1.273 +  ([pkmn move]
   1.274 +     (same-type?
   1.275 +      com.aurellem.gb.gb-driver/original-rom pkmn move))
   1.276 +  ([rom pkmn move]
   1.277 +     (((comp :types (hxc-pokemon-base rom)) pkmn)
   1.278 +      ((comp :type (hxc-move-data rom)) move))))
   1.279 +
   1.280 +
   1.281  
   1.282  
   1.283  (defn submap?
   1.284 @@ -792,28 +831,6 @@
   1.285  
   1.286  
   1.287  
   1.288 -
   1.289 -;; (def dex-order
   1.290 -;;   [:bulbasaur
   1.291 -;;    :ivysaur
   1.292 -;;    :venusaur
   1.293 -;;    :charmander
   1.294 -;;    :charmeleon
   1.295 -;;    :charizard])
   1.296 -  
   1.297 -
   1.298 -;; (defn same-type-attack-bonus?
   1.299 -;;   ([pkmn move]
   1.300 -;;      (same-type-attack-bonus?
   1.301 -;;       com.aurellem.gb.gb-driver/original-rom pkmn move))
   1.302 -;;   ([rom pkmn move]
   1.303 -;;      (hxc-pokemon-base rom)))
   1.304 -
   1.305 -
   1.306 -
   1.307 -
   1.308 -
   1.309 -
   1.310  (comment 
   1.311  
   1.312  (def hxc-later