inital port of BSBob's map pop-ups

This commit is contained in:
ravepossum 2024-01-10 00:39:32 -05:00
parent 6c96641035
commit bef2fca9d6
24 changed files with 186 additions and 251 deletions

View file

@ -0,0 +1,19 @@
JASC-PAL
0100
16
0 0 0
0 0 0
255 255 255
41 49 90
0 0 0
238 230 238
189 180 197
139 139 164
90 90 123
41 49 90
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 B

View file

@ -1,19 +0,0 @@
JASC-PAL
0100
16
115 197 164
0 0 0
238 255 255
65 65 123
255 255 255
180 222 255
139 172 213
98 123 172
57 74 131
16 24 90
180 222 255
139 172 213
98 123 172
57 74 131
16 24 90
255 255 255

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 B

View file

@ -5070,4 +5070,8 @@ extern const u8 gMailTilemap_Retro[];
extern const u8 gMonMarkingsMenu_Gfx[];
extern const u16 gMonMarkingsMenu_Pal[];
// BSBob map pop-ups
extern const u8 gPopUpWindowBorder_Tiles[];
extern const u16 gPopUpWindowBorder_Palette[];
#endif //GUARD_GRAPHICS_H

View file

@ -41,6 +41,7 @@ struct MenuAction
};
extern const u16 gStandardMenuPalette[];
extern EWRAM_DATA u8 gPopupTaskId;
void FreeAllOverworldWindowBuffers(void);
void InitStandardTextBoxWindows(void);
@ -103,8 +104,8 @@ void AddTextPrinterForMessage_2(bool8 allowSkippingDelayWithButtonPress);
void RemoveStartMenuWindow(void);
void DisplayYesNoMenuWithDefault(u8 initialCursorPos);
void BufferSaveMenuText(u8 textId, u8 *dest, u8 color);
void RemoveMapNamePopUpWindow(void);
u8 GetMapNamePopUpWindowId(void);
void RemovePrimaryPopUpWindow(void);
u8 GetPrimaryPopUpWindowId(void);
u8 AddMapNamePopUpWindow(void);
void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing);
void SetBgTilemapPalette(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette);
@ -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 AddWeatherPopUpWindow(void);
u8 GetSecondaryPopUpWindowId(void);
void RemoveSecondaryPopUpWindow(void);
void HBlankCB_DoublePopupWindow(void);
#endif // GUARD_MENU_H

View file

@ -45,5 +45,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, bool8 is24Hour);
#endif // GUARD_RTC_UTIL_H

View file

@ -3026,4 +3026,8 @@ extern const u8 gText_BoxName[];
extern const u8 gText_PkmnsNickname[];
extern const u8 gText_TellHimTheWords[];
// BSBob map pop-ups
extern const u8 gText_AM[];
extern const u8 gText_PM[];
#endif // GUARD_STRINGS_H

View file

@ -1535,3 +1535,7 @@ static const u8 sUnused2[] = {0x02};
static const u8 sEmpty5[0x3242] = {0};
static const u8 sUnused3[] = {0x40};
static const u8 sEmpty6[0x13] = {0};
// BSBob map pop-ups
const u8 gPopUpWindowBorder_Tiles[] = INCBIN_U8("graphics/interface/map_popup_tiles.4bpp");
const u16 gPopUpWindowBorder_Palette[] = INCBIN_U16("graphics/interface/map_popup_palette.gbapal");

View file

