ocsenave@185: (ns com.aurellem.world.practice ocsenave@185: (:use (com.aurellem.gb saves util constants gb-driver vbm items ocsenave@194: assembly characters)) ocsenave@185: (:use (com.aurellem.run title save-corruption)) ocsenave@185: ;;(:use (com.aurellem.exp pokemon)) ocsenave@185: (:use (com.aurellem.exp item-bridge)) ocsenave@194: (:import [com.aurellem.gb.gb_driver SaveState]) ocsenave@194: ocsenave@194: ) ocsenave@185: ocsenave@185: (def hex-pc (comp hex PC)) ocsenave@185: ocsenave@194: (defn nstep [state n] ocsenave@194: (if (zero? n) state ocsenave@194: (recur (step state) (dec n)))) ocsenave@185: ocsenave@185: ocsenave@185: (defn view-memory* [state start length] ocsenave@185: ((comp vec map) ocsenave@194: #((comp aget) (memory state) %) ocsenave@185: (range start (+ start length)))) ocsenave@185: ocsenave@185: ocsenave@185: (defn state-surprise ocsenave@185: "This is one tick before the trainer goes [!]" ocsenave@185: [] ocsenave@185: (-> ocsenave@185: (pre-trainer-battle) ocsenave@185: (step [:r]) ocsenave@185: (step) ocsenave@185: (ntick 88147) ocsenave@185: ;(step [:r]) ocsenave@185: ocsenave@185: ;(step [:r]) ocsenave@185: ;(step [:r]) ocsenave@185: ;(step [:r]) ocsenave@185: ;(step [:r]) ocsenave@185: )) ocsenave@194: (defn state-inject ocsenave@194: "I have replaced the letter e with e-acute @ 0xC4E8." ocsenave@194: [] ocsenave@194: (read-state "inject-surprise")) ocsenave@185: ocsenave@185: ocsenave@185: ocsenave@185: ocsenave@194: (defn pc-trail ocsenave@194: "Track the PC for a number of ticks." ocsenave@194: [state ticks] ocsenave@194: (tick state) ocsenave@194: (set-state! state) ocsenave@194: (loop [pcs [(PC)] ] ocsenave@194: (if (> (count pcs) ticks) pcs ocsenave@194: (do ocsenave@194: (com.aurellem.gb.Gb/tick) ocsenave@194: (recur (conj pcs (PC))))))) ocsenave@185: ocsenave@185: ocsenave@185: ocsenave@194: (defn differences [list-1 list-2] ocsenave@194: (remove ocsenave@194: (fn [[a b c]] (= b c)) ocsenave@194: (map vector ocsenave@194: (range) ocsenave@194: list-1 ocsenave@194: list-2))) ocsenave@194: ocsenave@194: (defn pc-diff [state-1 state-2] ocsenave@194: (differences (map hex (pc-trail state-1 10000)) ocsenave@194: (map hex (pc-trail state-2 10000)))) ocsenave@194: ocsenave@194: ocsenave@194: (defn memory-diff [state-1 state-2] ocsenave@194: (remove ocsenave@194: (fn[[a b c]] (= b c)) ocsenave@194: (map (comp vec (partial map hex) list) ocsenave@194: (range) ocsenave@194: (vec (memory state-1)) ocsenave@194: (vec (memory state-2))) ocsenave@194: ) ocsenave@194: ) ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: (defn state-speak ocsenave@194: "This is when the trainer speaks." ocsenave@194: [] ocsenave@194: (-> ocsenave@194: (pre-trainer-battle) ocsenave@194: (set-memory 0xD354 0x0) ocsenave@194: (step [:r]) ocsenave@194: (step) ocsenave@194: (ntick 88147) ocsenave@194: (tick) ocsenave@194: (nstep 102) ocsenave@194: ocsenave@194: ;(step [:r]) ocsenave@194: ocsenave@194: ;(step [:r]) ocsenave@194: ;(step [:r]) ocsenave@194: ;(step [:r]) ocsenave@194: ;(step [:r]) ocsenave@194: )) ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: (defn get-memory [state n] ocsenave@194: (aget (memory state) n)) ocsenave@194: ocsenave@194: (defn first-change ocsenave@194: "Watch the current memory location as it ticks, ocsenave@194: return the first state that differs at location mem." ocsenave@194: [state n] ocsenave@194: (tick state) ocsenave@194: (set-state! state) ocsenave@194: (let [init (aget (memory state) n)] ocsenave@194: (loop [] ocsenave@194: (if (= (aget (memory) n) init) ocsenave@194: (do ocsenave@194: (com.aurellem.gb.Gb/tick) ocsenave@194: (recur)))) ocsenave@194: (update-state))) ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: (defn spell [state mem n] ocsenave@194: (print (character-codes->str ocsenave@194: (take n (drop mem ocsenave@194: (vec(memory state))))))) ocsenave@194: ocsenave@194: ocsenave@194: (do ocsenave@194: (println) ocsenave@194: (print (character-codes->str (take 6000 (drop 0xA75F4 ocsenave@194: (vec(com.aurellem.gb.gb-driver/rom)))))) ocsenave@194: ) ocsenave@194: ocsenave@194: ;(dorun (map println (view-memory* (state-surprise) 0x1AEF 1600))) ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: (def surprise-words ocsenave@194: [0x80 0xAB 0xAB 0x7F 0xB1 0xA8 0xA6 0xA7 0xB3 0xE7 0x7F 0x8B 0xA4 0xB3 0xE0 0xB2 0x7F 0xB1 0xAE 0xAB 0xAB 0x7F 0xB3 0xA7 0xA4 0x7F 0xA3 0xA8 0xA2 0xA4 0xE7]) ocsenave@194: ocsenave@194: (defn sublist ocsenave@194: "Unshifts the list until the sublist is at the start." ocsenave@194: [list sub] ocsenave@194: (cond ocsenave@194: (empty? sub) list ocsenave@194: (empty? list) nil ocsenave@194: (= (take (count sub) list) sub) list ocsenave@194: :else (recur (rest list) sub))) ocsenave@194: ocsenave@194: (defn subloc ocsenave@194: "Returns the position of the first occurence of sublist." ocsenave@194: [list sub] ocsenave@194: (loop [n 0 a list] ocsenave@194: (cond ocsenave@194: (empty? a) nil ocsenave@194: (= (take (count sub) a) sub) n ocsenave@194: :else (recur (inc n) (rest a))))) ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: (defn change-speech ocsenave@194: ([state str k] ocsenave@194: (loop [ops str ocsenave@194: s state ocsenave@194: n k] ocsenave@194: (if (empty? ops) s ocsenave@194: (recur ocsenave@194: (rest ops) ocsenave@194: (set-memory (first-change s (+ 0xC4B9 n)) (+ 0xC4B9 n) ocsenave@194: (first ops)) ocsenave@194: (if (not= n 19) (inc n) ocsenave@194: (+ n 21)))))) ocsenave@194: ([str k] ocsenave@194: (change-speech (state-speak) str k)) ocsenave@194: ([str] ocsenave@194: (change-speech str 0)) ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: ocsenave@194: ) ocsenave@194: