summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/pokemon_1.s19
-rw-r--r--include/pokemon.h18
-rw-r--r--src/pokemon_1.c37
-rw-r--r--src/pokemon_mid.c2
4 files changed, 52 insertions, 24 deletions
diff --git a/asm/pokemon_1.s b/asm/pokemon_1.s
index fababf5..4ca25ef 100644
--- a/asm/pokemon_1.s
+++ b/asm/pokemon_1.s
@@ -181,23 +181,4 @@ sub_808DD18:
_0808DD44: .4byte gMonsterParameters
thumb_func_end sub_808DD18
- thumb_func_start sub_808DD48
-sub_808DD48:
- lsls r0, 16
- asrs r0, 16
- ldr r2, _0808DD64
- ldr r3, [r2]
- lsls r2, r0, 3
- adds r2, r0
- lsls r2, 3
- adds r2, r3
- ldr r3, [r2, 0x38]
- ldr r2, [r2, 0x34]
- str r2, [r1]
- str r3, [r1, 0x4]
- bx lr
- .align 2, 0
-_0808DD64: .4byte gMonsterParameters
- thumb_func_end sub_808DD48
-
.align 2,0 @ don't pad with nop
diff --git a/include/pokemon.h b/include/pokemon.h
index 0b408e3..6c18f7d 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -1,6 +1,18 @@
#ifndef POKEMON_H
#define POKEMON_H
+struct EvolveStruct1
+{
+ u16 evolve_from;
+ u16 evolve_type;
+};
+
+struct EvolveNeeds
+{
+ u16 evolve_need1;
+ u16 evolve_need2;
+};
+
struct gPokemon
{
/* 0x0 */ u8* species;
@@ -36,10 +48,8 @@ struct gPokemon
/* 0x31 */ u8 unk31;
/* 0x32 */ u8 unk32;
/* 0x33 */ bool8 unk33;
- /* 0x34 */ u16 evolve_from; //verified
- /* 0x36 */ u16 evolve_type;
- /* 0x38 */ u16 evolve_need1; // verified
- /* 0x3A */ u16 evolve_need2; // verified
+ /* 0x34 */ struct EvolveStruct1 pre;
+ /* 0x38 */ struct EvolveNeeds need;
/* 0x3C */ u16 dexNo;
/* 0x3E */ u16 internalNo; // verified
/* 0x40 */ s16 base_recruit; // verified
diff --git a/src/pokemon_1.c b/src/pokemon_1.c
index 83a74b2..c2434e1 100644
--- a/src/pokemon_1.c
+++ b/src/pokemon_1.c
@@ -8,6 +8,43 @@ extern struct gPokemon *gMonsterParameters;
extern struct FileArchive gUnknown_8510000;
extern const char gUnknown_8107684;
+struct unkEvolve
+{
+ /* 0x0 */ struct EvolveStruct1 conditions;
+ /* 0x4 */ struct EvolveNeeds needs;
+};
+
+#ifndef NONMATCHING
+NAKED
+#endif
+void sub_808DD48(s16 r0, struct unkEvolve *r1)
+{
+#ifdef NONMATCHING
+ struct EvolveStruct1 temp2;
+ struct EvolveNeeds temp1;
+ temp1 = gMonsterParameters[r0].need;
+ temp2 = gMonsterParameters[r0].pre; // TODO should be using r2 but it uses r0
+ r1->conditions = temp2;
+ r1->needs = temp1;
+#else
+ asm_unified("\tlsls r0, 16\n"
+ "\tasrs r0, 16\n"
+ "\tldr r2, _0808DD64\n"
+ "\tldr r3, [r2]\n"
+ "\tlsls r2, r0, 3\n"
+ "\tadds r2, r0\n"
+ "\tlsls r2, 3\n"
+ "\tadds r2, r3\n"
+ "\tldr r3, [r2, 0x38]\n"
+ "\tldr r2, [r2, 0x34]\n"
+ "\tstr r2, [r1]\n"
+ "\tstr r3, [r1, 0x4]\n"
+ "\tbx lr\n"
+ "\t.align 2, 0\n"
+"_0808DD64: .4byte gMonsterParameters");
+#endif
+}
+
#ifndef NONMATCHING
NAKED
#endif
diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c
index e0d3f19..e348784 100644
--- a/src/pokemon_mid.c
+++ b/src/pokemon_mid.c
@@ -75,7 +75,7 @@ u8 GetUnk12(s16 r0)
s16 sub_808DC0C(s16 r0)
{
- return gMonsterParameters[r0].evolve_from;
+ return gMonsterParameters[r0].pre.evolve_from;
}
// TODO fix calculation to match