summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/rom3.s8
-rw-r--r--asm/rom5.s40
-rw-r--r--asm/rom_803D1FC.s215
-rw-r--r--asm/rom_8040EB4.s14
-rw-r--r--asm/rom_8065394.s2
-rw-r--r--data/specials.s2
-rw-r--r--ewram_syms.txt2
-rw-r--r--include/pokemon.h13
-rw-r--r--include/species.h1
-rw-r--r--iwram_syms.txt2
-rw-r--r--src/pokemon_2.c84
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;
+}