diff options
-rw-r--r-- | arm9/asm/party.s | 367 | ||||
-rw-r--r-- | arm9/src/party.c | 127 | ||||
-rw-r--r-- | include/MWC_string.h | 8 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rw-r--r-- | include/party.h | 19 | ||||
-rw-r--r-- | include/pokemon.h | 12 | ||||
-rw-r--r-- | include/proto.h | 1 |
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 |