# HG changeset patch # User Robert McIntyre # Date 1332465009 18000 # Node ID 893c753f808840b7d7541653a144c1ec6e1cbf2f # Parent 9a7a46c4aa1b1ac7ffbffe6cb8899a87e5818684 added function to set ROM diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/experience.clj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clojure/com/aurellem/gb/experience.clj Thu Mar 22 20:10:09 2012 -0500 @@ -0,0 +1,67 @@ +(ns com.aurellem.gb.experience + (:use (com.aurellem.gb gb-driver util constants)) + (:import [com.aurellem.gb.gb_driver SaveState])) + +(def experience-pokemon-1 0xD178) + +(defn experience-start-address [poke-num] + (+ experience-pokemon-1 + (* pokemon-record-width poke-num))) + +(def experience-record-width 13) + +(defn read-experience + ([^SaveState state poke-num] + (let [start (experience-start-address poke-num) + [exp-h + exp-m + exp-l + hp-exp-h + hp-exp-l + attack-exp-h + attack-exp-l + defense-exp-h + defense-exp-l + speed-exp-h + speed-exp-l + special-exp-h + special-exp-l] + (subvec (vec (memory state)) + start (+ experience-record-width start)) + glue-bytes (fn [l h] + (+ l (bit-shift-left h 8)))] + {:main-exp (+ (glue-bytes exp-l exp-m) + (bit-shift-left exp-h 16)) + :hp-exp (glue-bytes hp-exp-l hp-exp-h) + :attack-exp (glue-bytes attack-exp-l attack-exp-h) + :defense-exp (glue-bytes defense-exp-l defense-exp-h) + :speed-exp (glue-bytes speed-exp-l speed-exp-h) + :special-exp (glue-bytes special-exp-l special-exp-h)})) + ([poke-num] + (read-experience @current-state poke-num))) + +(defn give-experience + ([^SaveState state poke-num exp] + (let [exp* (merge (read-experience state poke-num) + exp) + + disect-bytes + (fn [exp] + [(bit-shift-right + (bit-and exp 0xFF00) 8) + (bit-and exp 0xFF)]) + + raw-exp-data + (flatten + [(bit-shift-right (bit-and (:main-exp exp*) 0xFF0000) 16) + (disect-bytes (:main-exp exp*)) + (disect-bytes (:hp-exp exp*)) + (disect-bytes (:attack-exp exp*)) + (disect-bytes (:defense-exp exp*)) + (disect-bytes (:speed-exp exp*)) + (disect-bytes (:special-exp exp*))])] + (set-memory-range state + (experience-start-address poke-num) + raw-exp-data))) + ([poke-num exp] + (give-experience @current-state poke-num exp))) diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/gb_driver.clj --- a/clojure/com/aurellem/gb/gb_driver.clj Thu Mar 22 16:34:10 2012 -0500 +++ b/clojure/com/aurellem/gb/gb_driver.clj Thu Mar 22 20:10:09 2012 -0500 @@ -201,6 +201,9 @@ (def write-registers! (write-cpu-data Gb/NUM_REGISTERS #(Gb/writeRegisters %))) +(def write-rom! + (write-cpu-data Gb/ROM_SIZE #(Gb/writeROM %))) + ;;;;; Registers ;;;;;;;;;;;;;;;;;;;;;;;;;;; (defmacro gen-get-set-register [name index] diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/items.clj --- a/clojure/com/aurellem/gb/items.clj Thu Mar 22 16:34:10 2012 -0500 +++ b/clojure/com/aurellem/gb/items.clj Thu Mar 22 20:10:09 2012 -0500 @@ -3,7 +3,9 @@ ;; this is bullshit (:import [com.aurellem.gb.gb_driver SaveState])) -(defn game-name [] +(defn game-name + "return pokemon-yellow header information" + [] (map char (subvec (vec (memory)) 0x134 0x142))) (def item-list-start 0xD31C) diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/moves.clj --- a/clojure/com/aurellem/gb/moves.clj Thu Mar 22 16:34:10 2012 -0500 +++ b/clojure/com/aurellem/gb/moves.clj Thu Mar 22 20:10:09 2012 -0500 @@ -187,7 +187,7 @@ (let [start (moves-codes-start poke-num)] (vec (take-while - (partial not= (move-name->move-code :end-of-moves)) + (partial not= :end-of-moves) (map move-code->move-name (subvec (vec (memory state)) @@ -195,14 +195,15 @@ ([poke-num] (read-moves @current-state poke-num))) - - (defn give-moves ([^SaveState state pokemon-num moves] + (assert (<= (count moves) 4)) (set-memory-range state (moves-codes-start pokemon-num) - (map #(move-name->move-code % %) moves))) + (map #(move-name->move-code % %) + (concat moves + (repeat (- 4 (count moves)) :end-of-moves))))) ([pokemon-num moves] (give-moves @current-state pokemon-num moves)) ([moves] @@ -216,7 +217,6 @@ ;; thus, a move can have up to 63 current pp and up to ;; three pp-ups applied. - (def pokemon-1-pp-start 0xD187) (defn moves-pp-start [pokemon-num] diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/pokemon.clj --- a/clojure/com/aurellem/gb/pokemon.clj Thu Mar 22 16:34:10 2012 -0500 +++ b/clojure/com/aurellem/gb/pokemon.clj Thu Mar 22 20:10:09 2012 -0500 @@ -1,7 +1,7 @@ (ns com.aurellem.gb.pokemon (:use (com.aurellem.gb gb-driver util constants characters moves types items status dv species - + experience )) (:import [com.aurellem.gb.gb_driver SaveState])) @@ -35,6 +35,12 @@ raw-names))))) ([] (party-names @current-state))) +(defn pokemon-nickname + ([^SaveState state poke-num] + (nth (party-names state) poke-num)) + ([poke-num] + (pokemon-nickname @current-state poke-num))) + (defn rename-pokemon ([^SaveState state n new-name] (assert (<= 0 n (dec (party-number state)))) @@ -185,15 +191,33 @@ (def mint-berry-item-code-gsc 0x54) -(defn pokemon-info [^SaveState state poke-num] - (assert (<= 0 poke-num 5)) - (let [dv-values (read-DV state poke-num) - type (read-type state poke-num) - species (read-species state poke-num) - - ] +(defn pokemon-info + ([^SaveState state poke-num] + (assert (<= 0 poke-num 5)) + (let [dv-values (read-DV state poke-num) + type (read-type state poke-num) + species (read-species state poke-num) + species2 (read-species2 state poke-num) + moves (read-moves state poke-num) + moves-pp (mapv (partial read-pp state + poke-num) + (range (count moves))) + nickname (pokemon-nickname state poke-num) + status (read-status state poke-num) + experience (read-experience state poke-num) + ] - + {:name nickname + :species species + :species2 species2 + :type type + :dv dv-values + :moves (zipmap moves moves-pp) - - )) + :satus status + :experience experience + } + )) + ([poke-num] + (pokemon-info @current-state poke-num))) + diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/species.clj --- a/clojure/com/aurellem/gb/species.clj Thu Mar 22 16:34:10 2012 -0500 +++ b/clojure/com/aurellem/gb/species.clj Thu Mar 22 20:10:09 2012 -0500 @@ -1,5 +1,5 @@ (ns com.aurellem.gb.species - (:use (com.aurellem.gb gb-driver util)) + (:use (com.aurellem.gb gb-driver util constants)) (:import [com.aurellem.gb.gb_driver SaveState])) (def species-code->species-name @@ -186,3 +186,29 @@ (set-species @current-state poke-num species-name))) +(def pokemon-1-species2-address 0xD16A) + +(defn pokemon-species2-address [poke-num] + (+ pokemon-1-species2-address + (* pokemon-record-width poke-num))) + +(defn read-species2 + ([^SaveState state poke-num] + (species-code->species-name + (aget (memory state) + (pokemon-species2-address poke-num)))) + ([poke-num] + (read-species2 @current-state poke-num))) + +(defn set-species2 + ([^SaveState state poke-num new-species] + (let [species-code (species-name->species-code + new-species + new-species)] + + (set-memory state (pokemon-species2-address poke-num) + species-code))) + ([poke-num new-species] + (set-species2 @current-state poke-num new-species))) + + \ No newline at end of file diff -r 9a7a46c4aa1b -r 893c753f8088 clojure/com/aurellem/gb/status.clj --- a/clojure/com/aurellem/gb/status.clj Thu Mar 22 16:34:10 2012 -0500 +++ b/clojure/com/aurellem/gb/status.clj Thu Mar 22 20:10:09 2012 -0500 @@ -25,7 +25,16 @@ (+ pokemon-1-status-address (* poke-num pokemon-record-width))) -(defn give-stat +(defn read-status + ([^SaveState state poke-num] + (assert (<= 0 poke-num 5)) + (status-code->status-name + (aget (memory state) + (pokemon-status-address poke-num)))) + ([poke-num] + (read-status @current-state poke-num))) + +(defn give-status ([^SaveState state poke-num status] (assert (<= 0 poke-num 5)) (let [status-code @@ -39,7 +48,7 @@ ([status] (give-stat @current-state 0 status))) -(defn give-stat-all +(defn give-status-all ([^SaveState state status] (reduce (fn [state num] (give-stat state num status)) diff -r 9a7a46c4aa1b -r 893c753f8088 java/src/com/aurellem/gb/Gb.java --- a/java/src/com/aurellem/gb/Gb.java Thu Mar 22 16:34:10 2012 -0500 +++ b/java/src/com/aurellem/gb/Gb.java Thu Mar 22 20:10:09 2012 -0500 @@ -109,6 +109,8 @@ public static native void getROM(int[] store); + public static native void writeROM(int[] newROM); + public static native void getWRAM(int[] store); public static native void getVRAM(int[] store); diff -r 9a7a46c4aa1b -r 893c753f8088 src/clojure/clojure.cpp --- a/src/clojure/clojure.cpp Thu Mar 22 16:34:10 2012 -0500 +++ b/src/clojure/clojure.cpp Thu Mar 22 20:10:09 2012 -0500 @@ -184,6 +184,20 @@ /* * Class: com_aurellem_gb_Gb + * Method: writeROM + * Signature: ([I)V + */ +JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_writeROM +(JNIEnv *env, jclass clazz, jintArray arr){ + jint *new_rom = env->GetIntArrayElements(arr, 0); + writeRom(new_rom); + env->ReleaseIntArrayElements(arr, new_rom, 0); +} + + + +/* + * Class: com_aurellem_gb_Gb * Method: getWRAM * Signature: ([I)V */ diff -r 9a7a46c4aa1b -r 893c753f8088 src/gb/GB.cpp --- a/src/gb/GB.cpp Thu Mar 22 16:34:10 2012 -0500 +++ b/src/gb/GB.cpp Thu Mar 22 20:10:09 2012 -0500 @@ -3920,6 +3920,13 @@ } } +void writeRom(int32* new_rom){ + int i; + for (i = 0; i < gbRomSize; i++){ + gbRom[i] = (u8)(0xFF & new_rom[i]); + } +} + void storeWRam(int32* store){ int i; for (i = 0; i < 0x8000; i++){ diff -r 9a7a46c4aa1b -r 893c753f8088 src/gb/GB.h --- a/src/gb/GB.h Thu Mar 22 16:34:10 2012 -0500 +++ b/src/gb/GB.h Thu Mar 22 20:10:09 2012 -0500 @@ -52,6 +52,8 @@ extern void storeRam(int32 *); extern void storeRom(int32 *); +extern void writeRom(int32 *); + extern void storeWRam(int32 *); extern void storeVRam(int32 *); extern void storeRegisters(int32 *);