rlm@98: (ns com.aurellem.items rlm@98: (:use (com.aurellem gb-driver vbm title)) rlm@99: ;; this is bullshit rlm@98: (:import [com.aurellem.gb_driver SaveState])) rlm@98: rlm@98: (defn game-name [] rlm@98: (map char (subvec (vec (memory)) 0x134 0x142))) rlm@98: rlm@99: (def item-list-start 0xD31C) rlm@98: rlm@99: (defn item-list [^SaveState state] rlm@99: (subvec rlm@99: (vec (memory state)) rlm@99: item-list-start rlm@100: (+ item-list-start 150))) rlm@98: rlm@98: (def item-hack-3 (read-state 77557)) rlm@98: rlm@99: (def item-code->item-name rlm@99: (hash-map rlm@99: 1 :master-ball rlm@99: 2 :ultra-ball rlm@99: 3 :great-ball rlm@99: 4 :poke-ball rlm@99: 5 :town-map rlm@99: 6 :bicycle rlm@99: 8 :safari-ball rlm@99: 9 :pokedex rlm@99: 10 :moon-stone rlm@99: 11 :antidote rlm@99: 12 :burn-heal rlm@99: 13 :ice-heal rlm@99: 14 :awakening rlm@99: 15 :parlyz-heal rlm@99: 16 :full-restore rlm@99: 17 :max-potion rlm@99: 18 :hyper-potion rlm@99: 19 :super-potion rlm@99: 20 :potion rlm@99: 21 :boulderbadge rlm@99: 22 :cascadebadge rlm@99: 23 :thunderbadge rlm@99: 24 :rainbowbadge rlm@99: 25 :soulbadge rlm@99: 26 :marshbadge rlm@99: 27 :volcanobadge rlm@99: 28 :earthbadge rlm@99: 29 :escape-rope rlm@99: 30 :repel rlm@99: 31 :old-amber rlm@99: 32 :fire-stone rlm@99: 33 :thunderstone rlm@99: 34 :water-stone rlm@99: 35 :hp-up rlm@99: 36 :protein rlm@99: 37 :iron rlm@99: 38 :carbos rlm@99: 39 :calcium rlm@99: 40 :rare-candy rlm@99: 41 :dome-fossil rlm@99: 42 :helix-fossil rlm@99: 43 :secret-key rlm@99: 45 :bike-voucher rlm@99: 46 :x-accuracy rlm@99: 47 :leaf-stone rlm@99: 48 :card-key rlm@99: 49 :nugget rlm@99: 50 :pp-up rlm@99: 51 :poke-doll rlm@99: 52 :full-heal rlm@99: 53 :revive rlm@99: 54 :max-revive rlm@99: 55 :guard-spec rlm@99: 56 :super-repel rlm@99: 57 :max-repel rlm@99: 58 :dire-hit rlm@99: 59 :coin rlm@99: 60 :fresh-water rlm@99: 61 :soda-pop rlm@99: 62 :lemonade rlm@99: 63 :s.s.ticket rlm@99: 64 :gold-teeth rlm@99: 65 :x-attach rlm@99: 66 :x-defend rlm@99: 67 :x-speed rlm@99: 68 :x-special rlm@99: 69 :coin-case rlm@99: 70 :oaks-parcel rlm@99: 71 :itemfinder rlm@99: 72 :silph-scope rlm@99: 73 :poke-flute rlm@99: 74 :lift-key rlm@99: 75 :exp.all rlm@99: 76 :old-rod rlm@99: 77 :good-rod rlm@99: 78 :super-rod rlm@99: 79 :pp-up rlm@99: 80 :ether rlm@99: 81 :max-ether rlm@99: 82 :elixer rlm@99: 83 :max-elixer rlm@102: 196 :HM01 ;; cut rlm@102: 197 :HM02 ;; fly rlm@102: 198 :HM03 ;; surf rlm@102: 199 :HM04 ;; strength rlm@102: 200 :HM05 ;; flash rlm@102: 201 :TM01 ;; mega punch rlm@102: 202 :TM02 ;; razor wind rlm@102: 203 :TM03 ;; swords dance rlm@102: 204 :TM04 ;; whirlwind rlm@102: 205 :TM05 ;; mega kick rlm@102: 206 :TM06 ;; toxic rlm@102: 207 :TM07 ;; horn drill rlm@102: 208 :TM08 ;; body slam rlm@102: 209 :TM09 ;; take down rlm@102: 210 :TM10 ;; double-edge rlm@102: 211 :TM11 ;; bubblebeam rlm@102: 212 :TM12 ;; water gun rlm@102: 213 :TM13 ;; ice beam rlm@102: 214 :TM14 ;; blizzard rlm@102: 215 :TM15 ;; hyper beam rlm@102: 216 :TM16 ;; pay day rlm@102: 217 :TM17 ;; submission rlm@102: 218 :TM18 ;; counter rlm@102: 219 :TM19 ;; seismic toss rlm@102: 220 :TM20 ;; rage rlm@102: 221 :TM21 ;; mega drain rlm@102: 222 :TM22 ;; solarbeam rlm@102: 223 :TM23 ;; dragon rage rlm@102: 224 :TM24 ;; thunderbolt rlm@102: 225 :TM25 ;; thunder rlm@102: 226 :TM26 ;; earthquake rlm@102: 227 :TM27 ;; fissure rlm@102: 228 :TM28 ;; dig rlm@102: 229 :TM29 ;; psychic rlm@102: 230 :TM30 ;; teleport rlm@102: 231 :TM31 ;; mimic rlm@102: 232 :TM32 ;; double team rlm@102: 233 :TM33 ;; reflect rlm@102: 234 :TM34 ;; bide rlm@102: 235 :TM35 ;; metronome rlm@102: 236 :TM36 ;; self destruct rlm@102: 237 :TM37 ;; eggbomb rlm@102: 238 :TM38 ;; fire blast rlm@102: 239 :TM39 ;; swift rlm@102: 240 :TM40 ;; skull bash rlm@102: 241 :TM41 ;; softboiled rlm@102: 242 :TM42 ;; dream eater rlm@102: 243 :TM43 ;; sky attack rlm@102: 244 :TM44 ;; rest rlm@102: 245 :TM45 ;; thunder wave rlm@102: 246 :TM46 ;; psywave rlm@102: 247 :TM47 ;; explosion rlm@102: 248 :TM48 ;; rock slide rlm@102: 249 :TM49 ;; tri attack rlm@102: 250 :TM50 ;; substitute rlm@102: 251 :TM51 ;; "cut" rlm@102: 252 :TM52 ;; "fly" rlm@102: 253 :TM53 ;; "surf" rlm@102: 254 :TM54 ;; "strength" rlm@99: 255 :end-of-list-sentinel)) rlm@98: rlm@99: (def item-name->item-code rlm@99: (zipmap (vals item-code->item-name) rlm@99: (keys item-code->item-name))) rlm@98: rlm@99: (defn inventory [^SaveState state] rlm@99: (let [items (item-list state)] rlm@99: (map rlm@99: (fn [[item-code quantity]] rlm@99: [(item-code->item-name item-code) rlm@99: quantity]) rlm@99: (partition rlm@99: 2 rlm@99: (next (take-while (partial not= 255) items)))))) rlm@98: rlm@102: (defn print-inventory rlm@102: ([] (print-inventory @current-state)) rlm@102: ([^SaveState state] rlm@102: (println rlm@102: (let [inv (inventory state)] rlm@102: (reduce rlm@102: str rlm@102: (concat rlm@102: ["+-------------------+----------+\n" rlm@102: "|##| Item | Quantity |\n" rlm@102: "+--+----------------+----------+\n"] rlm@98: rlm@102: (map rlm@102: (fn [index [item-name quantity]] rlm@102: (str rlm@102: (format "|%-2d| %-14s | %3d |\n" index rlm@102: (apply str (rest (str item-name))) rlm@102: quantity))) rlm@102: (range 0 (count inv)) inv) rlm@102: ["+--+----------------+----------+\n"])))))) rlm@98: rlm@99: (defn inventory-codes [inventory] rlm@99: (flatten rlm@99: (concat [(count inventory)] rlm@99: (map (fn [[item-name quantity]] rlm@99: [(item-name->item-code item-name) rlm@99: quantity]) inventory) rlm@99: [(item-name->item-code :end-of-list-sentinel)]))) rlm@98: rlm@99: (defn set-inventory [^SaveState state new-inventory] rlm@99: (set-state! state) rlm@99: (let [mem (memory state) rlm@99: inv (inventory-codes new-inventory)] rlm@98: rlm@99: (dorun (map (fn [index val] rlm@99: (aset mem index val)) rlm@99: (range item-list-start rlm@99: (+ item-list-start (count inv))) inv)) rlm@99: (write-memory! mem) rlm@99: (update-state))) rlm@102: rlm@102: (def gliched-tms rlm@102: [[:TM51 1] rlm@102: [:TM52 1] rlm@102: [:TM53 1] rlm@102: [:TM54 1]]) rlm@102: rlm@102: (def good-items rlm@102: [[:bicycle 1] rlm@102: [:ultra-ball 15] rlm@102: [:pp-up 1] rlm@102: [:master-ball 5] rlm@102: [:rare-candy 99] rlm@102: [:full-restore 25] rlm@102: [:max-revive 8] rlm@102: [:max-repel 40] rlm@102: [:TM25 1] rlm@102: [:TM11 1] rlm@102: [:TM15 1] rlm@102: ]) rlm@98: rlm@102: (def some-badges rlm@102: [[:cascadebadge 1] rlm@102: [:thunderbadge 1] rlm@102: [:rainbowbadge 1] rlm@102: [:soulbadge 1] rlm@102: ]) rlm@102: rlm@102: (defn run-item-program rlm@102: "This is my first assembly/item program! rlm@102: it just increments BC by one. rlm@102: rlm@102: The code places a single 'great ball' at the beginning of the rlm@102: inventory, then directly sets the program counter to start rlm@102: executing at the position of the 'great ball' in memory. rlm@102: rlm@102: Since a 'great ball' is represented in memory as 0x03, which rlm@102: corresponts to the opcode which increments BC by one, that is rlm@102: what happens. rlm@102: rlm@102: Obviously, the game crashes more or less immediately after the rlm@102: program counter advances past the 'great ball' into the next items rlm@102: in the inventory." rlm@102: [] rlm@102: (set-inventory (read-state 578544) [[:great-ball 1]]) rlm@102: (print-inventory) rlm@102: (println "3 ticks") (tick) (tick) (tick) rlm@102: (println "PC before:" (PC)) rlm@102: (println "BC before:" (BC)) rlm@102: (PC! (inc item-list-start)) rlm@102: (println "PC after setting:" (PC)) rlm@102: (println "data at PC:" (aget (memory) (PC))) rlm@102: (println "one tick") rlm@102: (tick) rlm@102: (println "PC after one tick:" (PC)) rlm@102: (println "BC after one tick:" (BC))) rlm@102: