rlm@180: (ns com.aurellem.gb.types rlm@180: (:use (com.aurellem.gb gb-driver util constants)) rlm@180: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@180: rlm@180: (def type-code->type-name rlm@180: {0x00 :normal rlm@180: 0x01 :fighting rlm@180: 0x02 :flying rlm@180: 0x03 :poision rlm@180: 0x04 :ground rlm@180: 0x05 :rock rlm@180: 0x07 :bug rlm@180: 0x08 :ghost rlm@180: 0x14 :fire rlm@180: 0x15 :water rlm@180: 0x16 :grass rlm@180: 0x17 :electric rlm@180: 0x18 :psychic rlm@180: 0x19 :ice rlm@180: 0x1A :dragon}) rlm@180: rlm@180: (def type-name->type-code rlm@180: (zipmap (vals type-code->type-name) rlm@180: (keys type-code->type-name))) rlm@180: rlm@180: (def pokemon-1-types-start-address 0xD16F) rlm@180: rlm@180: (defn pokemon-type-start-address [poke-num] rlm@180: (+ pokemon-1-types-start-address rlm@180: (* pokemon-record-width poke-num))) rlm@180: rlm@180: (defn give-type rlm@180: ([^SaveState state poke-num types] rlm@180: (assert (<= 0 poke-num 5)) rlm@180: (let [types* rlm@180: (if (= (count types) 1) rlm@180: [(first types) (first types)] rlm@180: types)] rlm@180: (set-memory-range rlm@180: state rlm@180: (pokemon-type-start-address poke-num) rlm@180: (map type-name->type-code types)))) rlm@180: ([poke-num types] rlm@180: (give-type @current-state poke-num types))) rlm@180: rlm@180: (defn read-types rlm@180: ([^SaveState state poke-num] rlm@180: (assert (<= 0 poke-num 5)) rlm@180: (let [types-start (pokemon-type-start-address poke-num) rlm@180: [type-1 type-2] rlm@180: (subvec (vec (memory state)) rlm@180: types-start (+ 2 types-start))] rlm@180: (if (= type-1 type-2) rlm@180: [(type-code->type-name type-1)] rlm@180: (mapv type-code->type-name [type-1 type-2])))) rlm@180: ([poke-num] rlm@180: (read-types @current-state poke-num))) rlm@180: