summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/pokemon_3.s16
-rw-r--r--data/data.s4
-rw-r--r--include/battle.h33
-rw-r--r--include/constants/battle.h2
-rw-r--r--include/strings.h1
-rw-r--r--sedTKU2fSbin9875456 -> 0 bytes
-rw-r--r--src/pokemon.c196
7 files changed, 208 insertions, 44 deletions
diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s
index 6e41bbc97..d9b946a31 100644
--- a/asm/pokemon_3.s
+++ b/asm/pokemon_3.s
@@ -4,7 +4,7 @@
.syntax unified
.text
-
+/*
thumb_func_start GetPlayerPartyHighestLevel
GetPlayerPartyHighestLevel: @ 80444F8
push {r4-r6,lr}
@@ -233,7 +233,7 @@ _080446A0:
adds r0, r5, 0
movs r2, 0
bl GetMonData
- ldr r2, _08044704 @ =gUnknown_825E026
+ ldr r2, _08044704 @ =sDeoxysBaseStats
lsls r1, r6, 1
adds r1, r2
ldrh r1, [r1]
@@ -270,7 +270,7 @@ _080446FE:
pop {r1}
bx r1
.align 2, 0
-_08044704: .4byte gUnknown_825E026
+_08044704: .4byte sDeoxysBaseStats
thumb_func_end GetDeoxysStat
thumb_func_start SetDeoxysStats
@@ -370,7 +370,7 @@ sub_80447AC: @ 80447AC
ldrb r0, [r1, 0x13]
lsls r0, 3
orrs r2, r0
- ldr r0, _080447EC @ =gUnknown_825E032
+ ldr r0, _080447EC @ =gLinkPlayerFacilityClasses
lsls r2, 1
adds r2, r0
ldrh r0, [r2]
@@ -381,7 +381,7 @@ sub_80447AC: @ 80447AC
bx r1
.align 2, 0
_080447E8: .4byte gLinkPlayers
-_080447EC: .4byte gUnknown_825E032
+_080447EC: .4byte gLinkPlayerFacilityClasses
thumb_func_end sub_80447AC
thumb_func_start sub_80447F0
@@ -406,7 +406,7 @@ sub_80447F0: @ 80447F0
lsls r0, 3
orrs r2, r0
ldr r1, _08044830 @ =gFacilityClassToTrainerClass
- ldr r0, _08044834 @ =gUnknown_825E032
+ ldr r0, _08044834 @ =gLinkPlayerFacilityClasses
lsls r2, 1
adds r2, r0
ldrh r0, [r2]
@@ -417,7 +417,7 @@ sub_80447F0: @ 80447F0
.align 2, 0
_0804482C: .4byte gLinkPlayers
_08044830: .4byte gFacilityClassToTrainerClass
-_08044834: .4byte gUnknown_825E032
+_08044834: .4byte gLinkPlayerFacilityClasses
thumb_func_end sub_80447F0
thumb_func_start CreateObedientEnemyMon
@@ -560,7 +560,7 @@ _08044946:
pop {r1}
bx r1
thumb_func_end CheckBattleTypeGhost
-
+*/
thumb_func_start OakSpeechNidoranFSetupTemplate
OakSpeechNidoranFSetupTemplate: @ 8044950
push {r4-r7,lr}
diff --git a/data/data.s b/data/data.s
index 499e3c9db..286bad013 100644
--- a/data/data.s
+++ b/data/data.s
@@ -538,10 +538,10 @@ sFriendshipEventDeltas:: @ 825DFF6
sHMMoves:: @ 825E014
.incbin "baserom.gba", 0x25E014, 0x12
-gUnknown_825E026:: @ 825E026
+sDeoxysBaseStats:: @ 825E026
.incbin "baserom.gba", 0x25E026, 0xC
-gUnknown_825E032:: @ 825E032
+gLinkPlayerFacilityClasses:: @ 825E032
.incbin "baserom.gba", 0x25E032, 0x2A
gUnknown_825E05C:: @ 825E05C
diff --git a/include/battle.h b/include/battle.h
index 2e6d251c3..381f7cdbd 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -33,39 +33,6 @@
#define GET_BANK_SIDE(bank)((GetBattlerPosition(bank) & BIT_SIDE))
#define GET_BANK_SIDE2(bank)((GET_BANK_IDENTITY(bank) & BIT_SIDE))
-#define BATTLE_TYPE_DOUBLE 0x0001
-#define BATTLE_TYPE_LINK 0x0002
-#define BATTLE_TYPE_WILD 0x0004
-#define BATTLE_TYPE_TRAINER 0x0008
-#define BATTLE_TYPE_FIRST_BATTLE 0x0010
-#define BATTLE_TYPE_20 0x0020
-#define BATTLE_TYPE_MULTI 0x0040
-#define BATTLE_TYPE_SAFARI 0x0080
-#define BATTLE_TYPE_BATTLE_TOWER 0x0100
-#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200
-#define BATTLE_TYPE_ROAMER 0x0400
-#define BATTLE_TYPE_EREADER_TRAINER 0x0800
-#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
-#define BATTLE_TYPE_LEGENDARY 0x2000
-#define BATTLE_TYPE_REGI 0x4000
-#define BATTLE_TYPE_TWO_OPPONENTS 0x8000
-#define BATTLE_TYPE_DOME 0x10000 // this is used in pokemon.c, but its clearly not the correct name for FR/LG. TODO: Fix these
-#define BATTLE_TYPE_PALACE 0x20000
-#define BATTLE_TYPE_ARENA 0x40000
-#define BATTLE_TYPE_FACTORY 0x80000
-#define BATTLE_TYPE_x100000 0x100000
-#define BATTLE_TYPE_PYRAMID 0x200000
-#define BATTLE_TYPE_INGAME_PARTNER 0x400000
-#define BATTLE_TYPE_x800000 0x800000
-#define BATTLE_TYPE_RECORDED 0x1000000
-#define BATTLE_TYPE_x2000000 0x2000000
-#define BATTLE_TYPE_x4000000 0x4000000
-#define BATTLE_TYPE_SECRET_BASE 0x8000000
-#define BATTLE_TYPE_GROUDON 0x10000000
-#define BATTLE_TYPE_KYORGE 0x20000000
-#define BATTLE_TYPE_RAYQUAZA 0x40000000
-#define BATTLE_TYPE_x80000000 0x80000000
-
#define TRAINER_OPPONENT_3FE 0x3FE
#define TRAINER_OPPONENT_C00 0xC00
#define TRAINER_OPPONENT_800 0x800
diff --git a/include/constants/battle.h b/include/constants/battle.h
index 074c0d0cd..3b765eede 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -59,7 +59,7 @@
#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
#define BATTLE_TYPE_LEGENDARY 0x2000
#define BATTLE_TYPE_REGI 0x4000
-#define BATTLE_TYPE_TWO_OPPONENTS 0x8000
+#define BATTLE_TYPE_GHOST 0x8000
#define BATTLE_TYPE_DOME 0x10000
#define BATTLE_TYPE_PALACE 0x20000
#define BATTLE_TYPE_ARENA 0x40000
diff --git a/include/strings.h b/include/strings.h
index 55c178b0d..a16792aa5 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -177,5 +177,6 @@ extern const u8 gUnknown_84166A7[];
extern const u8 gUnknown_84169DC[];
extern const u8 gUnknown_84162BD[];
+extern const u8 gUnknown_841D148[];
#endif //GUARD_STRINGS_H
diff --git a/sedTKU2fS b/sedTKU2fS
deleted file mode 100644
index 7e06e9add..000000000
--- a/sedTKU2fS
+++ /dev/null
Binary files differ
diff --git a/src/pokemon.c b/src/pokemon.c
index 1482984f4..7555f7c32 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -19,6 +19,8 @@
#include "link.h"
#include "m4a.h"
#include "sound.h"
+#include "pokedex.h"
+#include "strings.h"
#include "constants/items.h"
#include "constants/species.h"
#include "constants/pokemon.h"
@@ -78,6 +80,9 @@ extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
extern const u16 sHMMoves[];
extern s8 gPokeblockFlavorCompatibilityTable[];
+extern const u16 sDeoxysBaseStats[];
+extern const u16 gLinkPlayerFacilityClasses[];
+
// External functions
extern u8 GetCurrentRegionMapSectionId(void); // overworld
extern const struct BattleMove gBattleMoves[];
@@ -5607,3 +5612,194 @@ u8 *GetTrainerPartnerName(void)
u8 id = GetMultiplayerId();
return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].id ^ 2)].name;
}
+
+u8 GetPlayerPartyHighestLevel(void)
+{
+ s32 slot;
+ u8 level, monLevel;
+
+ level = 1;
+ for(slot = 0; slot < PARTY_SIZE; ++slot)
+ {
+ if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL))
+ {
+ monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL);
+ if (monLevel > level)
+ level = monLevel;
+ }
+ }
+ return level;
+}
+
+u16 FacilityClassToPicIndex(u16 facilityClass)
+{
+ return gFacilityClassToPicIndex[facilityClass];
+}
+
+bool8 sub_804455C(u8 caseId, u8 battlerId)
+{
+ switch (caseId)
+ {
+ case 0:
+ default:
+ return FALSE;
+ case 1:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ break;
+ case 2:
+ break;
+ case 3:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (battlerId == 1 || battlerId == 4 || battlerId == 5)
+ return TRUE;
+ return FALSE;
+ case 4:
+ break;
+ case 5:
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ }
+ else
+ {
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+u16 GetDeoxysStat(struct Pokemon *mon, s32 statId)
+{
+ s32 ivVal, evVal;
+ u16 statValue;
+ u8 nature;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ {
+ return statValue = 0;
+ }
+ else
+ {
+ ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);
+ evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);
+ statValue = ((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5;
+ nature = GetNature(mon);
+ statValue = ModifyStatByNature(nature, statValue, (u8)statId);
+ }
+ return statValue;
+}
+
+void SetDeoxysStats(void)
+{
+ s32 i, value;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+
+ if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ continue;
+
+ value = GetMonData(mon, MON_DATA_ATK, NULL);
+ SetMonData(mon, MON_DATA_ATK, &value);
+
+ value = GetMonData(mon, MON_DATA_DEF, NULL);
+ SetMonData(mon, MON_DATA_DEF, &value);
+
+ value = GetMonData(mon, MON_DATA_SPEED, NULL);
+ SetMonData(mon, MON_DATA_SPEED, &value);
+
+ value = GetMonData(mon, MON_DATA_SPATK, NULL);
+ SetMonData(mon, MON_DATA_SPATK, &value);
+
+ value = GetMonData(mon, MON_DATA_SPDEF, NULL);
+ SetMonData(mon, MON_DATA_SPDEF, &value);
+ }
+}
+
+u16 sub_80447AC(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return FacilityClassToPicIndex(gLinkPlayerFacilityClasses[arrId]);
+}
+
+u16 sub_80447F0(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]];
+}
+
+void CreateObedientEnemyMon(void)
+{
+ s32 species = gSpecialVar_0x8004;
+ s32 level = gSpecialVar_0x8005;
+ s32 itemId = gSpecialVar_0x8006;
+
+ ZeroEnemyPartyMons();
+ CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0);
+ if (itemId)
+ {
+ u8 heldItem[2];
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
+{
+ u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;
+ if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) // don't set if it's already set
+ {
+ GetSetPokedexFlag(nationalNum, caseId);
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)
+ gSaveBlock2Ptr->pokedex.unownPersonality = personality;
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)
+ gSaveBlock2Ptr->pokedex.spindaPersonality = personality;
+ }
+}
+
+bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank)
+{
+ u8 buffer[12];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(bank))
+ {
+ GetMonData(mon, MON_DATA_NICKNAME, buffer);
+ StringGetEnd10(buffer);
+ if (!StringCompare(buffer, gUnknown_841D148))
+ return TRUE;
+ }
+ return FALSE;
+}
+