Split naming screen palettes/graphics, use correct image palettes, clean up

This commit is contained in:
GriffinR 2022-08-08 13:14:07 -04:00
parent 5101811407
commit bfdbbad468
29 changed files with 184 additions and 142 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
106 156 213
255 255 255
57 57 57
139 139 131
197 189 180
230 222 213
74 115 139
123 172 197
172 115 74
213 156 115
98 156 57
148 189 106
189 164 32
230 222 90
57 57 57
57 57 57

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
106 156 213
255 8 8
222 57 74
180 65 82
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
230 222 213
0 0 0
230 222 213
0 0 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

After

Width:  |  Height:  |  Size: 153 B

View File

@ -1,6 +1,6 @@
JASC-PAL JASC-PAL
0100 0100
96 16
106 156 213 106 156 213
255 255 255 255 255 255
115 115 115 115 115 115
@ -17,83 +17,3 @@ JASC-PAL
230 222 90 230 222 90
238 230 139 238 230 139
246 238 197 246 238 197
106 156 213
255 255 255
57 57 57
115 115 115
0 0 0
0 0 0
0 0 0
0 0 255
0 0 255
0 0 255
0 0 255
74 115 139
98 139 164
123 172 197
156 205 230
180 222 246
106 156 213
255 255 255
57 57 57
115 115 115
0 0 0
0 0 0
0 0 0
0 0 255
0 0 255
0 0 255
0 0 255
172 115 74
189 131 90
213 156 115
246 205 164
255 230 197
106 156 213
255 255 255
57 57 57
115 115 115
0 0 0
0 0 0
0 0 0
0 0 255
0 0 255
0 0 255
0 0 255
98 156 57
123 172 82
148 189 106
197 230 156
213 238 189
106 156 213
255 255 255
57 57 57
139 139 131
197 189 180
230 222 213
74 115 139
123 172 197
172 115 74
213 156 115
98 156 57
148 189 106
189 164 32
230 222 90
57 57 57
57 57 57
106 156 213
255 8 8
222 57 74
180 65 82
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
230 222 213
0 0 0
230 222 213
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
106 156 213
255 255 255
57 57 57
115 115 115
0 0 0
0 0 0
0 0 0
0 0 255
0 0 255
0 0 255
0 0 255
172 115 74
189 131 90
213 156 115
246 205 164
255 230 197

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
106 156 213
255 255 255
57 57 57
115 115 115
0 0 0
0 0 0
0 0 0
0 0 255
0 0 255
0 0 255
0 0 255
98 156 57
123 172 82
148 189 106
197 230 156
213 238 189

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
106 156 213
255 255 255
57 57 57
115 115 115
0 0 0
0 0 0
0 0 0
0 0 255
0 0 255
0 0 255
0 0 255
74 115 139
98 139 164
123 172 197
156 205 230
180 222 246

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

View File

Before

Width:  |  Height:  |  Size: 192 B

After

Width:  |  Height:  |  Size: 192 B

View File

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 B

After

Width:  |  Height:  |  Size: 137 B

View File

@ -20,6 +20,7 @@ MISCGFXDIR := graphics/misc
JPCONTESTGFXDIR := graphics/contest/japanese JPCONTESTGFXDIR := graphics/contest/japanese
POKEDEXGFXDIR := graphics/pokedex POKEDEXGFXDIR := graphics/pokedex
STARTERGFXDIR := graphics/starter_choose STARTERGFXDIR := graphics/starter_choose
NAMINGGFXDIR := graphics/naming_screen
types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark
contest_types := cool beauty cute smart tough contest_types := cool beauty cute smart tough
@ -710,3 +711,12 @@ $(POKEDEXGFXDIR)/region_map_affine.8bpp: %.8bpp: %.png
$(STARTERGFXDIR)/birch_help.4bpp: $(STARTERGFXDIR)/birch_bag.4bpp $(STARTERGFXDIR)/birch_grass.4bpp $(STARTERGFXDIR)/birch_help.4bpp: $(STARTERGFXDIR)/birch_bag.4bpp $(STARTERGFXDIR)/birch_grass.4bpp
@cat $^ >$@ @cat $^ >$@
$(NAMINGGFXDIR)/cursor.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 5
$(NAMINGGFXDIR)/cursor_squished.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 5
$(NAMINGGFXDIR)/cursor_filled.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 5

View File

@ -4063,18 +4063,24 @@ extern const u16 gBattleInterface_BallStatusBarPal[];
extern const u16 gBattleInterface_BallDisplayPal[]; extern const u16 gBattleInterface_BallDisplayPal[];
extern const u8 gHealthboxElementsGfxTable[][32]; extern const u8 gHealthboxElementsGfxTable[][32];
extern const u16 gNamingScreenMenu_Pal[]; extern const u16 gNamingScreenMenu_Pal[6][16];
extern const u32 gNamingScreenMenu_Gfx[]; extern const u32 gNamingScreenMenu_Gfx[];
extern const u32 gNamingScreenBackground_Tilemap[]; extern const u32 gNamingScreenBackground_Tilemap[];
extern const u8 gNamingScreenKeyboardUpper_Tilemap[]; extern const u8 gNamingScreenKeyboardUpper_Tilemap[];
extern const u8 gNamingScreenKeyboardLower_Tilemap[]; extern const u8 gNamingScreenKeyboardLower_Tilemap[];
extern const u8 gNamingScreenKeyboardSymbols_Tilemap[]; extern const u8 gNamingScreenKeyboardSymbols_Tilemap[];
extern const u8 gNamingScreenRWindow_Gfx[]; extern const u32 gNamingScreenPageSwapFrame_Gfx[];
extern const u8 gNamingScreenPageButton_Gfx[]; extern const u32 gNamingScreenBackButton_Gfx[];
extern const u8 gNamingScreenROptions_Gfx[]; extern const u32 gNamingScreenOKButton_Gfx[];
extern const u8 gNamingScreenCursor_Gfx[]; extern const u32 gNamingScreenPageSwapButton_Gfx[];
extern const u8 gNamingScreenInputArrow_Gfx[]; extern const u32 gNamingScreenPageSwapUpper_Gfx[];
extern const u8 gNamingScreenUnderscore_Gfx[]; extern const u32 gNamingScreenPageSwapLower_Gfx[];
extern const u32 gNamingScreenPageSwapOthers_Gfx[];
extern const u32 gNamingScreenCursor_Gfx[];
extern const u32 gNamingScreenCursorSquished_Gfx[];
extern const u32 gNamingScreenCursorFilled_Gfx[];
extern const u32 gNamingScreenInputArrow_Gfx[];
extern const u32 gNamingScreenUnderscore_Gfx[];
extern const u32 gPokeblockFeedBg_Tilemap[]; extern const u32 gPokeblockFeedBg_Tilemap[];

View File

@ -3021,4 +3021,11 @@ extern const u8 gText_PkmnForSwap[];
extern const u8 gText_SamePkmnInPartyAlready[]; extern const u8 gText_SamePkmnInPartyAlready[];
extern const u8 gText_Cancel3[]; extern const u8 gText_Cancel3[];
// Naming Screen
extern const u8 gText_MoveOkBack[];
extern const u8 gText_YourName[];
extern const u8 gText_BoxName[];
extern const u8 gText_PkmnsNickname[];
extern const u8 gText_TellHimTheWords[];
#endif // GUARD_STRINGS_H #endif // GUARD_STRINGS_H

View File

@ -1400,14 +1400,28 @@ const u32 gStorageSystemPartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_stora
// naming screen // naming screen
const u16 gNamingScreenMenu_Pal[] = INCBIN_U16("graphics/naming_screen/menu.gbapal"); const u16 gNamingScreenMenu_Pal[6][16] =
{
INCBIN_U16("graphics/naming_screen/menu.gbapal"),
INCBIN_U16("graphics/naming_screen/page_swap_upper.gbapal"),
INCBIN_U16("graphics/naming_screen/page_swap_lower.gbapal"),
INCBIN_U16("graphics/naming_screen/page_swap_others.gbapal"),
INCBIN_U16("graphics/naming_screen/buttons.gbapal"),
INCBIN_U16("graphics/naming_screen/cursor.gbapal"),
};
const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.lz"); const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.lz");
const u8 gNamingScreenRWindow_Gfx[] = INCBIN_U8("graphics/naming_screen/rwindow.4bpp"); const u32 gNamingScreenPageSwapFrame_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_frame.4bpp");
const u8 gNamingScreenROptions_Gfx[] = INCBIN_U8("graphics/naming_screen/roptions.4bpp"); const u32 gNamingScreenBackButton_Gfx[] = INCBIN_U32("graphics/naming_screen/back_button.4bpp");
const u8 gNamingScreenCursor_Gfx[] = INCBIN_U8("graphics/naming_screen/cursor.4bpp"); const u32 gNamingScreenOKButton_Gfx[] = INCBIN_U32("graphics/naming_screen/ok_button.4bpp");
const u8 gNamingScreenPageButton_Gfx[] = INCBIN_U8("graphics/naming_screen/page_button.4bpp"); const u32 gNamingScreenPageSwapUpper_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_upper.4bpp");
const u8 gNamingScreenInputArrow_Gfx[] = INCBIN_U8("graphics/naming_screen/input_arrow.4bpp"); const u32 gNamingScreenPageSwapLower_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_lower.4bpp");
const u8 gNamingScreenUnderscore_Gfx[] = INCBIN_U8("graphics/naming_screen/underscore.4bpp"); const u32 gNamingScreenPageSwapOthers_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_others.4bpp");
const u32 gNamingScreenCursor_Gfx[] = INCBIN_U32("graphics/naming_screen/cursor.4bpp");
const u32 gNamingScreenCursorSquished_Gfx[] = INCBIN_U32("graphics/naming_screen/cursor_squished.4bpp");
const u32 gNamingScreenCursorFilled_Gfx[] = INCBIN_U32("graphics/naming_screen/cursor_filled.4bpp");
const u32 gNamingScreenPageSwapButton_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_button.4bpp");
const u32 gNamingScreenInputArrow_Gfx[] = INCBIN_U32("graphics/naming_screen/input_arrow.4bpp");
const u32 gNamingScreenUnderscore_Gfx[] = INCBIN_U32("graphics/naming_screen/underscore.4bpp");
const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.lz"); const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.lz");
const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.lz"); const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.lz");
const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.lz"); const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.lz");

View File

