rlm@176: (ns com.aurellem.gb.dv rlm@176: (:use (com.aurellem.gb gb-driver util constants)) rlm@176: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@176: rlm@176: (def pokemon-1-DV-start 0xD185) rlm@176: rlm@176: (defn pokemon-DV-start-point [poke-num] rlm@176: (+ (* poke-num pokemon-record-width) rlm@176: pokemon-1-DV-start)) rlm@176: rlm@176: (defn read-DV rlm@176: ([^SaveState state poke-num] rlm@176: (assert (<= 0 poke-num 5)) rlm@176: (let [[raw-DV-1 rlm@176: raw-DV-2] rlm@176: (subvec (vec (memory state)) rlm@176: (pokemon-DV-start-point poke-num) rlm@176: (+ 2 (pokemon-DV-start-point poke-num))) rlm@176: defense-DV (bit-and raw-DV-1 0x0F) rlm@176: attack-DV (bit-shift-right rlm@176: (bit-and raw-DV-1 0xF0) rlm@176: 4) rlm@176: special-DV (bit-and raw-DV-2 0x0F) rlm@176: speed-DV (bit-shift-right rlm@176: (bit-and raw-DV-2 0xF0) rlm@176: 4) rlm@176: HP-DV rlm@176: (+ rlm@176: (if (bit-test special-DV 0) 1 0) rlm@176: (if (bit-test speed-DV 0) 2 0) rlm@176: (if (bit-test defense-DV 0) 4 0) rlm@176: (if (bit-test attack-DV 0) 8 0))] rlm@176: {:attack attack-DV rlm@176: :defense defense-DV rlm@176: :speed speed-DV rlm@176: :special special-DV rlm@176: :hp HP-DV})) rlm@176: ([poke-num] rlm@176: (read-DV @current-state poke-num))) rlm@176: rlm@176: rlm@176: (defn give-DV rlm@176: ([^SaveState state poke-num dv-values] rlm@176: rlm@176: (assert (<= 0 poke-num 5)) rlm@176: (map #(assert (<= 0 % 15)) (vals dv-values)) rlm@176: (let [raw-dv-1* rlm@176: (+ (:defense dv-values) rlm@176: (bit-shift-left (:attack dv-values) 4)) rlm@176: raw-dv-2* rlm@176: (+ (:special dv-values) rlm@176: (bit-shift-left (:speed dv-values) 4)) rlm@176: hp-dv (:hp dv-values) rlm@176: hp-masks-1 rlm@176: [[0 (bit-test hp-dv 2)] rlm@176: [4 (bit-test hp-dv 3)]] rlm@176: hp-masks-2 rlm@176: [[0 (bit-test hp-dv 0)] rlm@176: [4 (bit-test hp-dv 1)]] rlm@176: set-hp-bits rlm@176: (fn [init [index hp?]] rlm@176: (if hp? rlm@176: (bit-set init index) rlm@176: (bit-clear init index))) rlm@176: rlm@176: raw-dv-1 (reduce set-hp-bits raw-dv-1* rlm@176: hp-masks-1) rlm@176: rlm@176: raw-dv-2 (reduce set-hp-bits raw-dv-2* rlm@176: hp-masks-2) rlm@176: rlm@176: dv-start (pokemon-DV-start-point poke-num)] rlm@176: rlm@176: (if (or (not= raw-dv-1* raw-dv-1) rlm@176: (not= raw-dv-2* raw-dv-2)) rlm@176: (println "Warning: inconsistent DV-values." rlm@176: "Using HP settings.")) rlm@176: rlm@176: (set-memory rlm@176: (set-memory state dv-start raw-dv-1) rlm@176: (inc dv-start) raw-dv-2))) rlm@176: ([poke-num dv-values] rlm@176: (give-DV @current-state poke-num dv-values))) rlm@176: rlm@176: (def good-DVs rlm@176: {:attack 15 rlm@176: :defense 15 rlm@176: :speed 15 rlm@176: :special 15 rlm@176: :hp 15}) rlm@176: rlm@176: (def bad-DVs rlm@176: {:attack 0 rlm@176: :defense 0 rlm@176: :speed 0 rlm@176: :special 0 rlm@176: :hp 0})