diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-23 15:31:23 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-23 15:31:23 -0400 |
commit | 661e5d92217c0b40146b35e7b023a28fd567b406 (patch) | |
tree | 0bf026238d8b965dcb863a7c959a46561685d921 /src | |
parent | 6e36c229200e083ca005cbc448e99210d111f3b2 (diff) |
field_specials through Task_AnimateElevatorWindowView
Diffstat (limited to 'src')
-rw-r--r-- | src/field_specials.c | 955 | ||||
-rw-r--r-- | src/mevent.c | 2 | ||||
-rw-r--r-- | src/mevent_server.c | 2 | ||||
-rw-r--r-- | src/mystery_event_script.c | 2 |
4 files changed, 958 insertions, 3 deletions
diff --git a/src/field_specials.c b/src/field_specials.c new file mode 100644 index 000000000..0aa1f81d1 --- /dev/null +++ b/src/field_specials.c @@ -0,0 +1,955 @@ +#include "global.h" +#include "quest_log.h" +#include "diploma.h" +#include "script.h" +#include "field_player_avatar.h" +#include "overworld.h" +#include "field_message_box.h" +#include "event_data.h" +#include "string_util.h" +#include "strings.h" +#include "battle.h" +#include "fieldmap.h" +#include "field_specials.h" +#include "region_map.h" +#include "task.h" +#include "battle_tower.h" +#include "field_camera.h" +#include "field_map_obj.h" +#include "random.h" +#include "sound.h" +#include "text.h" +#include "pokemon_storage_system.h" +#include "script_menu.h" +#include "data.h" +#include "pokedex.h" +#include "window.h" +#include "text_window.h" +#include "menu.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "constants/items.h" +#include "constants/map_objects.h" +#include "constants/maps.h" + +EWRAM_DATA u8 sElevatorCurrentFloorWindowId = 0; +EWRAM_DATA u16 sElevatorScroll = 0; +EWRAM_DATA u16 sElevatorCursorPos = 0; + +static void Task_AnimatePcTurnOn(u8 taskId); +static void PcTurnOnUpdateMetatileId(bool16 flag); +static void Task_ShakeScreen(u8 taskId); +static void Task_EndScreenShake(u8 taskId); +static u16 SampleResortGoregeousMon(void); +static u16 SampleResortGoregeousReward(void); +static void Task_ElevatorShake(u8 taskId); +static void AnimateElevatorWindowView(u16 nfloors, bool8 direction); +static void Task_AnimateElevatorWindowView(u8 taskId); +u16 GetStarterPokemon(u16 starterIdx); + +extern const u8 sSlotMachineIndices[22]; +extern const u16 sResortGorgeousDeluxeRewards[6]; +extern const struct WindowTemplate sElevatorCurrentFloorWindowTemplate; +extern const u8 *const sFloorNamePointers[15]; +extern const u16 sElevatorWindowMetatilesGoingUp[3][3]; +extern const u16 sElevatorWindowMetatilesGoingDown[3][3]; +extern const u8 sElevatorAnimationDuration[9]; +extern const u8 sElevatorWindowAnimDuration[9]; + +void Special_ShowDiploma(void) +{ + sub_8112364(); + SetMainCallback2(CB2_ShowDiploma); + ScriptContext2_Enable(); +} + +void Special_ForcePlayerOntoBike(void) +{ + if (gPlayerAvatar.flags & 1) + SetPlayerAvatarTransitionFlags(2); + Overworld_SetSavedMusic(MUS_CYCLING); + Overworld_ChangeMusicTo(MUS_CYCLING); +} + +void nullsub_74(void) +{ + +} + +u8 Special_GetPlayerAvatarBike(void) +{ + if (TestPlayerAvatarFlags(4)) + return 1; + else if (TestPlayerAvatarFlags(2)) + return 2; + else + return 0; +} + +void Special_ShowStringVar4AsFieldMessage(void) +{ + ShowFieldMessage(gStringVar4); +} + +void Special_GetPlayerXY(void) +{ + gSpecialVar_0x8004 = gSaveBlock1Ptr->pos.x; + gSpecialVar_0x8005 = gSaveBlock1Ptr->pos.y; +} + +u8 Special_GetPlayerTrainerIdOnesDigit(void) +{ + u16 playerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; + return playerId % 10; +} + +void Special_BufferBigGuyOrBigGirlString(void) +{ + if (gSaveBlock2Ptr->playerGender == MALE) + StringCopy(gStringVar1, gUnknown_8417FBB); + else + StringCopy(gStringVar1, gUnknown_8417FC3); +} + +void Special_BufferSonOrDaughterString(void) +{ + if (gSaveBlock2Ptr->playerGender == MALE) + StringCopy(gStringVar1, gUnknown_8417FD0); + else + StringCopy(gStringVar1, gUnknown_8417FCC); +} + +u8 Special_GetBattleOutcome(void) +{ + return gBattleOutcome; +} + +void Special_SetHiddenItemFlag(void) +{ + FlagSet(gSpecialVar_0x8004); +} + +u8 Special_GetLeadMonFriendship(void) +{ + struct Pokemon * pokemon = &gPlayerParty[GetLeadMonIndex()]; + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) + return 6; + else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) + return 5; + else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) + return 4; + else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) + return 3; + else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) + return 2; + else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) > 0) + return 1; + else + return 0; +} + +void Special_TownMap(void) +{ + sub_8112364(); + sub_80BFF50(1, CB2_ReturnToFieldContinueScriptPlayMapMusic); +} + +bool8 Special_PlayerHasGrassPokemonInParty(void) +{ + u8 i; + struct Pokemon * pokemon; + u16 species; + + for (i = 0; i < PARTY_SIZE; i++) + { + pokemon = &gPlayerParty[i]; + if ( GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) + && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + species = GetMonData(pokemon, MON_DATA_SPECIES); + if (gBaseStats[species].type1 == TYPE_GRASS || gBaseStats[species].type2 == TYPE_GRASS) + return TRUE; + } + } + return FALSE; +} + +void Special_AnimatePcTurnOn(void) +{ + u8 taskId; + + if (FuncIsActiveTask(Task_AnimatePcTurnOn) != TRUE) + { + taskId = CreateTask(Task_AnimatePcTurnOn, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + } +} + +static void Task_AnimatePcTurnOn(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (data[1] == 6) + { + PcTurnOnUpdateMetatileId(data[0] & 1); + DrawWholeMapView(); + data[1] = 0; + data[0]++; + if (data[0] == 5) + DestroyTask(taskId); + } + data[1]++; +} + +static void PcTurnOnUpdateMetatileId(bool16 a0) +{ + u16 metatileId = 0; + s8 deltaX = 0; + s8 deltaY = 0; + u8 direction = GetPlayerFacingDirection(); + + switch (direction) + { + case DIR_NORTH: + deltaX = 0; + deltaY = -1; + break; + case DIR_WEST: + deltaX = -1; + deltaY = -1; + break; + case DIR_EAST: + deltaX = 1; + deltaY = -1; + break; + } + if (a0) + { + if (gSpecialVar_0x8004 == 0) + metatileId = 0x62; + else if (gSpecialVar_0x8004 == 1) + metatileId = 0x28F; + else if (gSpecialVar_0x8004 == 2) + metatileId = 0x28F; + } + else + { + if (gSpecialVar_0x8004 == 0) + metatileId = 0x63; + else if (gSpecialVar_0x8004 == 1) + metatileId = 0x28A; + else if (gSpecialVar_0x8004 == 2) + metatileId = 0x28A; + } + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + 7, gSaveBlock1Ptr->pos.y + deltaY + 7, metatileId | 0xC00); +} + +void Special_AnimatePcTurnOff() +{ + u16 metatileId = 0; + s8 deltaX = 0; + s8 deltaY = 0; + u8 direction = GetPlayerFacingDirection(); + + switch (direction) + { + case DIR_NORTH: + deltaX = 0; + deltaY = -1; + break; + case DIR_WEST: + deltaX = -1; + deltaY = -1; + break; + case DIR_EAST: + deltaX = 1; + deltaY = -1; + break; + } + if (gSpecialVar_0x8004 == 0) + metatileId = 0x62; + else if (gSpecialVar_0x8004 == 1) + metatileId = 0x28F; + else if (gSpecialVar_0x8004 == 2) + metatileId = 0x28F; + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + 7, gSaveBlock1Ptr->pos.y + deltaY + 7, metatileId | 0xC00); + DrawWholeMapView(); +} + +void SpawnCameraObject(void) +{ + u8 mapObjectId = SpawnSpecialFieldObjectParameterized(MAP_OBJ_GFX_YOUNGSTER, 8, 127, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3); + gMapObjects[mapObjectId].mapobj_bit_13 = TRUE; + CameraObjectSetFollowedObjectId(gMapObjects[mapObjectId].spriteId); +} + +void RemoveCameraObject(void) +{ + CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); + RemoveFieldObjectByLocalIdAndMap(127, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); +} + +void Special_BufferEReaderTrainerName5(void) +{ + CopyEReaderTrainerName5(gStringVar1); +} + +u8 Special_GetRandomSlotMachine(void) +{ + u16 rval = Random() % NELEMS(sSlotMachineIndices); + return sSlotMachineIndices[rval]; +} + +bool8 LeadMonHasEffortRibbon(void) +{ + u8 leadMonIdx = GetLeadMonIndex(); + return GetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, NULL); +} + +void GiveLeadMonEffortRibbon(void) +{ + u8 leadMonIdx; + bool8 param; + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); + FlagSet(FLAG_SYS_RIBBON_GET); + param = TRUE; + leadMonIdx = GetLeadMonIndex(); + SetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, ¶m); +} + +bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void) +{ + u8 leadMonIndex = GetLeadMonIndex(); + if (GetMonEVCount(&gPlayerParty[leadMonIndex]) >= 510) + return TRUE; + else + return FALSE; +} + +bool8 Special_IsStarterFirstStageInParty(void) +{ + u16 species = GetStarterPokemon(VarGet(VAR_STARTER_MON)); + u8 partyCount = CalculatePlayerPartyCount(); + u8 i; + for (i = 0; i < partyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == species) + return TRUE; + } + return FALSE; +} + +bool8 Special_IsThereRoomInAnyBoxForMorePokemon(void) +{ + u16 i; + u16 j; + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SPECIES) == SPECIES_NONE) + return TRUE; + } + } + return FALSE; +} + +bool8 Special_CheckPartyPokerus(void) +{ + if (!CheckPartyPokerus(gPlayerParty, 0x3F)) + return FALSE; + else + return TRUE; +} + +#define tXtrans data[0] +#define tTimer data[1] +#define tNremain data[2] +#define tDuration data[3] +#define tYtrans data[4] + +void Special_ShakeScreen(void) +{ + /* + * 0x8004 = x translation + * 0x8005 = y translation + * 0x8006 = num interations + * 0x8007 = duration of an iteration + */ + u8 taskId = CreateTask(Task_ShakeScreen, 9); + gTasks[taskId].tXtrans = gSpecialVar_0x8005; + gTasks[taskId].tTimer = 0; + gTasks[taskId].tNremain = gSpecialVar_0x8006; + gTasks[taskId].tDuration = gSpecialVar_0x8007; + gTasks[taskId].tYtrans = gSpecialVar_0x8004; + SetCameraPanningCallback(NULL); + PlaySE(SE_W070); +} + +static void Task_ShakeScreen(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + tTimer++; + if (tTimer % tDuration == 0) + { + tTimer = 0; + tNremain--; + tXtrans = -tXtrans; + tYtrans = -tYtrans; + SetCameraPanning(tXtrans, tYtrans); + if (tNremain == 0) + { + Task_EndScreenShake(taskId); + InstallCameraPanAheadCallback(); + } + } +} + +static void Task_EndScreenShake(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +#undef tYtrans +#undef tDuration +#undef tNremain +#undef tTimer +#undef tXtrans + +u8 GetLeadMonIndex(void) +{ + u8 partyCount = CalculatePlayerPartyCount(); + u8 i; + struct Pokemon * pokemon; + for (i = 0; i < partyCount; i++) + { + pokemon = &gPlayerParty[i]; + if (GetMonData(pokemon, MON_DATA_SPECIES2, NULL) != SPECIES_EGG && GetMonData(pokemon, MON_DATA_SPECIES2, NULL) != SPECIES_NONE) + return i; + } + return 0; +} + +u16 Special_GetSpeciesOfPartySlot_x8004(void) +{ + return GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES2, NULL); +} + +bool8 Special_BufferMonOTNameAndCompareToPlayerName(void) +{ + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); + if (!StringCompare(gSaveBlock2Ptr->playerName, gStringVar1)) + return FALSE; + else + return TRUE; +} + +void nullsub_75(void) +{ + +} + +void sub_80CADC4(void) +{ + u8 t = EOS; + AddTextPrinterParameterized(0, 2, &t, 0, 1, 0, NULL); + sub_809D424(); +} + +void Special_SetVermilionTrashCans(void) +{ + u16 idx = (Random() % 15) + 1; + gSpecialVar_0x8004 = idx; + gSpecialVar_0x8005 = idx; + switch (gSpecialVar_0x8004) + { + case 1: + idx = Random() % 2; + if (idx == 0) + gSpecialVar_0x8005 += 1; + else + gSpecialVar_0x8005 += 5; + break; + case 2: + case 3: + case 4: + idx = Random() % 3; + if (idx == 0) + gSpecialVar_0x8005 += 1; + else if (idx == 1) + gSpecialVar_0x8005 += 5; + else + gSpecialVar_0x8005 -= 1; + break; + case 5: + idx = Random() % 2; + if (idx == 0) + gSpecialVar_0x8005 += 5; + else + gSpecialVar_0x8005 -= 1; + break; + case 6: + idx = Random() % 3; + if (idx == 0) + gSpecialVar_0x8005 -= 5; + else if (idx == 1) + gSpecialVar_0x8005 += 1; + else + gSpecialVar_0x8005 += 5; + break; + case 7: + case 8: + case 9: + idx = Random() % 4; + if (idx == 0) + gSpecialVar_0x8005 -= 5; + else if (idx == 1) + gSpecialVar_0x8005 += 1; + else if (idx == 2) + gSpecialVar_0x8005 += 5; + else + gSpecialVar_0x8005 -= 1; + break; + case 10: + idx = Random() % 3; + if (idx == 0) + gSpecialVar_0x8005 -= 5; + else if (idx == 1) + gSpecialVar_0x8005 += 5; + else + gSpecialVar_0x8005 -= 1; + break; + case 11: + idx = Random() % 2; + if (idx == 0) + gSpecialVar_0x8005 -= 5; + else + gSpecialVar_0x8005 += 1; + break; + case 12: + case 13: + case 14: + idx = Random() % 3; + if (idx == 0) + gSpecialVar_0x8005 -= 5; + else if (idx == 1) + gSpecialVar_0x8005 += 1; + else + gSpecialVar_0x8005 -= 1; + break; + case 15: + idx = Random() % 2; + if (idx == 0) + gSpecialVar_0x8005 -= 5; + else + gSpecialVar_0x8005 -= 1; + break; + } + if (gSpecialVar_0x8005 > 15) + { + if (gSpecialVar_0x8004 % 5 == 1) + gSpecialVar_0x8005 = gSpecialVar_0x8004 + 1; + else if (gSpecialVar_0x8004 % 5 == 0) + gSpecialVar_0x8005 = gSpecialVar_0x8004 - 1; + else + gSpecialVar_0x8005 = gSpecialVar_0x8004 + 1; + } +} + +void IncrementResortGorgeousStepCounter(void) +{ + u16 var4035 = VarGet(VAR_RESORT_GOREGEOUS_STEP_COUNTER); + if (VarGet(VAR_RESORT_GOREGOUS_REQUESTED_MON) != SPECIES_NONE) + { + var4035++; + if (var4035 >= 250) + { + VarSet(VAR_RESORT_GOREGOUS_REQUESTED_MON, 0xFFFF); + VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, 0); + } + else + { + VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, var4035); + } + } +} + +void Special_SampleResortGorgeousMonAndReward(void) +{ + u16 var4036 = VarGet(VAR_RESORT_GOREGOUS_REQUESTED_MON); + if (var4036 == SPECIES_NONE || var4036 == 0xFFFF) + { + VarSet(VAR_RESORT_GOREGOUS_REQUESTED_MON, SampleResortGoregeousMon()); + VarSet(VAR_RESORT_GOREGOUS_REWARD, SampleResortGoregeousReward()); + VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, 0); + } + StringCopy(gStringVar1, gSpeciesNames[VarGet(VAR_RESORT_GOREGOUS_REQUESTED_MON)]); +} + +static u16 SampleResortGoregeousMon(void) +{ + u16 i; + u16 species; + for (i = 0; i < 100; i++) + { + species = (Random() % (NUM_SPECIES - 1)) + 1; + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FALSE) == TRUE) + return species; + } + while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FALSE) != TRUE) + { + if (species == SPECIES_BULBASAUR) + species = NUM_SPECIES - 1; + else + species--; + } + return species; +} + +static u16 SampleResortGoregeousReward(void) +{ + if ((Random() % 100) >= 30) + return ITEM_LUXURY_BALL; + else + return sResortGorgeousDeluxeRewards[Random() % NELEMS(sResortGorgeousDeluxeRewards)]; +} + +bool8 Special_CheckAddCoins(void) +{ + if (gSpecialVar_Result + gSpecialVar_0x8006 > 9999) + return FALSE; + else + return TRUE; +} + +void Special_GetElevatorFloor(void) +{ + u16 floor = 4; + if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F)) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(SILPH_CO_1F): + floor = 4; + break; + case MAP_NUM(SILPH_CO_2F): + floor = 5; + break; + case MAP_NUM(SILPH_CO_3F): + floor = 6; + break; + case MAP_NUM(SILPH_CO_4F): + floor = 7; + break; + case MAP_NUM(SILPH_CO_5F): + floor = 8; + break; + case MAP_NUM(SILPH_CO_6F): + floor = 9; + break; + case MAP_NUM(SILPH_CO_7F): + floor = 10; + break; + case MAP_NUM(SILPH_CO_8F): + floor = 11; + break; + case MAP_NUM(SILPH_CO_9F): + floor = 12; + break; + case MAP_NUM(SILPH_CO_10F): + floor = 13; + break; + case MAP_NUM(SILPH_CO_11F): + floor = 14; + break; + case MAP_NUM(ROCKET_HIDEOUT_B1F): + floor = 3; + break; + case MAP_NUM(ROCKET_HIDEOUT_B2F): + floor = 2; + break; + case MAP_NUM(ROCKET_HIDEOUT_B4F): + floor = 0; + break; + } + } + if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F)) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F): + floor = 4; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F): + floor = 5; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F): + floor = 6; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F): + floor = 7; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F): + floor = 8; + break; + } + } + if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F)) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF): + floor = 15; + break; + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY): + floor = 3; + break; + } + } + VarSet(VAR_ELEVATOR_FLOOR, floor); +} + +u16 Special_InitElevatorFloorSelectMenuPos(void) +{ + sElevatorScroll = 0; + sElevatorCursorPos = 0; + + if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F)) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(SILPH_CO_11F): + sElevatorScroll = 0; + sElevatorCursorPos = 0; + break; + case MAP_NUM(SILPH_CO_10F): + sElevatorScroll = 0; + sElevatorCursorPos = 1; + break; + case MAP_NUM(SILPH_CO_9F): + sElevatorScroll = 0; + sElevatorCursorPos = 2; + break; + case MAP_NUM(SILPH_CO_8F): + sElevatorScroll = 0; + sElevatorCursorPos = 3; + break; + case MAP_NUM(SILPH_CO_7F): + sElevatorScroll = 0; + sElevatorCursorPos = 4; + break; + case MAP_NUM(SILPH_CO_6F): + sElevatorScroll = 1; + sElevatorCursorPos = 4; + break; + case MAP_NUM(SILPH_CO_5F): + sElevatorScroll = 2; + sElevatorCursorPos = 4; + break; + case MAP_NUM(SILPH_CO_4F): + sElevatorScroll = 3; + sElevatorCursorPos = 4; + break; + case MAP_NUM(SILPH_CO_3F): + sElevatorScroll = 4; + sElevatorCursorPos = 4; + break; + case MAP_NUM(SILPH_CO_2F): + sElevatorScroll = 5; + sElevatorCursorPos = 4; + break; + case MAP_NUM(SILPH_CO_1F): + sElevatorScroll = 5; + sElevatorCursorPos = 5; + break; + case MAP_NUM(ROCKET_HIDEOUT_B1F): + sElevatorScroll = 0; + sElevatorCursorPos = 0; + break; + case MAP_NUM(ROCKET_HIDEOUT_B2F): + sElevatorScroll = 0; + sElevatorCursorPos = 1; + break; + case MAP_NUM(ROCKET_HIDEOUT_B4F): + sElevatorScroll = 0; + sElevatorCursorPos = 2; + break; + } + } + if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F)) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F): + sElevatorScroll = 0; + sElevatorCursorPos = 0; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F): + sElevatorScroll = 0; + sElevatorCursorPos = 1; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F): + sElevatorScroll = 0; + sElevatorCursorPos = 2; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F): + sElevatorScroll = 0; + sElevatorCursorPos = 3; + break; + case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F): + sElevatorScroll = 0; + sElevatorCursorPos = 4; + break; + } + } + if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F)) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F): + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF): + sElevatorScroll = 0; + sElevatorCursorPos = 0; + break; + case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY): + sElevatorScroll = 0; + sElevatorCursorPos = 1; + break; + } + } + return sElevatorCursorPos; +} + +void Special_AnimateElevator(void) +{ + u16 nfloors; + s16 *data = gTasks[CreateTask(Task_ElevatorShake, 9)].data; + data[1] = 0; + data[2] = 0; + data[4] = 1; + if (gSpecialVar_0x8005 > gSpecialVar_0x8006) + { + nfloors = gSpecialVar_0x8005 - gSpecialVar_0x8006; + data[6] = 1; + } + else + { + nfloors = gSpecialVar_0x8006 - gSpecialVar_0x8005; + data[6] = 0; + } + if (nfloors > 8) + nfloors = 8; + data[5] = sElevatorAnimationDuration[nfloors]; + SetCameraPanningCallback(NULL); + AnimateElevatorWindowView(nfloors, data[6]); + PlaySE(SE_ELEBETA); +} + +static void Task_ElevatorShake(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[1]++; + if ((data[1] % 3) == 0) + { + data[1] = 0; + data[2]++; + data[4] = -data[4]; + SetCameraPanning(0, data[4]); + if (data[2] == data[5]) + { + PlaySE(SE_PINPON); + DestroyTask(taskId); + EnableBothScriptContexts(); + InstallCameraPanAheadCallback(); + } + } +} + +void Special_DrawElevatorCurrentFloorWindow(void) +{ + const u8 *floorname; + u32 strwidth; + if (sub_81119D4(sub_809D6D4) != TRUE) + { + sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate); + TextWindow_SetStdFrame0_WithPal(sElevatorCurrentFloorWindowId, 0x21D, 0xD0); + DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 0xD); + AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, 2, gUnknown_8418075, 0, 2, 0xFF, NULL); + floorname = sFloorNamePointers[gSpecialVar_0x8005]; + strwidth = GetStringWidth(2, floorname, 0); + AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, 2, floorname, 56 - strwidth, 16, 0xFF, NULL); + PutWindowTilemap(sElevatorCurrentFloorWindowId); + CopyWindowToVram(sElevatorCurrentFloorWindowId, 3); + } +} + +void Special_CloseElevatorCurrentFloorWindow(void) +{ + ClearStdWindowAndFrameToTransparent(sElevatorCurrentFloorWindowId, TRUE); + RemoveWindow(sElevatorCurrentFloorWindowId); +} + +static void AnimateElevatorWindowView(u16 nfloors, u8 direction) +{ + u8 taskId; + if (FuncIsActiveTask(Task_AnimateElevatorWindowView) != TRUE) + { + taskId = CreateTask(Task_AnimateElevatorWindowView, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = direction; + gTasks[taskId].data[3] = sElevatorWindowAnimDuration[nfloors]; + } +} + +static void Task_AnimateElevatorWindowView(u8 taskId) +{ + u8 i; + u8 j; + s16 *data = gTasks[taskId].data; + if (data[1] == 6) + { + data[0]++; + if (data[2] == 0) + { + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + MapGridSetMetatileIdAt(j + 8, i + 7, sElevatorWindowMetatilesGoingUp[i][data[0] % 3] | 0xC00); + } + } + } + else + { + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + MapGridSetMetatileIdAt(j + 8, i + 7, sElevatorWindowMetatilesGoingDown[i][data[0] % 3] | 0xC00); + } + } + } + DrawWholeMapView(); + data[1] = 0; + if (data[0] == data[3]) + DestroyTask(taskId); + } + data[1]++; +} diff --git a/src/mevent.c b/src/mevent.c index 74dca5a75..dc8df05d0 100644 --- a/src/mevent.c +++ b/src/mevent.c @@ -588,7 +588,7 @@ void DestroyWonderCard(void) ClearRamScript(); sub_806E2D0(); sub_806E370(); - sub_80E7524(gSaveBlock2Ptr->unk_B0.field_3F0); + sub_80E7524(&gSaveBlock2Ptr->unk_B0.field_3F0); } bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data) diff --git a/src/mevent_server.c b/src/mevent_server.c index 4e2b7280d..9fe9e9e79 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -226,7 +226,7 @@ static u32 ish_mainseq_4(struct mevent_client * svr) sub_8069EA4(svr->recvBuffer, 1000); break; case 18: - memcpy(gSaveBlock2Ptr->unk_B0.field_3F0, svr->recvBuffer, 0xbc); + memcpy(&gSaveBlock2Ptr->unk_B0.field_3F0, svr->recvBuffer, sizeof(struct BattleTowerEReaderTrainer)); ValidateEReaderTrainer(); break; case 21: diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index 26cbdb145..146595272 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -281,7 +281,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) { u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - memcpy(gSaveBlock2Ptr->unk_B0.field_3F0, (void *)data, 0xBC); + memcpy(&gSaveBlock2Ptr->unk_B0.field_3F0, (void *)data, sizeof(struct BattleTowerEReaderTrainer)); ValidateEReaderTrainer(); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer); ctx->data[2] = 2; |