rlm@145: (ns com.aurellem.gb.items rlm@145: (:use (com.aurellem.gb gb-driver util)) rlm@145: ;; this is bullshit rlm@145: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@145: rlm@145: (defn game-name [] rlm@145: (map char (subvec (vec (memory)) 0x134 0x142))) rlm@145: rlm@145: (def item-list-start 0xD31C) rlm@145: rlm@173: (defn item-list rlm@173: ([^SaveState state] rlm@173: (subvec rlm@173: (vec (memory state)) rlm@173: item-list-start rlm@173: (+ item-list-start 255))) rlm@173: ([] (item-list @current-state))) rlm@173: rlm@145: (def item-code->item-name rlm@145: (hash-map rlm@145: 0x01 :master-ball rlm@145: 0x02 :ultra-ball rlm@145: 0x03 :great-ball rlm@145: 0x04 :poke-ball rlm@145: 0x05 :town-map rlm@145: 0x06 :bicycle rlm@181: 0x07 :surfboard rlm@145: 0x08 :safari-ball rlm@145: 0x09 :pokedex rlm@145: 0x0A :moon-stone rlm@145: 0x0B :antidote rlm@145: 0x0C :burn-heal rlm@145: 0x0D :ice-heal rlm@145: 0x0E :awakening rlm@145: 0x0F :parlyz-heal rlm@145: 0x10 :full-restore rlm@145: 0x11 :max-potion rlm@145: 0x12 :hyper-potion rlm@145: 0x13 :super-potion rlm@145: 0x14 :potion rlm@145: 0x15 :boulderbadge rlm@145: 0x16 :cascadebadge rlm@145: 0x17 :thunderbadge rlm@145: 0x18 :rainbowbadge rlm@145: 0x19 :soulbadge rlm@145: 0x1A :marshbadge rlm@145: 0x1B :volcanobadge rlm@145: 0x1C :earthbadge rlm@145: 0x1D :escape-rope rlm@145: 0x1E :repel rlm@145: 0x1F :old-amber rlm@145: 0x20 :fire-stone rlm@145: 0x21 :thunderstone rlm@145: 0x22 :water-stone rlm@145: 0x23 :hp-up rlm@145: 0x24 :protein rlm@145: 0x25 :iron rlm@145: 0x26 :carbos rlm@145: 0x27 :calcium rlm@145: 0x28 :rare-candy rlm@145: 0x29 :dome-fossil rlm@145: 0x2A :helix-fossil rlm@145: 0x2B :secret-key rlm@145: 0x2D :bike-voucher rlm@145: 0x2E :x-accuracy rlm@145: 0x2F :leaf-stone rlm@145: 0x30 :card-key rlm@145: 0x31 :nugget rlm@145: 0x32 :pp-up rlm@145: 0x33 :poke-doll rlm@145: 0x34 :full-heal rlm@145: 0x35 :revive rlm@145: 0x36 :max-revive rlm@145: 0x37 :guard-spec rlm@145: 0x38 :super-repel rlm@145: 0x39 :max-repel rlm@145: 0x3A :dire-hit rlm@145: 0x3B :coin rlm@145: 0x3C :fresh-water rlm@145: 0x3D :soda-pop rlm@145: 0x3E :lemonade rlm@145: 0x3F :s.s.ticket rlm@145: 0x40 :gold-teeth rlm@173: 0x41 :x-attack rlm@145: 0x42 :x-defend rlm@145: 0x43 :x-speed rlm@145: 0x44 :x-special rlm@145: 0x45 :coin-case rlm@145: 0x46 :oaks-parcel rlm@145: 0x47 :itemfinder rlm@145: 0x48 :silph-scope rlm@145: 0x49 :poke-flute rlm@145: 0x4A :lift-key rlm@145: 0x4B :exp.all rlm@145: 0x4C :old-rod rlm@145: 0x4D :good-rod rlm@145: 0x4E :super-rod rlm@145: 0x4F :pp-up rlm@145: 0x50 :ether rlm@145: 0x51 :max-ether rlm@145: 0x52 :elixer rlm@145: 0x53 :max-elixer rlm@145: 0xC4 :HM01 ;; cut rlm@145: 0xC5 :HM02 ;; fly rlm@145: 0xC6 :HM03 ;; surf rlm@145: 0xC7 :HM04 ;; strength rlm@145: 0xC8 :HM05 ;; flash rlm@145: 0xC9 :TM01 ;; mega punch rlm@145: 0xCA :TM02 ;; razor wind rlm@145: 0xCB :TM03 ;; swords dance rlm@145: 0xCC :TM04 ;; whirlwind rlm@145: 0xCD :TM05 ;; mega kick rlm@145: 0xCE :TM06 ;; toxic rlm@145: 0xCF :TM07 ;; horn drill rlm@145: 0xD0 :TM08 ;; body slam rlm@145: 0xD1 :TM09 ;; take down rlm@145: 0xD2 :TM10 ;; double-edge rlm@145: 0xD3 :TM11 ;; bubblebeam rlm@145: 0xD4 :TM12 ;; water gun rlm@145: 0xD5 :TM13 ;; ice beam rlm@145: 0xD6 :TM14 ;; blizzard rlm@145: 0xD7 :TM15 ;; hyper beam rlm@145: 0xD8 :TM16 ;; pay day rlm@145: 0xD9 :TM17 ;; submission rlm@145: 0xDA :TM18 ;; counter rlm@145: 0xDB :TM19 ;; seismic toss rlm@145: 0xDC :TM20 ;; rage rlm@145: 0xDD :TM21 ;; mega drain rlm@145: 0xDE :TM22 ;; solarbeam rlm@145: 0xDF :TM23 ;; dragon rage rlm@145: 0xE0 :TM24 ;; thunderbolt rlm@145: 0xE1 :TM25 ;; thunder rlm@145: 0xE2 :TM26 ;; earthquake rlm@145: 0xE3 :TM27 ;; fissure rlm@145: 0xE4 :TM28 ;; dig rlm@145: 0xE5 :TM29 ;; psychic rlm@145: 0xE6 :TM30 ;; teleport rlm@145: 0xE7 :TM31 ;; mimic rlm@145: 0xE8 :TM32 ;; double team rlm@145: 0xE9 :TM33 ;; reflect rlm@145: 0xEA :TM34 ;; bide rlm@145: 0xEB :TM35 ;; metronome rlm@145: 0xEC :TM36 ;; self destruct rlm@145: 0xED :TM37 ;; eggbomb rlm@145: 0xEE :TM38 ;; fire blast rlm@145: 0xEF :TM39 ;; swift rlm@145: 0xF0 :TM40 ;; skull bash rlm@145: 0xF1 :TM41 ;; softboiled rlm@145: 0xF2 :TM42 ;; dream eater rlm@145: 0xF3 :TM43 ;; sky attack rlm@145: 0xF4 :TM44 ;; rest rlm@145: 0xF5 :TM45 ;; thunder wave rlm@145: 0xF6 :TM46 ;; psywave rlm@145: 0xF7 :TM47 ;; explosion rlm@145: 0xF8 :TM48 ;; rock slide rlm@145: 0xF9 :TM49 ;; tri attack rlm@145: 0xFA :TM50 ;; substitute rlm@145: 0xFB :TM51 ;; "cut" rlm@145: 0xFC :TM52 ;; "fly" rlm@145: 0xFD :TM53 ;; "surf" rlm@145: 0xFE :TM54 ;; "strength" rlm@145: 0xFF :end-of-list-sentinel)) rlm@145: rlm@145: (def item-name->item-code rlm@145: (zipmap (vals item-code->item-name) rlm@145: (keys item-code->item-name))) rlm@145: rlm@145: (defn inventory [^SaveState state] rlm@145: (let [items (item-list state)] rlm@145: (map rlm@145: (fn [[item-code quantity]] rlm@145: [(item-code->item-name rlm@145: item-code rlm@181: item-code) rlm@145: quantity]) rlm@145: (partition rlm@145: 2 rlm@145: (next (take-while (partial not= 255) items)))))) rlm@145: rlm@145: (defn print-inventory rlm@145: ([] (print-inventory @current-state)) rlm@145: ([^SaveState state] rlm@145: (println rlm@145: (let [inv (inventory state)] rlm@145: (reduce rlm@145: str rlm@145: (concat rlm@145: ["+-------------------+----------+\n" rlm@145: "|##| Item | Quantity |\n" rlm@145: "+--+----------------+----------+\n"] rlm@145: rlm@145: (map rlm@145: (fn [index [item-name quantity]] rlm@145: (str rlm@145: (format "|%-2d| %-14s | %3d |\n" index rlm@145: (apply str (rest (str item-name))) rlm@145: quantity))) rlm@145: (range 0 (count inv)) inv) rlm@145: ["+--+----------------+----------+\n"])))) rlm@145: state)) rlm@145: rlm@145: (defn inventory-codes [inventory] rlm@145: (flatten rlm@145: (concat [(count inventory)] rlm@145: (map (fn [[item-name quantity]] rlm@181: [(item-name->item-code item-name item-name) rlm@145: quantity]) inventory) rlm@145: [(item-name->item-code :end-of-list-sentinel)]))) rlm@145: rlm@145: (defn set-inv-mem [^SaveState state inv-codes] rlm@145: (set-memory-range state item-list-start rlm@145: inv-codes)) rlm@145: rlm@145: rlm@145: (defn set-inventory [^SaveState state new-inventory] rlm@145: (set-inv-mem state (inventory-codes new-inventory))) rlm@145: rlm@161: (defn give-items rlm@145: ([^SaveState state items] rlm@145: (set-inventory state rlm@145: (concat items (inventory state)))) rlm@145: ([items] rlm@161: (give-items @current-state items))) rlm@145: rlm@145: (defn clear-inventory rlm@145: ([^SaveState state] rlm@145: (set-inventory state [])) rlm@145: ([] (clear-inventory @current-state))) rlm@145: