#include "global.h" #include "field_specials.h" #include "diploma.h" #include "fieldmap.h" #include "event_data.h" #include "field_map_obj.h" #include "field_region_map.h" #include "field_message_box.h" #include "field_camera.h" #include "field_player_avatar.h" #include "main.h" #include "map_constants.h" #include "rom4.h" #include "script.h" #include "songs.h" #include "string_util.h" #include "strings.h" #include "text.h" #include "wallclock.h" #include "tv.h" #include "rtc.h" #include "link.h" #include "songs.h" #include "sound.h" #if ENGLISH #define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD #elif GERMAN #define CHAR_DECIMAL_SEPARATOR CHAR_COMMA #endif static void RecordCyclingRoadResults(u32, u8); void sub_810D6A4(void) { SetMainCallback2(sub_8145D88); ScriptContext2_Enable(); } void sub_810D6B8(void) { gMain.savedCallback = c2_exit_to_overworld_2_switch; SetMainCallback2(CB2_ViewWallClock); ScriptContext2_Enable(); } void ResetCyclingRoadChallengeData(void) { gUnknown_02039250 = 0; gUnknown_02039251 = 0; gUnknown_02039254 = 0; } void BeginCyclingRoadChallenge(void) { gUnknown_02039250 = 1; gUnknown_02039251 = 0; gUnknown_02039254 = gMain.vblankCounter1; } u16 GetPlayerAvatarBike(void) { if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) { return 1; } if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) { return 2; } return 0; } void DetermineCyclingRoadResults(u32 arg0, u8 arg1) { u8 result; if (arg1 <= 99) { ConvertIntToDecimalStringN(gStringVar1, arg1, STR_CONV_MODE_LEFT_ALIGN, 2); StringAppend(gStringVar1, gOtherText_Times); } else { StringCopy(gStringVar1, gOtherText_99Times); } if (arg0 < 3600) { ConvertIntToDecimalStringN(gStringVar2, arg0 / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; ConvertIntToDecimalStringN(&gStringVar2[3], ((arg0 % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar2, gOtherText_Seconds); } else { StringCopy(gStringVar2, gOtherText_1Minute); } result = 0; if (arg1 == 0) { result = 5; } else if (arg1 < 4) { result = 4; } else if (arg1 < 10) { result = 3; } else if (arg1 < 20) { result = 2; } else if (arg1 < 100) { result = 1; } if (arg0 / 60 <= 10) { result += 5; } else if (arg0 / 60 <= 15) { result += 4; } else if (arg0 / 60 <= 20) { result += 3; } else if (arg0 / 60 <= 40) { result += 2; } else if (arg0 / 60 < 60) { result += 1; } gScriptResult = result; } void FinishCyclingRoadChallenge(void) { const u32 time = gMain.vblankCounter1 - gUnknown_02039254; DetermineCyclingRoadResults(time, gUnknown_02039251); RecordCyclingRoadResults(time, gUnknown_02039251); } static void RecordCyclingRoadResults(u32 arg0, u8 arg1) { u16 high, low; u32 record; high = VarGet(0x4028); low = VarGet(0x4029); record = high + (low << 16); if (record > arg0 || record == 0) { VarSet(0x4028, arg0); VarSet(0x4029, arg0 >> 16); VarSet(0x4027, arg1); } } u16 GetRecordedCyclingRoadResults(void) { u16 high, low; u32 record; high = VarGet(0x4028); low = VarGet(0x4029); record = high + (low << 16); if (record == 0) { return FALSE; } DetermineCyclingRoadResults(record, VarGet(0x4027)); return TRUE; } void UpdateCyclingRoadState(void) { if (gUnknown_020297F0.mapNum == MAP_ID_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE && gUnknown_020297F0.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) { return; } if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3) { VarSet(0x40a9, 0); sav1_set_battle_music_maybe(SE_STOP); } } void SetSSTidalFlag(void) { FlagSet(SYS_CRUISE_MODE); *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; } void ResetSSTidalFlag(void) { FlagReset(SYS_CRUISE_MODE); } bool32 CountSSTidalStep(u16 delta) { if (!FlagGet(SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc) { return FALSE; } return TRUE; } u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) { u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); switch (*GetVarPointer(VAR_PORTHOLE)) { case 1: case 8: return 1; case 3: case 9: return 4; case 4: case 5: return 2; case 6: case 10: return 3; case 2: if (*varCruiseStepCount < 60) { *mapNum = MAP_ID_ROUTE134; *x = *varCruiseStepCount + 19; } else if (*varCruiseStepCount < 140) { *mapNum = MAP_ID_ROUTE133; *x = *varCruiseStepCount - 60; } else { *mapNum = MAP_ID_ROUTE132; *x = *varCruiseStepCount - 140; } break; case 7: if (*varCruiseStepCount < 66) { *mapNum = MAP_ID_ROUTE132; *x = 65 - *varCruiseStepCount; } else if (*varCruiseStepCount < 146) { *mapNum = MAP_ID_ROUTE133; *x = 145 - *varCruiseStepCount; } else { *mapNum = MAP_ID_ROUTE134; *x = 224 - *varCruiseStepCount; } break; } *mapGroup = MAP_GROUP_ROUTE132; *y = 20; return 0; } u8 GetLinkPartnerNames(void) { u8 i; u8 j = 0; u8 myLinkPlayerNumber = sub_8008218(); u8 nLinkPlayers = sub_800820C(); for (i=0; i=0; i--) { MapGridSetMetatileIdAt(switchCoords->x, switchCoords->y, 0x206); switchCoords++; } for (y=12; y<24; y++) { for (x=7; x<16; x++) { switch (MapGridGetMetatileIdAt(x, y)) { case 0x220: MapGridSetMetatileIdAt(x, y, 0x230); break; case 0x221: MapGridSetMetatileIdAt(x, y, 0x231); break; case 0x228: MapGridSetMetatileIdAt(x, y, 0x238); break; case 0x229: MapGridSetMetatileIdAt(x, y, 0x239); break; case 0x222: MapGridSetMetatileIdAt(x, y, 0x232); break; case 0x223: MapGridSetMetatileIdAt(x, y, 0x233); break; case 0x22a: MapGridSetMetatileIdAt(x, y, 0x23a); break; case 0x22b: MapGridSetMetatileIdAt(x, y, 0x23b); break; case 0x240: MapGridSetMetatileIdAt(x, y, 0xe42); break; case 0x241: MapGridSetMetatileIdAt(x, y, 0xe43); break; case 0x248: case 0x249: MapGridSetMetatileIdAt(x, y, 0x21a); break; case 0x250: MapGridSetMetatileIdAt(x, y, 0x251); break; } } } } static void Task_PetalburgGym(u8); static void PetalburgGymFunc(u8, u16); const u8 gUnknown_083F8370[] = {0, 1, 1, 1, 1}; const u16 gUnknown_083F8376[] = {0x218, 0x219, 0x21a, 0x21b, 0x21c}; void PetalburgGymSpecial1(void) { gUnknown_02039258 = 0; gUnknown_02039259 = 0; PlaySE(SE_KI_GASYAN); CreateTask(Task_PetalburgGym, 8); } static void Task_PetalburgGym(u8 taskId) { if (gUnknown_083F8370[gUnknown_02039259] == gUnknown_02039258) { PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_083F8376[gUnknown_02039259]); gUnknown_02039258 = 0; if ((++gUnknown_02039259) == 5) { DestroyTask(taskId); EnableBothScriptContexts(); } } else { gUnknown_02039258++; } } static void PetalburgGymFunc(u8 a0, u16 a1) { u16 x[4]; u16 y[4]; u8 i; u8 nDoors; nDoors = 0; switch (a0) { case 1: nDoors = 2; x[0] = 1; x[1] = 7; y[0] = 0x68; y[1] = 0x68; break; case 2: nDoors = 2; x[0] = 1; x[1] = 7; y[0] = 0x4e; y[1] = 0x4e; break; case 3: nDoors = 2; x[0] = 1; x[1] = 7; y[0] = 0x5b; y[1] = 0x5b; break; case 4: nDoors = 1; x[0] = 7; y[0] = 0x27; break; case 5: nDoors = 2; x[0] = 1; x[1] = 7; y[0] = 0x34; y[1] = 0x34; break; case 6: nDoors = 1; x[0] = 1; y[0] = 0x41; break; case 7: nDoors = 1; x[0] = 7; y[0] = 0xd; break; case 8: nDoors = 1; x[0] = 1; y[0] = 0x1a; break; } for (i=0; i 9999) { weekCount = 9999; } return weekCount; } u8 GetLeadMonFriendshipScore(void) { struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()]; if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) { return 6; } if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) { return 5; } if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) { return 4; } if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) { return 3; } if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) { return 2; } if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1) { return 1; } return 0; } void CB2_FieldShowRegionMap(void) { FieldInitRegionMap(c2_exit_to_overworld_1_continue_scripts_restart_music); } void FieldShowRegionMap(void) { SetMainCallback2(CB2_FieldShowRegionMap); } static void Task_PCTurnOnEffect(u8); static void PCTurnOffEffect_0(struct Task *); static void PCTurnOffEffect_1(s16, s8, s8); static void PCTurnOffEffect(void); void DoPCTurnOnEffect(void) { u8 taskId; if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) { taskId = CreateTask(Task_PCTurnOnEffect, 8); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = taskId; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = 0; } } static void Task_PCTurnOnEffect(u8 taskId) { struct Task *task; task = &gTasks[taskId]; if (task->data[0] == 0) { PCTurnOffEffect_0(task); } } static void PCTurnOffEffect_0(struct Task *task) { u8 playerDirectionLowerNybble; s8 dx, dy; dx = 0; dy = 0; if (task->data[3] == 6) { task->data[3] = 0; playerDirectionLowerNybble = player_get_direction_lower_nybble(); switch (playerDirectionLowerNybble) { case DIR_NORTH: dx = 0; dy = -1; break; case DIR_WEST: dx = -1; dy = -1; break; case DIR_EAST: dx = 1; dy = -1; break; } PCTurnOffEffect_1(task->data[4], dx, dy); DrawWholeMapView(); task->data[4] ^= 1; if ((++task->data[2]) == 5) { DestroyTask(task->data[1]); } } task->data[3]++; } static void PCTurnOffEffect_1(s16 flag, s8 dx, s8 dy) { u16 tileId; tileId = 0; if (flag != 0) { if (gSpecialVar_0x8004 == 0) { tileId = 0x4; } else if (gSpecialVar_0x8004 == 1) { tileId = 0x25a; } else if (gSpecialVar_0x8004 == 2) { tileId = 0x259; } } else { if (gSpecialVar_0x8004 == 0) { tileId = 0x5; } else if (gSpecialVar_0x8004 == 1) { tileId = 0x27f; } else if (gSpecialVar_0x8004 == 2) { tileId = 0x27e; } } MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); } void DoPCTurnOffEffect(void) { PCTurnOffEffect(); } static void PCTurnOffEffect(void) { u16 tileId; s8 dx, dy; u8 playerDirectionLowerNybble; dx = 0; dy = 0; tileId = 0; playerDirectionLowerNybble = player_get_direction_lower_nybble(); switch (playerDirectionLowerNybble) { case DIR_NORTH: dx = 0; dy = -1; break; case DIR_WEST: dx = -1; dy = -1; break; case DIR_EAST: dx = 1; dy = -1; break; } if (gSpecialVar_0x8004 == 0) { tileId = 0x4; } else if (gSpecialVar_0x8004 == 1) { tileId = 0x25a; } else if (gSpecialVar_0x8004 == 2) { tileId = 0x259; } MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); DrawWholeMapView(); } static void Task_LotteryCornerComputerEffect(u8); static void LotteryCornerComputerEffect(struct Task *); void DoLotteryCornerComputerEffect(void) { if (FuncIsActiveTask(Task_LotteryCornerComputerEffect) != TRUE) { u8 taskId = CreateTask(Task_LotteryCornerComputerEffect, 8); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = taskId; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = 0; } } static void Task_LotteryCornerComputerEffect(u8 taskId) { struct Task *task = &gTasks[taskId]; if (task->data[0] == 0) { LotteryCornerComputerEffect(task); } } static void LotteryCornerComputerEffect(struct Task *task) { if (task->data[3] == 6) { task->data[3] = 0; if (task->data[4] != 0) { MapGridSetMetatileIdAt(18, 8, 0xe9d); MapGridSetMetatileIdAt(18, 9, 0xea5); } else { MapGridSetMetatileIdAt(18, 8, 0xe58); MapGridSetMetatileIdAt(18, 9, 0xe60); } DrawWholeMapView(); task->data[4] ^= 1; if ((++task->data[2]) == 5) { DestroyTask(task->data[1]); } } task->data[3]++; } void EndLotteryCornerComputerEffect(void) { MapGridSetMetatileIdAt(18, 8, 0xe9d); MapGridSetMetatileIdAt(18, 9, 0xea5); DrawWholeMapView(); }