Mirror pokeemerald PR#1329 & PR#1335 to pokefirered

The `giftRibbons` field in `SaveBlock1` has been split out into proper subfields. The new ExternalEvent structs deal with interconnectivity between external games/peripherals and FRLG. US & JP Colosseum Bonus Discs', Colosseum and XD's, Pokémon Channel's, and PokémonBox: Ruby & Sapphire's interactions with these fields has been documented.

The `giftRibbon#` fields in `PokemonSubstruct3` have also been renamed to their appropriate ribbons, and commented with distribution info if applicable. The previous `fatefulEncounter` field was actually filler, and relabeled as such, while the `obedient` bit was renamed `eventLegal`. All relevant constants and functions dealing with the Pokémon data structure were renamed with these changes in mind.

I still maintain that `eventLegal` is a misnomer and it should be called `fatefulEncounter` in all three repos.
This commit is contained in:
Deokishisu
2021-02-16 16:56:31 -05:00
parent bc4f88d72c
commit 57e3f5e0f8
20 changed files with 178 additions and 129 deletions
+3 -3
View File
@@ -3095,13 +3095,13 @@ u8 GetMoveTarget(u16 move, u8 setTarget)
return targetBattler;
}
static bool32 HasObedientBitSet(u8 battlerId)
static bool32 IsNotEventLegalMewOrDeoxys(u8 battlerId)
{
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT
|| (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS
&& GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW))
return TRUE;
return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_OBEDIENCE, NULL);
return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_EVENT_LEGAL, NULL);
}
u8 IsMonDisobedient(void)
@@ -3112,7 +3112,7 @@ u8 IsMonDisobedient(void)
if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE)) || GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT)
return 0;
if (HasObedientBitSet(gBattlerAttacker)) // only if species is Mew or Deoxys
if (IsNotEventLegalMewOrDeoxys(gBattlerAttacker)) // only if species is Mew or Deoxys
{
if (!IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName) || FlagGet(FLAG_BADGE08_GET))
return 0;
+3 -3
View File
@@ -1591,7 +1591,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
{
u16 species;
u32 personality, pokerus;
u8 i, friendship, language, gameMet, markings, obedience;
u8 i, friendship, language, gameMet, markings, isEventLegal;
u16 moves[4];
u32 ivs[NUM_STATS];
@@ -1614,7 +1614,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
gameMet = GetMonData(egg, MON_DATA_MET_GAME);
markings = GetMonData(egg, MON_DATA_MARKINGS);
pokerus = GetMonData(egg, MON_DATA_POKERUS);
obedience = GetMonData(egg, MON_DATA_OBEDIENCE);
isEventLegal = GetMonData(egg, MON_DATA_EVENT_LEGAL);
CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0);
@@ -1636,7 +1636,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
friendship = 120;
SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship);
SetMonData(temp, MON_DATA_POKERUS, &pokerus);
SetMonData(temp, MON_DATA_OBEDIENCE, &obedience);
SetMonData(temp, MON_DATA_EVENT_LEGAL, &isEventLegal);
*egg = *temp;
}
+1 -1
View File
@@ -557,7 +557,7 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + 5; i++)
SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data));
for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++)
for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FILLER; i++)
SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, (&data));
+4 -4
View File
@@ -3867,9 +3867,9 @@ static void CursorCB_Register(u8 taskId)
{
u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
u8 isEventLegal = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_EVENT_LEGAL);
switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience))
switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, isEventLegal))
{
case CANT_REGISTER_MON:
StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
@@ -3894,8 +3894,8 @@ static void CursorCB_Trade1(u8 taskId)
{
u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
u8 isEventLegal = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_EVENT_LEGAL);
u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, isEventLegal);
if (stringId != UR_TRADE_MSG_NONE)
{
+64 -64
View File
@@ -1978,12 +1978,12 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)
CalculateMonStats(mon);
}
static void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
static void CreateEventLegalMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
{
bool32 obedient = TRUE;
bool32 isEventLegal = TRUE;
CreateMon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId);
SetMonData(mon, MON_DATA_OBEDIENCE, &obedient);
SetMonData(mon, MON_DATA_EVENT_LEGAL, &isEventLegal);
}
void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest)
@@ -3153,32 +3153,32 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
case MON_DATA_EFFORT_RIBBON:
retVal = substruct3->effortRibbon;
break;
case MON_DATA_GIFT_RIBBON_1:
retVal = substruct3->giftRibbon1;
case MON_DATA_MARINE_RIBBON:
retVal = substruct3->marineRibbon;
break;
case MON_DATA_GIFT_RIBBON_2:
retVal = substruct3->giftRibbon2;
case MON_DATA_LAND_RIBBON:
retVal = substruct3->landRibbon;
break;
case MON_DATA_GIFT_RIBBON_3:
retVal = substruct3->giftRibbon3;
case MON_DATA_SKY_RIBBON:
retVal = substruct3->skyRibbon;
break;
case MON_DATA_GIFT_RIBBON_4:
retVal = substruct3->giftRibbon4;
case MON_DATA_COUNTRY_RIBBON:
retVal = substruct3->countryRibbon;
break;
case MON_DATA_GIFT_RIBBON_5:
retVal = substruct3->giftRibbon5;
case MON_DATA_NATIONAL_RIBBON:
retVal = substruct3->nationalRibbon;
break;
case MON_DATA_GIFT_RIBBON_6:
retVal = substruct3->giftRibbon6;
case MON_DATA_EARTH_RIBBON:
retVal = substruct3->earthRibbon;
break;
case MON_DATA_GIFT_RIBBON_7:
retVal = substruct3->giftRibbon7;
case MON_DATA_WORLD_RIBBON:
retVal = substruct3->worldRibbon;
break;
case MON_DATA_FATEFUL_ENCOUNTER:
retVal = substruct3->fatefulEncounter;
case MON_DATA_FILLER:
retVal = substruct3->filler;
break;
case MON_DATA_OBEDIENCE:
retVal = substruct3->obedient;
case MON_DATA_EVENT_LEGAL:
retVal = substruct3->eventLegal;
break;
case MON_DATA_SPECIES2:
retVal = substruct0->species;
@@ -3220,13 +3220,13 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
retVal += substruct3->victoryRibbon;
retVal += substruct3->artistRibbon;
retVal += substruct3->effortRibbon;
retVal += substruct3->giftRibbon1;
retVal += substruct3->giftRibbon2;
retVal += substruct3->giftRibbon3;
retVal += substruct3->giftRibbon4;
retVal += substruct3->giftRibbon5;
retVal += substruct3->giftRibbon6;
retVal += substruct3->giftRibbon7;
retVal += substruct3->marineRibbon;
retVal += substruct3->landRibbon;
retVal += substruct3->skyRibbon;
retVal += substruct3->countryRibbon;
retVal += substruct3->nationalRibbon;
retVal += substruct3->earthRibbon;
retVal += substruct3->worldRibbon;
}
break;
case MON_DATA_RIBBONS:
@@ -3243,13 +3243,13 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
| (substruct3->victoryRibbon << 17)
| (substruct3->artistRibbon << 18)
| (substruct3->effortRibbon << 19)
| (substruct3->giftRibbon1 << 20)
| (substruct3->giftRibbon2 << 21)
| (substruct3->giftRibbon3 << 22)
| (substruct3->giftRibbon4 << 23)
| (substruct3->giftRibbon5 << 24)
| (substruct3->giftRibbon6 << 25)
| (substruct3->giftRibbon7 << 26);
| (substruct3->marineRibbon << 20)
| (substruct3->landRibbon << 21)
| (substruct3->skyRibbon << 22)
| (substruct3->countryRibbon << 23)
| (substruct3->nationalRibbon << 24)
| (substruct3->earthRibbon << 25)
| (substruct3->worldRibbon << 26);
}
break;
default:
@@ -3316,15 +3316,15 @@ void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg)
case MON_DATA_VICTORY_RIBBON:
case MON_DATA_ARTIST_RIBBON:
case MON_DATA_EFFORT_RIBBON:
case MON_DATA_GIFT_RIBBON_1:
case MON_DATA_GIFT_RIBBON_2:
case MON_DATA_GIFT_RIBBON_3:
case MON_DATA_GIFT_RIBBON_4:
case MON_DATA_GIFT_RIBBON_5:
case MON_DATA_GIFT_RIBBON_6:
case MON_DATA_GIFT_RIBBON_7:
case MON_DATA_FATEFUL_ENCOUNTER:
case MON_DATA_OBEDIENCE:
case MON_DATA_MARINE_RIBBON:
case MON_DATA_LAND_RIBBON:
case MON_DATA_SKY_RIBBON:
case MON_DATA_COUNTRY_RIBBON:
case MON_DATA_NATIONAL_RIBBON:
case MON_DATA_EARTH_RIBBON:
case MON_DATA_WORLD_RIBBON:
case MON_DATA_FILLER:
case MON_DATA_EVENT_LEGAL:
case MON_DATA_KNOWN_MOVES:
case MON_DATA_RIBBON_COUNT:
case MON_DATA_RIBBONS:
@@ -3556,32 +3556,32 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg)
case MON_DATA_EFFORT_RIBBON:
SET8(substruct3->effortRibbon);
break;
case MON_DATA_GIFT_RIBBON_1:
SET8(substruct3->giftRibbon1);
case MON_DATA_MARINE_RIBBON:
SET8(substruct3->marineRibbon);
break;
case MON_DATA_GIFT_RIBBON_2:
SET8(substruct3->giftRibbon2);
case MON_DATA_LAND_RIBBON:
SET8(substruct3->landRibbon);
break;
case MON_DATA_GIFT_RIBBON_3:
SET8(substruct3->giftRibbon3);
case MON_DATA_SKY_RIBBON:
SET8(substruct3->skyRibbon);
break;
case MON_DATA_GIFT_RIBBON_4:
SET8(substruct3->giftRibbon4);
case MON_DATA_COUNTRY_RIBBON:
SET8(substruct3->countryRibbon);
break;
case MON_DATA_GIFT_RIBBON_5:
SET8(substruct3->giftRibbon5);
case MON_DATA_NATIONAL_RIBBON:
SET8(substruct3->nationalRibbon);
break;
case MON_DATA_GIFT_RIBBON_6:
SET8(substruct3->giftRibbon6);
case MON_DATA_EARTH_RIBBON:
SET8(substruct3->earthRibbon);
break;
case MON_DATA_GIFT_RIBBON_7:
SET8(substruct3->giftRibbon7);
case MON_DATA_WORLD_RIBBON:
SET8(substruct3->worldRibbon);
break;
case MON_DATA_FATEFUL_ENCOUNTER:
SET8(substruct3->fatefulEncounter);
case MON_DATA_FILLER:
SET8(substruct3->filler);
break;
case MON_DATA_OBEDIENCE:
SET8(substruct3->obedient);
case MON_DATA_EVENT_LEGAL:
SET8(substruct3->eventLegal);
break;
case MON_DATA_IVS:
{
@@ -6027,14 +6027,14 @@ u16 sub_80447F0(void)
return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]];
}
void CreateObedientEnemyMon(void)
void CreateEventLegalEnemyMon(void)
{
s32 species = gSpecialVar_0x8004;
s32 level = gSpecialVar_0x8005;
s32 itemId = gSpecialVar_0x8006;
ZeroEnemyPartyMons();
CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0);
CreateEventLegalMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0);
if (itemId)
{
u8 heldItem[2];
+3 -3
View File
@@ -37,9 +37,9 @@ static const struct UnknownStruct sBigMonSizeTable[] =
static const u8 sGiftRibbonsMonDataIds[] =
{
MON_DATA_GIFT_RIBBON_1, MON_DATA_GIFT_RIBBON_2, MON_DATA_GIFT_RIBBON_3,
MON_DATA_GIFT_RIBBON_4, MON_DATA_GIFT_RIBBON_5, MON_DATA_GIFT_RIBBON_6,
MON_DATA_GIFT_RIBBON_7
MON_DATA_MARINE_RIBBON, MON_DATA_LAND_RIBBON, MON_DATA_SKY_RIBBON,
MON_DATA_COUNTRY_RIBBON, MON_DATA_NATIONAL_RIBBON, MON_DATA_EARTH_RIBBON,
MON_DATA_WORLD_RIBBON
};
#define CM_PER_INCH 2.54
+4 -4
View File
@@ -2623,7 +2623,7 @@ static void sub_8137578(void)
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0)
{
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OBEDIENCE) == 1)
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EVENT_LEGAL) == 1)
{
if (sub_813B7E0(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gUnknown_841996D);
@@ -2718,7 +2718,7 @@ static void sub_8137724(void)
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0)
{
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OBEDIENCE) == 1)
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EVENT_LEGAL) == 1)
{
if (sub_813B7E0(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gUnknown_84199F4);
@@ -2772,7 +2772,7 @@ static void sub_8137970(void)
if (sMonSummaryScreen->monList.mons != gEnemyParty)
{
if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OBEDIENCE) == 1)
if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EVENT_LEGAL) == 1)
chosenStrIndex = 4;
else
{
@@ -2790,7 +2790,7 @@ static void sub_8137970(void)
}
else
{
if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OBEDIENCE) == 1)
if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EVENT_LEGAL) == 1)
chosenStrIndex = 4;
else
{
+6 -6
View File
@@ -2230,21 +2230,21 @@ bool8 ScrCmd_normalmsg(struct ScriptContext * ctx)
return FALSE;
}
// This command will force the Pokémon to be obedient, you don't get to make it disobedient.
bool8 ScrCmd_setmonobedient(struct ScriptContext * ctx)
// This command will set a Pokémon's eventLegal bit; there is no similar command to clear it.
bool8 ScrCmd_setmoneventlegal(struct ScriptContext * ctx)
{
bool8 obedient = TRUE;
bool8 isEventLegal = TRUE;
u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
SetMonData(&gPlayerParty[partyIndex], MON_DATA_OBEDIENCE, &obedient);
SetMonData(&gPlayerParty[partyIndex], MON_DATA_EVENT_LEGAL, &isEventLegal);
return FALSE;
}
bool8 ScrCmd_checkmonobedience(struct ScriptContext * ctx)
bool8 ScrCmd_checkmoneventlegal(struct ScriptContext * ctx)
{
u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OBEDIENCE, NULL);
gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EVENT_LEGAL, NULL);
return FALSE;
}
+8 -8
View File
@@ -1845,7 +1845,7 @@ static u8 PlayerHasEnoughPokemonToTrade_HandleMewDeoxys(u8 *flags, u8 partyCount
count += flags[i];
}
species = GetMonData(&gEnemyParty[sTradeMenuResourcesPtr->otherPlayerCursorPosition % 6], MON_DATA_SPECIES);
if ((species == SPECIES_DEOXYS || species == SPECIES_MEW) && !GetMonData(&gEnemyParty[sTradeMenuResourcesPtr->otherPlayerCursorPosition % 6], MON_DATA_OBEDIENCE))
if ((species == SPECIES_DEOXYS || species == SPECIES_MEW) && !GetMonData(&gEnemyParty[sTradeMenuResourcesPtr->otherPlayerCursorPosition % 6], MON_DATA_EVENT_LEGAL))
return 2;
if (count != 0)
count = 1;
@@ -2649,7 +2649,7 @@ static u32 TestWhetherSelectedMonCanBeTraded(struct Pokemon * party, int partyCo
if (species[cursorPos] == SPECIES_DEOXYS || species[cursorPos] == SPECIES_MEW)
{
if (!GetMonData(&party[cursorPos], MON_DATA_OBEDIENCE))
if (!GetMonData(&party[cursorPos], MON_DATA_EVENT_LEGAL))
{
return 4;
}
@@ -2730,17 +2730,17 @@ s32 Trade_CalcLinkPlayerCompatibilityParam(void)
return 0;
}
static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet)
static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isEventLegal)
{
if (species == SPECIES_DEOXYS || species == SPECIES_MEW)
{
if (!isObedientBitSet)
if (!isEventLegal)
return TRUE;
}
return FALSE;
}
int GetUnionRoomTradeMessageId(struct GFtgtGnameSub playerSub, struct GFtgtGnameSub partnerSub, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
int GetUnionRoomTradeMessageId(struct GFtgtGnameSub playerSub, struct GFtgtGnameSub partnerSub, u16 species1, u16 species2, u8 type, u16 species3, u8 isEventLegal)
{
u8 playerHasNationalDex = playerSub.hasNationalDex;
u8 playerIsChampion = playerSub.isChampion;
@@ -2769,7 +2769,7 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub playerSub, struct GFtgtGname
}
}
if (IsDeoxysOrMewUntradable(species3, isObedientBitSet))
if (IsDeoxysOrMewUntradable(species3, isEventLegal))
{
return 4;
}
@@ -2820,11 +2820,11 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub playerSub, struct GFtgtGname
return 0;
}
int CanRegisterMonForTradingBoard(struct GFtgtGnameSub playerSub, u16 species2, u16 species, u8 obedience)
int CanRegisterMonForTradingBoard(struct GFtgtGnameSub playerSub, u16 species2, u16 species, u8 isEventLegal)
{
u8 canTradeEggAndNational = playerSub.hasNationalDex;
if (IsDeoxysOrMewUntradable(species, obedience))
if (IsDeoxysOrMewUntradable(species, isEventLegal))
{
return 1;
}