@ -26,6 +26,7 @@
#include "text_window.h" #include "text_window.h"
#include "overworld.h" #include "overworld.h"
#include "walda_phrase.h" #include "walda_phrase.h"
#include "main.h"
#include "constants/event_objects.h" #include "constants/event_objects.h"
#include "constants/rgb.h" #include "constants/rgb.h"
@ -61,10 +62,10 @@ enum {
}; };
enum { enum {
PALTAG_PC_ICON, PALTAG_MENU, // Also the PC icon
PALTAG_PAGE_SWAP_UPPER, PALTAG_PAGE_SWAP_UPPER,
PALTAG_PAGE_SWAP_LOWER, PALTAG_PAGE_SWAP_LOWER,
PALTAG_PAGE_SWAP_OTHERS, PALTAG_PAGE_SWAP_OTHERS, // Also the input arrow/underscore
PALTAG_PAGE_SWAP, PALTAG_PAGE_SWAP,
PALTAG_CURSOR, PALTAG_CURSOR,
PALTAG_BACK_BUTTON, PALTAG_BACK_BUTTON,
@ -180,21 +181,11 @@ struct NamingScreenData
}; };
EWRAM_DATA static struct NamingScreenData *sNamingScreen = NULL; EWRAM_DATA static struct NamingScreenData *sNamingScreen = NULL;
extern u16 gKeyRepeatStartDelay;
// extern text static const u8 sPCIconOff_Gfx[] = INCBIN_U8("graphics/naming_screen/pc_icon_off.4bpp");
extern const u8 gText_MoveOkBack[]; static const u8 sPCIconOn_Gfx[] = INCBIN_U8("graphics/naming_screen/pc_icon_on.4bpp");
extern const u8 gText_YourName[];
extern const u8 gText_BoxName[];
extern const u8 gText_PkmnsNickname[];
extern const u8 gText_TellHimTheWords[];
// start of .rodata
static const u8 sPCIconOff_Gfx[] = INCBIN_U8("graphics/naming_screen/pc_icon/off.4bpp");
static const u8 sPCIconOn_Gfx[] = INCBIN_U8("graphics/naming_screen/pc_icon/on.4bpp");
static const u16 sKeyboard_Pal[] = INCBIN_U16("graphics/naming_screen/keyboard.gbapal"); static const u16 sKeyboard_Pal[] = INCBIN_U16("graphics/naming_screen/keyboard.gbapal");
static const u16 sUnused_Pal[] = INCBIN_U16("graphics/naming_screen/unused.gbapal"); static const u16 sRival_Pal[] = INCBIN_U16("graphics/naming_screen/rival.gbapal"); // Unused, leftover from FRLG rival
static const u8 *const sTransferredToPCMessages[] = static const u8 *const sTransferredToPCMessages[] =
{ {
@ -312,13 +303,12 @@ static const u8 sPageColumnCounts[KBPAGE_COUNT] = {
[KEYBOARD_LETTERS_UPPER] = KBCOL_COUNT, [KEYBOARD_LETTERS_UPPER] = KBCOL_COUNT,
[KEYBOARD_SYMBOLS] = 6 [KEYBOARD_SYMBOLS] = 6
}; };
static const u8 sPageColumnXPos[KBPAGE_COUNT * KBCOL_COUNT] = { static const u8 sPageColumnXPos[KBPAGE_COUNT][KBCOL_COUNT] = {
0, 12, 24, 56, 68, 80, 92, 123, // KEYBOARD_LETTERS_LOWER [KEYBOARD_LETTERS_LOWER] = {0, 12, 24, 56, 68, 80, 92, 123},
0, 12, 24, 56, 68, 80, 92, 123, // KEYBOARD_LETTERS_UPPER [KEYBOARD_LETTERS_UPPER] = {0, 12, 24, 56, 68, 80, 92, 123},
0, 22, 44, 66, 88, 110 // KEYBOARD_SYMBOLS [KEYBOARD_SYMBOLS] = {0, 22, 44, 66, 88, 110}
}; };
// forward declarations
static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; static const struct NamingScreenTemplate *const sNamingScreenTemplates[];
static const struct SubspriteTable sSubspriteTable_PageSwapFrame[]; static const struct SubspriteTable sSubspriteTable_PageSwapFrame[];
static const struct SubspriteTable sSubspriteTable_PageSwapText[]; static const struct SubspriteTable sSubspriteTable_PageSwapText[];
@ -1142,7 +1132,7 @@ static void SetCursorPos(s16 x, s16 y)
struct Sprite *cursorSprite = &gSprites[sNamingScreen->cursorSpriteId]; struct Sprite *cursorSprite = &gSprites[sNamingScreen->cursorSpriteId];
if (x < sPageColumnCounts[CurrentPageToKeyboardId()]) if (x < sPageColumnCounts[CurrentPageToKeyboardId()])
cursorSprite->x = sPageColumnXPos[x + CurrentPageToKeyboardId() * KBCOL_COUNT] + 38; cursorSprite->x = sPageColumnXPos[CurrentPageToKeyboardId()][x] + 38;
else else
cursorSprite->x = 0; cursorSprite->x = 0;
@ -1890,7 +1880,7 @@ static void CreateHelperTasks(void)
static void LoadPalettes(void) static void LoadPalettes(void)
{ {
LoadPalette(gNamingScreenMenu_Pal, 0, 0xC0); LoadPalette(gNamingScreenMenu_Pal, 0, sizeof(gNamingScreenMenu_Pal));
LoadPalette(sKeyboard_Pal, 0xA0, sizeof(sKeyboard_Pal)); LoadPalette(sKeyboard_Pal, 0xA0, sizeof(sKeyboard_Pal));
LoadPalette(GetTextWindowPalette(2), 0xB0, 0x20); LoadPalette(GetTextWindowPalette(2), 0xB0, 0x20);
} }
@ -2512,7 +2502,7 @@ static const struct SpriteTemplate sSpriteTemplate_Underscore =
static const struct SpriteTemplate sSpriteTemplate_PCIcon = static const struct SpriteTemplate sSpriteTemplate_PCIcon =
{ {
.tileTag = TAG_NONE, .tileTag = TAG_NONE,
.paletteTag = PALTAG_PC_ICON, .paletteTag = PALTAG_MENU,
.oam = &sOam_8x8, .oam = &sOam_8x8,
.anims = sAnims_PCIcon, .anims = sAnims_PCIcon,
.images = sImageTable_PCIcon, .images = sImageTable_PCIcon,
@ -2547,16 +2537,16 @@ static const u8 *const sNamingScreenKeyboardText[KBPAGE_COUNT][KBROW_COUNT] =
static const struct SpriteSheet sSpriteSheets[] = static const struct SpriteSheet sSpriteSheets[] =
{ {
{gNamingScreenRWindow_Gfx + 0x280, 0x1E0, GFXTAG_BACK_BUTTON}, {gNamingScreenBackButton_Gfx, 0x1E0, GFXTAG_BACK_BUTTON},
{gNamingScreenRWindow_Gfx + 0x460, 0x1E0, GFXTAG_OK_BUTTON}, {gNamingScreenOKButton_Gfx, 0x1E0, GFXTAG_OK_BUTTON},
{gNamingScreenRWindow_Gfx, 0x280, GFXTAG_PAGE_SWAP_FRAME}, {gNamingScreenPageSwapFrame_Gfx, 0x280, GFXTAG_PAGE_SWAP_FRAME},
{gNamingScreenPageButton_Gfx + 0x20, 0x100, GFXTAG_PAGE_SWAP_BUTTON}, {gNamingScreenPageSwapButton_Gfx, 0x100, GFXTAG_PAGE_SWAP_BUTTON},
{gNamingScreenROptions_Gfx, 0x060, GFXTAG_PAGE_SWAP_UPPER}, {gNamingScreenPageSwapUpper_Gfx, 0x060, GFXTAG_PAGE_SWAP_UPPER},
{gNamingScreenROptions_Gfx + 0xA0, 0x060, GFXTAG_PAGE_SWAP_LOWER}, {gNamingScreenPageSwapLower_Gfx, 0x060, GFXTAG_PAGE_SWAP_LOWER},
{gNamingScreenROptions_Gfx + 0x140, 0x060, GFXTAG_PAGE_SWAP_OTHERS}, {gNamingScreenPageSwapOthers_Gfx, 0x060, GFXTAG_PAGE_SWAP_OTHERS},
{gNamingScreenCursor_Gfx, 0x080, GFXTAG_CURSOR}, {gNamingScreenCursor_Gfx, 0x080, GFXTAG_CURSOR},
{gNamingScreenCursor_Gfx + 0xA0, 0x080, GFXTAG_CURSOR_SQUISHED}, {gNamingScreenCursorSquished_Gfx, 0x080, GFXTAG_CURSOR_SQUISHED},
{gNamingScreenCursor_Gfx + 0x140, 0x080, GFXTAG_CURSOR_FILLED}, {gNamingScreenCursorFilled_Gfx, 0x080, GFXTAG_CURSOR_FILLED},
{gNamingScreenInputArrow_Gfx, 0x020, GFXTAG_INPUT_ARROW}, {gNamingScreenInputArrow_Gfx, 0x020, GFXTAG_INPUT_ARROW},
{gNamingScreenUnderscore_Gfx, 0x020, GFXTAG_UNDERSCORE}, {gNamingScreenUnderscore_Gfx, 0x020, GFXTAG_UNDERSCORE},
{} {}
@ -2564,14 +2554,14 @@ static const struct SpriteSheet sSpriteSheets[] =
static const struct SpritePalette sSpritePalettes[] = static const struct SpritePalette sSpritePalettes[] =
{ {
{gNamingScreenMenu_Pal, PALTAG_PC_ICON}, {gNamingScreenMenu_Pal[0], PALTAG_MENU},
{gNamingScreenMenu_Pal + 0x10, PALTAG_PAGE_SWAP_UPPER}, {gNamingScreenMenu_Pal[1], PALTAG_PAGE_SWAP_UPPER},
{gNamingScreenMenu_Pal + 0x20, PALTAG_PAGE_SWAP_LOWER}, {gNamingScreenMenu_Pal[2], PALTAG_PAGE_SWAP_LOWER},
{gNamingScreenMenu_Pal + 0x30, PALTAG_PAGE_SWAP_OTHERS}, {gNamingScreenMenu_Pal[3], PALTAG_PAGE_SWAP_OTHERS},
{gNamingScreenMenu_Pal + 0x40, PALTAG_PAGE_SWAP}, {gNamingScreenMenu_Pal[4], PALTAG_PAGE_SWAP},
{gNamingScreenMenu_Pal + 0x50, PALTAG_CURSOR}, {gNamingScreenMenu_Pal[5], PALTAG_CURSOR},
{gNamingScreenMenu_Pal + 0x40, PALTAG_BACK_BUTTON}, {gNamingScreenMenu_Pal[4], PALTAG_BACK_BUTTON},
{gNamingScreenMenu_Pal + 0x40, PALTAG_OK_BUTTON}, {gNamingScreenMenu_Pal[4], PALTAG_OK_BUTTON},
{} {}
}; };