diff options
-rw-r--r-- | asm/pokemon_3.s | 16 | ||||
-rw-r--r-- | data/data.s | 4 | ||||
-rw-r--r-- | include/battle.h | 33 | ||||
-rw-r--r-- | include/constants/battle.h | 2 | ||||
-rw-r--r-- | include/strings.h | 1 | ||||
-rw-r--r-- | sedTKU2fS | bin | 9875456 -> 0 bytes | |||
-rw-r--r-- | src/pokemon.c | 196 |
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 Binary files differdeleted file mode 100644 index 7e06e9add..000000000 --- a/sedTKU2fS +++ /dev/null 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; +} + |