#include "global.h" #include "field_specials.h" #include "diploma.h" #include "fieldmap.h" #include "event_data.h" #include "battle_tower.h" #include "event_object_movement.h" #include "region_map.h" #include "field_region_map.h" #include "field_message_box.h" #include "field_camera.h" #include "field_player_avatar.h" #include "main.h" #include "constants/maps.h" #include "overworld.h" #include "script.h" #include "constants/songs.h" #include "string_util.h" #include "strings.h" #include "pokeblock.h" #include "constants/species.h" #include "constants/abilities.h" #include "constants/moves.h" #include "text.h" #include "wallclock.h" #include "tv.h" #include "rtc.h" #include "link.h" #include "constants/songs.h" #include "sound.h" #include "menu.h" #include "starter_choose.h" #include "menu_helpers.h" #include "battle_tower.h" #include "field_weather.h" #include "pokemon_summary_screen.h" #include "random.h" #if ENGLISH #define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD #elif GERMAN #define CHAR_DECIMAL_SEPARATOR CHAR_COMMA #endif extern struct WarpData gUnknown_020297F0; extern u8 gBattleOutcome; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u16 gSpecialVar_Result; extern u8 *const gUnknown_083D1464[3]; EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE; EWRAM_DATA u8 gBikeCollisions = 0; EWRAM_DATA u32 gBikeCyclingTimer = 0; EWRAM_DATA u8 gUnknown_02039258 = 0; EWRAM_DATA u8 gUnknown_02039259 = 0; EWRAM_DATA u8 gUnknown_0203925A = 0; EWRAM_DATA u8 gUnknown_0203925B = 0; EWRAM_DATA u8 gUnknown_0203925C = 0; static void RecordCyclingRoadResults(u32, u8); static struct ElevatorMenu gUnknown_03000760[20]; void ScrSpecial_ShowDiploma(void) { SetMainCallback2(CB2_ShowDiploma); ScriptContext2_Enable(); } void ScrSpecial_ViewWallClock(void) { gMain.savedCallback = c2_exit_to_overworld_2_switch; SetMainCallback2(CB2_ViewWallClock); ScriptContext2_Enable(); } void ResetCyclingRoadChallengeData(void) { gBikeCyclingChallenge = FALSE; gBikeCollisions = 0; gBikeCyclingTimer = 0; } void ScrSpecial_BeginCyclingRoadChallenge(void) { gBikeCyclingChallenge = TRUE; gBikeCollisions = 0; gBikeCyclingTimer = 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; } static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) { u8 result; if (numBikeCollisions <= 99) { ConvertIntToDecimalStringN(gStringVar1, numBikeCollisions, STR_CONV_MODE_LEFT_ALIGN, 2); StringAppend(gStringVar1, gOtherText_Times); } else { StringCopy(gStringVar1, gOtherText_99Times); } if (numFrames < 3600) { ConvertIntToDecimalStringN(gStringVar2, numFrames / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; ConvertIntToDecimalStringN(&gStringVar2[3], ((numFrames % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar2, gOtherText_Seconds); } else { StringCopy(gStringVar2, gOtherText_1Minute); } result = 0; if (numBikeCollisions == 0) { result = 5; } else if (numBikeCollisions < 4) { result = 4; } else if (numBikeCollisions < 10) { result = 3; } else if (numBikeCollisions < 20) { result = 2; } else if (numBikeCollisions < 100) { result = 1; } if (numFrames / 60 <= 10) { result += 5; } else if (numFrames / 60 <= 15) { result += 4; } else if (numFrames / 60 <= 20) { result += 3; } else if (numFrames / 60 <= 40) { result += 2; } else if (numFrames / 60 < 60) { result += 1; } gSpecialVar_Result = result; } void FinishCyclingRoadChallenge(void) { const u32 numFrames = gMain.vblankCounter1 - gBikeCyclingTimer; DetermineCyclingRoadResults(numFrames, gBikeCollisions); RecordCyclingRoadResults(numFrames, gBikeCollisions); } static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) { u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); u32 framesRecord = low + (high << 16); if (framesRecord > numFrames || framesRecord == 0) { VarSet(VAR_CYCLING_ROAD_RECORD_TIME_L, numFrames); VarSet(VAR_CYCLING_ROAD_RECORD_TIME_H, numFrames >> 16); VarSet(VAR_CYCLING_ROAD_RECORD_COLLISIONS, numBikeCollisions); } } u16 GetRecordedCyclingRoadResults(void) { u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); u32 framesRecord = low + (high << 16); if (framesRecord == 0) { return FALSE; } DetermineCyclingRoadResults(framesRecord, VarGet(VAR_CYCLING_ROAD_RECORD_COLLISIONS)); return TRUE; } void UpdateCyclingRoadState(void) { if (gUnknown_020297F0.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) && gUnknown_020297F0.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE)) { return; } if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3) { VarSet(VAR_CYCLING_CHALLENGE_STATE, 0); Overworld_SetSavedMusic(SE_STOP); } } void SetSSTidalFlag(void) { FlagSet(FLAG_SYS_CRUISE_MODE); *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; } void ResetSSTidalFlag(void) { FlagClear(FLAG_SYS_CRUISE_MODE); } bool32 CountSSTidalStep(u16 delta) { if (!FlagGet(FLAG_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_STATE)) { 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_NUM(ROUTE134); *x = *varCruiseStepCount + 19; } else if (*varCruiseStepCount < 140) { *mapNum = MAP_NUM(ROUTE133); *x = *varCruiseStepCount - 60; } else { *mapNum = MAP_NUM(ROUTE132); *x = *varCruiseStepCount - 140; } break; case 7: if (*varCruiseStepCount < 66) { *mapNum = MAP_NUM(ROUTE132); *x = 65 - *varCruiseStepCount; } else if (*varCruiseStepCount < 146) { *mapNum = MAP_NUM(ROUTE133); *x = 145 - *varCruiseStepCount; } else { *mapNum = MAP_NUM(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 = 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) { if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) { u8 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 = &gTasks[taskId]; if (task->data[0] == 0) { PCTurnOffEffect_0(task); } } static void PCTurnOffEffect_0(struct Task *task) { u8 playerDirectionLowerNybble; s8 dx = 0; s8 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 = 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) { s8 dx = 0; s8 dy = 0; u16 tileId = 0; u8 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(); } static void sub_810E874(void); void DisplayCurrentElevatorFloor(void); void sub_810E984(u8); bool8 sub_810EAC8(u8, u8); void sub_810EB90(u8, u8); void ShakeScreenInElevator(void); void sub_810EC34(u8); void sub_810EC9C(u8); void sub_810ECB0(void); void sub_810ECD4(void); void sub_810ECFC(void); void sub_810ED40(u8); void sub_810ED60(struct Task *); void sub_810EEDC(void); const u8 *const gUnknown_083F8380[] = { OtherText_1F, OtherText_2F, OtherText_3F, OtherText_4F, OtherText_5F, OtherText_6F, OtherText_7F, OtherText_8F, OtherText_9F, OtherText_10F, OtherText_11F, OtherText_B1F, OtherText_B2F, OtherText_B3F, OtherText_B4F, OtherText_Rooftop }; void SetDepartmentStoreFloorVar(void) { u8 deptStoreFloor; switch (gSaveBlock1.warp2.mapNum) { case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): deptStoreFloor = 0; break; case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): deptStoreFloor = 1; break; case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): deptStoreFloor = 2; break; case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): deptStoreFloor = 3; break; case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): deptStoreFloor = 4; break; case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP): deptStoreFloor = 15; break; default: deptStoreFloor = 0; break; } VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor); } void ScriptAddElevatorMenuItem(u8 a0, u8 a1, u8 a2, u8 a3) { u8 i; if (gSpecialVar_0x8004 == 0) { for (i=0; i<20; i++) { gUnknown_03000760[i].var0 = 16; } } gUnknown_03000760[gSpecialVar_0x8004].var0 = a0; gUnknown_03000760[gSpecialVar_0x8004].var1 = a1; gUnknown_03000760[gSpecialVar_0x8004].var2 = a2; gUnknown_03000760[gSpecialVar_0x8004].var3 = a3; gSpecialVar_0x8004++; } void ScriptShowElevatorMenu(void) { u8 i = 0; gUnknown_0203925A = 0; gUnknown_0203925B = 0; ScriptAddElevatorMenuItem(16, 0, 0, 0); while (gUnknown_03000760[i].var0 != 16) { gUnknown_0203925A++; i++; } sub_810E874(); } static void sub_810E874(void) { u8 i; ScriptContext2_Enable(); if (gUnknown_0203925A > 5) { Menu_DrawStdWindowFrame(0, 0, 8, 11); InitMenu(0, 1, 1, 5, 0, 7); gUnknown_0203925C = 0; ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); sub_810ECD4(); } else { Menu_DrawStdWindowFrame(0, 0, 8, 2 * gUnknown_0203925A + 1); InitMenu(0, 1, 1, gUnknown_0203925A, 0, 7); } for (i = 0; i < 5 && gUnknown_03000760[i].var0 != 16; i ++) { Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); } DisplayCurrentElevatorFloor(); CreateTask(sub_810E984, 8); } void DisplayCurrentElevatorFloor(void) { Menu_DrawStdWindowFrame(20, 0, 29, 5); sub_8072BD8(gOtherText_NowOn, 21, 1, 64); sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); } void sub_810E984(u8 taskId) { u8 curMenuPos; if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) { gUnknown_0203925B--; curMenuPos = Menu_GetCursorPos(); Menu_MoveCursorNoWrap(-1); sub_810EAC8(curMenuPos, DPAD_UP); } if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) { gUnknown_0203925B++; curMenuPos = Menu_GetCursorPos(); Menu_MoveCursorNoWrap(+1); sub_810EAC8(curMenuPos, DPAD_DOWN); } if (gMain.newKeys & A_BUTTON) { saved_warp2_set_2(0, gUnknown_03000760[gUnknown_0203925B].var1, gUnknown_03000760[gUnknown_0203925B].var2, -1, 2, 1); if (gSpecialVar_0x8005 == gUnknown_0203925B) { gSpecialVar_Result = 0; PlaySE(SE_SELECT); Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } else { gSpecialVar_Result = 1; gSpecialVar_0x8005 = gUnknown_0203925B; ShakeScreenInElevator(); FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); sub_810EEDC(); Menu_EraseScreen(); DestroyTask(taskId); } } else if (gMain.newKeys & B_BUTTON) { gSpecialVar_Result = 0; PlaySE(SE_SELECT); sub_810EEDC(); Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } } // This function, as written, swaps the roles of r4 and r5 throughout. #ifdef NONMATCHING bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) { u8 i; bool8 flag = 0; u8 newPos = 0; if (gUnknown_0203925A < 5) { return FALSE; } if (dpadInput == DPAD_UP) { if (prevMenuPos == 0) { newPos = gUnknown_0203925B; flag = 1; } } else if (dpadInput == DPAD_DOWN) { if (prevMenuPos == 4) { newPos = gUnknown_0203925B - 4; flag = 1; } } if (flag) { sub_810EB90(newPos, 5); Menu_BlankWindowRect(2, 1, 7, 10); for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++) { Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); } } return flag; } #else NAKED bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) { asm_unified("\tpush {r4-r7,lr}\n" "\tmov r7, r8\n" "\tpush {r7}\n" "\tlsls r0, 24\n" "\tlsrs r2, r0, 24\n" "\tadds r5, r2, 0\n" "\tlsls r1, 24\n" "\tlsrs r1, 24\n" "\tadds r3, r1, 0\n" "\tmovs r7, 0\n" "\tmovs r4, 0\n" "\tldr r0, _0810EAEC @ =gUnknown_0203925A\n" "\tldrb r0, [r0]\n" "\tcmp r0, 0x4\n" "\tbhi _0810EAF0\n" "\tmovs r0, 0\n" "\tb _0810EB78\n" "\t.align 2, 0\n" "_0810EAEC: .4byte gUnknown_0203925A\n" "_0810EAF0:\n" "\tcmp r1, 0x40\n" "\tbne _0810EB04\n" "\tcmp r2, 0\n" "\tbne _0810EB18\n" "\tldr r0, _0810EB00 @ =gUnknown_0203925B\n" "\tldrb r4, [r0]\n" "\tmovs r7, 0x1\n" "\tb _0810EB1C\n" "\t.align 2, 0\n" "_0810EB00: .4byte gUnknown_0203925B\n" "_0810EB04:\n" "\tcmp r3, 0x80\n" "\tbne _0810EB18\n" "\tcmp r5, 0x4\n" "\tbne _0810EB18\n" "\tldr r0, _0810EB84 @ =gUnknown_0203925B\n" "\tldrb r0, [r0]\n" "\tsubs r0, 0x4\n" "\tlsls r0, 24\n" "\tlsrs r4, r0, 24\n" "\tmovs r7, 0x1\n" "_0810EB18:\n" "\tcmp r7, 0\n" "\tbeq _0810EB76\n" "_0810EB1C:\n" "\tadds r0, r4, 0\n" "\tmovs r1, 0x5\n" "\tbl sub_810EB90\n" "\tmovs r0, 0x2\n" "\tmovs r1, 0x1\n" "\tmovs r2, 0x7\n" "\tmovs r3, 0xA\n" "\tbl Menu_BlankWindowRect\n" "\tmovs r5, 0\n" "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" "\tlsls r1, r4, 2\n" "\tadds r0, r1, r2\n" "\tldrb r0, [r0]\n" "\tcmp r0, 0x10\n" "\tbeq _0810EB76\n" "\tldr r0, _0810EB8C @ =gUnknown_083F8380\n" "\tmov r8, r0\n" "\tadds r6, r2, 0\n" "_0810EB44:\n" "\tadds r0, r1, r6\n" "\tldrb r0, [r0]\n" "\tlsls r0, 2\n" "\tadd r0, r8\n" "\tldr r0, [r0]\n" "\tlsls r2, r5, 1\n" "\tadds r2, 0x1\n" "\tlsls r2, 24\n" "\tlsrs r2, 24\n" "\tmovs r1, 0x1\n" "\tbl Menu_PrintText\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r4, r0, 24\n" "\tadds r0, r5, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r5, r0, 24\n" "\tcmp r5, 0x4\n" "\tbhi _0810EB76\n" "\tlsls r1, r4, 2\n" "\tadds r0, r1, r6\n" "\tldrb r0, [r0]\n" "\tcmp r0, 0x10\n" "\tbne _0810EB44\n" "_0810EB76:\n" "\tadds r0, r7, 0\n" "_0810EB78:\n" "\tpop {r3}\n" "\tmov r8, r3\n" "\tpop {r4-r7}\n" "\tpop {r1}\n" "\tbx r1\n" "\t.align 2, 0\n" "_0810EB84: .4byte gUnknown_0203925B\n" "_0810EB88: .4byte gUnknown_03000760\n" "_0810EB8C: .4byte gUnknown_083F8380"); } #endif void sub_810EB90(u8 newPos, u8 maxItems) { if (newPos == 0) { gUnknown_0203925C ^= 0x02; DestroyVerticalScrollIndicator(TOP_ARROW); } else { sub_810ECB0(); } if (newPos + maxItems < gUnknown_0203925A) { sub_810ECD4(); } else if (newPos + maxItems == gUnknown_0203925A) { gUnknown_0203925C ^= 0x01; DestroyVerticalScrollIndicator(BOTTOM_ARROW); } } void ShakeScreenInElevator(void) { u8 taskId = CreateTask(sub_810EC34, 9); gTasks[taskId].data[0] = 1; gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = 1; gTasks[taskId].data[5] = 3; SetCameraPanningCallback(NULL); sub_810ECFC(); PlaySE(SE_ELEBETA); } void sub_810EC34(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[1] ++; if (task->data[1] % task->data[5] == 0) { task->data[1] = 0; task->data[2] ++; if (task->data[3] == 0) { task->data[4] = -task->data[4]; SetCameraPanning(0, task->data[4]); if (task->data[2] == 23) { PlaySE(SE_PINPON); sub_810EC9C(taskId); InstallCameraPanAheadCallback(); } } } } void sub_810EC9C(u8 taskId) { DestroyTask(taskId); EnableBothScriptContexts(); } void sub_810ECB0(void) { if (gUnknown_0203925C >> 1 != 1) { gUnknown_0203925C |= 0x2; CreateVerticalScrollIndicators(TOP_ARROW, 0x24, 0x08); } } void sub_810ECD4(void) { if ((gUnknown_0203925C & 1) == 0) { gUnknown_0203925C |= 0x1; CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x24, 0x48); } } void sub_810ECFC(void) { if (FuncIsActiveTask(sub_810ED40) != TRUE) { u8 taskId = CreateTask(sub_810ED40, 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; } } void sub_810ED40(u8 taskId) { sub_810ED60(&gTasks[taskId]); } void sub_810ED60(struct Task *task) { if (task->data[3] == 8) { task->data[3] = 0; if (task->data[4] != 0) { MapGridSetMetatileIdAt( 7, 7, 0xe68); MapGridSetMetatileIdAt( 8, 7, 0xe69); MapGridSetMetatileIdAt( 9, 7, 0xe69); MapGridSetMetatileIdAt(10, 7, 0xe6a); MapGridSetMetatileIdAt( 7, 8, 0xe70); MapGridSetMetatileIdAt( 8, 8, 0xe71); MapGridSetMetatileIdAt( 9, 8, 0xe71); MapGridSetMetatileIdAt(10, 8, 0xe72); MapGridSetMetatileIdAt( 7, 9, 0xe78); MapGridSetMetatileIdAt( 8, 9, 0xe79); MapGridSetMetatileIdAt( 9, 9, 0xe79); MapGridSetMetatileIdAt(10, 9, 0xe7a); } else { MapGridSetMetatileIdAt( 7, 7, 0xe6b); MapGridSetMetatileIdAt( 8, 7, 0xe6c); MapGridSetMetatileIdAt( 9, 7, 0xe6c); MapGridSetMetatileIdAt(10, 7, 0xe6d); MapGridSetMetatileIdAt( 7, 8, 0xe73); MapGridSetMetatileIdAt( 8, 8, 0xe74); MapGridSetMetatileIdAt( 9, 8, 0xe74); MapGridSetMetatileIdAt(10, 8, 0xe75); MapGridSetMetatileIdAt( 7, 9, 0xe7b); MapGridSetMetatileIdAt( 8, 9, 0xe7c); MapGridSetMetatileIdAt( 9, 9, 0xe7c); MapGridSetMetatileIdAt(10, 9, 0xe7d); } DrawWholeMapView(); task->data[4] ^= 1; task->data[2]++; if (task->data[2] == 8) { DestroyTask(task->data[1]); } } task->data[3]++; } void sub_810EEDC(void) { if ((gUnknown_0203925C & 1) != 0) { DestroyVerticalScrollIndicator(BOTTOM_ARROW); } if ((gUnknown_0203925C >> 1) == 1) { DestroyVerticalScrollIndicator(TOP_ARROW); } BuyMenuFreeMemory(); } void SetTrickHouseEndRoomFlag(void) { u16 *specVar = &gSpecialVar_0x8004; u16 flag = 0x259; *specVar = flag; FlagSet(flag); } void ResetTrickHouseEndRoomFlag(void) { u16 *specVar = &gSpecialVar_0x8004; u16 flag = 0x259; *specVar = flag; FlagClear(flag); } bool8 CheckLeadMonCool(void) { if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200) { return FALSE; } return TRUE; } bool8 CheckLeadMonBeauty(void) { if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200) { return FALSE; } return TRUE; } bool8 CheckLeadMonCute(void) { if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200) { return FALSE; } return TRUE; } bool8 CheckLeadMonSmart(void) { if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200) { return FALSE; } return TRUE; } bool8 CheckLeadMonTough(void) { if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200) { return FALSE; } return TRUE; } void IsGrassTypeInParty(void) { u8 i; u16 species; struct Pokemon *pokemon; for (i=0; i> 1 != 1) { gUnknown_0203925C |= 0x02; CreateVerticalScrollIndicators(TOP_ARROW, 0x2c, 0x08); } } void sub_810F2B4(void) { if (!(gUnknown_0203925C & 0x01)) { gUnknown_0203925C |= 0x01; CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x2c, 0x58); } } void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) { if (newPos == 0) { gUnknown_0203925C ^= 0x02; DestroyVerticalScrollIndicator(TOP_ARROW); } else { sub_810F290(); } if (newPos + maxItems < gUnknown_0203925A) { sub_810F2B4(); } else if (newPos + maxItems == gUnknown_0203925A) { gUnknown_0203925C ^= 0x01; DestroyVerticalScrollIndicator(BOTTOM_ARROW); } } void SpawnCameraDummy(void) { u8 mapObjectId = SpawnSpecialFieldObjectParametrized(7, 8, 0x7f, gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7, 3); gMapObjects[mapObjectId].mapobj_bit_13 = 1; CameraObjectSetFollowedObjectId(gMapObjects[mapObjectId].spriteId); } void RemoveCameraDummy(void) { CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); RemoveFieldObjectByLocalIdAndMap(0x7f, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); } u8 GetPokeblockNameByMonNature(void) { return sub_810CB68(GetNature(&gPlayerParty[GetLeadMonIndex()]), gStringVar1); } void GetSecretBaseNearbyMapName(void) { GetMapSectionName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0); } u16 GetBestBattleTowerStreak(void) { return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); } void BufferEReaderTrainerName(void) { SetEReaderTrainerName(gStringVar1); } const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; const u8 gUnknown_083F83EC[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; const u8 gUnknown_083F83F8[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; u16 GetSlotMachineId(void) { u32 v0 = gSaveBlock1.easyChatPairs[0].unk0_0 + gSaveBlock1.easyChatPairs[0].unk2 + gUnknown_083F83E0[gSpecialVar_0x8004]; if (GetPriceReduction(2)) { return gUnknown_083F83F8[v0 % 12]; } return gUnknown_083F83EC[v0 % 12]; } bool8 FoundAbandonedShipRoom1Key(void) { u16 *specVar = &gSpecialVar_0x8004; u16 flag = FLAG_HIDDEN_ITEM_1F; *specVar = flag; if (!FlagGet(flag)) { return FALSE; } return TRUE; } bool8 FoundAbandonedShipRoom2Key(void) { u16 *specVar = &gSpecialVar_0x8004; u16 flag = FLAG_HIDDEN_ITEM_20; *specVar = flag; if (!FlagGet(flag)) { return FALSE; } return TRUE; } bool8 FoundAbandonedShipRoom4Key(void) { u16 *specVar = &gSpecialVar_0x8004; u16 flag = FLAG_HIDDEN_ITEM_21; *specVar = flag; if (!FlagGet(flag)) { return FALSE; } return TRUE; } bool8 FoundAbandonedShipRoom6Key(void) { u16 *specVar = &gSpecialVar_0x8004; u16 flag = FLAG_HIDDEN_ITEM_22; *specVar = flag; if (!FlagGet(flag)) { return FALSE; } return TRUE; } bool8 LeadMonHasEffortRibbon(void) { return GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, NULL); } void GivLeadMonEffortRibbon(void) { bool8 ribbonSet; IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); FlagSet(FLAG_SYS_RIBBON_GET); ribbonSet = TRUE; SetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, &ribbonSet); } bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void) { if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) { return TRUE; } return FALSE; } u8 TryUpdateRusturfTunnelState(void) { if (!FlagGet(FLAG_RUSTURF_TUNNEL_OPENED) && gSaveBlock1.location.mapGroup == MAP_GROUP(RUSTURF_TUNNEL) && gSaveBlock1.location.mapNum == MAP_NUM(RUSTURF_TUNNEL)) { if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1)) { VarSet(VAR_RUSTURF_TUNNEL_STATE, 4); return TRUE; } else if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2)) { VarSet(VAR_RUSTURF_TUNNEL_STATE, 5); return TRUE; } } return FALSE; } void SetShoalItemFlag(u16 v0) { FlagSet(0x85f); } void PutZigzagoonInPlayerParty(void) { u16 monData; CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); monData = TRUE; SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, &monData); monData = MOVE_TACKLE; SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &monData); monData = MOVE_NONE; SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &monData); SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &monData); SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &monData); } bool8 IsStarterInParty(void) { u8 i; u16 starter = GetStarterPokemon(VarGet(VAR_STARTER_MON)); u8 partyCount = CalculatePlayerPartyCount(); for (i = 0; i < partyCount; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == starter) { return TRUE; } } return FALSE; } bool8 CheckFreePokemonStorageSpace(void) { u16 i, j; for (i=0; i<14; i++) { for (j=0; j<30; j++) { if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) { return TRUE; } } } return FALSE; } bool8 IsPokerusInParty(void) { if (!CheckPartyPokerus(gPlayerParty, 0x3f)) { return FALSE; } return TRUE; } static void sub_810F7A8(u8); static void sub_810F814(u8); void sub_810F758(void) { u8 taskId = CreateTask(sub_810F7A8, 9); gTasks[taskId].data[0] = gSpecialVar_0x8005; gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = gSpecialVar_0x8004; gTasks[taskId].data[5] = 5; SetCameraPanningCallback(NULL); PlaySE(SE_W070); } static void sub_810F7A8(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[1]++; if ((task->data[1] % task->data[5]) == 0) { task->data[1] = 0; task->data[2]++; if (task->data[3] == 0) { task->data[0] = -task->data[0]; task->data[4] = -task->data[4]; SetCameraPanning(task->data[0], task->data[4]); if (task->data[2] == 8) { sub_810F814(taskId); InstallCameraPanAheadCallback(); } } } } static void sub_810F814(u8 taskId) { DestroyTask(taskId); EnableBothScriptContexts(); } bool8 FoundBlackGlasses(void) { return FlagGet(FLAG_HIDDEN_ITEM_BLACK_GLASSES); } void SetRoute119Weather(void) { if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE) { SetSav1Weather(0x14); } } void SetRoute123Weather(void) { if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE) { SetSav1Weather(0x15); } } u8 GetLeadMonIndex(void) { u8 i; u8 partyCount = CalculatePlayerPartyCount(); for (i=0; i= 7) { return 0; } else if (gLocalTime.days < 0) { return 8; } return 7 - (gLocalTime.days - tmReceivedDay); } u16 SetPacifidlogTMReceivedDay(void) { VarSet(VAR_PACIFIDLOG_TM_RECEIVED_DAY, gLocalTime.days); return gLocalTime.days; } bool8 MonOTNameMatchesPlayer(void) { GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); if (!StringCompareWithoutExtCtrlCodes(gSaveBlock2.playerName, gStringVar1)) { return FALSE; } return TRUE; } void BufferLottoTicketNumber(void) { if (gSpecialVar_Result >= 10000) { sub_80BF088(0, gSpecialVar_Result); } else if (gSpecialVar_Result >= 1000) { gStringVar1[0] = CHAR_0; ConvertIntToDecimalStringN(gStringVar1 + 1, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); } else if (gSpecialVar_Result >= 100) { gStringVar1[0] = CHAR_0; gStringVar1[1] = CHAR_0; ConvertIntToDecimalStringN(gStringVar1 + 2, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); } else if (gSpecialVar_Result >= 10) { gStringVar1[0] = CHAR_0; gStringVar1[1] = CHAR_0; gStringVar1[2] = CHAR_0; ConvertIntToDecimalStringN(gStringVar1 + 3, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); } else { gStringVar1[0] = CHAR_0; gStringVar1[1] = CHAR_0; gStringVar1[2] = CHAR_0; gStringVar1[3] = CHAR_0; ConvertIntToDecimalStringN(gStringVar1 + 4, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); } } const u8 gUnknown_083F8404[] = {2, 1, 2, 1}; const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15}; const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9}; bool8 sub_810FF30(void); void UpdateMovedLilycoveFanClubMembers(void); void sub_810FF48(void); void sub_810FD80(void); u16 GetNumMovedLilycoveFanClubMembers(void); int sub_810FB9C(void); void ResetFanClub(void) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = 0; gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = 0; } void sub_810FA74(void) { if (sub_810FF30()) { UpdateMovedLilycoveFanClubMembers(); gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; } } void sub_810FAA0(void) { if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 1)) { sub_810FF48(); sub_810FD80(); gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; FlagClear(FLAG_HIDE_FANCLUB_OLD_LADY); FlagClear(FLAG_HIDE_FANCLUB_BOY); FlagClear(FLAG_HIDE_FANCLUB_LITTLE_BOY); FlagClear(FLAG_HIDE_FANCLUB_LADY); VarSet(VAR_LILYCOVE_FAN_CLUB_STATE, 1); } } u8 sub_810FB10(u8 a0) { if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) { if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f) + gUnknown_083F8404[a0] >= 20) { if (GetNumMovedLilycoveFanClubMembers() < 3) { sub_810FB9C(); gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] &= 0xff80; } else { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0xff80) | 20; } } else { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] += gUnknown_083F8404[a0]; } } return gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f; } int sub_810FB9C(void) { u8 i; int retval = 0; for (i=0; i<8; i++) { if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8408[i]) & 0x01)) { retval = i; if (Random() & 1) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[i]); return retval; } } } gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[retval]); return retval; } int sub_810FC18(void) { u8 i; int retval = 0; if (GetNumMovedLilycoveFanClubMembers() == 1) { return 0; } for (i=0; i<8; i++) { if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[i]) & 1) { retval = i; if (Random() & 1) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[i]); return retval; } } } if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[retval]) & 1) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[retval]); } return retval; } u16 GetNumMovedLilycoveFanClubMembers(void) { u8 i; u8 retval = 0; for (i = 0; i < 8; i++) { if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> (i + 8)) & 1) { retval++; } } return retval; } void UpdateMovedLilycoveFanClubMembers(void) { u8 i = 0; if (gSaveBlock2.playTimeHours < 999) { while (1) { if (GetNumMovedLilycoveFanClubMembers() < 5) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; break; } else if (i == 8) { break; } else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] < 12) { return; } sub_810FC18(); gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] += 12; i++; } } } bool8 ShouldMoveLilycoveFanClubMember(void) { return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gSpecialVar_0x8004) & 0x01; } void sub_810FD80(void) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x2000; gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x100; gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x400; } void sub_810FE1C(void *, u8, u8); void BufferStreakTrainerText(void) { u8 a = 0; u8 b = 0; switch (gSpecialVar_0x8004) { case 8: break; case 9: break; case 10: a = 0; b = 3; break; case 11: a = 0; b = 1; break; case 12: a = 1; b = 0; break; case 13: a = 0; b = 4; break; case 14: a = 1; b = 5; break; case 15: break; } sub_810FE1C(gSaveBlock1.linkBattleRecords, a, b); } void sub_810FE1C(void *linkRecords, u8 a, u8 b) { u8 *curRecord = (linkRecords + 16 * a); if (*curRecord == EOS) { switch (b) { case 0: StringCopy(gStringVar1, gOtherText_Wallace); break; case 1: StringCopy(gStringVar1, gOtherText_Steven); break; case 2: StringCopy(gStringVar1, gOtherText_Brawly); break; case 3: StringCopy(gStringVar1, gOtherText_Winona); break; case 4: StringCopy(gStringVar1, gOtherText_Phoebe); break; case 5: StringCopy(gStringVar1, gOtherText_Glacia); break; default: StringCopy(gStringVar1, gOtherText_Wallace); break; } } else { StringCopyN(gStringVar1, curRecord, 7); gStringVar1[7] = EOS; if (gStringVar1[0] == 0xfc && gStringVar1[1] == 0x15) { ConvertInternationalString(gStringVar1, 1); } } } void sub_810FEFC(void) { if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) { sub_810FA74(); if (gBattleOutcome == 1) { sub_810FB9C(); } else { sub_810FC18(); } } } bool8 sub_810FF30(void) { return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 0x01; } void sub_810FF48(void) { gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x80; } u8 sub_810FF60(void) { return sub_810FB10(gSpecialVar_0x8004); }