diff options
-rw-r--r-- | asm/rom3.s | 8 | ||||
-rw-r--r-- | asm/rom5.s | 40 | ||||
-rw-r--r-- | asm/rom_803D1FC.s | 215 | ||||
-rw-r--r-- | asm/rom_8040EB4.s | 14 | ||||
-rw-r--r-- | asm/rom_8065394.s | 2 | ||||
-rw-r--r-- | data/specials.s | 2 | ||||
-rw-r--r-- | ewram_syms.txt | 2 | ||||
-rw-r--r-- | include/pokemon.h | 13 | ||||
-rw-r--r-- | include/species.h | 1 | ||||
-rw-r--r-- | iwram_syms.txt | 2 | ||||
-rw-r--r-- | src/pokemon_2.c | 84 |
11 files changed, 136 insertions, 247 deletions
diff --git a/asm/rom3.s b/asm/rom3.s index 707ba0df6..8a2052dfd 100644 --- a/asm/rom3.s +++ b/asm/rom3.s @@ -63337,7 +63337,7 @@ _0802B81C: ldr r2, _0802B87C movs r1, 0x26 bl SetMonData - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r0, 24 cmp r0, 0x6 @@ -63414,7 +63414,7 @@ _0802B8CC: movs r1, 0x26 adds r2, r5, 0 bl SetMonData - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r0, 24 cmp r0, 0x6 @@ -63479,7 +63479,7 @@ sub_802B960: @ 802B960 adds r0, r1, 0 ldr r6, _0802B9D0 adds r0, r6 - bl pokemon_catch + bl GiveMonToPlayer ldr r2, _0802B9D4 ldr r1, _0802B9D8 ldrb r0, [r5] @@ -64111,7 +64111,7 @@ _0802BE98: .4byte 0x02024c07 _0802BE9C: .4byte 0x030045c0 _0802BEA0: .4byte 0x02016079 _0802BEA4: - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r0, 24 cmp r0, 0x6 diff --git a/asm/rom5.s b/asm/rom5.s index 7cf87e636..bdc8d88bb 100644 --- a/asm/rom5.s +++ b/asm/rom5.s @@ -22892,7 +22892,7 @@ _08085D7C: .4byte 0x0202eec8 thumb_func_start sub_8085D80 sub_8085D80: @ 8085D80 push {r4,lr} - bl calc_player_party_count + bl CalculatePlayerPartyCount adds r4, r0, 0 lsls r4, 24 lsrs r4, 24 @@ -23074,7 +23074,7 @@ _08085ED0: .4byte sub_8085DC4 thumb_func_start sub_8085ED4 sub_8085ED4: @ 8085ED4 push {r4,lr} - bl calc_player_party_count + bl CalculatePlayerPartyCount adds r4, r0, 0 lsls r4, 24 lsrs r4, 24 @@ -57979,7 +57979,7 @@ _080973AC: .4byte _0809743E .4byte _0809745C _080973C4: - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r0, 24 cmp r0, 0x6 @@ -59028,7 +59028,7 @@ _08097C98: lsls r0, 24 cmp r0, 0 beq _08097CB0 - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r1, _08097CB8 strb r0, [r1] ldr r0, _08097CBC @@ -59163,7 +59163,7 @@ _08097DB8: lsls r0, 24 cmp r0, 0 beq _08097DD0 - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r1, _08097DD8 strb r0, [r1] ldr r0, _08097DDC @@ -65660,7 +65660,7 @@ sub_809B068: @ 809B068 .align 2, 0 _0809B078: .4byte 0x020384e6 _0809B07C: - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r3, r0, 24 cmp r3, 0x5 @@ -87452,7 +87452,7 @@ sub_80A5B78: @ 80A5B78 beq _080A5BF2 movs r0, 0x5 bl audio_play - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 cmp r0, 0 bne _080A5BB4 @@ -88137,7 +88137,7 @@ _080A6108: lsrs r5, r0, 24 cmp r5, 0 bne _080A6168 - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 cmp r0, 0 bne _080A6128 @@ -120942,7 +120942,7 @@ pokemon_store: @ 80B5FEC ldrb r0, [r4, 0x1] cmp r0, 0x2 bne _080B6038 - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r0, 24 cmp r0, 0x5 @@ -152215,7 +152215,7 @@ sub_80C5374: @ 80C5374 add r2, sp, 0x10 bl SetMonData adds r0, r6, 0 - bl pokemon_catch + bl GiveMonToPlayer lsls r0, 24 lsrs r4, r0, 24 adds r0, r5, 0 @@ -152259,7 +152259,7 @@ sub_80C53F8: @ 80C53F8 movs r1, 0x2D bl SetMonData mov r0, sp - bl pokemon_catch + bl GiveMonToPlayer lsls r0, 24 lsrs r0, 24 add sp, 0x68 @@ -152576,7 +152576,7 @@ _080C5654: adds r4, 0x64 cmp r5, r6 ble _080C5654 - bl calc_player_party_count + bl CalculatePlayerPartyCount add sp, 0x134 pop {r4-r7} pop {r0} @@ -232067,7 +232067,7 @@ sub_80EBC10: @ 80EBC10 ldr r1, _080EBC7C movs r0, 0x14 strh r0, [r1] - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r2, _080EBC80 ldr r1, _080EBC84 adds r3, r2, r1 @@ -305887,7 +305887,7 @@ sub_810F694: @ 810F694 bl sub_8109E50 lsls r0, 16 lsrs r6, r0, 16 - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r5, r0, 24 movs r4, 0 @@ -306141,7 +306141,7 @@ _0810F878: thumb_func_start sub_810F87C sub_810F87C: @ 810F87C push {r4-r6,lr} - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r6, r0, 24 movs r5, 0 @@ -311528,7 +311528,7 @@ _08112354: bl SetMonData adds r0, r5, 0 bl CalculateMonStats - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r0, _081123F4 adds r4, r6, r7 lsls r4, 3 @@ -352217,7 +352217,7 @@ _081266C6: bl sub_80A2D88 _081266E4: bl party_compaction - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r0, _0812670C ldr r1, _08126710 bl StringExpandPlaceholders @@ -385288,7 +385288,7 @@ _08136404: ldr r1, _08136434 movs r0, 0x14 strh r0, [r1] - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r1, _08136438 ldr r4, [r1] ldr r2, _0813643C @@ -395467,7 +395467,7 @@ sub_813B630: @ 813B630 push {r4,lr} lsls r0, 24 lsrs r4, r0, 24 - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 cmp r0, 0 bne _0813B648 @@ -419479,7 +419479,7 @@ sub_8147478: @ 8147478 ldr r1, _081474B8 cmp r0, r1 bne _081474C0 - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r0, _081474BC ldrb r1, [r0] movs r0, 0x64 diff --git a/asm/rom_803D1FC.s b/asm/rom_803D1FC.s index 49009abf0..311f0aab1 100644 --- a/asm/rom_803D1FC.s +++ b/asm/rom_803D1FC.s @@ -6,224 +6,11 @@ .text - thumb_func_start CopyMon -CopyMon: @ 803D910 - push {lr} - bl memcpy - pop {r0} - bx r0 - thumb_func_end CopyMon - - thumb_func_start pokemon_catch -pokemon_catch: @ 803D91C - push {r4-r6,lr} - adds r6, r0, 0 - ldr r4, _0803D948 - movs r1, 0x7 - adds r2, r4, 0 - bl SetMonData - adds r2, r4, 0 - adds r2, 0x8 - adds r0, r6, 0 - movs r1, 0x31 - bl SetMonData - adds r4, 0xA - adds r0, r6, 0 - movs r1, 0x1 - adds r2, r4, 0 - bl SetMonData - movs r5, 0 - b _0803D94E - .align 2, 0 -_0803D948: .4byte gSaveBlock2 -_0803D94C: - adds r5, 0x1 -_0803D94E: - cmp r5, 0x5 - bgt _0803D988 - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _0803D980 - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonData - cmp r0, 0 - bne _0803D94C - adds r0, r4, 0 - adds r1, r6, 0 - movs r2, 0x64 - bl CopyMon - ldr r1, _0803D984 - adds r0, r5, 0x1 - strb r0, [r1] - movs r0, 0 - b _0803D992 - .align 2, 0 -_0803D980: .4byte 0x03004360 -_0803D984: .4byte 0x03004350 -_0803D988: - adds r0, r6, 0 - bl sub_803D998 - lsls r0, 24 - lsrs r0, 24 -_0803D992: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end pokemon_catch - - thumb_func_start sub_803D998 -sub_803D998: @ 803D998 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - mov r9, r0 - ldr r0, _0803D9E8 - ldrb r5, [r0] -_0803D9A8: - movs r7, 0 - lsls r1, r5, 2 - adds r1, r5 - lsls r0, r1, 4 - subs r0, r1 - lsls r0, 5 - mov r8, r0 - movs r6, 0 -_0803D9B8: - ldr r3, _0803D9EC - adds r0, r6, r3 - mov r1, r8 - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0xB - movs r2, 0 - str r3, [sp] - bl GetBoxMonData - ldr r3, [sp] - cmp r0, 0 - bne _0803D9F0 - mov r0, r9 - bl sub_8040B1C - adds r0, r4, 0 - mov r1, r9 - movs r2, 0x50 - bl CopyMon - movs r0, 0x1 - b _0803DA0A - .align 2, 0 -_0803D9E8: .4byte 0x020300a0 -_0803D9EC: .4byte 0x020300a4 -_0803D9F0: - adds r6, 0x50 - adds r7, 0x1 - cmp r7, 0x1D - ble _0803D9B8 - adds r5, 0x1 - cmp r5, 0xE - bne _0803DA00 - movs r5, 0 -_0803DA00: - subs r0, r3, 0x4 - ldrb r0, [r0] - cmp r5, r0 - bne _0803D9A8 - movs r0, 0x2 -_0803DA0A: - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_803D998 - - thumb_func_start calc_player_party_count -calc_player_party_count: @ 803DA18 - push {r4,lr} - ldr r0, _0803DA24 - movs r1, 0 - strb r1, [r0] - b _0803DA30 - .align 2, 0 -_0803DA24: .4byte 0x03004350 -_0803DA28: - ldrb r0, [r4] - adds r0, 0x1 - strb r0, [r4] - adds r0, r4, 0 -_0803DA30: - adds r4, r0, 0 - ldrb r0, [r4] - cmp r0, 0x5 - bhi _0803DA4E - adds r1, r0, 0 - movs r0, 0x64 - muls r0, r1 - ldr r1, _0803DA58 - adds r0, r1 - movs r1, 0xB - movs r2, 0 - bl GetMonData - cmp r0, 0 - bne _0803DA28 -_0803DA4E: - ldrb r0, [r4] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0803DA58: .4byte 0x03004360 - thumb_func_end calc_player_party_count - - thumb_func_start calc_enemy_party_count -calc_enemy_party_count: @ 803DA5C - push {r4,lr} - ldr r0, _0803DA68 - movs r1, 0 - strb r1, [r0] - b _0803DA74 - .align 2, 0 -_0803DA68: .4byte 0x030045b8 -_0803DA6C: - ldrb r0, [r4] - adds r0, 0x1 - strb r0, [r4] - adds r0, r4, 0 -_0803DA74: - adds r4, r0, 0 - ldrb r0, [r4] - cmp r0, 0x5 - bhi _0803DA92 - adds r1, r0, 0 - movs r0, 0x64 - muls r0, r1 - ldr r1, _0803DA9C - adds r0, r1 - movs r1, 0xB - movs r2, 0 - bl GetMonData - cmp r0, 0 - bne _0803DA6C -_0803DA92: - ldrb r0, [r4] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0803DA9C: .4byte 0x030045c0 - thumb_func_end calc_enemy_party_count - thumb_func_start sub_803DAA0 sub_803DAA0: @ 803DAA0 push {r4-r6,lr} movs r6, 0 - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r1, _0803DB0C ldrb r0, [r1] cmp r0, 0x1 diff --git a/asm/rom_8040EB4.s b/asm/rom_8040EB4.s index 8fb3e7508..fec754203 100644 --- a/asm/rom_8040EB4.s +++ b/asm/rom_8040EB4.s @@ -797,7 +797,7 @@ _0804144A: adds r0, r7, 0 bl ZeroMonData bl party_compaction - bl calc_player_party_count + bl CalculatePlayerPartyCount pop {r3,r4} mov r8, r3 mov r9, r4 @@ -1004,7 +1004,7 @@ _08041610: str r1, [r0] adds r0, r5, 0 bl sub_80414C0 - bl calc_player_party_count + bl CalculatePlayerPartyCount mov r0, r9 add sp, 0x68 pop {r3,r4} @@ -2337,7 +2337,7 @@ sub_8041FC4: @ 8041FC4 movs r2, 0x64 bl memcpy bl party_compaction - bl calc_player_party_count + bl CalculatePlayerPartyCount adds r0, r5, 0 bl sub_8041E64 add sp, 0x6C @@ -14665,7 +14665,7 @@ _0804813A: beq _08048148 b _080484C6 _08048148: - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r1, _08048158 ldr r2, _0804815C adds r1, r2 @@ -14684,7 +14684,7 @@ _0804816C: bl sub_804AF84 b _08048492 _08048172: - bl calc_enemy_party_count + bl CalculateEnemyPartyCount ldr r4, _08048294 ldr r0, [r4] adds r0, 0x4 @@ -15246,7 +15246,7 @@ _08048674: .align 2, 0 _0804867C: .4byte 0x0000043c _08048680: - bl calc_player_party_count + bl CalculatePlayerPartyCount ldr r1, _0804868C ldr r0, _08048690 adds r1, r0 @@ -15261,7 +15261,7 @@ _08048694: .align 2, 0 _0804869C: .4byte 0x0000043c _080486A0: - bl calc_enemy_party_count + bl CalculateEnemyPartyCount movs r1, 0x80 lsls r1, 19 movs r0, 0 diff --git a/asm/rom_8065394.s b/asm/rom_8065394.s index 41cc5a80b..c7f9b9722 100644 --- a/asm/rom_8065394.s +++ b/asm/rom_8065394.s @@ -2976,7 +2976,7 @@ _08066930: .4byte 0x02025734 s43_get_player_party_count: @ 8066934 push {r4,lr} ldr r4, _0806694C - bl calc_player_party_count + bl CalculatePlayerPartyCount lsls r0, 24 lsrs r0, 24 strh r0, [r4] diff --git a/data/specials.s b/data/specials.s index 1570d8d4f..1161f32d1 100644 --- a/data/specials.s +++ b/data/specials.s @@ -130,7 +130,7 @@ gSpecials:: .4byte sub_80EB83C .4byte sub_80FA648 .4byte sub_80A9884 - .4byte calc_player_party_count + .4byte CalculatePlayerPartyCount .4byte sub_8095B6C .4byte sub_8095C10 .4byte sub_80C4CF8 diff --git a/ewram_syms.txt b/ewram_syms.txt index e8d2abf0c..e357f6020 100644 --- a/ewram_syms.txt +++ b/ewram_syms.txt @@ -25,6 +25,8 @@ gPaletteDecompressionBuffer = 0x202F39C; gPaletteStructs = 0x202F2C8; gPaletteFade = 0x202F388; +gPokemonStorage = 0x20300A0; + word_203855E = 0x203855E; gUnknown_0203869A = 0x203869A; diff --git a/include/pokemon.h b/include/pokemon.h index 11de26acc..9b5a1c1bb 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -336,6 +336,12 @@ struct BattleMove u32 flags; }; +struct PokemonStorage +{ + u8 currentBox; + struct BoxPokemon boxes[14][30]; +}; + void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); void ZeroPlayerPartyMons(void); @@ -378,10 +384,17 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data); u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data); void SetMonData(struct Pokemon *mon, s32 field, const u8 *data); void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data); +void CopyMon(void *dest, void *src, size_t size); +u8 GiveMonToPlayer(struct Pokemon *mon); +u8 SendMonToPC(struct Pokemon *mon); +u8 CalculatePlayerPartyCount(void); +u8 CalculateEnemyPartyCount(void); u8 GetNature(struct Pokemon *mon); u8 GetNatureFromPersonality(u32 personality); u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex); +void sub_8040B1C(void *); + #endif // GUARD_POKEMON_H diff --git a/include/species.h b/include/species.h index 1d663c145..5802f782d 100644 --- a/include/species.h +++ b/include/species.h @@ -1,6 +1,7 @@ #ifndef GUARD_SPECIES_H #define GUARD_SPECIES_H +#define SPECIES_NONE 0x000 #define SPECIES_BULBASAUR 0x001 #define SPECIES_IVYSAUR 0x002 #define SPECIES_VENUSAUR 0x003 diff --git a/iwram_syms.txt b/iwram_syms.txt index ba6a440e5..e3171a2a9 100644 --- a/iwram_syms.txt +++ b/iwram_syms.txt @@ -8,7 +8,9 @@ gPlayTimeCounterState = 0x300057C; gLocalTime = 0x3004038; +gPlayerPartyCount = 0x3004350; gPlayerParty = 0x3004360; +gEnemyPartyCount = 0x30045B8; gEnemyParty = 0x30045C0; gRngValue = 0x03004818; diff --git a/src/pokemon_2.c b/src/pokemon_2.c index 9936fa2a6..b39c76a0a 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -6,7 +6,13 @@ #include "main.h" #include "sprite.h" +extern u8 gPlayerPartyCount; +extern struct Pokemon gPlayerParty[6]; +extern u8 gEnemyPartyCount; +extern struct Pokemon gEnemyParty[6]; + extern struct SpriteTemplate gUnknown_02024E8C; +extern struct PokemonStorage gPokemonStorage; extern u8 gBadEggNickname[]; extern u8 gEggNickname[]; @@ -849,3 +855,81 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) EncryptBoxMon(boxMon); } } + +void CopyMon(void *dest, void *src, size_t size) +{ + memcpy(dest, src, size); +} + +u8 GiveMonToPlayer(struct Pokemon *mon) +{ + s32 i; + + SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2.playerName); + SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); + SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2.playerTrainerId); + + i = 0; + + while (i < 6 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + i++; + + if (i >= 6) + return SendMonToPC(mon); + + CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); + gPlayerPartyCount = i + 1; + return 0; +} + +u8 SendMonToPC(struct Pokemon *mon) +{ + s32 i = gPokemonStorage.currentBox; + + do + { + s32 j; + for (j = 0; j < 30; j++) + { + if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + { + sub_8040B1C(mon); + CopyMon(&gPokemonStorage.boxes[i][j], &mon->box, sizeof(mon->box)); + return 1; + } + } + + i++; + if (i == 14) + i = 0; + } + while (i != gPokemonStorage.currentBox); + + return 2; +} + +u8 CalculatePlayerPartyCount(void) +{ + gPlayerPartyCount = 0; + + while (gPlayerPartyCount < 6 + && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + gPlayerPartyCount++; + } + + return gPlayerPartyCount; +} + +u8 CalculateEnemyPartyCount(void) +{ + gEnemyPartyCount = 0; + + while (gEnemyPartyCount < 6 + && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + gEnemyPartyCount++; + } + + return gEnemyPartyCount; +} |