rlm@218: (ns com.aurellem.gb.hxc rlm@218: (:use (com.aurellem.gb assembly characters gb-driver util rlm@218: constants)) rlm@218: (:use (com.aurellem.world practice)) rlm@218: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@218: rlm@218: ocsenave@243: ocsenave@243: (def pkmn-types ocsenave@244: [:normal ocsenave@244: :fighting ocsenave@244: :flying ocsenave@244: :poison ocsenave@244: :ground ocsenave@244: :rock ocsenave@245: :bird ocsenave@244: :bug ocsenave@244: :ghost ocsenave@244: :A ocsenave@244: :B ocsenave@244: :C ocsenave@244: :D ocsenave@244: :E ocsenave@244: :F ocsenave@244: :G ocsenave@244: :H ocsenave@244: :I ocsenave@244: :J ocsenave@244: :K ocsenave@244: :fire ocsenave@244: :water ocsenave@244: :grass ocsenave@244: :electric ocsenave@244: :psychic ocsenave@244: :ice ocsenave@244: :dragon ocsenave@244: ]) ocsenave@243: ocsenave@243: ocsenave@246: ;; question: when status effects claim to take ocsenave@246: ;; their accuracy from the move accuracy, does ocsenave@246: ;; this mean that the move always "hits" but the ocsenave@246: ;; status effect may not? ocsenave@246: ocsenave@246: (def move-effects ocsenave@246: ["normal damage" ocsenave@246: "no damage, just opponent sleep" ;; how many turns? is atk power ignored? ocsenave@246: "0x4C chance of poison" ocsenave@246: "leech half of inflicted damage" ocsenave@246: "0x19 chance of burn" ocsenave@246: "0x19 chance of freeze" ocsenave@246: "0x19 chance of paralyze" ocsenave@246: "user faints; opponent defense halved." ocsenave@246: "leech half of inflicted damage ONLY if sleeping opponent." ocsenave@246: "imitate last attack" ocsenave@246: "user atk +1" ocsenave@246: "user def +1" ocsenave@246: "user spd +1" ocsenave@246: "user spc +1" ocsenave@246: "user acr +1" ;; unused?! ocsenave@246: "user evd +1" ocsenave@246: "get post-battle $ = 2*level*uses" ocsenave@246: "0xFE acr, no matter what." ocsenave@246: "opponent atk -1" ;; acr taken from move acr? ocsenave@246: "opponent def -1" ;; ocsenave@246: "opponent spd -1" ;; ocsenave@246: "opponent spc -1" ;; ocsenave@246: "opponent acr -1";; ocsenave@246: "opponent evd -1" ocsenave@246: "converts user's type to opponent's." ocsenave@246: "(haze)" ocsenave@246: "(bide)" ocsenave@246: "(thrash)" ocsenave@246: "(teleport)" ocsenave@246: "(fury swipes)" ocsenave@246: "attacks 2-5 turns" ;; unused? like rollout? ocsenave@246: "0x19 chance of flinch" ocsenave@246: "opponent sleep for 1-7 turns" ocsenave@246: "0x66 chance of poison" ocsenave@246: "0x4D chance of burn" ocsenave@246: "0x4D chance of freeze" ocsenave@246: "0x4D chance of paralyze" ocsenave@246: "0x4D chance of flinch" ocsenave@246: "one-hit KO" ocsenave@246: "charge one turn, atk next." ocsenave@246: "fixed damage, leaves 1HP." ;; how is dmg determined? ocsenave@246: "fixed damage." ;; cf seismic toss, dragon rage, psywave. ocsenave@246: "atk 2-5 turns; opponent can't attack" ;; unnormalized? (0 0x60 0x60 0x20 0x20) ocsenave@246: "charge one turn, atk next. (can't be hit when charging)" ocsenave@246: "atk hits twice." ocsenave@246: "user takes 1 damage if misses." ocsenave@246: "evade status-lowering effects" ;;caused by you or also your opponent? ocsenave@246: "(broken) if user is slower than opponent, makes critical hit impossible, otherwise has no effect" ocsenave@246: "atk causes recoil dmg = 1/4 dmg dealt" ocsenave@246: "confuses opponent" ;; acr taken from move acr ocsenave@246: "user atk +2" ocsenave@246: "user def +2" ocsenave@246: "user spd +2" ocsenave@246: "user spc +2" ocsenave@246: "user acr +2" ;; unused! ocsenave@246: "user evd +2" ;; unused! ocsenave@246: "restores up to half of user's max hp." ;; broken: fails if the difference ocsenave@246: ;; b/w max and current hp is one less than a multiple of 256. ocsenave@246: "(transform)" ocsenave@246: "opponent atk -2" ocsenave@246: "opponent def -2" ocsenave@246: "opponent spd -2" ocsenave@246: "opponent spc -2" ocsenave@246: "opponent acr -2" ocsenave@246: "opponent evd -2" ocsenave@246: "doubles user spc when attacked" ocsenave@246: "doubles user def when attacked" ocsenave@246: "poisons opponent" ;;acr taken from move acr ocsenave@246: "paralyzes opponent" ;; ocsenave@246: "0x19 chance opponent atk -1" ocsenave@246: "0x19 chance opponent def -1" ocsenave@246: "0x19 chance opponent spd -1" ocsenave@246: "0x4C chance opponent spc -1" ;; context suggest chance is 0x19 ocsenave@246: "0x19 chance opponent acr -1" ocsenave@246: "0x19 chance opponent evd -1" ocsenave@246: "???" ;; unused? no effect? ocsenave@246: "???" ;; unused? no effect? ocsenave@246: "0x19 chance opponent confused" ocsenave@246: "atk hits twice. 0x33 chance opponent poisioned." ocsenave@246: "broken. crash the game after attack." ocsenave@246: "(substitute)" ocsenave@246: "unless opponent faints, user must recharge after atk. some ocsenave@246: exceptions apply." ocsenave@246: "(rage)" ocsenave@246: "(mimic)" ocsenave@246: "(metronome)" ocsenave@246: "(leech seed)" ocsenave@246: "does nothing (splash)" ocsenave@246: "(disable)" ocsenave@246: ]) ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: (def hxc-items ocsenave@246: "The hardcoded names of the items in memory. List begins at ROM@045B7 " ocsenave@246: (map character-codes->str ocsenave@246: (take-nth 2 ocsenave@246: (partition-by #(= % 0x50) ocsenave@246: (take 1200 ocsenave@246: (drop 0x45B7 (rom (root)))))))) ocsenave@246: ocsenave@246: (def hxc-types ocsenave@246: "The hardcoded type names in memory. List begins at ROM@27D99, ocsenave@246: shortly before hxc-titles." ocsenave@246: (map character-codes->str ocsenave@246: (take-nth 2 ocsenave@246: (partition-by #(= 0x50 %) ocsenave@246: (take 102 ocsenave@246: (drop 0x27D99 ocsenave@246: (rom (root)))))))) ocsenave@246: ocsenave@246: (def hxc-titles ocsenave@246: "The hardcoded names of the trainer titles in memory. List begins at ocsenave@246: ROM@27E77" ocsenave@246: (map character-codes->str ocsenave@246: (take-nth 2 ocsenave@246: (partition-by #(= 0x50 %) ocsenave@246: (take 196 ocsenave@246: (drop 0x27E77 ocsenave@246: (rom (root)))))))) ocsenave@246: ocsenave@246: ocsenave@246: (def hxc-places ocsenave@246: "The hardcoded place names in memory. List begins at ocsenave@246: ROM@71500. Cinnabar Mansion is dynamically calculated." ocsenave@246: (map character-codes->str ocsenave@246: (take-nth 2 ocsenave@246: (partition-by #(= % 0x50) ocsenave@246: (take 560 ocsenave@246: (drop 0x71500 ocsenave@246: (rom (root)))))))) ocsenave@246: ocsenave@246: ocsenave@246: (def hxc-dialog ocsenave@246: "The hardcoded dialogue in memory, including in-game alerts. List begins at ROM@98000." ocsenave@246: (character-codes->str(take 0x0F728 ocsenave@246: (drop (+ 0x98000) ocsenave@246: (rom (root)))))) ocsenave@246: ocsenave@246: (def hxc-pokedex ocsenave@246: "The hardcoded pokedex entries in memory. List begins at ocsenave@246: ROM@B8000, shortly before move names." ocsenave@246: (map character-codes->str ocsenave@246: (take-nth 2 ocsenave@246: (partition-by #(= % 0x50) ocsenave@246: (take 14754 ocsenave@246: (drop 0xB8000 ocsenave@246: (rom (root)))))))) ocsenave@246: (def hxc-move-names ocsenave@246: "The hardcoded move names in memory. List begins at ROM@BC000" ocsenave@246: (map character-codes->str ocsenave@246: (take-nth 2 ocsenave@246: (partition-by #(= % 0x50) ocsenave@246: (take 1551 ocsenave@246: (drop 0xBC000 ocsenave@246: (rom (root)))))))) ocsenave@246: ocsenave@246: (def hxc-move-data ocsenave@246: "The hardcoded (basic (move effects)) in memory. List begins at ocsenave@246: 0x38000. Effect descriptions were handwritten and aren't hardcoded." ocsenave@246: (let [names (vec hxc-move-names) ocsenave@246: move-count (count names) ocsenave@246: move-size 6 ocsenave@246: format-name (fn [s] ocsenave@246: (keyword (.toLowerCase ocsenave@246: (apply str ocsenave@246: (map #(if (= % \space) "-" %) s))))) ocsenave@246: ] ocsenave@246: (zipmap (map format-name names) ocsenave@246: (map ocsenave@246: (fn [[idx effect power type accuracy pp]] ocsenave@246: {:name (names (dec idx)) ocsenave@246: :power power ocsenave@246: :accuracy (hex accuracy) ocsenave@246: :pp pp ocsenave@246: :fx-id (hex effect) ocsenave@246: :fx-txt (get move-effects effect) ocsenave@246: } ocsenave@246: ) ocsenave@246: ocsenave@246: (partition move-size ocsenave@246: (take (* move-size move-count) ocsenave@246: (drop 0x38000 (rom(root))))))))) ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: (def hxc-pokenames ocsenave@246: "The hardcoded names of the 190 species in memory. List begins at ROM@E8000." ocsenave@246: (let [count-species 190 ocsenave@246: name-length 10] ocsenave@246: (map character-codes->str ocsenave@246: (partition name-length ocsenave@246: (take (* count-species name-length) ocsenave@246: (drop 0xE8000 ocsenave@246: (rom(root)))))))) ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@246: ocsenave@243: (def hxc-advantage ocsenave@245: "The hardcoded type advantages in memory, returned as tuples of [atk-type def-type multiplier]. By default (i.e. if not listed here), the multiplier is 1." ocsenave@243: (map ocsenave@243: (fn [[atk def mult]] [(get pkmn-types atk (hex atk)) ocsenave@243: (get pkmn-types def (hex def)) ocsenave@243: (/ mult 10)]) ocsenave@243: (partition 3 ocsenave@243: (take-while (partial not= 0xFF) ocsenave@243: (drop 0x3E62D (rom(root))))))) ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@246: ;; note for later: credits start at F1290 ocsenave@243: ocsenave@243: ocsenave@243: ocsenave@246: (comment ocsenave@243: rlm@218: (def hxc-later rlm@218: "Running this code produces, e.g. hardcoded names NPCs give rlm@218: their pokemon. Will sort through it later." rlm@218: (print (character-codes->str(take 10000 rlm@218: (drop 0x71597 rlm@218: (rom (root))))))) rlm@218: rlm@218: (let [dex rlm@218: (partition-by #(= 0x50 %) rlm@218: (take 2540 rlm@218: (drop 0x40687 rlm@218: (rom (root)))))] rlm@218: (def dex dex) rlm@218: (def hxc-species rlm@218: (map character-codes->str rlm@218: (take-nth 4 dex)))) ocsenave@246: )