@ -3,11 +3,14 @@
#include "bg.h"
#include "event_data.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"
@ -17,165 +20,12 @@
#include "constants/region_map_sections.h"
#include "constants/weather.h"
// enums
enum MapPopUp_Themes
{
MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_MARBLE,
MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_BRICK,
MAPPOPUP_THEME_UNDERWATER,
MAPPOPUP_THEME_STONE2,
};
// static functions
static void Task_MapNamePopUpWindow(u8 taskId);
static void ShowMapNamePopUpWindow(void);
static void LoadMapNamePopUpWindowBg(void);
static void LoadMapNamePopUpWindowBgs(void);
// EWRAM
static EWRAM_DATA u8 sPopupTaskId = 0;
// .rodata
static const u8 sMapPopUp_Table[][960] =
{
[MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/map_popup/wood.4bpp"),
[MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/map_popup/marble.4bpp"),
[MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/map_popup/stone.4bpp"),
[MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/map_popup/brick.4bpp"),
[MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/map_popup/underwater.4bpp"),
[MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/map_popup/stone2.4bpp"),
};
static const u8 sMapPopUp_OutlineTable[][960] =
{
[MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/map_popup/wood_outline.4bpp"),
[MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/map_popup/marble_outline.4bpp"),
[MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/map_popup/stone_outline.4bpp"),
[MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/map_popup/brick_outline.4bpp"),
[MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/map_popup/underwater_outline.4bpp"),
[MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/map_popup/stone2_outline.4bpp"),
};
static const u16 sMapPopUp_PaletteTable[][16] =
{
[MAPPOPUP_THEME_WOOD] = INCBIN_U16("graphics/map_popup/wood.gbapal"),
[MAPPOPUP_THEME_MARBLE] = INCBIN_U16("graphics/map_popup/marble_outline.gbapal"),
[MAPPOPUP_THEME_STONE] = INCBIN_U16("graphics/map_popup/stone_outline.gbapal"),
[MAPPOPUP_THEME_BRICK] = INCBIN_U16("graphics/map_popup/brick_outline.gbapal"),
[MAPPOPUP_THEME_UNDERWATER] = INCBIN_U16("graphics/map_popup/underwater_outline.gbapal"),
[MAPPOPUP_THEME_STONE2] = INCBIN_U16("graphics/map_popup/stone2_outline.gbapal"),
};
static const u16 sMapPopUp_Palette_Underwater[16] = INCBIN_U16("graphics/map_popup/underwater.gbapal");
static const u8 sRegionMapSectionId_To_PopUpThemeIdMapping[] =
{
[MAPSEC_LITTLEROOT_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_OLDALE_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_DEWFORD_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_LAVARIDGE_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_FALLARBOR_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_VERDANTURF_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_PACIFIDLOG_TOWN] = MAPPOPUP_THEME_WOOD,
[MAPSEC_PETALBURG_CITY] = MAPPOPUP_THEME_BRICK,
[MAPSEC_SLATEPORT_CITY] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_MAUVILLE_CITY] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_RUSTBORO_CITY] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_FORTREE_CITY] = MAPPOPUP_THEME_BRICK,
[MAPSEC_LILYCOVE_CITY] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_MOSSDEEP_CITY] = MAPPOPUP_THEME_BRICK,
[MAPSEC_SOOTOPOLIS_CITY] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_EVER_GRANDE_CITY] = MAPPOPUP_THEME_BRICK,
[MAPSEC_ROUTE_101] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_102] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_103] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_104] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_105] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_106] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_107] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_108] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_109] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_110] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_111] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_112] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_113] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_114] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_115] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_116] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_117] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_118] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_119] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_120] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_121] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_122] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_123] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ROUTE_124] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_125] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_126] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_127] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_128] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_129] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_130] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_131] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_132] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_133] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_ROUTE_134] = MAPPOPUP_THEME_UNDERWATER,
[MAPSEC_UNDERWATER_124] = MAPPOPUP_THEME_STONE2,
[MAPSEC_UNDERWATER_126] = MAPPOPUP_THEME_STONE2,
[MAPSEC_UNDERWATER_127] = MAPPOPUP_THEME_STONE2,
[MAPSEC_UNDERWATER_128] = MAPPOPUP_THEME_STONE2,
[MAPSEC_UNDERWATER_SOOTOPOLIS] = MAPPOPUP_THEME_STONE2,
[MAPSEC_GRANITE_CAVE] = MAPPOPUP_THEME_STONE,
[MAPSEC_MT_CHIMNEY] = MAPPOPUP_THEME_STONE,
[MAPSEC_SAFARI_ZONE] = MAPPOPUP_THEME_WOOD,
[MAPSEC_BATTLE_FRONTIER] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_PETALBURG_WOODS] = MAPPOPUP_THEME_WOOD,
[MAPSEC_RUSTURF_TUNNEL] = MAPPOPUP_THEME_STONE,
[MAPSEC_ABANDONED_SHIP] = MAPPOPUP_THEME_WOOD,
[MAPSEC_NEW_MAUVILLE] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_METEOR_FALLS] = MAPPOPUP_THEME_STONE,
[MAPSEC_METEOR_FALLS2] = MAPPOPUP_THEME_STONE,
[MAPSEC_MT_PYRE] = MAPPOPUP_THEME_STONE,
[MAPSEC_AQUA_HIDEOUT_OLD] = MAPPOPUP_THEME_STONE,
[MAPSEC_SHOAL_CAVE] = MAPPOPUP_THEME_STONE,
[MAPSEC_SEAFLOOR_CAVERN] = MAPPOPUP_THEME_STONE,
[MAPSEC_UNDERWATER_SEAFLOOR_CAVERN] = MAPPOPUP_THEME_STONE2,
[MAPSEC_VICTORY_ROAD] = MAPPOPUP_THEME_STONE,
[MAPSEC_MIRAGE_ISLAND] = MAPPOPUP_THEME_WOOD,
[MAPSEC_CAVE_OF_ORIGIN] = MAPPOPUP_THEME_STONE,
[MAPSEC_SOUTHERN_ISLAND] = MAPPOPUP_THEME_WOOD,
[MAPSEC_FIERY_PATH] = MAPPOPUP_THEME_STONE,
[MAPSEC_FIERY_PATH2] = MAPPOPUP_THEME_STONE,
[MAPSEC_JAGGED_PASS] = MAPPOPUP_THEME_WOOD,
[MAPSEC_JAGGED_PASS2] = MAPPOPUP_THEME_WOOD,
[MAPSEC_SEALED_CHAMBER] = MAPPOPUP_THEME_STONE,
[MAPSEC_UNDERWATER_SEALED_CHAMBER] = MAPPOPUP_THEME_STONE2,
[MAPSEC_SCORCHED_SLAB] = MAPPOPUP_THEME_STONE,
[MAPSEC_ISLAND_CAVE] = MAPPOPUP_THEME_STONE,
[MAPSEC_DESERT_RUINS] = MAPPOPUP_THEME_STONE,
[MAPSEC_ANCIENT_TOMB] = MAPPOPUP_THEME_STONE,
[MAPSEC_INSIDE_OF_TRUCK] = MAPPOPUP_THEME_WOOD,
[MAPSEC_SKY_PILLAR] = MAPPOPUP_THEME_STONE,
[MAPSEC_SECRET_BASE] = MAPPOPUP_THEME_STONE,
[MAPSEC_DYNAMIC] = MAPPOPUP_THEME_MARBLE,
[MAPSEC_AQUA_HIDEOUT - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_MAGMA_HIDEOUT - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_MIRAGE_TOWER - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_BIRTH_ISLAND - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_WOOD,
[MAPSEC_FARAWAY_ISLAND - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_WOOD,
[MAPSEC_ARTISAN_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_MARINE_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_UNDERWATER_MARINE_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2,
[MAPSEC_TERRA_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_UNDERWATER_105 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2,
[MAPSEC_UNDERWATER_125 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2,
[MAPSEC_UNDERWATER_129 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2,
[MAPSEC_DESERT_UNDERPASS - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_ALTERING_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_NAVEL_ROCK - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE,
[MAPSEC_TRAINER_HILL - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_MARBLE
};
static const u16 sMapPopUp_Palette[16] = INCBIN_U16("graphics/interface/map_popup_palette.gbapal");
static const u8 sText_PyramidFloor1[] = _("PYRAMID FLOOR 1");
static const u8 sText_PyramidFloor2[] = _("PYRAMID FLOOR 2");
@ -216,7 +66,7 @@ enum {
STATE_PRINT, // For some reason the first state is numerically last.
};
#define POPUP_OFFSCREEN_Y 40
#define POPUP_OFFSCREEN_Y 24
#define POPUP_SLIDE_SPEED 2
#define tState data[0]
@ -232,18 +82,18 @@ 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;
gPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 100);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
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 +111,8 @@ static void Task_MapNamePopUpWindow(u8 taskId)
task->tState = STATE_SLIDE_IN;
task->tPrintTimer = 0;
ShowMapNamePopUpWindow();
EnableInterrupts(INTR_FLAG_HBLANK);
SetHBlankCallback(HBlankCB_DoublePopupWindow);
}
break;
case STATE_SLIDE_IN:
@ -270,7 +122,7 @@ static void Task_MapNamePopUpWindow(u8 taskId)
{
task->tYOffset = 0;
task->tState = STATE_WAIT;
gTasks[sPopupTaskId].data[1] = 0;
gTasks[gPopupTaskId].tOnscreenTimer = 0;
}
break;
case STATE_WAIT:
@ -303,24 +155,31 @@ static void Task_MapNamePopUpWindow(u8 taskId)
}
break;
case STATE_ERASE:
ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE);
ClearStdWindowAndFrame(GetPrimaryPopUpWindowId(), TRUE);
ClearStdWindowAndFrame(GetSecondaryPopUpWindowId(), TRUE);
task->tState = STATE_END;
break;
case STATE_END:
HideMapNamePopUpWindow();
return;
}
SetGpuReg(REG_OFFSET_BG0VOFS, task->tYOffset);
}
void HideMapNamePopUpWindow(void)
{
if (FuncIsActiveTask(Task_MapNamePopUpWindow))
{
ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE);
RemoveMapNamePopUpWindow();
ClearStdWindowAndFrame(GetPrimaryPopUpWindowId(), TRUE);
ClearStdWindowAndFrame(GetSecondaryPopUpWindowId(), TRUE);
RemovePrimaryPopUpWindow();
RemoveSecondaryPopUpWindow();
DisableInterrupts(INTR_FLAG_HBLANK);
SetHBlankCallback(NULL);
SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, 0);
DestroyTask(sPopupTaskId);
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));
DestroyTask(gPopupTaskId);
}
}
@ -328,9 +187,22 @@ static void ShowMapNamePopUpWindow(void)
{
u8 mapDisplayHeader[24];
u8 *withoutPrefixPtr;
u8 x;
u8 mapNameX, timeX, mapNameY, timeY, mapNamePopUpWindowId, weatherPopUpWindowId;
const u8 *mapDisplayHeaderSource;
mapNameX = 8;
mapNameY = 2;
timeX = 5;
timeY = 8;
SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR);
mapNamePopUpWindowId = AddMapNamePopUpWindow();
weatherPopUpWindowId = AddWeatherPopUpWindow();
LoadMapNamePopUpWindowBgs();
LoadPalette(gPopUpWindowBorder_Palette, 0xE0, 32);
if (InBattlePyramid())
{
if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP)
@ -350,52 +222,23 @@ static void ShowMapNamePopUpWindow(void)
withoutPrefixPtr = &(mapDisplayHeader[3]);
GetMapName(withoutPrefixPtr, gMapHeader.regionMapSectionId, 0);
}
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);
AddTextPrinterParameterized(mapNamePopUpWindowId, FONT_SHORT, mapDisplayHeader, mapNameX, mapNameY, TEXT_SKIP_DRAW, NULL);
FormatDecimalTimeWithoutSeconds(withoutPrefixPtr, gLocalTime.hours, gLocalTime.minutes, FALSE);
AddTextPrinterParameterized(weatherPopUpWindowId, FONT_SMALL, mapDisplayHeader, GetStringRightAlignXOffset(FONT_SMALL, mapDisplayHeader, DISPLAY_WIDTH) - timeX, timeY, TEXT_SKIP_DRAW, NULL);
CopyWindowToVram(mapNamePopUpWindowId, COPYWIN_FULL);
CopyWindowToVram(weatherPopUpWindowId, COPYWIN_FULL);
}
#define TILE_TOP_EDGE_START 0x21D
#define TILE_TOP_EDGE_END 0x228
#define TILE_LEFT_EDGE_TOP 0x229
#define TILE_RIGHT_EDGE_TOP 0x22A
#define TILE_LEFT_EDGE_MID 0x22B
#define TILE_RIGHT_EDGE_MID 0x22C
#define TILE_LEFT_EDGE_BOT 0x22D
#define TILE_RIGHT_EDGE_BOT 0x22E
#define TILE_BOT_EDGE_START 0x22F
#define TILE_BOT_EDGE_END 0x23A
static void DrawMapNamePopUpFrame(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
static void LoadMapNamePopUpWindowBgs(void)
{
s32 i;
// Draw top edge
for (i = 0; i < 1 + TILE_TOP_EDGE_END - TILE_TOP_EDGE_START; i++)
FillBgTilemapBufferRect(bg, TILE_TOP_EDGE_START + i, i - 1 + x, y - 1, 1, 1, 14);
// Draw sides
FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_TOP, x - 1, y, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_TOP, deltaX + x, y, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_MID, x - 1, y + 1, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_MID, deltaX + x, y + 1, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_BOT, x - 1, y + 2, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_BOT, deltaX + x, y + 2, 1, 1, 14);
// Draw bottom edge
for (i = 0; i < 1 + TILE_BOT_EDGE_END - TILE_BOT_EDGE_START; i++)
FillBgTilemapBufferRect(bg, TILE_BOT_EDGE_START + i, i - 1 + x, y + deltaY, 1, 1, 14);
}
static void LoadMapNamePopUpWindowBg(void)
{
u8 popUpThemeId;
u8 popupWindowId = GetMapNamePopUpWindowId();
u8 mapNamePopUpWindowId = GetPrimaryPopUpWindowId();
u8 weatherPopUpWindowId = GetSecondaryPopUpWindowId();
u16 regionMapSectionId = gMapHeader.regionMapSectionId;
if (regionMapSectionId >= KANTO_MAPSEC_START)
@ -405,14 +248,10 @@ 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));
else
LoadPalette(sMapPopUp_PaletteTable[popUpThemeId], BG_PLTT_ID(14), sizeof(sMapPopUp_PaletteTable[0]));
BlitBitmapToWindow(popupWindowId, sMapPopUp_Table[popUpThemeId], 0, 0, 80, 24);
PutWindowTilemap(mapNamePopUpWindowId);
PutWindowTilemap(weatherPopUpWindowId);
BlitBitmapRectToWindow(mapNamePopUpWindowId, gPopUpWindowBorder_Tiles, 0, 0, DISPLAY_WIDTH, 24, 0, 0, DISPLAY_WIDTH, 24);
BlitBitmapRectToWindow(weatherPopUpWindowId, gPopUpWindowBorder_Tiles, 0, 24, DISPLAY_WIDTH, 24, 0, 0, DISPLAY_WIDTH, 24);
}

