rlm@191: (ns com.aurellem.gb.experience rlm@191: (:use (com.aurellem.gb gb-driver util constants)) rlm@191: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@191: rlm@191: (def experience-pokemon-1 0xD178) rlm@191: rlm@191: (defn experience-start-address [poke-num] rlm@191: (+ experience-pokemon-1 rlm@191: (* pokemon-record-width poke-num))) rlm@191: rlm@191: (def experience-record-width 13) rlm@191: rlm@191: (defn read-experience rlm@191: ([^SaveState state poke-num] rlm@191: (let [start (experience-start-address poke-num) rlm@191: [exp-h rlm@191: exp-m rlm@191: exp-l rlm@191: hp-exp-h rlm@191: hp-exp-l rlm@191: attack-exp-h rlm@191: attack-exp-l rlm@191: defense-exp-h rlm@191: defense-exp-l rlm@191: speed-exp-h rlm@191: speed-exp-l rlm@191: special-exp-h rlm@191: special-exp-l] rlm@191: (subvec (vec (memory state)) rlm@191: start (+ experience-record-width start)) rlm@191: glue-bytes (fn [l h] rlm@191: (+ l (bit-shift-left h 8)))] rlm@191: {:main-exp (+ (glue-bytes exp-l exp-m) rlm@191: (bit-shift-left exp-h 16)) rlm@191: :hp-exp (glue-bytes hp-exp-l hp-exp-h) rlm@191: :attack-exp (glue-bytes attack-exp-l attack-exp-h) rlm@191: :defense-exp (glue-bytes defense-exp-l defense-exp-h) rlm@191: :speed-exp (glue-bytes speed-exp-l speed-exp-h) rlm@191: :special-exp (glue-bytes special-exp-l special-exp-h)})) rlm@191: ([poke-num] rlm@191: (read-experience @current-state poke-num))) rlm@191: rlm@191: (defn give-experience rlm@191: ([^SaveState state poke-num exp] rlm@191: (let [exp* (merge (read-experience state poke-num) rlm@191: exp) rlm@191: rlm@191: disect-bytes rlm@191: (fn [exp] rlm@191: [(bit-shift-right rlm@191: (bit-and exp 0xFF00) 8) rlm@191: (bit-and exp 0xFF)]) rlm@191: rlm@191: raw-exp-data rlm@191: (flatten rlm@191: [(bit-shift-right (bit-and (:main-exp exp*) 0xFF0000) 16) rlm@191: (disect-bytes (:main-exp exp*)) rlm@191: (disect-bytes (:hp-exp exp*)) rlm@191: (disect-bytes (:attack-exp exp*)) rlm@191: (disect-bytes (:defense-exp exp*)) rlm@191: (disect-bytes (:speed-exp exp*)) rlm@191: (disect-bytes (:special-exp exp*))])] rlm@191: (set-memory-range state rlm@191: (experience-start-address poke-num) rlm@191: raw-exp-data))) rlm@191: ([poke-num exp] rlm@191: (give-experience @current-state poke-num exp)))