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@192: start (+ experience-record-width start))] rlm@192: {:main-exp (glue-bytes exp-h exp-m exp-l) rlm@192: :hp-exp (glue-bytes hp-exp-h hp-exp-l) rlm@192: :attack-exp (glue-bytes attack-exp-h attack-exp-l) rlm@192: :defense-exp (glue-bytes defense-exp-h defense-exp-l) rlm@192: :speed-exp (glue-bytes speed-exp-h speed-exp-l) rlm@192: :special-exp (glue-bytes special-exp-h special-exp-l)})) rlm@192: ([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@192: (let [exp* (merge (read-experience state poke-num) exp) rlm@191: raw-exp-data rlm@191: (flatten rlm@192: [(disect-bytes-3 (:main-exp exp*)) rlm@192: (disect-bytes-2 (:hp-exp exp*)) rlm@192: (disect-bytes-2 (:attack-exp exp*)) rlm@192: (disect-bytes-2 (:defense-exp exp*)) rlm@192: (disect-bytes-2 (:speed-exp exp*)) rlm@192: (disect-bytes-2 (: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)))