View file

@ -60,8 +60,11 @@ static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8, u8, u8, u8, u8,
static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8, u8, u8, u8, u8, u8);
static void task_free_buf_after_copying_tile_data_to_vram(u8 taskId);
EWRAM_DATA u8 gPopupTaskId;
static EWRAM_DATA u8 sStartMenuWindowId = 0;
static EWRAM_DATA u8 sMapNamePopupWindowId = 0;
static EWRAM_DATA u8 sPrimaryPopupWindowId = 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;
@ -144,7 +147,8 @@ void InitStandardTextBoxWindows(void)
{
InitWindows(sStandardTextBox_WindowTemplates);
sStartMenuWindowId = WINDOW_NONE;
sMapNamePopupWindowId = WINDOW_NONE;
sPrimaryPopupWindowId = WINDOW_NONE;
sSecondaryPopupWindowId = WINDOW_NONE;
}
void FreeAllOverworldWindowBuffers(void)
@ -520,22 +524,22 @@ static u16 UNUSED GetStandardFrameBaseTileNum(void)
u8 AddMapNamePopUpWindow(void)
{
if (sMapNamePopupWindowId == WINDOW_NONE)
sMapNamePopupWindowId = AddWindowParameterized(0, 1, 1, 10, 3, 14, 0x107);
return sMapNamePopupWindowId;
if (sPrimaryPopupWindowId == WINDOW_NONE)
sPrimaryPopupWindowId = AddWindowParameterized(0, 0, 0, 30, 3, 14, 0x107);
return sPrimaryPopupWindowId;
}
u8 GetMapNamePopUpWindowId(void)
u8 GetPrimaryPopUpWindowId(void)
{
return sMapNamePopupWindowId;
return sPrimaryPopupWindowId;
}
void RemoveMapNamePopUpWindow(void)
void RemovePrimaryPopUpWindow(void)
{
if (sMapNamePopupWindowId != WINDOW_NONE)
if (sPrimaryPopupWindowId != WINDOW_NONE)
{
RemoveWindow(sMapNamePopupWindowId);
sMapNamePopupWindowId = WINDOW_NONE;
RemoveWindow(sPrimaryPopupWindowId);
sPrimaryPopupWindowId = WINDOW_NONE;
}
}
@ -2145,3 +2149,41 @@ void BufferSaveMenuText(u8 textId, u8 *dest, u8 color)
break;
}
}
// BSBob map pop-ups
u8 AddWeatherPopUpWindow(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;
REG_BLDALPHA = BLDALPHA_BLEND(15, 5);
}
else
{
REG_BG0VOFS = 512 - offset;
}
}

