diff --git a/graphics/map_popup/bw/black.pal b/graphics/map_popup/bw/black.pal new file mode 100644 index 0000000000..ef4da4d29c --- /dev/null +++ b/graphics/map_popup/bw/black.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +255 255 255 +84 85 89 +0 0 0 +238 230 238 +189 180 197 +139 139 164 +90 90 123 +41 49 90 +27 27 27 +40 40 40 +51 51 51 +62 62 62 +0 0 0 +0 0 0 diff --git a/graphics/map_popup/bw/bw_primary.png b/graphics/map_popup/bw/bw_primary.png new file mode 100644 index 0000000000..9dd681ff0a Binary files /dev/null and b/graphics/map_popup/bw/bw_primary.png differ diff --git a/graphics/map_popup/bw/bw_secondary.png b/graphics/map_popup/bw/bw_secondary.png new file mode 100644 index 0000000000..b63ce95311 Binary files /dev/null and b/graphics/map_popup/bw/bw_secondary.png differ diff --git a/graphics/map_popup/bw/white.pal b/graphics/map_popup/bw/white.pal new file mode 100644 index 0000000000..8706c80d4e --- /dev/null +++ b/graphics/map_popup/bw/white.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +0 0 0 +158 158 158 +0 0 0 +238 230 238 +189 180 197 +139 139 164 +90 90 123 +41 49 90 +228 228 228 +215 215 215 +204 204 204 +193 193 193 +0 0 0 +0 0 0 diff --git a/include/config/overworld.h b/include/config/overworld.h index f1a7ff660f..6b4bca75b6 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -65,4 +65,22 @@ #define BATTLE_PYRAMID_RANDOM_ENCOUNTERS FALSE // If set to TRUE, battle pyramid Pokemon will be generated randomly based on the round's challenge instead of hardcoded in src/data/battle_frontier/battle_pyramid_level_50_wild_mons.h (or open_level_wild_mons.h) +// Map pop-up config +#define OW_POPUP_GENERATION GEN_3 // Different generations display location names in overworld pop-ups differently. + // Only choies are currently GEN_3 and GEN_5, all others will default to Gen3 pop-ups. + +// Gen5 map pop-up config +// Constants +#define OW_POPUP_BW_TIME_NONE 0 // Don't show the time +#define OW_POPUP_BW_TIME_12_HR 1 // Use 12 hour (AM/PM) time +#define OW_POPUP_BW_TIME_24_HR 2 // Use 24 hour time + +#define OW_POPUP_BW_COLOR_BLACK 0 // Black pop-up from B2 +#define OW_POPUP_BW_COLOR_WHITE 1 // White pop-up from W2 + +// Configuration +#define OW_POPUP_BW_COLOR OW_POPUP_BW_COLOR_BLACK // B2W2 use different colors for their map pop-ups. +#define OW_POPUP_BW_TIME_MODE OW_POPUP_BW_TIME_NONE // Determines what type of time is shown. +#define OW_POPUP_BW_ALPHA_BLEND FALSE // Enables alpha blending/transparency for the pop-ups. Mainly intended to be used with the black color option. + #endif // GUARD_CONFIG_OVERWORLD_H diff --git a/include/field_weather.h b/include/field_weather.h index b354d500e3..9805dc491d 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -170,6 +170,7 @@ void SetWeatherScreenFadeOut(void); void SetWeatherPalStateIdle(void); void PreservePaletteInWeather(u8 preservedPalIndex); void ResetPreservedPalettesInWeather(void); +bool32 IsWeatherAlphaBlend(void); // field_weather_effect.c void Clouds_InitVars(void); diff --git a/include/menu.h b/include/menu.h index 0b0a42423d..fac4ef1b65 100644 --- a/include/menu.h +++ b/include/menu.h @@ -41,6 +41,7 @@ struct MenuAction }; extern const u16 gStandardMenuPalette[]; +extern EWRAM_DATA u8 gPopupTaskId; void FreeAllOverworldWindowBuffers(void); void InitStandardTextBoxWindows(void); @@ -124,5 +125,9 @@ void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonP void EraseYesNoWindow(void); void PrintMenuActionTextsAtPos(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); void Menu_LoadStdPal(void); +u8 AddSecondaryPopUpWindow(void); +u8 GetSecondaryPopUpWindowId(void); +void RemoveSecondaryPopUpWindow(void); +void HBlankCB_DoublePopupWindow(void); #endif // GUARD_MENU_H diff --git a/include/rtc.h b/include/rtc.h index 9882d702b6..bf8ff9aa93 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -118,5 +118,6 @@ void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds); void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2); u32 RtcGetMinuteCount(void); u32 RtcGetLocalDayCount(void); +void FormatDecimalTimeWithoutSeconds(u8 *dest, s8 hour, s8 minute, bool32 is24Hour); #endif // GUARD_RTC_UTIL_H diff --git a/include/strings.h b/include/strings.h index af0ee0bbba..359184cbf4 100644 --- a/include/strings.h +++ b/include/strings.h @@ -3061,4 +3061,8 @@ extern const u8 gText_BasePointsResetToZero[]; extern const u8 gText_Fertilize[]; extern const u8 gText_PlantBerry[]; +// Map name pop-up +extern const u8 gText_AM[]; +extern const u8 gText_PM[]; + #endif // GUARD_STRINGS_H diff --git a/src/field_weather.c b/src/field_weather.c index fea1e30358..3c9f642faf 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -1105,3 +1105,11 @@ void ResetPreservedPalettesInWeather(void) { sPaletteColorMapTypes = sBasePaletteColorMapTypes; } + +bool32 IsWeatherAlphaBlend(void) +{ + return (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL + || gWeatherPtr->currWeather == WEATHER_FOG_DIAGONAL + || gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES + || gWeatherPtr->currWeather == WEATHER_UNDERWATER); +} diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 725bb80838..8c8464164d 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -2,12 +2,16 @@ #include "battle_pyramid.h" #include "bg.h" #include "event_data.h" +#include "field_weather.h" #include "gpu_regs.h" +#include "graphics.h" #include "international_string_util.h" +#include "main.h" #include "menu.h" #include "map_name_popup.h" #include "palette.h" #include "region_map.h" +#include "rtc.h" #include "start_menu.h" #include "string_util.h" #include "task.h" @@ -16,6 +20,8 @@ #include "constants/layouts.h" #include "constants/region_map_sections.h" #include "constants/weather.h" +#include "config/overworld.h" +#include "config.h" // enums enum MapPopUp_Themes @@ -28,13 +34,18 @@ enum MapPopUp_Themes MAPPOPUP_THEME_STONE2, }; +enum MapPopUp_Themes_BW +{ + MAPPOPUP_THEME_BW_DEFAULT, +}; + // static functions static void Task_MapNamePopUpWindow(u8 taskId); static void ShowMapNamePopUpWindow(void); static void LoadMapNamePopUpWindowBg(void); // EWRAM -static EWRAM_DATA u8 sPopupTaskId = 0; +EWRAM_DATA u8 gPopupTaskId = 0; // .rodata static const u8 sMapPopUp_Table[][960] = @@ -177,6 +188,127 @@ static const u8 sRegionMapSectionId_To_PopUpThemeIdMapping[] = [MAPSEC_TRAINER_HILL - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_MARBLE }; +#if OW_POPUP_GENERATION == GEN_5 +// Gen5 assets +static const u8 sMapPopUpTilesPrimary_BW[] = INCBIN_U8("graphics/map_popup/bw/bw_primary.4bpp"); +static const u8 sMapPopUpTilesSecondary_BW[] = INCBIN_U8("graphics/map_popup/bw/bw_secondary.4bpp"); +static const u16 sMapPopUpTilesPalette_BW_Black[16] = INCBIN_U16("graphics/map_popup/bw/black.gbapal"); +static const u16 sMapPopUpTilesPalette_BW_White[16] = INCBIN_U16("graphics/map_popup/bw/white.gbapal"); +#else +static const u8 sMapPopUpTilesPrimary_BW[] = {0}; +static const u8 sMapPopUpTilesSecondary_BW[] = {0}; +static const u16 sMapPopUpTilesPalette_BW_Black[] = {0}; +static const u16 sMapPopUpTilesPalette_BW_White[] = {0}; +#endif + +static const u8 sRegionMapSectionId_To_PopUpThemeIdMapping_BW[] = +{ + [MAPSEC_LITTLEROOT_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_OLDALE_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_DEWFORD_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_LAVARIDGE_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_FALLARBOR_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_VERDANTURF_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_PACIFIDLOG_TOWN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_PETALBURG_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SLATEPORT_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MAUVILLE_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_RUSTBORO_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_FORTREE_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_LILYCOVE_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MOSSDEEP_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SOOTOPOLIS_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_EVER_GRANDE_CITY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_101] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_102] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_103] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_104] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_105] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_106] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_107] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_108] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_109] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_110] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_111] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_112] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_113] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_114] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_115] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_116] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_117] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_118] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_119] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_120] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_121] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_122] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_123] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_124] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_125] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_126] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_127] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_128] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_129] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_130] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_131] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_132] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_133] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ROUTE_134] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_124] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_126] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_127] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_128] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_SOOTOPOLIS] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_GRANITE_CAVE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MT_CHIMNEY] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SAFARI_ZONE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_BATTLE_FRONTIER] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_PETALBURG_WOODS] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_RUSTURF_TUNNEL] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ABANDONED_SHIP] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_NEW_MAUVILLE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_METEOR_FALLS] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_METEOR_FALLS2] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MT_PYRE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_AQUA_HIDEOUT_OLD] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SHOAL_CAVE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SEAFLOOR_CAVERN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_SEAFLOOR_CAVERN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_VICTORY_ROAD] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MIRAGE_ISLAND] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_CAVE_OF_ORIGIN] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SOUTHERN_ISLAND] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_FIERY_PATH] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_FIERY_PATH2] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_JAGGED_PASS] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_JAGGED_PASS2] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SEALED_CHAMBER] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_SEALED_CHAMBER] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SCORCHED_SLAB] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ISLAND_CAVE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_DESERT_RUINS] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ANCIENT_TOMB] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_INSIDE_OF_TRUCK] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SKY_PILLAR] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_SECRET_BASE] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_DYNAMIC] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_AQUA_HIDEOUT - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MAGMA_HIDEOUT - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MIRAGE_TOWER - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_BIRTH_ISLAND - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_FARAWAY_ISLAND - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ARTISAN_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_MARINE_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_MARINE_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_TERRA_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_105 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_125 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_UNDERWATER_129 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_DESERT_UNDERPASS - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_ALTERING_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_NAVEL_ROCK - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, + [MAPSEC_TRAINER_HILL - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_BW_DEFAULT, +}; + static const u8 sText_PyramidFloor1[] = _("PYRAMID FLOOR 1"); static const u8 sText_PyramidFloor2[] = _("PYRAMID FLOOR 2"); static const u8 sText_PyramidFloor3[] = _("PYRAMID FLOOR 3"); @@ -216,7 +348,7 @@ enum { STATE_PRINT, // For some reason the first state is numerically last. }; -#define POPUP_OFFSCREEN_Y 40 +#define POPUP_OFFSCREEN_Y ((OW_POPUP_GENERATION == GEN_5) ? 24 : 40) #define POPUP_SLIDE_SPEED 2 #define tState data[0] @@ -232,18 +364,29 @@ void ShowMapNamePopup(void) if (!FuncIsActiveTask(Task_MapNamePopUpWindow)) { // New pop up window - sPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90); - SetGpuReg(REG_OFFSET_BG0VOFS, POPUP_OFFSCREEN_Y); - gTasks[sPopupTaskId].tState = STATE_PRINT; - gTasks[sPopupTaskId].tYOffset = POPUP_OFFSCREEN_Y; + if (OW_POPUP_GENERATION == GEN_5) + { + gPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 100); + + if (OW_POPUP_BW_ALPHA_BLEND && !IsWeatherAlphaBlend()) + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + } + else + { + gPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90); + SetGpuReg(REG_OFFSET_BG0VOFS, POPUP_OFFSCREEN_Y); + } + + gTasks[gPopupTaskId].tState = STATE_PRINT; + gTasks[gPopupTaskId].tYOffset = POPUP_OFFSCREEN_Y; } else { // There's already a pop up window running. // Hurry the old pop up offscreen so the new one can appear. - if (gTasks[sPopupTaskId].tState != STATE_SLIDE_OUT) - gTasks[sPopupTaskId].tState = STATE_SLIDE_OUT; - gTasks[sPopupTaskId].tIncomingPopUp = TRUE; + if (gTasks[gPopupTaskId].tState != STATE_SLIDE_OUT) + gTasks[gPopupTaskId].tState = STATE_SLIDE_OUT; + gTasks[gPopupTaskId].tIncomingPopUp = TRUE; } } } @@ -261,6 +404,11 @@ static void Task_MapNamePopUpWindow(u8 taskId) task->tState = STATE_SLIDE_IN; task->tPrintTimer = 0; ShowMapNamePopUpWindow(); + if (OW_POPUP_GENERATION == GEN_5) + { + EnableInterrupts(INTR_FLAG_HBLANK); + SetHBlankCallback(HBlankCB_DoublePopupWindow); + } } break; case STATE_SLIDE_IN: @@ -270,7 +418,7 @@ static void Task_MapNamePopUpWindow(u8 taskId) { task->tYOffset = 0; task->tState = STATE_WAIT; - gTasks[sPopupTaskId].data[1] = 0; + gTasks[gPopupTaskId].data[1] = 0; } break; case STATE_WAIT: @@ -304,12 +452,15 @@ static void Task_MapNamePopUpWindow(u8 taskId) break; case STATE_ERASE: ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE); + if (OW_POPUP_GENERATION == GEN_5) + ClearStdWindowAndFrame(GetSecondaryPopUpWindowId(), TRUE); task->tState = STATE_END; break; case STATE_END: HideMapNamePopUpWindow(); return; } +if (OW_POPUP_GENERATION != GEN_5) SetGpuReg(REG_OFFSET_BG0VOFS, task->tYOffset); } @@ -324,8 +475,28 @@ void HideMapNamePopUpWindow(void) ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE); RemoveMapNamePopUpWindow(); } + + if (OW_POPUP_GENERATION == GEN_5) + { + if (GetSecondaryPopUpWindowId() != WINDOW_NONE) + { + ClearStdWindowAndFrame(GetSecondaryPopUpWindowId(), TRUE); + RemoveSecondaryPopUpWindow(); + } + + DisableInterrupts(INTR_FLAG_HBLANK); + SetHBlankCallback(NULL); + + if (OW_POPUP_BW_ALPHA_BLEND && !IsWeatherAlphaBlend()) + { + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 10)); + } + } + SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, 0); - DestroyTask(sPopupTaskId); + DestroyTask(gPopupTaskId); } } @@ -335,6 +506,7 @@ static void ShowMapNamePopUpWindow(void) u8 *withoutPrefixPtr; u8 x; const u8 *mapDisplayHeaderSource; + u8 mapNamePopUpWindowId, secondaryPopUpWindowId; if (InBattlePyramid()) { @@ -355,14 +527,46 @@ static void ShowMapNamePopUpWindow(void) withoutPrefixPtr = &(mapDisplayHeader[3]); GetMapName(withoutPrefixPtr, gMapHeader.regionMapSectionId, 0); } - AddMapNamePopUpWindow(); + + if (OW_POPUP_GENERATION == GEN_5) + { + if (OW_POPUP_BW_ALPHA_BLEND && !IsWeatherAlphaBlend()) + SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR); + + mapNamePopUpWindowId = AddMapNamePopUpWindow(); + secondaryPopUpWindowId = AddSecondaryPopUpWindow(); + } + else + { + AddMapNamePopUpWindow(); + } + LoadMapNamePopUpWindowBg(); - x = GetStringCenterAlignXOffset(FONT_NARROW, withoutPrefixPtr, 80); + mapDisplayHeader[0] = EXT_CTRL_CODE_BEGIN; mapDisplayHeader[1] = EXT_CTRL_CODE_HIGHLIGHT; mapDisplayHeader[2] = TEXT_COLOR_TRANSPARENT; - AddTextPrinterParameterized(GetMapNamePopUpWindowId(), FONT_NARROW, mapDisplayHeader, x, 3, TEXT_SKIP_DRAW, NULL); - CopyWindowToVram(GetMapNamePopUpWindowId(), COPYWIN_FULL); + + if (OW_POPUP_GENERATION == GEN_5) + { + AddTextPrinterParameterized(mapNamePopUpWindowId, FONT_SHORT, mapDisplayHeader, 8, 2, TEXT_SKIP_DRAW, NULL); + + if (OW_POPUP_BW_TIME_MODE != OW_POPUP_BW_TIME_NONE) + { + RtcCalcLocalTime(); + FormatDecimalTimeWithoutSeconds(withoutPrefixPtr, gLocalTime.hours, gLocalTime.minutes, OW_POPUP_BW_TIME_MODE == OW_POPUP_BW_TIME_24_HR); + AddTextPrinterParameterized(secondaryPopUpWindowId, FONT_SMALL, mapDisplayHeader, GetStringRightAlignXOffset(FONT_SMALL, mapDisplayHeader, DISPLAY_WIDTH) - 5, 8, TEXT_SKIP_DRAW, NULL); + } + + CopyWindowToVram(mapNamePopUpWindowId, COPYWIN_FULL); + CopyWindowToVram(secondaryPopUpWindowId, COPYWIN_FULL); + } + else + { + x = GetStringCenterAlignXOffset(FONT_NARROW, withoutPrefixPtr, 80); + AddTextPrinterParameterized(GetMapNamePopUpWindowId(), FONT_NARROW, mapDisplayHeader, x, 3, TEXT_SKIP_DRAW, NULL); + CopyWindowToVram(GetMapNamePopUpWindowId(), COPYWIN_FULL); + } } #define TILE_TOP_EDGE_START 0x21D @@ -402,6 +606,10 @@ static void LoadMapNamePopUpWindowBg(void) u8 popUpThemeId; u8 popupWindowId = GetMapNamePopUpWindowId(); u16 regionMapSectionId = gMapHeader.regionMapSectionId; + u8 secondaryPopUpWindowId; + + if (OW_POPUP_GENERATION == GEN_5) + secondaryPopUpWindowId = GetSecondaryPopUpWindowId(); if (regionMapSectionId >= KANTO_MAPSEC_START) { @@ -410,14 +618,37 @@ static void LoadMapNamePopUpWindowBg(void) else regionMapSectionId = 0; // Discard kanto region sections; } - popUpThemeId = sRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId]; - LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_BG), sMapPopUp_OutlineTable[popUpThemeId], 0x400, 0x21D); - CallWindowFunction(popupWindowId, DrawMapNamePopUpFrame); - PutWindowTilemap(popupWindowId); - if (gMapHeader.weather == WEATHER_UNDERWATER_BUBBLES) - LoadPalette(&sMapPopUp_Palette_Underwater, BG_PLTT_ID(14), sizeof(sMapPopUp_Palette_Underwater)); + if (OW_POPUP_GENERATION == GEN_5) + { + popUpThemeId = sRegionMapSectionId_To_PopUpThemeIdMapping_BW[regionMapSectionId]; + switch (popUpThemeId) + { + // add additional gen 5-style pop-up themes as cases here + case MAPPOPUP_THEME_BW_DEFAULT: + if (OW_POPUP_BW_COLOR == OW_POPUP_BW_COLOR_WHITE) + LoadPalette(sMapPopUpTilesPalette_BW_White, BG_PLTT_ID(14), sizeof(sMapPopUpTilesPalette_BW_White)); + else + LoadPalette(sMapPopUpTilesPalette_BW_Black, BG_PLTT_ID(14), sizeof(sMapPopUpTilesPalette_BW_Black)); + + CopyToWindowPixelBuffer(popupWindowId, sMapPopUpTilesPrimary_BW, sizeof(sMapPopUpTilesPrimary_BW), 0); + CopyToWindowPixelBuffer(secondaryPopUpWindowId, sMapPopUpTilesSecondary_BW, sizeof(sMapPopUpTilesSecondary_BW), 0); + break; + } + + PutWindowTilemap(popupWindowId); + PutWindowTilemap(secondaryPopUpWindowId); + } else - LoadPalette(sMapPopUp_PaletteTable[popUpThemeId], BG_PLTT_ID(14), sizeof(sMapPopUp_PaletteTable[0])); - BlitBitmapToWindow(popupWindowId, sMapPopUp_Table[popUpThemeId], 0, 0, 80, 24); + { + popUpThemeId = sRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId]; + LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_BG), sMapPopUp_OutlineTable[popUpThemeId], 0x400, 0x21D); + CallWindowFunction(popupWindowId, DrawMapNamePopUpFrame); + PutWindowTilemap(popupWindowId); + if (gMapHeader.weather == WEATHER_UNDERWATER_BUBBLES) + LoadPalette(&sMapPopUp_Palette_Underwater, BG_PLTT_ID(14), sizeof(sMapPopUp_Palette_Underwater)); + else + LoadPalette(sMapPopUp_PaletteTable[popUpThemeId], BG_PLTT_ID(14), sizeof(sMapPopUp_PaletteTable[0])); + BlitBitmapToWindow(popupWindowId, sMapPopUp_Table[popUpThemeId], 0, 0, 80, 24); + } } diff --git a/src/menu.c b/src/menu.c index 1952ec5ed4..ff1970c3f1 100644 --- a/src/menu.c +++ b/src/menu.c @@ -4,8 +4,10 @@ #include "blit.h" #include "dma3.h" #include "event_data.h" +#include "field_weather.h" #include "graphics.h" #include "main.h" +#include "map_name_popup.h" #include "menu.h" #include "menu_helpers.h" #include "palette.h" @@ -18,6 +20,7 @@ #include "task.h" #include "text_window.h" #include "window.h" +#include "config/overworld.h" #include "constants/songs.h" #define DLG_WINDOW_PALETTE_NUM 15 @@ -62,6 +65,7 @@ static void task_free_buf_after_copying_tile_data_to_vram(u8 taskId); static EWRAM_DATA u8 sStartMenuWindowId = 0; static EWRAM_DATA u8 sMapNamePopupWindowId = 0; +static EWRAM_DATA u8 sSecondaryPopupWindowId = 0; static EWRAM_DATA struct Menu sMenu = {0}; static EWRAM_DATA u16 sTileNum = 0; static EWRAM_DATA u8 sPaletteNum = 0; @@ -146,6 +150,8 @@ void InitStandardTextBoxWindows(void) InitWindows(sStandardTextBox_WindowTemplates); sStartMenuWindowId = WINDOW_NONE; sMapNamePopupWindowId = WINDOW_NONE; + if (OW_POPUP_GENERATION == GEN_5) + sSecondaryPopupWindowId = WINDOW_NONE; } void FreeAllOverworldWindowBuffers(void) @@ -522,7 +528,12 @@ static u16 UNUSED GetStandardFrameBaseTileNum(void) u8 AddMapNamePopUpWindow(void) { if (sMapNamePopupWindowId == WINDOW_NONE) - sMapNamePopupWindowId = AddWindowParameterized(0, 1, 1, 10, 3, 14, 0x107); + { + if (OW_POPUP_GENERATION == GEN_5) + sMapNamePopupWindowId = AddWindowParameterized(0, 0, 0, 30, 3, 14, 0x107); + else + sMapNamePopupWindowId = AddWindowParameterized(0, 1, 1, 10, 3, 14, 0x107); + } return sMapNamePopupWindowId; } @@ -2146,3 +2157,42 @@ void BufferSaveMenuText(u8 textId, u8 *dest, u8 color) break; } } + +// BW map pop-ups +u8 AddSecondaryPopUpWindow(void) +{ + if (sSecondaryPopupWindowId == WINDOW_NONE) + sSecondaryPopupWindowId = AddWindowParameterized(0, 0, 17, 30, 3, 14, 0x161); + return sSecondaryPopupWindowId; +} + +u8 GetSecondaryPopUpWindowId(void) +{ + return sSecondaryPopupWindowId; +} + +void RemoveSecondaryPopUpWindow(void) +{ + if (sSecondaryPopupWindowId != WINDOW_NONE) + { + RemoveWindow(sSecondaryPopupWindowId); + sSecondaryPopupWindowId = WINDOW_NONE; + } +} + +void HBlankCB_DoublePopupWindow(void) +{ + u16 offset = gTasks[gPopupTaskId].data[2]; + u16 scanline = REG_VCOUNT; + + if (scanline < 80 || scanline > 160) + { + REG_BG0VOFS = offset; + if(OW_POPUP_BW_ALPHA_BLEND && !IsWeatherAlphaBlend()) + REG_BLDALPHA = BLDALPHA_BLEND(15, 5); + } + else + { + REG_BG0VOFS = 512 - offset; + } +} diff --git a/src/rtc.c b/src/rtc.c index a90c9aa89b..a53d5e1fd8 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -1,6 +1,7 @@ #include "global.h" #include "rtc.h" #include "string_util.h" +#include "strings.h" #include "text.h" // iwram bss @@ -364,3 +365,33 @@ u32 RtcGetLocalDayCount(void) { return RtcGetDayCount(&sRtc); } + +void FormatDecimalTimeWithoutSeconds(u8 *txtPtr, s8 hour, s8 minute, bool32 is24Hour) +{ + if (is24Hour) + { + txtPtr = ConvertIntToDecimalStringN(txtPtr, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + *txtPtr++ = CHAR_COLON; + txtPtr = ConvertIntToDecimalStringN(txtPtr, minute, STR_CONV_MODE_LEADING_ZEROS, 2); + } + else + { + if (hour == 0) + txtPtr = ConvertIntToDecimalStringN(txtPtr, 12, STR_CONV_MODE_LEADING_ZEROS, 2); + else if (hour < 13) + txtPtr = ConvertIntToDecimalStringN(txtPtr, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + else + txtPtr = ConvertIntToDecimalStringN(txtPtr, hour - 12, STR_CONV_MODE_LEADING_ZEROS, 2); + + *txtPtr++ = CHAR_COLON; + txtPtr = ConvertIntToDecimalStringN(txtPtr, minute, STR_CONV_MODE_LEADING_ZEROS, 2); + txtPtr = StringAppend(txtPtr, gText_Space); + if (hour < 12) + txtPtr = StringAppend(txtPtr, gText_AM); + else + txtPtr = StringAppend(txtPtr, gText_PM); + } + + *txtPtr++ = EOS; + *txtPtr = EOS; +} diff --git a/src/strings.c b/src/strings.c index c9be317a09..4b577bb963 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1849,3 +1849,5 @@ const u8 gText_ExpShareOff[] = _("The Exp. Share has been turned off.{PAUSE_UNTI const u8 gText_BasePointsResetToZero[] = _("{STR_VAR_1}'s base points\nwere all reset to zero!{PAUSE_UNTIL_PRESS}"); const u8 gText_Fertilize[] = _("FERTILIZE"); const u8 gText_PlantBerry[] = _("PLANT BERRY"); +const u8 gText_AM[] = _("AM"); +const u8 gText_PM[] = _("PM");