thru CheckBattleTypeGhost()
This commit is contained in:
+8
-8
@@ -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}
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+196
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user