# HG changeset patch # User Robert McIntyre # Date 1333416602 18000 # Node ID 073600cba28ade48a4528506e19acdf4d56afba1 # Parent 8e63b0bb8ea376060fb78fa495a4a319fd62a9a0 scroll text works robustly but is slow diff -r 8e63b0bb8ea3 -r 073600cba28a clojure/com/aurellem/gb/saves.clj --- a/clojure/com/aurellem/gb/saves.clj Mon Apr 02 10:58:16 2012 -0500 +++ b/clojure/com/aurellem/gb/saves.clj Mon Apr 02 20:30:02 2012 -0500 @@ -11,5 +11,8 @@ (defn rlm-pallet-town [] (read-state "rlm-pallet-town")) +(defn talk-to-oak [] + (read-state "talk-to-oak")) - +(defn normal-conv [] + (read-state "normal-conversation")) \ No newline at end of file diff -r 8e63b0bb8ea3 -r 073600cba28a clojure/com/aurellem/gb/util.clj --- a/clojure/com/aurellem/gb/util.clj Mon Apr 02 10:58:16 2012 -0500 +++ b/clojure/com/aurellem/gb/util.clj Mon Apr 02 20:30:02 2012 -0500 @@ -147,10 +147,12 @@ (defn common-differences [& seqs] (let [backbone (range (count (first seqs)))] - (filter - (comp (partial apply distinct?) second) - (zipmap backbone - (apply (partial map list) seqs))))) + (sort-by + first + (filter + (comp (partial apply distinct?) second) + (zipmap backbone + (apply (partial map list) seqs)))))) (defn temporal-compare [& states] (apply common-differences diff -r 8e63b0bb8ea3 -r 073600cba28a clojure/com/aurellem/run/util.clj --- a/clojure/com/aurellem/run/util.clj Mon Apr 02 10:58:16 2012 -0500 +++ b/clojure/com/aurellem/run/util.clj Mon Apr 02 20:30:02 2012 -0500 @@ -1,5 +1,5 @@ (ns com.aurellem.run.util - (:use (com.aurellem.gb util gb-driver vbm characters)) + (:use (com.aurellem.gb util gb-driver vbm characters saves)) (:import [com.aurellem.gb.gb_driver SaveState])) (def ↑ [:u]) @@ -19,9 +19,8 @@ [(conj actions alt) alt-branch] (recur base-branch (conj actions base)))))) - (defn repeat-until-different - [buttons metric [moves root]] + [buttons metric [moves root :as script]] (let [baseline (metric root)] (loop [actions (vec moves) state root] @@ -31,8 +30,26 @@ [new-actions new-state] (recur new-actions new-state)))))) +(defn delayed-difference + [base alt delay difference-metric [moves root :as script]] + (loop [branch-point root + actions moves] + (let [base-branch (step branch-point base) + base-val + (difference-metric + (run-moves base-branch + (repeat delay base))) + alt-branch (step branch-point alt) + alt-val + (difference-metric + (run-moves alt-branch + (repeat delay base)))] + (if (not= base-val alt-val) + [(conj actions alt) alt-branch] + (recur base-branch (conj actions base)))))) + ;; (defn advance ;; ([base alt difference-metric [commands state]] ;; (let [[c s] @@ -70,32 +87,19 @@ (reduce (fn [script dir] (move dir script)) script directions)) -(defn scroll-text - ([script] - (advance [:b] [:a :b] script)) - ([n script] - (reduce (fn [script _] - (scroll-text script)) - script - (range n)))) - (defn menu [directions script] (reduce (fn [script direction] (move direction script)) script directions)) -(defn end-text [script] - (->> script - (scroll-text) - (play-moves [[] [:a]]))) (defn search-string - [array string] + [^SaveState state string] (let [codes (str->character-codes string) codes-length (count codes) - mem (vec array) + mem (vec (memory state)) mem-length (count mem)] (loop [idx 0] (if (< (- mem-length idx) codes-length) @@ -105,6 +109,50 @@ idx (recur (inc idx))))))) +(def text-address 0x9DC1) + +(defn displayed-text + ([^SaveState state] + (character-codes->str + (subvec (vec (memory state)) + text-address + (+ text-address 82)))) + ([] (displayed-text @current-state))) + +;; (defn scroll-text +;; ([script] +;; (first-difference [:b] [:a :b] AF script)) +;; ([n script] +;; (reduce (fn [script _] +;; (scroll-text script)) +;; script +;; (range n)))) + +(defn scroll-text + ([script] + (delayed-difference + [:b] [:a :b] 25 displayed-text script)) + ([n script] + (reduce (fn [script _] + (scroll-text script)) + script + (range n)))) + + +(defn end-text [script] + (->> script + (scroll-text) + (play-moves [[] [:a]]))) + + + +(common-differences + (vec (memory (step (talk-to-oak) [:a]))) + (vec (memory (step (talk-to-oak) [])))) + + + + (defn do-nothing [n script] (->> script diff -r 8e63b0bb8ea3 -r 073600cba28a save-states/normal-conversation.sav Binary file save-states/normal-conversation.sav has changed diff -r 8e63b0bb8ea3 -r 073600cba28a save-states/talk-to-oak.sav Binary file save-states/talk-to-oak.sav has changed