Mercurial > vba-clojure
view clojure/com/aurellem/run/bootstrap_1.clj @ 345:3b3cd62b6106
script: made it to cereulean with TM55s worth 2 million.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sun, 08 Apr 2012 20:58:14 -0500 |
parents | |
children | a6a123af22f6 |
line wrap: on
line source
1 (ns com.aurellem.run.bootstrap-12 (:use (com.aurellem.gb saves gb-driver util3 items vbm characters money))4 (:use (com.aurellem.run util title save-corruption bootstrap-0))5 (:use (com.aurellem.exp item-bridge))6 (:import [com.aurellem.gb.gb_driver SaveState]))8 (defn pc-item-writer-program9 []10 (let [limit 20111 [target-high target-low] (disect-bytes-2 0xD162)]12 (flatten13 [[0x00 ;; (item-hack) set increment stack pointer no-op14 0x1E ;; load limit into E15 limit16 0x3F ;; (item-hack) set carry flag no-op18 ;; load 2 into C.19 0x0E ;; C == 1 means input-first nybble20 0x04 ;; C == 0 means input-second nybble22 0x21 ;; load target into HL23 target-low24 target-high25 0x37 ;; (item-hack) set carry flag no-op27 0x00 ;; (item-hack) no-op28 0x37 ;; (item-hack) set carry flag no-op30 0x00 ;; (item-hack) no-op31 0xF3 ;; disable interrupts32 ;; Input Section34 0x3E ;; load 0x20 into A, to measure buttons35 0x1037 0x00 ;; (item-hack) no-op38 0xE0 ;; load A into [FF00]39 0x0041 0xF0 ;; load 0xFF00 into A to get42 0x00 ;; button presses44 0xE645 0x0F ;; select bottom four bits of A46 0x37 ;; (item-hack) set carry flag no-op48 0x00 ;; (item-hack) no-op49 0xB8 ;; see if input is different (CP A B)51 0x00 ;; (item-hack) (INC SP)52 0x28 ;; repeat above steps if input is not different53 ;; (jump relative backwards if B != A)54 0xED ;; (literal -19) (item-hack) -19 == egg bomb (TM37)56 0x47 ;; load A into B58 0x0D ;; dec C59 0x37 ;; (item-hack) set-carry flag60 ;; branch based on C:61 0x20 ;; JR NZ62 23 ;; skip "input second nybble" and "jump to target" below64 ;; input second nybble66 0x0C ;; inc C67 0x0C ;; inc C69 0x00 ;; (item-hack) no-op70 0xE6 ;; select bottom bits71 0x0F72 0x37 ;; (item-hack) set-carry flag no-op74 0x00 ;; (item-hack) no-op75 0xB2 ;; (OR A D) -> A77 0x22 ;; (do (A -> (HL)) (INC HL))79 0x1D ;; (DEC E)81 0x00 ;; (item-hack)82 0x20 ;; jump back to input section if not done83 0xDA ;; literal -36 == TM 18 (counter)84 0x01 ;; (item-hack) set BC to literal (no-op)86 ;; jump to target87 0x00 ;; (item-hack) these two bytes can be anything.88 0x0190 0x00 ;; (item-hack) no-op91 0xBF ;; (CP A A) ensures Z93 0xCA ;; (item-hack) jump if Z94 target-low95 target-high96 0x01 ;; (item-hack) will never be reached.98 ;; input first nybble99 0x00100 0xCB101 0x37 ;; swap nybbles on A103 0x57 ;; A -> D105 0x37 ;; (item-hack) set carry flag no-op106 0x18 ;; relative jump backwards107 0xCD ;; literal -51 == TM05; go back to input section108 0x01 ;; (item-hack) will never reach this instruction110 ]111 (repeat 8 [0xFF 0x01])113 [;; jump to actual program114 0x00115 0x37 ;; (item-hack) set carry flag no-op117 0x2E ;; 0x3A -> L118 0x3A121 0x00 ;; (item-hack) no-op122 0x26 ;; 0xD5 -> L123 0xD5124 0x01 ;; (item-hack) set-carry BC126 0x00 ;; (item-hack) these can be anything127 0x01129 0x00130 0xE9 ;; jump to (HL)131 ]])))133 (defn view-desired-item-layout []134 (clojure.pprint/pprint135 (raw-inventory->inventory (pc-item-writer-program))))137 (defn pc-item-writer-state []138 (-> (read-state "bootstrap-init")139 (set-memory pc-item-list-start 50)140 (set-memory-range141 map-function-address-start142 [0x8B 0xD5])143 (set-memory-range144 (inc pc-item-list-start)145 (pc-item-writer-program))))147 (defn test-pc-item-writer []148 (let [orig (read-state "pc-item-writer")]149 (-> orig150 (print-listing 0xD162 (+ 0xD162 20))151 (run-moves (reduce concat152 (repeat 10 [[:a :b :start :select] []])))153 ((fn [_] (println "===========") _))154 (print-listing 0xD162 (+ 0xD162 20)))))156 (defn close-all-menus [[moves state :as script]]157 (loop [s script]158 (let [depth (current-depth (second (do-nothing 50 s)))]159 (println "depth" depth)160 (if (= depth 1)161 s162 (recur (close-menu s))))))164 (defn-memo name-rival165 ([] (name-rival (to-rival-name)))166 ([script]167 (->> script168 (first-difference [] [:a] AF)169 (first-difference [] [:r] DE)170 (play-moves171 [[]172 [] [] [:r] [] [:d] [:a] ;; L173 [:r] [] [:r] [] [:r] [] [:r] []174 [:r] [] [:d] [] [:d] [:a] ;; [PK]175 [:d] [] [:r] [:a]176 ]))))178 (defn-memo to-room-pc179 ([] (to-room-pc (name-rival)))180 ([script]181 (->> script182 finish-title183 (walk [← ← ↑ ← ↑ ↑ ↑]))))185 (defn-memo bootstrap-corrupt-save186 ([] (bootstrap-corrupt-save (to-room-pc)))187 ([script]188 (->> script189 (do-save-corruption 2)190 (corrupt-item-list 0)191 close-all-menus)))193 (defn-memo begin-initial-deposits194 ([] (begin-initial-deposits195 (bootstrap-corrupt-save)))196 ([script]197 (->> script198 (first-difference [] [:a] AF)199 (scroll-text)200 (set-cursor 1)201 select-menu-entry)))203 (defn deposit-held-item [n quantity [moves state :as script]]204 (let [total-quantity (second (nth-item state n))]205 (println "total-quantity" total-quantity)206 (->> script207 (set-cursor n)208 (select-menu-entry 1)209 ((fn [[moves state :as script]]210 (if (not= (item-quantity-selected state) 1)211 (repeat-until-different [] item-quantity-selected script)212 script)))213 (set-quantity total-quantity quantity)214 (delayed-difference [] [:a] 100 #(search-string % "stored"))215 (scroll-text))))217 (defn widthdraw-pc-item [n quantity [moves state :as script]]218 (let [total-quantity (second (nth-pc-item state n))]219 (->> script220 (set-cursor n)221 (select-menu-entry 1)222 ((fn [[moves state :as script]]223 (if (not= (item-quantity-selected state) 1)224 (repeat-until-different [] item-quantity-selected225 script)226 script)))227 (set-quantity total-quantity quantity)228 (delayed-difference [] [:a] 100 #(search-string % "Withdrew"))229 (scroll-text))))231 (defn toss-held-item [n quantity [moves state :as script]]232 (let [total-quantity (second (nth-item state n))]233 (->> script234 (set-cursor n)235 (select-menu-entry 1)236 (set-cursor-relative 1)237 (select-menu-entry -1)238 ((fn [[moves state :as script]]239 (if (not= (item-quantity-selected state) 1)240 (repeat-until-different [] item-quantity-selected241 script)242 script)))243 (set-quantity total-quantity quantity)244 (play-moves [[:a]])245 (scroll-text)246 (delayed-difference [] [:a] 100 #(search-string % "Threw"))247 (scroll-text)248 )))251 (def desired-zero-quantities252 (map second (filter (comp (partial = 0) first)253 (partition 2 (pc-item-writer-program)))))255 (defn-memo initial-deposits256 ([] (initial-deposits (begin-initial-deposits)))257 ([script]258 (->> script259 (deposit-held-item 0 0xFE)260 (deposit-held-item 1 0xFE)261 ((fn [script]262 (reduce263 (fn [script item] (deposit-held-item item 0xFF script))264 script265 (range 2 (+ 12 2)))))266 close-all-menus)))269 (defn-memo prepare-celadon-warp270 ([] (prepare-celadon-warp (initial-deposits)))271 ([script]272 (->> script273 (activate-start-menu)274 (set-cursor-relative 1)275 (select-menu-entry)276 (toss-held-item 35 0xFA)277 (close-all-menus))))280 ;;0 -- 256281 ;;1 -- 254282 ;;2 -- 254283 ;;3 -- 255285 (defn-memo restore-items286 ([] (restore-items (prepare-celadon-warp)))287 ([script]288 (->> script289 (first-difference [] [:a] AF)290 (scroll-text)291 (select-menu-entry)292 (widthdraw-pc-item 0 1)293 (widthdraw-pc-item 3 99)294 (widthdraw-pc-item 3 99)295 (widthdraw-pc-item 3 57)296 (widthdraw-pc-item 2 99)297 (widthdraw-pc-item 2 99)298 (widthdraw-pc-item 2 56)299 (widthdraw-pc-item 1 99)300 (widthdraw-pc-item 1 99)301 (widthdraw-pc-item 1 56)302 (widthdraw-pc-item 0 99)303 (widthdraw-pc-item 0 99)304 (widthdraw-pc-item 0 57)305 (close-all-menus))))307 (defn-memo to-celadon308 ([] (to-celadon (restore-items)))309 ([script]310 (->> script311 (walk [→ → → → → → → ↑312 ↓ ↓ ↓ ↓ ↓ ← ← ← ←313 ↓ ↓]))))