summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/party.s367
-rw-r--r--arm9/src/party.c127
-rw-r--r--include/MWC_string.h8
-rw-r--r--include/global.h2
-rw-r--r--include/party.h19
-rw-r--r--include/pokemon.h12
-rw-r--r--include/proto.h1
7 files changed, 158 insertions, 378 deletions
diff --git a/arm9/asm/party.s b/arm9/asm/party.s
deleted file mode 100644
index de141e25..00000000
--- a/arm9/asm/party.s
+++ /dev/null
@@ -1,367 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- thumb_func_start FUN_0206B8A4
-FUN_0206B8A4: ; 0x0206B8A4
- mov r0, #0x59
- lsl r0, r0, #0x4
- bx lr
- .balign 4
-
- thumb_func_start FUN_0206B8AC
-FUN_0206B8AC: ; 0x0206B8AC
- push {r4, lr}
- mov r1, #0x59
- lsl r1, r1, #0x4
- bl AllocFromHeap
- add r4, r0, #0x0
- bl FUN_0206B8C0
- add r0, r4, #0x0
- pop {r4, pc}
-
- thumb_func_start FUN_0206B8C0
-FUN_0206B8C0: ; 0x0206B8C0
- ldr r3, _0206B8C8 ; =FUN_0206B8CC
- mov r1, #0x6
- bx r3
- nop
-_0206B8C8: .word FUN_0206B8CC
-
- thumb_func_start FUN_0206B8CC
-FUN_0206B8CC: ; 0x0206B8CC
- push {r4-r6, lr}
- add r6, r1, #0x0
- add r5, r0, #0x0
- cmp r6, #0x6
- ble _0206B8DA
- bl ErrorHandling
-_0206B8DA:
- mov r2, #0x59
- add r0, r5, #0x0
- mov r1, #0x0
- lsl r2, r2, #0x4
- bl memset
- mov r4, #0x0
- str r4, [r5, #0x4]
- str r6, [r5, #0x0]
- add r5, #0x8
-_0206B8EE:
- add r0, r5, #0x0
- bl ZeroMonData
- add r4, r4, #0x1
- add r5, #0xec
- cmp r4, #0x6
- blt _0206B8EE
- pop {r4-r6, pc}
- .balign 4
-
- thumb_func_start FUN_0206B900
-FUN_0206B900: ; 0x0206B900
- push {r4-r5}
- add r3, r0, #0x0
- add r2, r1, #0x0
- ldr r1, [r3, #0x4]
- ldr r0, [r3, #0x0]
- cmp r1, r0
- blt _0206B914
- mov r0, #0x0
- pop {r4-r5}
- bx lr
-_0206B914:
- mov r0, #0xec
- mul r0, r1
- add r5, r3, r0
- add r5, #0x8
- mov r4, #0x1d
-_0206B91E:
- ldmia r2!, {r0-r1}
- stmia r5!, {r0-r1}
- sub r4, r4, #0x1
- bne _0206B91E
- ldr r0, [r2, #0x0]
- str r0, [r5, #0x0]
- ldr r0, [r3, #0x4]
- add r0, r0, #0x1
- str r0, [r3, #0x4]
- mov r0, #0x1
- pop {r4-r5}
- bx lr
- .balign 4
-
- thumb_func_start FUN_0206B938
-FUN_0206B938: ; 0x0206B938
- push {r3-r7, lr}
- add r7, r0, #0x0
- add r4, r1, #0x0
- bpl _0206B944
- bl ErrorHandling
-_0206B944:
- ldr r0, [r7, #0x4]
- cmp r4, r0
- blt _0206B94E
- bl ErrorHandling
-_0206B94E:
- ldr r0, [r7, #0x0]
- cmp r4, r0
- blt _0206B958
- bl ErrorHandling
-_0206B958:
- ldr r0, [r7, #0x4]
- cmp r0, #0x0
- bgt _0206B962
- bl ErrorHandling
-_0206B962:
- ldr r0, [r7, #0x4]
- sub r0, r0, #0x1
- cmp r4, r0
- bge _0206B992
- mov r0, #0xec
- mul r0, r4
- add r6, r7, r0
-_0206B970:
- add r5, r6, #0x0
- add r3, r6, #0x0
- add r5, #0xf4
- add r3, #0x8
- mov r2, #0x1d
-_0206B97A:
- ldmia r5!, {r0-r1}
- stmia r3!, {r0-r1}
- sub r2, r2, #0x1
- bne _0206B97A
- ldr r0, [r5, #0x0]
- add r4, r4, #0x1
- str r0, [r3, #0x0]
- ldr r0, [r7, #0x4]
- add r6, #0xec
- sub r0, r0, #0x1
- cmp r4, r0
- blt _0206B970
-_0206B992:
- add r1, r7, #0x0
- mov r0, #0xec
- add r1, #0x8
- mul r0, r4
- add r0, r1, r0
- bl ZeroMonData
- ldr r0, [r7, #0x4]
- sub r0, r0, #0x1
- str r0, [r7, #0x4]
- mov r0, #0x1
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start GetPartyCount
-GetPartyCount: ; 0x0206B9AC
- ldr r0, [r0, #0x4]
- bx lr
-
- thumb_func_start GetPartyMonByIndex
-GetPartyMonByIndex: ; 0x0206B9B0
- push {r3-r5, lr}
- add r5, r0, #0x0
- add r4, r1, #0x0
- bpl _0206B9BC
- bl ErrorHandling
-_0206B9BC:
- ldr r0, [r5, #0x4]
- cmp r4, r0
- blt _0206B9C6
- bl ErrorHandling
-_0206B9C6:
- ldr r0, [r5, #0x0]
- cmp r4, r0
- blt _0206B9D0
- bl ErrorHandling
-_0206B9D0:
- mov r0, #0xec
- add r5, #0x8
- mul r0, r4
- add r0, r5, r0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_0206B9DC
-FUN_0206B9DC: ; 0x0206B9DC
- push {r3-r7, lr}
- add r4, r1, #0x0
- add r5, r0, #0x0
- add r6, r2, #0x0
- cmp r4, #0x0
- bge _0206B9EC
- bl ErrorHandling
-_0206B9EC:
- ldr r0, [r5, #0x4]
- cmp r4, r0
- blt _0206B9F6
- bl ErrorHandling
-_0206B9F6:
- ldr r0, [r5, #0x0]
- cmp r4, r0
- blt _0206BA00
- bl ErrorHandling
-_0206BA00:
- add r1, r5, #0x0
- mov r0, #0xec
- add r1, #0x8
- mul r0, r4
- add r4, r1, r0
- add r0, r4, #0x0
- mov r1, #0xab
- mov r2, #0x0
- bl GetMonData
- add r7, r0, #0x0
- add r0, r6, #0x0
- mov r1, #0xab
- mov r2, #0x0
- bl GetMonData
- sub r2, r7, r0
- mov r3, #0x1d
-_0206BA24:
- ldmia r6!, {r0-r1}
- stmia r4!, {r0-r1}
- sub r3, r3, #0x1
- bne _0206BA24
- ldr r0, [r6, #0x0]
- str r0, [r4, #0x0]
- ldr r0, [r5, #0x4]
- add r0, r0, r2
- str r0, [r5, #0x4]
- pop {r3-r7, pc}
-
- thumb_func_start FUN_0206BA38
-FUN_0206BA38: ; 0x0206BA38
- push {r3-r7, lr}
- add r5, r1, #0x0
- add r4, r0, #0x0
- add r6, r2, #0x0
- cmp r5, #0x0
- bge _0206BA48
- bl ErrorHandling
-_0206BA48:
- ldr r0, [r4, #0x4]
- cmp r5, r0
- blt _0206BA52
- bl ErrorHandling
-_0206BA52:
- ldr r0, [r4, #0x0]
- cmp r5, r0
- blt _0206BA5C
- bl ErrorHandling
-_0206BA5C:
- cmp r6, #0x0
- bge _0206BA64
- bl ErrorHandling
-_0206BA64:
- ldr r0, [r4, #0x4]
- cmp r6, r0
- blt _0206BA6E
- bl ErrorHandling
-_0206BA6E:
- ldr r0, [r4, #0x0]
- cmp r6, r0
- blt _0206BA78
- bl ErrorHandling
-_0206BA78:
- mov r0, #0x0
- mov r1, #0xec
- bl AllocFromHeap
- mov r12, r0
- add r1, r4, #0x0
- mov r0, #0xec
- add r1, #0x8
- mul r0, r5
- add r3, r1, r0
- add r5, r3, #0x0
- mov r2, r12
- mov r7, #0x1d
-_0206BA92:
- ldmia r5!, {r0-r1}
- stmia r2!, {r0-r1}
- sub r7, r7, #0x1
- bne _0206BA92
- ldr r0, [r5, #0x0]
- add r4, #0x8
- str r0, [r2, #0x0]
- mov r0, #0xec
- mul r0, r6
- add r2, r4, r0
- add r5, r2, #0x0
- mov r4, #0x1d
-_0206BAAA:
- ldmia r5!, {r0-r1}
- stmia r3!, {r0-r1}
- sub r4, r4, #0x1
- bne _0206BAAA
- ldr r0, [r5, #0x0]
- mov r4, r12
- str r0, [r3, #0x0]
- mov r3, #0x1d
-_0206BABA:
- ldmia r4!, {r0-r1}
- stmia r2!, {r0-r1}
- sub r3, r3, #0x1
- bne _0206BABA
- ldr r0, [r4, #0x0]
- str r0, [r2, #0x0]
- mov r0, r12
- bl FreeToHeap
- mov r0, #0x0
- pop {r3-r7, pc}
-
- thumb_func_start FUN_0206BAD0
-FUN_0206BAD0: ; 0x0206BAD0
- push {r3-r4}
- add r4, r0, #0x0
- add r3, r1, #0x0
- mov r2, #0xb2
-_0206BAD8:
- ldmia r4!, {r0-r1}
- stmia r3!, {r0-r1}
- sub r2, r2, #0x1
- bne _0206BAD8
- pop {r3-r4}
- bx lr
-
- thumb_func_start PartyHasMon
-PartyHasMon: ; 0x0206BAE4
- push {r3-r7, lr}
- add r6, r0, #0x0
- ldr r0, [r6, #0x4]
- add r7, r1, #0x0
- mov r4, #0x0
- cmp r0, #0x0
- ble _0206BB0E
- add r5, r6, #0x0
- add r5, #0x8
-_0206BAF6:
- add r0, r5, #0x0
- mov r1, #0x5
- mov r2, #0x0
- bl GetMonData
- cmp r7, r0
- beq _0206BB0E
- ldr r0, [r6, #0x4]
- add r4, r4, #0x1
- add r5, #0xec
- cmp r4, r0
- blt _0206BAF6
-_0206BB0E:
- ldr r0, [r6, #0x4]
- cmp r4, r0
- beq _0206BB18
- mov r0, #0x1
- pop {r3-r7, pc}
-_0206BB18:
- mov r0, #0x0
- pop {r3-r7, pc}
-
- thumb_func_start FUN_0206BB1C
-FUN_0206BB1C: ; 0x0206BB1C
- ldr r3, _0206BB24 ; =FUN_02022610
- mov r1, #0x2
- bx r3
- nop
-_0206BB24: .word FUN_02022610
diff --git a/arm9/src/party.c b/arm9/src/party.c
new file mode 100644
index 00000000..d7799fe2
--- /dev/null
+++ b/arm9/src/party.c
@@ -0,0 +1,127 @@
+#include "global.h"
+#include "party.h"
+#include "heap.h"
+#include "proto.h"
+
+#pragma thumb on
+
+void FUN_0206B8C0(struct PlayerParty * party);
+void FUN_0206B8CC(struct PlayerParty * party, int count);
+
+u32 FUN_0206B8A4(void)
+{
+ return sizeof(struct PlayerParty);
+}
+
+struct PlayerParty * FUN_0206B8AC(u32 heap_id)
+{
+ struct PlayerParty * ret = (struct PlayerParty *)AllocFromHeap(heap_id, sizeof(struct PlayerParty));
+ FUN_0206B8C0(ret);
+ return ret;
+}
+
+void FUN_0206B8C0(struct PlayerParty * party)
+{
+ FUN_0206B8CC(party, PARTY_SIZE);
+}
+
+void FUN_0206B8CC(struct PlayerParty * party, int count)
+{
+ int i;
+ GF_ASSERT(count <= PARTY_SIZE);
+ memset(party, 0, sizeof(struct PlayerParty));
+ party->curCount = 0;
+ party->maxCount = count;
+ for (i = 0; i < 6; i++)
+ ZeroMonData(&party->mons[i]);
+}
+
+BOOL FUN_0206B900(struct PlayerParty * party, struct Pokemon * pokemon)
+{
+ if (party->curCount >= party->maxCount)
+ return FALSE;
+ party->mons[party->curCount] = *pokemon;
+ party->curCount++;
+ return TRUE;
+}
+
+BOOL FUN_0206B938(struct PlayerParty * party, int pos)
+{
+ int i;
+
+ GF_ASSERT(pos >= 0);
+ GF_ASSERT(pos < party->curCount);
+ GF_ASSERT(pos < party->maxCount);
+ GF_ASSERT(party->curCount > 0);
+
+ for (i = pos; i < party->curCount - 1; i++)
+ {
+ party->mons[i] = party->mons[i + 1];
+ }
+
+ ZeroMonData(&party->mons[i]);
+ party->curCount--;
+ return TRUE;
+}
+
+int GetPartyCount(struct PlayerParty * party)
+{
+ return party->curCount;
+}
+
+struct Pokemon * GetPartyMonByIndex(struct PlayerParty * party, int pos)
+{
+ GF_ASSERT(pos >= 0);
+ GF_ASSERT(pos < party->curCount);
+ GF_ASSERT(pos < party->maxCount);
+ return &party->mons[pos];
+}
+
+void FUN_0206B9DC(struct PlayerParty * party, int pos, struct Pokemon * pokemon)
+{
+ int r2;
+ GF_ASSERT(pos >= 0);
+ GF_ASSERT(pos < party->curCount);
+ GF_ASSERT(pos < party->maxCount);
+ r2 = (int)(GetMonData(&party->mons[pos], MON_DATA_SPECIES_EXISTS, NULL) - GetMonData(pokemon, MON_DATA_SPECIES_EXISTS, NULL));
+ party->mons[pos] = *pokemon;
+ party->curCount += r2;
+}
+
+BOOL FUN_0206BA38(struct PlayerParty * party, int pos1, int pos2)
+{
+ struct Pokemon * buffer;
+ GF_ASSERT(pos1 >= 0);
+ GF_ASSERT(pos1 < party->curCount);
+ GF_ASSERT(pos1 < party->maxCount);
+ GF_ASSERT(pos2 >= 0);
+ GF_ASSERT(pos2 < party->curCount);
+ GF_ASSERT(pos2 < party->maxCount);
+ buffer = AllocFromHeap(0, sizeof(struct Pokemon));
+ *buffer = party->mons[pos1];
+ party->mons[pos1] = party->mons[pos2];
+ party->mons[pos2] = *buffer;
+ FreeToHeap(buffer);
+ return FALSE;
+}
+
+void FUN_0206BAD0(struct PlayerParty * src, struct PlayerParty * dest)
+{
+ *dest = *src;
+}
+
+BOOL PartyHasMon(struct PlayerParty * party, u16 species)
+{
+ int i;
+ for (i = 0; i < party->curCount; i++)
+ {
+ if (species == GetMonData(&party->mons[i], MON_DATA_SPECIES, NULL))
+ break;
+ }
+ return i != party->curCount;
+}
+
+struct PlayerParty * FUN_0206BB1C(void * ptr)
+{
+ return (struct PlayerParty *)FUN_02022610(ptr, 2);
+}
diff --git a/include/MWC_string.h b/include/MWC_string.h
new file mode 100644
index 00000000..d2980fb6
--- /dev/null
+++ b/include/MWC_string.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_MWC_STRING_H
+#define GUARD_MWC_STRING_H
+
+#include "nitro/types.h"
+
+void * memset(void *, int, u32);
+
+#endif //GUARD_MWC_STRING_H
diff --git a/include/global.h b/include/global.h
index 2574c437..88ca58ff 100644
--- a/include/global.h
+++ b/include/global.h
@@ -2,6 +2,8 @@
#define GUARD_GLOBAL_H
#include "config.h"
+
+#include "MWC_string.h"
#include "function_target.h"
#include "nitro.h"
#include "constants/global.h"
diff --git a/include/party.h b/include/party.h
index b6065a3f..eca62239 100644
--- a/include/party.h
+++ b/include/party.h
@@ -3,17 +3,18 @@
#include "pokemon.h"
-#define PARTY_SIZE 6
-
-struct PlayerParty
-{
- u32 maxCount;
- u32 curCount;
- struct Pokemon mons[PARTY_SIZE];
-};
-
BOOL PartyHasMon(struct PlayerParty * party_p, u16 species);
int GetPartyCount(struct PlayerParty * party_p);
struct Pokemon * GetPartyMonByIndex(struct PlayerParty * party_p, int idx);
+u32 FUN_0206B8A4(void);
+struct PlayerParty * FUN_0206B8AC(u32 heap_id);
+void FUN_0206B8C0(struct PlayerParty * party);
+void FUN_0206B8CC(struct PlayerParty * party, int count);
+BOOL FUN_0206B900(struct PlayerParty * party, struct Pokemon * pokemon);
+BOOL FUN_0206B938(struct PlayerParty * party, int pos);
+void FUN_0206B9DC(struct PlayerParty * party, int pos, struct Pokemon * pokemon);
+BOOL FUN_0206BA38(struct PlayerParty * party, int pos1, int pos2);
+void FUN_0206BAD0(struct PlayerParty * src, struct PlayerParty * dest);
+struct PlayerParty * FUN_0206BB1C(void * ptr);
#endif //POKEDIAMOND_PARTY_H
diff --git a/include/pokemon.h b/include/pokemon.h
index 8e2eec3d..01a03763 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -182,8 +182,6 @@ struct Pokemon {
/* 0x088 */ struct PartyPokemon party;
}; // size: 0xEC
-#include "party.h"
-
struct SomeDrawPokemonStruct
{
u16 unk0;
@@ -223,6 +221,15 @@ struct Evolution
u16 target;
};
+#define PARTY_SIZE 6
+
+struct PlayerParty
+{
+ int maxCount;
+ int curCount;
+ struct Pokemon mons[PARTY_SIZE];
+};
+
void ZeroMonData(struct Pokemon * pokemon);
void ZeroBoxMonData(struct BoxPokemon * boxmon);
u32 SizeOfStructPokemon(void);
@@ -289,6 +296,7 @@ u32 FUN_020690C4(void);
u32 FUN_020690C8(void);
u8 FUN_020690CC(struct Pokemon * pokemon);
struct BoxPokemon * FUN_020690E4(struct Pokemon * pokemon);
+
u16 GetMonEvolution(struct PlayerParty * party, struct Pokemon * pokemon, u32 context, u32 usedItem, u32 * method_ret);
u16 ReadFromPersonalPmsNarc(u16 species);
u16 GetEggSpecies(u16 species);
diff --git a/include/proto.h b/include/proto.h
index 6f022d90..2e7d19b3 100644
--- a/include/proto.h
+++ b/include/proto.h
@@ -19,5 +19,6 @@ void FUN_02005E80(int);
void FUN_02005E90(int, int, int, int);
void FUN_020056AC(int, int, int, int, int);
void FUN_020808AC(struct BoxPokemon *, int, int, int, int);
+void * FUN_02022610(void *, int);
#endif //POKEDIAMOND_PROTO_H