diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-24 10:22:39 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-24 10:22:39 -0400 |
commit | 779d6187c613ce4491533bf0c24e9f60ddf697b4 (patch) | |
tree | e127f75d964baf78032f4adf18e6774d7d14d692 /src | |
parent | db3be6ef2e9482edae2446cd71d03d7c6ae143f7 (diff) |
field_specials through sub_80CC534
Diffstat (limited to 'src')
-rw-r--r-- | src/field_specials.c | 195 | ||||
-rw-r--r-- | src/itemfinder.c | 4 |
2 files changed, 196 insertions, 3 deletions
diff --git a/src/field_specials.c b/src/field_specials.c index ecebf8c8b..5f4795154 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -20,6 +20,7 @@ #include "field_map_obj.h" #include "menu_indicators.h" #include "random.h" +#include "mail_data.h" #include "help_system.h" #include "sound.h" #include "text.h" @@ -30,6 +31,7 @@ #include "window.h" #include "text_window.h" #include "menu.h" +#include "naming_screen.h" #include "dynamic_placeholder_text_util.h" #include "new_menu_helpers.h" #include "constants/songs.h" @@ -68,6 +70,8 @@ static void Task_RedrawScrollArrowsAndWaitInput(u8 taskId); static void Task_CreateMenuRemoveScrollIndicatorArrowPair(u8 taskId); static void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId); static u16 GetStarterPokemon(u16 starterIdx); +static void ChangeBoxPokemonNickname_CB(void); +static void ChangePokemonNickname_CB(void); extern const struct ScrollArrowsTemplate gUnknown_83F5D1C; extern const u16 sStarterMon[3]; @@ -81,6 +85,13 @@ extern const u16 sElevatorWindowMetatilesGoingDown[3][3]; extern const u8 sElevatorAnimationDuration[9]; extern const u8 sElevatorWindowAnimDuration[9]; extern u8 *const gUnknown_83F5AF8[3]; +extern const u8 gUnknown_83F5D32[12][3]; +extern const struct { + u16 grp; + u16 num; + u16 unk4; + u16 unk6; +} gUnknown_83F5D58[51]; void Special_ShowDiploma(void) { @@ -1152,9 +1163,9 @@ static void Task_ListMenuHandleInput(u8 taskId) { s32 input; struct Task * task; - asm("":::"r6", "r4"); // fakematch register allocation task = &gTasks[taskId]; + task++;task--; input = ListMenu_ProcessInput(task->data[14]); switch (input) { @@ -1350,3 +1361,185 @@ bool8 sub_80CBFA0(void) else return TRUE; } + +void ChangeBoxPokemonNickname(void) +{ + struct BoxPokemon * pokemon = GetBoxedMonPtr(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos); + u16 species; + u8 gender; + u32 personality; + + GetBoxMonData(pokemon, MON_DATA_NICKNAME, gStringVar3); + GetBoxMonData(pokemon, MON_DATA_NICKNAME, gStringVar2); + species = GetBoxMonData(pokemon, MON_DATA_SPECIES, NULL); + gender = GetBoxMonGender(pokemon); + personality = GetBoxMonData(pokemon, MON_DATA_PERSONALITY, NULL); + DoNamingScreen(3, gStringVar2, species, gender, personality, ChangeBoxPokemonNickname_CB); +} + +static void ChangeBoxPokemonNickname_CB(void) +{ + SetBoxMonNickFromAnyBox(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2); + CB2_ReturnToFieldContinueScriptPlayMapMusic(); +} + +void ChangePokemonNickname(void) +{ + u16 species; + u8 gender; + u32 personality; + + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3); + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2); + species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); + gender = GetMonGender(&gPlayerParty[gSpecialVar_0x8004]); + personality = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_PERSONALITY, NULL); + DoNamingScreen(3, gStringVar2, species, gender, personality, ChangePokemonNickname_CB); +} + +static void ChangePokemonNickname_CB(void) +{ + SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2); + CB2_ReturnToFieldContinueScriptPlayMapMusic(); +} + +void TV_CopyNicknameToStringVar1AndEnsureTerminated(void) +{ + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +void TV_CheckMonOTIDEqualsPlayerID(void) +{ + if (GetPlayerTrainerId() == GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_ID, NULL)) + gSpecialVar_Result = FALSE; + else + gSpecialVar_Result = TRUE; +} + +u32 GetPlayerTrainerId(void) +{ + return (gSaveBlock2Ptr->playerTrainerId[3] << 24) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; +} + +u8 GetUnlockedSeviiAreas(void) +{ + u8 result = 0; + if (FlagGet(FLAG_WORLD_MAP_ONE_ISLAND) == TRUE) + result |= 1 << 0; + if (FlagGet(FLAG_WORLD_MAP_TWO_ISLAND) == TRUE) + result |= 1 << 1; + if (FlagGet(FLAG_WORLD_MAP_THREE_ISLAND) == TRUE) + result |= 1 << 2; + if (FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND) == TRUE) + result |= 1 << 3; + if (FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND) == TRUE) + result |= 1 << 4; + if (FlagGet(FLAG_WORLD_MAP_SIX_ISLAND) == TRUE) + result |= 1 << 5; + if (FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND) == TRUE) + result |= 1 << 6; + return result; +} + +void Special_UpdateTrainerCardPhotoIcons(void) +{ + u16 species[PARTY_SIZE]; + u32 personality[PARTY_SIZE]; + u8 i; + u8 partyCount; + for (i = 0; i < PARTY_SIZE; i++) + species[i] = SPECIES_NONE; + partyCount = CalculatePlayerPartyCount(); + for (i = 0; i < partyCount; i++) + { + species[i] = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL); + personality[i] = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, NULL); + } + VarSet(VAR_TRAINER_CARD_MON_ICON_1, SpeciesToMailSpecies(species[0], personality[0])); + VarSet(VAR_TRAINER_CARD_MON_ICON_2, SpeciesToMailSpecies(species[1], personality[1])); + VarSet(VAR_TRAINER_CARD_MON_ICON_3, SpeciesToMailSpecies(species[2], personality[2])); + VarSet(VAR_TRAINER_CARD_MON_ICON_4, SpeciesToMailSpecies(species[3], personality[3])); + VarSet(VAR_TRAINER_CARD_MON_ICON_5, SpeciesToMailSpecies(species[4], personality[4])); + VarSet(VAR_TRAINER_CARD_MON_ICON_6, SpeciesToMailSpecies(species[5], personality[5])); + VarSet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX, gSpecialVar_0x8004); +} + +u16 Special_StickerLadyGetBragFlags(void) +{ + u16 result = 0; + u32 numEggs; + gSpecialVar_0x8004 = GetGameStat(GAME_STAT_ENTERED_HOF); + numEggs = GetGameStat(GAME_STAT_HATCHED_EGGS); + gSpecialVar_0x8006 = GetGameStat(GAME_STAT_LINK_BATTLE_WINS); + if (numEggs > 0xFFFF) + gSpecialVar_0x8005 = 0xFFFF; + else + gSpecialVar_0x8005 = numEggs; + if (gSpecialVar_0x8004 != 0) + result |= 1 << 0; + if (gSpecialVar_0x8005 != 0) + result |= 1 << 1; + if (gSpecialVar_0x8006 != 0) + result |= 1 << 2; + return result; +} + +u16 GetHiddenItemAttr(u32 hiddenItem, u8 attr) +{ + if (attr == 0) + return hiddenItem & 0xFFFF; + else if (attr == 1) + return ((hiddenItem >> 16) & 0xFF) + 1000; + else if (attr == 2) + return (hiddenItem >> 24) & 0x7F; + else if (attr == 3) + return (hiddenItem >> 31) & 0x01; + else + return 1; +} + +bool8 Special_PlayerPartyContainsSpecies(void) +{ + u8 partyCount = CalculatePlayerPartyCount(); + u8 i; + for (i = 0; i < partyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == gSpecialVar_0x8004) + return TRUE; + } + return FALSE; +} + +u8 sub_80CC4D4(void) +{ + u8 i; + for (i = 0; i < NELEMS(gUnknown_83F5D32); i++) + { + if (gSaveBlock1Ptr->location.mapGroup == gUnknown_83F5D32[i][0] && gSaveBlock1Ptr->location.mapNum == gUnknown_83F5D32[i][1]) + return gUnknown_83F5D32[i][2]; + } + return 1; +} + +void sub_80CC524(void) +{ + sub_8113550(11, NULL); +} + +void sub_80CC534(void) +{ + u8 i; + for (i = 0; i < NELEMS(gUnknown_83F5D58); i++) + { + if (gSaveBlock1Ptr->location.mapGroup == gUnknown_83F5D58[i].grp && gSaveBlock1Ptr->location.mapNum == gUnknown_83F5D58[i].num) + { + if (VarGet(VAR_0x404D) != 35 || i != 32) + { + VarSet(VAR_0x404D, i); + FlagSet(FLAG_0x808); + } + break; + } + } +} diff --git a/src/itemfinder.c b/src/itemfinder.c index e6448a166..05072c49e 100644 --- a/src/itemfinder.c +++ b/src/itemfinder.c @@ -17,7 +17,7 @@ static void Task_NoResponse_CleanUp(u8 taskId); static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId); static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId); static bool8 HiddenItemIsWithinRangeOfPlayer(struct MapEvents * events, u8 taskId); -static void SetUnderfootHiddenItem(u8 taskId, struct HiddenItemStruct hiddenItem); +static void SetUnderfootHiddenItem(u8 taskId, u32 hiddenItem); static void SetNormalHiddenItem(u8 taskId); static void FindHiddenItemsInConnectedMaps(u8 taskId); static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy); @@ -239,7 +239,7 @@ static bool8 HiddenItemIsWithinRangeOfPlayer(struct MapEvents * events, u8 taskI return FALSE; } -static void SetUnderfootHiddenItem(u8 taskId, struct HiddenItemStruct hiddenItem) +static void SetUnderfootHiddenItem(u8 taskId, u32 hiddenItem) { s16 *data = gTasks[taskId].data; gSpecialVar_0x8004 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_FLAG); |