rlm@154: (ns com.aurellem.exp.moves rlm@161: (:use (com.aurellem.gb gb-driver items util pokemon)) rlm@154: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@154: rlm@154: (defn move-state [] rlm@154: (read-state "view-pika-attacks")) rlm@154: rlm@154: (defn view-move [n] rlm@154: (run-moves rlm@154: (set-memory (move-state) 0xD19E n) rlm@154: (concat [[:a]] rlm@154: (repeat 200 []) rlm@154: [[:a]] rlm@154: (repeat 200 [])))) rlm@154: rlm@154: (defn iterate-moves [] rlm@154: (dorun rlm@154: (map (fn [n] (println n) rlm@154: (view-move n) rlm@154: (Thread/sleep 5000)) rlm@154: (range (inc 0xFF))))) rlm@154: rlm@161: (def moves-codes-pokemon-1 0xD172) rlm@161: rlm@161: (defn moves-codes-start [pokemon-num] rlm@161: (assert (<= 0 pokemon-num 5)) rlm@161: (+ moves-codes-pokemon-1 rlm@161: (* pokemon-num pokemon-record-width))) rlm@161: rlm@154: rlm@154: ;; 000 00 : null rlm@154: ;; 001 01 : pound rlm@154: ;; 002 02 : karate-chop rlm@154: ;; 003 03 : doubleslap rlm@154: ;; 004 04 : comet-punch rlm@154: ;; 005 05 : mega-punch rlm@154: ;; 006 06 : pay-day rlm@154: ;; 007 07 : fire-punch rlm@154: ;; 008 08 : ice-punch rlm@154: ;; 009 09 : thunderpunch rlm@154: ;; 010 0A : scratch rlm@154: ;; 011 0B : vicegrip rlm@154: ;; 012 0C : guillotine rlm@154: ;; 013 0D : razor-wind rlm@154: ;; 014 0E : swords-dance rlm@154: ;; 015 0F : cut rlm@154: ;; 016 10 : gust rlm@154: ;; 017 11 : wing-attack rlm@154: ;; 018 12 : whirlwind rlm@154: ;; 019 13 : fly rlm@154: ;; 020 14 : bind rlm@154: ;; 021 15 : slam rlm@154: ;; 022 16 : vine-whip rlm@154: ;; 023 17 : stomp rlm@154: ;; 024 18 : double-kick rlm@154: ;; 025 19 : mega-kick rlm@154: ;; 026 1A : jump-kick rlm@154: ;; 027 1B : rolling-kick rlm@154: ;; 028 1C : sand-attack rlm@154: ;; 029 1D : headbutt rlm@154: ;; 030 1E : horn-attack rlm@154: ;; 031 1F : fury-attack rlm@154: ;; 032 20 : horn-drill rlm@154: ;; 033 21 : tackle rlm@154: ;; 034 22 : body-slam rlm@154: ;; 035 23 : wrap rlm@154: ;; 036 24 : take-down rlm@154: ;; 037 25 : thrash rlm@154: ;; 038 26 : double-edge rlm@154: ;; 039 27 : tail-whip rlm@154: ;; 040 28 : poison-sting rlm@154: ;; 041 29 : twinneedle rlm@154: ;; 042 2A : pin-missle rlm@154: ;; 043 2B : leer rlm@154: ;; 044 2C : bite rlm@154: ;; 045 2D : growl rlm@154: ;; 046 2E : roar rlm@154: ;; 047 2F : sing rlm@154: ;; 048 30 : supersonic rlm@154: ;; 049 31 : sonicboom rlm@154: ;; 050 32 : disable rlm@154: ;; 051 33 : acid rlm@154: ;; 052 34 : ember rlm@154: ;; 053 35 : flamethrower rlm@154: ;; 054 36 : mist rlm@154: ;; 055 37 : water-gun rlm@154: ;; 056 38 : hydro-pump rlm@154: ;; 057 39 : surf rlm@154: ;; 058 3A : ice-beam rlm@154: ;; 059 3B : blizzard rlm@154: ;; 060 3C : psybeam rlm@154: ;; 061 3D : bubblebeam rlm@154: ;; 062 3E : aurora-beam rlm@154: ;; 063 3F : hyper-beam rlm@154: ;; 064 40 : peck rlm@154: ;; 065 41 : drill-peck rlm@154: ;; 066 42 : submission rlm@154: ;; 067 43 : low-kick rlm@154: ;; 068 44 : counter rlm@154: ;; 069 45 : seismic-toss rlm@154: ;; 070 46 : strength rlm@154: ;; 071 47 : absorb rlm@154: ;; 072 48 : mega-drain rlm@154: ;; 073 49 : leech-seed rlm@154: ;; 074 4A : growth rlm@154: ;; 075 4B : razor-leaf rlm@154: ;; 076 4C : solarbeam rlm@154: ;; 077 4D : poisonpowder rlm@154: ;; 078 4E : stun-spore rlm@154: ;; 079 4F : sleep-powder rlm@154: ;; 080 50 : petal-dance rlm@154: ;; 081 51 : string-shot rlm@154: ;; 082 52 : dragon-rage rlm@154: ;; 083 53 : fire-spin rlm@154: ;; 084 54 : thundershock rlm@154: ;; 085 55 : thunderbolt rlm@154: ;; 086 56 : thunder-wave rlm@154: ;; 087 57 : thunder rlm@154: ;; 088 58 : rock-throw rlm@154: ;; 089 59 : earthquake rlm@154: ;; 090 5A : fissure rlm@154: ;; 091 5B : dig rlm@154: ;; 092 5C : toxic rlm@154: ;; 093 5D : confusion rlm@154: ;; 094 5E : psychic rlm@154: ;; 095 5F : hypnosis rlm@154: ;; 096 60 : meditate rlm@154: ;; 097 61 : agility rlm@154: ;; 098 62 : quick-attack rlm@154: ;; 099 63 : rage rlm@154: ;; 100 64 : teleport rlm@154: ;; 101 65 : night-shade rlm@154: ;; 102 66 : mimic rlm@154: ;; 103 67 : screech rlm@154: ;; 104 68 : double-team rlm@154: ;; 105 69 : recover rlm@154: ;; 106 6A : harden rlm@154: ;; 107 6B : minimize rlm@154: ;; 108 6C : smokescreen rlm@154: ;; 109 6D : confuse-ray rlm@154: ;; 110 6E : withdraw rlm@154: ;; 111 6F : defense-curl rlm@154: ;; 112 70 : barrier rlm@154: ;; 113 71 : light-screen rlm@154: ;; 114 72 : haze rlm@154: ;; 115 73 : reflect rlm@154: ;; 116 74 : focus-energy rlm@154: ;; 117 75 : bide rlm@154: ;; 118 76 : metronome rlm@154: ;; 119 77 : mirror-move rlm@154: ;; 120 78 : selfdestruct rlm@154: ;; 121 79 : egg-bomb rlm@154: ;; 122 7A : lick rlm@154: ;; 123 7B : smog rlm@154: ;; 124 7C : sludge rlm@154: ;; 125 7D : bone-club rlm@154: ;; 126 7E : fire-blast rlm@154: ;; 127 7F : waterfall rlm@154: ;; 128 80 : clamp rlm@154: ;; 129 81 : swift rlm@154: ;; 130 82 : skull-bash rlm@154: ;; 131 83 : spike-cannon rlm@154: ;; 132 84 : constrict rlm@154: ;; 133 85 : amnesia rlm@154: ;; 134 86 : kinesis rlm@154: ;; 135 87 : softboiled rlm@154: ;; 136 88 : hi-jump-kick rlm@154: ;; 137 89 : glare rlm@154: ;; 138 8A : dream-eater rlm@154: ;; 139 8B : poison-gas rlm@154: ;; 140 8C : barrage rlm@154: ;; 141 8D : leech-life rlm@154: ;; 142 8E : lovely-kiss rlm@154: ;; 143 8F : sky-attack rlm@154: ;; 144 90 : transform rlm@154: ;; 145 91 : bubble rlm@154: ;; 146 92 : dizzy-punch rlm@154: ;; 147 93 : spore rlm@154: ;; 148 94 : flash rlm@154: ;; 149 95 : psywave rlm@154: ;; 150 96 : splash rlm@154: ;; 151 97 : acid-armor rlm@154: ;; 152 98 : crabhammer rlm@154: ;; 153 99 : explosion rlm@154: ;; 154 9A : fury-swipes rlm@154: ;; 155 9B : bonemerang rlm@154: ;; 156 9C : rest rlm@154: ;; 157 9D : rock-slide rlm@154: ;; 158 9E : hyper-fang rlm@154: ;; 159 9F : sharpen rlm@154: ;; 160 A0 : conversion rlm@154: ;; 161 A1 : tri-attack rlm@154: ;; 162 A2 : super-fang rlm@154: ;; 163 A3 : slash rlm@154: ;; 164 A4 : substitute rlm@154: ;; 165 A5 : struggle rlm@154: ;; 166 A6 : null rlm@154: ;; 167 A7 : null rlm@154: ;; 168 A8 : null rlm@154: ;; 169 A9 : trash rlm@154: ;; 170 AA : trash rlm@154: ;; 171 AB : trash rlm@154: ;; 172 AC : trash rlm@154: ;; 173 AD : trash rlm@154: ;; 174 AE : trash rlm@154: ;; 175 AF : null rlm@154: ;; 176 B0 : trash rlm@154: ;; 177 B1 : trash rlm@154: ;; 178 B2 : trash rlm@154: ;; 179 B3 : trash rlm@154: ;; 180 B4 : AA rlm@154: ;; 181 B5 : trash rlm@154: ;; 182 B6 : QQ rlm@154: ;; 183 B7 : null rlm@154: ;; 184 B8 : null rlm@154: ;; 185 B9 : null rlm@154: ;; 186 BA : null rlm@154: ;; 187 BB : null rlm@154: ;; 188 BC : null rlm@154: ;; 189 BD : null rlm@154: ;; 190 BE : trash rlm@154: ;; 191 BF : null rlm@154: ;; 192 C0 : null rlm@154: ;; 193 C1 : null rlm@154: ;; 194 C2 : null rlm@154: ;; 195 C3 : null rlm@154: ;; 196 C4 : HM01 rlm@154: ;; 197 C5 : HM02 rlm@154: ;; 198 C6 : HM03 rlm@154: ;; 199 C7 : HM04 rlm@154: ;; 200 C8 : HM05 rlm@154: ;; 201 C9 : TM01 rlm@154: ;; 202 CA : TM02 rlm@154: ;; 203 CB : TM03 rlm@154: ;; 204 CC : TM04 rlm@154: ;; 205 CD : TM05 rlm@154: ;; 206 CE : TM06 rlm@154: ;; 207 CF : TM07 rlm@154: ;; 208 D0 : TM08 rlm@154: ;; 209 D1 : TM09 rlm@154: ;; 210 D2 : TM10 rlm@154: ;; 211 D3 : TM11 rlm@154: ;; 212 D4 : TM12 rlm@154: ;; 213 D5 : TM13 rlm@154: ;; 214 D6 : TM14 rlm@154: ;; 215 D7 : TM15 rlm@154: ;; 216 D8 : TM16 rlm@154: ;; 217 D9 : TM17 rlm@154: ;; 218 DA : TM18 rlm@154: ;; 219 DB : TM19 rlm@154: ;; 220 DC : TM20 rlm@154: ;; 221 DD : TM21 rlm@154: ;; 222 DE : TM22 rlm@154: ;; 223 DF : TM23 rlm@154: ;; 224 E0 : TM24 rlm@154: ;; 225 E1 : TM25 rlm@154: ;; 226 E2 : TM26 rlm@154: ;; 227 E3 : TM27 rlm@154: ;; 228 E4 : TM28 rlm@154: ;; 229 E5 : TM29 rlm@154: ;; 230 E6 : TM30 rlm@154: ;; 231 E7 : TM31 rlm@154: ;; 232 E8 : TM32 rlm@154: ;; 233 E9 : TM33 rlm@154: ;; 234 EA : TM34 rlm@154: ;; 235 EB : TM35 rlm@154: ;; 236 EC : TM36 rlm@154: ;; 237 ED : TM37 rlm@154: ;; 238 EE : TM38 rlm@154: ;; 239 EF : TM39 rlm@154: ;; 240 F0 : TM40 rlm@154: ;; 241 F1 : TM41 rlm@154: ;; 242 F2 : TM42 rlm@154: ;; 243 F3 : TM43 rlm@154: ;; 244 F4 : TM44 rlm@154: ;; 245 F5 : TM45 rlm@154: ;; 246 F6 : TM46 rlm@154: ;; 247 F7 : TM47 rlm@154: ;; 248 F8 : TM48 rlm@154: ;; 249 F9 : TM49 rlm@154: ;; 250 FA : TM50 rlm@154: ;; 251 FB : TM51 rlm@154: ;; 252 FC : TM52 rlm@154: ;; 253 FD : TM53 rlm@154: ;; 254 FE : TM54 rlm@159: ;; 255 FF : TM55 rlm@159: rlm@159: rlm@161: (def move-code->move-name rlm@161: { rlm@161: 0x01 :pound rlm@161: 0x02 :karate-chop rlm@161: 0x03 :doubleslap rlm@161: 0x04 :comet-punch rlm@161: 0x05 :mega-punch rlm@161: 0x06 :pay-day rlm@161: 0x07 :fire-punch rlm@161: 0x08 :ice-punch rlm@161: 0x09 :thunderpunch rlm@161: 0x0A :scratch rlm@161: 0x0B :vicegrip rlm@161: 0x0C :guillotine rlm@161: 0x0D :razor-wind rlm@161: 0x0E :swords-dance rlm@161: 0x0F :cut rlm@161: 0x10 :gust rlm@161: 0x11 :wing-attack rlm@161: 0x12 :whirlwind rlm@161: 0x13 :fly rlm@161: 0x14 :bind rlm@161: 0x15 :slam rlm@161: 0x16 :vine-whip rlm@161: 0x17 :stomp rlm@161: 0x18 :double-kick rlm@161: 0x19 :mega-kick rlm@161: 0x1A :jump-kick rlm@161: 0x1B :rolling-kick rlm@161: 0x1C :sand-attack rlm@161: 0x1D :headbutt rlm@161: 0x1E :horn-attack rlm@161: 0x1F :fury-attack rlm@161: 0x20 :horn-drill rlm@161: 0x21 :tackle rlm@161: 0x22 :body-slam rlm@161: 0x23 :wrap rlm@161: 0x24 :take-down rlm@161: 0x25 :thrash rlm@161: 0x26 :double-edge rlm@161: 0x27 :tail-whip rlm@161: 0x28 :poison-sting rlm@161: 0x29 :twinneedle rlm@161: 0x2A :pin-missle rlm@161: 0x2B :leer rlm@161: 0x2C :bite rlm@161: 0x2D :growl rlm@161: 0x2E :roar rlm@161: 0x2F :sing rlm@161: 0x30 :supersonic rlm@161: 0x31 :sonicboom rlm@161: 0x32 :disable rlm@161: 0x33 :acid rlm@161: 0x34 :ember rlm@161: 0x35 :flamethrower rlm@161: 0x36 :mist rlm@161: 0x37 :water-gun rlm@161: 0x38 :hydro-pump rlm@161: 0x39 :surf rlm@161: 0x3A :ice-beam rlm@161: 0x3B :blizzard rlm@161: 0x3C :psybeam rlm@161: 0x3D :bubblebeam rlm@161: 0x3E :aurora-beam rlm@161: 0x3F :hyper-beam rlm@161: 0x40 :peck rlm@161: 0x41 :drill-peck rlm@161: 0x42 :submission rlm@161: 0x43 :low-kick rlm@161: 0x44 :counter rlm@161: 0x45 :seismic-toss rlm@161: 0x46 :strength rlm@161: 0x47 :absorb rlm@161: 0x48 :mega-drain rlm@161: 0x49 :leech-seed rlm@161: 0x4A :growth rlm@161: 0x4B :razor-leaf rlm@161: 0x4C :solarbeam rlm@161: 0x4D :poisonpowder rlm@161: 0x4E :stun-spore rlm@161: 0x4F :sleep-powder rlm@161: 0x50 :petal-dance rlm@161: 0x51 :string-shot rlm@161: 0x52 :dragon-rage rlm@161: 0x53 :fire-spin rlm@161: 0x54 :thundershock rlm@161: 0x55 :thunderbolt rlm@161: 0x56 :thunder-wave rlm@161: 0x57 :thunder rlm@161: 0x58 :rock-throw rlm@161: 0x59 :earthquake rlm@161: 0x5A :fissure rlm@161: 0x5B :dig rlm@161: 0x5C :toxic rlm@161: 0x5D :confusion rlm@161: 0x5E :psychic rlm@161: 0x5F :hypnosis rlm@161: 0x60 :meditate rlm@161: 0x61 :agility rlm@161: 0x62 :quick-attack rlm@161: 0x63 :rage rlm@161: 0x64 :teleport rlm@161: 0x65 :night-shade rlm@161: 0x66 :mimic rlm@161: 0x67 :screech rlm@161: 0x68 :double-team rlm@161: 0x69 :recover rlm@161: 0x6A :harden rlm@161: 0x6B :minimize rlm@161: 0x6C :smokescreen rlm@161: 0x6D :confuse-ray rlm@161: 0x6E :withdraw rlm@161: 0x6F :defense-curl rlm@161: 0x70 :barrier rlm@161: 0x71 :light-screen rlm@161: 0x72 :haze rlm@161: 0x73 :reflect rlm@161: 0x74 :focus-energy rlm@161: 0x75 :bide rlm@161: 0x76 :metronome rlm@161: 0x77 :mirror-move rlm@161: 0x78 :selfdestruct rlm@161: 0x79 :egg-bomb rlm@161: 0x7A :lick rlm@161: 0x7B :smog rlm@161: 0x7C :sludge rlm@161: 0x7D :bone-club rlm@161: 0x7E :fire-blast rlm@161: 0x7F :waterfall rlm@161: 0x80 :clamp rlm@161: 0x81 :swift rlm@161: 0x82 :skull-bash rlm@161: 0x83 :spike-cannon rlm@161: 0x84 :constrict rlm@161: 0x85 :amnesia rlm@161: 0x86 :kinesis rlm@161: 0x87 :softboiled rlm@161: 0x88 :hi-jump-kick rlm@161: 0x89 :glare rlm@161: 0x8A :dream-eater rlm@161: 0x8B :poison-gas rlm@161: 0x8C :barrage rlm@161: 0x8D :leech-life rlm@161: 0x8E :lovely-kiss rlm@161: 0x8F :sky-attack rlm@161: 0x90 :transform rlm@161: 0x91 :bubble rlm@161: 0x92 :dizzy-punch rlm@161: 0x93 :spore rlm@161: 0x94 :flash rlm@161: 0x95 :psywave rlm@161: 0x96 :splash rlm@161: 0x97 :acid-armor rlm@161: 0x98 :crabhammer rlm@161: 0x99 :explosion rlm@161: 0x9A :fury-swipes rlm@161: 0x9B :bonemerang rlm@161: 0x9C :rest rlm@161: 0x9D :rock-slide rlm@161: 0x9E :hyper-fang rlm@161: 0x9F :sharpen rlm@161: 0xA0 :conversion rlm@161: 0xA1 :tri-attack rlm@161: 0xA2 :super-fang rlm@161: 0xA3 :slash rlm@161: 0xA4 :substitute rlm@161: 0xA5 :struggle}) rlm@159: rlm@161: (def move-name->move-code rlm@161: (zipmap (vals move-code->move-name) rlm@161: (keys move-code->move-name))) rlm@161: rlm@161: (defn give-moves rlm@161: ([^SaveState state pokemon-num moves] rlm@161: (set-memory-range rlm@161: state rlm@161: (moves-codes-start pokemon-num) rlm@161: (map #(move-name->move-code % %) moves))) rlm@161: ([pokemon-num moves] rlm@161: (give-moves @current-state pokemon-num moves)) rlm@161: ([moves] rlm@161: (give-moves 0 moves))) rlm@159: rlm@159: ;; Note regarding PP of moves -- both the current PP and the rlm@161: ;; total PP are stored in the same value. rlm@161: ;; they are bit-packed, with the first 2 bits containing the rlm@161: ;; number of pp-ups that have been applied, and the next rlm@161: ;; six bits containing the current pp of the move. rlm@161: ;; thus, a move can have up to 63 current pp and up to rlm@161: ;; three pp-ups applied. rlm@161: rlm@161: rlm@161: (def pokemon-1-pp-start 0xD187) rlm@161: rlm@161: (defn moves-pp-start [pokemon-num] rlm@161: (assert (<= 0 pokemon-num 5)) rlm@161: (+ pokemon-1-pp-start (* pokemon-num pokemon-record-width))) rlm@161: rlm@161: (defn read-pp rlm@161: ([^SaveState state pokemon-num move-num] rlm@161: (assert (<= 0 move-num 3)) rlm@161: (assert (<= 0 pokemon-num 5)) rlm@161: (let [pp-raw rlm@161: (aget (memory state) rlm@161: (+ (moves-pp-start pokemon-num) rlm@161: move-num)) rlm@161: pp-up rlm@161: (bit-shift-right rlm@161: (bit-and rlm@161: pp-raw rlm@161: (Integer/parseInt "11000000" 2)) 6) rlm@161: current-pp rlm@161: (bit-and rlm@161: pp-raw rlm@161: (Integer/parseInt "00111111" 2))] rlm@161: [pp-up current-pp])) rlm@161: ([pokemon-num move-num] rlm@161: (read-pp @current-state pokemon-num move-num))) rlm@161: rlm@161: (defn give-pp rlm@161: ([^SaveState state pokemon-num move-num pp-ups current-pp] rlm@161: (assert (<= 0 move-num 3)) rlm@161: (assert (<= 0 pokemon-num 5)) rlm@161: (assert (<= 0 pp-ups 3)) rlm@161: (assert (<= 0 current-pp 63)) rlm@161: rlm@161: (set-memory rlm@161: state rlm@161: (+ (moves-pp-start pokemon-num) rlm@161: move-num) rlm@161: (+ rlm@161: (bit-shift-left pp-ups 6) rlm@161: (bit-and (Integer/parseInt rlm@161: "00111111" 2) rlm@161: current-pp)))) rlm@161: ([pokemon-num move-num pp-ups current-pp] rlm@161: (set-pp @current-state rlm@161: pokemon-num move-num pp-ups current-pp)))