summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/pokemon_3.s170
-rw-r--r--include/battle.h3
-rw-r--r--src/pokemon_3.c74
3 files changed, 75 insertions, 172 deletions
diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s
index 91a4a501b..124bc8186 100644
--- a/asm/pokemon_3.s
+++ b/asm/pokemon_3.s
@@ -6,176 +6,6 @@
.text
- thumb_func_start sub_803FBBC
-sub_803FBBC: @ 803FBBC
- push {r4,r5,lr}
- movs r5, 0
- ldr r4, _0803FBE4 @ =gLinkPlayers
- bl GetMultiplayerId
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r1, r4
- ldrh r0, [r1, 0x18]
- cmp r0, 0x2
- bgt _0803FBE8
- cmp r0, 0x1
- bge _0803FBF0
- cmp r0, 0
- beq _0803FBEC
- b _0803FBF2
- .align 2, 0
-_0803FBE4: .4byte gLinkPlayers
-_0803FBE8:
- cmp r0, 0x3
- bne _0803FBF2
-_0803FBEC:
- movs r5, 0
- b _0803FBF2
-_0803FBF0:
- movs r5, 0x1
-_0803FBF2:
- adds r0, r5, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_803FBBC
-
- thumb_func_start sub_803FBFC
-sub_803FBFC: @ 803FBFC
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- movs r3, 0
- ldr r2, _0803FC20 @ =gLinkPlayers
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r1, r2
- ldrh r0, [r1, 0x18]
- cmp r0, 0x2
- bgt _0803FC24
- cmp r0, 0x1
- bge _0803FC2C
- cmp r0, 0
- beq _0803FC28
- b _0803FC2E
- .align 2, 0
-_0803FC20: .4byte gLinkPlayers
-_0803FC24:
- cmp r0, 0x3
- bne _0803FC2E
-_0803FC28:
- movs r3, 0
- b _0803FC2E
-_0803FC2C:
- movs r3, 0x1
-_0803FC2E:
- adds r0, r3, 0
- pop {r1}
- bx r1
- thumb_func_end sub_803FBFC
-
- thumb_func_start sub_803FC34
-sub_803FC34: @ 803FC34
- push {lr}
- lsls r0, 16
- lsrs r3, r0, 16
- movs r2, 0
- ldr r1, _0803FC40 @ =gLinkPlayers
- b _0803FC4C
- .align 2, 0
-_0803FC40: .4byte gLinkPlayers
-_0803FC44:
- adds r1, 0x1C
- adds r2, 0x1
- cmp r2, 0x3
- bgt _0803FC52
-_0803FC4C:
- ldrh r0, [r1, 0x18]
- cmp r0, r3
- bne _0803FC44
-_0803FC52:
- adds r0, r2, 0
- pop {r1}
- bx r1
- thumb_func_end sub_803FC34
-
- thumb_func_start sub_803FC58
-sub_803FC58: @ 803FC58
- lsls r0, 16
- lsrs r0, 16
- ldr r2, _0803FC70 @ =gTrainers
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldrb r1, [r1, 0x2]
- movs r0, 0x7F
- ands r0, r1
- bx lr
- .align 2, 0
-_0803FC70: .4byte gTrainers
- thumb_func_end sub_803FC58
-
- thumb_func_start nature_stat_mod
-nature_stat_mod: @ 803FC74
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 16
- lsrs r3, r1, 16
- lsls r2, 24
- lsrs r5, r2, 24
- movs r0, 0xFF
- lsls r0, 24
- adds r2, r0
- lsrs r2, 24
- cmp r2, 0x4
- bls _0803FC92
- adds r0, r3, 0
- b _0803FCCE
-_0803FC92:
- ldr r0, _0803FCB4 @ =gNatureStatTable
- lsls r1, r4, 2
- adds r1, r4
- subs r1, 0x1
- adds r1, r5, r1
- adds r1, r0
- ldrb r1, [r1]
- lsls r1, 24
- asrs r1, 24
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _0803FCB8
- cmp r1, 0x1
- bne _0803FCCC
- movs r0, 0x6E
- b _0803FCBA
- .align 2, 0
-_0803FCB4: .4byte gNatureStatTable
-_0803FCB8:
- movs r0, 0x5A
-_0803FCBA:
- muls r0, r3
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x64
- bl __udivsi3
- lsls r0, 16
- lsrs r0, 16
- b _0803FCCE
-_0803FCCC:
- adds r0, r3, 0
-_0803FCCE:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end nature_stat_mod
-
thumb_func_start AdjustFriendship
AdjustFriendship: @ 803FCD4
push {r4-r7,lr}
diff --git a/include/battle.h b/include/battle.h
index 4b9144721..8f7141803 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -51,8 +51,7 @@ struct Trainer
{
/*0x00*/ u8 partyFlags;
/*0x01*/ u8 trainerClass;
- /*0x02*/ u8 encounterMusic:7;
- /*0x02*/ u8 gender:1;
+ /*0x02*/ u8 encounterMusic_gender;
/*0x03*/ u8 trainerPic;
/*0x04*/ u8 trainerName[12];
/*0x10*/ u16 items[4];
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index 90ef860a7..61e56d56f 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -1,8 +1,10 @@
#include "global.h"
#include "asm.h"
+#include "battle.h"
#include "event_data.h"
#include "item.h"
#include "items.h"
+#include "link.h"
#include "main.h"
#include "pokemon.h"
#include "rng.h"
@@ -71,6 +73,8 @@ extern u8 gUnknown_02024E6C;
extern struct SpindaSpot gSpindaSpotGraphics[];
extern void *gUnknown_081FAF4C[];
extern u8 gSpeciesNames[][11];
+extern struct Trainer gTrainers[];
+extern s8 gNatureStatTable[][5];
extern u8 gUnknown_082082F8[];
extern u8 gUnknown_083FFDB3[];
@@ -590,3 +594,73 @@ void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies)
SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]);
#endif
}
+
+bool8 sub_803FBBC(void)
+{
+ bool8 retVal = FALSE;
+ switch (gLinkPlayers[GetMultiplayerId()].lp_field_18)
+ {
+ case 0:
+ case 3:
+ retVal = FALSE;
+ break;
+ case 1:
+ case 2:
+ retVal = TRUE;
+ break;
+ }
+ return retVal;
+}
+
+bool8 sub_803FBFC(u8 id)
+{
+ bool8 retVal = FALSE;
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ retVal = FALSE;
+ break;
+ case 1:
+ case 2:
+ retVal = TRUE;
+ break;
+ }
+ return retVal;
+}
+
+s32 sub_803FC34(u16 a1)
+{
+ s32 id;
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ if (gLinkPlayers[id].lp_field_18 == a1)
+ break;
+ return id;
+}
+
+u8 sub_803FC58(u16 trainer)
+{
+ return gTrainers[trainer].encounterMusic_gender & 0x7F;
+}
+
+u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
+{
+ if (statIndex < 1 || statIndex > 5)
+ {
+ // should just be "return n", but it wouldn't match without this
+ u16 retVal = n;
+ retVal++;
+ retVal--;
+ return retVal;
+ }
+
+ switch (gNatureStatTable[nature][statIndex - 1])
+ {
+ case 1:
+ return (u16)(n * 110) / 100;
+ case -1:
+ return (u16)(n * 90) / 100;
+ }
+
+ return n;
+}