View file

@ -1,6 +1,7 @@
#include "global.h"
#include "rtc.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
// iwram bss
@ -344,3 +345,36 @@ u32 RtcGetLocalDayCount(void)
{
return RtcGetDayCount(&sRtc);
}
void FormatDecimalTimeWithoutSeconds(u8 *txtPtr, s8 hour, s8 minute, bool8 is24Hour)
{
RtcCalcLocalTime();
switch (is24Hour)
{
case TRUE:
txtPtr = ConvertIntToDecimalStringN(txtPtr, hour, STR_CONV_MODE_LEADING_ZEROS, 2);
*txtPtr++ = CHAR_COLON;
txtPtr = ConvertIntToDecimalStringN(txtPtr, minute, STR_CONV_MODE_LEADING_ZEROS, 2);
break;
case FALSE:
if (hour == 0)
hour = 12;
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 < 13)
txtPtr = StringAppend(txtPtr, gText_AM);
else
txtPtr = StringAppend(txtPtr, gText_PM);
break;
}
*txtPtr++ = EOS;
*txtPtr = EOS;
}

View file

@ -1819,3 +1819,5 @@ const u8 gText_Answer[] = _("ANSWER");
const u8 gText_PokeBalls[] = _("POKé BALLS");
const u8 gText_Berry[] = _("BERRY");
const u8 gText_Berries[] = _("BERRIES");
const u8 gText_AM[] = _("AM");
const u8 gText_PM[] = _("PM");