Merge pull request #1550 from GriffinRichards/doc-pokenav

Document Pokénav
This commit is contained in:
GriffinR
2021-11-17 14:47:34 -05:00
committed by GitHub
77 changed files with 6364 additions and 6169 deletions
+124 -124
View File
@@ -13,8 +13,8 @@
#include "dynamic_placeholder_text_util.h" #include "dynamic_placeholder_text_util.h"
#include "fonts.h" #include "fonts.h"
static u16 RenderText(struct TextPrinter *textPrinter); static u16 RenderText(struct TextPrinter *);
static u32 RenderFont(struct TextPrinter *textPrinter); static u32 RenderFont(struct TextPrinter *);
static u16 FontFunc_Small(struct TextPrinter *); static u16 FontFunc_Small(struct TextPrinter *);
static u16 FontFunc_Normal(struct TextPrinter *); static u16 FontFunc_Normal(struct TextPrinter *);
static u16 FontFunc_Short(struct TextPrinter *); static u16 FontFunc_Short(struct TextPrinter *);
@@ -23,32 +23,32 @@ static u16 FontFunc_ShortCopy2(struct TextPrinter *);
static u16 FontFunc_ShortCopy3(struct TextPrinter *); static u16 FontFunc_ShortCopy3(struct TextPrinter *);
static u16 FontFunc_Narrow(struct TextPrinter *); static u16 FontFunc_Narrow(struct TextPrinter *);
static u16 FontFunc_SmallNarrow(struct TextPrinter *); static u16 FontFunc_SmallNarrow(struct TextPrinter *);
static void DecompressGlyph_Small(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Small(u16, bool32);
static void DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Normal(u16, bool32);
static void DecompressGlyph_Short(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Short(u16, bool32);
static void DecompressGlyph_Narrow(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_Narrow(u16, bool32);
static void DecompressGlyph_SmallNarrow(u16 glyphId, bool32 isJapanese); static void DecompressGlyph_SmallNarrow(u16, bool32);
static void DecompressGlyph_Bold(u16 glyphId); static void DecompressGlyph_Bold(u16);
static u32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese); static u32 GetGlyphWidth_Small(u16, bool32);
static u32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese); static u32 GetGlyphWidth_Normal(u16, bool32);
static u32 GetGlyphWidth_Short(u16 glyphId, bool32 isJapanese); static u32 GetGlyphWidth_Short(u16, bool32);
static u32 GetGlyphWidth_Narrow(u16 glyphId, bool32 isJapanese); static u32 GetGlyphWidth_Narrow(u16, bool32);
static u32 GetGlyphWidth_SmallNarrow(u16 glyphId, bool32 isJapanese); static u32 GetGlyphWidth_SmallNarrow(u16, bool32);
EWRAM_DATA struct TextPrinter gTempTextPrinter = {0}; static EWRAM_DATA struct TextPrinter sTempTextPrinter = {0};
EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0}; static EWRAM_DATA struct TextPrinter sTextPrinters[NUM_TEXT_PRINTERS] = {0};
static u16 gFontHalfRowLookupTable[0x51]; static u16 sFontHalfRowLookupTable[0x51];
static u16 gLastTextBgColor; static u16 sLastTextBgColor;
static u16 gLastTextFgColor; static u16 sLastTextFgColor;
static u16 gLastTextShadowColor; static u16 sLastTextShadowColor;
const struct FontInfo *gFonts; const struct FontInfo *gFonts;
bool8 gDisableTextPrinters; bool8 gDisableTextPrinters;
struct TextGlyph gCurGlyph; struct TextGlyph gCurGlyph;
TextFlags gTextFlags; TextFlags gTextFlags;
const u8 gFontHalfRowOffsets[] = static const u8 sFontHalfRowOffsets[] =
{ {
0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09, 0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
@@ -68,12 +68,16 @@ const u8 gFontHalfRowOffsets[] =
0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
}; };
const u8 gDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp"); static const u8 sDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp");
const u8 gDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_RS.4bpp"); static const u8 sDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_alt.4bpp");
const u8 gUnusedFRLGBlankedDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_blanked_down_arrow.4bpp"); static const u8 sUnusedFRLGBlankedDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_blanked_down_arrow.4bpp");
const u8 gUnusedFRLGDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_down_arrow.4bpp"); static const u8 sUnusedFRLGDownArrow[] = INCBIN_U8("graphics/fonts/unused_frlg_down_arrow.4bpp");
const u8 gDownArrowYCoords[] = { 0, 1, 2, 1 }; static const u8 sDownArrowYCoords[] = { 0, 1, 2, 1 };
const u8 gWindowVerticalScrollSpeeds[] = { 1, 2, 4, 0x0 }; static const u8 sWindowVerticalScrollSpeeds[] = {
[OPTIONS_TEXT_SPEED_SLOW] = 1,
[OPTIONS_TEXT_SPEED_MID] = 2,
[OPTIONS_TEXT_SPEED_FAST] = 4,
};
static const struct GlyphWidthFunc sGlyphWidthFuncs[] = static const struct GlyphWidthFunc sGlyphWidthFuncs[] =
{ {
@@ -88,24 +92,29 @@ static const struct GlyphWidthFunc sGlyphWidthFuncs[] =
{ FONT_SMALL_NARROW, GetGlyphWidth_SmallNarrow } { FONT_SMALL_NARROW, GetGlyphWidth_SmallNarrow }
}; };
const struct KeypadIcon gKeypadIcons[] = struct
{ {
[CHAR_A_BUTTON] = { 0x0, 0x8, 0xC }, u16 tileOffset;
[CHAR_B_BUTTON] = { 0x1, 0x8, 0xC }, u8 width;
[CHAR_L_BUTTON] = { 0x2, 0x10, 0xC }, u8 height;
[CHAR_R_BUTTON] = { 0x4, 0x10, 0xC }, } static const sKeypadIcons[] =
[CHAR_START_BUTTON] = { 0x6, 0x18, 0xC }, {
[CHAR_SELECT_BUTTON] = { 0x9, 0x18, 0xC }, [CHAR_A_BUTTON] = { 0x00, 8, 12 },
[CHAR_DPAD_UP] = { 0xC, 0x8, 0xC }, [CHAR_B_BUTTON] = { 0x01, 8, 12 },
[CHAR_DPAD_DOWN] = { 0xD, 0x8, 0xC }, [CHAR_L_BUTTON] = { 0x02, 16, 12 },
[CHAR_DPAD_LEFT] = { 0xE, 0x8, 0xC }, [CHAR_R_BUTTON] = { 0x04, 16, 12 },
[CHAR_DPAD_RIGHT] = { 0xF, 0x8, 0xC }, [CHAR_START_BUTTON] = { 0x06, 24, 12 },
[CHAR_DPAD_UPDOWN] = { 0x20, 0x8, 0xC }, [CHAR_SELECT_BUTTON] = { 0x09, 24, 12 },
[CHAR_DPAD_LEFTRIGHT] = { 0x21, 0x8, 0xC }, [CHAR_DPAD_UP] = { 0x0C, 8, 12 },
[CHAR_DPAD_NONE] = { 0x22, 0x8, 0xC } [CHAR_DPAD_DOWN] = { 0x0D, 8, 12 },
[CHAR_DPAD_LEFT] = { 0x0E, 8, 12 },
[CHAR_DPAD_RIGHT] = { 0x0F, 8, 12 },
[CHAR_DPAD_UPDOWN] = { 0x20, 8, 12 },
[CHAR_DPAD_LEFTRIGHT] = { 0x21, 8, 12 },
[CHAR_DPAD_NONE] = { 0x22, 8, 12 }
}; };
const u8 gKeypadIconTiles[] = INCBIN_U8("graphics/fonts/keypad_icons.4bpp"); static const u8 sKeypadIconTiles[] = INCBIN_U8("graphics/fonts/keypad_icons.4bpp");
static const struct FontInfo sFontInfos[] = static const struct FontInfo sFontInfos[] =
{ {
@@ -225,7 +234,7 @@ static const u8 sMenuCursorDimensions[][2] =
[FONT_BOLD] = {} [FONT_BOLD] = {}
}; };
const u16 gFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/bold.hwjpnfont"); static const u16 sFontBoldJapaneseGlyphs[] = INCBIN_U16("graphics/fonts/bold.hwjpnfont");
static void SetFontsPointer(const struct FontInfo *fonts) static void SetFontsPointer(const struct FontInfo *fonts)
{ {
@@ -236,7 +245,7 @@ void DeactivateAllTextPrinters(void)
{ {
int printer; int printer;
for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer) for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer)
gTextPrinters[printer].active = FALSE; sTextPrinters[printer].active = FALSE;
} }
u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))
@@ -267,41 +276,41 @@ bool16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u8 speed, voi
if (!gFonts) if (!gFonts)
return FALSE; return FALSE;
gTempTextPrinter.active = TRUE; sTempTextPrinter.active = TRUE;
gTempTextPrinter.state = RENDER_STATE_HANDLE_CHAR; sTempTextPrinter.state = RENDER_STATE_HANDLE_CHAR;
gTempTextPrinter.textSpeed = speed; sTempTextPrinter.textSpeed = speed;
gTempTextPrinter.delayCounter = 0; sTempTextPrinter.delayCounter = 0;
gTempTextPrinter.scrollDistance = 0; sTempTextPrinter.scrollDistance = 0;
for (i = 0; i < (int)ARRAY_COUNT(gTempTextPrinter.subStructFields); i++) for (i = 0; i < (int)ARRAY_COUNT(sTempTextPrinter.subStructFields); i++)
gTempTextPrinter.subStructFields[i] = 0; sTempTextPrinter.subStructFields[i] = 0;
gTempTextPrinter.printerTemplate = *printerTemplate; sTempTextPrinter.printerTemplate = *printerTemplate;
gTempTextPrinter.callback = callback; sTempTextPrinter.callback = callback;
gTempTextPrinter.minLetterSpacing = 0; sTempTextPrinter.minLetterSpacing = 0;
gTempTextPrinter.japanese = 0; sTempTextPrinter.japanese = 0;
GenerateFontHalfRowLookupTable(printerTemplate->fgColor, printerTemplate->bgColor, printerTemplate->shadowColor); GenerateFontHalfRowLookupTable(printerTemplate->fgColor, printerTemplate->bgColor, printerTemplate->shadowColor);
if (speed != TEXT_SKIP_DRAW && speed != 0) if (speed != TEXT_SKIP_DRAW && speed != 0)
{ {
--gTempTextPrinter.textSpeed; --sTempTextPrinter.textSpeed;
gTextPrinters[printerTemplate->windowId] = gTempTextPrinter; sTextPrinters[printerTemplate->windowId] = sTempTextPrinter;
} }
else else
{ {
gTempTextPrinter.textSpeed = 0; sTempTextPrinter.textSpeed = 0;
// Render all text (up to limit) at once // Render all text (up to limit) at once
for (j = 0; j < 0x400; ++j) for (j = 0; j < 0x400; ++j)
{ {
if (RenderFont(&gTempTextPrinter) == RENDER_FINISH) if (RenderFont(&sTempTextPrinter) == RENDER_FINISH)
break; break;
} }
// All the text is rendered to the window but don't draw it yet. // All the text is rendered to the window but don't draw it yet.
if (speed != TEXT_SKIP_DRAW) if (speed != TEXT_SKIP_DRAW)
CopyWindowToVram(gTempTextPrinter.printerTemplate.windowId, COPYWIN_GFX); CopyWindowToVram(sTempTextPrinter.printerTemplate.windowId, COPYWIN_GFX);
gTextPrinters[printerTemplate->windowId].active = FALSE; sTextPrinters[printerTemplate->windowId].active = FALSE;
} }
gDisableTextPrinters = FALSE; gDisableTextPrinters = FALSE;
return TRUE; return TRUE;
@@ -315,19 +324,19 @@ void RunTextPrinters(void)
{ {
for (i = 0; i < NUM_TEXT_PRINTERS; ++i) for (i = 0; i < NUM_TEXT_PRINTERS; ++i)
{ {
if (gTextPrinters[i].active) if (sTextPrinters[i].active)
{ {
u16 temp = RenderFont(&gTextPrinters[i]); u16 temp = RenderFont(&sTextPrinters[i]);
switch (temp) switch (temp)
{ {
case RENDER_PRINT: case RENDER_PRINT:
CopyWindowToVram(gTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX); CopyWindowToVram(sTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX);
case RENDER_UPDATE: case RENDER_UPDATE:
if (gTextPrinters[i].callback != 0) if (sTextPrinters[i].callback != 0)
gTextPrinters[i].callback(&gTextPrinters[i].printerTemplate, temp); sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, temp);
break; break;
case RENDER_FINISH: case RENDER_FINISH:
gTextPrinters[i].active = FALSE; sTextPrinters[i].active = FALSE;
break; break;
} }
} }
@@ -337,7 +346,7 @@ void RunTextPrinters(void)
bool16 IsTextPrinterActive(u8 id) bool16 IsTextPrinterActive(u8 id)
{ {
return gTextPrinters[id].active; return sTextPrinters[id].active;
} }
static u32 RenderFont(struct TextPrinter *textPrinter) static u32 RenderFont(struct TextPrinter *textPrinter)
@@ -356,11 +365,11 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
u32 fg12, bg12, shadow12; u32 fg12, bg12, shadow12;
u32 temp; u32 temp;
u16 *current = gFontHalfRowLookupTable; u16 *current = sFontHalfRowLookupTable;
gLastTextBgColor = bgColor; sLastTextBgColor = bgColor;
gLastTextFgColor = fgColor; sLastTextFgColor = fgColor;
gLastTextShadowColor = shadowColor; sLastTextShadowColor = shadowColor;
bg12 = bgColor << 12; bg12 = bgColor << 12;
fg12 = fgColor << 12; fg12 = fgColor << 12;
@@ -504,9 +513,9 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor) void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)
{ {
*bgColor = gLastTextBgColor; *bgColor = sLastTextBgColor;
*fgColor = gLastTextFgColor; *fgColor = sLastTextFgColor;
*shadowColor = gLastTextShadowColor; *shadowColor = sLastTextShadowColor;
} }
void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor) void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)
@@ -521,40 +530,41 @@ void DecompressGlyphTile(const void *src_, void *dest_)
u32 *dest = dest_; u32 *dest = dest_;
temp = *(src++); temp = *(src++);
*(dest)++ = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest)++ = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
temp = *(src++); temp = *(src++);
*(dest++) = ((gFontHalfRowLookupTable[gFontHalfRowOffsets[temp & 0xFF]]) << 16) | (gFontHalfRowLookupTable[gFontHalfRowOffsets[temp >> 8]]); *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]);
} }
u8 GetLastTextColor(u8 colorType) // Unused
static u8 GetLastTextColor(u8 colorType)
{ {
switch (colorType) switch (colorType)
{ {
case 0: case 0:
return gLastTextFgColor; return sLastTextFgColor;
case 2: case 2:
return gLastTextBgColor; return sLastTextBgColor;
case 1: case 1:
return gLastTextShadowColor; return sLastTextShadowColor;
default: default:
return 0; return 0;
} }
@@ -644,7 +654,7 @@ void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
struct TextGlyph *glyph; struct TextGlyph *glyph;
u8* glyphHeight; u8* glyphHeight;
if (gLastTextBgColor != 0) if (sLastTextBgColor != TEXT_COLOR_TRANSPARENT)
{ {
window = &gWindows[textPrinter->printerTemplate.windowId]; window = &gWindows[textPrinter->printerTemplate.windowId];
pixels_data.pixels = window->tileData; pixels_data.pixels = window->tileData;
@@ -660,7 +670,7 @@ void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
textPrinter->printerTemplate.currentY, textPrinter->printerTemplate.currentY,
width, width,
*glyphHeight, *glyphHeight,
gLastTextBgColor); sLastTextBgColor);
} }
} }
@@ -798,20 +808,20 @@ void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter)
switch (gTextFlags.useAlternateDownArrow) switch (gTextFlags.useAlternateDownArrow)
{ {
case FALSE: case FALSE:
default: default:
arrowTiles = gDownArrowTiles; arrowTiles = sDownArrowTiles;
break; break;
case TRUE: case TRUE:
arrowTiles = gDarkDownArrowTiles; arrowTiles = sDarkDownArrowTiles;
break; break;
} }
BlitBitmapRectToWindow( BlitBitmapRectToWindow(
textPrinter->printerTemplate.windowId, textPrinter->printerTemplate.windowId,
arrowTiles, arrowTiles,
0, 0,
gDownArrowYCoords[subStruct->downArrowYPosIdx], sDownArrowYCoords[subStruct->downArrowYPosIdx],
8, 8,
16, 16,
textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentX,
@@ -905,26 +915,16 @@ void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *c
{ {
switch (gTextFlags.useAlternateDownArrow) switch (gTextFlags.useAlternateDownArrow)
{ {
case 0: case FALSE:
default: default:
arrowTiles = gDownArrowTiles; arrowTiles = sDownArrowTiles;
break; break;
case 1: case TRUE:
arrowTiles = gDarkDownArrowTiles; arrowTiles = sDarkDownArrowTiles;
break; break;
} }
BlitBitmapRectToWindow( BlitBitmapRectToWindow(windowId, arrowTiles, 0, sDownArrowYCoords[*yCoordIndex & 3], 8, 16, x, y - 2, 8, 16);
windowId,
arrowTiles,
0,
gDownArrowYCoords[*yCoordIndex & 3],
0x8,
0x10,
x,
y - 2,
0x8,
0x10);
CopyWindowToVram(windowId, COPYWIN_GFX); CopyWindowToVram(windowId, COPYWIN_GFX);
*counter = 8; *counter = 8;
++*yCoordIndex; ++*yCoordIndex;
@@ -942,7 +942,7 @@ static u16 RenderText(struct TextPrinter *textPrinter)
switch (textPrinter->state) switch (textPrinter->state)
{ {
case RENDER_STATE_HANDLE_CHAR: case RENDER_STATE_HANDLE_CHAR:
if ((JOY_HELD(A_BUTTON | B_BUTTON)) && subStruct->hasPrintBeenSpedUp) if (JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp)
textPrinter->delayCounter = 0; textPrinter->delayCounter = 0;
if (textPrinter->delayCounter && textPrinter->textSpeed) if (textPrinter->delayCounter && textPrinter->textSpeed)
@@ -1191,7 +1191,7 @@ static u16 RenderText(struct TextPrinter *textPrinter)
if (textPrinter->scrollDistance) if (textPrinter->scrollDistance)
{ {
int scrollSpeed = GetPlayerTextSpeed(); int scrollSpeed = GetPlayerTextSpeed();
int speed = gWindowVerticalScrollSpeeds[scrollSpeed]; int speed = sWindowVerticalScrollSpeeds[scrollSpeed];
if (textPrinter->scrollDistance < speed) if (textPrinter->scrollDistance < speed)
{ {
ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor));
@@ -1612,31 +1612,31 @@ u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y)
{ {
BlitBitmapRectToWindow( BlitBitmapRectToWindow(
windowId, windowId,
gKeypadIconTiles + (gKeypadIcons[keypadIconId].tileOffset * 0x20), sKeypadIconTiles + (sKeypadIcons[keypadIconId].tileOffset * 0x20),
0, 0,
0, 0,
0x80, 0x80,
0x80, 0x80,
x, x,
y, y,
gKeypadIcons[keypadIconId].width, sKeypadIcons[keypadIconId].width,
gKeypadIcons[keypadIconId].height); sKeypadIcons[keypadIconId].height);
return gKeypadIcons[keypadIconId].width; return sKeypadIcons[keypadIconId].width;
} }
u8 GetKeypadIconTileOffset(u8 keypadIconId) u8 GetKeypadIconTileOffset(u8 keypadIconId)
{ {
return gKeypadIcons[keypadIconId].tileOffset; return sKeypadIcons[keypadIconId].tileOffset;
} }
u8 GetKeypadIconWidth(u8 keypadIconId) u8 GetKeypadIconWidth(u8 keypadIconId)
{ {
return gKeypadIcons[keypadIconId].width; return sKeypadIcons[keypadIconId].width;
} }
u8 GetKeypadIconHeight(u8 keypadIconId) u8 GetKeypadIconHeight(u8 keypadIconId)
{ {
return gKeypadIcons[keypadIconId].height; return sKeypadIcons[keypadIconId].height;
} }
void SetDefaultFontsPointer(void) void SetDefaultFontsPointer(void)
@@ -1898,7 +1898,7 @@ static void DecompressGlyph_Bold(u16 glyphId)
{ {
const u16* glyphs; const u16* glyphs;
glyphs = gFontBoldJapaneseGlyphs + (0x100 * (glyphId >> 4)) + (0x8 * (glyphId & 0xF)); glyphs = sFontBoldJapaneseGlyphs + (0x100 * (glyphId >> 4)) + (0x8 * (glyphId & 0xF));
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop); DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom); DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8; gCurGlyph.width = 8;
-8
View File
@@ -117,13 +117,6 @@ struct GlyphWidthFunc
u32 (*func)(u16 glyphId, bool32 isJapanese); u32 (*func)(u16 glyphId, bool32 isJapanese);
}; };
struct KeypadIcon
{
u16 tileOffset;
u8 width;
u8 height;
};
typedef struct { typedef struct {
bool8 canABSpeedUpPrint:1; bool8 canABSpeedUpPrint:1;
bool8 useAlternateDownArrow:1; bool8 useAlternateDownArrow:1;
@@ -153,7 +146,6 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor);
void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor); void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);
void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor); void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);
void DecompressGlyphTile(const void *src_, void *dest_); void DecompressGlyphTile(const void *src_, void *dest_);
u8 GetLastTextColor(u8 colorType);
void CopyGlyphToWindow(struct TextPrinter *x); void CopyGlyphToWindow(struct TextPrinter *x);
void ClearTextSpan(struct TextPrinter *textPrinter, u32 width); void ClearTextSpan(struct TextPrinter *textPrinter, u32 width);
u8 GetMenuCursorDimensionByFont(u8, u8); u8 GetMenuCursorDimensionByFont(u8, u8);

Before

Width:  |  Height:  |  Size: 156 B

After

Width:  |  Height:  |  Size: 156 B

Before

Width:  |  Height:  |  Size: 134 B

After

Width:  |  Height:  |  Size: 134 B

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 B

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 197 B

Before

Width:  |  Height:  |  Size: 641 B

After

Width:  |  Height:  |  Size: 641 B

Before

Width:  |  Height:  |  Size: 153 B

After

Width:  |  Height:  |  Size: 153 B

Before

Width:  |  Height:  |  Size: 164 B

After

Width:  |  Height:  |  Size: 164 B

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 251 B

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 209 B

Before

Width:  |  Height:  |  Size: 630 B

After

Width:  |  Height:  |  Size: 630 B

-35
View File
@@ -1,35 +0,0 @@
JASC-PAL
0100
32
0 197 0
246 197 123
255 255 255
106 115 123
0 0 0
189 106 65
49 65 74
255 222 156
180 131 82
189 139 106
197 197 197
255 255 255
0 0 0
0 0 0
0 0 0
255 74 16
0 197 0
246 197 123
255 255 255
106 115 123
0 0 0
189 106 65
49 65 74
255 222 156
180 131 82
189 139 106
197 197 197
197 197 197
0 0 0
0 0 0
0 0 0
189 106 65

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 239 B

Before

Width:  |  Height:  |  Size: 194 B

After

Width:  |  Height:  |  Size: 194 B

Before

Width:  |  Height:  |  Size: 168 B

After

Width:  |  Height:  |  Size: 168 B

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 291 B

Before

Width:  |  Height:  |  Size: 160 B

After

Width:  |  Height:  |  Size: 160 B

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

+1 -1
View File
@@ -697,7 +697,7 @@ $(PKNAVGFXDIR)/header.4bpp: %.4bpp: %.png
$(PKNAVGFXDIR)/device_outline.4bpp: %.4bpp: %.png $(PKNAVGFXDIR)/device_outline.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 53 $(GFX) $< $@ -num_tiles 53
$(PKNAVGFXDIR)/ui_matchcall.4bpp: %.4bpp: %.png $(PKNAVGFXDIR)/match_call/ui.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 13 $(GFX) $< $@ -num_tiles 13
$(INTERFACEGFXDIR)/region_map.8bpp: %.8bpp: %.png $(INTERFACEGFXDIR)/region_map.8bpp: %.8bpp: %.png
+3 -1
View File
@@ -270,7 +270,9 @@
#define FRIENDSHIP_EVENT_FAINT_FIELD_PSN 7 #define FRIENDSHIP_EVENT_FAINT_FIELD_PSN 7
#define FRIENDSHIP_EVENT_FAINT_LARGE 8 // If opponent was >= 30 levels higher. See AdjustFriendshipOnBattleFaint #define FRIENDSHIP_EVENT_FAINT_LARGE 8 // If opponent was >= 30 levels higher. See AdjustFriendshipOnBattleFaint
#define MAX_FRIENDSHIP 0xFF #define MAX_FRIENDSHIP 255
#define MAX_SHEEN 255
#define MAX_CONDITION 255
#define MAX_PER_STAT_IVS 31 #define MAX_PER_STAT_IVS 31
#define MAX_IV_MASK 31 #define MAX_IV_MASK 31
-1
View File
@@ -6,7 +6,6 @@
#define TRUE 1 #define TRUE 1
#define FALSE 0 #define FALSE 0
#define BSS_DATA __attribute__((section(".bss")))
#define IWRAM_DATA __attribute__((section("iwram_data"))) #define IWRAM_DATA __attribute__((section("iwram_data")))
#define EWRAM_DATA __attribute__((section("ewram_data"))) #define EWRAM_DATA __attribute__((section("ewram_data")))
#define UNUSED __attribute__((unused)) #define UNUSED __attribute__((unused))
+1
View File
@@ -482,6 +482,7 @@
#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32) #define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND) #define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV) #define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
#define REG_SIOMULTI(n) (*(vu16 *)(REG_ADDR_SIOMULTI0 + (n) * 2))
#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0) #define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1) #define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2) #define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
+87 -41
View File
@@ -7,14 +7,6 @@
#include "pokemon.h" #include "pokemon.h"
#include "constants/berry.h" #include "constants/berry.h"
#define TAG_CONDITION_MON 100
#define TAG_CONDITION_BALL 101
#define TAG_CONDITION_CANCEL 102
#define TAG_CONDITION_BALL_PLACEHOLDER 103
#define TAG_CONDITION_SPARKLE 104
#define MAX_CONDITION_SPARKLES 10
// Window IDs for the Player PC Mailbox // Window IDs for the Player PC Mailbox
enum { enum {
MAILBOXWIN_TITLE, MAILBOXWIN_TITLE,
@@ -23,61 +15,115 @@ enum {
MAILBOXWIN_COUNT MAILBOXWIN_COUNT
}; };
struct UnknownSubStruct_81D1ED4 enum {
{ TAG_CONDITION_MON = 100,
u16 unk0; TAG_CONDITION_BALL,
u16 unk2; TAG_CONDITION_CANCEL,
TAG_CONDITION_BALL_PLACEHOLDER,
TAG_CONDITION_SPARKLE,
TAG_CONDITION_MON_MARKINGS,
TAG_CONDITION_MARKINGS_MENU,
TAG_CONDITION_MARKINGS_MENU_2, // Used implicitly by CreateMonMarkingsMenuSprites
};
enum {
CONDITION_ICON_SELECTED,
CONDITION_ICON_UNSELECTED,
};
#define MAX_CONDITION_SPARKLES 10
// The number of extra sparkles shown on a Pokémon's condition screen.
// All Pokémon start with 1, so the max here is MAX_CONDITION_SPARKLES - 1
#define GET_NUM_CONDITION_SPARKLES(sheen)((sheen) != MAX_SHEEN) ? (sheen) / ((u32)MAX_SHEEN / (MAX_CONDITION_SPARKLES - 1) + 1) : MAX_CONDITION_SPARKLES - 1;
#define CONDITION_GRAPH_TOP_Y 56
#define CONDITION_GRAPH_BOTTOM_Y 121
#define CONDITION_GRAPH_HEIGHT (CONDITION_GRAPH_BOTTOM_Y - CONDITION_GRAPH_TOP_Y + 1)
#define CONDITION_GRAPH_CENTER_X 155
#define CONDITION_GRAPH_CENTER_Y ((CONDITION_GRAPH_BOTTOM_Y + CONDITION_GRAPH_TOP_Y) / 2 + 3)
#define CONDITION_GRAPH_UPDATE_STEPS 10
#define CONDITION_GRAPH_LOAD_MAX 4
// Equivalent to flavor and contest values, but in a different order.
enum {
CONDITION_COOL,
CONDITION_TOUGH,
CONDITION_SMART,
CONDITION_CUTE,
CONDITION_BEAUTY,
CONDITION_COUNT
};
// Yet another order. This one is the same (by coincidence) as the contest categories
enum {
GRAPH_COOL,
GRAPH_BEAUTY,
GRAPH_CUTE,
GRAPH_SMART,
GRAPH_TOUGH,
}; };
struct ConditionGraph struct ConditionGraph
{ {
/*0x000*/ u8 stat[4][FLAVOR_COUNT]; /*0x000*/ u8 conditions[CONDITION_GRAPH_LOAD_MAX][CONDITION_COUNT];
/*0x014*/ struct UnknownSubStruct_81D1ED4 unk14[4][FLAVOR_COUNT]; /*0x014*/ struct UCoords16 savedPositions[CONDITION_GRAPH_LOAD_MAX][CONDITION_COUNT];
/*0x064*/ struct UnknownSubStruct_81D1ED4 unk64[10][FLAVOR_COUNT]; /*0x064*/ struct UCoords16 newPositions[CONDITION_GRAPH_UPDATE_STEPS][CONDITION_COUNT];
/*0x12C*/ struct UnknownSubStruct_81D1ED4 unk12C[FLAVOR_COUNT]; /*0x12C*/ struct UCoords16 curPositions[CONDITION_COUNT];
/*0x140*/ u16 unk140[66][2]; /*0x140*/ u16 scanlineRight[CONDITION_GRAPH_HEIGHT][2];
/*0x248*/ u16 unk248[66][2]; /*0x248*/ u16 scanlineLeft[CONDITION_GRAPH_HEIGHT][2];
/*0x350*/ u16 unk350; /*0x350*/ u16 bottom;
/*0x352*/ u16 unk352; /*0x352*/ u16 updateCounter;
/*0x354*/ u8 unk354; /*0x354*/ bool8 needsDraw;
/*0x355*/ u8 state; /*0x355*/ u8 scanlineResetState;
}; };
// Mailbox menu
bool8 MailboxMenu_Alloc(u8 count); bool8 MailboxMenu_Alloc(u8 count);
u8 MailboxMenu_AddWindow(u8 windowIdx); u8 MailboxMenu_AddWindow(u8 windowIdx);
u8 MailboxMenu_CreateList(struct PlayerPCItemPageStruct *page); u8 MailboxMenu_CreateList(struct PlayerPCItemPageStruct *page);
void MailboxMenu_AddScrollArrows(struct PlayerPCItemPageStruct *page); void MailboxMenu_AddScrollArrows(struct PlayerPCItemPageStruct *page);
void MailboxMenu_Free(void); void MailboxMenu_Free(void);
void MailboxMenu_RemoveWindow(u8 windowIdx); void MailboxMenu_RemoveWindow(u8 windowIdx);
void InitConditionGraphData(struct ConditionGraph *graph);
void sub_81D2108(struct ConditionGraph *graph); // Condition graph
void SetConditionGraphIOWindows(u8 bg); void ConditionGraph_Init(struct ConditionGraph *graph);
void InitConditionGraphState(struct ConditionGraph *graph); void ConditionGraph_InitWindow(u8 bg);
void sub_81D2230(struct ConditionGraph *graph); void ConditionGraph_InitResetScanline(struct ConditionGraph *graph);
bool8 SetupConditionGraphScanlineParams(struct ConditionGraph *graph); bool8 ConditionGraph_ResetScanline(struct ConditionGraph *graph);
bool32 TransitionConditionGraph(struct ConditionGraph *graph); void ConditionGraph_Draw(struct ConditionGraph *graph);
void sub_81D2754(u8 *arg0, struct UnknownSubStruct_81D1ED4 *arg1); bool8 ConditionGraph_TryUpdate(struct ConditionGraph *graph);
void sub_81D1F84(struct ConditionGraph *graph, struct UnknownSubStruct_81D1ED4 *arg1, struct UnknownSubStruct_81D1ED4 *arg2); void ConditionGraph_Update(struct ConditionGraph *graph);
void MoveRelearnerPrintText(u8 *str); void ConditionGraph_CalcPositions(u8 *conditions, struct UCoords16 *positions);
bool16 MoveRelearnerRunTextPrinters(void); void ConditionGraph_SetNewPositions(struct ConditionGraph *graph, struct UCoords16 *arg1, struct UCoords16 *arg2);
void MoveRelearnerCreateYesNoMenu(void);
u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices); // Condition menu
void InitMoveRelearnerWindows(bool8 useContextWindow); bool8 ConditionMenu_UpdateMonEnter(struct ConditionGraph *graph, s16 *x);
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst); bool8 ConditionMenu_UpdateMonExit(struct ConditionGraph *graph, s16 *x);
bool8 MoveConditionMonOnscreen(s16 *x);
bool8 MoveConditionMonOffscreen(s16 *x);
void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel); void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel); void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel);
void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel); void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
bool8 MoveConditionMonOnscreen(s16 *x);
bool8 MoveConditionMonOffscreen(s16 *x);
bool8 TryUpdateConditionMonTransitionOn(struct ConditionGraph *graph, s16 *x);
bool8 TryUpdateConditionMonTransitionOff(struct ConditionGraph *graph, s16 *x);
void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal); void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal);
void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals); void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals);
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst);
// Condition sparkles
void LoadConditionSparkle(struct SpriteSheet *sheet, struct SpritePalette *pal); void LoadConditionSparkle(struct SpriteSheet *sheet, struct SpritePalette *pal);
void ResetConditionSparkleSprites(struct Sprite **sprites); void ResetConditionSparkleSprites(struct Sprite **sprites);
void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 count); void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 count);
void DestroyConditionSparkleSprites(struct Sprite **sprites); void DestroyConditionSparkleSprites(struct Sprite **sprites);
void FreeConditionSparkles(struct Sprite **sprites); void FreeConditionSparkles(struct Sprite **sprites);
// Move relearner
void MoveRelearnerPrintText(u8 *str);
bool16 MoveRelearnerRunTextPrinters(void);
void MoveRelearnerCreateYesNoMenu(void);
u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices);
void InitMoveRelearnerWindows(bool8 useContextWindow);
// Level up window
void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr); void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr);
void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr); void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr);
void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats); void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats);
+110 -93
View File
@@ -7,47 +7,51 @@
typedef u32 (*LoopedTask)(s32 state); typedef u32 (*LoopedTask)(s32 state);
struct PokenavMonList struct PokenavMonListItem
{ {
u8 boxId; u8 boxId;
u8 monId; u8 monId;
u16 data; u16 data;
}; };
struct PokenavMatchCallEntries struct PokenavMatchCallEntry
{ {
bool8 isSpecialTrainer; bool8 isSpecialTrainer;
u8 mapSec; u8 mapSec;
u16 headerId; u16 headerId;
}; };
struct PokenavListTemplate struct PokenavListItem
{ {
union { union {
struct PokenavMonList *monList; struct PokenavMonListItem mon;
struct PokenavMatchCallEntries *matchCallEntries; struct PokenavMatchCallEntry call;
} list; } item;
};
typedef void (*PokenavListBufferItemFunc)(struct PokenavListItem *, u8 *);
struct PokenavListTemplate
{
struct PokenavListItem * list;
u16 count; u16 count;
u16 unk6; u16 startIndex;
u8 unk8; u8 itemSize;
u8 item_X; u8 item_X;
u8 windowWidth; u8 windowWidth;
u8 listTop; u8 listTop;
u8 maxShowed; u8 maxShowed;
u8 fillValue; u8 fillValue;
u8 fontId; u8 fontId;
union { PokenavListBufferItemFunc bufferItemFunc;
void (*printMonFunc)(struct PokenavMonList *item, u8 *dest); void (*iconDrawFunc)(u16 windowId, u32 listItemId, u32 baseTile);
void (*unk10_2)(struct PokenavMatchCallEntries *, u8 *a1);
} listFunc;
void (*unk14)(u16 a0, u32 a1, u32 a2);
}; };
struct PokenavSub18 struct PokenavMonList
{ {
u16 listCount; u16 listCount;
u16 currIndex; u16 currIndex;
struct PokenavMonList monData[TOTAL_BOXES_COUNT * IN_BOX_COUNT + PARTY_SIZE]; struct PokenavMonListItem monData[TOTAL_BOXES_COUNT * IN_BOX_COUNT + PARTY_SIZE];
}; };
// Return values of LoopedTask functions. // Return values of LoopedTask functions.
@@ -65,27 +69,26 @@ enum
POKENAV_MODE_FORCE_CALL_EXIT, // Pokenav tutorial after calling Mr. Stone POKENAV_MODE_FORCE_CALL_EXIT, // Pokenav tutorial after calling Mr. Stone
}; };
// TODO - refine these names enum
enum Substructures
{ {
POKENAV_SUBSTRUCT_MAIN_MENU, POKENAV_SUBSTRUCT_MAIN_MENU,
POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER,
POKENAV_SUBSTRUCT_MENU_ICONS, POKENAV_SUBSTRUCT_MENU_GFX,
POKENAV_SUBSTRUCT_REGION_MAP_STATE, POKENAV_SUBSTRUCT_REGION_MAP_STATE,
POKENAV_SUBSTRUCT_REGION_MAP_ZOOM, POKENAV_SUBSTRUCT_REGION_MAP_ZOOM,
POKENAV_SUBSTRUCT_MATCH_CALL_MAIN, POKENAV_SUBSTRUCT_MATCH_CALL_MAIN,
POKENAV_SUBSTRUCT_MATCH_CALL_OPEN, POKENAV_SUBSTRUCT_MATCH_CALL_OPEN,
POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS,
POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST, POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX,
POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, POKENAV_SUBSTRUCT_RIBBONS_MON_LIST,
POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, POKENAV_SUBSTRUCT_RIBBONS_MON_MENU,
POKENAV_SUBSTRUCT_CONDITION_GRAPH, POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU,
POKENAV_SUBSTRUCT_MON_MARK_MENU, POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX,
POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST, POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST,
POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU, POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU,
POKENAV_SUBSTRUCT_15, //unused POKENAV_SUBSTRUCT_UNUSED,
POKENAV_SUBSTRUCT_REGION_MAP, POKENAV_SUBSTRUCT_REGION_MAP,
POKENAV_SUBSTRUCT_MATCH_CALL_LIST, POKENAV_SUBSTRUCT_LIST,
POKENAV_SUBSTRUCT_MON_LIST, POKENAV_SUBSTRUCT_MON_LIST,
POKENAV_SUBSTRUCT_COUNT, POKENAV_SUBSTRUCT_COUNT,
}; };
@@ -113,21 +116,21 @@ enum
#define POKENAV_MENU_IDS_START 100000 #define POKENAV_MENU_IDS_START 100000
enum enum
{ {
POKENAV_MAIN_MENU = POKENAV_MENU_IDS_START, POKENAV_MAIN_MENU = POKENAV_MENU_IDS_START, // The main menu where the player selects Hoenn Map/Condition/Match Call/Ribbons
POKENAV_MAIN_MENU_CURSOR_ON_MAP, POKENAV_MAIN_MENU_CURSOR_ON_MAP,
POKENAV_CONDITION_MENU, POKENAV_CONDITION_MENU, // The first Condition screen where the player selects Party or Search
POKENAV_CONDITION_SEARCH_MENU, POKENAV_CONDITION_SEARCH_MENU, // The Condition search menu where the player selects a search parameter
POKENAV_MAIN_MENU_CURSOR_ON_MATCH_CALL, POKENAV_MAIN_MENU_CURSOR_ON_MATCH_CALL,
POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS, POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS,
POKENAV_REGION_MAP, POKENAV_REGION_MAP,
POKENAV_CONDITION_PARTY, POKENAV_CONDITION_GRAPH_PARTY, // The Condition graph screen when Party has been selected
POKENAV_CONDITION_SEARCH_RESULTS, POKENAV_CONDITION_SEARCH_RESULTS, // The list of results from a Condition search
POKENAV_CONDITION_GRAPH_FROM_SEARCH, // opening condition graph from search list POKENAV_CONDITION_GRAPH_SEARCH, // The Condition graph screen when a search result has been selected
POKENAV_RETURN_CONDITION_SEARCH, //return to search list from condition graph POKENAV_RETURN_CONDITION_SEARCH, // Exited the graph screen back to the list of Condition search results
POKENAV_MATCH_CALL, POKENAV_MATCH_CALL,
POKENAV_RIBBONS_MON_LIST, POKENAV_RIBBONS_MON_LIST, // The list of Pokémon with ribbons
POKENAV_RIBBONS_SUMMARY_SCREEN, POKENAV_RIBBONS_SUMMARY_SCREEN, // The ribbon summary screen shown when a Pokémon has been selected
POKENAV_RIBBONS_RETURN_TO_MON_LIST, POKENAV_RIBBONS_RETURN_TO_MON_LIST, // Exited the summary screen back to the ribbon list
}; };
enum enum
@@ -245,15 +248,22 @@ enum RegionMapFuncIds
POKENAV_MENU_FUNC_OPEN_FEATURE, POKENAV_MENU_FUNC_OPEN_FEATURE,
}; };
enum PartyConditionFuncIds enum
{ {
PARTY_CONDITION_FUNC_NONE, CONDITION_FUNC_NONE,
PARTY_CONDITION_FUNC_SLIDE_MON_IN, CONDITION_FUNC_SLIDE_MON_IN,
PARTY_CONDITION_FUNC_RETURN, CONDITION_FUNC_RETURN,
PARTY_CONDITION_FUNC_NO_TRANSITION, CONDITION_FUNC_NO_TRANSITION,
PARTY_CONDITION_FUNC_SLIDE_MON_OUT, CONDITION_FUNC_SLIDE_MON_OUT,
PARTY_CONDITION_FUNC_ADD_MARKINGS, CONDITION_FUNC_ADD_MARKINGS,
PARTY_CONDITION_FUNC_CLOSE_MARKINGS, CONDITION_FUNC_CLOSE_MARKINGS,
};
enum
{
CONDITION_LOAD_MON_INFO,
CONDITION_LOAD_GRAPH,
CONDITION_LOAD_MON_PIC,
}; };
#define POKENAV_MENU_FUNC_EXIT -1 #define POKENAV_MENU_FUNC_EXIT -1
@@ -270,7 +280,7 @@ enum
POKENAV_MC_FUNC_CANCEL, POKENAV_MC_FUNC_CANCEL,
POKENAV_MC_FUNC_CALL_MSG, POKENAV_MC_FUNC_CALL_MSG,
POKENAV_MC_FUNC_NEARBY_MSG, POKENAV_MC_FUNC_NEARBY_MSG,
POKENAV_MC_FUNC_10, POKENAV_MC_FUNC_EXIT_CALL,
POKENAV_MC_FUNC_SHOW_CHECK_PAGE, POKENAV_MC_FUNC_SHOW_CHECK_PAGE,
POKENAV_MC_FUNC_CHECK_PAGE_UP, POKENAV_MC_FUNC_CHECK_PAGE_UP,
POKENAV_MC_FUNC_CHECK_PAGE_DOWN, POKENAV_MC_FUNC_CHECK_PAGE_DOWN,
@@ -287,6 +297,14 @@ enum
POKENAV_MAP_FUNC_EXIT, POKENAV_MAP_FUNC_EXIT,
}; };
// Modes for PokenavFadeScreen
enum {
POKENAV_FADE_TO_BLACK,
POKENAV_FADE_FROM_BLACK,
POKENAV_FADE_TO_BLACK_ALL,
POKENAV_FADE_FROM_BLACK_ALL,
};
// pokenav.c // pokenav.c
void SetSelectedConditionSearch(u32); void SetSelectedConditionSearch(u32);
u32 GetSelectedConditionSearch(void); u32 GetSelectedConditionSearch(void);
@@ -305,23 +323,23 @@ bool32 CanViewRibbonsMenu(void);
void SetPokenavVBlankCallback(void); void SetPokenavVBlankCallback(void);
void SetVBlankCallback_(IntrCallback callback); void SetVBlankCallback_(IntrCallback callback);
// pokenav_match_call_ui.c // pokenav_list.c
u32 GetSelectedPokenavListIndex(void); bool32 CreatePokenavList(const struct BgTemplate *bgTemplate, struct PokenavListTemplate *listTemplate, s32 tileOffset);
bool32 sub_81C8224(void); bool32 IsCreatePokenavListTaskActive(void);
int MatchCall_MoveCursorUp(void); void DestroyPokenavList(void);
int MatchCall_MoveCursorDown(void); u32 PokenavList_GetSelectedIndex(void);
int MatchCall_PageDown(void); int PokenavList_MoveCursorUp(void);
int MatchCall_PageUp(void); int PokenavList_MoveCursorDown(void);
bool32 IsMonListLoopedTaskActive(void); int PokenavList_PageDown(void);
void ToggleMatchCallVerticalArrows(bool32 shouldHide); int PokenavList_PageUp(void);
void sub_81C8838(void); bool32 PokenavList_IsMoveWindowTaskActive(void);
void sub_81C877C(void); void PokenavList_ToggleVerticalArrows(bool32 shouldHide);
bool32 IsMatchCallListTaskActive(void); void PokenavList_DrawCurrentItemIcon(void);
void PrintCheckPageInfo(s16 a0); void PokenavList_EraseListForCheckPage(void);
u32 GetMatchCallListTopIndex(void); bool32 PokenavList_IsTaskActive(void);
void sub_81C87F0(void); void PrintCheckPageInfo(s16 delta);
bool32 sub_81C81D4(const struct BgTemplate *arg0, struct PokenavListTemplate *arg1, s32 arg2); u32 PokenavList_GetTopIndex(void);
void sub_81C8234(void); void PokenavList_ReshowListFromCheckPage(void);
// pokenav_match_call_data.c // pokenav_match_call_data.c
bool32 MatchCall_HasCheckPage(u32 idx); bool32 MatchCall_HasCheckPage(u32 idx);
@@ -352,9 +370,9 @@ void SlideMenuHeaderDown(void);
bool32 MainMenuLoopedTaskIsBusy(void); bool32 MainMenuLoopedTaskIsBusy(void);
void SetLeftHeaderSpritesInvisibility(void); void SetLeftHeaderSpritesInvisibility(void);
void PokenavCopyPalette(const u16 *a0, const u16 *a1, int a2, int a3, int a4, u16 *palette); void PokenavCopyPalette(const u16 *a0, const u16 *a1, int a2, int a3, int a4, u16 *palette);
void sub_81C7B40(void); void FadeToBlackExceptPrimary(void);
struct Sprite *PauseSpinningPokenavSprite(void); struct Sprite *GetSpinningPokenavSprite(void);
void ResumeSpinningPokenavSprite(void); void HideSpinningPokenavSprite(void);
void UpdateRegionMapRightHeaderTiles(u32 arg0); void UpdateRegionMapRightHeaderTiles(u32 arg0);
void HideMainOrSubMenuLeftHeader(u32 id, bool32 onRightSide); void HideMainOrSubMenuLeftHeader(u32 id, bool32 onRightSide);
void SlideMenuHeaderUp(void); void SlideMenuHeaderUp(void);
@@ -364,7 +382,7 @@ bool32 WaitForPokenavShutdownFade(void);
void SetActiveMenuLoopTasks(void *func1, void *func2); void SetActiveMenuLoopTasks(void *func1, void *func2);
void ShutdownPokenav(void); void ShutdownPokenav(void);
// pokenav_menu_handler_1.c // pokenav_menu_handler.c
bool32 PokenavCallback_Init_MainMenuCursorOnMap(void); bool32 PokenavCallback_Init_MainMenuCursorOnMap(void);
bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void); bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void);
bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void); bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void);
@@ -377,7 +395,7 @@ int GetPokenavCursorPos(void);
int GetCurrentMenuItemId(void); int GetCurrentMenuItemId(void);
u16 GetHelpBarTextId(void); u16 GetHelpBarTextId(void);
// pokenav_menu_handler_2.c // pokenav_menu_handler_gfx.c
bool32 OpenPokenavMenuInitial(void); bool32 OpenPokenavMenuInitial(void);
bool32 OpenPokenavMenuNotInitial(void); bool32 OpenPokenavMenuNotInitial(void);
void CreateMenuHandlerLoopedTask(s32 ltIdx); void CreateMenuHandlerLoopedTask(s32 ltIdx);
@@ -385,29 +403,28 @@ bool32 IsMenuHandlerLoopedTaskActive(void);
void FreeMenuHandlerSubstruct2(void); void FreeMenuHandlerSubstruct2(void);
void ResetBldCnt_(void); void ResetBldCnt_(void);
// pokenav_match_call_1.c // pokenav_match_call_list.c
bool32 PokenavCallback_Init_MatchCall(void); bool32 PokenavCallback_Init_MatchCall(void);
u32 GetMatchCallCallback(void); u32 GetMatchCallCallback(void);
void FreeMatchCallSubstruct1(void); void FreeMatchCallSubstruct1(void);
int sub_81CAE28(void); int IsMatchCallListInitFinished(void);
int GetNumberRegistered(void); int GetNumberRegistered(void);
int sub_81CAE48(void); struct PokenavMatchCallEntry *GetMatchCallList(void);
struct PokenavMatchCallEntries *sub_81CAE94(void);
u16 GetMatchCallMapSec(int); u16 GetMatchCallMapSec(int);
bool32 ShouldDrawRematchPokeballIcon(int index); bool32 ShouldDrawRematchPokeballIcon(int index);
void ClearRematchPokeballIcon(u16 windowId, u32 a1); void ClearRematchPokeballIcon(u16 windowId, u32 a1);
int GetMatchCallTrainerPic(int index); int GetMatchCallTrainerPic(int index);
const u8 *GetMatchCallFlavorText(int index, int textType); const u8 *GetMatchCallFlavorText(int index, int textType);
const u8 *GetMatchCallMessageText(int index, u8 *arg1); const u8 *GetMatchCallMessageText(int index, bool8 *newRematchRequest);
u16 GetMatchCallOptionCursorPos(void); u16 GetMatchCallOptionCursorPos(void);
u16 GetMatchCallOptionId(int arg0); u16 GetMatchCallOptionId(int arg0);
void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntries * arg0, u8 *str); void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry * arg0, u8 *str);
u8 GetMatchTableMapSectionId(int rematchIndex); u8 GetMatchTableMapSectionId(int rematchIndex);
int GetIndexDeltaOfNextCheckPageDown(int index); int GetIndexDeltaOfNextCheckPageDown(int index);
int GetIndexDeltaOfNextCheckPageUp(int index); int GetIndexDeltaOfNextCheckPageUp(int index);
bool32 IsRematchEntryRegistered(int index); bool32 IsRematchEntryRegistered(int index);
// pokenav_match_call_2.c // pokenav_match_call_gfx.c
bool32 OpenMatchCall(void); bool32 OpenMatchCall(void);
void CreateMatchCallLoopedTask(s32 index); void CreateMatchCallLoopedTask(s32 index);
bool32 IsMatchCallLoopedTaskActive(void); bool32 IsMatchCallLoopedTaskActive(void);
@@ -422,33 +439,33 @@ bool32 IsRegionMapLoopedTaskActive(void);
void FreeRegionMapSubstruct1(void); void FreeRegionMapSubstruct1(void);
void FreeRegionMapSubstruct2(void); void FreeRegionMapSubstruct2(void);
// pokenav_conditions_1.c // pokenav_conditions.c
u32 PokenavCallback_Init_PartyCondition(void); u32 PokenavCallback_Init_ConditionGraph_Party(void);
u32 PokenavCallback_Init_ConditionGraphFromSearch(void); u32 PokenavCallback_Init_ConditionGraph_Search(void);
u32 GetPartyConditionCallback(void); u32 GetConditionGraphMenuCallback(void);
void FreePartyConditionSubstruct1(void); void FreeConditionGraphMenuSubstruct1(void);
bool32 LoadPartyConditionMenuGfx(void); bool32 LoadConditionGraphMenuGfx(void);
bool32 IsConditionMenuSearchMode(void); bool32 IsConditionMenuSearchMode(void);
struct ConditionGraph *GetConditionGraphDataPtr(void); struct ConditionGraph *GetConditionGraphPtr(void);
u16 GetConditionGraphCurrentMonIndex(void); u16 GetConditionGraphCurrentListIndex(void);
u16 GetMonListCount(void); u16 GetMonListCount(void);
u8 GetMonSheen(void); u8 GetNumConditionMonSparkles(void);
bool32 SetConditionGraphData(u8 arg0); bool32 LoadNextConditionMenuMonData(u8 mode);
u8 TryGetMonMarkId(void); u8 TryGetMonMarkId(void);
u8 *GetConditionMonNameBuffer(u8 id); u8 *GetConditionMonNameText(u8 id);
u8 *GetConditionMonLocationBuffer(u8 id); u8 *GetConditionMonLocationText(u8 id);
u16 GetConditionMonDataBuffer(void); u16 GetConditionMonDataBuffer(void);
void *GetConditionMonPicGfx(u8 id); void *GetConditionMonPicGfx(u8 id);
void *GetConditionMonPal(u8 id); void *GetConditionMonPal(u8 id);
// pokenav_conditions_2.c // pokenav_conditions_gfx.c
bool32 OpenPartyConditionMenu(void); bool32 OpenConditionGraphMenu(void);
void CreatePartyConditionLoopedTask(s32); void CreateConditionGraphMenuLoopedTask(s32);
u32 IsPartyConditionLoopedTaskActive(void); u32 IsConditionGraphMenuLoopedTaskActive(void);
void FreePartyConditionSubstruct2(void); void FreeConditionGraphMenuSubstruct2(void);
u8 GetMonMarkingsData(void); u8 GetMonMarkingsData(void);
// pokenav_conditions_3.c // pokenav_conditions_search_results.c
u32 PokenavCallback_Init_ConditionSearch(void); u32 PokenavCallback_Init_ConditionSearch(void);
u32 PokenavCallback_Init_ReturnToMonSearchList(void); u32 PokenavCallback_Init_ReturnToMonSearchList(void);
u32 GetConditionSearchResultsCallback(void); u32 GetConditionSearchResultsCallback(void);
@@ -459,18 +476,18 @@ void CreateSearchResultsLoopedTask(s32);
u32 IsSearchResultLoopedTaskActive(void); u32 IsSearchResultLoopedTaskActive(void);
void FreeSearchResultSubstruct2(void); void FreeSearchResultSubstruct2(void);
// pokenav_ribbons_1.c // pokenav_ribbons_list.c
u32 PokenavCallback_Init_MonRibbonList(void); u32 PokenavCallback_Init_MonRibbonList(void);
u32 PokenavCallback_Init_RibbonsMonListFromSummary(void); u32 PokenavCallback_Init_RibbonsMonListFromSummary(void);
u32 GetRibbonsMonListCallback(void); u32 GetRibbonsMonListCallback(void);
void FreeRibbonsMonList1(void); void FreeRibbonsMonList(void);
bool32 OpenRibbonsMonList(void); bool32 OpenRibbonsMonList(void);
bool32 OpenRibbonsMonListFromRibbonsSummary(void); bool32 OpenRibbonsMonListFromRibbonsSummary(void);
void CreateRibbonsMonListLoopedTask(s32); void CreateRibbonsMonListLoopedTask(s32);
u32 IsRibbonsMonListLoopedTaskActive(void); u32 IsRibbonsMonListLoopedTaskActive(void);
void FreeRibbonsMonList2(void); void FreeRibbonsMonMenu(void);
// pokenav_ribbons_2.c // pokenav_ribbons_summary.c
u32 PokenavCallback_Init_RibbonsSummaryMenu(void); u32 PokenavCallback_Init_RibbonsSummaryMenu(void);
u32 GetRibbonsSummaryMenuCallback(void); u32 GetRibbonsSummaryMenuCallback(void);
void FreeRibbonsSummaryScreen1(void); void FreeRibbonsSummaryScreen1(void);
+2 -2
View File
@@ -2978,8 +2978,8 @@ extern const u8 gText_FindToughPokemon[];
extern const u8 gText_ReturnToConditionMenu[]; extern const u8 gText_ReturnToConditionMenu[];
extern const u8 gText_NoRibbonWinners[]; extern const u8 gText_NoRibbonWinners[];
// Pokenav Ribbons // Pokenav
extern const u8 gText_NumberF700[]; extern const u8 gText_NumberIndex[];
extern const u8 gText_RibbonsF700[]; extern const u8 gText_RibbonsF700[];
// use_pokeblock // use_pokeblock
+19 -19
View File
@@ -312,17 +312,17 @@ SECTIONS {
src/battle_pyramid_bag.o(.text); src/battle_pyramid_bag.o(.text);
src/pokenav.o(.text); src/pokenav.o(.text);
src/pokenav_main_menu.o(.text); src/pokenav_main_menu.o(.text);
src/pokenav_match_call_ui.o(.text); src/pokenav_list.o(.text);
src/pokenav_menu_handler_1.o(.text); src/pokenav_menu_handler.o(.text);
src/pokenav_menu_handler_2.o(.text); src/pokenav_menu_handler_gfx.o(.text);
src/pokenav_match_call_1.o(.text); src/pokenav_match_call_list.o(.text);
src/pokenav_match_call_2.o(.text); src/pokenav_match_call_gfx.o(.text);
src/pokenav_region_map.o(.text); src/pokenav_region_map.o(.text);
src/pokenav_conditions_1.o(.text); src/pokenav_conditions.o(.text);
src/pokenav_conditions_2.o(.text); src/pokenav_conditions_gfx.o(.text);
src/pokenav_conditions_3.o(.text); src/pokenav_conditions_search_results.o(.text);
src/pokenav_ribbons_1.o(.text); src/pokenav_ribbons_list.o(.text);
src/pokenav_ribbons_2.o(.text); src/pokenav_ribbons_summary.o(.text);
src/pokenav_match_call_data.o(.text); src/pokenav_match_call_data.o(.text);
src/menu_specialized.o(.text); src/menu_specialized.o(.text);
src/ereader_helpers.o(.text); src/ereader_helpers.o(.text);
@@ -669,16 +669,16 @@ SECTIONS {
src/battle_pyramid_bag.o(.rodata); src/battle_pyramid_bag.o(.rodata);
src/pokenav.o(.rodata); src/pokenav.o(.rodata);
src/pokenav_main_menu.o(.rodata); src/pokenav_main_menu.o(.rodata);
src/pokenav_match_call_ui.o(.rodata); src/pokenav_list.o(.rodata);
src/pokenav_menu_handler_1.o(.rodata); src/pokenav_menu_handler.o(.rodata);
src/pokenav_menu_handler_2.o(.rodata); src/pokenav_menu_handler_gfx.o(.rodata);
src/pokenav_match_call_1.o(.rodata); src/pokenav_match_call_list.o(.rodata);
src/pokenav_match_call_2.o(.rodata); src/pokenav_match_call_gfx.o(.rodata);
src/pokenav_region_map.o(.rodata); src/pokenav_region_map.o(.rodata);
src/pokenav_conditions_2.o(.rodata); src/pokenav_conditions_gfx.o(.rodata);
src/pokenav_conditions_3.o(.rodata); src/pokenav_conditions_search_results.o(.rodata);
src/pokenav_ribbons_1.o(.rodata); src/pokenav_ribbons_list.o(.rodata);
src/pokenav_ribbons_2.o(.rodata); src/pokenav_ribbons_summary.o(.rodata);
src/pokenav_match_call_data.o(.rodata); src/pokenav_match_call_data.o(.rodata);
src/menu_specialized.o(.rodata); src/menu_specialized.o(.rodata);
src/ereader_helpers.o(.rodata); src/ereader_helpers.o(.rodata);
+2 -2
View File
@@ -2404,12 +2404,12 @@ void AnimTask_SketchDrawMon(u8 taskId)
if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
{ {
task->data[6] = gBattle_BG1_X; task->data[6] = gBattle_BG1_X;
params.dmaDest = (u16 *)REG_ADDR_BG1HOFS; params.dmaDest = &REG_BG1HOFS;
} }
else else
{ {
task->data[6] = gBattle_BG2_X; task->data[6] = gBattle_BG2_X;
params.dmaDest = (u16 *)REG_ADDR_BG2HOFS; params.dmaDest = &REG_BG2HOFS;
} }
for (i = task->data[0] - 0x40; i <= task->data[0]; i++) for (i = task->data[0] - 0x40; i <= task->data[0]; i++)
+2 -2
View File
@@ -653,9 +653,9 @@ static void AnimTask_SpiteTargetShadow_Step1(u8 taskId)
startLine = 0; startLine = 0;
if (position == 1) if (position == 1)
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 4, 1); task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, SCANLINE_EFFECT_REG_BG1HOFS, 1);
else else
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 8, 1); task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, SCANLINE_EFFECT_REG_BG2HOFS, 1);
task->data[15]++; task->data[15]++;
break; break;
+1 -1
View File
@@ -960,7 +960,7 @@ static void AnimTask_SurfWaveScanlineEffect(u8 taskId)
else else
gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2];
params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA; params.dmaDest = &REG_BLDALPHA;
params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
params.initState = 1; params.initState = 1;
params.unused9 = 0; params.unused9 = 0;
+1 -1
View File
@@ -870,7 +870,7 @@ static const struct WindowTemplate sInfoCardWindowTemplates[] =
static const struct ScanlineEffectParams sTourneyTreeScanlineEffectParams = static const struct ScanlineEffectParams sTourneyTreeScanlineEffectParams =
{ {
.dmaDest = (void *)REG_ADDR_BG3CNT, .dmaDest = &REG_BG3CNT,
.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT, .dmaControl = SCANLINE_EFFECT_DMACNT_16BIT,
.initState = 1, .initState = 1,
}; };
+2 -2
View File
@@ -249,13 +249,13 @@ u8 gBattleControllerData[MAX_BATTLERS_COUNT]; // Used by the battle controllers
static const struct ScanlineEffectParams sIntroScanlineParams16Bit = static const struct ScanlineEffectParams sIntroScanlineParams16Bit =
{ {
(void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1 &REG_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1
}; };
// unused // unused
static const struct ScanlineEffectParams sIntroScanlineParams32Bit = static const struct ScanlineEffectParams sIntroScanlineParams32Bit =
{ {
(void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1 &REG_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1
}; };
const struct SpriteTemplate gUnusedBattleInitSprite = const struct SpriteTemplate gUnusedBattleInitSprite =
+5 -1
View File
@@ -8,7 +8,11 @@
// For printing braille messages, see ScrCmd_braillemessage // For printing braille messages, see ScrCmd_braillemessage
ALIGNED(4) ALIGNED(4)
static const u8 sScrollDistances[] = {1, 2, 4}; static const u8 sScrollDistances[] = {
[OPTIONS_TEXT_SPEED_SLOW] = 1,
[OPTIONS_TEXT_SPEED_MID] = 2,
[OPTIONS_TEXT_SPEED_FAST] = 4,
};
static const u16 sFont_Braille[] = INCBIN_U16("graphics/fonts/braille.fwjpnfont"); static const u16 sFont_Braille[] = INCBIN_U16("graphics/fonts/braille.fwjpnfont");
static void DecompressGlyph_Braille(u16); static void DecompressGlyph_Braille(u16);
+1 -1
View File
@@ -56,7 +56,7 @@ const s32 gMaxFlashLevel = ARRAY_COUNT(sFlashLevelPixelRadii) - 1;
const struct ScanlineEffectParams sFlashEffectParams = const struct ScanlineEffectParams sFlashEffectParams =
{ {
(void *)REG_ADDR_WIN0H, &REG_WIN0H,
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
1 1
}; };
+2 -2
View File
@@ -1848,7 +1848,7 @@ static void Task_Scene3_StartGroudon(u8 taskId)
{ {
gTasks[taskId].tState = 0; gTasks[taskId].tState = 0;
gTasks[taskId].func = Task_Scene3_Groudon; gTasks[taskId].func = Task_Scene3_Groudon;
ScanlineEffect_InitWave(0, 160, 4, 4, 1, 4, 0); ScanlineEffect_InitWave(0, 160, 4, 4, 1, SCANLINE_EFFECT_REG_BG1HOFS, 0);
} }
#define tScreenX data[1] #define tScreenX data[1]
@@ -2058,7 +2058,7 @@ static void Task_Scene3_LoadKyogre(u8 taskId)
gTasks[taskId].tDelay = 16; gTasks[taskId].tDelay = 16;
gTasks[taskId].tZoom = 256; gTasks[taskId].tZoom = 256;
PanFadeAndZoomScreen(gTasks[taskId].tScreenX, gTasks[taskId].tScreenY, gTasks[taskId].tZoom, 0); PanFadeAndZoomScreen(gTasks[taskId].tScreenX, gTasks[taskId].tScreenY, gTasks[taskId].tZoom, 0);
ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, 6, 0); ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, SCANLINE_EFFECT_REG_BG1VOFS, 0);
} }
static void Task_Scene3_Kyogre(u8 taskId) static void Task_Scene3_Kyogre(u8 taskId)
+5 -5
View File
@@ -31,7 +31,7 @@ void AGBPrintFlush1Block(void);
void AGBPrintInit(void) void AGBPrintInit(void)
{ {
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; u16 *pWSCNT = &REG_WAITCNT;
u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
u16 nOldWSCNT = *pWSCNT; u16 nOldWSCNT = *pWSCNT;
*pWSCNT = WSCNT_DATA; *pWSCNT = WSCNT_DATA;
@@ -57,7 +57,7 @@ static void AGBPutcInternal(const char cChr)
void AGBPutc(const char cChr) void AGBPutc(const char cChr)
{ {
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; u16 *pWSCNT = &REG_WAITCNT;
u16 nOldWSCNT = *pWSCNT; u16 nOldWSCNT = *pWSCNT;
volatile struct AGBPrintStruct *pPrint; volatile struct AGBPrintStruct *pPrint;
*pWSCNT = WSCNT_DATA; *pWSCNT = WSCNT_DATA;
@@ -71,7 +71,7 @@ void AGBPutc(const char cChr)
void AGBPrint(const char *pBuf) void AGBPrint(const char *pBuf)
{ {
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT; u16 *pWSCNT = &REG_WAITCNT;
u16 nOldWSCNT = *pWSCNT; u16 nOldWSCNT = *pWSCNT;
*pWSCNT = WSCNT_DATA; *pWSCNT = WSCNT_DATA;
while (*pBuf) while (*pBuf)
@@ -105,9 +105,9 @@ static void AGBPrintTransferDataInternal(u32 bAllData)
pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR; pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR; pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR; lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR;
pIME = (u16 *)REG_ADDR_IME; pIME = &REG_IME;
nIME = *pIME; nIME = *pIME;
pWSCNT = (u16 *)REG_ADDR_WAITCNT; pWSCNT = &REG_WAITCNT;
nOldWSCNT = *pWSCNT; nOldWSCNT = *pWSCNT;
*pIME = nIME & ~1; *pIME = nIME & ~1;
*pWSCNT = WSCNT_DATA; *pWSCNT = WSCNT_DATA;
+2 -2
View File
@@ -336,8 +336,8 @@ static u16 handshake_wait(u16 slot)
static void STWI_set_timer_in_RAM(u8 count) static void STWI_set_timer_in_RAM(u8 count)
{ {
vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4); vu16* regTMCNTL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4); vu16* regTMCNTH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
REG_IME = 0; REG_IME = 0;
switch (count) switch (count)
{ {
+7 -7
View File
@@ -1187,10 +1187,10 @@ static void StartMatchCall(void)
CreateTask(ExecuteMatchCall, 1); CreateTask(ExecuteMatchCall, 1);
} }
static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call_window.gbapal"); static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/window.gbapal");
static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call_window.4bpp"); static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call/window.4bpp");
static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/icon.gbapal"); static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/match_call/nav_icon.gbapal");
static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/icon.4bpp.lz"); static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/nav_icon.4bpp.lz");
static const u8 sText_PokenavCallEllipsis[] = _("………………\p"); static const u8 sText_PokenavCallEllipsis[] = _("………………\p");
@@ -1499,7 +1499,7 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str)
{ {
u32 matchCallId; u32 matchCallId;
const struct MatchCallText *matchCallText; const struct MatchCallText *matchCallText;
bool32 retVal = FALSE; bool32 newRematchRequest = FALSE;
matchCallId = GetTrainerMatchCallId(trainerId); matchCallId = GetTrainerMatchCallId(trainerId);
sBattleFrontierStreakInfo.facilityId = 0; sBattleFrontierStreakInfo.facilityId = 0;
@@ -1517,7 +1517,7 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str)
else if (ShouldTrainerRequestBattle(matchCallId)) else if (ShouldTrainerRequestBattle(matchCallId))
{ {
matchCallText = GetDifferentRouteMatchCallText(matchCallId, str); matchCallText = GetDifferentRouteMatchCallText(matchCallId, str);
retVal = TRUE; newRematchRequest = TRUE;
UpdateRematchIfDefeated(matchCallId); UpdateRematchIfDefeated(matchCallId);
} }
else if (Random() % 3) else if (Random() % 3)
@@ -1532,7 +1532,7 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str)
} }
BuildMatchCallString(matchCallId, matchCallText, str); BuildMatchCallString(matchCallId, matchCallText, str);
return retVal; return newRematchRequest;
} }
static int GetTrainerMatchCallId(int trainerId) static int GetTrainerMatchCallId(int trainerId)
+276 -254
View File
@@ -31,14 +31,14 @@ extern const struct CompressedSpriteSheet gMonFrontPicTable[];
EWRAM_DATA static u8 sMailboxWindowIds[MAILBOXWIN_COUNT] = {0}; EWRAM_DATA static u8 sMailboxWindowIds[MAILBOXWIN_COUNT] = {0};
EWRAM_DATA static struct ListMenuItem *sMailboxList = NULL; EWRAM_DATA static struct ListMenuItem *sMailboxList = NULL;
static void MailboxMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void MailboxMenu_MoveCursorFunc(s32, bool8, struct ListMenu *);
static void sub_81D24A4(struct ConditionGraph *a0); static void ConditionGraph_CalcRightHalf(struct ConditionGraph *);
static void sub_81D2634(struct ConditionGraph *a0); static void ConditionGraph_CalcLeftHalf(struct ConditionGraph *);
static void MoveRelearnerCursorCallback(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void MoveRelearnerCursorCallback(s32, bool8, struct ListMenu *);
static void nullsub_79(void); static void MoveRelearnerDummy(void);
static void SetNextConditionSparkle(struct Sprite *sprite); static void SetNextConditionSparkle(struct Sprite *);
static void SpriteCB_ConditionSparkle(struct Sprite *sprite); static void SpriteCB_ConditionSparkle(struct Sprite *);
static void ShowAllConditionSparkles(struct Sprite *sprite); static void ShowAllConditionSparkles(struct Sprite *);
static const struct WindowTemplate sWindowTemplates_MailboxMenu[MAILBOXWIN_COUNT] = static const struct WindowTemplate sWindowTemplates_MailboxMenu[MAILBOXWIN_COUNT] =
{ {
@@ -80,46 +80,29 @@ static const u8 sEmptyItemName[] = _("");
static const struct ScanlineEffectParams sConditionGraphScanline = static const struct ScanlineEffectParams sConditionGraphScanline =
{ {
.dmaDest = (void*)REG_ADDR_WIN0H, .dmaDest = &REG_WIN0H,
.dmaControl = SCANLINE_EFFECT_DMACNT_32BIT, .dmaControl = SCANLINE_EFFECT_DMACNT_32BIT,
.initState = 1, .initState = 1,
}; };
static const u8 sUnknown_08625410[] = static const u8 sConditionToLineLength[MAX_CONDITION + 1] =
{ {
4, 4, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13,
5, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17,
6, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19,
7, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21,
8, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23,
9, 9, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24,
10, 10, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26,
0xB, 0xB, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27,
0xC, 0xC, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28,
0xD, 0xD, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
0xD, 0xD, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
0xE, 0xE, 0xE, 0xE, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
0xF, 0xF, 0xF, 0xF, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34,
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D,
0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x23
}; };
@@ -207,6 +190,10 @@ static const struct ListMenuTemplate sMoveRelearnerMovesListTemplate =
.cursorKind = 0 .cursorKind = 0
}; };
//--------------
// Mailbox menu
//--------------
bool8 MailboxMenu_Alloc(u8 count) bool8 MailboxMenu_Alloc(u8 count)
{ {
u8 i; u8 i;
@@ -320,67 +307,83 @@ void MailboxMenu_Free(void)
Free(sMailboxList); Free(sMailboxList);
} }
void InitConditionGraphData(struct ConditionGraph *graph) //---------------------------------------
// Condition graph
//
// This is the graph in the Pokénav and
// Pokéblock case that shows a Pokémon's
// conditions (Beauty, Tough, etc.).
// It works by using scanlines to
// selectively reveal a bg that has been
// filled with the graph color.
//---------------------------------------
#define SHIFT_RIGHT_ADJUSTED(n, s)(((n) >> (s)) + (((n) >> ((s) - 1)) & 1))
void ConditionGraph_Init(struct ConditionGraph *graph)
{ {
u8 i, j; u8 i, j;
for (j = 0; j < FLAVOR_COUNT; j++) for (j = 0; j < CONDITION_COUNT; j++)
{ {
for (i = 0; i < 10; i++) for (i = 0; i < CONDITION_GRAPH_UPDATE_STEPS; i++)
{ {
graph->unk64[i][j].unk0 = 0; graph->newPositions[i][j].x = 0;
graph->unk64[i][j].unk2 = 0; graph->newPositions[i][j].y = 0;
}
for (i = 0; i < 4; i++)
{
graph->stat[i][j] = 0;
graph->unk14[i][j].unk0 = 155;
graph->unk14[i][j].unk2 = 91;
} }
graph->unk12C[j].unk0 = 0; for (i = 0; i < CONDITION_GRAPH_LOAD_MAX; i++)
graph->unk12C[j].unk2 = 0; {
graph->conditions[i][j] = 0;
graph->savedPositions[i][j].x = CONDITION_GRAPH_CENTER_X;
graph->savedPositions[i][j].y = CONDITION_GRAPH_CENTER_Y;
}
graph->curPositions[j].x = 0;
graph->curPositions[j].y = 0;
} }
graph->unk354 = 0; graph->needsDraw = FALSE;
graph->unk352 = 0; graph->updateCounter = 0;
} }
void sub_81D1F84(struct ConditionGraph *graph, struct UnknownSubStruct_81D1ED4 *arg1, struct UnknownSubStruct_81D1ED4 *arg2) // Fills the newPositions array with incremental positions between
// old and new for the graph transition when switching between Pokémon.
void ConditionGraph_SetNewPositions(struct ConditionGraph *graph, struct UCoords16 *old, struct UCoords16 *new)
{ {
u16 i, j; u16 i, j;
s32 r5, r6; s32 coord, increment;
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
{ {
r5 = arg1[i].unk0 << 8; coord = old[i].x << 8;
r6 = ((arg2[i].unk0 - arg1[i].unk0) << 8) / 10; increment = ((new[i].x - old[i].x) << 8) / CONDITION_GRAPH_UPDATE_STEPS;
for (j = 0; j < 9; j++) for (j = 0; j < CONDITION_GRAPH_UPDATE_STEPS - 1; j++)
{ {
graph->unk64[j][i].unk0 = (r5 >> 8) + ((r5 >> 7) & 1); graph->newPositions[j][i].x = SHIFT_RIGHT_ADJUSTED(coord, 8);
r5 += r6; coord += increment;
} }
graph->unk64[j][i].unk0 = arg2[i].unk0; graph->newPositions[j][i].x = new[i].x;
r5 = arg1[i].unk2 << 8; coord = old[i].y << 8;
r6 = ((arg2[i].unk2 - arg1[i].unk2) << 8) / 10; increment = ((new[i].y - old[i].y) << 8) / CONDITION_GRAPH_UPDATE_STEPS;
for (j = 0; j < 9; j++) for (j = 0; j < CONDITION_GRAPH_UPDATE_STEPS - 1; j++)
{ {
graph->unk64[j][i].unk2 = (r5 >> 8) + ((r5 >> 7) & 1); graph->newPositions[j][i].y = SHIFT_RIGHT_ADJUSTED(coord, 8);
r5 += r6; coord += increment;
} }
graph->unk64[j][i].unk2 = arg2[i].unk2; graph->newPositions[j][i].y = new[i].y;
} }
graph->unk352 = 0; graph->updateCounter = 0;
} }
bool32 TransitionConditionGraph(struct ConditionGraph *graph) bool8 ConditionGraph_TryUpdate(struct ConditionGraph *graph)
{ {
if (graph->unk352 < 10) if (graph->updateCounter < CONDITION_GRAPH_UPDATE_STEPS)
{ {
sub_81D2230(graph); ConditionGraph_Update(graph);
return (++graph->unk352 != 10); return (++graph->updateCounter != CONDITION_GRAPH_UPDATE_STEPS);
} }
else else
{ {
@@ -388,294 +391,316 @@ bool32 TransitionConditionGraph(struct ConditionGraph *graph)
} }
} }
void InitConditionGraphState(struct ConditionGraph *graph) void ConditionGraph_InitResetScanline(struct ConditionGraph *graph)
{ {
graph->state = 0; graph->scanlineResetState = 0;
} }
bool8 SetupConditionGraphScanlineParams(struct ConditionGraph *graph) bool8 ConditionGraph_ResetScanline(struct ConditionGraph *graph)
{ {
struct ScanlineEffectParams params; struct ScanlineEffectParams params;
switch (graph->state) switch (graph->scanlineResetState)
{ {
case 0: case 0:
ScanlineEffect_Clear(); ScanlineEffect_Clear();
graph->state++; graph->scanlineResetState++;
return TRUE; return TRUE;
case 1: case 1:
params = sConditionGraphScanline; params = sConditionGraphScanline;
ScanlineEffect_SetParams(params); ScanlineEffect_SetParams(params);
graph->state++; graph->scanlineResetState++;
return FALSE; return FALSE;
default: default:
return FALSE; return FALSE;
} }
} }
void sub_81D2108(struct ConditionGraph *graph) void ConditionGraph_Draw(struct ConditionGraph *graph)
{ {
u16 i; u16 i;
if (graph->unk354 == 0) if (!graph->needsDraw)
return; return;
sub_81D24A4(graph); ConditionGraph_CalcRightHalf(graph);
sub_81D2634(graph); ConditionGraph_CalcLeftHalf(graph);
for (i = 0; i < 66; i++) for (i = 0; i < CONDITION_GRAPH_HEIGHT; i++)
{ {
gScanlineEffectRegBuffers[1][(i + 55) * 2] = gScanlineEffectRegBuffers[0][(i + 55) * 2] = (graph->unk140[i][0] << 8) | (graph->unk140[i][1]); // Draw right half
gScanlineEffectRegBuffers[1][(i + 55) * 2 + 1] = gScanlineEffectRegBuffers[0][(i + 55) * 2 + 1] = (graph->unk248[i][0] << 8) | (graph->unk248[i][1]); gScanlineEffectRegBuffers[1][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 0] = // double assignment
gScanlineEffectRegBuffers[0][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 0] = (graph->scanlineRight[i][0] << 8) | (graph->scanlineRight[i][1]);
// Draw left half
gScanlineEffectRegBuffers[1][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 1] = // double assignment
gScanlineEffectRegBuffers[0][(i + CONDITION_GRAPH_TOP_Y - 1) * 2 + 1] = (graph->scanlineLeft[i][0] << 8) | (graph->scanlineLeft[i][1]);
} }
graph->unk354 = 0; graph->needsDraw = FALSE;
} }
void SetConditionGraphIOWindows(u8 bg) void ConditionGraph_InitWindow(u8 bg)
{ {
u32 flags; u32 flags;
if (bg > 3) if (bg >= NUM_BACKGROUNDS)
bg = 0; bg = 0;
// Unset the WINOUT flag for the bg. // Unset the WINOUT flag for the bg.
flags = (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) & ~(1 << bg); flags = (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) & ~(1 << bg);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE( 0, DISPLAY_WIDTH)); // Set limits for graph data
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE( 0, 155)); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE( 0, DISPLAY_WIDTH)); // Right side horizontal
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(56, 121)); SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE( 0, CONDITION_GRAPH_CENTER_X)); // Left side horizontal
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(56, 121)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(CONDITION_GRAPH_TOP_Y, CONDITION_GRAPH_BOTTOM_Y)); // Right side vertical
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(CONDITION_GRAPH_TOP_Y, CONDITION_GRAPH_BOTTOM_Y)); // Left side vertical
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
SetGpuReg(REG_OFFSET_WINOUT, flags); SetGpuReg(REG_OFFSET_WINOUT, flags);
} }
void sub_81D2230(struct ConditionGraph *graph) void ConditionGraph_Update(struct ConditionGraph *graph)
{ {
u16 i; u16 i;
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
graph->unk12C[i] = graph->unk64[graph->unk352][i]; graph->curPositions[i] = graph->newPositions[graph->updateCounter][i];
graph->unk354 = 1; graph->needsDraw = TRUE;
} }
static void sub_81D2278(struct ConditionGraph *graph, u16 *arg1, struct UnknownSubStruct_81D1ED4 *arg2, struct UnknownSubStruct_81D1ED4 *arg3, u8 arg4, u16 *arg5) static void ConditionGraph_CalcLine(struct ConditionGraph *graph, u16 *scanline, struct UCoords16 *pos1, struct UCoords16 *pos2, bool8 dir, u16 *overflowScanline)
{ {
u16 i, r8, r10, r0, var_30; u16 i, height, top, bottom, x2;
u16 *ptr; u16 *ptr;
s32 r4, var_2C; s32 x, xIncrement = 0;
var_2C = 0; if (pos1->y < pos2->y)
if (arg2->unk2 < arg3->unk2)
{ {
r10 = arg2->unk2; top = pos1->y;
r0 = arg3->unk2; bottom = pos2->y;
r4 = arg2->unk0 << 10; x = pos1->x << 10;
var_30 = arg3->unk0; x2 = pos2->x;
r8 = r0 - r10; height = bottom - top;
if (r8 != 0) if (height != 0)
var_2C = ((var_30 - arg2->unk0) << 10) / r8; xIncrement = ((x2 - pos1->x) << 10) / height;
} }
else else
{ {
r0 = arg2->unk2; bottom = pos1->y;
r10 = arg3->unk2; top = pos2->y;
r4 = arg3->unk0 << 10; x = pos2->x << 10;
var_30 = arg2->unk0; x2 = pos1->x;
r8 = r0 - r10; height = bottom - top;
if (r8 != 0) if (height != 0)
var_2C = ((var_30 - arg3->unk0) << 10) / r8; xIncrement = ((x2 - pos2->x) << 10) / height;
} }
r8++; height++;
if (arg5 == NULL) if (overflowScanline == NULL)
{ {
arg1 += (r10 - 56) * 2; scanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
for (i = 0; i < r8; i++) for (i = 0; i < height; i++)
{ {
arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; scanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
r4 += var_2C; x += xIncrement;
arg1 += 2; scanline += 2;
} }
ptr = arg1 - 2; ptr = scanline - 2;
} }
else if (var_2C > 0) else if (xIncrement > 0)
{ {
arg5 += (r10 - 56) * 2; overflowScanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
// Less readable than the other loops, but it has to be written this way to match. // Less readable than the other loops, but it has to be written this way to match.
for (i = 0; i < r8; arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4, r4 += var_2C, arg5 += 2, i++) for (i = 0; i < height; overflowScanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir, x += xIncrement, overflowScanline += 2, i++)
{ {
if (r4 >= (155 << 10)) if (x >= (CONDITION_GRAPH_CENTER_X << 10))
break; break;
} }
graph->unk350 = r10 + i; graph->bottom = top + i;
arg1 += (graph->unk350 - 56) * 2; scanline += (graph->bottom - CONDITION_GRAPH_TOP_Y) * 2;
for (; i < r8; i++) for (; i < height; i++)
{ {
arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; scanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
r4 += var_2C; x += xIncrement;
arg1 += 2; scanline += 2;
} }
ptr = arg1 - 2; ptr = scanline - 2;
} }
else if (var_2C < 0) else if (xIncrement < 0)
{ {
arg1 += (r10 - 56) * 2; scanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
for (i = 0; i < r8; i++) for (i = 0; i < height; i++)
{ {
arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; scanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
if (r4 < (155 << 10)) if (x < (CONDITION_GRAPH_CENTER_X << 10))
{ {
arg1[arg4] = 155; scanline[dir] = CONDITION_GRAPH_CENTER_X;
break; break;
} }
r4 += var_2C; x += xIncrement;
arg1 += 2; scanline += 2;
} }
graph->unk350 = r10 + i; graph->bottom = top + i;
arg5 += (graph->unk350 - 56) * 2; overflowScanline += (graph->bottom - CONDITION_GRAPH_TOP_Y) * 2;
for (; i < r8; i++) for (; i < height; i++)
{ {
arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; overflowScanline[dir] = SHIFT_RIGHT_ADJUSTED(x, 10) + dir;
r4 += var_2C; x += xIncrement;
arg5 += 2; overflowScanline += 2;
} }
ptr = arg5 - 2; ptr = overflowScanline - 2;
} }
else else
{ {
graph->unk350 = r10; graph->bottom = top;
arg1 += (r10 - 56) * 2; scanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
arg5 += (r10 - 56) * 2; overflowScanline += (top - CONDITION_GRAPH_TOP_Y) * 2;
arg1[1] = arg2->unk0 + 1; scanline[1] = pos1->x + 1;
arg5[0] = arg3->unk0; overflowScanline[0] = pos2->x;
arg5[1] = 155; overflowScanline[1] = CONDITION_GRAPH_CENTER_X;
return; return;
} }
ptr[arg4] = arg4 + var_30; ptr[dir] = dir + x2;
} }
static void sub_81D24A4(struct ConditionGraph *graph) static void ConditionGraph_CalcRightHalf(struct ConditionGraph *graph)
{ {
u16 i, r6, varMax; u16 i, y, bottom;
if (graph->unk12C[0].unk2 < graph->unk12C[1].unk2) // Calculate Cool -> Beauty line
if (graph->curPositions[GRAPH_COOL].y < graph->curPositions[GRAPH_BEAUTY].y)
{ {
r6 = graph->unk12C[0].unk2; y = graph->curPositions[GRAPH_COOL].y;
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[0], &graph->unk12C[1], 1, NULL); ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_COOL], &graph->curPositions[GRAPH_BEAUTY], TRUE, NULL);
} }
else else
{ {
r6 = graph->unk12C[1].unk2; y = graph->curPositions[GRAPH_BEAUTY].y;
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[1], &graph->unk12C[0], 0, NULL); ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_COOL], FALSE, NULL);
} }
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[1], &graph->unk12C[2], 1, NULL); // Calculate Beauty -> Cute line
// No need for conditional, positions on the Beauty line are always above the Cute line
ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_CUTE], TRUE, NULL);
i = (graph->unk12C[2].unk2 <= graph->unk12C[3].unk2); // Calculate Cute -> Tough line (includes left scanline because this crosses the halfway point)
sub_81D2278(graph, graph->unk140[0], &graph->unk12C[2], &graph->unk12C[3], i, graph->unk248[0]); i = (graph->curPositions[GRAPH_CUTE].y <= graph->curPositions[GRAPH_SMART].y);
for (i = 56; i < r6; i++) ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_CUTE], &graph->curPositions[GRAPH_SMART], i, graph->scanlineLeft[0]);
// Clear down to new top
for (i = CONDITION_GRAPH_TOP_Y; i < y; i++)
{ {
graph->unk140[i - 56][0] = 0; graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = 0;
graph->unk140[i - 56][1] = 0; graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][1] = 0;
} }
for (i = graph->unk12C[0].unk2; i <= graph->unk350; i++) for (i = graph->curPositions[GRAPH_COOL].y; i <= graph->bottom; i++)
graph->unk140[i - 56][0] = 155; graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = CONDITION_GRAPH_CENTER_X;
varMax = max(graph->unk350, graph->unk12C[2].unk2); // Clear after new bottom
for (i = varMax + 1; i < 122; i++) bottom = max(graph->bottom, graph->curPositions[GRAPH_CUTE].y);
for (i = bottom + 1; i <= CONDITION_GRAPH_BOTTOM_Y; i++)
{ {
graph->unk140[i - 56][0] = 0; graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = 0;
graph->unk140[i - 56][1] = 0; graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][1] = 0;
} }
for (i = 56; i < 122; i++) for (i = CONDITION_GRAPH_TOP_Y; i <= CONDITION_GRAPH_BOTTOM_Y; i++)
{ {
if (graph->unk140[i - 56][0] == 0 && graph->unk140[i - 56][1] != 0) if (graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] == 0
graph->unk140[i - 56][0] = 155; && graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][1] != 0)
graph->scanlineRight[i - CONDITION_GRAPH_TOP_Y][0] = CONDITION_GRAPH_CENTER_X;
} }
} }
static void sub_81D2634(struct ConditionGraph *graph) static void ConditionGraph_CalcLeftHalf(struct ConditionGraph *graph)
{ {
s32 i, r6, varMax; s32 i, y, bottom;
if (graph->unk12C[0].unk2 < graph->unk12C[4].unk2) // Calculate Cool -> Tough line
if (graph->curPositions[GRAPH_COOL].y < graph->curPositions[GRAPH_TOUGH].y)
{ {
r6 = graph->unk12C[0].unk2; y = graph->curPositions[GRAPH_COOL].y;
sub_81D2278(graph, graph->unk248[0], &graph->unk12C[0], &graph->unk12C[4], 0, NULL); ConditionGraph_CalcLine(graph, graph->scanlineLeft[0], &graph->curPositions[GRAPH_COOL], &graph->curPositions[GRAPH_TOUGH], FALSE, NULL);
} }
else else
{ {
r6 = graph->unk12C[4].unk2; y = graph->curPositions[GRAPH_TOUGH].y;
sub_81D2278(graph, graph->unk248[0], &graph->unk12C[4], &graph->unk12C[0], 1, NULL); ConditionGraph_CalcLine(graph, graph->scanlineLeft[0], &graph->curPositions[GRAPH_TOUGH], &graph->curPositions[GRAPH_COOL], TRUE, NULL);
} }
sub_81D2278(graph, graph->unk248[0], &graph->unk12C[4], &graph->unk12C[3], 0, NULL); // Calculate Tough -> Smart line
// No need for conditional, positions on the Tough line are always above the Smart line
ConditionGraph_CalcLine(graph, graph->scanlineLeft[0], &graph->curPositions[GRAPH_TOUGH], &graph->curPositions[GRAPH_SMART], FALSE, NULL);
for (i = 56; i < r6; i++) // Clear down to new top
for (i = CONDITION_GRAPH_TOP_Y; i < y; i++)
{ {
graph->unk140[i + 10][0] = 0; graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][0] = 0;
graph->unk140[i + 10][1] = 0; graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][1] = 0;
} }
for (i = graph->unk12C[0].unk2; i <= graph->unk350; i++) for (i = graph->curPositions[GRAPH_COOL].y; i <= graph->bottom; i++)
graph->unk140[i + 10][1] = 155; graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][1] = CONDITION_GRAPH_CENTER_X;
varMax = max(graph->unk350, graph->unk12C[3].unk2 + 1); // Clear after new bottom
for (i = varMax; i < 122; i++) bottom = max(graph->bottom, graph->curPositions[GRAPH_SMART].y + 1);
for (i = bottom; i <= CONDITION_GRAPH_BOTTOM_Y; i++)
{ {
graph->unk140[i + 10][0] = 0; graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][0] = 0;
graph->unk140[i + 10][1] = 0; graph->scanlineLeft[i - CONDITION_GRAPH_TOP_Y][1] = 0;
} }
for (i = 0; i < 66; i++) for (i = 0; i < CONDITION_GRAPH_HEIGHT; i++)
{ {
if (graph->unk248[i][0] >= graph->unk248[i][1]) if (graph->scanlineLeft[i][0] >= graph->scanlineLeft[i][1])
{ {
graph->unk248[i][1] = 0; graph->scanlineLeft[i][1] = 0;
graph->unk248[i][0] = 0; graph->scanlineLeft[i][0] = 0;
} }
} }
} }
void sub_81D2754(u8 *arg0, struct UnknownSubStruct_81D1ED4 *arg1) void ConditionGraph_CalcPositions(u8 *conditions, struct UCoords16 *positions)
{ {
u8 r2, r7; u8 lineLength, sinIdx;
s8 r12; s8 posIdx;
u16 i; u16 i;
r2 = sUnknown_08625410[*(arg0++)]; // Cool is straight up-and-down (not angled), so no need for Sin
arg1->unk0 = 155; lineLength = sConditionToLineLength[*(conditions++)];
arg1->unk2 = 91 - r2; positions[GRAPH_COOL].x = CONDITION_GRAPH_CENTER_X;
positions[GRAPH_COOL].y = CONDITION_GRAPH_CENTER_Y - lineLength;
r7 = 64; sinIdx = 64;
r12 = 0; posIdx = GRAPH_COOL;
for (i = 1; i < 5; i++) for (i = 1; i < CONDITION_COUNT; i++)
{ {
r7 += 51; sinIdx += 51;
if (--r12 < 0) if (--posIdx < 0)
r12 = 4; posIdx = CONDITION_COUNT - 1;
if (r12 == 2) if (posIdx == GRAPH_CUTE)
r7++; sinIdx++;
r2 = sUnknown_08625410[*(arg0++)]; lineLength = sConditionToLineLength[*(conditions++)];
arg1[r12].unk0 = 155 + ((r2 * gSineTable[64 + r7]) >> 8); positions[posIdx].x = CONDITION_GRAPH_CENTER_X + ((lineLength * gSineTable[64 + sinIdx]) >> 8);
arg1[r12].unk2 = 91 - ((r2 * gSineTable[r7]) >> 8); positions[posIdx].y = CONDITION_GRAPH_CENTER_Y - ((lineLength * gSineTable[sinIdx]) >> 8);
if (r12 < 3 && (r2 != 32 || r12 != 2)) if (posIdx <= GRAPH_CUTE && (lineLength != 32 || posIdx != GRAPH_CUTE))
arg1[r12].unk0 = 156 + ((r2 * gSineTable[64 + r7]) >> 8); positions[posIdx].x++;
} }
} }
//----------------
// Move relearner
//----------------
void InitMoveRelearnerWindows(bool8 useContextWindow) void InitMoveRelearnerWindows(bool8 useContextWindow)
{ {
u8 i; u8 i;
@@ -685,10 +710,8 @@ void InitMoveRelearnerWindows(bool8 useContextWindow)
LoadUserWindowBorderGfx(0, 1, 0xE0); LoadUserWindowBorderGfx(0, 1, 0xE0);
LoadPalette(gStandardMenuPalette, 0xF0, 0x20); LoadPalette(gStandardMenuPalette, 0xF0, 0x20);
for (i = 0; i < 5; i++) for (i = 0; i < ARRAY_COUNT(sMoveRelearnerWindowTemplates) - 1; i++)
{
FillWindowPixelBuffer(i, PIXEL_FILL(1)); FillWindowPixelBuffer(i, PIXEL_FILL(1));
}
if (!useContextWindow) if (!useContextWindow)
{ {
@@ -704,11 +727,11 @@ void InitMoveRelearnerWindows(bool8 useContextWindow)
PutWindowTilemap(3); PutWindowTilemap(3);
DrawStdFrameWithCustomTileAndPalette(2, 0, 1, 0xE); DrawStdFrameWithCustomTileAndPalette(2, 0, 1, 0xE);
DrawStdFrameWithCustomTileAndPalette(3, 0, 1, 0xE); DrawStdFrameWithCustomTileAndPalette(3, 0, 1, 0xE);
nullsub_79(); MoveRelearnerDummy();
ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(1);
} }
static void nullsub_79(void) static void MoveRelearnerDummy(void)
{ {
} }
@@ -720,13 +743,10 @@ u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices)
gMultiuseListMenuTemplate.items = items; gMultiuseListMenuTemplate.items = items;
if (numChoices < 6) if (numChoices < 6)
{
gMultiuseListMenuTemplate.maxShowed = numChoices; gMultiuseListMenuTemplate.maxShowed = numChoices;
}
else else
{
gMultiuseListMenuTemplate.maxShowed = 6; gMultiuseListMenuTemplate.maxShowed = 6;
}
return gMultiuseListMenuTemplate.maxShowed; return gMultiuseListMenuTemplate.maxShowed;
} }
@@ -734,7 +754,7 @@ static void MoveRelearnerLoadBattleMoveDescription(u32 chosenMove)
{ {
s32 x; s32 x;
const struct BattleMove *move; const struct BattleMove *move;
u8 buffer[0x20]; u8 buffer[32];
const u8 *str; const u8 *str;
FillWindowPixelBuffer(0, PIXEL_FILL(1)); FillWindowPixelBuffer(0, PIXEL_FILL(1));
@@ -856,6 +876,10 @@ void MoveRelearnerCreateYesNoMenu(void)
CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, 1, 0xE, 0); CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, 1, 0xE, 0);
} }
//----------------
// Condition menu
//----------------
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst) s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst)
{ {
s32 ret; s32 ret;
@@ -1010,7 +1034,7 @@ void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId
} }
} }
void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel) void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *numSparkles, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel)
{ {
u16 i; u16 i;
@@ -1019,25 +1043,23 @@ void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16
if (partyId != numMons) if (partyId != numMons)
{ {
graph->stat[id][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL); graph->conditions[id][CONDITION_COOL] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
graph->stat[id][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL); graph->conditions[id][CONDITION_TOUGH] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
graph->stat[id][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL); graph->conditions[id][CONDITION_SMART] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
graph->stat[id][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL); graph->conditions[id][CONDITION_CUTE] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
graph->stat[id][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL); graph->conditions[id][CONDITION_BEAUTY] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
sheen[id] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 0xFF) numSparkles[id] = GET_NUM_CONDITION_SPARKLES(GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL));
? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u
: 9;
sub_81D2754(graph->stat[id], graph->unk14[id]); ConditionGraph_CalcPositions(graph->conditions[id], graph->savedPositions[id]);
} }
else else
{ {
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
{ {
graph->stat[id][i] = 0; graph->conditions[id][i] = 0;
graph->unk14[id][i].unk0 = 155; graph->savedPositions[id][i].x = CONDITION_GRAPH_CENTER_X;
graph->unk14[id][i].unk2 = 91; graph->savedPositions[id][i].y = CONDITION_GRAPH_CENTER_Y;
} }
} }
} }
@@ -1076,17 +1098,17 @@ bool8 MoveConditionMonOffscreen(s16 *x)
return (*x != -80); return (*x != -80);
} }
bool8 TryUpdateConditionMonTransitionOn(struct ConditionGraph *graph, s16 *x) bool8 ConditionMenu_UpdateMonEnter(struct ConditionGraph *graph, s16 *x)
{ {
bool8 graphUpdating = TransitionConditionGraph(graph); bool8 graphUpdating = ConditionGraph_TryUpdate(graph);
bool8 monUpdating = MoveConditionMonOnscreen(x); bool8 monUpdating = MoveConditionMonOnscreen(x);
return (graphUpdating || monUpdating); return (graphUpdating || monUpdating);
} }
bool8 TryUpdateConditionMonTransitionOff(struct ConditionGraph *graph, s16 *x) bool8 ConditionMenu_UpdateMonExit(struct ConditionGraph *graph, s16 *x)
{ {
bool8 graphUpdating = TransitionConditionGraph(graph); bool8 graphUpdating = ConditionGraph_TryUpdate(graph);
bool8 monUpdating = MoveConditionMonOffscreen(x); bool8 monUpdating = MoveConditionMonOffscreen(x);
return (graphUpdating || monUpdating); return (graphUpdating || monUpdating);
@@ -1145,8 +1167,8 @@ static const union AnimCmd sAnim_ConditionSelectionIcon_Unselected[] =
static const union AnimCmd *const sAnims_ConditionSelectionIcon[] = static const union AnimCmd *const sAnims_ConditionSelectionIcon[] =
{ {
sAnim_ConditionSelectionIcon_Selected, [CONDITION_ICON_SELECTED] = sAnim_ConditionSelectionIcon_Selected,
sAnim_ConditionSelectionIcon_Unselected [CONDITION_ICON_UNSELECTED] = sAnim_ConditionSelectionIcon_Unselected
}; };
// Just loads the generic data, up to the caller to load the actual sheet/pal for the specific mon // Just loads the generic data, up to the caller to load the actual sheet/pal for the specific mon
+9 -9
View File
@@ -90,7 +90,7 @@ output_burst:
k = 0x0e; k = 0x0e;
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff) if (REG_SIOMULTI(i) != 0xffff)
{ {
break; break;
} }
@@ -102,7 +102,7 @@ output_burst:
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if (mp->client_bit & (1 << i)) if (mp->client_bit & (1 << i))
{ {
if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i))) if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i)))
@@ -141,7 +141,7 @@ output_burst:
mp->probe_target_bit = 0; mp->probe_target_bit = 0;
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if ((j >> 8) == MULTIBOOT_CLIENT_INFO) if ((j >> 8) == MULTIBOOT_CLIENT_INFO)
{ {
MultiBoot_required_data[i - 1] = j; MultiBoot_required_data[i - 1] = j;
@@ -166,7 +166,7 @@ output_burst:
{ {
if (mp->probe_target_bit & (1 << i)) if (mp->probe_target_bit & (1 << i))
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if (j != MultiBoot_required_data[i - 1]) if (j != MultiBoot_required_data[i - 1])
{ {
mp->probe_target_bit ^= 1 << i; mp->probe_target_bit ^= 1 << i;
@@ -179,7 +179,7 @@ output_burst:
k = 1; k = 1;
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
mp->client_data[i - 1] = j; mp->client_data[i - 1] = j;
if (mp->probe_target_bit & (1 << i)) if (mp->probe_target_bit & (1 << i))
{ {
@@ -214,7 +214,7 @@ output_burst:
case 0xd1: case 0xd1:
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if (mp->probe_target_bit & (1 << i)) if (mp->probe_target_bit & (1 << i))
{ {
if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY) if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY)
@@ -242,7 +242,7 @@ output_burst:
{ {
if (mp->probe_target_bit & (1 << i)) if (mp->probe_target_bit & (1 << i))
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1)) if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1))
|| ((j & 0xff) != (1 << i))) || ((j & 0xff) != (1 << i)))
{ {
@@ -391,7 +391,7 @@ static int MultiBootHandShake(struct MultiBootParam *mp)
default: default:
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if ((mp->client_bit & (1 << i)) if ((mp->client_bit & (1 << i))
&& j != must_data) && j != must_data)
{ {
@@ -413,7 +413,7 @@ static int MultiBootHandShake(struct MultiBootParam *mp)
case 0xe8: case 0xe8:
for (i = MULTIBOOT_NCHILD; i != 0; i--) for (i = MULTIBOOT_NCHILD; i != 0; i--)
{ {
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); j = REG_SIOMULTI(i);
if ((mp->client_bit & (1 << i)) && j != must_data) if ((mp->client_bit & (1 << i)) && j != must_data)
{ {
MultiBootInit(mp); MultiBootInit(mp);
+1 -1
View File
@@ -313,7 +313,7 @@ static const struct BgTemplate sOverworldBgTemplates[] =
static const struct ScanlineEffectParams sFlashEffectParams = static const struct ScanlineEffectParams sFlashEffectParams =
{ {
(void *)REG_ADDR_WIN0H, &REG_WIN0H,
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
1, 1,
0, 0,
+20 -21
View File
@@ -49,7 +49,6 @@ static void Task_RunLoopedTask(u8 taskId);
static void Task_Pokenav(u8 taskId); static void Task_Pokenav(u8 taskId);
static void CB2_InitPokenavForTutorial(void); static void CB2_InitPokenavForTutorial(void);
// TODO: Use MENU ids
const struct PokenavCallbacks PokenavMenuCallbacks[15] = const struct PokenavCallbacks PokenavMenuCallbacks[15] =
{ {
[POKENAV_MAIN_MENU - POKENAV_MENU_IDS_START] = [POKENAV_MAIN_MENU - POKENAV_MENU_IDS_START] =
@@ -122,15 +121,15 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
.free1 = FreeRegionMapSubstruct1, .free1 = FreeRegionMapSubstruct1,
.free2 = FreeRegionMapSubstruct2, .free2 = FreeRegionMapSubstruct2,
}, },
[POKENAV_CONDITION_PARTY - POKENAV_MENU_IDS_START] = [POKENAV_CONDITION_GRAPH_PARTY - POKENAV_MENU_IDS_START] =
{ {
.init = PokenavCallback_Init_PartyCondition, .init = PokenavCallback_Init_ConditionGraph_Party,
.callback = GetPartyConditionCallback, .callback = GetConditionGraphMenuCallback,
.open = OpenPartyConditionMenu, .open = OpenConditionGraphMenu,
.createLoopTask = CreatePartyConditionLoopedTask, .createLoopTask = CreateConditionGraphMenuLoopedTask,
.isLoopTaskActive = IsPartyConditionLoopedTaskActive, .isLoopTaskActive = IsConditionGraphMenuLoopedTaskActive,
.free1 = FreePartyConditionSubstruct1, .free1 = FreeConditionGraphMenuSubstruct1,
.free2 = FreePartyConditionSubstruct2, .free2 = FreeConditionGraphMenuSubstruct2,
}, },
[POKENAV_CONDITION_SEARCH_RESULTS - POKENAV_MENU_IDS_START] = [POKENAV_CONDITION_SEARCH_RESULTS - POKENAV_MENU_IDS_START] =
{ {
@@ -142,15 +141,15 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
.free1 = FreeSearchResultSubstruct1, .free1 = FreeSearchResultSubstruct1,
.free2 = FreeSearchResultSubstruct2, .free2 = FreeSearchResultSubstruct2,
}, },
[POKENAV_CONDITION_GRAPH_FROM_SEARCH - POKENAV_MENU_IDS_START] = [POKENAV_CONDITION_GRAPH_SEARCH - POKENAV_MENU_IDS_START] =
{ {
.init = PokenavCallback_Init_ConditionGraphFromSearch, .init = PokenavCallback_Init_ConditionGraph_Search,
.callback = GetPartyConditionCallback, .callback = GetConditionGraphMenuCallback,
.open = OpenPartyConditionMenu, .open = OpenConditionGraphMenu,
.createLoopTask = CreatePartyConditionLoopedTask, .createLoopTask = CreateConditionGraphMenuLoopedTask,
.isLoopTaskActive = IsPartyConditionLoopedTaskActive, .isLoopTaskActive = IsConditionGraphMenuLoopedTaskActive,
.free1 = FreePartyConditionSubstruct1, .free1 = FreeConditionGraphMenuSubstruct1,
.free2 = FreePartyConditionSubstruct2, .free2 = FreeConditionGraphMenuSubstruct2,
}, },
[POKENAV_RETURN_CONDITION_SEARCH - POKENAV_MENU_IDS_START] = [POKENAV_RETURN_CONDITION_SEARCH - POKENAV_MENU_IDS_START] =
{ {
@@ -179,8 +178,8 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
.open = OpenRibbonsMonList, .open = OpenRibbonsMonList,
.createLoopTask = CreateRibbonsMonListLoopedTask, .createLoopTask = CreateRibbonsMonListLoopedTask,
.isLoopTaskActive = IsRibbonsMonListLoopedTaskActive, .isLoopTaskActive = IsRibbonsMonListLoopedTaskActive,
.free1 = FreeRibbonsMonList1, .free1 = FreeRibbonsMonList,
.free2 = FreeRibbonsMonList2, .free2 = FreeRibbonsMonMenu,
}, },
[POKENAV_RIBBONS_SUMMARY_SCREEN - POKENAV_MENU_IDS_START] = [POKENAV_RIBBONS_SUMMARY_SCREEN - POKENAV_MENU_IDS_START] =
{ {
@@ -199,8 +198,8 @@ const struct PokenavCallbacks PokenavMenuCallbacks[15] =
.open = OpenRibbonsMonListFromRibbonsSummary, .open = OpenRibbonsMonListFromRibbonsSummary,
.createLoopTask = CreateRibbonsMonListLoopedTask, .createLoopTask = CreateRibbonsMonListLoopedTask,
.isLoopTaskActive = IsRibbonsMonListLoopedTaskActive, .isLoopTaskActive = IsRibbonsMonListLoopedTaskActive,
.free1 = FreeRibbonsMonList1, .free1 = FreeRibbonsMonList,
.free2 = FreeRibbonsMonList2, .free2 = FreeRibbonsMonMenu,
}, },
}; };
+630
View File
@@ -0,0 +1,630 @@
#include "global.h"
#include "data.h"
#include "decompress.h"
#include "main.h"
#include "menu_specialized.h"
#include "mon_markings.h"
#include "pokenav.h"
#include "pokemon.h"
#include "pokemon_storage_system.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
#include "constants/songs.h"
#define CONDITION_MONS_LOADED 3
struct Pokenav_ConditionMenu
{
u32 monPal[CONDITION_MONS_LOADED][0x20];
u8 fill[0x180];
u32 monPicGfx[CONDITION_MONS_LOADED][MON_PIC_SIZE];
bool8 inSearchMode;
s16 toLoadListIndex;
u32 (*callback)(struct Pokenav_ConditionMenu *);
u8 fill2[0x18];
u8 locationText[CONDITION_MONS_LOADED][24];
u8 nameText[CONDITION_MONS_LOADED][64];
struct ConditionGraph graph;
u8 numSparkles[CONDITION_MONS_LOADED];
u8 monMarks[CONDITION_MONS_LOADED];
s8 loadId;
s8 nextLoadIdDown;
s8 nextLoadIdUp;
s8 toLoadId;
u8 state;
};
static void InitPartyConditionListParameters(void);
static void InitSearchResultsConditionList(void);
static u32 HandleConditionMenuInput(struct Pokenav_ConditionMenu *);
static u32 GetConditionReturnCallback(struct Pokenav_ConditionMenu *);
static u32 OpenMarkingsMenu(struct Pokenav_ConditionMenu *);
static u8 ConditionGraphHandleDpadInput(struct Pokenav_ConditionMenu *);
static u8 SwitchConditionSummaryIndex(bool8);
static void CopyMonNameGenderLocation(s16, u8);
static void GetMonConditionGraphData(s16, u8);
static void ConditionGraphDrawMonPic(s16, u8);
bool32 PokenavCallback_Init_ConditionGraph_Party(void)
{
struct Pokenav_ConditionMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU, sizeof(struct Pokenav_ConditionMenu));
if (menu == NULL)
return FALSE;
ConditionGraph_Init(&menu->graph);
InitPartyConditionListParameters();
gKeyRepeatStartDelay = 20;
menu->callback = HandleConditionMenuInput;
return TRUE;
}
bool32 PokenavCallback_Init_ConditionGraph_Search(void)
{
struct Pokenav_ConditionMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU, sizeof(struct Pokenav_ConditionMenu));
if (menu == NULL)
return FALSE;
ConditionGraph_Init(&menu->graph);
InitSearchResultsConditionList();
gKeyRepeatStartDelay = 20;
menu->callback = HandleConditionMenuInput;
return TRUE;
}
u32 GetConditionGraphMenuCallback(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->callback(menu);
}
static u32 HandleConditionMenuInput(struct Pokenav_ConditionMenu *menu)
{
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
u32 ret = ConditionGraphHandleDpadInput(menu);
if (ret == CONDITION_FUNC_NONE)
{
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
menu->callback = GetConditionReturnCallback;
ret = CONDITION_FUNC_RETURN;
}
else if (JOY_NEW(A_BUTTON))
{
if (!menu->inSearchMode)
{
// In Party mode, pressing A only applies to the Cancel button
if (monListPtr->currIndex == monListPtr->listCount - 1)
{
// Cancel
PlaySE(SE_SELECT);
menu->callback = GetConditionReturnCallback;
ret = CONDITION_FUNC_RETURN;
}
}
else
{
// In Search mode pressing A brings up the markings menu
PlaySE(SE_SELECT);
ret = CONDITION_FUNC_ADD_MARKINGS;
menu->callback = OpenMarkingsMenu;
}
}
}
return ret;
}
static u32 OpenMarkingsMenu(struct Pokenav_ConditionMenu *menu)
{
struct PokenavMonList *monListPtr;
u8 markings;
u32 ret = CONDITION_FUNC_NONE, boxId, monId;
if (!HandleMonMarkingsMenuInput())
{
menu->monMarks[menu->loadId] = GetMonMarkingsData();
monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
boxId = monListPtr->monData[monListPtr->currIndex].boxId;
monId = monListPtr->monData[monListPtr->currIndex].monId;
markings = menu->monMarks[menu->loadId];
if (boxId == TOTAL_BOXES_COUNT)
SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings);
else
SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings);
menu->callback = HandleConditionMenuInput;
ret = CONDITION_FUNC_CLOSE_MARKINGS;
}
return ret;
}
static u32 GetConditionReturnCallback(struct Pokenav_ConditionMenu *menu)
{
if (!menu->inSearchMode)
return POKENAV_CONDITION_MENU;
else
return POKENAV_RETURN_CONDITION_SEARCH;
}
void FreeConditionGraphMenuSubstruct1(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
if (!menu->inSearchMode)
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
}
static u8 ConditionGraphHandleDpadInput(struct Pokenav_ConditionMenu *menu)
{
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
u8 ret = CONDITION_FUNC_NONE;
if (JOY_HELD(DPAD_UP))
{
// Prevent input wrapping in search mode
if (!menu->inSearchMode || monListPtr->currIndex != 0)
{
PlaySE(SE_SELECT);
ret = SwitchConditionSummaryIndex(TRUE);
}
}
else if (JOY_HELD(DPAD_DOWN))
{
// Prevent input wrapping in search mode
if (!menu->inSearchMode || monListPtr->currIndex < monListPtr->listCount - 1)
{
PlaySE(SE_SELECT);
ret = SwitchConditionSummaryIndex(FALSE);
}
}
return ret;
}
static u8 SwitchConditionSummaryIndex(u8 moveUp)
{
u16 newLoadId;
bool8 wasNotLastMon, isNotLastMon;
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
newLoadId = (moveUp) ? menu->nextLoadIdUp : menu->nextLoadIdDown;
ConditionGraph_SetNewPositions(&menu->graph, menu->graph.savedPositions[menu->loadId], menu->graph.savedPositions[newLoadId]);
wasNotLastMon = (monListPtr->currIndex != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1));
if (moveUp)
{
menu->nextLoadIdUp = menu->nextLoadIdDown;
menu->nextLoadIdDown = menu->loadId;
menu->loadId = newLoadId;
menu->toLoadId = menu->nextLoadIdUp;
monListPtr->currIndex = (monListPtr->currIndex == 0) ? monListPtr->listCount - 1 : monListPtr->currIndex - 1;
menu->toLoadListIndex = (monListPtr->currIndex != 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1;
}
else
{
menu->nextLoadIdDown = menu->nextLoadIdUp;
menu->nextLoadIdUp = menu->loadId;
menu->loadId = newLoadId;
menu->toLoadId = menu->nextLoadIdDown;
monListPtr->currIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
menu->toLoadListIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
}
isNotLastMon = (monListPtr->currIndex != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1));
if (!wasNotLastMon)
return CONDITION_FUNC_NO_TRANSITION;
else if (!isNotLastMon)
return CONDITION_FUNC_SLIDE_MON_OUT;
else
return CONDITION_FUNC_SLIDE_MON_IN;
}
bool32 LoadConditionGraphMenuGfx(void)
{
s32 var;
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
switch (menu->state)
{
case 0:
CopyMonNameGenderLocation(monListPtr->currIndex, 0);
break;
case 1:
GetMonConditionGraphData(monListPtr->currIndex, 0);
break;
case 2:
ConditionGraphDrawMonPic(monListPtr->currIndex, 0);
break;
case 3:
if (monListPtr->listCount == 1)
{
menu->loadId = 0;
menu->nextLoadIdDown = 0;
menu->nextLoadIdUp = 0;
menu->state = 0;
return TRUE;
}
else
{
menu->loadId = 0;
menu->nextLoadIdDown = 1;
menu->nextLoadIdUp = 2;
}
break;
// These were probably ternaries just like cases 7-9, but couldn't match it any other way.
case 4:
var = monListPtr->currIndex + 1;
if (var >= monListPtr->listCount)
var = 0;
CopyMonNameGenderLocation(var, 1);
break;
case 5:
var = monListPtr->currIndex + 1;
if (var >= monListPtr->listCount)
var = 0;
GetMonConditionGraphData(var, 1);
break;
case 6:
var = monListPtr->currIndex + 1;
if (var >= monListPtr->listCount)
var = 0;
ConditionGraphDrawMonPic(var, 1);
break;
case 7:
CopyMonNameGenderLocation((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
break;
case 8:
GetMonConditionGraphData((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
break;
case 9:
ConditionGraphDrawMonPic((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
menu->state = 0;
return TRUE;
}
menu->state++;
return FALSE;
}
bool32 LoadNextConditionMenuMonData(u8 mode)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
switch (mode)
{
case CONDITION_LOAD_MON_INFO:
CopyMonNameGenderLocation(menu->toLoadListIndex, menu->toLoadId);
break;
case CONDITION_LOAD_GRAPH:
GetMonConditionGraphData(menu->toLoadListIndex, menu->toLoadId);
break;
case CONDITION_LOAD_MON_PIC:
ConditionGraphDrawMonPic(menu->toLoadListIndex, menu->toLoadId);
return TRUE;
}
return FALSE;
}
u8 *CopyStringLeftAlignedToConditionData(u8 *dst, const u8 *src, s16 n)
{
while (*src != EOS)
*dst++ = *src++, n--;
while (n-- > 0)
*dst++ = CHAR_SPACE;
*dst = EOS;
return dst;
}
static u8 *CopyConditionMonNameGender(u8 *str, u16 listId, bool8 arg3)
{
u16 boxId, monId, gender, species, level, lvlDigits;
struct BoxPokemon *boxMon;
u8 *txtPtr, *str_;
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
boxId = monListPtr->monData[listId].boxId;
monId = monListPtr->monData[listId].monId;
*(str++) = EXT_CTRL_CODE_BEGIN;
*(str++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
*(str++) = TEXT_COLOR_BLUE;
*(str++) = TEXT_COLOR_TRANSPARENT;
*(str++) = TEXT_COLOR_LIGHT_BLUE;
if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL))
return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12);
GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str);
StringGetEnd10(str);
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL);
if (boxId == TOTAL_BOXES_COUNT)
{
level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
gender = GetMonGender(&gPlayerParty[monId]);
}
else
{
boxMon = GetBoxedMonPtr(boxId, monId);
gender = GetBoxMonGender(boxMon);
level = GetLevelFromBoxMonExp(boxMon);
}
if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species]))
gender = MON_GENDERLESS;
str_ = str; // For some reason, a variable is needed to match.
while (*str_ != EOS)
(str_++);
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_SKIP;
*(str_++) = 60;
switch (gender)
{
default:
*(str_++) = CHAR_SPACER; // Genderless
break;
case MON_MALE:
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_COLOR;
*(str_++) = TEXT_COLOR_RED;
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_SHADOW;
*(str_++) = TEXT_COLOR_LIGHT_RED;
*(str_++) = CHAR_MALE;
break;
case MON_FEMALE:
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_COLOR;
*(str_++) = TEXT_COLOR_GREEN;
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_SHADOW;
*(str_++) = TEXT_COLOR_LIGHT_GREEN;
*(str_++) = CHAR_FEMALE;
break;
}
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
*(str_++) = TEXT_COLOR_BLUE;
*(str_++) = TEXT_COLOR_TRANSPARENT;
*(str_++) = TEXT_COLOR_LIGHT_BLUE;
*(str_++) = CHAR_SLASH;
*(str_++) = CHAR_EXTRA_SYMBOL;
*(str_++) = CHAR_LV_2;
txtPtr = str_;
str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
lvlDigits = str_ - txtPtr;
*(str_++) = CHAR_SPACE;
if (!arg3)
{
lvlDigits = 3 - lvlDigits;
while (lvlDigits-- != 0)
*(str_++) = CHAR_SPACE;
}
*str_ = EOS;
return str_;
}
static void CopyMonNameGenderLocation(s16 listId, u8 loadId)
{
u16 boxId, i;
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (listId != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1))
{
CopyConditionMonNameGender(menu->nameText[loadId], listId, FALSE);
boxId = monListPtr->monData[listId].boxId;
menu->locationText[loadId][0] = EXT_CTRL_CODE_BEGIN;
menu->locationText[loadId][1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
menu->locationText[loadId][2] = TEXT_COLOR_BLUE;
menu->locationText[loadId][3] = TEXT_COLOR_TRANSPARENT;
menu->locationText[loadId][4] = TEXT_COLOR_LIGHT_BLUE;
if (boxId == TOTAL_BOXES_COUNT)
CopyStringLeftAlignedToConditionData(&menu->locationText[loadId][5], gText_InParty, BOX_NAME_LENGTH);
else
CopyStringLeftAlignedToConditionData(&menu->locationText[loadId][5], GetBoxNamePtr(boxId), BOX_NAME_LENGTH);
}
else
{
for (i = 0; i < 12; i++)
menu->nameText[loadId][i] = CHAR_SPACE;
menu->nameText[loadId][i] = EOS;
for (i = 0; i < BOX_NAME_LENGTH; i++)
menu->locationText[loadId][i] = CHAR_SPACE;
menu->locationText[loadId][i] = EOS;
}
}
static void InitPartyConditionListParameters(void)
{
u16 i, count;
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
struct PokenavMonList *monListPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavMonList));
menu->inSearchMode = FALSE;
for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++)
{
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
monListPtr->monData[count].boxId = TOTAL_BOXES_COUNT;
monListPtr->monData[count].monId = i;
monListPtr->monData[count].data = 0;
count++;
}
}
monListPtr->monData[count].boxId = 0;
monListPtr->monData[count].monId = 0;
monListPtr->monData[count].data = 0;
monListPtr->currIndex = 0;
monListPtr->listCount = count + 1;
menu->state = 0;
}
static void InitSearchResultsConditionList(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
menu->inSearchMode = TRUE;
menu->state = 0;
}
static void GetMonConditionGraphData(s16 listId, u8 loadId)
{
u16 boxId, monId, i;
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (listId != (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1))
{
boxId = monListPtr->monData[listId].boxId;
monId = monListPtr->monData[listId].monId;
menu->graph.conditions[loadId][CONDITION_COOL] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
menu->graph.conditions[loadId][CONDITION_TOUGH] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
menu->graph.conditions[loadId][CONDITION_SMART] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
menu->graph.conditions[loadId][CONDITION_CUTE] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
menu->graph.conditions[loadId][CONDITION_BEAUTY] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
menu->numSparkles[loadId] = GET_NUM_CONDITION_SPARKLES(GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL));
menu->monMarks[loadId] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL);
ConditionGraph_CalcPositions(menu->graph.conditions[loadId], menu->graph.savedPositions[loadId]);
}
else
{
// Set empty graph point
for (i = 0; i < CONDITION_COUNT; i++)
{
menu->graph.conditions[loadId][i] = 0;
menu->graph.savedPositions[loadId][i].x = CONDITION_GRAPH_CENTER_X;
menu->graph.savedPositions[loadId][i].y = CONDITION_GRAPH_CENTER_Y;
}
}
}
static void ConditionGraphDrawMonPic(s16 listId, u8 loadId)
{
u16 boxId, monId, species;
u32 personality, tid;
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (listId == (IsConditionMenuSearchMode() ? monListPtr->listCount : monListPtr->listCount - 1))
return;
boxId = monListPtr->monData[listId].boxId;
monId = monListPtr->monData[listId].monId;
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL);
tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL);
personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL);
LoadSpecialPokePic(&gMonFrontPicTable[species], menu->monPicGfx[loadId], species, personality, TRUE);
LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), menu->monPal[loadId]);
}
u16 GetMonListCount(void)
{
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
return monListPtr->listCount;
}
u16 GetConditionGraphCurrentListIndex(void)
{
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
return monListPtr->currIndex;
}
struct ConditionGraph *GetConditionGraphPtr(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return &menu->graph;
}
u8 GetConditionGraphMenuCurrentLoadIndex(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->loadId;
}
u8 GetConditionGraphMenuToLoadListIndex(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->toLoadListIndex;
}
void *GetConditionMonPicGfx(u8 loadId)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->monPicGfx[loadId];
}
void *GetConditionMonPal(u8 loadId)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->monPal[loadId];
}
u8 GetConditionGraphMenuToLoadId(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->toLoadId;
}
u8 *GetConditionMonNameText(u8 loadId)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->nameText[loadId];
}
u8 *GetConditionMonLocationText(u8 loadId)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->locationText[loadId];
}
u16 GetConditionMonDataBuffer(void)
{
struct PokenavMonList *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
return monListPtr->monData[monListPtr->currIndex].data;
}
bool32 IsConditionMenuSearchMode(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
if (menu->inSearchMode == TRUE)
return TRUE;
else
return FALSE;
}
// Markings are only shown in search mode
u8 TryGetMonMarkId(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
if (menu->inSearchMode == TRUE)
return menu->monMarks[menu->loadId];
else
return 0;
}
u8 GetNumConditionMonSparkles(void)
{
struct Pokenav_ConditionMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU);
return menu->numSparkles[menu->loadId];
}
-624
View File
@@ -1,624 +0,0 @@
#include "global.h"
#include "data.h"
#include "decompress.h"
#include "main.h"
#include "menu_specialized.h"
#include "mon_markings.h"
#include "pokenav.h"
#include "pokemon.h"
#include "pokemon_storage_system.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
#include "constants/songs.h"
struct PokenavSub11
{
u32 monPal[3][0x20];
u8 fill[0x180];
u32 monPicGfx[3][MON_PIC_SIZE];
u8 searchMode;
s16 monIndex;
u32 (*callback)(struct PokenavSub11 *);
u8 fill2[0x6320 - 0x6308];
u8 searchLocBuffer[3][24];
u8 nameBuffer[3][64];
struct ConditionGraph conditionData;
u8 sheen[3];
u8 monMarks[3];
s8 mark;
s8 unk6787;
s8 unk6788;
s8 unk6789;
u8 state;
};
void InitPartyConditionListParameters(void);
void sub_81CD9F8(void);
u32 HandlePartyConditionInput(struct PokenavSub11 *structPtr);
u32 GetConditionReturnCallback(struct PokenavSub11 *structPtr);
u32 ConditionMenu_OpenMarkingsMenu(struct PokenavSub11 *structPtr);
u8 ConditionGraphHandleDpadInput(struct PokenavSub11 *structPtr);
u8 SwitchConditionSummaryIndex(u8 moveUp);
void CopyMonNameGenderLocation(s16 id, u8 arg1);
void GetMonConditionGraphData(s16 id, u8 arg1);
void ConditionGraphDrawMonPic(s16 id, u8 arg1);
// code
bool32 PokenavCallback_Init_PartyCondition(void)
{
struct PokenavSub11 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH, sizeof(struct PokenavSub11));
if (structPtr == NULL)
return FALSE;
InitConditionGraphData(&structPtr->conditionData);
InitPartyConditionListParameters();
gKeyRepeatStartDelay = 20;
structPtr->callback = HandlePartyConditionInput;
return TRUE;
}
bool32 PokenavCallback_Init_ConditionGraphFromSearch(void)
{
struct PokenavSub11 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH, sizeof(struct PokenavSub11));
if (structPtr == NULL)
return FALSE;
InitConditionGraphData(&structPtr->conditionData);
sub_81CD9F8();
gKeyRepeatStartDelay = 20;
structPtr->callback = HandlePartyConditionInput;
return TRUE;
}
u32 GetPartyConditionCallback(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->callback(structPtr);
}
u32 HandlePartyConditionInput(struct PokenavSub11 *structPtr)
{
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
u32 ret = ConditionGraphHandleDpadInput(structPtr);
if (ret == PARTY_CONDITION_FUNC_NONE)
{
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
structPtr->callback = GetConditionReturnCallback;
ret = PARTY_CONDITION_FUNC_RETURN;
}
else if (JOY_NEW(A_BUTTON))
{
if (structPtr->searchMode == 0)
{
if (monListPtr->currIndex == monListPtr->listCount - 1)
{
PlaySE(SE_SELECT);
structPtr->callback = GetConditionReturnCallback;
ret = PARTY_CONDITION_FUNC_RETURN;
}
}
else
{
PlaySE(SE_SELECT);
ret = PARTY_CONDITION_FUNC_ADD_MARKINGS;
structPtr->callback = ConditionMenu_OpenMarkingsMenu;
}
}
}
return ret;
}
u32 ConditionMenu_OpenMarkingsMenu(struct PokenavSub11 *structPtr)
{
struct PokenavSub18 *monListPtr;
u8 markings;
u32 ret = PARTY_CONDITION_FUNC_NONE, boxId, monId;
if (!HandleMonMarkingsMenuInput())
{
structPtr->monMarks[structPtr->mark] = GetMonMarkingsData();
monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
boxId = monListPtr->monData[monListPtr->currIndex].boxId;
monId = monListPtr->monData[monListPtr->currIndex].monId;
markings = structPtr->monMarks[structPtr->mark];
if (boxId == TOTAL_BOXES_COUNT)
SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings);
else
SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings);
structPtr->callback = HandlePartyConditionInput;
ret = PARTY_CONDITION_FUNC_CLOSE_MARKINGS;
}
return ret;
}
u32 GetConditionReturnCallback(struct PokenavSub11 *structPtr)
{
if (structPtr->searchMode == 0)
return POKENAV_CONDITION_MENU;
else
return POKENAV_RETURN_CONDITION_SEARCH;
}
void FreePartyConditionSubstruct1(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
if (structPtr->searchMode == 0)
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
}
u8 ConditionGraphHandleDpadInput(struct PokenavSub11 *structPtr)
{
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
u8 ret = 0;
if (JOY_HELD(DPAD_UP))
{
if (structPtr->searchMode == 0 || monListPtr->currIndex != 0)
{
PlaySE(SE_SELECT);
ret = SwitchConditionSummaryIndex(1);
}
}
else if (JOY_HELD(DPAD_DOWN))
{
if (structPtr->searchMode == 0 || monListPtr->currIndex < monListPtr->listCount - 1)
{
PlaySE(SE_SELECT);
ret = SwitchConditionSummaryIndex(0);
}
}
return ret;
}
u8 SwitchConditionSummaryIndex(u8 moveUp)
{
u16 r7;
bool8 wasNotLastMon, isNotLastMon;
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
r7 = (moveUp) ? structPtr->unk6788 : structPtr->unk6787;
sub_81D1F84(&structPtr->conditionData, structPtr->conditionData.unk14[structPtr->mark], structPtr->conditionData.unk14[r7]);
wasNotLastMon = (monListPtr->currIndex != ((IsConditionMenuSearchMode() != 0) ? monListPtr->listCount : monListPtr->listCount - 1));
if (moveUp)
{
structPtr->unk6788 = structPtr->unk6787;
structPtr->unk6787 = structPtr->mark;
structPtr->mark = r7;
structPtr->unk6789 = structPtr->unk6788;
monListPtr->currIndex = (monListPtr->currIndex == 0) ? monListPtr->listCount - 1 : monListPtr->currIndex - 1;
structPtr->monIndex = (monListPtr->currIndex != 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1;
}
else
{
structPtr->unk6787 = structPtr->unk6788;
structPtr->unk6788 = structPtr->mark;
structPtr->mark = r7;
structPtr->unk6789 = structPtr->unk6787;
monListPtr->currIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
structPtr->monIndex = (monListPtr->currIndex < monListPtr->listCount - 1) ? monListPtr->currIndex + 1 : 0;
}
isNotLastMon = (monListPtr->currIndex != ((IsConditionMenuSearchMode() != 0) ? monListPtr->listCount : monListPtr->listCount - 1));
if (!wasNotLastMon)
return PARTY_CONDITION_FUNC_NO_TRANSITION;
else if (!isNotLastMon)
return PARTY_CONDITION_FUNC_SLIDE_MON_OUT;
else
return PARTY_CONDITION_FUNC_SLIDE_MON_IN;
}
bool32 LoadPartyConditionMenuGfx(void)
{
s32 var;
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
switch (structPtr->state)
{
case 0:
CopyMonNameGenderLocation(monListPtr->currIndex, 0);
break;
case 1:
GetMonConditionGraphData(monListPtr->currIndex, 0);
break;
case 2:
ConditionGraphDrawMonPic(monListPtr->currIndex, 0);
break;
case 3:
if (monListPtr->listCount == 1)
{
structPtr->mark = 0;
structPtr->unk6787 = 0;
structPtr->unk6788 = 0;
structPtr->state = 0;
return TRUE;
}
else
{
structPtr->mark = 0;
structPtr->unk6787 = 1;
structPtr->unk6788 = 2;
}
break;
// These were probably ternaries just like cases 7-9, but couldn't match it any other way.
case 4:
var = monListPtr->currIndex + 1;
if (var >= monListPtr->listCount)
var = 0;
CopyMonNameGenderLocation(var, 1);
break;
case 5:
var = monListPtr->currIndex + 1;
if (var >= monListPtr->listCount)
var = 0;
GetMonConditionGraphData(var, 1);
break;
case 6:
var = monListPtr->currIndex + 1;
if (var >= monListPtr->listCount)
var = 0;
ConditionGraphDrawMonPic(var, 1);
break;
case 7:
CopyMonNameGenderLocation((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
break;
case 8:
GetMonConditionGraphData((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
break;
case 9:
ConditionGraphDrawMonPic((monListPtr->currIndex - 1 >= 0) ? monListPtr->currIndex - 1 : monListPtr->listCount - 1, 2);
structPtr->state = 0;
return TRUE;
}
structPtr->state++;
return FALSE;
}
bool32 SetConditionGraphData(u8 mode)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
switch (mode)
{
case 0:
CopyMonNameGenderLocation(structPtr->monIndex, structPtr->unk6789);
break;
case 1:
GetMonConditionGraphData(structPtr->monIndex, structPtr->unk6789);
break;
case 2:
ConditionGraphDrawMonPic(structPtr->monIndex, structPtr->unk6789);
return TRUE;
}
return FALSE;
}
u8 *CopyStringLeftAlignedToConditionData(u8 *dst, const u8 *src, s16 n)
{
while (*src != EOS)
*dst++ = *src++, n--;
while (n-- > 0)
*dst++ = CHAR_SPACE;
*dst = EOS;
return dst;
}
u8 *CopyMonConditionNameGender(u8 *str, u16 id, bool8 arg3)
{
u16 boxId, monId, gender, species, level, lvlDigits;
struct BoxPokemon *boxMon;
u8 *txtPtr, *str_;
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
boxId = monListPtr->monData[id].boxId;
monId = monListPtr->monData[id].monId;
*(str++) = EXT_CTRL_CODE_BEGIN;
*(str++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
*(str++) = TEXT_COLOR_BLUE;
*(str++) = TEXT_COLOR_TRANSPARENT;
*(str++) = TEXT_COLOR_LIGHT_BLUE;
if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL))
return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12);
GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str);
StringGetEnd10(str);
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL);
if (boxId == TOTAL_BOXES_COUNT)
{
level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
gender = GetMonGender(&gPlayerParty[monId]);
}
else
{
boxMon = GetBoxedMonPtr(boxId, monId);
gender = GetBoxMonGender(boxMon);
level = GetLevelFromBoxMonExp(boxMon);
}
if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species]))
gender = MON_GENDERLESS;
str_ = str; // For some reason, a variable is needed to match.
while (*str_ != EOS)
(str_++);
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_SKIP;
*(str_++) = 60;
switch (gender)
{
default:
*(str_++) = CHAR_SPACER; // Genderless
break;
case MON_MALE:
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_COLOR;
*(str_++) = TEXT_COLOR_RED;
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_SHADOW;
*(str_++) = TEXT_COLOR_LIGHT_RED;
*(str_++) = CHAR_MALE;
break;
case MON_FEMALE:
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_COLOR;
*(str_++) = TEXT_COLOR_GREEN;
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_SHADOW;
*(str_++) = TEXT_COLOR_LIGHT_GREEN;
*(str_++) = CHAR_FEMALE;
break;
}
*(str_++) = EXT_CTRL_CODE_BEGIN;
*(str_++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
*(str_++) = TEXT_COLOR_BLUE;
*(str_++) = TEXT_COLOR_TRANSPARENT;
*(str_++) = TEXT_COLOR_LIGHT_BLUE;
*(str_++) = CHAR_SLASH;
*(str_++) = CHAR_EXTRA_SYMBOL;
*(str_++) = CHAR_LV_2;
txtPtr = str_;
str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
lvlDigits = str_ - txtPtr;
*(str_++) = CHAR_SPACE;
if (!arg3)
{
lvlDigits = 3 - lvlDigits;
while (lvlDigits-- != 0)
*(str_++) = CHAR_SPACE;
}
*str_ = EOS;
return str_;
}
void CopyMonNameGenderLocation(s16 id, u8 arg1)
{
u16 boxId, i;
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (id != (IsConditionMenuSearchMode() != 0 ? monListPtr->listCount : monListPtr->listCount - 1))
{
CopyMonConditionNameGender(structPtr->nameBuffer[arg1], id, FALSE);
boxId = monListPtr->monData[id].boxId;
structPtr->searchLocBuffer[arg1][0] = EXT_CTRL_CODE_BEGIN;
structPtr->searchLocBuffer[arg1][1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
structPtr->searchLocBuffer[arg1][2] = TEXT_COLOR_BLUE;
structPtr->searchLocBuffer[arg1][3] = TEXT_COLOR_TRANSPARENT;
structPtr->searchLocBuffer[arg1][4] = TEXT_COLOR_LIGHT_BLUE;
if (boxId == TOTAL_BOXES_COUNT)
CopyStringLeftAlignedToConditionData(&structPtr->searchLocBuffer[arg1][5], gText_InParty, 8);
else
CopyStringLeftAlignedToConditionData(&structPtr->searchLocBuffer[arg1][5], GetBoxNamePtr(boxId), BOX_NAME_LENGTH);
}
else
{
for (i = 0; i < 12; i++)
structPtr->nameBuffer[arg1][i] = CHAR_SPACE;
structPtr->nameBuffer[arg1][i] = EOS;
for (i = 0; i < 8; i++)
structPtr->searchLocBuffer[arg1][i] = CHAR_SPACE;
structPtr->searchLocBuffer[arg1][i] = EOS;
}
}
void InitPartyConditionListParameters(void)
{
u16 i, count;
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
struct PokenavSub18 *monListPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavSub18));
structPtr->searchMode = 0;
for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++)
{
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
monListPtr->monData[count].boxId = TOTAL_BOXES_COUNT;
monListPtr->monData[count].monId = i;
monListPtr->monData[count].data = 0;
count++;
}
}
monListPtr->monData[count].boxId = 0;
monListPtr->monData[count].monId = 0;
monListPtr->monData[count].data = 0;
monListPtr->currIndex = 0;
monListPtr->listCount = count + 1;
structPtr->state = 0;
}
void sub_81CD9F8(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
structPtr->searchMode = 1;
structPtr->state = 0;
}
void GetMonConditionGraphData(s16 id, u8 arg1)
{
u16 boxId, monId, i;
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (id != (IsConditionMenuSearchMode() != 0 ? monListPtr->listCount : monListPtr->listCount - 1))
{
boxId = monListPtr->monData[id].boxId;
monId = monListPtr->monData[id].monId;
structPtr->conditionData.stat[arg1][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
structPtr->conditionData.stat[arg1][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
structPtr->conditionData.stat[arg1][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
structPtr->conditionData.stat[arg1][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
structPtr->conditionData.stat[arg1][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
structPtr->sheen[arg1] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 255)
? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u
: 9;
structPtr->monMarks[arg1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL);
sub_81D2754(structPtr->conditionData.stat[arg1], structPtr->conditionData.unk14[arg1]);
}
else
{
for (i = 0; i < FLAVOR_COUNT; i++)
{
structPtr->conditionData.stat[arg1][i] = 0;
structPtr->conditionData.unk14[arg1][i].unk0 = 155;
structPtr->conditionData.unk14[arg1][i].unk2 = 91;
}
}
}
void ConditionGraphDrawMonPic(s16 index, u8 arg1)
{
u16 boxId, monId, species;
u32 personality, tid;
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (index == (IsConditionMenuSearchMode() != 0 ? monListPtr->listCount : monListPtr->listCount - 1))
return;
boxId = monListPtr->monData[index].boxId;
monId = monListPtr->monData[index].monId;
species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL);
tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL);
personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL);
LoadSpecialPokePic(&gMonFrontPicTable[species], structPtr->monPicGfx[arg1], species, personality, TRUE);
LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), structPtr->monPal[arg1]);
}
u16 GetMonListCount(void)
{
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
return monListPtr->listCount;
}
u16 GetConditionGraphCurrentMonIndex(void)
{
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
return monListPtr->currIndex;
}
struct ConditionGraph *GetConditionGraphDataPtr(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return &structPtr->conditionData;
}
u8 GetMonMarkIndex(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->mark;
}
u8 sub_81CDC9C(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->monIndex;
}
void *GetConditionMonPicGfx(u8 id)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->monPicGfx[id];
}
void *GetConditionMonPal(u8 id)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->monPal[id];
}
u8 sub_81CDCEC(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->unk6789;
}
u8 *GetConditionMonNameBuffer(u8 id)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->nameBuffer[id];
}
u8 *GetConditionMonLocationBuffer(u8 id)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->searchLocBuffer[id];
}
u16 GetConditionMonDataBuffer(void)
{
struct PokenavSub18 *monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
return monListPtr->monData[monListPtr->currIndex].data;
}
bool32 IsConditionMenuSearchMode(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
if (structPtr->searchMode == 1)
return TRUE;
else
return FALSE;
}
u8 TryGetMonMarkId(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
if (structPtr->searchMode == 1)
return structPtr->monMarks[structPtr->mark];
else
return 0;
}
u8 GetMonSheen(void)
{
struct PokenavSub11 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH);
return structPtr->sheen[structPtr->mark];
}
-885
View File
@@ -1,885 +0,0 @@
#include "global.h"
#include "bg.h"
#include "window.h"
#include "pokenav.h"
#include "decompress.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "menu.h"
#include "menu_specialized.h"
#include "mon_markings.h"
#include "palette.h"
#include "pokenav.h"
#include "scanline_effect.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
u32 LoopedTask_TransitionMons(s32);
u32 LoopedTask_ExitPartyConditionMenu(s32);
u32 LoopedTask_MoveCursorNoTransition(s32);
u32 LoopedTask_SlideMonOut(s32);
u32 LoopedTask_OpenMonMarkingsWindow(s32);
u32 LoopedTask_CloseMonMarkingsWindow(s32);
BSS_DATA u8 gUnknown_030012BC;
const u16 gConditionGraphData_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph_data.gbapal");
const u16 gConditionText_Pal[] = INCBIN_U16("graphics/pokenav/condition/text.gbapal");
const u32 gUnknown_08623228[] = INCBIN_U32("graphics/pokenav/8623228.4bpp.lz");
const u32 sConditionGraph_Tilemap[] = INCBIN_U32("graphics/pokenav/862323C.bin.lz");
const u16 sConditionGraphMonMarkingsPal[] = INCBIN_U16("graphics/pokenav/8623338.gbapal");
const struct BgTemplate sPartyConditionBgTemplates[3] =
{
{
.bg = 1,
.charBaseIndex = 1,
.mapBaseIndex = 0x1F,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 3,
.mapBaseIndex = 0x1D,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 2,
.mapBaseIndex = 0x1E,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
}
};
const struct WindowTemplate sMonNameGenderWindowTemplate =
{
.bg = 1,
.tilemapLeft = 13,
.tilemapTop = 1,
.width = 13,
.height = 4,
.paletteNum = 15,
.baseBlock = 2
};
const struct WindowTemplate sConditionGraphListIdWindowTemplate =
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 6,
.width = 7,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x36
};
const struct WindowTemplate sUnusedWindowTemplate1 =
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 0x1C,
.width = 5,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x44
};
const struct WindowTemplate sUnusedWindowTemplate2 =
{
.bg = 1,
.tilemapLeft = 13,
.tilemapTop = 0x1C,
.width = 3,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x44
};
const LoopedTask sPartyConditionLoopedTaskFuncs[] =
{
[PARTY_CONDITION_FUNC_NONE] = NULL,
[PARTY_CONDITION_FUNC_SLIDE_MON_IN] = LoopedTask_TransitionMons,
[PARTY_CONDITION_FUNC_RETURN] = LoopedTask_ExitPartyConditionMenu,
[PARTY_CONDITION_FUNC_NO_TRANSITION] = LoopedTask_MoveCursorNoTransition,
[PARTY_CONDITION_FUNC_SLIDE_MON_OUT] = LoopedTask_SlideMonOut,
[PARTY_CONDITION_FUNC_ADD_MARKINGS] = LoopedTask_OpenMonMarkingsWindow,
[PARTY_CONDITION_FUNC_CLOSE_MARKINGS] = LoopedTask_CloseMonMarkingsWindow
};
struct Pokenav7Struct
{
u32 loopedTaskId;
u8 tilemapBuffers[3][BG_SCREEN_SIZE];
u8 filler[2];
u8 partyPokeballSpriteIds[10];
u32 (*callback)(void);
s16 monTransitionX;
u8 monPicSpriteId;
u16 monPalIndex;
u16 monGfxTileStart;
void *unk181C;
u8 nameGenderWindowId;
u8 listIndexWindowId;
u8 unusedWindowId1;
u8 unusedWindowId2;
struct MonMarkingsMenu monMarks;
struct Sprite *monMarksSprite;
struct Sprite *conditionSparkleSprites[MAX_CONDITION_SPARKLES];
u8 windowModeState;
u8 filler2[0x38ac - 0x2909];
};
extern s8 GetMonMarkIndex(void); // This function's declaration here is s8 vs. u8 in pokenav_conditions_1.c
u32 LoopedTask_OpenPartyConditionGraph(s32 state);
u32 GetPartyConditionLoopedTaskActive(void);
void CreateConditionMonPic(u8 var);
void CreateMonMarkingsOrPokeballIndicators(void);
void CopyUnusedConditionWindowsToVram(void);
bool32 UpdateConditionGraphWindows(u8 a0, u16 a1, bool8 a2);
void sub_81CEE44(void);
void DoConditionGraphTransition(void);
void sub_81CEEC8(void);
void sub_81CEE68(void);
void ToggleBg2(bool8 showBg);
// code
bool32 OpenPartyConditionMenu(void)
{
struct Pokenav7Struct *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MON_MARK_MENU, sizeof(struct Pokenav7Struct));
if (structPtr == NULL)
return FALSE;
structPtr->monPicSpriteId = SPRITE_NONE;
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_OpenPartyConditionGraph, 1);
structPtr->callback = GetPartyConditionLoopedTaskActive;
structPtr->windowModeState = 0;
return TRUE;
}
void CreatePartyConditionLoopedTask(s32 id)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
structPtr->loopedTaskId = CreateLoopedTask(sPartyConditionLoopedTaskFuncs[id], 1);
structPtr->callback = GetPartyConditionLoopedTaskActive;
}
u32 IsPartyConditionLoopedTaskActive(void)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
return structPtr->callback();
}
u32 GetPartyConditionLoopedTaskActive(void)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
return IsLoopedTaskActive(structPtr->loopedTaskId);
}
u32 LoopedTask_OpenPartyConditionGraph(s32 state)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
switch (state)
{
case 0:
if (LoadPartyConditionMenuGfx() != TRUE)
return LT_PAUSE;
return LT_INC_AND_PAUSE;
case 1:
InitBgTemplates(sPartyConditionBgTemplates, ARRAY_COUNT(sPartyConditionBgTemplates));
ChangeBgX(1, 0, BG_COORD_SET);
ChangeBgY(1, 0, BG_COORD_SET);
ChangeBgX(2, 0, BG_COORD_SET);
ChangeBgY(2, 0, BG_COORD_SET);
ChangeBgX(3, 0, BG_COORD_SET);
ChangeBgY(3, 0, BG_COORD_SET);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
DecompressAndCopyTileDataToVram(3, gPokenavCondition_Gfx, 0, 0, 0);
return LT_INC_AND_PAUSE;
case 2:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
DecompressAndCopyTileDataToVram(2, gUnknown_08623228, 0, 0, 0);
return LT_INC_AND_PAUSE;
case 3:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
LZ77UnCompVram(gPokenavCondition_Tilemap, structPtr->tilemapBuffers[0]);
SetBgTilemapBuffer(3, structPtr->tilemapBuffers[0]);
if (IsConditionMenuSearchMode() == TRUE)
CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4);
CopyBgTilemapBufferToVram(3);
CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20);
CopyPaletteIntoBufferUnfaded(gConditionText_Pal, 0xF0, 0x20);
structPtr->monTransitionX = -80;
return LT_INC_AND_PAUSE;
case 4:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
LZ77UnCompVram(sConditionGraph_Tilemap, structPtr->tilemapBuffers[2]);
SetBgTilemapBuffer(2, structPtr->tilemapBuffers[2]);
CopyBgTilemapBufferToVram(2);
CopyPaletteIntoBufferUnfaded(gConditionGraphData_Pal, 0x30, 0x20);
SetConditionGraphIOWindows(2);
return LT_INC_AND_PAUSE;
case 5:
BgDmaFill(1, 0, 0, 1);
BgDmaFill(1, 17, 1, 1);
CpuFill32(0, structPtr->tilemapBuffers[1], BG_SCREEN_SIZE);
SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
return LT_INC_AND_PAUSE;
case 6:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
structPtr->nameGenderWindowId = AddWindow(&sMonNameGenderWindowTemplate);
if (IsConditionMenuSearchMode() == TRUE)
{
structPtr->listIndexWindowId = AddWindow(&sConditionGraphListIdWindowTemplate);
structPtr->unusedWindowId1 = AddWindow(&sUnusedWindowTemplate1);
structPtr->unusedWindowId2 = AddWindow(&sUnusedWindowTemplate2);
}
DeactivateAllTextPrinters();
return LT_INC_AND_PAUSE;
case 7:
CreateConditionMonPic(0);
return LT_INC_AND_PAUSE;
case 8:
CreateMonMarkingsOrPokeballIndicators();
return LT_INC_AND_PAUSE;
case 9:
if (IsConditionMenuSearchMode() == TRUE)
CopyUnusedConditionWindowsToVram();
return LT_INC_AND_PAUSE;
case 10:
UpdateConditionGraphWindows(0, GetMonMarkIndex(), TRUE);
return LT_INC_AND_PAUSE;
case 11:
UpdateConditionGraphWindows(1, GetMonMarkIndex(), TRUE);
return LT_INC_AND_PAUSE;
case 12:
UpdateConditionGraphWindows(2, GetMonMarkIndex(), TRUE);
return LT_INC_AND_PAUSE;
case 13:
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), TRUE) != TRUE)
return LT_PAUSE;
PutWindowTilemap(structPtr->nameGenderWindowId);
if (IsConditionMenuSearchMode() == TRUE)
{
PutWindowTilemap(structPtr->listIndexWindowId);
PutWindowTilemap(structPtr->unusedWindowId1);
PutWindowTilemap(structPtr->unusedWindowId2);
}
return LT_INC_AND_PAUSE;
case 14:
ShowBg(1);
HideBg(2);
ShowBg(3);
if (IsConditionMenuSearchMode() == TRUE)
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
return LT_INC_AND_PAUSE;
case 15:
PokenavFadeScreen(1);
if (!IsConditionMenuSearchMode())
{
LoadLeftHeaderGfxForIndex(POKENAV_GFX_PARTY_MENU);
ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, TRUE, 0);
ShowLeftHeaderGfx(POKENAV_GFX_PARTY_MENU, TRUE, 0);
}
return LT_INC_AND_PAUSE;
case 16:
if (IsPaletteFadeActive())
return LT_PAUSE;
if (!IsConditionMenuSearchMode() && AreLeftHeaderSpritesMoving())
return LT_PAUSE;
SetVBlankCallback_(sub_81CEE44);
return LT_INC_AND_PAUSE;
case 17:
DoConditionGraphTransition();
InitConditionGraphState(GetConditionGraphDataPtr());
return LT_INC_AND_PAUSE;
case 18:
if (SetupConditionGraphScanlineParams(GetConditionGraphDataPtr()))
return LT_PAUSE;
return LT_INC_AND_PAUSE;
case 19:
ToggleBg2(TRUE);
return LT_INC_AND_PAUSE;
case 20:
if (!TryUpdateConditionMonTransitionOn(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
{
ResetConditionSparkleSprites(structPtr->conditionSparkleSprites);
if (IsConditionMenuSearchMode() == TRUE || GetConditionGraphCurrentMonIndex() != GetMonListCount())
CreateConditionSparkleSprites(structPtr->conditionSparkleSprites, structPtr->monPicSpriteId, GetMonSheen());
return LT_FINISH;
}
return LT_PAUSE;
}
return LT_FINISH;
}
u32 LoopedTask_ExitPartyConditionMenu(s32 state)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
switch (state)
{
case 0:
sub_81CEEC8();
DestroyConditionSparkleSprites(structPtr->conditionSparkleSprites);
return LT_INC_AND_CONTINUE;
case 1:
if (TryUpdateConditionMonTransitionOff(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
return 2;
ToggleBg2(FALSE);
return LT_INC_AND_CONTINUE;
case 2:
PokenavFadeScreen(0);
if (!IsConditionMenuSearchMode())
SlideMenuHeaderDown();
return LT_INC_AND_PAUSE;
case 3:
if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy())
return LT_PAUSE;
FreeConditionSparkles(structPtr->conditionSparkleSprites);
HideBg(1);
HideBg(2);
HideBg(3);
return LT_INC_AND_CONTINUE;
}
return LT_FINISH;
}
u32 LoopedTask_TransitionMons(s32 state)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
struct ConditionGraph *unkPtr = GetConditionGraphDataPtr();
switch (state)
{
case 0:
SetConditionGraphData(0);
return LT_INC_AND_CONTINUE;
case 1:
SetConditionGraphData(1);
return LT_INC_AND_CONTINUE;
case 2:
SetConditionGraphData(2);
DestroyConditionSparkleSprites(structPtr->conditionSparkleSprites);
return LT_INC_AND_CONTINUE;
case 3:
TransitionConditionGraph(unkPtr);
return LT_INC_AND_CONTINUE;
case 4:
if (!MoveConditionMonOffscreen(&structPtr->monTransitionX))
{
CreateConditionMonPic(GetMonMarkIndex());
return LT_INC_AND_CONTINUE;
}
return LT_PAUSE;
case 5:
UpdateConditionGraphWindows(0, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 6:
UpdateConditionGraphWindows(1, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 7:
UpdateConditionGraphWindows(2, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 8:
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), FALSE) == TRUE)
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 9:
unkPtr = GetConditionGraphDataPtr();
if (!TryUpdateConditionMonTransitionOn(unkPtr, &structPtr->monTransitionX))
{
ResetConditionSparkleSprites(structPtr->conditionSparkleSprites);
if (IsConditionMenuSearchMode() != TRUE && GetConditionGraphCurrentMonIndex() == GetMonListCount())
return LT_INC_AND_CONTINUE;
CreateConditionSparkleSprites(structPtr->conditionSparkleSprites, structPtr->monPicSpriteId, GetMonSheen());
return LT_INC_AND_CONTINUE;
}
return LT_PAUSE;
}
return LT_FINISH;
}
u32 LoopedTask_MoveCursorNoTransition(s32 state)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
switch (state)
{
case 0:
SetConditionGraphData(0);
return LT_INC_AND_CONTINUE;
case 1:
SetConditionGraphData(1);
return LT_INC_AND_CONTINUE;
case 2:
SetConditionGraphData(2);
return LT_INC_AND_CONTINUE;
case 3:
CreateConditionMonPic(GetMonMarkIndex());
return LT_INC_AND_CONTINUE;
case 4:
UpdateConditionGraphWindows(0, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 5:
UpdateConditionGraphWindows(1, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 6:
UpdateConditionGraphWindows(2, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 7:
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), FALSE) == TRUE)
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 8:
if (!TryUpdateConditionMonTransitionOn(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
{
ResetConditionSparkleSprites(structPtr->conditionSparkleSprites);
CreateConditionSparkleSprites(structPtr->conditionSparkleSprites, structPtr->monPicSpriteId, GetMonSheen());
return LT_INC_AND_CONTINUE;
}
return LT_PAUSE;
}
return LT_FINISH;
}
u32 LoopedTask_SlideMonOut(s32 state)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
switch (state)
{
case 0:
SetConditionGraphData(0);
return LT_INC_AND_CONTINUE;
case 1:
SetConditionGraphData(1);
return LT_INC_AND_CONTINUE;
case 2:
SetConditionGraphData(2);
DestroyConditionSparkleSprites(structPtr->conditionSparkleSprites);
return LT_INC_AND_CONTINUE;
case 3:
if (!TryUpdateConditionMonTransitionOff(GetConditionGraphDataPtr(), &structPtr->monTransitionX))
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 4:
UpdateConditionGraphWindows(0, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 5:
UpdateConditionGraphWindows(1, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 6:
UpdateConditionGraphWindows(2, GetMonMarkIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 7:
if (UpdateConditionGraphWindows(3, GetMonMarkIndex(), FALSE) == TRUE)
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
}
return LT_FINISH;
}
u32 LoopedTask_OpenMonMarkingsWindow(s32 state)
{
switch (state)
{
case 0:
OpenMonMarkingsMenu(TryGetMonMarkId(), 176, 32);
return LT_INC_AND_CONTINUE;
case 1:
PrintHelpBarText(HELPBAR_CONDITION_MARKINGS);
return LT_INC_AND_CONTINUE;
case 2:
if (WaitForHelpBar() == TRUE)
return LT_PAUSE;
return LT_INC_AND_CONTINUE;
}
return LT_FINISH;
}
u32 LoopedTask_CloseMonMarkingsWindow(s32 state)
{
switch (state)
{
case 0:
FreeMonMarkingsMenu();
return LT_INC_AND_CONTINUE;
case 1:
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
return LT_INC_AND_CONTINUE;
case 2:
if (WaitForHelpBar() == TRUE)
return LT_PAUSE;
return LT_INC_AND_CONTINUE;
}
return LT_FINISH;
}
static u8 *UnusedPrintNumberString(u8 *dst, u16 num)
{
u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4);
txtPtr = StringCopy(txtPtr, gText_Number2);
return txtPtr;
}
bool32 UpdateConditionGraphWindows(u8 mode, u16 bufferIndex, bool8 winMode)
{
u8 text[32];
const u8 *str;
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
switch (mode)
{
case 0:
FillWindowPixelBuffer(structPtr->nameGenderWindowId, 0);
if (IsConditionMenuSearchMode() == TRUE)
FillWindowPixelBuffer(structPtr->listIndexWindowId, 0);
break;
case 1:
if (GetConditionGraphCurrentMonIndex() != GetMonListCount() - 1 || IsConditionMenuSearchMode() == TRUE)
{
str = GetConditionMonNameBuffer(bufferIndex);
AddTextPrinterParameterized(structPtr->nameGenderWindowId, FONT_NORMAL, str, 0, 1, 0, NULL);
}
break;
case 2:
if (IsConditionMenuSearchMode() == TRUE)
{
str = GetConditionMonLocationBuffer(bufferIndex);
AddTextPrinterParameterized(structPtr->nameGenderWindowId, FONT_NORMAL, str, 0, 17, 0, NULL);
text[0] = EXT_CTRL_CODE_BEGIN;
text[1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
text[2] = TEXT_COLOR_BLUE;
text[3] = TEXT_COLOR_TRANSPARENT;
text[4] = TEXT_COLOR_LIGHT_BLUE;
StringCopy(text + 5, gText_Number2);
AddTextPrinterParameterized(structPtr->listIndexWindowId, FONT_NORMAL, text, 4, 1, 0, NULL);
ConvertIntToDecimalStringN(text + 5, GetConditionMonDataBuffer(), STR_CONV_MODE_RIGHT_ALIGN, 4);
AddTextPrinterParameterized(structPtr->listIndexWindowId, FONT_NORMAL, text, 28, 1, 0, NULL);
}
break;
case 3:
switch (structPtr->windowModeState)
{
case 0:
if (winMode)
CopyWindowToVram(structPtr->nameGenderWindowId, COPYWIN_FULL);
else
CopyWindowToVram(structPtr->nameGenderWindowId, COPYWIN_GFX);
if (IsConditionMenuSearchMode() == TRUE)
{
structPtr->windowModeState++;
return FALSE;
}
else
{
structPtr->windowModeState = 0;
return TRUE;
}
case 1:
if (winMode)
CopyWindowToVram(structPtr->listIndexWindowId, COPYWIN_FULL);
else
CopyWindowToVram(structPtr->listIndexWindowId, COPYWIN_GFX);
structPtr->windowModeState = 0;
return TRUE;
}
}
return FALSE;
}
void CopyUnusedConditionWindowsToVram(void)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
CopyWindowToVram(structPtr->unusedWindowId1, COPYWIN_FULL);
CopyWindowToVram(structPtr->unusedWindowId2, COPYWIN_FULL);
}
void sub_81CE964(struct Sprite *sprite)
{
if (sprite->data[0] == GetConditionGraphCurrentMonIndex())
StartSpriteAnim(sprite, 0);
else
StartSpriteAnim(sprite, 1);
}
void HighlightCurrentPartyIndexPokeball(struct Sprite *sprite)
{
if (GetConditionGraphCurrentMonIndex() == GetMonListCount() - 1)
sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x65);
else
sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x66);
}
void MonMarkingsCallback(struct Sprite *sprite)
{
StartSpriteAnim(sprite, TryGetMonMarkId());
}
void CreateMonMarkingsOrPokeballIndicators(void)
{
struct SpriteSheet sprSheets[4];
struct SpriteTemplate sprTemplate;
struct SpritePalette sprPals[3];
struct SpriteSheet sprSheet;
struct Sprite *sprite;
u16 i, spriteId;
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
LoadConditionSelectionIcons(sprSheets, &sprTemplate, sprPals);
if (IsConditionMenuSearchMode() == TRUE)
{
structPtr->monMarks.baseTileTag = 0x6A;
structPtr->monMarks.basePaletteTag = 0x6A;
InitMonMarkingsMenu(&structPtr->monMarks);
BufferMonMarkingsMenuTiles();
sprite = CreateMonMarkingAllCombosSprite(0x69, 0x69, sConditionGraphMonMarkingsPal);
sprite->oam.priority = 3;
sprite->x = 192;
sprite->y = 32;
sprite->callback = MonMarkingsCallback;
structPtr->monMarksSprite = sprite;
PokenavFillPalette(IndexOfSpritePaletteTag(0x69), 0);
}
else
{
// party mode -> add pokeballs on right hand side
LoadSpriteSheets(sprSheets);
Pokenav_AllocAndLoadPalettes(sprPals);
for (i = 0; i < GetMonListCount() - 1; i++)
{
spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0);
if (spriteId != MAX_SPRITES)
{
structPtr->partyPokeballSpriteIds[i] = spriteId;
gSprites[spriteId].data[0] = i;
gSprites[spriteId].callback = sub_81CE964;
}
else
{
structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE;
}
}
sprTemplate.tileTag = 0x67;
sprTemplate.callback = SpriteCallbackDummy;
for (; i < 6; i++)
{
spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0);
if (spriteId != MAX_SPRITES)
{
structPtr->partyPokeballSpriteIds[i] = spriteId;
gSprites[spriteId].oam.size = 0;
}
else
{
structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE;
}
}
sprTemplate.tileTag = 0x66;
sprTemplate.callback = HighlightCurrentPartyIndexPokeball;
spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0);
if (spriteId != MAX_SPRITES)
{
structPtr->partyPokeballSpriteIds[i] = spriteId;
gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16);
gSprites[spriteId].oam.size = SPRITE_SIZE(32x16);
}
else
{
structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE;
}
}
LoadConditionSparkle(&sprSheet, &sprPals[0]);
LoadSpriteSheet(&sprSheet);
sprPals[1].data = NULL;
Pokenav_AllocAndLoadPalettes(sprPals);
}
void sub_81CEBF4(struct Pokenav7Struct *structPtr)
{
u8 i;
if (IsConditionMenuSearchMode() == TRUE)
{
DestroySprite(structPtr->monMarksSprite);
FreeSpriteTilesByTag(0x6A);
FreeSpriteTilesByTag(0x69);
FreeSpritePaletteByTag(0x6A);
FreeSpritePaletteByTag(0x69);
}
else
{
for (i = 0; i < 7; i++)
DestroySprite(&gSprites[structPtr->partyPokeballSpriteIds[i]]);
FreeSpriteTilesByTag(0x65);
FreeSpriteTilesByTag(0x66);
FreeSpriteTilesByTag(0x67);
FreeSpritePaletteByTag(0x65);
FreeSpritePaletteByTag(0x66);
}
if (structPtr->monPicSpriteId != SPRITE_NONE)
{
DestroySprite(&gSprites[structPtr->monPicSpriteId]);
FreeSpriteTilesByTag(0x64);
FreeSpritePaletteByTag(0x64);
}
}
void FreePartyConditionSubstruct2(void)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
RemoveWindow(structPtr->nameGenderWindowId);
if (IsConditionMenuSearchMode() == TRUE)
{
RemoveWindow(structPtr->listIndexWindowId);
RemoveWindow(structPtr->unusedWindowId1);
RemoveWindow(structPtr->unusedWindowId2);
}
else
{
SetLeftHeaderSpritesInvisibility();
}
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
sub_81CEBF4(structPtr);
sub_81CEE68();
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_MARK_MENU);
}
void MonPicGfxSpriteCallback(struct Sprite *sprite)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
sprite->x = structPtr->monTransitionX + 38;
}
void CreateConditionMonPic(u8 id)
{
struct SpriteTemplate sprTemplate;
struct SpriteSheet sprSheet;
struct SpritePalette sprPal;
u8 spriteId;
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
if (structPtr->monPicSpriteId == SPRITE_NONE)
{
LoadConditionMonPicTemplate(&sprSheet, &sprTemplate, &sprPal);
sprSheet.data = GetConditionMonPicGfx(id);
sprPal.data = GetConditionMonPal(id);
structPtr->monPalIndex = LoadSpritePalette(&sprPal);
structPtr->monGfxTileStart = LoadSpriteSheet(&sprSheet);
spriteId = CreateSprite(&sprTemplate, 38, 104, 0);
structPtr->monPicSpriteId = spriteId;
if (spriteId == MAX_SPRITES)
{
FreeSpriteTilesByTag(0x64);
FreeSpritePaletteByTag(0x64);
structPtr->monPicSpriteId = SPRITE_NONE;
}
else
{
structPtr->monPicSpriteId = spriteId;
gSprites[structPtr->monPicSpriteId].callback = MonPicGfxSpriteCallback;
structPtr->unk181C = (void*)(VRAM) + 0x10000 + (structPtr->monGfxTileStart * 32);
structPtr->monPalIndex = (structPtr->monPalIndex * 16) + 0x100;
}
}
else
{
DmaCopy16Defvars(3, GetConditionMonPicGfx(id), structPtr->unk181C, MON_PIC_SIZE);
LoadPalette(GetConditionMonPal(id), structPtr->monPalIndex, 0x20);
}
}
void sub_81CEE44(void)
{
struct ConditionGraph *unk = GetConditionGraphDataPtr();
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_81D2108(unk);
ScanlineEffect_InitHBlankDmaTransfer();
}
void sub_81CEE68(void)
{
SetPokenavVBlankCallback();
}
void ToggleBg2(bool8 showBg)
{
if (showBg)
ShowBg(2);
else
HideBg(2);
}
void DoConditionGraphTransition(void)
{
struct ConditionGraph *conditionPtr = GetConditionGraphDataPtr();
u8 id = GetMonMarkIndex();
gUnknown_030012BC = id;
sub_81D1F84(conditionPtr, conditionPtr->unk14[3], conditionPtr->unk14[id]);
TransitionConditionGraph(conditionPtr);
}
void sub_81CEEC8(void)
{
struct ConditionGraph *conditionPtr = GetConditionGraphDataPtr();
if (IsConditionMenuSearchMode() || GetConditionGraphCurrentMonIndex() != GetMonListCount() - 1)
sub_81D1F84(conditionPtr, conditionPtr->unk14[GetMonMarkIndex()], conditionPtr->unk14[3]);
}
u8 GetMonMarkingsData(void)
{
struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU);
if (IsConditionMenuSearchMode() == 1)
return structPtr->monMarks.markings;
else
return 0;
}
+892
View File
@@ -0,0 +1,892 @@
#include "global.h"
#include "bg.h"
#include "window.h"
#include "pokenav.h"
#include "decompress.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "menu.h"
#include "menu_specialized.h"
#include "mon_markings.h"
#include "palette.h"
#include "pokenav.h"
#include "scanline_effect.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
static u32 LoopedTask_TransitionMons(s32);
static u32 LoopedTask_ExitConditionGraphMenu(s32);
static u32 LoopedTask_MoveCursorNoTransition(s32);
static u32 LoopedTask_SlideMonOut(s32);
static u32 LoopedTask_OpenMonMarkingsWindow(s32);
static u32 LoopedTask_CloseMonMarkingsWindow(s32);
static u8 sInitialLoadId; // Never read
const u16 gConditionGraphData_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph_data.gbapal");
const u16 gConditionText_Pal[] = INCBIN_U16("graphics/pokenav/condition/text.gbapal");
static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph_data.4bpp.lz");
static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.lz");
static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/pokenav/condition/mon_markings.gbapal");
static const struct BgTemplate sMenuBgTemplates[3] =
{
{
.bg = 1,
.charBaseIndex = 1,
.mapBaseIndex = 0x1F,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 3,
.mapBaseIndex = 0x1D,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 2,
.mapBaseIndex = 0x1E,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
}
};
static const struct WindowTemplate sMonNameGenderWindowTemplate =
{
.bg = 1,
.tilemapLeft = 13,
.tilemapTop = 1,
.width = 13,
.height = 4,
.paletteNum = 15,
.baseBlock = 2
};
static const struct WindowTemplate sListIndexWindowTemplate =
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 6,
.width = 7,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x36
};
static const struct WindowTemplate sUnusedWindowTemplate1 =
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 0x1C,
.width = 5,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x44
};
static const struct WindowTemplate sUnusedWindowTemplate2 =
{
.bg = 1,
.tilemapLeft = 13,
.tilemapTop = 0x1C,
.width = 3,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x44
};
static const LoopedTask sLoopedTaskFuncs[] =
{
[CONDITION_FUNC_NONE] = NULL,
[CONDITION_FUNC_SLIDE_MON_IN] = LoopedTask_TransitionMons,
[CONDITION_FUNC_RETURN] = LoopedTask_ExitConditionGraphMenu,
[CONDITION_FUNC_NO_TRANSITION] = LoopedTask_MoveCursorNoTransition,
[CONDITION_FUNC_SLIDE_MON_OUT] = LoopedTask_SlideMonOut,
[CONDITION_FUNC_ADD_MARKINGS] = LoopedTask_OpenMonMarkingsWindow,
[CONDITION_FUNC_CLOSE_MARKINGS] = LoopedTask_CloseMonMarkingsWindow
};
struct Pokenav_ConditionMenuGfx
{
u32 loopedTaskId;
u8 tilemapBuffers[3][BG_SCREEN_SIZE];
u8 filler[2];
u8 partyPokeballSpriteIds[PARTY_SIZE + 1];
u32 (*callback)(void);
s16 monTransitionX;
u8 monPicSpriteId;
u16 monPalIndex;
u16 monGfxTileStart;
void *monGfxPtr;
u8 nameGenderWindowId;
u8 listIndexWindowId;
u8 unusedWindowId1;
u8 unusedWindowId2;
struct MonMarkingsMenu marksMenu;
struct Sprite *monMarksSprite;
struct Sprite *conditionSparkleSprites[MAX_CONDITION_SPARKLES];
u8 windowModeState;
u8 filler2[0xFA3];
};
extern s8 GetConditionGraphMenuCurrentLoadIndex(void); // This function's declaration here is s8 vs. u8 in pokenav_conditions.c
static u32 LoopedTask_OpenConditionGraphMenu(s32);
static u32 GetConditionGraphMenuLoopedTaskActive(void);
static void CreateConditionMonPic(u8);
static void CreateMonMarkingsOrPokeballIndicators(void);
static void CopyUnusedConditionWindowsToVram(void);
static bool32 UpdateConditionGraphMenuWindows(u8, u16, bool8);
static void VBlankCB_PokenavConditionGraph(void);
static void DoConditionGraphEnterTransition(void);
static void DoConditionGraphExitTransition(void);
static void SetExitVBlank(void);
static void ToggleGraphData(bool8);
bool32 OpenConditionGraphMenu(void)
{
struct Pokenav_ConditionMenuGfx *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX, sizeof(struct Pokenav_ConditionMenuGfx));
if (menu == NULL)
return FALSE;
menu->monPicSpriteId = SPRITE_NONE;
menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenConditionGraphMenu, 1);
menu->callback = GetConditionGraphMenuLoopedTaskActive;
menu->windowModeState = 0;
return TRUE;
}
void CreateConditionGraphMenuLoopedTask(s32 id)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
menu->loopedTaskId = CreateLoopedTask(sLoopedTaskFuncs[id], 1);
menu->callback = GetConditionGraphMenuLoopedTaskActive;
}
u32 IsConditionGraphMenuLoopedTaskActive(void)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
return menu->callback();
}
static u32 GetConditionGraphMenuLoopedTaskActive(void)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
return IsLoopedTaskActive(menu->loopedTaskId);
}
static u32 LoopedTask_OpenConditionGraphMenu(s32 state)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
switch (state)
{
case 0:
if (LoadConditionGraphMenuGfx() != TRUE)
return LT_PAUSE;
return LT_INC_AND_PAUSE;
case 1:
InitBgTemplates(sMenuBgTemplates, ARRAY_COUNT(sMenuBgTemplates));
ChangeBgX(1, 0, BG_COORD_SET);
ChangeBgY(1, 0, BG_COORD_SET);
ChangeBgX(2, 0, BG_COORD_SET);
ChangeBgY(2, 0, BG_COORD_SET);
ChangeBgX(3, 0, BG_COORD_SET);
ChangeBgY(3, 0, BG_COORD_SET);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
DecompressAndCopyTileDataToVram(3, gPokenavCondition_Gfx, 0, 0, 0);
return LT_INC_AND_PAUSE;
case 2:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
DecompressAndCopyTileDataToVram(2, sConditionGraphData_Gfx, 0, 0, 0);
return LT_INC_AND_PAUSE;
case 3:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
LZ77UnCompVram(gPokenavCondition_Tilemap, menu->tilemapBuffers[0]);
SetBgTilemapBuffer(3, menu->tilemapBuffers[0]);
if (IsConditionMenuSearchMode() == TRUE)
CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4);
CopyBgTilemapBufferToVram(3);
CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20);
CopyPaletteIntoBufferUnfaded(gConditionText_Pal, 0xF0, 0x20);
menu->monTransitionX = -80;
return LT_INC_AND_PAUSE;
case 4:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
LZ77UnCompVram(sConditionGraphData_Tilemap, menu->tilemapBuffers[2]);
SetBgTilemapBuffer(2, menu->tilemapBuffers[2]);
CopyBgTilemapBufferToVram(2);
CopyPaletteIntoBufferUnfaded(gConditionGraphData_Pal, 0x30, 0x20);
ConditionGraph_InitWindow(2);
return LT_INC_AND_PAUSE;
case 5:
BgDmaFill(1, 0, 0, 1);
BgDmaFill(1, 17, 1, 1);
CpuFill32(0, menu->tilemapBuffers[1], BG_SCREEN_SIZE);
SetBgTilemapBuffer(1, menu->tilemapBuffers[1]);
return LT_INC_AND_PAUSE;
case 6:
if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE;
menu->nameGenderWindowId = AddWindow(&sMonNameGenderWindowTemplate);
if (IsConditionMenuSearchMode() == TRUE)
{
menu->listIndexWindowId = AddWindow(&sListIndexWindowTemplate);
menu->unusedWindowId1 = AddWindow(&sUnusedWindowTemplate1);
menu->unusedWindowId2 = AddWindow(&sUnusedWindowTemplate2);
}
DeactivateAllTextPrinters();
return LT_INC_AND_PAUSE;
case 7:
CreateConditionMonPic(0);
return LT_INC_AND_PAUSE;
case 8:
CreateMonMarkingsOrPokeballIndicators();
return LT_INC_AND_PAUSE;
case 9:
if (IsConditionMenuSearchMode() == TRUE)
CopyUnusedConditionWindowsToVram();
return LT_INC_AND_PAUSE;
case 10:
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), TRUE);
return LT_INC_AND_PAUSE;
case 11:
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), TRUE);
return LT_INC_AND_PAUSE;
case 12:
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), TRUE);
return LT_INC_AND_PAUSE;
case 13:
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), TRUE) != TRUE)
return LT_PAUSE;
PutWindowTilemap(menu->nameGenderWindowId);
if (IsConditionMenuSearchMode() == TRUE)
{
PutWindowTilemap(menu->listIndexWindowId);
PutWindowTilemap(menu->unusedWindowId1);
PutWindowTilemap(menu->unusedWindowId2);
}
return LT_INC_AND_PAUSE;
case 14:
ShowBg(1);
HideBg(2);
ShowBg(3);
if (IsConditionMenuSearchMode() == TRUE)
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
return LT_INC_AND_PAUSE;
case 15:
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
if (!IsConditionMenuSearchMode())
{
LoadLeftHeaderGfxForIndex(POKENAV_GFX_PARTY_MENU);
ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, TRUE, 0);
ShowLeftHeaderGfx(POKENAV_GFX_PARTY_MENU, TRUE, 0);
}
return LT_INC_AND_PAUSE;
case 16:
if (IsPaletteFadeActive())
return LT_PAUSE;
if (!IsConditionMenuSearchMode() && AreLeftHeaderSpritesMoving())
return LT_PAUSE;
SetVBlankCallback_(VBlankCB_PokenavConditionGraph);
return LT_INC_AND_PAUSE;
case 17:
DoConditionGraphEnterTransition();
ConditionGraph_InitResetScanline(GetConditionGraphPtr());
return LT_INC_AND_PAUSE;
case 18:
if (ConditionGraph_ResetScanline(GetConditionGraphPtr()))
return LT_PAUSE;
return LT_INC_AND_PAUSE;
case 19:
ToggleGraphData(TRUE);
return LT_INC_AND_PAUSE;
case 20:
if (!ConditionMenu_UpdateMonEnter(GetConditionGraphPtr(), &menu->monTransitionX))
{
ResetConditionSparkleSprites(menu->conditionSparkleSprites);
if (IsConditionMenuSearchMode() == TRUE || GetConditionGraphCurrentListIndex() != GetMonListCount())
CreateConditionSparkleSprites(menu->conditionSparkleSprites, menu->monPicSpriteId, GetNumConditionMonSparkles());
return LT_FINISH;
}
return LT_PAUSE;
}
return LT_FINISH;
}
static u32 LoopedTask_ExitConditionGraphMenu(s32 state)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
switch (state)
{
case 0:
DoConditionGraphExitTransition();
DestroyConditionSparkleSprites(menu->conditionSparkleSprites);
return LT_INC_AND_CONTINUE;
case 1:
if (ConditionMenu_UpdateMonExit(GetConditionGraphPtr(), &menu->monTransitionX))
return 2;
ToggleGraphData(FALSE);
return LT_INC_AND_CONTINUE;
case 2:
PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
if (!IsConditionMenuSearchMode())
SlideMenuHeaderDown();
return LT_INC_AND_PAUSE;
case 3:
if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy())
return LT_PAUSE;
FreeConditionSparkles(menu->conditionSparkleSprites);
HideBg(1);
HideBg(2);
HideBg(3);
return LT_INC_AND_CONTINUE;
}
return LT_FINISH;
}
static u32 LoopedTask_TransitionMons(s32 state)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
struct ConditionGraph *graph = GetConditionGraphPtr();
switch (state)
{
case 0:
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_INFO);
return LT_INC_AND_CONTINUE;
case 1:
LoadNextConditionMenuMonData(CONDITION_LOAD_GRAPH);
return LT_INC_AND_CONTINUE;
case 2:
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_PIC);
DestroyConditionSparkleSprites(menu->conditionSparkleSprites);
return LT_INC_AND_CONTINUE;
case 3:
ConditionGraph_TryUpdate(graph);
return LT_INC_AND_CONTINUE;
case 4:
if (!MoveConditionMonOffscreen(&menu->monTransitionX))
{
CreateConditionMonPic(GetConditionGraphMenuCurrentLoadIndex());
return LT_INC_AND_CONTINUE;
}
return LT_PAUSE;
case 5:
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 6:
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 7:
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 8:
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), FALSE) == TRUE)
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 9:
graph = GetConditionGraphPtr();
if (!ConditionMenu_UpdateMonEnter(graph, &menu->monTransitionX))
{
ResetConditionSparkleSprites(menu->conditionSparkleSprites);
if (IsConditionMenuSearchMode() != TRUE && GetConditionGraphCurrentListIndex() == GetMonListCount())
return LT_INC_AND_CONTINUE;
CreateConditionSparkleSprites(menu->conditionSparkleSprites, menu->monPicSpriteId, GetNumConditionMonSparkles());
return LT_INC_AND_CONTINUE;
}
return LT_PAUSE;
}
return LT_FINISH;
}
static u32 LoopedTask_MoveCursorNoTransition(s32 state)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
switch (state)
{
case 0:
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_INFO);
return LT_INC_AND_CONTINUE;
case 1:
LoadNextConditionMenuMonData(CONDITION_LOAD_GRAPH);
return LT_INC_AND_CONTINUE;
case 2:
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_PIC);
return LT_INC_AND_CONTINUE;
case 3:
CreateConditionMonPic(GetConditionGraphMenuCurrentLoadIndex());
return LT_INC_AND_CONTINUE;
case 4:
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 5:
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 6:
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 7:
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), FALSE) == TRUE)
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 8:
if (!ConditionMenu_UpdateMonEnter(GetConditionGraphPtr(), &menu->monTransitionX))
{
ResetConditionSparkleSprites(menu->conditionSparkleSprites);
CreateConditionSparkleSprites(menu->conditionSparkleSprites, menu->monPicSpriteId, GetNumConditionMonSparkles());
return LT_INC_AND_CONTINUE;
}
return LT_PAUSE;
}
return LT_FINISH;
}
static u32 LoopedTask_SlideMonOut(s32 state)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
switch (state)
{
case 0:
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_INFO);
return LT_INC_AND_CONTINUE;
case 1:
LoadNextConditionMenuMonData(CONDITION_LOAD_GRAPH);
return LT_INC_AND_CONTINUE;
case 2:
LoadNextConditionMenuMonData(CONDITION_LOAD_MON_PIC);
DestroyConditionSparkleSprites(menu->conditionSparkleSprites);
return LT_INC_AND_CONTINUE;
case 3:
if (!ConditionMenu_UpdateMonExit(GetConditionGraphPtr(), &menu->monTransitionX))
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 4:
UpdateConditionGraphMenuWindows(0, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 5:
UpdateConditionGraphMenuWindows(1, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 6:
UpdateConditionGraphMenuWindows(2, GetConditionGraphMenuCurrentLoadIndex(), FALSE);
return LT_INC_AND_CONTINUE;
case 7:
if (UpdateConditionGraphMenuWindows(3, GetConditionGraphMenuCurrentLoadIndex(), FALSE) == TRUE)
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
}
return LT_FINISH;
}
static u32 LoopedTask_OpenMonMarkingsWindow(s32 state)
{
switch (state)
{
case 0:
OpenMonMarkingsMenu(TryGetMonMarkId(), 176, 32);
return LT_INC_AND_CONTINUE;
case 1:
PrintHelpBarText(HELPBAR_CONDITION_MARKINGS);
return LT_INC_AND_CONTINUE;
case 2:
if (WaitForHelpBar() == TRUE)
return LT_PAUSE;
return LT_INC_AND_CONTINUE;
}
return LT_FINISH;
}
static u32 LoopedTask_CloseMonMarkingsWindow(s32 state)
{
switch (state)
{
case 0:
FreeMonMarkingsMenu();
return LT_INC_AND_CONTINUE;
case 1:
PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS);
return LT_INC_AND_CONTINUE;
case 2:
if (WaitForHelpBar() == TRUE)
return LT_PAUSE;
return LT_INC_AND_CONTINUE;
}
return LT_FINISH;
}
static u8 *UnusedPrintNumberString(u8 *dst, u16 num)
{
u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4);
txtPtr = StringCopy(txtPtr, gText_Number2);
return txtPtr;
}
static bool32 UpdateConditionGraphMenuWindows(u8 mode, u16 bufferIndex, bool8 winMode)
{
u8 text[32];
const u8 *str;
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
switch (mode)
{
case 0:
FillWindowPixelBuffer(menu->nameGenderWindowId, 0);
if (IsConditionMenuSearchMode() == TRUE)
FillWindowPixelBuffer(menu->listIndexWindowId, 0);
break;
case 1:
if (GetConditionGraphCurrentListIndex() != GetMonListCount() - 1 || IsConditionMenuSearchMode() == TRUE)
{
str = GetConditionMonNameText(bufferIndex);
AddTextPrinterParameterized(menu->nameGenderWindowId, FONT_NORMAL, str, 0, 1, 0, NULL);
}
break;
case 2:
if (IsConditionMenuSearchMode() == TRUE)
{
str = GetConditionMonLocationText(bufferIndex);
AddTextPrinterParameterized(menu->nameGenderWindowId, FONT_NORMAL, str, 0, 17, 0, NULL);
text[0] = EXT_CTRL_CODE_BEGIN;
text[1] = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
text[2] = TEXT_COLOR_BLUE;
text[3] = TEXT_COLOR_TRANSPARENT;
text[4] = TEXT_COLOR_LIGHT_BLUE;
StringCopy(&text[5], gText_Number2);
AddTextPrinterParameterized(menu->listIndexWindowId, FONT_NORMAL, text, 4, 1, 0, NULL);
ConvertIntToDecimalStringN(&text[5], GetConditionMonDataBuffer(), STR_CONV_MODE_RIGHT_ALIGN, 4);
AddTextPrinterParameterized(menu->listIndexWindowId, FONT_NORMAL, text, 28, 1, 0, NULL);
}
break;
case 3:
switch (menu->windowModeState)
{
case 0:
if (winMode)
CopyWindowToVram(menu->nameGenderWindowId, COPYWIN_FULL);
else
CopyWindowToVram(menu->nameGenderWindowId, COPYWIN_GFX);
if (IsConditionMenuSearchMode() == TRUE)
{
menu->windowModeState++;
return FALSE;
}
else
{
menu->windowModeState = 0;
return TRUE;
}
case 1:
if (winMode)
CopyWindowToVram(menu->listIndexWindowId, COPYWIN_FULL);
else
CopyWindowToVram(menu->listIndexWindowId, COPYWIN_GFX);
menu->windowModeState = 0;
return TRUE;
}
}
return FALSE;
}
static void CopyUnusedConditionWindowsToVram(void)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
CopyWindowToVram(menu->unusedWindowId1, COPYWIN_FULL);
CopyWindowToVram(menu->unusedWindowId2, COPYWIN_FULL);
}
static void SpriteCB_PartyPokeball(struct Sprite *sprite)
{
if (sprite->data[0] == GetConditionGraphCurrentListIndex())
StartSpriteAnim(sprite, CONDITION_ICON_SELECTED);
else
StartSpriteAnim(sprite, CONDITION_ICON_UNSELECTED);
}
void HighlightCurrentPartyIndexPokeball(struct Sprite *sprite)
{
if (GetConditionGraphCurrentListIndex() == GetMonListCount() - 1)
sprite->oam.paletteNum = IndexOfSpritePaletteTag(TAG_CONDITION_BALL);
else
sprite->oam.paletteNum = IndexOfSpritePaletteTag(TAG_CONDITION_CANCEL);
}
void MonMarkingsCallback(struct Sprite *sprite)
{
StartSpriteAnim(sprite, TryGetMonMarkId());
}
static void CreateMonMarkingsOrPokeballIndicators(void)
{
struct SpriteSheet sprSheets[4];
struct SpriteTemplate sprTemplate;
struct SpritePalette sprPals[3];
struct SpriteSheet sprSheet;
struct Sprite *sprite;
u16 i, spriteId;
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
LoadConditionSelectionIcons(sprSheets, &sprTemplate, sprPals);
if (IsConditionMenuSearchMode() == TRUE)
{
// Search Mode, load markings menu
menu->marksMenu.baseTileTag = TAG_CONDITION_MARKINGS_MENU;
menu->marksMenu.basePaletteTag = TAG_CONDITION_MARKINGS_MENU;
InitMonMarkingsMenu(&menu->marksMenu);
BufferMonMarkingsMenuTiles();
sprite = CreateMonMarkingAllCombosSprite(TAG_CONDITION_MON_MARKINGS, TAG_CONDITION_MON_MARKINGS, sMonMarkings_Pal);
sprite->oam.priority = 3;
sprite->x = 192;
sprite->y = 32;
sprite->callback = MonMarkingsCallback;
menu->monMarksSprite = sprite;
PokenavFillPalette(IndexOfSpritePaletteTag(TAG_CONDITION_MON_MARKINGS), 0);
}
else
{
// Party Mode, load Pokéball selection icons
LoadSpriteSheets(sprSheets);
Pokenav_AllocAndLoadPalettes(sprPals);
// Add icons for occupied slots
for (i = 0; i < GetMonListCount() - 1; i++)
{
spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0);
if (spriteId != MAX_SPRITES)
{
menu->partyPokeballSpriteIds[i] = spriteId;
gSprites[spriteId].data[0] = i;
gSprites[spriteId].callback = SpriteCB_PartyPokeball;
}
else
{
menu->partyPokeballSpriteIds[i] = SPRITE_NONE;
}
}
// Add icons for empty slots
sprTemplate.tileTag = TAG_CONDITION_BALL_PLACEHOLDER;
sprTemplate.callback = SpriteCallbackDummy;
for (; i < PARTY_SIZE; i++)
{
spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0);
if (spriteId != MAX_SPRITES)
{
menu->partyPokeballSpriteIds[i] = spriteId;
gSprites[spriteId].oam.size = 0;
}
else
{
menu->partyPokeballSpriteIds[i] = SPRITE_NONE;
}
}
// Add cancel icon
sprTemplate.tileTag = TAG_CONDITION_CANCEL;
sprTemplate.callback = HighlightCurrentPartyIndexPokeball;
spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0);
if (spriteId != MAX_SPRITES)
{
menu->partyPokeballSpriteIds[i] = spriteId;
gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16);
gSprites[spriteId].oam.size = SPRITE_SIZE(32x16);
}
else
{
menu->partyPokeballSpriteIds[i] = SPRITE_NONE;
}
}
LoadConditionSparkle(&sprSheet, &sprPals[0]);
LoadSpriteSheet(&sprSheet);
sprPals[1].data = NULL;
Pokenav_AllocAndLoadPalettes(sprPals);
}
static void FreeConditionMenuGfx(struct Pokenav_ConditionMenuGfx *menu)
{
u8 i;
if (IsConditionMenuSearchMode() == TRUE)
{
DestroySprite(menu->monMarksSprite);
FreeSpriteTilesByTag(TAG_CONDITION_MARKINGS_MENU);
FreeSpriteTilesByTag(TAG_CONDITION_MON_MARKINGS);
FreeSpritePaletteByTag(TAG_CONDITION_MARKINGS_MENU);
FreeSpritePaletteByTag(TAG_CONDITION_MON_MARKINGS);
}
else
{
for (i = 0; i < PARTY_SIZE + 1; i++)
DestroySprite(&gSprites[menu->partyPokeballSpriteIds[i]]);
FreeSpriteTilesByTag(TAG_CONDITION_BALL);
FreeSpriteTilesByTag(TAG_CONDITION_CANCEL);
FreeSpriteTilesByTag(TAG_CONDITION_BALL_PLACEHOLDER);
FreeSpritePaletteByTag(TAG_CONDITION_BALL);
FreeSpritePaletteByTag(TAG_CONDITION_CANCEL);
}
if (menu->monPicSpriteId != SPRITE_NONE)
{
DestroySprite(&gSprites[menu->monPicSpriteId]);
FreeSpriteTilesByTag(TAG_CONDITION_MON);
FreeSpritePaletteByTag(TAG_CONDITION_MON);
}
}
void FreeConditionGraphMenuSubstruct2(void)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
RemoveWindow(menu->nameGenderWindowId);
if (IsConditionMenuSearchMode() == TRUE)
{
RemoveWindow(menu->listIndexWindowId);
RemoveWindow(menu->unusedWindowId1);
RemoveWindow(menu->unusedWindowId2);
}
else
{
SetLeftHeaderSpritesInvisibility();
}
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
FreeConditionMenuGfx(menu);
SetExitVBlank();
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
}
void MonPicGfxSpriteCallback(struct Sprite *sprite)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
sprite->x = menu->monTransitionX + 38;
}
static void CreateConditionMonPic(u8 id)
{
struct SpriteTemplate sprTemplate;
struct SpriteSheet sprSheet;
struct SpritePalette sprPal;
u8 spriteId;
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
if (menu->monPicSpriteId == SPRITE_NONE)
{
LoadConditionMonPicTemplate(&sprSheet, &sprTemplate, &sprPal);
sprSheet.data = GetConditionMonPicGfx(id);
sprPal.data = GetConditionMonPal(id);
menu->monPalIndex = LoadSpritePalette(&sprPal);
menu->monGfxTileStart = LoadSpriteSheet(&sprSheet);
spriteId = CreateSprite(&sprTemplate, 38, 104, 0);
menu->monPicSpriteId = spriteId;
if (spriteId == MAX_SPRITES)
{
FreeSpriteTilesByTag(TAG_CONDITION_MON);
FreeSpritePaletteByTag(TAG_CONDITION_MON);
menu->monPicSpriteId = SPRITE_NONE;
}
else
{
menu->monPicSpriteId = spriteId;
gSprites[menu->monPicSpriteId].callback = MonPicGfxSpriteCallback;
menu->monGfxPtr = (void*)VRAM + BG_VRAM_SIZE + (menu->monGfxTileStart * 32);
menu->monPalIndex = (menu->monPalIndex * 16) + 0x100;
}
}
else
{
DmaCopy16Defvars(3, GetConditionMonPicGfx(id), menu->monGfxPtr, MON_PIC_SIZE);
LoadPalette(GetConditionMonPal(id), menu->monPalIndex, 0x20);
}
}
static void VBlankCB_PokenavConditionGraph(void)
{
struct ConditionGraph *graph = GetConditionGraphPtr();
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
ConditionGraph_Draw(graph);
ScanlineEffect_InitHBlankDmaTransfer();
}
static void SetExitVBlank(void)
{
SetPokenavVBlankCallback();
}
static void ToggleGraphData(bool8 showBg)
{
if (showBg)
ShowBg(2);
else
HideBg(2);
}
static void DoConditionGraphEnterTransition(void)
{
struct ConditionGraph *graph = GetConditionGraphPtr();
u8 id = GetConditionGraphMenuCurrentLoadIndex();
sInitialLoadId = id;
ConditionGraph_SetNewPositions(graph, graph->savedPositions[CONDITION_GRAPH_LOAD_MAX - 1], graph->savedPositions[id]);
ConditionGraph_TryUpdate(graph);
}
// Transition the graph back to empty before exiting.
// This is skipped if the player is in party mode and the cursor
// is on Cancel, in which case the graph is already empty.
static void DoConditionGraphExitTransition(void)
{
struct ConditionGraph *graph = GetConditionGraphPtr();
if (IsConditionMenuSearchMode() || GetConditionGraphCurrentListIndex() != GetMonListCount() - 1)
ConditionGraph_SetNewPositions(graph, graph->savedPositions[GetConditionGraphMenuCurrentLoadIndex()], graph->savedPositions[CONDITION_GRAPH_LOAD_MAX - 1]);
}
u8 GetMonMarkingsData(void)
{
struct Pokenav_ConditionMenuGfx *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_GRAPH_MENU_GFX);
if (IsConditionMenuSearchMode() == 1)
return menu->marksMenu.markings;
else
return 0;
}
@@ -21,50 +21,50 @@ enum
CONDITION_SEARCH_FUNC_SELECT_MON, CONDITION_SEARCH_FUNC_SELECT_MON,
}; };
struct PokenavSub7 struct Pokenav_SearchResults
{ {
u32 (*callback)(struct PokenavSub7 *); u32 (*callback)(struct Pokenav_SearchResults *);
u32 loopedTaskId; u32 loopedTaskId;
u8 fill1[4]; u8 fill1[4];
s32 boxId; s32 boxId;
s32 monId; s32 monId;
u32 conditionDataId; u32 conditionDataId;
u32 returnFromGraph; bool32 returnFromGraph;
u32 isPartyCondition; bool32 saveResultsList;
struct PokenavSub18 *monList; struct PokenavMonList *monList;
}; };
struct PokenavSub8 struct Pokenav_SearchResultsGfx
{ {
bool32 (*callback)(void); bool32 (*callback)(void);
u32 ltid; //looped task Id u32 loopedTaskId;
u16 winid; u16 winid;
bool32 fromGraph; bool32 fromGraph;
u8 buff[BG_SCREEN_SIZE]; u8 buff[BG_SCREEN_SIZE];
}; // size: 0x810 }; // size: 0x810
static u32 HandleConditionSearchInput_WaitSetup(struct PokenavSub7 *structPtr); static u32 HandleConditionSearchInput_WaitSetup(struct Pokenav_SearchResults *);
static u32 HandleConditionSearchInput(struct PokenavSub7 *structPtr); static u32 HandleConditionSearchInput(struct Pokenav_SearchResults *);
static u32 OpenConditionGraphFromSearchList(struct PokenavSub7 *structPtr); static u32 OpenConditionGraphFromSearchList(struct Pokenav_SearchResults *);
static u32 ReturnToConditionSearchList(struct PokenavSub7 *structPtr); static u32 ReturnToConditionSearchList(struct Pokenav_SearchResults *);
static u32 GetConditionSearchLoopedTask(s32 state); static u32 GetConditionSearchLoopedTask(s32);
static u32 BuildPartyMonSearchResults(s32 state); static u32 BuildPartyMonSearchResults(s32);
static u32 InitBoxMonSearchResults(s32 state); static u32 InitBoxMonSearchResults(s32);
static u32 BuildBoxMonSearchResults(s32 state); static u32 BuildBoxMonSearchResults(s32);
static u32 sub_81CF278(s32 state); static u32 ConvertConditionsToListRanks(s32);
static u32 LoopedTask_MoveSearchListCursorUp(s32 state); static u32 LoopedTask_MoveSearchListCursorUp(s32);
static u32 LoopedTask_MoveSearchListCursorDown(s32 state); static u32 LoopedTask_MoveSearchListCursorDown(s32);
static u32 LoopedTask_MoveSearchListPageUp(s32 state); static u32 LoopedTask_MoveSearchListPageUp(s32);
static u32 LoopedTask_MoveSearchListPageDown(s32 state); static u32 LoopedTask_MoveSearchListPageDown(s32);
static u32 LoopedTask_ExitConditionSearchMenu(s32 state); static u32 LoopedTask_ExitConditionSearchMenu(s32);
static u32 LoopedTask_SelectSearchResult(s32 state); static u32 LoopedTask_SelectSearchResult(s32);
static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item); static void InsertMonListItem(struct Pokenav_SearchResults *, struct PokenavMonListItem *);
static bool32 GetSearchResultCurrentLoopedTaskActive(void); static bool32 GetSearchResultCurrentLoopedTaskActive(void);
static u32 LoopedTask_OpenConditionSearchResults(s32 state); static u32 LoopedTask_OpenConditionSearchResults(s32);
static void AddSearchResultListMenuWindow(struct PokenavSub8 *); static void AddSearchResultListMenuWindow(struct Pokenav_SearchResultsGfx *);
static void PrintSearchResultListMenuItems(struct PokenavSub8 *); static void PrintSearchResultListMenuItems(struct Pokenav_SearchResultsGfx *);
static void InitConditionSearchListMenuTemplate(void); static void CreateSearchResultsList(void);
static void PrintSearchMonListItem(struct PokenavMonList *, u8 *); static void BufferSearchMonListItem(struct PokenavMonListItem *, u8 *);
static const u32 sSearchMonDataIds[] = {MON_DATA_COOL, MON_DATA_BEAUTY, MON_DATA_CUTE, MON_DATA_SMART, MON_DATA_TOUGH}; static const u32 sSearchMonDataIds[] = {MON_DATA_COOL, MON_DATA_BEAUTY, MON_DATA_CUTE, MON_DATA_SMART, MON_DATA_TOUGH};
@@ -73,13 +73,13 @@ static const LoopedTask sConditionSearchLoopedTaskFuncs[] =
BuildPartyMonSearchResults, BuildPartyMonSearchResults,
InitBoxMonSearchResults, InitBoxMonSearchResults,
BuildBoxMonSearchResults, BuildBoxMonSearchResults,
sub_81CF278 ConvertConditionsToListRanks
}; };
static const u16 sConditionSearchResultFramePal[] = INCBIN_U16("graphics/pokenav/condition_search2.gbapal"); static const u16 sConditionSearchResultFramePal[] = INCBIN_U16("graphics/pokenav/condition/search_results.gbapal");
static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition_search2.4bpp.lz"); static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition/search_results.4bpp.lz");
static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition_search2.bin.lz"); static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition/search_results.bin.lz");
static const u16 gUnknown_08623570[] = INCBIN_U16("graphics/pokenav/8623570.gbapal"); static const u16 sListBg_Pal[] = INCBIN_U16("graphics/pokenav/condition/search_results_list.gbapal");
static const struct BgTemplate sConditionSearchResultBgTemplates[] = static const struct BgTemplate sConditionSearchResultBgTemplates[] =
{ {
@@ -130,57 +130,57 @@ static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
bool32 PokenavCallback_Init_ConditionSearch(void) bool32 PokenavCallback_Init_ConditionSearch(void)
{ {
struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7)); struct Pokenav_SearchResults *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, sizeof(struct Pokenav_SearchResults));
if (structPtr == NULL) if (menu == NULL)
return FALSE; return FALSE;
structPtr->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavSub18)); menu->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavMonList));
if (structPtr->monList == NULL) if (menu->monList == NULL)
return FALSE; return FALSE;
structPtr->callback = HandleConditionSearchInput_WaitSetup; menu->callback = HandleConditionSearchInput_WaitSetup;
structPtr->loopedTaskId = CreateLoopedTask(GetConditionSearchLoopedTask, 1); menu->loopedTaskId = CreateLoopedTask(GetConditionSearchLoopedTask, 1);
structPtr->returnFromGraph = 0; menu->returnFromGraph = FALSE;
structPtr->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()]; menu->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()];
return TRUE; return TRUE;
} }
// return to search results from condition graph // return to search results from condition graph
bool32 PokenavCallback_Init_ReturnToMonSearchList(void) bool32 PokenavCallback_Init_ReturnToMonSearchList(void)
{ {
struct PokenavSub7 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, sizeof(struct PokenavSub7)); struct Pokenav_SearchResults *menu = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS, sizeof(struct Pokenav_SearchResults));
if (structPtr == NULL) if (menu == NULL)
return FALSE; return FALSE;
structPtr->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST); menu->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
structPtr->callback = HandleConditionSearchInput; menu->callback = HandleConditionSearchInput;
structPtr->returnFromGraph = 1; menu->returnFromGraph = TRUE;
structPtr->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()]; menu->conditionDataId = sSearchMonDataIds[GetSelectedConditionSearch()];
return TRUE; return TRUE;
} }
u32 GetConditionSearchResultsCallback(void) u32 GetConditionSearchResultsCallback(void)
{ {
struct PokenavSub7 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
return structPtr->callback(structPtr); return menu->callback(menu);
} }
void FreeSearchResultSubstruct1(void) void FreeSearchResultSubstruct1(void)
{ {
struct PokenavSub7 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
if (structPtr->isPartyCondition == 0) if (!menu->saveResultsList)
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST); FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
} }
static bool32 HandleConditionSearchInput_WaitSetup(struct PokenavSub7 *structPtr) static bool32 HandleConditionSearchInput_WaitSetup(struct Pokenav_SearchResults *menu)
{ {
if (!IsLoopedTaskActive(structPtr->loopedTaskId)) if (!IsLoopedTaskActive(menu->loopedTaskId))
structPtr->callback = HandleConditionSearchInput; menu->callback = HandleConditionSearchInput;
return FALSE; return FALSE;
} }
static u32 HandleConditionSearchInput(struct PokenavSub7 *structPtr) static u32 HandleConditionSearchInput(struct Pokenav_SearchResults *menu)
{ {
if (JOY_REPEAT(DPAD_UP)) if (JOY_REPEAT(DPAD_UP))
return CONDITION_SEARCH_FUNC_MOVE_UP; return CONDITION_SEARCH_FUNC_MOVE_UP;
@@ -192,60 +192,63 @@ static u32 HandleConditionSearchInput(struct PokenavSub7 *structPtr)
return CONDITION_SEARCH_FUNC_PAGE_DOWN; return CONDITION_SEARCH_FUNC_PAGE_DOWN;
else if (JOY_NEW(B_BUTTON)) else if (JOY_NEW(B_BUTTON))
{ {
structPtr->isPartyCondition = 0; // Exiting back to main search menu
structPtr->callback = ReturnToConditionSearchList; menu->saveResultsList = FALSE;
menu->callback = ReturnToConditionSearchList;
return CONDITION_SEARCH_FUNC_EXIT; return CONDITION_SEARCH_FUNC_EXIT;
} }
else if (JOY_NEW(A_BUTTON)) else if (JOY_NEW(A_BUTTON))
{ {
structPtr->monList->currIndex = GetSelectedPokenavListIndex(); // Entering graph menu
structPtr->isPartyCondition = 1; menu->monList->currIndex = PokenavList_GetSelectedIndex();
structPtr->callback = OpenConditionGraphFromSearchList; menu->saveResultsList = TRUE;
menu->callback = OpenConditionGraphFromSearchList;
return CONDITION_SEARCH_FUNC_SELECT_MON; return CONDITION_SEARCH_FUNC_SELECT_MON;
} }
else else
return CONDITION_SEARCH_FUNC_NONE; return CONDITION_SEARCH_FUNC_NONE;
} }
static u32 ReturnToConditionSearchList(struct PokenavSub7 *structPtr) static u32 ReturnToConditionSearchList(struct Pokenav_SearchResults *menu)
{ {
return POKENAV_CONDITION_SEARCH_MENU; return POKENAV_CONDITION_SEARCH_MENU;
} }
static u32 OpenConditionGraphFromSearchList(struct PokenavSub7 *structPtr) static u32 OpenConditionGraphFromSearchList(struct Pokenav_SearchResults *menu)
{ {
return POKENAV_CONDITION_GRAPH_FROM_SEARCH; return POKENAV_CONDITION_GRAPH_SEARCH;
} }
static u32 sub_81CF0C0(void) static u32 GetReturningFromGraph(void)
{ {
struct PokenavSub7 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
return structPtr->returnFromGraph; return menu->returnFromGraph;
} }
static struct PokenavMonList * GetSearchResultsMonDataList(void) static struct PokenavMonListItem * GetSearchResultsMonDataList(void)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
return ptr->monList->monData; return menu->monList->monData;
} }
static u16 GetSearchResultsMonListCount(void) static u16 GetSearchResultsMonListCount(void)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
return ptr->monList->listCount; return menu->monList->listCount;
} }
static s32 GetSearchResultsSelectedMonData(void) // data below has been set by ConvertConditionsToListRanks
static s32 GetSearchResultsSelectedMonRank(void)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
s32 i = GetSelectedPokenavListIndex(); s32 i = PokenavList_GetSelectedIndex();
return ptr->monList->monData[i].data; return menu->monList->monData[i].data;
} }
static u16 sub_81CF10C(void) static u16 GetSearchResultsCurrentListIndex(void)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
return ptr->monList->currIndex; return menu->monList->currIndex;
} }
static u32 GetConditionSearchLoopedTask(s32 state) static u32 GetConditionSearchLoopedTask(s32 state)
@@ -256,12 +259,12 @@ static u32 GetConditionSearchLoopedTask(s32 state)
static u32 BuildPartyMonSearchResults(s32 state) static u32 BuildPartyMonSearchResults(s32 state)
{ {
s32 i; s32 i;
struct PokenavMonList item; struct PokenavMonListItem item;
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
ptr->monList->listCount = 0; menu->monList->listCount = 0;
ptr->monList->currIndex = 0; menu->monList->currIndex = 0;
item.boxId = 14; item.boxId = TOTAL_BOXES_COUNT;
for (i = 0; i < PARTY_SIZE; i++) for (i = 0; i < PARTY_SIZE; i++)
{ {
struct Pokemon * pokemon = &gPlayerParty[i]; struct Pokemon * pokemon = &gPlayerParty[i];
@@ -270,8 +273,8 @@ static u32 BuildPartyMonSearchResults(s32 state)
if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG)) if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG))
{ {
item.monId = i; item.monId = i;
item.data = GetMonData(pokemon, ptr->conditionDataId); item.data = GetMonData(pokemon, menu->conditionDataId);
sub_81CF2C4(ptr, &item); InsertMonListItem(menu, &item);
} }
} }
@@ -280,19 +283,19 @@ static u32 BuildPartyMonSearchResults(s32 state)
static u32 InitBoxMonSearchResults(s32 state) static u32 InitBoxMonSearchResults(s32 state)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
ptr->monId = 0; menu->monId = 0;
ptr->boxId = 0; menu->boxId = 0;
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
} }
static u32 BuildBoxMonSearchResults(s32 state) static u32 BuildBoxMonSearchResults(s32 state)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
s32 boxId = ptr->boxId; s32 boxId = menu->boxId;
s32 monId = ptr->monId; s32 monId = menu->monId;
s32 boxCount = 0; s32 boxCount = 0;
struct PokenavMonList item; struct PokenavMonListItem item;
while (boxId < TOTAL_BOXES_COUNT) while (boxId < TOTAL_BOXES_COUNT)
{ {
@@ -302,15 +305,15 @@ static u32 BuildBoxMonSearchResults(s32 state)
{ {
item.boxId = boxId; item.boxId = boxId;
item.monId = monId; item.monId = monId;
item.data = GetBoxMonDataAt(boxId, monId, ptr->conditionDataId); item.data = GetBoxMonDataAt(boxId, monId, menu->conditionDataId);
sub_81CF2C4(ptr, &item); InsertMonListItem(menu, &item);
} }
boxCount++; boxCount++;
monId++; monId++;
if (boxCount > 14) if (boxCount > TOTAL_BOXES_COUNT)
{ {
ptr->boxId = boxId; menu->boxId = boxId;
ptr->monId = monId; menu->monId = monId;
return LT_CONTINUE; return LT_CONTINUE;
} }
} }
@@ -321,107 +324,111 @@ static u32 BuildBoxMonSearchResults(s32 state)
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
} }
static u32 sub_81CF278(s32 state) // Data below is initially set by BuildPartyMonSearchResults / BuildBoxMonSearchResults, and
// is the Pokémon's condition value for the condition they are sorted by.
// The condition value in data is then overwritten with their ranking.
static u32 ConvertConditionsToListRanks(s32 state)
{ {
struct PokenavSub7 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS);
s32 r6 = ptr->monList->listCount; s32 listCount = menu->monList->listCount;
s32 r4 = ptr->monList->monData[0].data; s32 prevCondition = menu->monList->monData[0].data;
s32 i; s32 i;
ptr->monList->monData[0].data = 1; menu->monList->monData[0].data = 1;
for (i = 1; i < r6; i++) for (i = 1; i < listCount; i++)
{ {
if (ptr->monList->monData[i].data == r4) if (menu->monList->monData[i].data == prevCondition)
{ {
ptr->monList->monData[i].data = ptr->monList->monData[i - 1].data; // Same condition value as prev, share rank
menu->monList->monData[i].data = menu->monList->monData[i - 1].data;
} }
else else
{ {
r4 = ptr->monList->monData[i].data; prevCondition = menu->monList->monData[i].data;
ptr->monList->monData[i].data = i + 1; menu->monList->monData[i].data = i + 1;
} }
} }
ptr->returnFromGraph = 1; menu->returnFromGraph = TRUE;
return LT_FINISH; return LT_FINISH;
} }
static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item) static void InsertMonListItem(struct Pokenav_SearchResults *menu, struct PokenavMonListItem *item)
{ {
u32 left = 0; u32 left = 0;
u32 right = structPtr->monList->listCount; u32 right = menu->monList->listCount;
u32 insertionIdx = left + (right - left) / 2; u32 insertionIdx = left + (right - left) / 2;
while (right != insertionIdx) while (right != insertionIdx)
{ {
if (item->data > structPtr->monList->monData[insertionIdx].data) if (item->data > menu->monList->monData[insertionIdx].data)
right = insertionIdx; right = insertionIdx;
else else
left = insertionIdx + 1; left = insertionIdx + 1;
insertionIdx = left + (right - left) / 2; insertionIdx = left + (right - left) / 2;
} }
for (right = structPtr->monList->listCount; right > insertionIdx; right--) for (right = menu->monList->listCount; right > insertionIdx; right--)
structPtr->monList->monData[right] = structPtr->monList->monData[right - 1]; menu->monList->monData[right] = menu->monList->monData[right - 1];
structPtr->monList->monData[insertionIdx] = *item; menu->monList->monData[insertionIdx] = *item;
structPtr->monList->listCount++; menu->monList->listCount++;
} }
bool32 OpenConditionSearchResults(void) bool32 OpenConditionSearchResults(void)
{ {
struct PokenavSub8 *searchList = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST, sizeof(struct PokenavSub8)); struct Pokenav_SearchResultsGfx *gfx = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX, sizeof(struct Pokenav_SearchResultsGfx));
if (searchList == NULL) if (gfx == NULL)
return FALSE; return FALSE;
searchList->ltid = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1); gfx->loopedTaskId = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1);
searchList->callback = GetSearchResultCurrentLoopedTaskActive; gfx->callback = GetSearchResultCurrentLoopedTaskActive;
searchList->fromGraph = FALSE; gfx->fromGraph = FALSE;
return TRUE; return TRUE;
} }
bool32 OpenConditionSearchListFromGraph(void) bool32 OpenConditionSearchListFromGraph(void)
{ {
struct PokenavSub8 *searchList = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST, sizeof(struct PokenavSub8)); struct Pokenav_SearchResultsGfx *gfx = AllocSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX, sizeof(struct Pokenav_SearchResultsGfx));
if (searchList == NULL) if (gfx == NULL)
return FALSE; return FALSE;
searchList->ltid = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1); gfx->loopedTaskId = CreateLoopedTask(LoopedTask_OpenConditionSearchResults, 1);
searchList->callback = GetSearchResultCurrentLoopedTaskActive; gfx->callback = GetSearchResultCurrentLoopedTaskActive;
searchList->fromGraph = TRUE; gfx->fromGraph = TRUE;
return TRUE; return TRUE;
} }
void CreateSearchResultsLoopedTask(s32 idx) void CreateSearchResultsLoopedTask(s32 idx)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
searchList->ltid = CreateLoopedTask(sSearchResultLoopTaskFuncs[idx], 1); gfx->loopedTaskId = CreateLoopedTask(sSearchResultLoopTaskFuncs[idx], 1);
searchList->callback = GetSearchResultCurrentLoopedTaskActive; gfx->callback = GetSearchResultCurrentLoopedTaskActive;
} }
bool32 IsSearchResultLoopedTaskActive(void) bool32 IsSearchResultLoopedTaskActive(void)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
return searchList->callback(); return gfx->callback();
} }
bool32 GetSearchResultCurrentLoopedTaskActive(void) bool32 GetSearchResultCurrentLoopedTaskActive(void)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
return IsLoopedTaskActive(searchList->ltid); return IsLoopedTaskActive(gfx->loopedTaskId);
} }
void FreeSearchResultSubstruct2(void) void FreeSearchResultSubstruct2(void)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
sub_81C8234(); DestroyPokenavList();
RemoveWindow(searchList->winid); RemoveWindow(gfx->winid);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); FreePokenavSubstruct(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
} }
static u32 LoopedTask_OpenConditionSearchResults(s32 state) static u32 LoopedTask_OpenConditionSearchResults(s32 state)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
switch (state) switch (state)
{ {
case 0: case 0:
InitBgTemplates(sConditionSearchResultBgTemplates, ARRAY_COUNT(sConditionSearchResultBgTemplates)); InitBgTemplates(sConditionSearchResultBgTemplates, ARRAY_COUNT(sConditionSearchResultBgTemplates));
DecompressAndCopyTileDataToVram(1, sConditionSearchResultTiles, 0, 0, 0); DecompressAndCopyTileDataToVram(1, sConditionSearchResultTiles, 0, 0, 0);
SetBgTilemapBuffer(1, searchList->buff); SetBgTilemapBuffer(1, gfx->buff);
CopyToBgTilemapBuffer(1, sConditionSearchResultTilemap, 0, 0); CopyToBgTilemapBuffer(1, sConditionSearchResultTilemap, 0, 0);
CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(1);
CopyPaletteIntoBufferUnfaded(sConditionSearchResultFramePal, 0x10, 0x20); CopyPaletteIntoBufferUnfaded(sConditionSearchResultFramePal, 0x10, 0x20);
@@ -430,19 +437,19 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state)
case 1: case 1:
if (FreeTempTileDataBuffersIfPossible()) if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE; return LT_PAUSE;
if (!sub_81CF0C0()) if (!GetReturningFromGraph())
return LT_PAUSE; return LT_PAUSE;
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 2: case 2:
if (FreeTempTileDataBuffersIfPossible()) if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE; return LT_PAUSE;
CopyPaletteIntoBufferUnfaded(gUnknown_08623570, 0x20, 32); CopyPaletteIntoBufferUnfaded(sListBg_Pal, 0x20, 32);
InitConditionSearchListMenuTemplate(); CreateSearchResultsList();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (sub_81C8224()) if (IsCreatePokenavListTaskActive())
return LT_PAUSE; return LT_PAUSE;
AddSearchResultListMenuWindow(searchList); AddSearchResultListMenuWindow(gfx);
PrintHelpBarText(HELPBAR_CONDITION_MON_LIST); PrintHelpBarText(HELPBAR_CONDITION_MON_LIST);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 4: case 4:
@@ -453,14 +460,14 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state)
ShowBg(1); ShowBg(1);
ShowBg(2); ShowBg(2);
HideBg(3); HideBg(3);
if (!searchList->fromGraph) if (!gfx->fromGraph)
{ {
u8 searchGfxId = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; u8 searchGfxId = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
LoadLeftHeaderGfxForIndex(searchGfxId); LoadLeftHeaderGfxForIndex(searchGfxId);
ShowLeftHeaderGfx(searchGfxId, 1, 0); ShowLeftHeaderGfx(searchGfxId, 1, 0);
ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, 1, 0); ShowLeftHeaderGfx(POKENAV_GFX_CONDITION_MENU, 1, 0);
} }
PokenavFadeScreen(1); PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 5: case 5:
if (IsPaletteFadeActive()) if (IsPaletteFadeActive())
@@ -474,11 +481,11 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state)
static u32 LoopedTask_MoveSearchListCursorUp(s32 state) static u32 LoopedTask_MoveSearchListCursorUp(s32 state)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_MoveCursorUp()) switch (PokenavList_MoveCursorUp())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -491,11 +498,11 @@ static u32 LoopedTask_MoveSearchListCursorUp(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
PrintSearchResultListMenuItems(searchList); PrintSearchResultListMenuItems(gfx);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -507,11 +514,11 @@ static u32 LoopedTask_MoveSearchListCursorUp(s32 state)
static u32 LoopedTask_MoveSearchListCursorDown(s32 state) static u32 LoopedTask_MoveSearchListCursorDown(s32 state)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_MoveCursorDown()) switch (PokenavList_MoveCursorDown())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -524,11 +531,11 @@ static u32 LoopedTask_MoveSearchListCursorDown(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
PrintSearchResultListMenuItems(searchList); PrintSearchResultListMenuItems(gfx);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -540,11 +547,11 @@ static u32 LoopedTask_MoveSearchListCursorDown(s32 state)
static u32 LoopedTask_MoveSearchListPageUp(s32 state) static u32 LoopedTask_MoveSearchListPageUp(s32 state)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_PageUp()) switch (PokenavList_PageUp())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -557,11 +564,11 @@ static u32 LoopedTask_MoveSearchListPageUp(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
PrintSearchResultListMenuItems(searchList); PrintSearchResultListMenuItems(gfx);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -573,11 +580,11 @@ static u32 LoopedTask_MoveSearchListPageUp(s32 state)
static u32 LoopedTask_MoveSearchListPageDown(s32 state) static u32 LoopedTask_MoveSearchListPageDown(s32 state)
{ {
struct PokenavSub8 *searchList = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULT_LIST); struct Pokenav_SearchResultsGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS_GFX);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_PageDown()) switch (PokenavList_PageDown())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -590,11 +597,11 @@ static u32 LoopedTask_MoveSearchListPageDown(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
PrintSearchResultListMenuItems(searchList); PrintSearchResultListMenuItems(gfx);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -610,7 +617,7 @@ static u32 LoopedTask_ExitConditionSearchMenu(s32 state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
PokenavFadeScreen(0); PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
SlideMenuHeaderDown(); SlideMenuHeaderDown();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
@@ -630,7 +637,7 @@ static u32 LoopedTask_SelectSearchResult(s32 state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
PokenavFadeScreen(0); PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsPaletteFadeActive()) if (IsPaletteFadeActive())
@@ -640,47 +647,47 @@ static u32 LoopedTask_SelectSearchResult(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static void AddSearchResultListMenuWindow(struct PokenavSub8 *searchList) static void AddSearchResultListMenuWindow(struct Pokenav_SearchResultsGfx *gfx)
{ {
searchList->winid = AddWindow(&sSearchResultListMenuWindowTemplate); gfx->winid = AddWindow(&sSearchResultListMenuWindowTemplate);
PutWindowTilemap(searchList->winid); PutWindowTilemap(gfx->winid);
CopyWindowToVram(searchList->winid, COPYWIN_MAP); CopyWindowToVram(gfx->winid, COPYWIN_MAP);
PrintSearchResultListMenuItems(searchList); PrintSearchResultListMenuItems(gfx);
} }
static void PrintSearchResultListMenuItems(struct PokenavSub8 *searchList) static void PrintSearchResultListMenuItems(struct Pokenav_SearchResultsGfx *gfx)
{ {
s32 r7 = GetSearchResultsSelectedMonData(); s32 rank = GetSearchResultsSelectedMonRank();
DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
*gStringVar1 = EOS; *gStringVar1 = EOS;
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberF700); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberIndex);
AddTextPrinterParameterized(searchList->winid, FONT_NORMAL, gStringVar2, 4, 1, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(gfx->winid, FONT_NORMAL, gStringVar2, 4, 1, TEXT_SKIP_DRAW, NULL);
ConvertIntToDecimalStringN(gStringVar1, r7, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar1, rank, STR_CONV_MODE_RIGHT_ALIGN, 3);
AddTextPrinterParameterized(searchList->winid, FONT_NORMAL, gStringVar1, 34, 1, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(gfx->winid, FONT_NORMAL, gStringVar1, 34, 1, TEXT_SKIP_DRAW, NULL);
CopyWindowToVram(searchList->winid, COPYWIN_GFX); CopyWindowToVram(gfx->winid, COPYWIN_GFX);
} }
static void InitConditionSearchListMenuTemplate(void) static void CreateSearchResultsList(void)
{ {
struct PokenavListTemplate template; struct PokenavListTemplate template;
template.list.monList = GetSearchResultsMonDataList(); template.list = (struct PokenavListItem *)GetSearchResultsMonDataList();
template.count = GetSearchResultsMonListCount(); template.count = GetSearchResultsMonListCount();
template.unk8 = 4; template.itemSize = sizeof(struct PokenavListItem);
template.unk6 = sub_81CF10C(); template.startIndex = GetSearchResultsCurrentListIndex();
template.item_X = 13; template.item_X = 13;
template.windowWidth = 17; template.windowWidth = 17;
template.listTop = 1; template.listTop = 1;
template.maxShowed = 8; template.maxShowed = 8;
template.fillValue = 2; template.fillValue = 2;
template.fontId = FONT_NORMAL; template.fontId = FONT_NORMAL;
template.listFunc.printMonFunc = PrintSearchMonListItem; template.bufferItemFunc = (PokenavListBufferItemFunc)BufferSearchMonListItem;
template.unk14 = NULL; template.iconDrawFunc = NULL;
sub_81C81D4(&sConditionSearchResultBgTemplates[1], &template, 0); CreatePokenavList(&sConditionSearchResultBgTemplates[1], &template, 0);
} }
static void PrintSearchMonListItem(struct PokenavMonList * item, u8 * dest) static void BufferSearchMonListItem(struct PokenavMonListItem * item, u8 * dest)
{ {
u8 gender; u8 gender;
u8 level; u8 level;
+1011
View File
File diff suppressed because it is too large Load Diff
+148 -145
View File
@@ -13,7 +13,7 @@
#include "menu.h" #include "menu.h"
#include "dma3.h" #include "dma3.h"
struct PokenavMainMenuResources struct Pokenav_MainMenu
{ {
void (*loopTask)(u32); void (*loopTask)(u32);
u32 (*isLoopTaskActiveFunc)(void); u32 (*isLoopTaskActiveFunc)(void);
@@ -24,7 +24,7 @@ struct PokenavMainMenuResources
struct Sprite *spinningPokenav; struct Sprite *spinningPokenav;
struct Sprite *leftHeaderSprites[2]; struct Sprite *leftHeaderSprites[2];
struct Sprite *submenuLeftHeaderSprites[2]; struct Sprite *submenuLeftHeaderSprites[2];
u8 tilemapBuffer[0x800]; u8 tilemapBuffer[BG_SCREEN_SIZE];
}; };
// This struct uses a 32bit tag, and doesn't have a size field. // This struct uses a 32bit tag, and doesn't have a size field.
@@ -36,26 +36,26 @@ struct CompressedSpriteSheetNoSize
}; };
static void CleanupPokenavMainMenuResources(void); static void CleanupPokenavMainMenuResources(void);
static void LoadLeftHeaderGfxForSubMenu(u32 arg0); static void LoadLeftHeaderGfxForSubMenu(u32);
static void LoadLeftHeaderGfxForMenu(u32 index); static void LoadLeftHeaderGfxForMenu(u32);
static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide); static void HideLeftHeaderSubmenuSprites(bool32);
static void HideLeftHeaderSprites(bool32 isOnRightSide); static void HideLeftHeaderSprites(bool32);
static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide); static void ShowLeftHeaderSprites(u32, bool32);
static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide); static void ShowLeftHeaderSubmenuSprites(u32, bool32);
static void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration); static void MoveLeftHeader(struct Sprite *, s32, s32, s32);
static void SpriteCB_MoveLeftHeader(struct Sprite *sprite); static void SpriteCB_MoveLeftHeader(struct Sprite *);
static void InitPokenavMainMenuResources(void); static void InitPokenavMainMenuResources(void);
static void InitHoennMapHeaderSprites(void); static void CreateLeftHeaderSprites(void);
static void InitHelpBar(void); static void InitHelpBar(void);
static u32 LoopedTask_SlideMenuHeaderUp(s32 a0); static u32 LoopedTask_SlideMenuHeaderUp(s32);
static u32 LoopedTask_SlideMenuHeaderDown(s32 a0); static u32 LoopedTask_SlideMenuHeaderDown(s32);
static void DrawHelpBar(u32 windowId); static void DrawHelpBar(u32);
static void SpriteCB_SpinningPokenav(struct Sprite* sprite); static void SpriteCB_SpinningPokenav(struct Sprite*);
static u32 LoopedTask_InitPokenavMenu(s32 a0); static u32 LoopedTask_InitPokenavMenu(s32);
const u16 gSpinningPokenavPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); static const u16 sSpinningPokenav_Pal[] = INCBIN_U16("graphics/pokenav/nav_icon.gbapal");
const u32 gSpinningPokenavGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); static const u32 sSpinningPokenav_Gfx[] = INCBIN_U32("graphics/pokenav/nav_icon.4bpp.lz");
const u32 gUnused_SpinningPokenavGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); static const u32 sBlueLightCopy[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); // Unused copy of sMatchCallBlueLightTiles
const struct BgTemplate gPokenavMainMenuBgTemplates[] = const struct BgTemplate gPokenavMainMenuBgTemplates[] =
{ {
@@ -108,7 +108,7 @@ static const u8 sHelpBarTextColors[3] =
static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] = static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] =
{ {
{ {
.data = gSpinningPokenavGfx, .data = sSpinningPokenav_Gfx,
.size = 0x1000, .size = 0x1000,
.tag = 0, .tag = 0,
} }
@@ -117,20 +117,20 @@ static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] =
static const struct SpritePalette gSpinningNavgearPalettes[] = static const struct SpritePalette gSpinningNavgearPalettes[] =
{ {
{ {
.data = gSpinningPokenavPaletteData, .data = sSpinningPokenav_Pal,
.tag = 0, .tag = 0,
}, },
{} {}
}; };
static const struct CompressedSpriteSheet sPokenavHoennMapLeftHeaderSpriteSheet = static const struct CompressedSpriteSheet sMenuLeftHeaderSpriteSheet =
{ {
.data = gPokenavLeftHeaderHoennMap_Gfx, .data = gPokenavLeftHeaderHoennMap_Gfx, // Hoenn map is the first of the headers listed
.size = 0xC00, .size = 0xC00,
.tag = 2 .tag = 2
}; };
static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] = static const struct CompressedSpriteSheet sMenuLeftHeaderSpriteSheets[] =
{ {
[POKENAV_GFX_MAIN_MENU] = { [POKENAV_GFX_MAIN_MENU] = {
.data = gPokenavLeftHeaderMainMenu_Gfx, .data = gPokenavLeftHeaderMainMenu_Gfx,
@@ -239,7 +239,7 @@ static const struct SpriteTemplate sSpinningPokenavSpriteTemplate =
.callback = SpriteCB_SpinningPokenav .callback = SpriteCB_SpinningPokenav
}; };
static const struct OamData sPokenavLeftHeaderHoennMapSpriteOam = static const struct OamData sOamData_LeftHeader =
{ {
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
@@ -253,7 +253,7 @@ static const struct OamData sPokenavLeftHeaderHoennMapSpriteOam =
.paletteNum = 0, .paletteNum = 0,
}; };
static const struct OamData sUnknown_0861FB24 = static const struct OamData sOamData_SubmenuLeftHeader =
{ {
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
@@ -268,22 +268,22 @@ static const struct OamData sUnknown_0861FB24 =
.paletteNum = 0, .paletteNum = 0,
}; };
static const struct SpriteTemplate sPokenavLeftHeaderHoennMapSpriteTemplate = static const struct SpriteTemplate sLeftHeaderSpriteTemplate =
{ {
.tileTag = 2, .tileTag = 2,
.paletteTag = 1, .paletteTag = 1,
.oam = &sPokenavLeftHeaderHoennMapSpriteOam, .oam = &sOamData_LeftHeader,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy .callback = SpriteCallbackDummy
}; };
static const struct SpriteTemplate sUnknown_0861FB44 = static const struct SpriteTemplate sSubmenuLeftHeaderSpriteTemplate =
{ {
.tileTag = 2, .tileTag = 2,
.paletteTag = 2, .paletteTag = 2,
.oam = &sUnknown_0861FB24, .oam = &sOamData_SubmenuLeftHeader,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
@@ -292,22 +292,22 @@ static const struct SpriteTemplate sUnknown_0861FB44 =
bool32 InitPokenavMainMenu(void) bool32 InitPokenavMainMenu(void)
{ {
struct PokenavMainMenuResources *structPtr; struct Pokenav_MainMenu *menu;
structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU, sizeof(struct PokenavMainMenuResources)); menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU, sizeof(struct Pokenav_MainMenu));
if (structPtr == NULL) if (menu == NULL)
return FALSE; return FALSE;
ResetSpriteData(); ResetSpriteData();
FreeAllSpritePalettes(); FreeAllSpritePalettes();
structPtr->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1); menu->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1);
return TRUE; return TRUE;
} }
u32 PokenavMainMenuLoopedTaskIsActive(void) u32 PokenavMainMenuLoopedTaskIsActive(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
return IsLoopedTaskActive(structPtr->currentTaskId); return IsLoopedTaskActive(menu->currentTaskId);
} }
void ShutdownPokenav(void) void ShutdownPokenav(void)
@@ -330,11 +330,11 @@ bool32 WaitForPokenavShutdownFade(void)
return TRUE; return TRUE;
} }
static u32 LoopedTask_InitPokenavMenu(s32 a0) static u32 LoopedTask_InitPokenavMenu(s32 state)
{ {
struct PokenavMainMenuResources *structPtr; struct Pokenav_MainMenu *menu;
switch (a0) switch (state)
{ {
case 0: case 0:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
@@ -345,9 +345,9 @@ static u32 LoopedTask_InitPokenavMenu(s32 a0)
ResetTempTileDataBuffers(); ResetTempTileDataBuffers();
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 1: case 1:
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
DecompressAndCopyTileDataToVram(0, &gPokenavHeader_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(0, &gPokenavHeader_Gfx, 0, 0, 0);
SetBgTilemapBuffer(0, structPtr->tilemapBuffer); SetBgTilemapBuffer(0, menu->tilemapBuffer);
CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0); CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0);
CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20); CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
@@ -363,7 +363,7 @@ static u32 LoopedTask_InitPokenavMenu(s32 a0)
return LT_PAUSE; return LT_PAUSE;
InitPokenavMainMenuResources(); InitPokenavMainMenuResources();
InitHoennMapHeaderSprites(); CreateLeftHeaderSprites();
ShowBg(0); ShowBg(0);
return LT_FINISH; return LT_FINISH;
default: default:
@@ -373,46 +373,46 @@ static u32 LoopedTask_InitPokenavMenu(s32 a0)
void SetActiveMenuLoopTasks(void *createLoopTask, void *isLoopTaskActive) // Fix types later. void SetActiveMenuLoopTasks(void *createLoopTask, void *isLoopTaskActive) // Fix types later.
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
structPtr->loopTask = createLoopTask; menu->loopTask = createLoopTask;
structPtr->isLoopTaskActiveFunc = isLoopTaskActive; menu->isLoopTaskActiveFunc = isLoopTaskActive;
structPtr->unused = 0; menu->unused = 0;
} }
void RunMainMenuLoopedTask(u32 a0) void RunMainMenuLoopedTask(u32 state)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
structPtr->unused = 0; menu->unused = 0;
structPtr->loopTask(a0); menu->loopTask(state);
} }
u32 IsActiveMenuLoopTaskActive(void) u32 IsActiveMenuLoopTaskActive(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
return structPtr->isLoopTaskActiveFunc(); return menu->isLoopTaskActiveFunc();
} }
void SlideMenuHeaderUp(void) void SlideMenuHeaderUp(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
structPtr->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderUp, 4); menu->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderUp, 4);
} }
void SlideMenuHeaderDown(void) void SlideMenuHeaderDown(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
structPtr->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderDown, 4); menu->currentTaskId = CreateLoopedTask(LoopedTask_SlideMenuHeaderDown, 4);
} }
bool32 MainMenuLoopedTaskIsBusy(void) bool32 MainMenuLoopedTaskIsBusy(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
return IsLoopedTaskActive(structPtr->currentTaskId); return IsLoopedTaskActive(menu->currentTaskId);
} }
static u32 LoopedTask_SlideMenuHeaderUp(s32 a0) static u32 LoopedTask_SlideMenuHeaderUp(s32 state)
{ {
switch (a0) switch (state)
{ {
default: default:
return LT_FINISH; return LT_FINISH;
@@ -431,7 +431,7 @@ static u32 LoopedTask_SlideMenuHeaderUp(s32 a0)
} }
} }
static u32 LoopedTask_SlideMenuHeaderDown(s32 a0) static u32 LoopedTask_SlideMenuHeaderDown(s32 state)
{ {
if (ChangeBgY(0, 384, BG_COORD_SUB) <= 0) if (ChangeBgY(0, 384, BG_COORD_SUB) <= 0)
{ {
@@ -473,7 +473,6 @@ void PokenavFillPalette(u32 palIndex, u16 fillValue)
void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a4, u16 *palette) void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a4, u16 *palette)
{ {
if (a4 == 0) if (a4 == 0)
{ {
CpuCopy16(src, palette, size * 2); CpuCopy16(src, palette, size * 2);
@@ -496,11 +495,11 @@ void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a
g1 = ((((GET_G(*dest) << 8) - (g << 8)) / a3) * a4) >> 8; g1 = ((((GET_G(*dest) << 8) - (g << 8)) / a3) * a4) >> 8;
b1 = ((((GET_B(*dest) << 8) - (b << 8)) / a3) * a4) >> 8; b1 = ((((GET_B(*dest) << 8) - (b << 8)) / a3) * a4) >> 8;
r = (r + r1) & 0x1F; //_RGB(r + r1, g + g1, b + b1); doesn't match; I have to assign the value of ((r + r1) & 0x1F) to r r = (r + r1) & 0x1F; //_RGB(r + r1, g + g1, b + b1); doesn't match
g = (g + g1) & 0x1F; //See above g = (g + g1) & 0x1F;
b = (b + b1) & 0x1F; //See above b = (b + b1) & 0x1F;
*palette = RGB2(r, g, b); //See above comment *palette = RGB2(r, g, b);
src++, dest++; src++, dest++;
palette++; palette++;
@@ -510,20 +509,20 @@ void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a
void PokenavFadeScreen(s32 fadeType) void PokenavFadeScreen(s32 fadeType)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
switch (fadeType) switch (fadeType)
{ {
case 0: case POKENAV_FADE_TO_BLACK:
BeginNormalPaletteFade(structPtr->palettes, -2, 0, 16, RGB_BLACK); BeginNormalPaletteFade(menu->palettes, -2, 0, 16, RGB_BLACK);
break; break;
case 1: case POKENAV_FADE_FROM_BLACK:
BeginNormalPaletteFade(structPtr->palettes, -2, 16, 0, RGB_BLACK); BeginNormalPaletteFade(menu->palettes, -2, 16, 0, RGB_BLACK);
break; break;
case 2: case POKENAV_FADE_TO_BLACK_ALL:
BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);
break; break;
case 3: case POKENAV_FADE_FROM_BLACK_ALL:
BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK);
break; break;
} }
@@ -534,9 +533,10 @@ bool32 IsPaletteFadeActive(void)
return gPaletteFade.active; return gPaletteFade.active;
} }
void sub_81C7B40(void) // Excludes the first obj and bg palettes
void FadeToBlackExceptPrimary(void)
{ {
BlendPalettes(PALETTES_ALL & ~(0x10000 | 0x1), 16, RGB_BLACK); BlendPalettes(PALETTES_ALL & ~(1 << 16 | 1), 16, RGB_BLACK);
} }
void InitBgTemplates(const struct BgTemplate *templates, int count) void InitBgTemplates(const struct BgTemplate *templates, int count)
@@ -549,21 +549,21 @@ void InitBgTemplates(const struct BgTemplate *templates, int count)
static void InitHelpBar(void) static void InitHelpBar(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
InitWindows(&sHelpBarWindowTemplate[0]); InitWindows(&sHelpBarWindowTemplate[0]);
structPtr->helpBarWindowId = 0; menu->helpBarWindowId = 0;
DrawHelpBar(structPtr->helpBarWindowId); DrawHelpBar(menu->helpBarWindowId);
PutWindowTilemap(structPtr->helpBarWindowId); PutWindowTilemap(menu->helpBarWindowId);
CopyWindowToVram(structPtr->helpBarWindowId, COPYWIN_FULL); CopyWindowToVram(menu->helpBarWindowId, COPYWIN_FULL);
} }
void PrintHelpBarText(u32 textId) void PrintHelpBarText(u32 textId)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
DrawHelpBar(structPtr->helpBarWindowId); DrawHelpBar(menu->helpBarWindowId);
AddTextPrinterParameterized3(structPtr->helpBarWindowId, FONT_NORMAL, 0, 1, sHelpBarTextColors, 0, sHelpBarTexts[textId]); AddTextPrinterParameterized3(menu->helpBarWindowId, FONT_NORMAL, 0, 1, sHelpBarTextColors, 0, sHelpBarTexts[textId]);
} }
bool32 WaitForHelpBar(void) bool32 WaitForHelpBar(void)
@@ -581,22 +581,22 @@ static void InitPokenavMainMenuResources(void)
{ {
s32 i; s32 i;
u8 spriteId; u8 spriteId;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
for (i = 0; i < ARRAY_COUNT(gSpinningPokenavSpriteSheet); i++) for (i = 0; i < ARRAY_COUNT(gSpinningPokenavSpriteSheet); i++)
LoadCompressedSpriteSheet(&gSpinningPokenavSpriteSheet[i]); LoadCompressedSpriteSheet(&gSpinningPokenavSpriteSheet[i]);
Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalettes); Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalettes);
structPtr->palettes = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); menu->palettes = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0));
spriteId = CreateSprite(&sSpinningPokenavSpriteTemplate, 220, 12, 0); spriteId = CreateSprite(&sSpinningPokenavSpriteTemplate, 220, 12, 0);
structPtr->spinningPokenav = &gSprites[spriteId]; menu->spinningPokenav = &gSprites[spriteId];
} }
static void CleanupPokenavMainMenuResources(void) static void CleanupPokenavMainMenuResources(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
DestroySprite(structPtr->spinningPokenav); DestroySprite(menu->spinningPokenav);
FreeSpriteTilesByTag(0); FreeSpriteTilesByTag(0);
FreeSpritePaletteByTag(0); FreeSpritePaletteByTag(0);
} }
@@ -607,47 +607,50 @@ static void SpriteCB_SpinningPokenav(struct Sprite *sprite)
sprite->y2 = (GetBgY(0) / 256u) * -1; sprite->y2 = (GetBgY(0) / 256u) * -1;
} }
struct Sprite *PauseSpinningPokenavSprite(void) struct Sprite *GetSpinningPokenavSprite(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
structPtr->spinningPokenav->callback = SpriteCallbackDummy; menu->spinningPokenav->callback = SpriteCallbackDummy;
return structPtr->spinningPokenav; return menu->spinningPokenav;
} }
void ResumeSpinningPokenavSprite(void) void HideSpinningPokenavSprite(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
structPtr->spinningPokenav->x = 220; // Move sprite so it's no longer visible
structPtr->spinningPokenav->y = 12; menu->spinningPokenav->x = 220;
structPtr->spinningPokenav->callback = SpriteCB_SpinningPokenav; menu->spinningPokenav->y = 12;
structPtr->spinningPokenav->invisible = FALSE; menu->spinningPokenav->callback = SpriteCB_SpinningPokenav;
structPtr->spinningPokenav->oam.priority = 0; menu->spinningPokenav->invisible = FALSE;
structPtr->spinningPokenav->subpriority = 0; menu->spinningPokenav->oam.priority = 0;
menu->spinningPokenav->subpriority = 0;
} }
static void InitHoennMapHeaderSprites(void) static void CreateLeftHeaderSprites(void)
{ {
s32 i, spriteId; s32 i, spriteId;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
LoadCompressedSpriteSheet(&sPokenavHoennMapLeftHeaderSpriteSheet); LoadCompressedSpriteSheet(&sMenuLeftHeaderSpriteSheet);
AllocSpritePalette(1); AllocSpritePalette(1);
AllocSpritePalette(2); AllocSpritePalette(2);
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
{ {
spriteId = CreateSprite(&sPokenavLeftHeaderHoennMapSpriteTemplate, 0, 0, 1); // Create main left header
structPtr->leftHeaderSprites[i] = &gSprites[spriteId]; spriteId = CreateSprite(&sLeftHeaderSpriteTemplate, 0, 0, 1);
structPtr->leftHeaderSprites[i]->invisible = TRUE; menu->leftHeaderSprites[i] = &gSprites[spriteId];
structPtr->leftHeaderSprites[i]->x2 = i * 64; menu->leftHeaderSprites[i]->invisible = TRUE;
menu->leftHeaderSprites[i]->x2 = i * 64;
spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2); // Create submenu left header
structPtr->submenuLeftHeaderSprites[i] = &gSprites[spriteId]; spriteId = CreateSprite(&sSubmenuLeftHeaderSpriteTemplate, 0, 0, 2);
structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; menu->submenuLeftHeaderSprites[i] = &gSprites[spriteId];
structPtr->submenuLeftHeaderSprites[i]->x2 = i * 32; menu->submenuLeftHeaderSprites[i]->invisible = TRUE;
structPtr->submenuLeftHeaderSprites[i]->y2 = 18; menu->submenuLeftHeaderSprites[i]->x2 = i * 32;
structPtr->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64; menu->submenuLeftHeaderSprites[i]->y2 = 18;
menu->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64;
} }
} }
@@ -661,34 +664,34 @@ void LoadLeftHeaderGfxForIndex(u32 menuGfxId)
void UpdateRegionMapRightHeaderTiles(u32 menuGfxId) void UpdateRegionMapRightHeaderTiles(u32 menuGfxId)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT) if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT)
structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32; menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32;
else else
structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64; menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64;
} }
static void LoadLeftHeaderGfxForMenu(u32 menuGfxId) static void LoadLeftHeaderGfxForMenu(u32 menuGfxId)
{ {
struct PokenavMainMenuResources *structPtr; struct Pokenav_MainMenu *menu;
u32 size, tag; u32 size, tag;
if (menuGfxId >= POKENAV_GFX_SUBMENUS_START) if (menuGfxId >= POKENAV_GFX_SUBMENUS_START)
return; return;
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
tag = sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].tag; tag = sMenuLeftHeaderSpriteSheets[menuGfxId].tag;
size = GetDecompressedDataSize(sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].data); size = GetDecompressedDataSize(sMenuLeftHeaderSpriteSheets[menuGfxId].data);
LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20);
LZ77UnCompWram(sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].data, gDecompressionBuffer); LZ77UnCompWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, gDecompressionBuffer);
RequestDma3Copy(gDecompressionBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1); RequestDma3Copy(gDecompressionBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1);
structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[menuGfxId].size; menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sMenuLeftHeaderSpriteSheets[menuGfxId].size;
if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT || menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_IN) if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT || menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_IN)
structPtr->leftHeaderSprites[1]->x2 = 56; menu->leftHeaderSprites[1]->x2 = 56;
else else
structPtr->leftHeaderSprites[1]->x2 = 64; menu->leftHeaderSprites[1]->x2 = 64;
} }
static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId) static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId)
@@ -731,20 +734,20 @@ void HideMainOrSubMenuLeftHeader(u32 id, bool32 onRightSide)
void SetLeftHeaderSpritesInvisibility(void) void SetLeftHeaderSpritesInvisibility(void)
{ {
s32 i; s32 i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
{ {
structPtr->leftHeaderSprites[i]->invisible = TRUE; menu->leftHeaderSprites[i]->invisible = TRUE;
structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; menu->submenuLeftHeaderSprites[i]->invisible = TRUE;
} }
} }
bool32 AreLeftHeaderSpritesMoving(void) bool32 AreLeftHeaderSpritesMoving(void)
{ {
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
if (structPtr->leftHeaderSprites[0]->callback == SpriteCallbackDummy && structPtr->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy) if (menu->leftHeaderSprites[0]->callback == SpriteCallbackDummy && menu->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy)
return FALSE; return FALSE;
else else
return TRUE; return TRUE;
@@ -753,66 +756,66 @@ bool32 AreLeftHeaderSpritesMoving(void)
static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide) static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide)
{ {
s32 start, end, i; s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
if (!isOnRightSide) if (!isOnRightSide)
start = -96, end = 32; start = -96, end = 32;
else else
start = 256, end = 160; start = 256, end = 160;
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
{ {
structPtr->leftHeaderSprites[i]->y = startY; menu->leftHeaderSprites[i]->y = startY;
MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); MoveLeftHeader(menu->leftHeaderSprites[i], start, end, 12);
} }
} }
static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide) static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide)
{ {
s32 start, end, i; s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
if (!isOnRightSide) if (!isOnRightSide)
start = -96, end = 16; start = -96, end = 16;
else else
start = 256, end = 192; start = 256, end = 192;
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) for (i = 0; i < (s32)ARRAY_COUNT(menu->submenuLeftHeaderSprites); i++)
{ {
structPtr->submenuLeftHeaderSprites[i]->y = startY; menu->submenuLeftHeaderSprites[i]->y = startY;
MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); MoveLeftHeader(menu->submenuLeftHeaderSprites[i], start, end, 12);
} }
} }
static void HideLeftHeaderSprites(bool32 isOnRightSide) static void HideLeftHeaderSprites(bool32 isOnRightSide)
{ {
s32 start, end, i; s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
if (!isOnRightSide) if (!isOnRightSide)
start = 32, end = -96; start = 32, end = -96;
else else
start = 192, end = 256; start = 192, end = 256;
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) for (i = 0; i < (s32)ARRAY_COUNT(menu->leftHeaderSprites); i++)
{ {
MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); MoveLeftHeader(menu->leftHeaderSprites[i], start, end, 12);
} }
} }
static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide) static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide)
{ {
s32 start, end, i; s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU);
if (!isOnRightSide) if (!isOnRightSide)
start = 16, end = -96; start = 16, end = -96;
else else
start = 192, end = 256; start = 192, end = 256;
for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) for (i = 0; i < (s32)ARRAY_COUNT(menu->submenuLeftHeaderSprites); i++)
{ {
MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); MoveLeftHeader(menu->submenuLeftHeaderSprites[i], start, end, 12);
} }
} }
File diff suppressed because it is too large Load Diff
+1301
View File
File diff suppressed because it is too large Load Diff
@@ -14,27 +14,27 @@
#include "strings.h" #include "strings.h"
#include "constants/songs.h" #include "constants/songs.h"
struct Pokenav3Struct struct Pokenav_MatchCallMenu
{ {
u16 optionCursorPos; u16 optionCursorPos;
u16 maxOptionId; u16 maxOptionId;
const u8 *matchCallOptions; const u8 *matchCallOptions;
u16 headerId; u16 headerId;
u16 numRegistered; u16 numRegistered;
u16 unkC; u16 numSpecialTrainers;
u32 unk10; bool32 initFinished;
u32 unk14; u32 loopedTaskId;
u32 (*callback)(struct Pokenav3Struct*); u32 (*callback)(struct Pokenav_MatchCallMenu*);
struct PokenavMatchCallEntries matchCallEntries[MAX_REMATCH_ENTRIES - 1]; struct PokenavMatchCallEntry matchCallEntries[MAX_REMATCH_ENTRIES - 1];
}; };
static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *); static u32 CB2_HandleMatchCallInput(struct Pokenav_MatchCallMenu *);
static u32 GetExitMatchCallMenuId(struct Pokenav3Struct *); static u32 GetExitMatchCallMenuId(struct Pokenav_MatchCallMenu *);
static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *); static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav_MatchCallMenu *);
static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *); static u32 CB2_HandleCheckPageInput(struct Pokenav_MatchCallMenu *);
static u32 CB2_HandleCallInput(struct Pokenav3Struct *); static u32 CB2_HandleCallExitInput(struct Pokenav_MatchCallMenu *);
static u32 sub_81CAD20(s32); static u32 LoopedTask_BuildMatchCallList(s32);
static bool32 sub_81CB1D0(void); static bool32 ShouldDoNearbyMessage(void);
#include "data/text/match_call_messages.h" #include "data/text/match_call_messages.h"
@@ -53,20 +53,20 @@ static const u8 sMatchCallOptionsHasCheckPage[] =
bool32 PokenavCallback_Init_MatchCall(void) bool32 PokenavCallback_Init_MatchCall(void)
{ {
struct Pokenav3Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN, sizeof(struct Pokenav3Struct)); struct Pokenav_MatchCallMenu *state = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN, sizeof(struct Pokenav_MatchCallMenu));
if (!state) if (!state)
return FALSE; return FALSE;
state->callback = CB2_HandleMatchCallInput; state->callback = CB2_HandleMatchCallInput;
state->headerId = 0; state->headerId = 0;
state->unk10 = 0; state->initFinished = FALSE;
state->unk14 = CreateLoopedTask(sub_81CAD20, 1); state->loopedTaskId = CreateLoopedTask(LoopedTask_BuildMatchCallList, 1);
return TRUE; return TRUE;
} }
u32 GetMatchCallCallback(void) u32 GetMatchCallCallback(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->callback(state); return state->callback(state);
} }
@@ -75,7 +75,7 @@ void FreeMatchCallSubstruct1(void)
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); FreePokenavSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
} }
static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state) static u32 CB2_HandleMatchCallInput(struct Pokenav_MatchCallMenu *state)
{ {
int selection; int selection;
@@ -92,7 +92,7 @@ static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state)
{ {
state->callback = CB2_HandleMatchCallOptionsInput; state->callback = CB2_HandleMatchCallOptionsInput;
state->optionCursorPos = 0; state->optionCursorPos = 0;
selection = GetSelectedPokenavListIndex(); selection = PokenavList_GetSelectedIndex();
if (!state->matchCallEntries[selection].isSpecialTrainer || MatchCall_HasCheckPage(state->matchCallEntries[selection].headerId)) if (!state->matchCallEntries[selection].isSpecialTrainer || MatchCall_HasCheckPage(state->matchCallEntries[selection].headerId))
{ {
@@ -125,20 +125,20 @@ static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state)
return POKENAV_MC_FUNC_NONE; return POKENAV_MC_FUNC_NONE;
} }
static u32 GetExitMatchCallMenuId(struct Pokenav3Struct *state) static u32 GetExitMatchCallMenuId(struct Pokenav_MatchCallMenu *state)
{ {
return POKENAV_MAIN_MENU_CURSOR_ON_MATCH_CALL; return POKENAV_MAIN_MENU_CURSOR_ON_MATCH_CALL;
} }
static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state) static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav_MatchCallMenu *state)
{ {
if ((JOY_NEW(DPAD_UP)) && state->optionCursorPos) if (JOY_NEW(DPAD_UP) && state->optionCursorPos)
{ {
state->optionCursorPos--; state->optionCursorPos--;
return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR; return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR;
} }
if ((JOY_NEW(DPAD_DOWN)) && state->optionCursorPos < state->maxOptionId) if (JOY_NEW(DPAD_DOWN) && state->optionCursorPos < state->maxOptionId)
{ {
state->optionCursorPos++; state->optionCursorPos++;
return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR; return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR;
@@ -155,8 +155,8 @@ static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state)
if (GetPokenavMode() == POKENAV_MODE_FORCE_CALL_READY) if (GetPokenavMode() == POKENAV_MODE_FORCE_CALL_READY)
SetPokenavMode(POKENAV_MODE_FORCE_CALL_EXIT); SetPokenavMode(POKENAV_MODE_FORCE_CALL_EXIT);
state->callback = CB2_HandleCallInput; state->callback = CB2_HandleCallExitInput;
if (sub_81CB1D0()) if (ShouldDoNearbyMessage())
return POKENAV_MC_FUNC_NEARBY_MSG; return POKENAV_MC_FUNC_NEARBY_MSG;
return POKENAV_MC_FUNC_CALL_MSG; return POKENAV_MC_FUNC_CALL_MSG;
@@ -175,7 +175,7 @@ static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state)
return POKENAV_MC_FUNC_NONE; return POKENAV_MC_FUNC_NONE;
} }
static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *state) static u32 CB2_HandleCheckPageInput(struct Pokenav_MatchCallMenu *state)
{ {
if (JOY_REPEAT(DPAD_UP)) if (JOY_REPEAT(DPAD_UP))
return POKENAV_MC_FUNC_CHECK_PAGE_UP; return POKENAV_MC_FUNC_CHECK_PAGE_UP;
@@ -191,21 +191,21 @@ static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *state)
return POKENAV_MC_FUNC_NONE; return POKENAV_MC_FUNC_NONE;
} }
static u32 CB2_HandleCallInput(struct Pokenav3Struct *state) static u32 CB2_HandleCallExitInput(struct Pokenav_MatchCallMenu *state)
{ {
if (JOY_NEW(A_BUTTON | B_BUTTON)) if (JOY_NEW(A_BUTTON | B_BUTTON))
{ {
state->callback = CB2_HandleMatchCallInput; state->callback = CB2_HandleMatchCallInput;
return POKENAV_MC_FUNC_10; return POKENAV_MC_FUNC_EXIT_CALL;
} }
return POKENAV_MC_FUNC_NONE; return POKENAV_MC_FUNC_NONE;
} }
static u32 sub_81CAD20(s32 taskState) static u32 LoopedTask_BuildMatchCallList(s32 taskState)
{ {
int i, j; int i, j;
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
switch (taskState) switch (taskState)
{ {
case 0: case 0:
@@ -213,6 +213,7 @@ static u32 sub_81CAD20(s32 taskState)
state->numRegistered = 0; state->numRegistered = 0;
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 1: case 1:
// Load special trainers (e.g. Rival, gym leaders)
for (i = 0, j = state->headerId; i < 30; i++, j++) for (i = 0, j = state->headerId; i < 30; i++, j++)
{ {
if (MatchCall_GetEnabled(j)) if (MatchCall_GetEnabled(j))
@@ -225,7 +226,7 @@ static u32 sub_81CAD20(s32 taskState)
if (++state->headerId >= MC_HEADER_COUNT) if (++state->headerId >= MC_HEADER_COUNT)
{ {
state->unkC = state->headerId; state->numSpecialTrainers = state->headerId;
state->headerId = 0; state->headerId = 0;
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
} }
@@ -233,6 +234,7 @@ static u32 sub_81CAD20(s32 taskState)
return LT_CONTINUE; return LT_CONTINUE;
case 2: case 2:
// Load normal trainers
for (i = 0, j = state->headerId; i < 30; i++, j++) for (i = 0, j = state->headerId; i < 30; i++, j++)
{ {
if (!MatchCall_HasRematchId(state->headerId) && IsRematchEntryRegistered(state->headerId)) if (!MatchCall_HasRematchId(state->headerId) && IsRematchEntryRegistered(state->headerId))
@@ -249,7 +251,7 @@ static u32 sub_81CAD20(s32 taskState)
return LT_CONTINUE; return LT_CONTINUE;
case 3: case 3:
state->unk10 = 1; state->initFinished = TRUE;
break; break;
} }
@@ -264,55 +266,58 @@ bool32 IsRematchEntryRegistered(int rematchIndex)
return FALSE; return FALSE;
} }
int sub_81CAE28(void) int IsMatchCallListInitFinished(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->unk10; return state->initFinished;
} }
int GetNumberRegistered(void) int GetNumberRegistered(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->numRegistered; return state->numRegistered;
} }
int sub_81CAE48(void) // Unused
static int GetNumSpecialTrainers(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->unkC; return state->numSpecialTrainers;
} }
int unref_sub_81CAE58(void) // Unused
static int GetNumNormalTrainers(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->numRegistered - state->unkC; return state->numRegistered - state->numSpecialTrainers;
} }
int unref_sub_81CAE6C(int arg0) // Unused
static int GetNormalTrainerHeaderId(int index)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
arg0 += state->unkC; index += state->numSpecialTrainers;
if (arg0 >= state->numRegistered) if (index >= state->numRegistered)
return REMATCH_TABLE_ENTRIES; return REMATCH_TABLE_ENTRIES;
return state->matchCallEntries[arg0].headerId; return state->matchCallEntries[index].headerId;
} }
struct PokenavMatchCallEntries *sub_81CAE94(void) struct PokenavMatchCallEntry *GetMatchCallList(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->matchCallEntries; return state->matchCallEntries;
} }
u16 GetMatchCallMapSec(int index) u16 GetMatchCallMapSec(int index)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->matchCallEntries[index].mapSec; return state->matchCallEntries[index].mapSec;
} }
bool32 ShouldDrawRematchPokeballIcon(int index) bool32 ShouldDrawRematchPokeballIcon(int index)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
if (!state->matchCallEntries[index].isSpecialTrainer) if (!state->matchCallEntries[index].isSpecialTrainer)
index = state->matchCallEntries[index].headerId; index = state->matchCallEntries[index].headerId;
else else
@@ -327,7 +332,7 @@ bool32 ShouldDrawRematchPokeballIcon(int index)
int GetMatchCallTrainerPic(int index) int GetMatchCallTrainerPic(int index)
{ {
int headerId; int headerId;
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
if (!state->matchCallEntries[index].isSpecialTrainer) if (!state->matchCallEntries[index].isSpecialTrainer)
{ {
index = GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId); index = GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId);
@@ -346,15 +351,15 @@ int GetMatchCallTrainerPic(int index)
return gFacilityClassToPicIndex[index]; return gFacilityClassToPicIndex[index];
} }
const u8 *GetMatchCallMessageText(int index, u8 *arg1) const u8 *GetMatchCallMessageText(int index, bool8 *newRematchRequest)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
*arg1 = 0; *newRematchRequest = FALSE;
if (!Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) if (!Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType))
return gText_CallCantBeMadeHere; return gText_CallCantBeMadeHere;
if (!state->matchCallEntries[index].isSpecialTrainer) if (!state->matchCallEntries[index].isSpecialTrainer)
*arg1 = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId), gStringVar4); *newRematchRequest = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId), gStringVar4);
else else
MatchCall_GetMessage(state->matchCallEntries[index].headerId, gStringVar4); MatchCall_GetMessage(state->matchCallEntries[index].headerId, gStringVar4);
@@ -364,7 +369,7 @@ const u8 *GetMatchCallMessageText(int index, u8 *arg1)
const u8 *GetMatchCallFlavorText(int index, int checkPageEntry) const u8 *GetMatchCallFlavorText(int index, int checkPageEntry)
{ {
int rematchId; int rematchId;
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
if (state->matchCallEntries[index].isSpecialTrainer) if (state->matchCallEntries[index].isSpecialTrainer)
{ {
rematchId = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId); rematchId = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId);
@@ -381,20 +386,20 @@ const u8 *GetMatchCallFlavorText(int index, int checkPageEntry)
u16 GetMatchCallOptionCursorPos(void) u16 GetMatchCallOptionCursorPos(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
return state->optionCursorPos; return state->optionCursorPos;
} }
u16 GetMatchCallOptionId(int optionId) u16 GetMatchCallOptionId(int optionId)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
if (state->maxOptionId < optionId) if (state->maxOptionId < optionId)
return MATCH_CALL_OPTION_COUNT; return MATCH_CALL_OPTION_COUNT;
return state->matchCallOptions[optionId]; return state->matchCallOptions[optionId];
} }
void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntries *matchCallEntry, u8 *str) void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 *str)
{ {
const u8 *trainerName; const u8 *trainerName;
const u8 *className; const u8 *className;
@@ -431,7 +436,7 @@ u8 GetMatchTableMapSectionId(int rematchIndex)
int GetIndexDeltaOfNextCheckPageDown(int index) int GetIndexDeltaOfNextCheckPageDown(int index)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
int count = 1; int count = 1;
while (++index < state->numRegistered) while (++index < state->numRegistered)
{ {
@@ -448,7 +453,7 @@ int GetIndexDeltaOfNextCheckPageDown(int index)
int GetIndexDeltaOfNextCheckPageUp(int index) int GetIndexDeltaOfNextCheckPageUp(int index)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
int count = -1; int count = -1;
while (--index >= 0) while (--index >= 0)
{ {
@@ -463,7 +468,8 @@ int GetIndexDeltaOfNextCheckPageUp(int index)
return 0; return 0;
} }
bool32 unref_sub_81CB16C(void) // Unused
static bool32 HasRematchEntry(void)
{ {
int i; int i;
@@ -486,10 +492,10 @@ bool32 unref_sub_81CB16C(void)
return FALSE; return FALSE;
} }
static bool32 sub_81CB1D0(void) static bool32 ShouldDoNearbyMessage(void)
{ {
struct Pokenav3Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN);
int selection = GetSelectedPokenavListIndex(); int selection = PokenavList_GetSelectedIndex();
if (!state->matchCallEntries[selection].isSpecialTrainer) if (!state->matchCallEntries[selection].isSpecialTrainer)
{ {
if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId) if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId)
-997
View File
@@ -1,997 +0,0 @@
#include "global.h"
#include "pokenav.h"
#include "window.h"
#include "strings.h"
#include "text.h"
#include "bg.h"
#include "menu.h"
#include "decompress.h"
#include "international_string_util.h"
// TODO: This UI isnt just for match call, seems to be the general pokenav list UI
struct PokenavListMenuWindow {
u8 bg;
u8 unk1;
u8 unk2;
u8 unk3;
u8 unk4;
u8 fontId;
u16 unk6;
u16 windowId;
u16 unkA;
u16 unkC;
u16 unkE;
};
struct MatchCallWindowState {
// The index of the element at the top of the window.
u16 windowTopIndex;
u16 listLength;
u16 unk4;
// The index of the cursor, relative to the top of the window.
u16 selectedIndexOffset;
u16 visibleEntries;
u16 unkA;
u32 unkC;
void * unk10;
};
struct PokenavSub17Substruct
{
struct PokenavListMenuWindow listWindow;
u32 unk10;
u32 unk14;
u32 unk18;
void * unk1C;
s32 unk20;
s32 unk24;
u32 loopedTaskId;
s32 unk2C;
u32 unk30;
void (*unk34)(struct PokenavMatchCallEntries *, u8*);
void (*unk38)(u16, u32, u32);
struct Sprite *rightArrow;
struct Sprite *upArrow;
struct Sprite *downArrow;
u8 unkTextBuffer[0x40];
};
// Generally at index 0x11 (17)
struct PokenavSub17
{
struct PokenavSub17Substruct list;
u8 tilemapBuffer[0x800];
struct MatchCallWindowState unk888;
s32 unk89C;
u32 loopedTaskId;
};
void sub_81C82E4(struct PokenavSub17 *matchCall);
bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct PokenavListTemplate *a2, s32 a3);
void InitMatchCallWindowState(struct MatchCallWindowState *a0, struct PokenavListTemplate *a1);
void SpriteCB_MatchCallUpArrow(struct Sprite *sprite);
void SpriteCB_MatchCallDownArrow(struct Sprite *sprite);
void SpriteCB_MatchCallRightArrow(struct Sprite *sprite);
void ToggleMatchCallArrows(struct PokenavSub17Substruct *a0, u32 a1);
void DestroyMatchCallListArrows(struct PokenavSub17Substruct *a0);
void CreateMatchCallArrowSprites(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
void sub_81C8ED0(void);
static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1, u32 a2);
void PrintMatchCallFieldNames(struct PokenavSub17Substruct *a0, u32 a1);
void sub_81C8D4C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
void sub_81C8CB4(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
void sub_81C8B70(struct PokenavListMenuWindow *a0, s32 a1, s32 a2);
void sub_81C8568(s32 a0, struct PokenavSub17Substruct *a1);
void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *a5);
void sub_81C837C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
void sub_81C835C(struct PokenavListMenuWindow *a0);
u32 LoopedTask_sub_81C8254(s32 state);
bool32 sub_81C83E0(void);
u32 LoopedTask_sub_81C83F0(s32 state);
u32 LoopedTask_sub_81C85A0(s32 state);
u32 LoopedTask_sub_81C8870(s32 state);
u32 LoopedTask_sub_81C8A28(s32 state);
u32 LoopedTask_PrintCheckPageInfo(s32 state);
static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal");
static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz");
EWRAM_DATA u32 gUnknown_0203CF44 = 0;
bool32 sub_81C81D4(const struct BgTemplate *arg0, struct PokenavListTemplate *arg1, s32 arg2)
{
struct PokenavSub17 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_LIST, sizeof(struct PokenavSub17));
if (structPtr == NULL)
return FALSE;
InitMatchCallWindowState(&structPtr->unk888, arg1);
if (!CopyPokenavListMenuTemplate(&structPtr->list, arg0, arg1, arg2))
return FALSE;
CreateLoopedTask(LoopedTask_sub_81C8254, 6);
return TRUE;
}
bool32 sub_81C8224(void)
{
return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254);
}
void sub_81C8234(void)
{
struct PokenavSub17 *structPtr;
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
DestroyMatchCallListArrows(&structPtr->list);
RemoveWindow(structPtr->list.listWindow.windowId);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
}
u32 LoopedTask_sub_81C8254(s32 state)
{
struct PokenavSub17 *structPtr;
if (IsDma3ManagerBusyWithBgCopy())
return LT_PAUSE;
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
switch (state)
{
case 0:
sub_81C82E4(structPtr);
return LT_INC_AND_PAUSE;
case 1:
sub_81C835C(&structPtr->list.listWindow);
return LT_INC_AND_PAUSE;
case 2:
sub_81C837C(&structPtr->unk888, &structPtr->list);
return LT_INC_AND_PAUSE;
case 3:
if (sub_81C83E0())
{
return LT_PAUSE;
}
else
{
sub_81C8ED0();
return LT_INC_AND_CONTINUE;
}
case 4:
CreateMatchCallArrowSprites(&structPtr->unk888, &structPtr->list);
return LT_FINISH;
default:
return LT_FINISH;
}
}
void sub_81C82E4(struct PokenavSub17 *matchCall)
{
u16 tileNum = (matchCall->list.listWindow.unk1 << 12) | matchCall->list.listWindow.unk6;
BgDmaFill(matchCall->list.listWindow.bg, PIXEL_FILL(1), matchCall->list.listWindow.unk6, 1);
BgDmaFill(matchCall->list.listWindow.bg, PIXEL_FILL(4), matchCall->list.listWindow.unk6 + 1, 1);
SetBgTilemapBuffer(matchCall->list.listWindow.bg, matchCall->tilemapBuffer);
FillBgTilemapBufferRect_Palette0(matchCall->list.listWindow.bg, tileNum, 0, 0, 32, 32);
ChangeBgY(matchCall->list.listWindow.bg, 0, BG_COORD_SET);
ChangeBgX(matchCall->list.listWindow.bg, 0, BG_COORD_SET);
ChangeBgY(matchCall->list.listWindow.bg, matchCall->list.listWindow.unk3 << 11, BG_COORD_SUB);
CopyBgTilemapBufferToVram(matchCall->list.listWindow.bg);
}
void sub_81C835C(struct PokenavListMenuWindow *listWindow)
{
FillWindowPixelBuffer(listWindow->windowId, PIXEL_FILL(1));
PutWindowTilemap(listWindow->windowId);
CopyWindowToVram(listWindow->windowId, COPYWIN_MAP);
}
void sub_81C837C(struct MatchCallWindowState *state, struct PokenavSub17Substruct *a1)
{
s32 arg2 = state->listLength - state->windowTopIndex;
if (arg2 > state->visibleEntries)
arg2 = state->visibleEntries;
sub_81C83AC(state->unk10, state->windowTopIndex, arg2, state->unkC, 0, a1);
}
void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *list)
{
if (a2 == 0)
return;
list->unk1C = a0 + a1 * a3;
list->unk18 = a3;
list->listWindow.unkC = 0;
list->listWindow.unkE = a2;
list->unk14 = a1;
list->unk10 = a4;
CreateLoopedTask(LoopedTask_sub_81C83F0, 5);
}
bool32 sub_81C83E0(void)
{
return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0);
}
u32 LoopedTask_sub_81C83F0(s32 state)
{
u32 v1;
struct PokenavSub17Substruct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
switch (state)
{
case 0:
v1 = (structPtr->listWindow.unkA + structPtr->listWindow.unkC + structPtr->unk10) & 0xF;
structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer);
if (structPtr->unk38 != NULL)
structPtr->unk38(structPtr->listWindow.windowId, structPtr->unk14, v1);
AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL);
if (++structPtr->listWindow.unkC >= structPtr->listWindow.unkE)
{
if (structPtr->unk38 != NULL)
CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_FULL);
else
CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_GFX);
return LT_INC_AND_PAUSE;
}
else
{
structPtr->unk1C += structPtr->unk18;
structPtr->unk14++;
return LT_CONTINUE;
}
case 1:
if (IsDma3ManagerBusyWithBgCopy())
return LT_PAUSE;
return LT_FINISH;
}
return LT_FINISH;
}
bool32 ShouldShowUpArrow(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
return (structPtr->unk888.windowTopIndex != 0);
}
bool32 ShouldShowDownArrow(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
struct MatchCallWindowState *subPtr = &structPtr->unk888;
return (subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength);
}
void MatchCall_MoveWindow(s32 a0, bool32 a1)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
struct MatchCallWindowState *subPtr = &structPtr->unk888;
if (a0 < 0)
{
if (subPtr->windowTopIndex + a0 < 0)
a0 = -1 * subPtr->windowTopIndex;
if (a1)
sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + a0, a0 * -1, subPtr->unkC, a0, &structPtr->list);
}
else if (a1)
{
s32 temp = gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries;
if (temp + a0 >= subPtr->listLength)
a0 = subPtr->listLength - temp;
sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, a0, subPtr->unkC, subPtr->visibleEntries, &structPtr->list);
}
sub_81C8568(a0, &structPtr->list);
subPtr->windowTopIndex += a0;
}
void sub_81C8568(s32 a0, struct PokenavSub17Substruct *list)
{
list->unk20 = GetBgY(list->listWindow.bg);
list->unk24 = list->unk20 + (a0 << 12);
if (a0 > 0)
list->unk30 = BG_COORD_ADD;
else
list->unk30 = BG_COORD_SUB;
list->unk2C = a0;
list->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C85A0, 6);
}
u32 LoopedTask_sub_81C85A0(s32 state)
{
s32 y, v1;
bool32 flag;
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
struct PokenavSub17Substruct *subPtr = &structPtr->list;
switch (state)
{
case 0:
if (!sub_81C83E0())
return LT_INC_AND_CONTINUE;
return LT_PAUSE;
case 1:
flag = FALSE;
y = GetBgY(subPtr->listWindow.bg);
v1 = ChangeBgY(subPtr->listWindow.bg, 0x1000, subPtr->unk30);
if (subPtr->unk30 == BG_COORD_SUB)
{
if ((y > subPtr->unk24 || y <= subPtr->unk20) && v1 <= subPtr->unk24)
flag = TRUE;
}
else // BG_COORD_ADD
{
if ((y < subPtr->unk24 || y >= subPtr->unk20) && v1 >= subPtr->unk24)
flag = TRUE;
}
if (flag)
{
subPtr->listWindow.unkA = (subPtr->listWindow.unkA + subPtr->unk2C) & 0xF;
ChangeBgY(subPtr->listWindow.bg, subPtr->unk24, BG_COORD_SET);
return LT_FINISH;
}
return LT_PAUSE;
}
return LT_FINISH;
}
bool32 IsMonListLoopedTaskActive(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
return IsLoopedTaskActive(structPtr->list.loopedTaskId);
}
struct MatchCallWindowState *GetMatchCallWindowStruct(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
return &structPtr->unk888;
}
int MatchCall_MoveCursorUp(void)
{
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
if (structPtr->selectedIndexOffset != 0)
{
structPtr->selectedIndexOffset--;
return 1;
}
if (ShouldShowUpArrow())
{
MatchCall_MoveWindow(-1, TRUE);
return 2;
}
return 0;
}
int MatchCall_MoveCursorDown(void)
{
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
if (structPtr->windowTopIndex + structPtr->selectedIndexOffset >= structPtr->listLength - 1)
return 0;
if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1)
{
structPtr->selectedIndexOffset++;
return 1;
}
if (ShouldShowDownArrow())
{
MatchCall_MoveWindow(1, TRUE);
return 2;
}
return 0;
}
int MatchCall_PageUp(void)
{
s32 scroll;
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
if (ShouldShowUpArrow())
{
if (structPtr->windowTopIndex >= structPtr->visibleEntries)
scroll = structPtr->visibleEntries;
else
scroll = structPtr->windowTopIndex;
MatchCall_MoveWindow(scroll * -1, TRUE);
return 2;
}
else if (structPtr->selectedIndexOffset != 0)
{
structPtr->selectedIndexOffset = 0;
return 1;
}
return 0;
}
int MatchCall_PageDown(void)
{
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
if (ShouldShowDownArrow())
{
s32 windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries;
s32 scroll = structPtr->unk4 - structPtr->windowTopIndex;
if (windowBottomIndex <= structPtr->unk4)
scroll = structPtr->visibleEntries;
MatchCall_MoveWindow(scroll, TRUE);
return 2;
}
else
{
s32 cursor, lastVisibleIndex;
if (structPtr->listLength >= structPtr->visibleEntries)
{
cursor = structPtr->selectedIndexOffset;
lastVisibleIndex = structPtr->visibleEntries;
}
else
{
cursor = structPtr->selectedIndexOffset;
lastVisibleIndex = structPtr->listLength;
}
lastVisibleIndex -= 1;
if (cursor >= lastVisibleIndex)
return 0;
structPtr->selectedIndexOffset = lastVisibleIndex;
return 1;
}
}
u32 GetSelectedPokenavListIndex(void)
{
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
return structPtr->windowTopIndex + structPtr->selectedIndexOffset;
}
u32 GetMatchCallListTopIndex(void)
{
struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
return structPtr->windowTopIndex;
}
void sub_81C877C(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
structPtr->unk89C = 0;
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8870, 6);
}
void PrintCheckPageInfo(s16 a0)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
structPtr->unk888.windowTopIndex += a0;
structPtr->unk89C = 0;
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_PrintCheckPageInfo, 6);
}
void sub_81C87F0(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
structPtr->unk89C = 0;
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8A28, 6);
}
bool32 IsMatchCallListTaskActive(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
return IsLoopedTaskActive(structPtr->loopedTaskId);
}
void sub_81C8838(void)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
struct MatchCallWindowState *subPtr = &structPtr->unk888;
structPtr->list.unk38(structPtr->list.listWindow.windowId, subPtr->windowTopIndex + subPtr->selectedIndexOffset, (structPtr->list.listWindow.unkA + subPtr->selectedIndexOffset) & 0xF);
CopyWindowToVram(structPtr->list.listWindow.windowId, COPYWIN_MAP);
}
// TODO:
u32 LoopedTask_sub_81C8870(s32 state)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
switch (state)
{
case 0:
ToggleMatchCallArrows(&structPtr->list, 1);
// fall-through
case 1:
if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset)
sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, 1);
structPtr->unk89C++;
return LT_INC_AND_PAUSE;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
if (structPtr->unk89C != structPtr->unk888.visibleEntries)
return 6;
if (structPtr->unk888.selectedIndexOffset != 0)
sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, structPtr->unk888.selectedIndexOffset);
return LT_INC_AND_PAUSE;
}
return LT_PAUSE;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
{
if (structPtr->unk888.selectedIndexOffset != 0)
{
MatchCall_MoveWindow(structPtr->unk888.selectedIndexOffset, FALSE);
return LT_INC_AND_PAUSE;
}
return LT_FINISH;
}
return LT_PAUSE;
case 4:
if (IsMonListLoopedTaskActive())
return LT_PAUSE;
structPtr->unk888.selectedIndexOffset = 0;
return LT_FINISH;
}
return LT_FINISH;
}
u32 LoopedTask_PrintCheckPageInfo(s32 state)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
if (IsDma3ManagerBusyWithBgCopy())
return LT_PAUSE;
switch (state)
{
case 0:
sub_81C8CB4(&structPtr->unk888, &structPtr->list);
break;
case 1:
PrintMatchCallFieldNames(&structPtr->list, 0);
break;
case 2:
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_STRATEGY);
break;
case 3:
PrintMatchCallFieldNames(&structPtr->list, 1);
break;
case 4:
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_POKEMON);
break;
case 5:
PrintMatchCallFieldNames(&structPtr->list, 2);
break;
case 6:
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_INTRO_1);
break;
case 7:
PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_INTRO_2);
break;
default:
return LT_FINISH;
}
return LT_INC_AND_PAUSE;
}
u32 LoopedTask_sub_81C8A28(s32 state)
{
struct PokenavSub17 *structPtr;
struct MatchCallWindowState *subPtr888;
struct PokenavSub17Substruct *subPtr0;
s32 r5, *ptr;
if (IsDma3ManagerBusyWithBgCopy())
return LT_PAUSE;
structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
subPtr888 = &structPtr->unk888;
subPtr0 = &structPtr->list;
switch (state)
{
case 0:
sub_81C8D4C(subPtr888, subPtr0);
return LT_INC_AND_PAUSE;
case 1:
ptr = &structPtr->unk89C;
if (++(*ptr) < structPtr->unk888.visibleEntries)
{
sub_81C8B70(&subPtr0->listWindow, *ptr, 1);
return LT_PAUSE;
}
*ptr = 0;
if (subPtr888->listLength <= subPtr888->visibleEntries)
{
if (subPtr888->windowTopIndex != 0)
{
s32 r4 = subPtr888->windowTopIndex;
r5 = -r4;
sub_81C8B70(&subPtr0->listWindow, r5, r4);
subPtr888->selectedIndexOffset = r4;
*ptr = r5;
return LT_INC_AND_PAUSE;
}
}
else
{
if (subPtr888->windowTopIndex + subPtr888->visibleEntries > subPtr888->listLength)
{
s32 r4 = subPtr888->windowTopIndex + subPtr888->visibleEntries - subPtr888->listLength;
r5 = -r4;
sub_81C8B70(&subPtr0->listWindow, r5, r4);
subPtr888->selectedIndexOffset = r4;
*ptr = r5;
return LT_INC_AND_PAUSE;
}
}
return 9;
case 2:
MatchCall_MoveWindow(structPtr->unk89C, FALSE);
return LT_INC_AND_PAUSE;
case 3:
if (!IsMonListLoopedTaskActive())
{
structPtr->unk89C = 0;
return 1;
}
return 2;
case 4:
sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->list);
return LT_INC_AND_PAUSE;
case 5:
if (sub_81C83E0())
return LT_PAUSE;
if (++structPtr->unk89C >= subPtr888->listLength || structPtr->unk89C >= subPtr888->visibleEntries)
return LT_INC_AND_CONTINUE;
return 9;
case 6:
ToggleMatchCallArrows(subPtr0, 0);
return LT_FINISH;
}
return LT_FINISH;
}
void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2)
{
u8 *v1 = (u8*)GetWindowAttribute(listWindow->windowId, WINDOW_TILE_DATA);
u32 v2 = listWindow->unk4 * 64;
a1 = (listWindow->unkA + a1) & 0xF;
if (a1 + a2 <= 16)
{
CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2);
CopyWindowToVram(listWindow->windowId, COPYWIN_GFX);
}
else
{
u32 v3 = 16 - a1;
u32 v4 = a2 - v3;
CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2);
CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2);
CopyWindowToVram(listWindow->windowId, COPYWIN_GFX);
}
for (a2--; a2 != -1; a1 = (a1 + 1) & 0xF, a2--)
ClearRematchPokeballIcon(listWindow->windowId, a1);
CopyWindowToVram(listWindow->windowId, COPYWIN_MAP);
}
void sub_81C8C64(struct PokenavListMenuWindow *listWindow, u32 a1)
{
u16 var;
u16 *v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(listWindow->windowId, WINDOW_BG));
v1 += ((listWindow->unkA << 6) + listWindow->unk2) - 1;
if (a1 != 0)
var = (listWindow->unk1 << 12) | (listWindow->unk6 + 1);
else
var = (listWindow->unk1 << 12) | (listWindow->unk6);
v1[0] = var;
v1[0x20] = var;
}
void sub_81C8CB4(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list)
{
u8 colors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_RED};
list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer);
list->unk38(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA);
FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(4), 0, list->listWindow.unkA * 16, list->listWindow.unk4 * 8, 16);
AddTextPrinterParameterized3(list->listWindow.windowId, list->listWindow.fontId, 8, (list->listWindow.unkA * 16) + 1, colors, TEXT_SKIP_DRAW, list->unkTextBuffer);
sub_81C8C64(&list->listWindow, 1);
CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_FULL, 0, list->listWindow.unkA * 2, list->listWindow.unk4, 2);
}
void sub_81C8D4C(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list)
{
list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer);
FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, list->listWindow.unkA * 16, list->listWindow.unk4 * 8, 16);
AddTextPrinterParameterized(list->listWindow.windowId, list->listWindow.fontId, list->unkTextBuffer, 8, list->listWindow.unkA * 16 + 1, TEXT_SKIP_DRAW, NULL);
sub_81C8C64(&list->listWindow, 0);
CopyWindowToVram(list->listWindow.windowId, COPYWIN_FULL);
}
void PrintMatchCallFieldNames(struct PokenavSub17Substruct *list, u32 fieldId)
{
const u8 *fieldNames[] = {gText_PokenavMatchCall_Strategy, gText_PokenavMatchCall_TrainerPokemon, gText_PokenavMatchCall_SelfIntroduction};
u8 colors[3] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED};
u32 top = (list->listWindow.unkA + 1 + (fieldId * 2)) & 0xF;
FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, top << 4, list->listWindow.unk4, 16);
AddTextPrinterParameterized3(list->listWindow.windowId, FONT_NARROW, 2, (top << 4) + 1, colors, TEXT_SKIP_DRAW, fieldNames[fieldId]);
CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, top << 1, list->listWindow.unk4, 2);
}
static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *list, u32 checkPageEntry)
{
// lines 1, 3, and 5 are the field names printed by PrintMatchCallFieldNames
static const u8 lineOffsets[CHECK_PAGE_ENTRY_COUNT] =
{
[CHECK_PAGE_STRATEGY] = 2,
[CHECK_PAGE_POKEMON] = 4,
[CHECK_PAGE_INTRO_1] = 6,
[CHECK_PAGE_INTRO_2] = 7
};
u32 r6 = (list->listWindow.unkA + lineOffsets[checkPageEntry]) & 0xF;
const u8 *str = GetMatchCallFlavorText(a0->windowTopIndex, checkPageEntry);
if (str != NULL)
{
FillWindowTilesByRow(list->listWindow.windowId, 1, r6 * 2, list->listWindow.unk4 - 1, 2);
AddTextPrinterParameterized(list->listWindow.windowId, FONT_NARROW, str, 2, (r6 << 4) + 1, TEXT_SKIP_DRAW, NULL);
CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, r6 * 2, list->listWindow.unk4, 2);
}
}
static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheets[] =
{
{
.data = sMatchcallArrowSpriteSheetData,
.size = 192,
.tag = 0xA
}
};
static const struct SpritePalette sMatchcallArrowPalettes[] =
{
{
.data = sMatchcallArrowPaletteData,
.tag = 0x14
},
{}
};
static const struct OamData sMatchCallRightArrowSpriteOam =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x16),
.x = 0,
.size = SPRITE_SIZE(8x16),
.tileNum = 0,
.priority = 2,
.paletteNum = 0
};
static const struct SpriteTemplate sMatchCallRightArrowSprite =
{
.tileTag = 0xA,
.paletteTag = 0x14,
.oam = &sMatchCallRightArrowSpriteOam,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_MatchCallRightArrow
};
static const struct OamData sMatchCallUpDownArrowSpriteOam =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x8),
.x = 0,
.size = SPRITE_SIZE(16x8),
.tileNum = 0,
.priority = 2,
.paletteNum = 0
};
static const struct SpriteTemplate sMatchCallUpDownArrowSprite =
{
.tileTag = 0xA,
.paletteTag = 0x14,
.oam = &sMatchCallUpDownArrowSpriteOam,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
void sub_81C8ED0(void)
{
u32 i;
const struct CompressedSpriteSheet *ptr;
for (i = 0, ptr = sMatchcallArrowSpriteSheets; i < ARRAY_COUNT(sMatchcallArrowSpriteSheets); ptr++, i++)
LoadCompressedSpriteSheet(ptr);
Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalettes);
}
void CreateMatchCallArrowSprites(struct MatchCallWindowState *windowState, struct PokenavSub17Substruct *list)
{
u32 spriteId;
s16 x;
spriteId = CreateSprite(&sMatchCallRightArrowSprite, list->listWindow.unk2 * 8 + 3, (list->listWindow.unk3 + 1) * 8, 7);
list->rightArrow = &gSprites[spriteId];
x = list->listWindow.unk2 * 8 + (list->listWindow.unk4 - 1) * 4;
spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, list->listWindow.unk3 * 8 + windowState->visibleEntries * 16, 7);
list->downArrow = &gSprites[spriteId];
list->downArrow->oam.tileNum += 2;
list->downArrow->callback = SpriteCB_MatchCallDownArrow;
spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, list->listWindow.unk3 * 8, 7);
list->upArrow = &gSprites[spriteId];
list->upArrow->oam.tileNum += 4;
list->upArrow->callback = SpriteCB_MatchCallUpArrow;
}
void DestroyMatchCallListArrows(struct PokenavSub17Substruct *list)
{
DestroySprite(list->rightArrow);
DestroySprite(list->upArrow);
DestroySprite(list->downArrow);
FreeSpriteTilesByTag(0xA);
FreeSpritePaletteByTag(0x14);
}
void ToggleMatchCallArrows(struct PokenavSub17Substruct *list, bool32 shouldHide)
{
if (shouldHide)
{
list->rightArrow->callback = SpriteCallbackDummy;
list->upArrow->callback = SpriteCallbackDummy;
list->downArrow->callback = SpriteCallbackDummy;
}
else
{
list->rightArrow->callback = SpriteCB_MatchCallRightArrow;
list->upArrow->callback = SpriteCB_MatchCallUpArrow;
list->downArrow->callback = SpriteCB_MatchCallDownArrow;
}
list->rightArrow->invisible = shouldHide;
list->upArrow->invisible = shouldHide;
list->downArrow->invisible = shouldHide;
}
void SpriteCB_MatchCallRightArrow(struct Sprite *sprite)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
sprite->y2 = structPtr->unk888.selectedIndexOffset << 4;
}
void SpriteCB_MatchCallDownArrow(struct Sprite *sprite)
{
if (sprite->data[7] == 0 && ShouldShowDownArrow())
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
if (++sprite->data[0] > 3)
{
s16 offset;
sprite->data[0] = 0;
offset = (sprite->data[1] + 1) & 7;
sprite->data[1] = offset;
sprite->y2 = offset;
}
}
void SpriteCB_MatchCallUpArrow(struct Sprite *sprite)
{
if (sprite->data[7] == 0 && ShouldShowUpArrow())
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
if (++sprite->data[0] > 3)
{
s16 offset;
sprite->data[0] = 0;
offset = (sprite->data[1] + 1) & 7;
sprite->data[1] = offset;
sprite->y2 = -1 * offset;
}
}
void ToggleMatchCallVerticalArrows(bool32 shouldHide)
{
struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST);
structPtr->list.upArrow->data[7] = shouldHide;
structPtr->list.downArrow->data[7] = shouldHide;
}
void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavListTemplate *template)
{
dst->unk10 = template->list.matchCallEntries;
dst->windowTopIndex = template->unk6;
dst->listLength = template->count;
dst->unkC = template->unk8;
dst->visibleEntries = template->maxShowed;
if (dst->visibleEntries >= dst->listLength)
{
dst->windowTopIndex = 0;
dst->unk4 = 0;
dst->selectedIndexOffset = template->unk6;
}
else
{
dst->unk4 = dst->listLength - dst->visibleEntries;
if (dst->windowTopIndex + dst->visibleEntries > dst->listLength)
{
dst->selectedIndexOffset = dst->windowTopIndex + dst->visibleEntries - dst->listLength;
dst->windowTopIndex = template->unk6 - dst->selectedIndexOffset;
}
else
{
dst->selectedIndexOffset = 0;
}
}
}
bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 a3)
{
struct WindowTemplate window;
dest->listWindow.bg = bgTemplate->bg;
dest->listWindow.unk6 = a3;
dest->unk34 = template->listFunc.unk10_2;
dest->unk38 = template->unk14;
dest->listWindow.unk1 = template->fillValue;
dest->listWindow.unk2 = template->item_X;
dest->listWindow.unk3 = template->listTop;
dest->listWindow.unk4 = template->windowWidth;
dest->listWindow.fontId = template->fontId;
window.bg = bgTemplate->bg;
window.tilemapLeft = template->item_X;
window.tilemapTop = 0;
window.width = template->windowWidth;
window.height = 32;
window.paletteNum = template->fillValue;
window.baseBlock = a3 + 2;
dest->listWindow.windowId = AddWindow(&window);
if (dest->listWindow.windowId == WINDOW_NONE)
return FALSE;
dest->listWindow.unkA = 0;
dest->rightArrow = NULL;
dest->upArrow = NULL;
dest->downArrow = NULL;
return 1;
}
+513
View File
@@ -0,0 +1,513 @@
#include "global.h"
#include "pokenav.h"
#include "event_data.h"
#include "main.h"
#include "sound.h"
#include "constants/songs.h"
struct Pokenav_Menu
{
u16 menuType;
s16 cursorPos;
u16 currMenuItem;
u16 helpBarIndex;
u32 menuId;
u32 (*callback)(struct Pokenav_Menu*);
};
static bool32 UpdateMenuCursorPos(struct Pokenav_Menu *);
static void ReturnToConditionMenu(struct Pokenav_Menu *);
static void ReturnToMainMenu(struct Pokenav_Menu *);
static u32 GetMenuId(struct Pokenav_Menu *);
static void SetMenuIdAndCB(struct Pokenav_Menu *, u32);
static u32 CB2_ReturnToConditionMenu(struct Pokenav_Menu *);
static u32 CB2_ReturnToMainMenu(struct Pokenav_Menu *);
static u32 HandleConditionSearchMenuInput(struct Pokenav_Menu *);
static u32 HandleConditionMenuInput(struct Pokenav_Menu *);
static u32 HandleCantOpenRibbonsInput(struct Pokenav_Menu *);
static u32 HandleMainMenuInputEndTutorial(struct Pokenav_Menu *);
static u32 HandleMainMenuInputTutorial(struct Pokenav_Menu *);
static u32 HandleMainMenuInput(struct Pokenav_Menu *);
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav_Menu*);
static void SetMenuInputHandler(struct Pokenav_Menu *);
// Number of entries - 1 for that menu type
static const u8 sLastCursorPositions[] =
{
[POKENAV_MENU_TYPE_DEFAULT] = 2,
[POKENAV_MENU_TYPE_UNLOCK_MC] = 3,
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4,
[POKENAV_MENU_TYPE_CONDITION] = 2,
[POKENAV_MENU_TYPE_CONDITION_SEARCH] = 5
};
static const u8 sMenuItems[][MAX_POKENAV_MENUITEMS] =
{
[POKENAV_MENU_TYPE_DEFAULT] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
[2 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
[3 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
POKENAV_MENUITEM_RIBBONS,
[4 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION] =
{
POKENAV_MENUITEM_CONDITION_PARTY,
POKENAV_MENUITEM_CONDITION_SEARCH,
POKENAV_MENUITEM_CONDITION_CANCEL,
[3 ... MAX_POKENAV_MENUITEMS - 1] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
{
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL
},
};
static u8 GetPokenavMainMenuType(void)
{
u8 menuType = POKENAV_MENU_TYPE_DEFAULT;
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
{
menuType = POKENAV_MENU_TYPE_UNLOCK_MC;
if (FlagGet(FLAG_SYS_RIBBON_GET))
menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS;
}
return menuType;
}
bool32 PokenavCallback_Init_MainMenuCursorOnMap(void)
{
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
if (!menu)
return FALSE;
menu->menuType = GetPokenavMainMenuType();
menu->cursorPos = POKENAV_MENUITEM_MAP;
menu->currMenuItem = POKENAV_MENUITEM_MAP;
menu->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(menu);
return TRUE;
}
bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void)
{
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
if (!menu)
return FALSE;
menu->menuType = GetPokenavMainMenuType();
menu->cursorPos = POKENAV_MENUITEM_MATCH_CALL;
menu->currMenuItem = POKENAV_MENUITEM_MATCH_CALL;
menu->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(menu);
return TRUE;
}
bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void)
{
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
if (!menu)
return FALSE;
menu->menuType = GetPokenavMainMenuType();
menu->cursorPos = POKENAV_MENUITEM_RIBBONS;
menu->currMenuItem = POKENAV_MENUITEM_RIBBONS;
SetMenuInputHandler(menu);
return TRUE;
}
bool32 PokenavCallback_Init_ConditionMenu(void)
{
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
if (!menu)
return FALSE;
menu->menuType = POKENAV_MENU_TYPE_CONDITION;
menu->cursorPos = 0; //party
menu->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY;
menu->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(menu);
return TRUE;
}
bool32 PokenavCallback_Init_ConditionSearchMenu(void)
{
struct Pokenav_Menu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav_Menu));
if (!menu)
return FALSE;
menu->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
menu->cursorPos = GetSelectedConditionSearch();
menu->currMenuItem = menu->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
menu->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(menu);
return TRUE;
}
static void SetMenuInputHandler(struct Pokenav_Menu *menu)
{
switch (menu->menuType)
{
case POKENAV_MENU_TYPE_DEFAULT:
SetPokenavMode(POKENAV_MODE_NORMAL);
// fallthrough
case POKENAV_MENU_TYPE_UNLOCK_MC:
case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS:
menu->callback = GetMainMenuInputHandler();
break;
case POKENAV_MENU_TYPE_CONDITION:
menu->callback = HandleConditionMenuInput;
break;
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
menu->callback = HandleConditionSearchMenuInput;
break;
}
}
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav_Menu*)
{
switch (GetPokenavMode())
{
default:
case POKENAV_MODE_NORMAL:
return HandleMainMenuInput;
case POKENAV_MODE_FORCE_CALL_READY:
return HandleMainMenuInputTutorial;
case POKENAV_MODE_FORCE_CALL_EXIT:
return HandleMainMenuInputEndTutorial;
}
}
u32 GetMenuHandlerCallback(void)
{
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return menu->callback(menu);
}
void FreeMenuHandlerSubstruct1(void)
{
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
}
static u32 HandleMainMenuInput(struct Pokenav_Menu *menu)
{
if (UpdateMenuCursorPos(menu))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
switch (sMenuItems[menu->menuType][menu->cursorPos])
{
case POKENAV_MENUITEM_MAP:
menu->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
SetMenuIdAndCB(menu, POKENAV_REGION_MAP);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_CONDITION:
menu->menuType = POKENAV_MENU_TYPE_CONDITION;
menu->cursorPos = 0;
menu->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0];
menu->callback = HandleConditionMenuInput;
return POKENAV_MENU_FUNC_OPEN_CONDITION;
case POKENAV_MENUITEM_MATCH_CALL:
menu->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
SetMenuIdAndCB(menu, POKENAV_MATCH_CALL);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_RIBBONS:
if (CanViewRibbonsMenu())
{
menu->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
SetMenuIdAndCB(menu, POKENAV_RIBBONS_MON_LIST);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
menu->callback = HandleCantOpenRibbonsInput;
return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS;
}
case POKENAV_MENUITEM_SWITCH_OFF:
return POKENAV_MENU_FUNC_EXIT;
}
}
if (JOY_NEW(B_BUTTON))
return POKENAV_MENU_FUNC_EXIT;
return POKENAV_MENU_FUNC_NONE;
}
// Force the player to select Match Call during the call Mr. Stone pokenav tutorial
static u32 HandleMainMenuInputTutorial(struct Pokenav_Menu *menu)
{
if (UpdateMenuCursorPos(menu))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
if (sMenuItems[menu->menuType][menu->cursorPos] == POKENAV_MENUITEM_MATCH_CALL)
{
menu->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
SetMenuIdAndCB(menu, POKENAV_MATCH_CALL);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
PlaySE(SE_FAILURE);
return POKENAV_MENU_FUNC_NONE;
}
}
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_FAILURE);
return POKENAV_MENU_FUNC_NONE;
}
return POKENAV_MENU_FUNC_NONE;
}
// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again
static u32 HandleMainMenuInputEndTutorial(struct Pokenav_Menu *menu)
{
if (UpdateMenuCursorPos(menu))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
u32 menuItem = sMenuItems[menu->menuType][menu->cursorPos];
if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF)
{
PlaySE(SE_FAILURE);
return POKENAV_MENU_FUNC_NONE;
}
else if (menuItem == POKENAV_MENUITEM_MATCH_CALL)
{
menu->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
SetMenuIdAndCB(menu, POKENAV_MATCH_CALL);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
return -1;
}
}
else if (JOY_NEW(B_BUTTON))
{
return -1;
}
return POKENAV_MENU_FUNC_NONE;
}
// Handles input after selecting Ribbons when there are no ribbon winners left
// Selecting it again just reprints the Ribbon description to replace the "No Ribbon winners" message
static u32 HandleCantOpenRibbonsInput(struct Pokenav_Menu *menu)
{
if (UpdateMenuCursorPos(menu))
{
menu->callback = GetMainMenuInputHandler();
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
menu->callback = GetMainMenuInputHandler();
return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION;
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 HandleConditionMenuInput(struct Pokenav_Menu *menu)
{
if (UpdateMenuCursorPos(menu))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
switch (sMenuItems[menu->menuType][menu->cursorPos])
{
case POKENAV_MENUITEM_CONDITION_SEARCH:
menu->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
menu->cursorPos = 0;
menu->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0];
menu->callback = HandleConditionSearchMenuInput;
return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH;
case POKENAV_MENUITEM_CONDITION_PARTY:
menu->helpBarIndex = 0;
SetMenuIdAndCB(menu, POKENAV_CONDITION_GRAPH_PARTY);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_CONDITION_CANCEL:
PlaySE(SE_SELECT);
ReturnToMainMenu(menu);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
}
if (JOY_NEW(B_BUTTON))
{
if (menu->cursorPos != sLastCursorPositions[menu->menuType])
{
menu->cursorPos = sLastCursorPositions[menu->menuType];
menu->callback = CB2_ReturnToMainMenu;
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
else
{
PlaySE(SE_SELECT);
ReturnToMainMenu(menu);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 HandleConditionSearchMenuInput(struct Pokenav_Menu *menu)
{
if (UpdateMenuCursorPos(menu))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
u8 menuItem = sMenuItems[menu->menuType][menu->cursorPos];
if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL)
{
SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL);
SetMenuIdAndCB(menu, POKENAV_CONDITION_SEARCH_RESULTS);
menu->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
PlaySE(SE_SELECT);
ReturnToConditionMenu(menu);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
}
if (JOY_NEW(B_BUTTON))
{
if (menu->cursorPos != sLastCursorPositions[menu->menuType])
{
menu->cursorPos = sLastCursorPositions[menu->menuType];
menu->callback = CB2_ReturnToConditionMenu;
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
else
{
PlaySE(SE_SELECT);
ReturnToConditionMenu(menu);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 CB2_ReturnToMainMenu(struct Pokenav_Menu *menu)
{
ReturnToMainMenu(menu);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
static u32 CB2_ReturnToConditionMenu(struct Pokenav_Menu *menu)
{
ReturnToConditionMenu(menu);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
static void SetMenuIdAndCB(struct Pokenav_Menu *menu, u32 menuId)
{
menu->menuId = menuId;
menu->callback = GetMenuId;
}
static u32 GetMenuId(struct Pokenav_Menu *menu)
{
return menu->menuId;
}
static void ReturnToMainMenu(struct Pokenav_Menu *menu)
{
menu->menuType = GetPokenavMainMenuType();
menu->cursorPos = 1;
menu->currMenuItem = sMenuItems[menu->menuType][menu->cursorPos];
menu->callback = HandleMainMenuInput;
}
static void ReturnToConditionMenu(struct Pokenav_Menu *menu)
{
menu->menuType = POKENAV_MENU_TYPE_CONDITION;
menu->cursorPos = 1;
menu->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1];
menu->callback = HandleConditionMenuInput;
}
static bool32 UpdateMenuCursorPos(struct Pokenav_Menu *menu)
{
if (JOY_NEW(DPAD_UP))
{
if (--menu->cursorPos < 0)
menu->cursorPos = sLastCursorPositions[menu->menuType];
menu->currMenuItem = sMenuItems[menu->menuType][menu->cursorPos];
return TRUE;
}
else if (JOY_NEW(DPAD_DOWN))
{
menu->cursorPos++;
if (menu->cursorPos > sLastCursorPositions[menu->menuType])
menu->cursorPos = 0;
menu->currMenuItem = sMenuItems[menu->menuType][menu->cursorPos];
return TRUE;
}
else
{
return FALSE;
}
}
int GetPokenavMenuType(void)
{
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return menu->menuType;
}
// Position of cursor relative to number of current menu options
int GetPokenavCursorPos(void)
{
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return menu->cursorPos;
}
// ID of menu item the cursor is currently on
int GetCurrentMenuItemId(void)
{
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return menu->currMenuItem;
}
u16 GetHelpBarTextId(void)
{
struct Pokenav_Menu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return menu->helpBarIndex;
}
-513
View File
@@ -1,513 +0,0 @@
#include "global.h"
#include "pokenav.h"
#include "event_data.h"
#include "main.h"
#include "sound.h"
#include "constants/songs.h"
struct Pokenav1Struct
{
u16 menuType;
s16 cursorPos;
u16 currMenuItem;
u16 helpBarIndex;
u32 menuId;
u32 (*callback)(struct Pokenav1Struct*);
};
static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state);
static void ReturnToConditionMenu(struct Pokenav1Struct *state);
static void ReturnToMainMenu(struct Pokenav1Struct *state);
static u32 GetMenuId(struct Pokenav1Struct *state);
static void SetMenuIdAndCB(struct Pokenav1Struct *state, u32 a1);
static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state);
static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state);
static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state);
static u32 HandleConditionMenuInput(struct Pokenav1Struct *state);
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state);
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state);
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state);
static u32 HandleMainMenuInput(struct Pokenav1Struct *state);
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*);
static void SetMenuInputHandler(struct Pokenav1Struct *state);
// Number of entries - 1 for that menu type
static const u8 sLastCursorPositions[] =
{
[POKENAV_MENU_TYPE_DEFAULT] = 2,
[POKENAV_MENU_TYPE_UNLOCK_MC] = 3,
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4,
[POKENAV_MENU_TYPE_CONDITION] = 2,
[POKENAV_MENU_TYPE_CONDITION_SEARCH] = 5
};
static const u8 sMenuItems[][6] =
{
[POKENAV_MENU_TYPE_DEFAULT] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
[2 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
POKENAV_MENUITEM_RIBBONS,
[4 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION] =
{
POKENAV_MENUITEM_CONDITION_PARTY,
POKENAV_MENUITEM_CONDITION_SEARCH,
POKENAV_MENUITEM_CONDITION_CANCEL,
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
{
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL
},
};
static u8 GetPokenavMainMenuType(void)
{
u8 menuType = POKENAV_MENU_TYPE_DEFAULT;
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
{
menuType = POKENAV_MENU_TYPE_UNLOCK_MC;
if (FlagGet(FLAG_SYS_RIBBON_GET))
menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS;
}
return menuType;
}
bool32 PokenavCallback_Init_MainMenuCursorOnMap(void)
{
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = POKENAV_MENUITEM_MAP;
state->currMenuItem = POKENAV_MENUITEM_MAP;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_MainMenuCursorOnMatchCall(void)
{
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = POKENAV_MENUITEM_MATCH_CALL;
state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_MainMenuCursorOnRibbons(void)
{
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = POKENAV_MENUITEM_RIBBONS;
state->currMenuItem = POKENAV_MENUITEM_RIBBONS;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_ConditionMenu(void)
{
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 0; //party
state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_ConditionSearchMenu(void)
{
struct Pokenav1Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
state->cursorPos = GetSelectedConditionSearch();
state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
static void SetMenuInputHandler(struct Pokenav1Struct *state)
{
switch (state->menuType)
{
case POKENAV_MENU_TYPE_DEFAULT:
SetPokenavMode(POKENAV_MODE_NORMAL);
// fallthrough
case POKENAV_MENU_TYPE_UNLOCK_MC:
case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS:
state->callback = GetMainMenuInputHandler();
break;
case POKENAV_MENU_TYPE_CONDITION:
state->callback = HandleConditionMenuInput;
break;
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
state->callback = HandleConditionSearchMenuInput;
break;
}
}
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*)
{
switch (GetPokenavMode())
{
default:
case POKENAV_MODE_NORMAL:
return HandleMainMenuInput;
case POKENAV_MODE_FORCE_CALL_READY:
return HandleMainMenuInputTutorial;
case POKENAV_MODE_FORCE_CALL_EXIT:
return HandleMainMenuInputEndTutorial;
}
}
u32 GetMenuHandlerCallback(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return state->callback(state);
}
void FreeMenuHandlerSubstruct1(void)
{
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
}
static u32 HandleMainMenuInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
switch (sMenuItems[state->menuType][state->cursorPos])
{
case POKENAV_MENUITEM_MAP:
state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
SetMenuIdAndCB(state, POKENAV_REGION_MAP);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_CONDITION:
state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 0;
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0];
state->callback = HandleConditionMenuInput;
return POKENAV_MENU_FUNC_OPEN_CONDITION;
case POKENAV_MENUITEM_MATCH_CALL:
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
SetMenuIdAndCB(state, POKENAV_MATCH_CALL);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_RIBBONS:
if (CanViewRibbonsMenu())
{
state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
SetMenuIdAndCB(state, POKENAV_RIBBONS_MON_LIST);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
state->callback = HandleCantOpenRibbonsInput;
return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS;
}
case POKENAV_MENUITEM_SWITCH_OFF:
return POKENAV_MENU_FUNC_EXIT;
}
}
if (JOY_NEW(B_BUTTON))
return POKENAV_MENU_FUNC_EXIT;
return POKENAV_MENU_FUNC_NONE;
}
// Force the player to select Match Call during the call Mr. Stone pokenav tutorial
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
if (sMenuItems[state->menuType][state->cursorPos] == POKENAV_MENUITEM_MATCH_CALL)
{
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
SetMenuIdAndCB(state, POKENAV_MATCH_CALL);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
PlaySE(SE_FAILURE);
return POKENAV_MENU_FUNC_NONE;
}
}
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_FAILURE);
return POKENAV_MENU_FUNC_NONE;
}
return POKENAV_MENU_FUNC_NONE;
}
// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
u32 menuItem = sMenuItems[state->menuType][state->cursorPos];
if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF)
{
PlaySE(SE_FAILURE);
return POKENAV_MENU_FUNC_NONE;
}
else if (menuItem == POKENAV_MENUITEM_MATCH_CALL)
{
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
SetMenuIdAndCB(state, POKENAV_MATCH_CALL);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
return -1;
}
}
else if (JOY_NEW(B_BUTTON))
{
return -1;
}
return POKENAV_MENU_FUNC_NONE;
}
// Handles input after selecting Ribbons when there are no ribbon winners left
// Selecting it again just reprints the Ribbon description to replace the "No Ribbon winners" message
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
{
state->callback = GetMainMenuInputHandler();
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
state->callback = GetMainMenuInputHandler();
return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION;
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 HandleConditionMenuInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
switch (sMenuItems[state->menuType][state->cursorPos])
{
case POKENAV_MENUITEM_CONDITION_SEARCH:
state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
state->cursorPos = 0;
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0];
state->callback = HandleConditionSearchMenuInput;
return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH;
case POKENAV_MENUITEM_CONDITION_PARTY:
state->helpBarIndex = 0;
SetMenuIdAndCB(state, POKENAV_CONDITION_PARTY);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_CONDITION_CANCEL:
PlaySE(SE_SELECT);
ReturnToMainMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
}
if (JOY_NEW(B_BUTTON))
{
if (state->cursorPos != sLastCursorPositions[state->menuType])
{
state->cursorPos = sLastCursorPositions[state->menuType];
state->callback = CB2_ReturnToMainMenu;
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
else
{
PlaySE(SE_SELECT);
ReturnToMainMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (JOY_NEW(A_BUTTON))
{
u8 menuItem = sMenuItems[state->menuType][state->cursorPos];
if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL)
{
SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL);
SetMenuIdAndCB(state, POKENAV_CONDITION_SEARCH_RESULTS);
state->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
PlaySE(SE_SELECT);
ReturnToConditionMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
}
if (JOY_NEW(B_BUTTON))
{
if (state->cursorPos != sLastCursorPositions[state->menuType])
{
state->cursorPos = sLastCursorPositions[state->menuType];
state->callback = CB2_ReturnToConditionMenu;
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
else
{
PlaySE(SE_SELECT);
ReturnToConditionMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state)
{
ReturnToMainMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state)
{
ReturnToConditionMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
static void SetMenuIdAndCB(struct Pokenav1Struct *state, u32 menuId)
{
state->menuId = menuId;
state->callback = GetMenuId;
}
static u32 GetMenuId(struct Pokenav1Struct *state)
{
return state->menuId;
}
static void ReturnToMainMenu(struct Pokenav1Struct *state)
{
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 1;
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
state->callback = HandleMainMenuInput;
}
static void ReturnToConditionMenu(struct Pokenav1Struct *state)
{
state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 1;
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1];
state->callback = HandleConditionMenuInput;
}
static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state)
{
if (JOY_NEW(DPAD_UP))
{
if (--state->cursorPos < 0)
state->cursorPos = sLastCursorPositions[state->menuType];
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
return TRUE;
}
else if (JOY_NEW(DPAD_DOWN))
{
state->cursorPos++;
if (state->cursorPos > sLastCursorPositions[state->menuType])
state->cursorPos = 0;
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
return TRUE;
}
else
{
return FALSE;
}
}
int GetPokenavMenuType(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return state->menuType;
}
// Position of cursor relative to number of current menu options
int GetPokenavCursorPos(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return state->cursorPos;
}
// ID of menu item the cursor is currently on
int GetCurrentMenuItemId(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return state->currMenuItem;
}
u16 GetHelpBarTextId(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU_HANDLER);
return state->helpBarIndex;
}
File diff suppressed because it is too large Load Diff
+50 -47
View File
@@ -17,22 +17,25 @@
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/region_map_sections.h" #include "constants/region_map_sections.h"
#define GFXTAG_CITY_ZOOM 6
#define PALTAG_CITY_ZOOM 11
#define NUM_CITY_MAPS 22 #define NUM_CITY_MAPS 22
struct Pokenav5Struct struct Pokenav_RegionMapMenu
{ {
u8 filler0[0xC]; u8 unused[12];
bool32 zoomDisabled; bool32 zoomDisabled;
u32 (*callback)(struct Pokenav5Struct *); u32 (*callback)(struct Pokenav_RegionMapMenu *);
}; };
struct Pokenav5Struct_2 struct Pokenav_RegionMapGfx
{ {
bool32 (*isTaskActiveCB)(void); bool32 (*isTaskActiveCB)(void);
u32 loopTaskId; u32 loopTaskId;
u16 infoWindowId; u16 infoWindowId;
struct Sprite *cityZoomTextSprites[3]; struct Sprite *cityZoomTextSprites[3];
u8 tilemapBuffer[0x800]; u8 tilemapBuffer[BG_SCREEN_SIZE];
u8 cityZoomPics[NUM_CITY_MAPS][200]; u8 cityZoomPics[NUM_CITY_MAPS][200];
}; };
@@ -43,9 +46,9 @@ struct CityMapEntry
const u32 *tilemap; const u32 *tilemap;
}; };
static u32 HandleRegionMapInput(struct Pokenav5Struct *); static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *);
static u32 HandleRegionMapInputZoomDisabled(struct Pokenav5Struct *); static u32 HandleRegionMapInputZoomDisabled(struct Pokenav_RegionMapMenu *);
static u32 GetExitRegionMapMenuId(struct Pokenav5Struct *); static u32 GetExitRegionMapMenuId(struct Pokenav_RegionMapMenu *);
static u32 LoopedTask_OpenRegionMap(s32); static u32 LoopedTask_OpenRegionMap(s32);
static u32 LoopedTask_DecompressCityMaps(s32); static u32 LoopedTask_DecompressCityMaps(s32);
static bool32 GetCurrentLoopedTaskActive(void); static bool32 GetCurrentLoopedTaskActive(void);
@@ -53,15 +56,15 @@ static void FreeCityZoomViewGfx(void);
static void LoadCityZoomViewGfx(void); static void LoadCityZoomViewGfx(void);
static void DecompressCityMaps(void); static void DecompressCityMaps(void);
static bool32 IsDecompressCityMapsActive(void); static bool32 IsDecompressCityMapsActive(void);
static void LoadPokenavRegionMapGfx(struct Pokenav5Struct_2 *); static void LoadPokenavRegionMapGfx(struct Pokenav_RegionMapGfx *);
static bool32 TryFreeTempTileDataBuffers(void); static bool32 TryFreeTempTileDataBuffers(void);
static void UpdateMapSecInfoWindow(struct Pokenav5Struct_2 *); static void UpdateMapSecInfoWindow(struct Pokenav_RegionMapGfx *);
static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav5Struct_2 *); static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav_RegionMapGfx *);
static void ChangeBgYForZoom(bool32); static void ChangeBgYForZoom(bool32);
static bool32 IsChangeBgYForZoomActive(void); static bool32 IsChangeBgYForZoomActive(void);
static void CreateCityZoomTextSprites(void); static void CreateCityZoomTextSprites(void);
static void DrawCityMap(struct Pokenav5Struct_2 *, int, int); static void DrawCityMap(struct Pokenav_RegionMapGfx *, int, int);
static void PrintLandmarkNames(struct Pokenav5Struct_2 *, int, int); static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *, int, int);
static void SetCityZoomTextInvisibility(bool32); static void SetCityZoomTextInvisibility(bool32);
static void Task_ChangeBgYForZoom(u8 taskId); static void Task_ChangeBgYForZoom(u8 taskId);
static void UpdateCityZoomTextPosition(void); static void UpdateCityZoomTextPosition(void);
@@ -74,7 +77,7 @@ static u32 LoopedTask_ExitRegionMap(s32);
extern const u16 gRegionMapCityZoomTiles_Pal[]; extern const u16 gRegionMapCityZoomTiles_Pal[];
extern const u32 gRegionMapCityZoomText_Gfx[]; extern const u32 gRegionMapCityZoomText_Gfx[];
static const u16 sMapSecInfoWindow_Pal[] = INCBIN_U16("graphics/pokenav/region_map_info_window.gbapal"); static const u16 sMapSecInfoWindow_Pal[] = INCBIN_U16("graphics/pokenav/region_map/info_window.gbapal");
static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/zoom_tiles.4bpp.lz"); static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/zoom_tiles.4bpp.lz");
#include "data/region_map/city_map_tilemaps.h" #include "data/region_map/city_map_tilemaps.h"
@@ -121,12 +124,12 @@ static const LoopedTask sRegionMapLoopTaskFuncs[] =
static const struct CompressedSpriteSheet sCityZoomTextSpriteSheet[1] = static const struct CompressedSpriteSheet sCityZoomTextSpriteSheet[1] =
{ {
{gRegionMapCityZoomText_Gfx, 0x800, 6} {gRegionMapCityZoomText_Gfx, 0x800, GFXTAG_CITY_ZOOM}
}; };
static const struct SpritePalette sCityZoomTilesSpritePalette[] = static const struct SpritePalette sCityZoomTilesSpritePalette[] =
{ {
{gRegionMapCityZoomTiles_Pal, 11}, {gRegionMapCityZoomTiles_Pal, PALTAG_CITY_ZOOM},
{} {}
}; };
@@ -159,8 +162,8 @@ const struct OamData sCityZoomTextSprite_OamData =
static const struct SpriteTemplate sCityZoomTextSpriteTemplate = static const struct SpriteTemplate sCityZoomTextSpriteTemplate =
{ {
.tileTag = 6, .tileTag = GFXTAG_CITY_ZOOM,
.paletteTag = 11, .paletteTag = PALTAG_CITY_ZOOM,
.oam = &sCityZoomTextSprite_OamData, .oam = &sCityZoomTextSprite_OamData,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
@@ -170,7 +173,7 @@ static const struct SpriteTemplate sCityZoomTextSpriteTemplate =
u32 PokenavCallback_Init_RegionMap(void) u32 PokenavCallback_Init_RegionMap(void)
{ {
struct Pokenav5Struct *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_STATE, sizeof(struct Pokenav5Struct)); struct Pokenav_RegionMapMenu *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_STATE, sizeof(struct Pokenav_RegionMapMenu));
if (!state) if (!state)
return FALSE; return FALSE;
@@ -195,11 +198,11 @@ void FreeRegionMapSubstruct1(void)
u32 GetRegionMapCallback(void) u32 GetRegionMapCallback(void)
{ {
struct Pokenav5Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE); struct Pokenav_RegionMapMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE);
return state->callback(state); return state->callback(state);
} }
static u32 HandleRegionMapInput(struct Pokenav5Struct *state) static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
{ {
switch (DoRegionMapInputCallback()) switch (DoRegionMapInputCallback())
{ {
@@ -217,7 +220,7 @@ static u32 HandleRegionMapInput(struct Pokenav5Struct *state)
return POKENAV_MAP_FUNC_NONE; return POKENAV_MAP_FUNC_NONE;
} }
static u32 HandleRegionMapInputZoomDisabled(struct Pokenav5Struct *state) static u32 HandleRegionMapInputZoomDisabled(struct Pokenav_RegionMapMenu *state)
{ {
if (JOY_NEW(B_BUTTON)) if (JOY_NEW(B_BUTTON))
{ {
@@ -228,20 +231,20 @@ static u32 HandleRegionMapInputZoomDisabled(struct Pokenav5Struct *state)
return POKENAV_MAP_FUNC_NONE; return POKENAV_MAP_FUNC_NONE;
} }
static u32 GetExitRegionMapMenuId(struct Pokenav5Struct *state) static u32 GetExitRegionMapMenuId(struct Pokenav_RegionMapMenu *state)
{ {
return POKENAV_MAIN_MENU_CURSOR_ON_MAP; return POKENAV_MAIN_MENU_CURSOR_ON_MAP;
} }
bool32 GetZoomDisabled(void) bool32 GetZoomDisabled(void)
{ {
struct Pokenav5Struct *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE); struct Pokenav_RegionMapMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_STATE);
return state->zoomDisabled; return state->zoomDisabled;
} }
bool32 OpenPokenavRegionMap(void) bool32 OpenPokenavRegionMap(void)
{ {
struct Pokenav5Struct_2 *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM, sizeof(struct Pokenav5Struct_2)); struct Pokenav_RegionMapGfx *state = AllocSubstruct(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM, sizeof(struct Pokenav_RegionMapGfx));
if (!state) if (!state)
return FALSE; return FALSE;
@@ -252,20 +255,20 @@ bool32 OpenPokenavRegionMap(void)
void CreateRegionMapLoopedTask(s32 index) void CreateRegionMapLoopedTask(s32 index)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
state->loopTaskId = CreateLoopedTask(sRegionMapLoopTaskFuncs[index], 1); state->loopTaskId = CreateLoopedTask(sRegionMapLoopTaskFuncs[index], 1);
state->isTaskActiveCB = GetCurrentLoopedTaskActive; state->isTaskActiveCB = GetCurrentLoopedTaskActive;
} }
bool32 IsRegionMapLoopedTaskActive(void) bool32 IsRegionMapLoopedTaskActive(void)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
return state->isTaskActiveCB(); return state->isTaskActiveCB();
} }
void FreeRegionMapSubstruct2(void) void FreeRegionMapSubstruct2(void)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
FreeRegionMapIconResources(); FreeRegionMapIconResources();
FreeCityZoomViewGfx(); FreeCityZoomViewGfx();
RemoveWindow(state->infoWindowId); RemoveWindow(state->infoWindowId);
@@ -285,7 +288,7 @@ static void VBlankCB_RegionMap(void)
static bool32 GetCurrentLoopedTaskActive(void) static bool32 GetCurrentLoopedTaskActive(void)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
return IsLoopedTaskActive(state->loopTaskId); return IsLoopedTaskActive(state->loopTaskId);
} }
@@ -301,7 +304,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
{ {
int menuGfxId; int menuGfxId;
struct RegionMap *regionMap; struct RegionMap *regionMap;
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
switch (taskState) switch (taskState)
{ {
case 0: case 0:
@@ -346,7 +349,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
return LT_PAUSE; return LT_PAUSE;
UpdateMapSecInfoWindow(state); UpdateMapSecInfoWindow(state);
sub_81C7B40(); FadeToBlackExceptPrimary();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 5: case 5:
if (IsDma3ManagerBusyWithBgCopy_(state)) if (IsDma3ManagerBusyWithBgCopy_(state))
@@ -364,7 +367,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
LoadLeftHeaderGfxForIndex(menuGfxId); LoadLeftHeaderGfxForIndex(menuGfxId);
ShowLeftHeaderGfx(menuGfxId, 1, 1); ShowLeftHeaderGfx(menuGfxId, 1, 1);
PokenavFadeScreen(1); PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 7: case 7:
if (IsPaletteFadeActive() || AreLeftHeaderSpritesMoving()) if (IsPaletteFadeActive() || AreLeftHeaderSpritesMoving())
@@ -377,7 +380,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
static u32 LoopedTask_UpdateInfoAfterCursorMove(s32 taskState) static u32 LoopedTask_UpdateInfoAfterCursorMove(s32 taskState)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
switch (taskState) switch (taskState)
{ {
case 0: case 0:
@@ -420,7 +423,7 @@ static u32 LoopedTask_RegionMapZoomOut(s32 taskState)
static u32 LoopedTask_RegionMapZoomIn(s32 taskState) static u32 LoopedTask_RegionMapZoomIn(s32 taskState)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
switch (taskState) switch (taskState)
{ {
case 0: case 0:
@@ -457,7 +460,7 @@ static u32 LoopedTask_ExitRegionMap(s32 taskState)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
PokenavFadeScreen(0); PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsPaletteFadeActive()) if (IsPaletteFadeActive())
@@ -492,14 +495,14 @@ static void LoadCityZoomViewGfx(void)
static void FreeCityZoomViewGfx(void) static void FreeCityZoomViewGfx(void)
{ {
int i; int i;
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
FreeSpriteTilesByTag(6); FreeSpriteTilesByTag(GFXTAG_CITY_ZOOM);
FreeSpritePaletteByTag(11); FreeSpritePaletteByTag(PALTAG_CITY_ZOOM);
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++) for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
DestroySprite(state->cityZoomTextSprites[i]); DestroySprite(state->cityZoomTextSprites[i]);
} }
static void LoadPokenavRegionMapGfx(struct Pokenav5Struct_2 *state) static void LoadPokenavRegionMapGfx(struct Pokenav_RegionMapGfx *state)
{ {
BgDmaFill(1, PIXEL_FILL(0), 0x40, 1); BgDmaFill(1, PIXEL_FILL(0), 0x40, 1);
BgDmaFill(1, PIXEL_FILL(1), 0x41, 1); BgDmaFill(1, PIXEL_FILL(1), 0x41, 1);
@@ -527,7 +530,7 @@ static bool32 TryFreeTempTileDataBuffers(void)
return FreeTempTileDataBuffersIfPossible(); return FreeTempTileDataBuffersIfPossible();
} }
static void UpdateMapSecInfoWindow(struct Pokenav5Struct_2 *state) static void UpdateMapSecInfoWindow(struct Pokenav_RegionMapGfx *state)
{ {
struct RegionMap *regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP); struct RegionMap *regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);
switch (regionMap->mapSecType) switch (regionMap->mapSecType)
@@ -565,7 +568,7 @@ static void UpdateMapSecInfoWindow(struct Pokenav5Struct_2 *state)
} }
} }
static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav5Struct_2 *state) static bool32 IsDma3ManagerBusyWithBgCopy_(struct Pokenav_RegionMapGfx *state)
{ {
return IsDma3ManagerBusyWithBgCopy(); return IsDma3ManagerBusyWithBgCopy();
} }
@@ -621,7 +624,7 @@ static bool32 IsDecompressCityMapsActive(void)
static u32 LoopedTask_DecompressCityMaps(s32 taskState) static u32 LoopedTask_DecompressCityMaps(s32 taskState)
{ {
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
if (taskState < NUM_CITY_MAPS) if (taskState < NUM_CITY_MAPS)
{ {
LZ77UnCompWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); LZ77UnCompWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]);
@@ -631,7 +634,7 @@ static u32 LoopedTask_DecompressCityMaps(s32 taskState)
return LT_FINISH; return LT_FINISH;
} }
static void DrawCityMap(struct Pokenav5Struct_2 *state, int mapSecId, int pos) static void DrawCityMap(struct Pokenav_RegionMapGfx *state, int mapSecId, int pos)
{ {
int i; int i;
for (i = 0; i < NUM_CITY_MAPS && (sPokenavCityMaps[i].mapSecId != mapSecId || sPokenavCityMaps[i].index != pos); i++) for (i = 0; i < NUM_CITY_MAPS && (sPokenavCityMaps[i].mapSecId != mapSecId || sPokenavCityMaps[i].index != pos); i++)
@@ -644,7 +647,7 @@ static void DrawCityMap(struct Pokenav5Struct_2 *state, int mapSecId, int pos)
CopyToBgTilemapBufferRect(1, state->cityZoomPics[i], 18, 6, 10, 10); CopyToBgTilemapBufferRect(1, state->cityZoomPics[i], 18, 6, 10, 10);
} }
static void PrintLandmarkNames(struct Pokenav5Struct_2 *state, int mapSecId, int pos) static void PrintLandmarkNames(struct Pokenav_RegionMapGfx *state, int mapSecId, int pos)
{ {
int i = 0; int i = 0;
while (1) while (1)
@@ -664,7 +667,7 @@ static void CreateCityZoomTextSprites(void)
int i; int i;
int y; int y;
struct Sprite *sprite; struct Sprite *sprite;
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
// When not zoomed in the text is still created but its pushed off screen // When not zoomed in the text is still created but its pushed off screen
if (!IsRegionMapZoomed()) if (!IsRegionMapZoomed())
@@ -724,7 +727,7 @@ static void SpriteCB_CityZoomText(struct Sprite *sprite)
static void UpdateCityZoomTextPosition(void) static void UpdateCityZoomTextPosition(void)
{ {
int i; int i;
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
int y = 132 - (GetBgY(1) >> 8); int y = 132 - (GetBgY(1) >> 8);
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++) for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
state->cityZoomTextSprites[i]->y = y; state->cityZoomTextSprites[i]->y = y;
@@ -733,7 +736,7 @@ static void UpdateCityZoomTextPosition(void)
static void SetCityZoomTextInvisibility(bool32 invisible) static void SetCityZoomTextInvisibility(bool32 invisible)
{ {
int i; int i;
struct Pokenav5Struct_2 *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM);
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++) for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
state->cityZoomTextSprites[i]->invisible = invisible; state->cityZoomTextSprites[i]->invisible = invisible;
} }
@@ -20,49 +20,49 @@ enum
}; };
struct PokenavSub9 struct Pokenav_RibbonsMonList
{ {
u32 (*callback)(struct PokenavSub9*); u32 (*callback)(struct Pokenav_RibbonsMonList*);
u32 loopedTaskId; u32 loopedTaskId;
u16 winid; u16 winid;
s32 boxId; s32 boxId;
s32 monId; s32 monId;
u32 changeBgs; u32 changeBgs;
u32 saveMonList; u32 saveMonList;
struct PokenavSub18 *monList; struct PokenavMonList *monList;
}; };
struct PokenavSub10 struct Pokenav_RibbonsMonMenu
{ {
bool32 (*callback)(void); bool32 (*callback)(void);
u32 ltid; u32 loopedTaskId;
u16 winid; u16 winid;
bool32 fromSummary; bool32 fromSummary;
u8 buff[BG_SCREEN_SIZE]; u8 buff[BG_SCREEN_SIZE];
}; };
static u32 HandleRibbonsMonListInput_WaitListInit(struct PokenavSub9 *structPtr); static u32 HandleRibbonsMonListInput_WaitListInit(struct Pokenav_RibbonsMonList *);
static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr); static u32 HandleRibbonsMonListInput(struct Pokenav_RibbonsMonList *);
static u32 RibbonsMonMenu_ReturnToMainMenu(struct PokenavSub9 *structPtr); static u32 RibbonsMonMenu_ReturnToMainMenu(struct Pokenav_RibbonsMonList *);
static u32 RibbonsMonMenu_ToSummaryScreen(struct PokenavSub9 *structPtr); static u32 RibbonsMonMenu_ToSummaryScreen(struct Pokenav_RibbonsMonList *);
static u32 BuildPartyMonRibbonList(s32 state); static u32 BuildPartyMonRibbonList(s32);
static u32 InitBoxMonRibbonList(s32 state); static u32 InitBoxMonRibbonList(s32);
static u32 BuildBoxMonRibbonList(s32 state); static u32 BuildBoxMonRibbonList(s32);
static u32 GetMonRibbonListLoopTaskFunc(s32 state); static u32 GetMonRibbonListLoopTaskFunc(s32);
static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item); static void InsertMonListItem(struct Pokenav_RibbonsMonList *, struct PokenavMonListItem *);
static u32 LoopedTask_OpenRibbonsMonList(s32 state); static u32 LoopedTask_OpenRibbonsMonList(s32);
static bool32 GetRibbonsMonCurrentLoopedTaskActive(void); static bool32 GetRibbonsMonCurrentLoopedTaskActive(void);
static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state); static u32 LoopedTask_RibbonsListMoveCursorUp(s32);
static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state); static u32 LoopedTask_RibbonsListMoveCursorDown(s32);
static u32 LoopedTask_RibbonsListMovePageUp(s32 state); static u32 LoopedTask_RibbonsListMovePageUp(s32);
static u32 LoopedTask_RibbonsListMovePageDown(s32 state); static u32 LoopedTask_RibbonsListMovePageDown(s32);
static u32 LoopedTask_RibbonsListReturnToMainMenu(s32 state); static u32 LoopedTask_RibbonsListReturnToMainMenu(s32);
static u32 LoopedTask_RibbonsListOpenSummary(s32 state); static u32 LoopedTask_RibbonsListOpenSummary(s32);
static void sub_81D02B0(s32 windowId, s32 val1, s32 val2); static void DrawListIndexNumber(s32, s32, s32);
static void AddRibbonsMonListWindow(struct PokenavSub10 *ptr); static void AddRibbonsMonListWindow(struct Pokenav_RibbonsMonMenu *);
static void sub_81D0288(struct PokenavSub10 *ptr); static void UpdateIndexNumberDisplay(struct Pokenav_RibbonsMonMenu *);
static void InitMonRibbonPokenavListMenuTemplate(void); static void CreateRibbonMonsList(void);
static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *); static void BufferRibbonMonInfoText(struct PokenavListItem *, u8 *);
static const LoopedTask sMonRibbonListLoopTaskFuncs[] = static const LoopedTask sMonRibbonListLoopTaskFuncs[] =
{ {
@@ -125,54 +125,54 @@ static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
bool32 PokenavCallback_Init_MonRibbonList(void) bool32 PokenavCallback_Init_MonRibbonList(void)
{ {
struct PokenavSub9 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct PokenavSub9)); struct Pokenav_RibbonsMonList *list = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct Pokenav_RibbonsMonList));
if (structPtr == NULL) if (list == NULL)
return FALSE; return FALSE;
structPtr->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavSub18)); list->monList = AllocSubstruct(POKENAV_SUBSTRUCT_MON_LIST, sizeof(struct PokenavMonList));
if (structPtr->monList == NULL) if (list->monList == NULL)
return FALSE; return FALSE;
structPtr->callback = HandleRibbonsMonListInput_WaitListInit; list->callback = HandleRibbonsMonListInput_WaitListInit;
structPtr->loopedTaskId = CreateLoopedTask(GetMonRibbonListLoopTaskFunc, 1); list->loopedTaskId = CreateLoopedTask(GetMonRibbonListLoopTaskFunc, 1);
structPtr->changeBgs = 0; list->changeBgs = 0;
return TRUE; return TRUE;
} }
bool32 PokenavCallback_Init_RibbonsMonListFromSummary(void) bool32 PokenavCallback_Init_RibbonsMonListFromSummary(void)
{ {
struct PokenavSub9 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct PokenavSub9)); struct Pokenav_RibbonsMonList *list = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST, sizeof(struct Pokenav_RibbonsMonList));
if (structPtr == NULL) if (list == NULL)
return FALSE; return FALSE;
structPtr->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST); list->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
structPtr->callback = HandleRibbonsMonListInput; list->callback = HandleRibbonsMonListInput;
structPtr->changeBgs = 1; list->changeBgs = 1;
return TRUE; return TRUE;
} }
u32 GetRibbonsMonListCallback(void) u32 GetRibbonsMonListCallback(void)
{ {
struct PokenavSub9 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
return structPtr->callback(structPtr); return list->callback(list);
} }
void FreeRibbonsMonList1(void) void FreeRibbonsMonList(void)
{ {
struct PokenavSub9 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
if (!structPtr->saveMonList) if (!list->saveMonList)
FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST); FreePokenavSubstruct(POKENAV_SUBSTRUCT_MON_LIST);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
} }
static u32 HandleRibbonsMonListInput_WaitListInit(struct PokenavSub9 *structPtr) static u32 HandleRibbonsMonListInput_WaitListInit(struct Pokenav_RibbonsMonList *list)
{ {
if (!IsLoopedTaskActive(structPtr->loopedTaskId)) if (!IsLoopedTaskActive(list->loopedTaskId))
structPtr->callback = HandleRibbonsMonListInput; list->callback = HandleRibbonsMonListInput;
return 0; return 0;
} }
static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr) static u32 HandleRibbonsMonListInput(struct Pokenav_RibbonsMonList *list)
{ {
if (JOY_REPEAT(DPAD_UP)) if (JOY_REPEAT(DPAD_UP))
return RIBBONS_MON_LIST_FUNC_MOVE_UP; return RIBBONS_MON_LIST_FUNC_MOVE_UP;
@@ -184,60 +184,60 @@ static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr)
return RIBBONS_MON_LIST_FUNC_PAGE_DOWN; return RIBBONS_MON_LIST_FUNC_PAGE_DOWN;
if (JOY_NEW(B_BUTTON)) if (JOY_NEW(B_BUTTON))
{ {
structPtr->saveMonList = 0; list->saveMonList = 0;
structPtr->callback = RibbonsMonMenu_ReturnToMainMenu; list->callback = RibbonsMonMenu_ReturnToMainMenu;
return RIBBONS_MON_LIST_FUNC_EXIT; return RIBBONS_MON_LIST_FUNC_EXIT;
} }
if (JOY_NEW(A_BUTTON)) if (JOY_NEW(A_BUTTON))
{ {
structPtr->monList->currIndex = GetSelectedPokenavListIndex(); list->monList->currIndex = PokenavList_GetSelectedIndex();
structPtr->saveMonList = 1; list->saveMonList = 1;
structPtr->callback = RibbonsMonMenu_ToSummaryScreen; list->callback = RibbonsMonMenu_ToSummaryScreen;
return RIBBONS_MON_LIST_FUNC_OPEN_RIBBONS_SUMMARY; return RIBBONS_MON_LIST_FUNC_OPEN_RIBBONS_SUMMARY;
} }
return RIBBONS_MON_LIST_FUNC_NONE; return RIBBONS_MON_LIST_FUNC_NONE;
} }
static u32 RibbonsMonMenu_ReturnToMainMenu(struct PokenavSub9 *structPtr) static u32 RibbonsMonMenu_ReturnToMainMenu(struct Pokenav_RibbonsMonList *list)
{ {
return POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS; return POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS;
} }
static u32 RibbonsMonMenu_ToSummaryScreen(struct PokenavSub9 *structPtr) static u32 RibbonsMonMenu_ToSummaryScreen(struct Pokenav_RibbonsMonList *list)
{ {
return POKENAV_RIBBONS_SUMMARY_SCREEN; return POKENAV_RIBBONS_SUMMARY_SCREEN;
} }
static u32 UpdateMonListBgs(void) static u32 UpdateMonListBgs(void)
{ {
struct PokenavSub9 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
return structPtr->changeBgs; return list->changeBgs;
} }
static struct PokenavMonList *GetMonRibbonMonListData(void) static struct PokenavMonListItem *GetMonRibbonMonListData(void)
{ {
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
return ptr->monList->monData; return list->monList->monData;
} }
static s32 GetRibbonsMonListCount(void) static s32 GetRibbonsMonListCount(void)
{ {
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
return ptr->monList->listCount; return list->monList->listCount;
} }
//unused //unused
static s32 GetMonRibbonSelectedMonData(void) static s32 GetMonRibbonSelectedMonData(void)
{ {
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
s32 idx = GetSelectedPokenavListIndex(); s32 idx = PokenavList_GetSelectedIndex();
return ptr->monList->monData[idx].data; return list->monList->monData[idx].data;
} }
static s32 GetRibbonListMenuCurrIndex(void) static s32 GetRibbonListMenuCurrIndex(void)
{ {
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
return ptr->monList->currIndex; return list->monList->currIndex;
} }
static u32 GetMonRibbonListLoopTaskFunc(s32 state) static u32 GetMonRibbonListLoopTaskFunc(s32 state)
@@ -248,11 +248,11 @@ static u32 GetMonRibbonListLoopTaskFunc(s32 state)
static u32 BuildPartyMonRibbonList(s32 state) static u32 BuildPartyMonRibbonList(s32 state)
{ {
s32 i; s32 i;
struct PokenavMonList item; struct PokenavMonListItem item;
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
ptr->monList->listCount = 0; list->monList->listCount = 0;
ptr->monList->currIndex = 0; list->monList->currIndex = 0;
item.boxId = TOTAL_BOXES_COUNT; item.boxId = TOTAL_BOXES_COUNT;
for (i = 0; i < PARTY_SIZE; i++) for (i = 0; i < PARTY_SIZE; i++)
{ {
@@ -266,7 +266,7 @@ static u32 BuildPartyMonRibbonList(s32 state)
{ {
item.monId = i; item.monId = i;
item.data = ribbonCount; item.data = ribbonCount;
sub_81CFCEC(ptr, &item); InsertMonListItem(list, &item);
} }
} }
} }
@@ -276,19 +276,19 @@ static u32 BuildPartyMonRibbonList(s32 state)
static u32 InitBoxMonRibbonList(s32 state) static u32 InitBoxMonRibbonList(s32 state)
{ {
struct PokenavSub9 *ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
ptr->monId = 0; list->monId = 0;
ptr->boxId = 0; list->boxId = 0;
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
} }
static u32 BuildBoxMonRibbonList(s32 state) static u32 BuildBoxMonRibbonList(s32 state)
{ {
struct PokenavSub9 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST);
s32 boxId = ptr->boxId; s32 boxId = list->boxId;
s32 monId = ptr->monId; s32 monId = list->monId;
s32 boxCount = 0; s32 boxCount = 0;
struct PokenavMonList item; struct PokenavMonListItem item;
while (boxId < TOTAL_BOXES_COUNT) while (boxId < TOTAL_BOXES_COUNT)
{ {
@@ -302,15 +302,15 @@ static u32 BuildBoxMonRibbonList(s32 state)
item.boxId = boxId; item.boxId = boxId;
item.monId = monId; item.monId = monId;
item.data = ribbonCount; item.data = ribbonCount;
sub_81CFCEC(ptr, &item); InsertMonListItem(list, &item);
} }
} }
boxCount++; boxCount++;
monId++; monId++;
if (boxCount > TOTAL_BOXES_COUNT) if (boxCount > TOTAL_BOXES_COUNT)
{ {
ptr->boxId = boxId; list->boxId = boxId;
ptr->monId = monId; list->monId = monId;
return LT_CONTINUE; return LT_CONTINUE;
} }
} }
@@ -318,28 +318,28 @@ static u32 BuildBoxMonRibbonList(s32 state)
boxId++; boxId++;
} }
ptr->changeBgs = 1; list->changeBgs = 1;
return LT_FINISH; return LT_FINISH;
} }
static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item) static void InsertMonListItem(struct Pokenav_RibbonsMonList *list, struct PokenavMonListItem *item)
{ {
u32 left = 0; u32 left = 0;
u32 right = structPtr->monList->listCount; u32 right = list->monList->listCount;
u32 insertionIdx = left + (right - left) / 2; u32 insertionIdx = left + (right - left) / 2;
while (right != insertionIdx) while (right != insertionIdx)
{ {
if (item->data > structPtr->monList->monData[insertionIdx].data) if (item->data > list->monList->monData[insertionIdx].data)
right = insertionIdx; right = insertionIdx;
else else
left = insertionIdx + 1; left = insertionIdx + 1;
insertionIdx = left + (right - left) / 2; insertionIdx = left + (right - left) / 2;
} }
for (right = structPtr->monList->listCount; right > insertionIdx; right--) for (right = list->monList->listCount; right > insertionIdx; right--)
structPtr->monList->monData[right] = structPtr->monList->monData[right - 1]; list->monList->monData[right] = list->monList->monData[right - 1];
structPtr->monList->monData[insertionIdx] = *item; list->monList->monData[insertionIdx] = *item;
structPtr->monList->listCount++; list->monList->listCount++;
} }
// Unused // Unused
@@ -374,62 +374,62 @@ static bool32 PlayerHasRibbonsMon(void)
bool32 OpenRibbonsMonList(void) bool32 OpenRibbonsMonList(void)
{ {
struct PokenavSub10 *ptr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct PokenavSub10)); struct Pokenav_RibbonsMonMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct Pokenav_RibbonsMonMenu));
if (ptr == NULL) if (menu == NULL)
return FALSE; return FALSE;
ptr->ltid = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1); menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1);
ptr->callback = GetRibbonsMonCurrentLoopedTaskActive; menu->callback = GetRibbonsMonCurrentLoopedTaskActive;
ptr->fromSummary = FALSE; menu->fromSummary = FALSE;
return TRUE; return TRUE;
} }
bool32 OpenRibbonsMonListFromRibbonsSummary(void) bool32 OpenRibbonsMonListFromRibbonsSummary(void)
{ {
struct PokenavSub10 *monMenu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct PokenavSub10)); struct Pokenav_RibbonsMonMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU, sizeof(struct Pokenav_RibbonsMonMenu));
if (monMenu == NULL) if (menu == NULL)
return FALSE; return FALSE;
monMenu->ltid = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1); menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsMonList, 1);
monMenu->callback = GetRibbonsMonCurrentLoopedTaskActive; menu->callback = GetRibbonsMonCurrentLoopedTaskActive;
monMenu->fromSummary = TRUE; menu->fromSummary = TRUE;
return TRUE; return TRUE;
} }
void CreateRibbonsMonListLoopedTask(s32 idx) void CreateRibbonsMonListLoopedTask(s32 idx)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
monMenu->ltid = CreateLoopedTask(sRibbonsMonMenuLoopTaskFuncs[idx], 1); menu->loopedTaskId = CreateLoopedTask(sRibbonsMonMenuLoopTaskFuncs[idx], 1);
monMenu->callback = GetRibbonsMonCurrentLoopedTaskActive; menu->callback = GetRibbonsMonCurrentLoopedTaskActive;
} }
bool32 IsRibbonsMonListLoopedTaskActive(void) bool32 IsRibbonsMonListLoopedTaskActive(void)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
return monMenu->callback(); return menu->callback();
} }
bool32 GetRibbonsMonCurrentLoopedTaskActive(void) bool32 GetRibbonsMonCurrentLoopedTaskActive(void)
{ {
struct PokenavSub10 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
return IsLoopedTaskActive(ptr->ltid); return IsLoopedTaskActive(menu->loopedTaskId);
} }
void FreeRibbonsMonList2(void) void FreeRibbonsMonMenu(void)
{ {
struct PokenavSub10 * ptr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
sub_81C8234(); DestroyPokenavList();
RemoveWindow(ptr->winid); RemoveWindow(menu->winid);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
} }
static u32 LoopedTask_OpenRibbonsMonList(s32 state) static u32 LoopedTask_OpenRibbonsMonList(s32 state)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
InitBgTemplates(sMonRibbonListBgTemplates, ARRAY_COUNT(sMonRibbonListBgTemplates)); InitBgTemplates(sMonRibbonListBgTemplates, ARRAY_COUNT(sMonRibbonListBgTemplates));
DecompressAndCopyTileDataToVram(1, sMonRibbonListFrameTiles, 0, 0, 0); DecompressAndCopyTileDataToVram(1, sMonRibbonListFrameTiles, 0, 0, 0);
SetBgTilemapBuffer(1, monMenu->buff); SetBgTilemapBuffer(1, menu->buff);
CopyToBgTilemapBuffer(1, sMonRibbonListFrameTilemap, 0, 0); CopyToBgTilemapBuffer(1, sMonRibbonListFrameTilemap, 0, 0);
CopyPaletteIntoBufferUnfaded(sMonRibbonListFramePal, 0x10, 0x20); CopyPaletteIntoBufferUnfaded(sMonRibbonListFramePal, 0x10, 0x20);
CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(1);
@@ -447,12 +447,12 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state)
if (FreeTempTileDataBuffersIfPossible()) if (FreeTempTileDataBuffersIfPossible())
return LT_PAUSE; return LT_PAUSE;
CopyPaletteIntoBufferUnfaded(sMonRibbonListUi_Pal, 0x20, 0x20); CopyPaletteIntoBufferUnfaded(sMonRibbonListUi_Pal, 0x20, 0x20);
InitMonRibbonPokenavListMenuTemplate(); CreateRibbonMonsList();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (sub_81C8224()) if (IsCreatePokenavListTaskActive())
return LT_PAUSE; return LT_PAUSE;
AddRibbonsMonListWindow(monMenu); AddRibbonsMonListWindow(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 4: case 4:
if (FreeTempTileDataBuffersIfPossible()) if (FreeTempTileDataBuffersIfPossible())
@@ -460,8 +460,8 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state)
ShowBg(2); ShowBg(2);
HideBg(3); HideBg(3);
PrintHelpBarText(HELPBAR_RIBBONS_MON_LIST); PrintHelpBarText(HELPBAR_RIBBONS_MON_LIST);
PokenavFadeScreen(1); PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
if (!monMenu->fromSummary) if (!menu->fromSummary)
{ {
LoadLeftHeaderGfxForIndex(POKENAV_GFX_RIBBONS_MENU); LoadLeftHeaderGfxForIndex(POKENAV_GFX_RIBBONS_MENU);
ShowLeftHeaderGfx(POKENAV_GFX_RIBBONS_MENU, 1, 0); ShowLeftHeaderGfx(POKENAV_GFX_RIBBONS_MENU, 1, 0);
@@ -479,11 +479,11 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state)
static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state) static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_MoveCursorUp()) switch (PokenavList_MoveCursorUp())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -496,11 +496,11 @@ static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
sub_81D0288(monMenu); UpdateIndexNumberDisplay(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -512,11 +512,11 @@ static u32 LoopedTask_RibbonsListMoveCursorUp(s32 state)
static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state) static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_MoveCursorDown()) switch (PokenavList_MoveCursorDown())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -529,11 +529,11 @@ static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
sub_81D0288(monMenu); UpdateIndexNumberDisplay(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -545,11 +545,11 @@ static u32 LoopedTask_RibbonsListMoveCursorDown(s32 state)
static u32 LoopedTask_RibbonsListMovePageUp(s32 state) static u32 LoopedTask_RibbonsListMovePageUp(s32 state)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_PageUp()) switch (PokenavList_PageUp())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -562,11 +562,11 @@ static u32 LoopedTask_RibbonsListMovePageUp(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
sub_81D0288(monMenu); UpdateIndexNumberDisplay(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -578,11 +578,11 @@ static u32 LoopedTask_RibbonsListMovePageUp(s32 state)
static u32 LoopedTask_RibbonsListMovePageDown(s32 state) static u32 LoopedTask_RibbonsListMovePageDown(s32 state)
{ {
struct PokenavSub10 *monMenu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
switch (MatchCall_PageDown()) switch (PokenavList_PageDown())
{ {
case 0: case 0:
return LT_FINISH; return LT_FINISH;
@@ -595,11 +595,11 @@ static u32 LoopedTask_RibbonsListMovePageDown(s32 state)
} }
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsMonListLoopedTaskActive()) if (PokenavList_IsMoveWindowTaskActive())
return LT_PAUSE; return LT_PAUSE;
// fallthrough // fallthrough
case 2: case 2:
sub_81D0288(monMenu); UpdateIndexNumberDisplay(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@@ -615,7 +615,7 @@ static u32 LoopedTask_RibbonsListReturnToMainMenu(s32 state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
PokenavFadeScreen(0); PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
SlideMenuHeaderDown(); SlideMenuHeaderDown();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
@@ -635,7 +635,7 @@ static u32 LoopedTask_RibbonsListOpenSummary(s32 state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
PokenavFadeScreen(0); PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsPaletteFadeActive()) if (IsPaletteFadeActive())
@@ -645,64 +645,64 @@ static u32 LoopedTask_RibbonsListOpenSummary(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static void AddRibbonsMonListWindow(struct PokenavSub10 *monMenu) static void AddRibbonsMonListWindow(struct Pokenav_RibbonsMonMenu *menu)
{ {
s32 r2; s32 listCount;
monMenu->winid = AddWindow(&sRibbonsMonListWindowTemplate); menu->winid = AddWindow(&sRibbonsMonListWindowTemplate);
PutWindowTilemap(monMenu->winid); PutWindowTilemap(menu->winid);
r2 = GetRibbonsMonListCount(); listCount = GetRibbonsMonListCount();
sub_81D02B0(monMenu->winid, 0, r2); DrawListIndexNumber(menu->winid, 0, listCount);
CopyWindowToVram(monMenu->winid, COPYWIN_MAP); CopyWindowToVram(menu->winid, COPYWIN_MAP);
sub_81D0288(monMenu); UpdateIndexNumberDisplay(menu);
} }
static void sub_81D0288(struct PokenavSub10 *monMenu) static void UpdateIndexNumberDisplay(struct Pokenav_RibbonsMonMenu *menu)
{ {
s32 r4 = GetSelectedPokenavListIndex(); s32 listIndex = PokenavList_GetSelectedIndex();
s32 r2 = GetRibbonsMonListCount(); s32 listCount = GetRibbonsMonListCount();
sub_81D02B0(monMenu->winid, r4 + 1, r2); DrawListIndexNumber(menu->winid, listIndex + 1, listCount);
CopyWindowToVram(monMenu->winid, COPYWIN_GFX); CopyWindowToVram(menu->winid, COPYWIN_GFX);
} }
static void sub_81D02B0(s32 windowId, s32 val1, s32 val2) static void DrawListIndexNumber(s32 windowId, s32 index, s32 max)
{ {
u8 strbuf[16]; u8 strbuf[16];
u32 x; u32 x;
u8 * ptr = strbuf; u8 * ptr = strbuf;
ptr = ConvertIntToDecimalStringN(ptr, val1, STR_CONV_MODE_RIGHT_ALIGN, 3); ptr = ConvertIntToDecimalStringN(ptr, index, STR_CONV_MODE_RIGHT_ALIGN, 3);
*ptr++ = CHAR_SLASH; *ptr++ = CHAR_SLASH;
ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(ptr, max, STR_CONV_MODE_RIGHT_ALIGN, 3);
x = GetStringCenterAlignXOffset(FONT_NORMAL, strbuf, 56); x = GetStringCenterAlignXOffset(FONT_NORMAL, strbuf, 56);
AddTextPrinterParameterized(windowId, FONT_NORMAL, strbuf, x, 1, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(windowId, FONT_NORMAL, strbuf, x, 1, TEXT_SKIP_DRAW, NULL);
} }
static void InitMonRibbonPokenavListMenuTemplate(void) static void CreateRibbonMonsList(void)
{ {
struct PokenavListTemplate template; struct PokenavListTemplate template;
template.list.monList = GetMonRibbonMonListData(); template.list = (struct PokenavListItem *)GetMonRibbonMonListData();
template.count = GetRibbonsMonListCount(); template.count = GetRibbonsMonListCount();
template.unk8 = 4; template.itemSize = sizeof(struct PokenavListItem);
template.unk6 = GetRibbonListMenuCurrIndex(); template.startIndex = GetRibbonListMenuCurrIndex();
template.item_X = 13; template.item_X = 13;
template.windowWidth = 17; template.windowWidth = 17;
template.listTop = 1; template.listTop = 1;
template.maxShowed = 8; template.maxShowed = 8;
template.fillValue = 2; template.fillValue = 2;
template.fontId = FONT_NORMAL; template.fontId = FONT_NORMAL;
template.listFunc.printMonFunc = BufferRibbonMonInfoText; template.bufferItemFunc = BufferRibbonMonInfoText;
template.unk14 = NULL; template.iconDrawFunc = NULL;
sub_81C81D4(&sMonRibbonListBgTemplates[1], &template, 0); CreatePokenavList(&sMonRibbonListBgTemplates[1], &template, 0);
} }
// Buffers the "Nickname gender/level" text for the ribbon mon list // Buffers the "Nickname gender/level" text for the ribbon mon list
static void BufferRibbonMonInfoText(struct PokenavMonList * item0, u8 * dest) static void BufferRibbonMonInfoText(struct PokenavListItem * listItem, u8 * dest)
{ {
u8 gender; u8 gender;
u8 level; u8 level;
u8 * s; u8 * s;
const u8 * genderStr; const u8 * genderStr;
struct PokenavMonList * item = item0; struct PokenavMonListItem * item = (struct PokenavMonListItem *)listItem;
// Mon is in party // Mon is in party
if (item->boxId == TOTAL_BOXES_COUNT) if (item->boxId == TOTAL_BOXES_COUNT)
@@ -39,10 +39,10 @@ enum
#define MON_SPRITE_X_OFF -32 #define MON_SPRITE_X_OFF -32
#define MON_SPRITE_Y 104 #define MON_SPRITE_Y 104
struct PokenavSub13 struct Pokenav_RibbonsSummaryList
{ {
u8 unused1[8]; u8 unused1[8];
struct PokenavSub18 *monList; struct PokenavMonList *monList;
u16 selectedPos; u16 selectedPos;
u16 normalRibbonLastRowStart; u16 normalRibbonLastRowStart;
u16 numNormalRibbons; u16 numNormalRibbons;
@@ -50,10 +50,10 @@ struct PokenavSub13
u32 ribbonIds[FIRST_GIFT_RIBBON]; u32 ribbonIds[FIRST_GIFT_RIBBON];
u32 giftRibbonIds[NUM_GIFT_RIBBONS]; u32 giftRibbonIds[NUM_GIFT_RIBBONS];
u32 unused2; u32 unused2;
u32 (*callback)(struct PokenavSub13 *); u32 (*callback)(struct Pokenav_RibbonsSummaryList *);
}; };
struct PokenavSub14 struct Pokenav_RibbonsSummaryMenu
{ {
u32 (*callback)(void); u32 (*callback)(void);
u32 loopedTaskId; u32 loopedTaskId;
@@ -71,31 +71,31 @@ struct PokenavSub14
static u32 sRibbonDraw_Total; static u32 sRibbonDraw_Total;
static u32 sRibbonDraw_Current; static u32 sRibbonDraw_Current;
static void PrintCurrentMonRibbonCount(struct PokenavSub14 *); static void PrintCurrentMonRibbonCount(struct Pokenav_RibbonsSummaryMenu *);
static void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *); static void PrintRibbbonsSummaryMonInfo(struct Pokenav_RibbonsSummaryMenu *);
static void PrintRibbonsMonListIndex(struct PokenavSub14 *); static void PrintRibbonsMonListIndex(struct Pokenav_RibbonsSummaryMenu *);
static void ZoomOutSelectedRibbon(struct PokenavSub14 *); static void ZoomOutSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *);
static void UpdateAndZoomInSelectedRibbon(struct PokenavSub14 *); static void UpdateAndZoomInSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *);
static void PrintRibbonNameAndDescription(struct PokenavSub14 *); static void PrintRibbonNameAndDescription(struct Pokenav_RibbonsSummaryMenu *);
static void ResetSpritesAndDrawMonFrontPic(struct PokenavSub14 *); static void ResetSpritesAndDrawMonFrontPic(struct Pokenav_RibbonsSummaryMenu *);
static void AddRibbonListIndexWindow(struct PokenavSub14 *); static void AddRibbonListIndexWindow(struct Pokenav_RibbonsSummaryMenu *);
static void DestroyRibbonsMonFrontPic(struct PokenavSub14 *); static void DestroyRibbonsMonFrontPic(struct Pokenav_RibbonsSummaryMenu *);
static void SlideMonSpriteOff(struct PokenavSub14 *); static void SlideMonSpriteOff(struct Pokenav_RibbonsSummaryMenu *);
static void SlideMonSpriteOn(struct PokenavSub14 *); static void SlideMonSpriteOn(struct Pokenav_RibbonsSummaryMenu *);
static void AddRibbonCountWindow(struct PokenavSub14 *); static void AddRibbonCountWindow(struct Pokenav_RibbonsSummaryMenu *);
static void CreateBigRibbonSprite(struct PokenavSub14 *); static void CreateBigRibbonSprite(struct Pokenav_RibbonsSummaryMenu *);
static void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *); static void AddRibbonSummaryMonNameWindow(struct Pokenav_RibbonsSummaryMenu *);
static void DrawAllRibbonsSmall(struct PokenavSub14 *); static void DrawAllRibbonsSmall(struct Pokenav_RibbonsSummaryMenu *);
static bool32 IsRibbonAnimating(struct PokenavSub14 *); static bool32 IsRibbonAnimating(struct Pokenav_RibbonsSummaryMenu *);
static bool32 IsMonSpriteAnimating(struct PokenavSub14 *); static bool32 IsMonSpriteAnimating(struct Pokenav_RibbonsSummaryMenu *);
static void GetMonRibbons(struct PokenavSub13 *); static void GetMonRibbons(struct Pokenav_RibbonsSummaryList *);
static u32 HandleExpandedRibbonInput(struct PokenavSub13 *); static u32 HandleExpandedRibbonInput(struct Pokenav_RibbonsSummaryList *);
static u32 RibbonsSummaryHandleInput(struct PokenavSub13 *); static u32 RibbonsSummaryHandleInput(struct Pokenav_RibbonsSummaryList *);
static u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *); static u32 ReturnToRibbonsListFromSummary(struct Pokenav_RibbonsSummaryList *);
static bool32 TrySelectRibbonUp(struct PokenavSub13 *); static bool32 TrySelectRibbonUp(struct Pokenav_RibbonsSummaryList *);
static bool32 TrySelectRibbonRight(struct PokenavSub13 *); static bool32 TrySelectRibbonRight(struct Pokenav_RibbonsSummaryList *);
static bool32 TrySelectRibbonLeft(struct PokenavSub13 *); static bool32 TrySelectRibbonLeft(struct Pokenav_RibbonsSummaryList *);
static bool32 TrySelectRibbonDown(struct PokenavSub13 *); static bool32 TrySelectRibbonDown(struct Pokenav_RibbonsSummaryList *);
static bool32 GetCurrentLoopedTaskActive(void); static bool32 GetCurrentLoopedTaskActive(void);
static u32 GetRibbonsSummaryCurrentIndex(void); static u32 GetRibbonsSummaryCurrentIndex(void);
static u32 GetRibbonsSummaryMonListCount(void); static u32 GetRibbonsSummaryMonListCount(void);
@@ -186,16 +186,16 @@ static const LoopedTask sRibbonsSummaryMenuLoopTaskFuncs[] =
bool32 PokenavCallback_Init_RibbonsSummaryMenu(void) bool32 PokenavCallback_Init_RibbonsSummaryMenu(void)
{ {
struct PokenavSub13 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST, sizeof(struct PokenavSub13)); struct Pokenav_RibbonsSummaryList *list = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST, sizeof(struct Pokenav_RibbonsSummaryList));
if (structPtr == NULL) if (list == NULL)
return FALSE; return FALSE;
structPtr->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST); list->monList = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST);
if (structPtr->monList == NULL) if (list->monList == NULL)
return FALSE; return FALSE;
GetMonRibbons(structPtr); GetMonRibbons(list);
structPtr->callback = RibbonsSummaryHandleInput; list->callback = RibbonsSummaryHandleInput;
gKeyRepeatContinueDelay = 3; gKeyRepeatContinueDelay = 3;
gKeyRepeatStartDelay = 10; gKeyRepeatStartDelay = 10;
return TRUE; return TRUE;
@@ -203,8 +203,8 @@ bool32 PokenavCallback_Init_RibbonsSummaryMenu(void)
u32 GetRibbonsSummaryMenuCallback(void) u32 GetRibbonsSummaryMenuCallback(void)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
return structPtr->callback(structPtr); return list->callback(list);
} }
void FreeRibbonsSummaryScreen1(void) void FreeRibbonsSummaryScreen1(void)
@@ -213,150 +213,150 @@ void FreeRibbonsSummaryScreen1(void)
} }
// Handles input when a specific ribbon is not currently selected // Handles input when a specific ribbon is not currently selected
static u32 RibbonsSummaryHandleInput(struct PokenavSub13 *structPtr) static u32 RibbonsSummaryHandleInput(struct Pokenav_RibbonsSummaryList *list)
{ {
// Handle Up/Down movement to select a new Pokémon to show ribbons for // Handle Up/Down movement to select a new Pokémon to show ribbons for
if (JOY_REPEAT(DPAD_UP) && structPtr->monList->currIndex != 0) if (JOY_REPEAT(DPAD_UP) && list->monList->currIndex != 0)
{ {
structPtr->monList->currIndex--; list->monList->currIndex--;
structPtr->selectedPos = 0; list->selectedPos = 0;
GetMonRibbons(structPtr); GetMonRibbons(list);
return RIBBONS_SUMMARY_FUNC_SWITCH_MONS; return RIBBONS_SUMMARY_FUNC_SWITCH_MONS;
} }
if (JOY_REPEAT(DPAD_DOWN) && structPtr->monList->currIndex < structPtr->monList->listCount - 1) if (JOY_REPEAT(DPAD_DOWN) && list->monList->currIndex < list->monList->listCount - 1)
{ {
structPtr->monList->currIndex++; list->monList->currIndex++;
structPtr->selectedPos = 0; list->selectedPos = 0;
GetMonRibbons(structPtr); GetMonRibbons(list);
return RIBBONS_SUMMARY_FUNC_SWITCH_MONS; return RIBBONS_SUMMARY_FUNC_SWITCH_MONS;
} }
if (JOY_NEW(A_BUTTON)) if (JOY_NEW(A_BUTTON))
{ {
// Enter ribbon selection // Enter ribbon selection
structPtr->callback = HandleExpandedRibbonInput; list->callback = HandleExpandedRibbonInput;
return RIBBONS_SUMMARY_FUNC_SELECT_RIBBON; return RIBBONS_SUMMARY_FUNC_SELECT_RIBBON;
} }
if (JOY_NEW(B_BUTTON)) if (JOY_NEW(B_BUTTON))
{ {
// Exit ribbon summary menu // Exit ribbon summary menu
structPtr->callback = ReturnToRibbonsListFromSummary; list->callback = ReturnToRibbonsListFromSummary;
return RIBBONS_SUMMARY_FUNC_EXIT; return RIBBONS_SUMMARY_FUNC_EXIT;
} }
return RIBBONS_SUMMARY_FUNC_NONE; return RIBBONS_SUMMARY_FUNC_NONE;
} }
// Handles input when a ribbon is selected // Handles input when a ribbon is selected
static u32 HandleExpandedRibbonInput(struct PokenavSub13 *structPtr) static u32 HandleExpandedRibbonInput(struct Pokenav_RibbonsSummaryList *list)
{ {
// Handle movement while a ribbon is selected // Handle movement while a ribbon is selected
if (JOY_REPEAT(DPAD_UP) && TrySelectRibbonUp(structPtr)) if (JOY_REPEAT(DPAD_UP) && TrySelectRibbonUp(list))
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
if (JOY_REPEAT(DPAD_DOWN) && TrySelectRibbonDown(structPtr)) if (JOY_REPEAT(DPAD_DOWN) && TrySelectRibbonDown(list))
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
if (JOY_REPEAT(DPAD_LEFT) && TrySelectRibbonLeft(structPtr)) if (JOY_REPEAT(DPAD_LEFT) && TrySelectRibbonLeft(list))
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
if (JOY_REPEAT(DPAD_RIGHT) && TrySelectRibbonRight(structPtr)) if (JOY_REPEAT(DPAD_RIGHT) && TrySelectRibbonRight(list))
return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE;
if (JOY_NEW(B_BUTTON)) if (JOY_NEW(B_BUTTON))
{ {
// Exit ribbon selection // Exit ribbon selection
structPtr->callback = RibbonsSummaryHandleInput; list->callback = RibbonsSummaryHandleInput;
return RIBBONS_SUMMARY_FUNC_EXPANDED_CANCEL; return RIBBONS_SUMMARY_FUNC_EXPANDED_CANCEL;
} }
return RIBBONS_SUMMARY_FUNC_NONE; return RIBBONS_SUMMARY_FUNC_NONE;
} }
static u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *structPtr) static u32 ReturnToRibbonsListFromSummary(struct Pokenav_RibbonsSummaryList *list)
{ {
return POKENAV_RIBBONS_RETURN_TO_MON_LIST; return POKENAV_RIBBONS_RETURN_TO_MON_LIST;
} }
static bool32 TrySelectRibbonUp(struct PokenavSub13 *structPtr) static bool32 TrySelectRibbonUp(struct Pokenav_RibbonsSummaryList *list)
{ {
if (structPtr->selectedPos < FIRST_GIFT_RIBBON) if (list->selectedPos < FIRST_GIFT_RIBBON)
{ {
// In normal ribbons, try to move up a row // In normal ribbons, try to move up a row
if (structPtr->selectedPos < RIBBONS_PER_ROW) if (list->selectedPos < RIBBONS_PER_ROW)
return FALSE; return FALSE;
structPtr->selectedPos -= RIBBONS_PER_ROW; list->selectedPos -= RIBBONS_PER_ROW;
return TRUE; return TRUE;
} }
if (structPtr->numNormalRibbons != 0) if (list->numNormalRibbons != 0)
{ {
// In gift ribbons, try to move up into normal ribbons // In gift ribbons, try to move up into normal ribbons
// If there's > 1 row of gift ribbons (not normally possible) // If there's > 1 row of gift ribbons (not normally possible)
// it's impossible to move up between them // it's impossible to move up between them
u32 ribbonPos = structPtr->selectedPos - GIFT_RIBBON_START_POS; u32 ribbonPos = list->selectedPos - GIFT_RIBBON_START_POS;
structPtr->selectedPos = ribbonPos + structPtr->normalRibbonLastRowStart; list->selectedPos = ribbonPos + list->normalRibbonLastRowStart;
if (structPtr->selectedPos >= structPtr->numNormalRibbons) if (list->selectedPos >= list->numNormalRibbons)
structPtr->selectedPos = structPtr->numNormalRibbons - 1; list->selectedPos = list->numNormalRibbons - 1;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
static bool32 TrySelectRibbonDown(struct PokenavSub13 *structPtr) static bool32 TrySelectRibbonDown(struct Pokenav_RibbonsSummaryList *list)
{ {
if (structPtr->selectedPos >= FIRST_GIFT_RIBBON) if (list->selectedPos >= FIRST_GIFT_RIBBON)
return FALSE; return FALSE;
if (structPtr->selectedPos < structPtr->normalRibbonLastRowStart) if (list->selectedPos < list->normalRibbonLastRowStart)
{ {
// Not in last row of normal ribbons, advance to next row // Not in last row of normal ribbons, advance to next row
structPtr->selectedPos += RIBBONS_PER_ROW; list->selectedPos += RIBBONS_PER_ROW;
if (structPtr->selectedPos >= structPtr->numNormalRibbons) if (list->selectedPos >= list->numNormalRibbons)
structPtr->selectedPos = structPtr->numNormalRibbons - 1; list->selectedPos = list->numNormalRibbons - 1;
return TRUE; return TRUE;
} }
if (structPtr->numGiftRibbons != 0) if (list->numGiftRibbons != 0)
{ {
// In/beyond last of row of normal ribbons and gift ribbons present, move down to gift ribbon row // In/beyond last of row of normal ribbons and gift ribbons present, move down to gift ribbon row
int ribbonPos = structPtr->selectedPos - structPtr->normalRibbonLastRowStart; int ribbonPos = list->selectedPos - list->normalRibbonLastRowStart;
if (ribbonPos >= structPtr->numGiftRibbons) if (ribbonPos >= list->numGiftRibbons)
ribbonPos = structPtr->numGiftRibbons - 1; ribbonPos = list->numGiftRibbons - 1;
structPtr->selectedPos = ribbonPos + GIFT_RIBBON_START_POS; list->selectedPos = ribbonPos + GIFT_RIBBON_START_POS;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
static bool32 TrySelectRibbonLeft(struct PokenavSub13 *structPtr) static bool32 TrySelectRibbonLeft(struct Pokenav_RibbonsSummaryList *list)
{ {
u16 column = structPtr->selectedPos % RIBBONS_PER_ROW; u16 column = list->selectedPos % RIBBONS_PER_ROW;
if (column != 0) if (column != 0)
{ {
structPtr->selectedPos--; list->selectedPos--;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
static bool32 TrySelectRibbonRight(struct PokenavSub13 *structPtr) static bool32 TrySelectRibbonRight(struct Pokenav_RibbonsSummaryList *list)
{ {
int column = structPtr->selectedPos % RIBBONS_PER_ROW; int column = list->selectedPos % RIBBONS_PER_ROW;
if (column >= RIBBONS_PER_ROW - 1) if (column >= RIBBONS_PER_ROW - 1)
return FALSE; return FALSE;
if (structPtr->selectedPos < GIFT_RIBBON_START_POS) if (list->selectedPos < GIFT_RIBBON_START_POS)
{ {
// Move right in normal ribbon row // Move right in normal ribbon row
if (structPtr->selectedPos < structPtr->numNormalRibbons - 1) if (list->selectedPos < list->numNormalRibbons - 1)
{ {
structPtr->selectedPos++; list->selectedPos++;
return TRUE; return TRUE;
} }
} }
else else
{ {
// Move right in gift ribbon row // Move right in gift ribbon row
if (column < structPtr->numGiftRibbons - 1) if (column < list->numGiftRibbons - 1)
{ {
structPtr->selectedPos++; list->selectedPos++;
return TRUE; return TRUE;
} }
} }
@@ -365,21 +365,21 @@ static bool32 TrySelectRibbonRight(struct PokenavSub13 *structPtr)
static u32 GetRibbonsSummaryCurrentIndex(void) static u32 GetRibbonsSummaryCurrentIndex(void)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
return structPtr->monList->currIndex; return list->monList->currIndex;
} }
static u32 GetRibbonsSummaryMonListCount(void) static u32 GetRibbonsSummaryMonListCount(void)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
return structPtr->monList->listCount; return list->monList->listCount;
} }
static void GetMonNicknameLevelGender(u8 *nick, u8 *level, u8 *gender) static void GetMonNicknameLevelGender(u8 *nick, u8 *level, u8 *gender)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
struct PokenavSub18 *mons = structPtr->monList; struct PokenavMonList *mons = list->monList;
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex]; struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
if (monInfo->boxId == TOTAL_BOXES_COUNT) if (monInfo->boxId == TOTAL_BOXES_COUNT)
{ {
@@ -402,9 +402,9 @@ static void GetMonNicknameLevelGender(u8 *nick, u8 *level, u8 *gender)
static void GetMonSpeciesPersonalityOtId(u16 *species, u32 *personality, u32 *otId) static void GetMonSpeciesPersonalityOtId(u16 *species, u32 *personality, u32 *otId)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
struct PokenavSub18 *mons = structPtr->monList; struct PokenavMonList *mons = list->monList;
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex]; struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
if (monInfo->boxId == TOTAL_BOXES_COUNT) if (monInfo->boxId == TOTAL_BOXES_COUNT)
{ {
@@ -426,9 +426,9 @@ static void GetMonSpeciesPersonalityOtId(u16 *species, u32 *personality, u32 *ot
static u32 GetCurrMonRibbonCount(void) static u32 GetCurrMonRibbonCount(void)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
struct PokenavSub18 *mons = structPtr->monList; struct PokenavMonList *mons = list->monList;
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex]; struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
if (monInfo->boxId == TOTAL_BOXES_COUNT) if (monInfo->boxId == TOTAL_BOXES_COUNT)
return GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBON_COUNT); return GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBON_COUNT);
@@ -436,20 +436,20 @@ static u32 GetCurrMonRibbonCount(void)
return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT); return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT);
} }
static void GetMonRibbons(struct PokenavSub13 *structPtr) static void GetMonRibbons(struct Pokenav_RibbonsSummaryList *list)
{ {
u32 ribbonFlags; u32 ribbonFlags;
s32 i, j; s32 i, j;
struct PokenavSub18 *mons = structPtr->monList; struct PokenavMonList *mons = list->monList;
struct PokenavMonList *monInfo = &mons->monData[mons->currIndex]; struct PokenavMonListItem *monInfo = &mons->monData[mons->currIndex];
if (monInfo->boxId == TOTAL_BOXES_COUNT) if (monInfo->boxId == TOTAL_BOXES_COUNT)
ribbonFlags = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS); ribbonFlags = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS);
else else
ribbonFlags = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS); ribbonFlags = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS);
structPtr->numNormalRibbons = 0; list->numNormalRibbons = 0;
structPtr->numGiftRibbons = 0; list->numGiftRibbons = 0;
for (i = 0; i < ARRAY_COUNT(sRibbonData); i++) for (i = 0; i < ARRAY_COUNT(sRibbonData); i++)
{ {
// For all non-contest ribbons, numRibbons will be 1 if they have it, 0 if they don't // For all non-contest ribbons, numRibbons will be 1 if they have it, 0 if they don't
@@ -458,119 +458,119 @@ static void GetMonRibbons(struct PokenavSub13 *structPtr)
if (!sRibbonData[i].isGiftRibbon) if (!sRibbonData[i].isGiftRibbon)
{ {
for (j = 0; j < numRibbons; j++) for (j = 0; j < numRibbons; j++)
structPtr->ribbonIds[structPtr->numNormalRibbons++] = sRibbonData[i].ribbonId + j; list->ribbonIds[list->numNormalRibbons++] = sRibbonData[i].ribbonId + j;
} }
else else
{ {
for (j = 0; j < numRibbons; j++) for (j = 0; j < numRibbons; j++)
structPtr->giftRibbonIds[structPtr->numGiftRibbons++] = sRibbonData[i].ribbonId + j; list->giftRibbonIds[list->numGiftRibbons++] = sRibbonData[i].ribbonId + j;
} }
ribbonFlags >>= sRibbonData[i].numBits; ribbonFlags >>= sRibbonData[i].numBits;
} }
if (structPtr->numNormalRibbons != 0) if (list->numNormalRibbons != 0)
{ {
structPtr->normalRibbonLastRowStart = ((structPtr->numNormalRibbons - 1) / RIBBONS_PER_ROW) * RIBBONS_PER_ROW; list->normalRibbonLastRowStart = ((list->numNormalRibbons - 1) / RIBBONS_PER_ROW) * RIBBONS_PER_ROW;
structPtr->selectedPos = 0; list->selectedPos = 0;
} }
else else
{ {
// There are no normal ribbons, move cursor to first gift ribbon // There are no normal ribbons, move cursor to first gift ribbon
structPtr->normalRibbonLastRowStart = 0; list->normalRibbonLastRowStart = 0;
structPtr->selectedPos = GIFT_RIBBON_START_POS; list->selectedPos = GIFT_RIBBON_START_POS;
} }
} }
static u32 *GetNormalRibbonIds(u32 *size) static u32 *GetNormalRibbonIds(u32 *size)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
*size = structPtr->numNormalRibbons; *size = list->numNormalRibbons;
return structPtr->ribbonIds; return list->ribbonIds;
} }
static u32 *GetGiftRibbonIds(u32 *size) static u32 *GetGiftRibbonIds(u32 *size)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
*size = structPtr->numGiftRibbons; *size = list->numGiftRibbons;
return structPtr->giftRibbonIds; return list->giftRibbonIds;
} }
static u16 GetSelectedPosition(void) static u16 GetSelectedPosition(void)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
return structPtr->selectedPos; return list->selectedPos;
} }
static u32 GetRibbonId(void) static u32 GetRibbonId(void)
{ {
struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct Pokenav_RibbonsSummaryList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST);
int ribbonPos = structPtr->selectedPos; int ribbonPos = list->selectedPos;
if (ribbonPos < FIRST_GIFT_RIBBON) if (ribbonPos < FIRST_GIFT_RIBBON)
return structPtr->ribbonIds[ribbonPos]; return list->ribbonIds[ribbonPos];
else else
return structPtr->giftRibbonIds[ribbonPos - GIFT_RIBBON_START_POS]; return list->giftRibbonIds[ribbonPos - GIFT_RIBBON_START_POS];
} }
bool32 OpenRibbonsSummaryMenu(void) bool32 OpenRibbonsSummaryMenu(void)
{ {
struct PokenavSub14 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU, sizeof(struct PokenavSub14)); struct Pokenav_RibbonsSummaryMenu *menu = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU, sizeof(struct Pokenav_RibbonsSummaryMenu));
if (structPtr == NULL) if (menu == NULL)
return FALSE; return FALSE;
structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsSummaryMenu, 1); menu->loopedTaskId = CreateLoopedTask(LoopedTask_OpenRibbonsSummaryMenu, 1);
structPtr->callback = GetCurrentLoopedTaskActive; menu->callback = GetCurrentLoopedTaskActive;
return TRUE; return TRUE;
} }
void CreateRibbonsSummaryLoopedTask(s32 id) void CreateRibbonsSummaryLoopedTask(s32 id)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
structPtr->loopedTaskId = CreateLoopedTask(sRibbonsSummaryMenuLoopTaskFuncs[id], 1); menu->loopedTaskId = CreateLoopedTask(sRibbonsSummaryMenuLoopTaskFuncs[id], 1);
structPtr->callback = GetCurrentLoopedTaskActive; menu->callback = GetCurrentLoopedTaskActive;
} }
u32 IsRibbonsSummaryLoopedTaskActive(void) u32 IsRibbonsSummaryLoopedTaskActive(void)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
return structPtr->callback(); return menu->callback();
} }
void FreeRibbonsSummaryScreen2(void) void FreeRibbonsSummaryScreen2(void)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
RemoveWindow(structPtr->ribbonCountWindowId); RemoveWindow(menu->ribbonCountWindowId);
RemoveWindow(structPtr->nameWindowId); RemoveWindow(menu->nameWindowId);
RemoveWindow(structPtr->listIdxWindowId); RemoveWindow(menu->listIdxWindowId);
#ifndef BUGFIX #ifndef BUGFIX
RemoveWindow(structPtr->unusedWindowId); // Removing window, but window id is never set RemoveWindow(menu->unusedWindowId); // Removing window, but window id is never set
#endif #endif
DestroyRibbonsMonFrontPic(structPtr); DestroyRibbonsMonFrontPic(menu);
FreeSpriteTilesByTag(GFXTAG_RIBBON_ICONS_BIG); FreeSpriteTilesByTag(GFXTAG_RIBBON_ICONS_BIG);
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_1); FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_1);
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_2); FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_2);
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_3); FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_3);
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_4); FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_4);
FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_5); FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_5);
FreeSpriteOamMatrix(structPtr->bigRibbonSprite); FreeSpriteOamMatrix(menu->bigRibbonSprite);
DestroySprite(structPtr->bigRibbonSprite); DestroySprite(menu->bigRibbonSprite);
FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
} }
static bool32 GetCurrentLoopedTaskActive(void) static bool32 GetCurrentLoopedTaskActive(void)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
return IsLoopedTaskActive(structPtr->loopedTaskId); return IsLoopedTaskActive(menu->loopedTaskId);
} }
static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
InitBgTemplates(sBgTemplates, ARRAY_COUNT(sBgTemplates)); InitBgTemplates(sBgTemplates, ARRAY_COUNT(sBgTemplates));
DecompressAndCopyTileDataToVram(2, gPokenavRibbonsSummaryBg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(2, gPokenavRibbonsSummaryBg_Gfx, 0, 0, 0);
SetBgTilemapBuffer(2, structPtr->tilemapBuffers[0]); SetBgTilemapBuffer(2, menu->tilemapBuffers[0]);
CopyToBgTilemapBuffer(2, gPokenavRibbonsSummaryBg_Tilemap, 0, 0); CopyToBgTilemapBuffer(2, gPokenavRibbonsSummaryBg_Tilemap, 0, 0);
CopyPaletteIntoBufferUnfaded(gPokenavRibbonsSummaryBg_Pal, 0x10, 0x20); CopyPaletteIntoBufferUnfaded(gPokenavRibbonsSummaryBg_Pal, 0x10, 0x20);
CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(2);
@@ -580,7 +580,7 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
{ {
BgDmaFill(1, 0, 0, 1); BgDmaFill(1, 0, 0, 1);
DecompressAndCopyTileDataToVram(1, sRibbonIconsSmall_Gfx, 0, 1, 0); DecompressAndCopyTileDataToVram(1, sRibbonIconsSmall_Gfx, 0, 1, 0);
SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); SetBgTilemapBuffer(1, menu->tilemapBuffers[1]);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);
CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, 0x20, 0xA0); CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, 0x20, 0xA0);
CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, 0xA0, 0x20); CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, 0xA0, 0x20);
@@ -591,21 +591,21 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
case 2: case 2:
if (!FreeTempTileDataBuffersIfPossible()) if (!FreeTempTileDataBuffersIfPossible())
{ {
AddRibbonCountWindow(structPtr); AddRibbonCountWindow(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
case 3: case 3:
if (!FreeTempTileDataBuffersIfPossible()) if (!FreeTempTileDataBuffersIfPossible())
{ {
AddRibbonSummaryMonNameWindow(structPtr); AddRibbonSummaryMonNameWindow(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
case 4: case 4:
if (!FreeTempTileDataBuffersIfPossible()) if (!FreeTempTileDataBuffersIfPossible())
{ {
AddRibbonListIndexWindow(structPtr); AddRibbonListIndexWindow(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
@@ -619,18 +619,18 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
case 6: case 6:
if (!IsDma3ManagerBusyWithBgCopy()) if (!IsDma3ManagerBusyWithBgCopy())
{ {
ResetSpritesAndDrawMonFrontPic(structPtr); ResetSpritesAndDrawMonFrontPic(menu);
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
} }
return LT_PAUSE; return LT_PAUSE;
case 7: case 7:
DrawAllRibbonsSmall(structPtr); DrawAllRibbonsSmall(menu);
PrintHelpBarText(HELPBAR_RIBBONS_LIST); PrintHelpBarText(HELPBAR_RIBBONS_LIST);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 8: case 8:
if (!IsDma3ManagerBusyWithBgCopy()) if (!IsDma3ManagerBusyWithBgCopy())
{ {
CreateBigRibbonSprite(structPtr); CreateBigRibbonSprite(menu);
ChangeBgX(1, 0, BG_COORD_SET); ChangeBgX(1, 0, BG_COORD_SET);
ChangeBgY(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET);
ChangeBgX(2, 0, BG_COORD_SET); ChangeBgX(2, 0, BG_COORD_SET);
@@ -638,7 +638,7 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state)
ShowBg(1); ShowBg(1);
ShowBg(2); ShowBg(2);
HideBg(3); HideBg(3);
PokenavFadeScreen(1); PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
@@ -655,7 +655,7 @@ static u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
PokenavFadeScreen(0); PokenavFadeScreen(POKENAV_FADE_TO_BLACK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsPaletteFadeActive()) if (IsPaletteFadeActive())
@@ -667,38 +667,38 @@ static u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state)
static u32 LoopedTask_SwitchRibbonsSummaryMon(s32 state) static u32 LoopedTask_SwitchRibbonsSummaryMon(s32 state)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
SlideMonSpriteOff(structPtr); SlideMonSpriteOff(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (!IsMonSpriteAnimating(structPtr)) if (!IsMonSpriteAnimating(menu))
{ {
PrintRibbbonsSummaryMonInfo(structPtr); PrintRibbbonsSummaryMonInfo(menu);
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
} }
return LT_PAUSE; return LT_PAUSE;
case 2: case 2:
DrawAllRibbonsSmall(structPtr); DrawAllRibbonsSmall(menu);
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 3: case 3:
PrintRibbonsMonListIndex(structPtr); PrintRibbonsMonListIndex(menu);
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 4: case 4:
PrintCurrentMonRibbonCount(structPtr); PrintCurrentMonRibbonCount(menu);
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 5: case 5:
if (!IsDma3ManagerBusyWithBgCopy()) if (!IsDma3ManagerBusyWithBgCopy())
{ {
SlideMonSpriteOn(structPtr); SlideMonSpriteOn(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
case 6: case 6:
if (IsMonSpriteAnimating(structPtr)) if (IsMonSpriteAnimating(menu))
return LT_PAUSE; return LT_PAUSE;
} }
return LT_FINISH; return LT_FINISH;
@@ -706,17 +706,17 @@ static u32 LoopedTask_SwitchRibbonsSummaryMon(s32 state)
static u32 LoopedTask_ExpandSelectedRibbon(s32 state) static u32 LoopedTask_ExpandSelectedRibbon(s32 state)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
UpdateAndZoomInSelectedRibbon(structPtr); UpdateAndZoomInSelectedRibbon(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (!IsRibbonAnimating(structPtr)) if (!IsRibbonAnimating(menu))
{ {
PrintRibbonNameAndDescription(structPtr); PrintRibbonNameAndDescription(menu);
PrintHelpBarText(HELPBAR_RIBBONS_CHECK); PrintHelpBarText(HELPBAR_RIBBONS_CHECK);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
@@ -730,24 +730,24 @@ static u32 LoopedTask_ExpandSelectedRibbon(s32 state)
static u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state) static u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
ZoomOutSelectedRibbon(structPtr); ZoomOutSelectedRibbon(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (!IsRibbonAnimating(structPtr)) if (!IsRibbonAnimating(menu))
{ {
UpdateAndZoomInSelectedRibbon(structPtr); UpdateAndZoomInSelectedRibbon(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
case 2: case 2:
if (!IsRibbonAnimating(structPtr)) if (!IsRibbonAnimating(menu))
{ {
PrintRibbonNameAndDescription(structPtr); PrintRibbonNameAndDescription(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
return LT_PAUSE; return LT_PAUSE;
@@ -760,17 +760,17 @@ static u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state)
static u32 LoopedTask_ShrinkExpandedRibbon(s32 state) static u32 LoopedTask_ShrinkExpandedRibbon(s32 state)
{ {
struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); struct Pokenav_RibbonsSummaryMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU);
switch (state) switch (state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
ZoomOutSelectedRibbon(structPtr); ZoomOutSelectedRibbon(menu);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (!IsRibbonAnimating(structPtr)) if (!IsRibbonAnimating(menu))
{ {
PrintCurrentMonRibbonCount(structPtr); PrintCurrentMonRibbonCount(menu);
PrintHelpBarText(HELPBAR_RIBBONS_LIST); PrintHelpBarText(HELPBAR_RIBBONS_LIST);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
} }
@@ -793,14 +793,14 @@ static const struct WindowTemplate sRibbonCountWindowTemplate =
.baseBlock = 0x14, .baseBlock = 0x14,
}; };
static void AddRibbonCountWindow(struct PokenavSub14 *structPtr) static void AddRibbonCountWindow(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
structPtr->ribbonCountWindowId = AddWindow(&sRibbonCountWindowTemplate); menu->ribbonCountWindowId = AddWindow(&sRibbonCountWindowTemplate);
PutWindowTilemap(structPtr->ribbonCountWindowId); PutWindowTilemap(menu->ribbonCountWindowId);
PrintCurrentMonRibbonCount(structPtr); PrintCurrentMonRibbonCount(menu);
} }
static void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr) static void PrintCurrentMonRibbonCount(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};
@@ -808,23 +808,23 @@ static void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr)
DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_RibbonsF700); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_RibbonsF700);
FillWindowPixelBuffer(structPtr->ribbonCountWindowId, PIXEL_FILL(4)); FillWindowPixelBuffer(menu->ribbonCountWindowId, PIXEL_FILL(4));
AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, FONT_NORMAL, 0, 1, color, TEXT_SKIP_DRAW, gStringVar4); AddTextPrinterParameterized3(menu->ribbonCountWindowId, FONT_NORMAL, 0, 1, color, TEXT_SKIP_DRAW, gStringVar4);
CopyWindowToVram(structPtr->ribbonCountWindowId, COPYWIN_GFX); CopyWindowToVram(menu->ribbonCountWindowId, COPYWIN_GFX);
} }
static void PrintRibbonNameAndDescription(struct PokenavSub14 *structPtr) static void PrintRibbonNameAndDescription(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
s32 i; s32 i;
u32 ribbonId = GetRibbonId(); u32 ribbonId = GetRibbonId();
u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};
FillWindowPixelBuffer(structPtr->ribbonCountWindowId, PIXEL_FILL(4)); FillWindowPixelBuffer(menu->ribbonCountWindowId, PIXEL_FILL(4));
if (ribbonId < FIRST_GIFT_RIBBON) if (ribbonId < FIRST_GIFT_RIBBON)
{ {
// Print normal ribbon name/description // Print normal ribbon name/description
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gRibbonDescriptionPointers[ribbonId][i]); AddTextPrinterParameterized3(menu->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gRibbonDescriptionPointers[ribbonId][i]);
} }
else else
{ {
@@ -840,10 +840,10 @@ static void PrintRibbonNameAndDescription(struct PokenavSub14 *structPtr)
// Print gift ribbon name/description // Print gift ribbon name/description
ribbonId--; ribbonId--;
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gGiftRibbonDescriptionPointers[ribbonId][i]); AddTextPrinterParameterized3(menu->ribbonCountWindowId, FONT_NORMAL, 0, (i * 16) + 1, color, TEXT_SKIP_DRAW, gGiftRibbonDescriptionPointers[ribbonId][i]);
} }
CopyWindowToVram(structPtr->ribbonCountWindowId, COPYWIN_GFX); CopyWindowToVram(menu->ribbonCountWindowId, COPYWIN_GFX);
} }
static const struct WindowTemplate sRibbonSummaryMonNameWindowTemplate = static const struct WindowTemplate sRibbonSummaryMonNameWindowTemplate =
@@ -857,23 +857,23 @@ static const struct WindowTemplate sRibbonSummaryMonNameWindowTemplate =
.baseBlock = 0x54, .baseBlock = 0x54,
}; };
static void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *structPtr) static void AddRibbonSummaryMonNameWindow(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
structPtr->nameWindowId = AddWindow(&sRibbonSummaryMonNameWindowTemplate); menu->nameWindowId = AddWindow(&sRibbonSummaryMonNameWindowTemplate);
PutWindowTilemap(structPtr->nameWindowId); PutWindowTilemap(menu->nameWindowId);
PrintRibbbonsSummaryMonInfo(structPtr); PrintRibbbonsSummaryMonInfo(menu);
} }
static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}");
static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}");
static const u8 sGenderlessIconString[] = _("{UNK_SPACER}"); static const u8 sGenderlessIconString[] = _("{UNK_SPACER}");
static void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *structPtr) static void PrintRibbbonsSummaryMonInfo(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
const u8 *genderTxt; const u8 *genderTxt;
u8 *txtPtr; u8 *txtPtr;
u8 level, gender; u8 level, gender;
u16 windowId = structPtr->nameWindowId; u16 windowId = menu->nameWindowId;
FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
GetMonNicknameLevelGender(gStringVar3, &level, &gender); GetMonNicknameLevelGender(gStringVar3, &level, &gender);
@@ -914,15 +914,15 @@ static const struct WindowTemplate sRibbonMonListIndexWindowTemplate[] =
{}, {},
}; };
static void AddRibbonListIndexWindow(struct PokenavSub14 *structPtr) static void AddRibbonListIndexWindow(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
structPtr->listIdxWindowId = AddWindow(sRibbonMonListIndexWindowTemplate); menu->listIdxWindowId = AddWindow(sRibbonMonListIndexWindowTemplate);
FillWindowPixelBuffer(structPtr->listIdxWindowId, PIXEL_FILL(1)); FillWindowPixelBuffer(menu->listIdxWindowId, PIXEL_FILL(1));
PutWindowTilemap(structPtr->listIdxWindowId); PutWindowTilemap(menu->listIdxWindowId);
PrintRibbonsMonListIndex(structPtr); PrintRibbonsMonListIndex(menu);
} }
static void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr) static void PrintRibbonsMonListIndex(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
s32 x; s32 x;
u8 *txtPtr; u8 *txtPtr;
@@ -933,24 +933,24 @@ static void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr)
*(txtPtr++) = CHAR_SLASH; *(txtPtr++) = CHAR_SLASH;
ConvertIntToDecimalStringN(txtPtr, count, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(txtPtr, count, STR_CONV_MODE_RIGHT_ALIGN, 3);
x = GetStringCenterAlignXOffset(FONT_NORMAL, gStringVar1, 56); x = GetStringCenterAlignXOffset(FONT_NORMAL, gStringVar1, 56);
AddTextPrinterParameterized(structPtr->listIdxWindowId, FONT_NORMAL, gStringVar1, x, 1, TEXT_SKIP_DRAW, NULL); AddTextPrinterParameterized(menu->listIdxWindowId, FONT_NORMAL, gStringVar1, x, 1, TEXT_SKIP_DRAW, NULL);
CopyWindowToVram(structPtr->listIdxWindowId, COPYWIN_GFX); CopyWindowToVram(menu->listIdxWindowId, COPYWIN_GFX);
} }
static void ResetSpritesAndDrawMonFrontPic(struct PokenavSub14 *structPtr) static void ResetSpritesAndDrawMonFrontPic(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
u16 species; u16 species;
u32 personality, otId; u32 personality, otId;
GetMonSpeciesPersonalityOtId(&species, &personality, &otId); GetMonSpeciesPersonalityOtId(&species, &personality, &otId);
ResetAllPicSprites(); ResetAllPicSprites();
structPtr->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_ON, MON_SPRITE_Y); menu->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_ON, MON_SPRITE_Y);
PokenavFillPalette(15, 0); PokenavFillPalette(15, 0);
} }
static void DestroyRibbonsMonFrontPic(struct PokenavSub14 *structPtr) static void DestroyRibbonsMonFrontPic(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
FreeAndDestroyMonPicSprite(structPtr->monSpriteId); FreeAndDestroyMonPicSprite(menu->monSpriteId);
} }
// x and y arguments are ignored // x and y arguments are ignored
@@ -967,25 +967,25 @@ static u16 DrawRibbonsMonFrontPic(s32 x, s32 y)
return spriteId; return spriteId;
} }
static void SlideMonSpriteOff(struct PokenavSub14 *structPtr) static void SlideMonSpriteOff(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
StartMonSpriteSlide(&gSprites[structPtr->monSpriteId], MON_SPRITE_X_ON, MON_SPRITE_X_OFF, 6); StartMonSpriteSlide(&gSprites[menu->monSpriteId], MON_SPRITE_X_ON, MON_SPRITE_X_OFF, 6);
} }
static void SlideMonSpriteOn(struct PokenavSub14 *structPtr) static void SlideMonSpriteOn(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
// Switch to new mon sprite // Switch to new mon sprite
FreeAndDestroyMonPicSprite(structPtr->monSpriteId); FreeAndDestroyMonPicSprite(menu->monSpriteId);
structPtr->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_OFF, MON_SPRITE_Y); menu->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_OFF, MON_SPRITE_Y);
// Slide on // Slide on
StartMonSpriteSlide(&gSprites[structPtr->monSpriteId], MON_SPRITE_X_OFF, MON_SPRITE_X_ON, 6); StartMonSpriteSlide(&gSprites[menu->monSpriteId], MON_SPRITE_X_OFF, MON_SPRITE_X_ON, 6);
} }
// Is Pokémon summary sprite still sliding off/on // Is Pokémon summary sprite still sliding off/on
static bool32 IsMonSpriteAnimating(struct PokenavSub14 *structPtr) static bool32 IsMonSpriteAnimating(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
return (gSprites[structPtr->monSpriteId].callback != SpriteCallbackDummy); return (gSprites[menu->monSpriteId].callback != SpriteCallbackDummy);
} }
#define sCurrX data[0] #define sCurrX data[0]
@@ -1030,7 +1030,7 @@ static void SpriteCB_MonSpriteSlide(struct Sprite *sprite)
#undef sTime #undef sTime
#undef sDestX #undef sDestX
static void DrawAllRibbonsSmall(struct PokenavSub14 *structPtr) static void DrawAllRibbonsSmall(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
u32 *ribbonIds; u32 *ribbonIds;
@@ -1211,7 +1211,7 @@ static const struct SpriteTemplate sSpriteTemplate_RibbonIconBig =
}; };
// Create dummy sprite to be used for the zoomed in version of the selected ribbon // Create dummy sprite to be used for the zoomed in version of the selected ribbon
static void CreateBigRibbonSprite(struct PokenavSub14 *structPtr) static void CreateBigRibbonSprite(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
u8 spriteId; u8 spriteId;
@@ -1219,45 +1219,45 @@ static void CreateBigRibbonSprite(struct PokenavSub14 *structPtr)
Pokenav_AllocAndLoadPalettes(sSpritePalettes_RibbonIcons); Pokenav_AllocAndLoadPalettes(sSpritePalettes_RibbonIcons);
spriteId = CreateSprite(&sSpriteTemplate_RibbonIconBig, 0, 0, 0); spriteId = CreateSprite(&sSpriteTemplate_RibbonIconBig, 0, 0, 0);
structPtr->bigRibbonSprite = &gSprites[spriteId]; menu->bigRibbonSprite = &gSprites[spriteId];
structPtr->bigRibbonSprite->invisible = TRUE; menu->bigRibbonSprite->invisible = TRUE;
} }
#define sInvisibleWhenDone data[0] #define sInvisibleWhenDone data[0]
static void UpdateAndZoomInSelectedRibbon(struct PokenavSub14 *structPtr) static void UpdateAndZoomInSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
u32 ribbonId; u32 ribbonId;
s32 position = GetSelectedPosition(); s32 position = GetSelectedPosition();
s32 x = (position % RIBBONS_PER_ROW) * 16 + 96; s32 x = (position % RIBBONS_PER_ROW) * 16 + 96;
s32 y = (position / RIBBONS_PER_ROW) * 16 + 40; s32 y = (position / RIBBONS_PER_ROW) * 16 + 40;
structPtr->bigRibbonSprite->x = x; menu->bigRibbonSprite->x = x;
structPtr->bigRibbonSprite->y = y; menu->bigRibbonSprite->y = y;
// Set new selected ribbon's gfx data // Set new selected ribbon's gfx data
ribbonId = GetRibbonId(); ribbonId = GetRibbonId();
structPtr->bigRibbonSprite->oam.tileNum = (sRibbonGfxData[ribbonId].tileNumOffset * 16) + GetSpriteTileStartByTag(GFXTAG_RIBBON_ICONS_BIG); menu->bigRibbonSprite->oam.tileNum = (sRibbonGfxData[ribbonId].tileNumOffset * 16) + GetSpriteTileStartByTag(GFXTAG_RIBBON_ICONS_BIG);
structPtr->bigRibbonSprite->oam.paletteNum = IndexOfSpritePaletteTag(sRibbonGfxData[ribbonId].palNumOffset + PALTAG_RIBBON_ICONS_1); menu->bigRibbonSprite->oam.paletteNum = IndexOfSpritePaletteTag(sRibbonGfxData[ribbonId].palNumOffset + PALTAG_RIBBON_ICONS_1);
// Start zoom in animation // Start zoom in animation
StartSpriteAffineAnim(structPtr->bigRibbonSprite, RIBBONANIM_ZOOM_IN); StartSpriteAffineAnim(menu->bigRibbonSprite, RIBBONANIM_ZOOM_IN);
structPtr->bigRibbonSprite->invisible = FALSE; menu->bigRibbonSprite->invisible = FALSE;
structPtr->bigRibbonSprite->sInvisibleWhenDone = FALSE; menu->bigRibbonSprite->sInvisibleWhenDone = FALSE;
structPtr->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation; menu->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation;
} }
// Start animation to zoom out of selected ribbon // Start animation to zoom out of selected ribbon
static void ZoomOutSelectedRibbon(struct PokenavSub14 *structPtr) static void ZoomOutSelectedRibbon(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
structPtr->bigRibbonSprite->sInvisibleWhenDone = TRUE; menu->bigRibbonSprite->sInvisibleWhenDone = TRUE;
StartSpriteAffineAnim(structPtr->bigRibbonSprite, RIBBONANIM_ZOOM_OUT); StartSpriteAffineAnim(menu->bigRibbonSprite, RIBBONANIM_ZOOM_OUT);
structPtr->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation; menu->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation;
} }
static bool32 IsRibbonAnimating(struct PokenavSub14 *structPtr) static bool32 IsRibbonAnimating(struct Pokenav_RibbonsSummaryMenu *menu)
{ {
return (structPtr->bigRibbonSprite->callback != SpriteCallbackDummy); return (menu->bigRibbonSprite->callback != SpriteCallbackDummy);
} }
static void SpriteCB_WaitForRibbonAnimation(struct Sprite *sprite) static void SpriteCB_WaitForRibbonAnimation(struct Sprite *sprite)
+1 -1
View File
@@ -490,7 +490,7 @@ static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogreDorsalFin =
static const struct ScanlineEffectParams sScanlineParams_DuoFight_Clouds = static const struct ScanlineEffectParams sScanlineParams_DuoFight_Clouds =
{ {
.dmaDest = (vu16 *)REG_ADDR_BG1HOFS, .dmaDest = &REG_BG1HOFS,
.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT, .dmaControl = SCANLINE_EFFECT_DMACNT_16BIT,
.initState = 1 .initState = 1
}; };
+14 -19
View File
@@ -116,19 +116,18 @@ static void CB_FadeInFlyMap(void);
static void CB_HandleFlyMapInput(void); static void CB_HandleFlyMapInput(void);
static void CB_ExitFlyMap(void); static void CB_ExitFlyMap(void);
// .rodata // NOTE: Some of the below graphics are not in graphics/pokenav/region_map
// because porymap expects them to be in their current location.
static const u16 sRegionMapCursorPal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal"); static const u16 sRegionMapCursorPal[] = INCBIN_U16("graphics/pokenav/region_map/cursor.gbapal");
static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/cursor_small.4bpp.lz"); static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_small.4bpp.lz");
static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/cursor_large.4bpp.lz"); static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_large.4bpp.lz");
static const u16 sRegionMapBg_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal"); static const u16 sRegionMapBg_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal");
static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map.8bpp.lz"); static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map.8bpp.lz");
static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map_map.bin.lz"); static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map_map.bin.lz");
static const u16 sRegionMapPlayerIcon_BrendanPal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal"); static const u16 sRegionMapPlayerIcon_BrendanPal[] = INCBIN_U16("graphics/pokenav/region_map/brendan_icon.gbapal");
static const u8 sRegionMapPlayerIcon_BrendanGfx[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp"); static const u8 sRegionMapPlayerIcon_BrendanGfx[] = INCBIN_U8("graphics/pokenav/region_map/brendan_icon.4bpp");
static const u16 sRegionMapPlayerIcon_MayPal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal"); static const u16 sRegionMapPlayerIcon_MayPal[] = INCBIN_U16("graphics/pokenav/region_map/may_icon.gbapal");
static const u8 sRegionMapPlayerIcon_MayGfx[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp"); static const u8 sRegionMapPlayerIcon_MayGfx[] = INCBIN_U8("graphics/pokenav/region_map/may_icon.4bpp");
static const u8 sRegionMap_MapSectionLayout[] = INCBIN_U8("graphics/pokenav/region_map_section_layout.bin"); static const u8 sRegionMap_MapSectionLayout[] = INCBIN_U8("graphics/pokenav/region_map_section_layout.bin");
#include "data/region_map/region_map_entries.h" #include "data/region_map/region_map_entries.h"
@@ -283,15 +282,11 @@ static const u8 sMapSecIdsOffMap[] =
MAPSEC_NAVEL_ROCK MAPSEC_NAVEL_ROCK
}; };
static const u16 sRegionMapFramePal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal"); static const u16 sRegionMapFramePal[] = INCBIN_U16("graphics/pokenav/region_map/frame.gbapal");
static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.4bpp.lz");
static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/map_frame.4bpp.lz"); static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.bin.lz");
static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/region_map/fly_target_icons.gbapal");
static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/map_frame.bin.lz"); static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/fly_target_icons.4bpp.lz");
static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal");
static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/fly_target_icons.4bpp.lz");
static const u8 sMapHealLocations[][3] = static const u8 sMapHealLocations[][3] =
{ {
+1 -1
View File
@@ -990,7 +990,7 @@ const u8 gText_Unknown[] = _("UNKNOWN");
const u8 gText_Call[] = _("CALL"); const u8 gText_Call[] = _("CALL");
const u8 gText_Check[] = _("CHECK"); const u8 gText_Check[] = _("CHECK");
const u8 gText_Cancel6[] = _("CANCEL"); const u8 gText_Cancel6[] = _("CANCEL");
const u8 gText_NumberF700[] = _("No. {DYNAMIC 0}"); const u8 gText_NumberIndex[] = _("No. {DYNAMIC 0}");
const u8 gText_RibbonsF700[] = _("RIBBONS {DYNAMIC 0}"); const u8 gText_RibbonsF700[] = _("RIBBONS {DYNAMIC 0}");
const u8 gText_PokemonMaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused const u8 gText_PokemonMaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused
const u8 gText_PokemonFemaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused const u8 gText_PokemonFemaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused
+92 -98
View File
@@ -57,14 +57,14 @@ struct UsePokeblockSession
u8 mainState; u8 mainState;
u8 unused1; u8 unused1;
u8 timer; u8 timer;
u8 statId; u8 condition;
u8 numEnhancements; u8 numEnhancements;
u8 unused2; u8 unused2;
bool8 monInTopHalf; bool8 monInTopHalf;
u8 conditionsBeforeBlock[FLAVOR_COUNT]; u8 conditionsBeforeBlock[CONDITION_COUNT];
u8 conditionsAfterBlock[FLAVOR_COUNT]; u8 conditionsAfterBlock[CONDITION_COUNT];
u8 enhancements[FLAVOR_COUNT]; u8 enhancements[CONDITION_COUNT];
s16 pokeblockStatBoosts[FLAVOR_COUNT]; s16 pokeblockStatBoosts[CONDITION_COUNT];
u8 numSelections; // num in party + 1 (for Cancel) u8 numSelections; // num in party + 1 (for Cancel)
u8 curSelection; u8 curSelection;
bool8 (*loadNewSelection)(void); bool8 (*loadNewSelection)(void);
@@ -73,7 +73,7 @@ struct UsePokeblockSession
u8 natureText[34]; u8 natureText[34];
}; };
// This struct is identical to PokenavMonList, the struct used for managing lists of pokemon in the pokenav // This struct is identical to PokenavMonListItem, the struct used for managing lists of pokemon in the pokenav
// Given that this screen is essentially duplicated in the poknav, this struct was probably the same one with // Given that this screen is essentially duplicated in the poknav, this struct was probably the same one with
// a more general name/purpose // a more general name/purpose
// TODO: Once the pokenav conditions screens are documented, resolve the above // TODO: Once the pokenav conditions screens are documented, resolve the above
@@ -142,7 +142,7 @@ static void LoadAndCreateUpDownSprites(void);
static void CalculateNumAdditionalSparkles(u8); static void CalculateNumAdditionalSparkles(u8);
static void PrintFirstEnhancement(void); static void PrintFirstEnhancement(void);
static bool8 TryPrintNextEnhancement(void); static bool8 TryPrintNextEnhancement(void);
static void BufferEnhancedStatText(u8 *, u8, s16); static void BufferEnhancedText(u8 *, u8, s16);
static void PrintMenuWindowText(const u8 *); static void PrintMenuWindowText(const u8 *);
static void CalculatePokeblockEffectiveness(struct Pokeblock *, struct Pokemon *); static void CalculatePokeblockEffectiveness(struct Pokeblock *, struct Pokemon *);
static void SpriteCB_UpDown(struct Sprite *); static void SpriteCB_UpDown(struct Sprite *);
@@ -178,22 +178,22 @@ static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_scree
// The condition/flavors aren't listed in their normal order in this file, they're listed as shown on the graph going counter-clockwise // The condition/flavors aren't listed in their normal order in this file, they're listed as shown on the graph going counter-clockwise
// Normally they would go Cool/Spicy, Beauty/Dry, Cute/Sweet, Smart/Bitter, Tough/Sour (also graph order, but clockwise) // Normally they would go Cool/Spicy, Beauty/Dry, Cute/Sweet, Smart/Bitter, Tough/Sour (also graph order, but clockwise)
static const u32 sMonDataConditions[FLAVOR_COUNT] = static const u32 sConditionToMonData[CONDITION_COUNT] =
{ {
MON_DATA_COOL, [CONDITION_COOL] = MON_DATA_COOL,
MON_DATA_TOUGH, [CONDITION_TOUGH] = MON_DATA_TOUGH,
MON_DATA_SMART, [CONDITION_SMART] = MON_DATA_SMART,
MON_DATA_CUTE, [CONDITION_CUTE] = MON_DATA_CUTE,
MON_DATA_BEAUTY [CONDITION_BEAUTY] = MON_DATA_BEAUTY
}; };
static const u8 sFlavors[FLAVOR_COUNT] = static const u8 sConditionToFlavor[CONDITION_COUNT] =
{ {
FLAVOR_SPICY, [CONDITION_COOL] = FLAVOR_SPICY,
FLAVOR_SOUR, [CONDITION_TOUGH] = FLAVOR_SOUR,
FLAVOR_BITTER, [CONDITION_SMART] = FLAVOR_BITTER,
FLAVOR_SWEET, [CONDITION_CUTE] = FLAVOR_SWEET,
FLAVOR_DRY [CONDITION_BEAUTY] = FLAVOR_DRY
}; };
static const u8 sNatureTextColors[] = static const u8 sNatureTextColors[] =
@@ -286,13 +286,13 @@ static const struct WindowTemplate sUsePokeblockYesNoWinTemplate =
.baseBlock = 0x83 .baseBlock = 0x83
}; };
static const u8 *const sContestStatNames[] = static const u8 *const sConditionNames[CONDITION_COUNT] =
{ {
gText_Coolness, [CONDITION_COOL] = gText_Coolness,
gText_Toughness, [CONDITION_TOUGH] = gText_Toughness,
gText_Smartness, [CONDITION_SMART] = gText_Smartness,
gText_Cuteness, [CONDITION_CUTE] = gText_Cuteness,
gText_Beauty3 [CONDITION_BEAUTY] = gText_Beauty3
}; };
static const struct SpriteSheet sSpriteSheet_UpDown = static const struct SpriteSheet sSpriteSheet_UpDown =
@@ -305,13 +305,13 @@ static const struct SpritePalette sSpritePalette_UpDown =
gUsePokeblockUpDown_Pal, TAG_UP_DOWN gUsePokeblockUpDown_Pal, TAG_UP_DOWN
}; };
static const s16 sUpDownCoordsOnGraph[FLAVOR_COUNT][2] = static const s16 sUpDownCoordsOnGraph[CONDITION_COUNT][2] =
{ {
{156, 36}, [CONDITION_COOL] = {156, 36},
{117, 59}, [CONDITION_TOUGH] = {117, 59},
{117, 118}, [CONDITION_SMART] = {117, 118},
{197, 118}, [CONDITION_CUTE] = {197, 118},
{197, 59} [CONDITION_BEAUTY] = {197, 59}
}; };
static const struct OamData sOam_UpDown = static const struct OamData sOam_UpDown =
@@ -471,7 +471,7 @@ static void VBlankCB_UsePokeblockMenu(void)
LoadOam(); LoadOam();
ProcessSpriteCopyRequests(); ProcessSpriteCopyRequests();
TransferPlttBuffer(); TransferPlttBuffer();
sub_81D2108(&sMenu->graph); ConditionGraph_Draw(&sMenu->graph);
ScanlineEffect_InitHBlankDmaTransfer(); ScanlineEffect_InitHBlankDmaTransfer();
} }
@@ -487,7 +487,7 @@ static void LoadUsePokeblockMenu(void)
{ {
case 0: case 0:
sMenu->curMonSpriteId = SPRITE_NONE; sMenu->curMonSpriteId = SPRITE_NONE;
InitConditionGraphData(&sMenu->graph); ConditionGraph_Init(&sMenu->graph);
sInfo->mainState++; sInfo->mainState++;
break; break;
case 1: case 1:
@@ -537,19 +537,19 @@ static void LoadUsePokeblockMenu(void)
sInfo->mainState++; sInfo->mainState++;
break; break;
case 11: case 11:
sub_81D2754(sMenu->graph.stat[0], sMenu->graph.unk14[0]); ConditionGraph_CalcPositions(sMenu->graph.conditions[0], sMenu->graph.savedPositions[0]);
InitConditionGraphState(&sMenu->graph); ConditionGraph_InitResetScanline(&sMenu->graph);
sInfo->mainState++; sInfo->mainState++;
break; break;
case 12: case 12:
if (!SetupConditionGraphScanlineParams(&sMenu->graph)) if (!ConditionGraph_ResetScanline(&sMenu->graph))
{ {
sub_81D1F84(&sMenu->graph, sMenu->graph.unk14[0], sMenu->graph.unk14[0]); ConditionGraph_SetNewPositions(&sMenu->graph, sMenu->graph.savedPositions[0], sMenu->graph.savedPositions[0]);
sInfo->mainState++; sInfo->mainState++;
} }
break; break;
case 13: case 13:
sub_81D2230(&sMenu->graph); ConditionGraph_Update(&sMenu->graph);
sInfo->mainState++; sInfo->mainState++;
break; break;
case 14: case 14:
@@ -767,8 +767,6 @@ static void ShowUsePokeblockMenuForResults(void)
static void ShowPokeblockResults(void) static void ShowPokeblockResults(void)
{ {
u8 var;
switch (sInfo->mainState) switch (sInfo->mainState)
{ {
case 0: case 0:
@@ -783,14 +781,13 @@ static void ShowPokeblockResults(void)
break; break;
case 2: case 2:
CalculateConditionEnhancements(); CalculateConditionEnhancements();
sub_81D2754(sInfo->conditionsAfterBlock, sMenu->graph.unk14[3]); ConditionGraph_CalcPositions(sInfo->conditionsAfterBlock, sMenu->graph.savedPositions[CONDITION_GRAPH_LOAD_MAX - 1]);
sub_81D1F84(&sMenu->graph, sMenu->graph.unk14[sMenu->curLoadId], sMenu->graph.unk14[3]); ConditionGraph_SetNewPositions(&sMenu->graph, sMenu->graph.savedPositions[sMenu->curLoadId], sMenu->graph.savedPositions[CONDITION_GRAPH_LOAD_MAX - 1]);
LoadAndCreateUpDownSprites(); LoadAndCreateUpDownSprites();
sInfo->mainState++; sInfo->mainState++;
break; break;
case 3: case 3:
var = TransitionConditionGraph(&sMenu->graph); if (!ConditionGraph_TryUpdate(&sMenu->graph))
if (!var)
{ {
CalculateNumAdditionalSparkles(GetPartyIdFromSelectionId(sMenu->info.curSelection)); CalculateNumAdditionalSparkles(GetPartyIdFromSelectionId(sMenu->info.curSelection));
if (sMenu->info.curSelection != sMenu->info.numSelections - 1) if (sMenu->info.curSelection != sMenu->info.numSelections - 1)
@@ -906,16 +903,16 @@ static void PrintFirstEnhancement(void)
DrawTextBorderOuter(WIN_TEXT, 151, 14); DrawTextBorderOuter(WIN_TEXT, 151, 14);
FillWindowPixelBuffer(WIN_TEXT, 17); FillWindowPixelBuffer(WIN_TEXT, 17);
for (sInfo->statId = 0; sInfo->statId < FLAVOR_COUNT; sInfo->statId++) for (sInfo->condition = 0; sInfo->condition < CONDITION_COUNT; sInfo->condition++)
{ {
if (sInfo->enhancements[sInfo->statId] != 0) if (sInfo->enhancements[sInfo->condition] != 0)
break; break;
} }
if (sInfo->statId < FLAVOR_COUNT) if (sInfo->condition < CONDITION_COUNT)
BufferEnhancedStatText(gStringVar4, sInfo->statId, sInfo->enhancements[sInfo->statId]); BufferEnhancedText(gStringVar4, sInfo->condition, sInfo->enhancements[sInfo->condition]);
else else
BufferEnhancedStatText(gStringVar4, sInfo->statId, 0); BufferEnhancedText(gStringVar4, sInfo->condition, 0);
PrintMenuWindowText(gStringVar4); PrintMenuWindowText(gStringVar4);
PutWindowTilemap(WIN_TEXT); PutWindowTilemap(WIN_TEXT);
@@ -928,20 +925,20 @@ static bool8 TryPrintNextEnhancement(void)
while (1) while (1)
{ {
sInfo->statId++; sInfo->condition++;
if (sInfo->statId < FLAVOR_COUNT) if (sInfo->condition < CONDITION_COUNT)
{ {
if (sInfo->enhancements[sInfo->statId] != 0) if (sInfo->enhancements[sInfo->condition] != 0)
break; break;
} }
else else
{ {
sInfo->statId = FLAVOR_COUNT; sInfo->condition = CONDITION_COUNT;
return FALSE; return FALSE;
} }
} }
BufferEnhancedStatText(gStringVar4, sInfo->statId, sInfo->enhancements[sInfo->statId]); BufferEnhancedText(gStringVar4, sInfo->condition, sInfo->enhancements[sInfo->condition]);
PrintMenuWindowText(gStringVar4); PrintMenuWindowText(gStringVar4);
CopyWindowToVram(WIN_TEXT, COPYWIN_GFX); CopyWindowToVram(WIN_TEXT, COPYWIN_GFX);
@@ -969,7 +966,7 @@ static void PrintMenuWindowText(const u8 *message)
AddTextPrinterParameterized(WIN_TEXT, FONT_NORMAL, gStringVar4, 0, 1, 0, NULL); AddTextPrinterParameterized(WIN_TEXT, FONT_NORMAL, gStringVar4, 0, 1, 0, NULL);
} }
static void BufferEnhancedStatText(u8 *dest, u8 statId, s16 enhancement) static void BufferEnhancedText(u8 *dest, u8 condition, s16 enhancement)
{ {
switch (enhancement) switch (enhancement)
{ {
@@ -979,7 +976,7 @@ static void BufferEnhancedStatText(u8 *dest, u8 statId, s16 enhancement)
case -32768 ... -1: // if < 0 case -32768 ... -1: // if < 0
if (enhancement) if (enhancement)
dest[(u16)enhancement] += 0; // something you can't imagine dest[(u16)enhancement] += 0; // something you can't imagine
StringCopy(dest, sContestStatNames[statId]); StringCopy(dest, sConditionNames[condition]);
StringAppend(dest, gText_WasEnhanced); StringAppend(dest, gText_WasEnhanced);
break; break;
case 0: case 0:
@@ -992,36 +989,36 @@ static void GetMonConditions(struct Pokemon *mon, u8 *data)
{ {
u16 i; u16 i;
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
data[i] = GetMonData(mon, sMonDataConditions[i]); data[i] = GetMonData(mon, sConditionToMonData[i]);
} }
static void AddPokeblockToConditions(struct Pokeblock *pokeblock, struct Pokemon *mon) static void AddPokeblockToConditions(struct Pokeblock *pokeblock, struct Pokemon *mon)
{ {
u16 i; u16 i;
s16 cstat; s16 stat;
u8 data; u8 data;
if (GetMonData(mon, MON_DATA_SHEEN) != 255) if (GetMonData(mon, MON_DATA_SHEEN) != MAX_SHEEN)
{ {
CalculatePokeblockEffectiveness(pokeblock, mon); CalculatePokeblockEffectiveness(pokeblock, mon);
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
{ {
data = GetMonData(mon, sMonDataConditions[i]); data = GetMonData(mon, sConditionToMonData[i]);
cstat = data + sInfo->pokeblockStatBoosts[i]; stat = data + sInfo->pokeblockStatBoosts[i];
if (cstat < 0) if (stat < 0)
cstat = 0; stat = 0;
if (cstat > 255) if (stat > MAX_CONDITION)
cstat = 255; stat = MAX_CONDITION;
data = cstat; data = stat;
SetMonData(mon, sMonDataConditions[i], &data); SetMonData(mon, sConditionToMonData[i], &data);
} }
cstat = (u8)(GetMonData(mon, MON_DATA_SHEEN)) + pokeblock->feel; stat = (u8)(GetMonData(mon, MON_DATA_SHEEN)) + pokeblock->feel;
if (cstat > 255) if (stat > MAX_SHEEN)
cstat = 255; stat = MAX_SHEEN;
data = cstat; data = stat;
SetMonData(mon, MON_DATA_SHEEN, &data); SetMonData(mon, MON_DATA_SHEEN, &data);
} }
} }
@@ -1035,19 +1032,19 @@ static void CalculateConditionEnhancements(void)
GetMonConditions(mon, sInfo->conditionsBeforeBlock); GetMonConditions(mon, sInfo->conditionsBeforeBlock);
AddPokeblockToConditions(sInfo->pokeblock, mon); AddPokeblockToConditions(sInfo->pokeblock, mon);
GetMonConditions(mon, sInfo->conditionsAfterBlock); GetMonConditions(mon, sInfo->conditionsAfterBlock);
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
sInfo->enhancements[i] = sInfo->conditionsAfterBlock[i] - sInfo->conditionsBeforeBlock[i]; sInfo->enhancements[i] = sInfo->conditionsAfterBlock[i] - sInfo->conditionsBeforeBlock[i];
} }
static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct Pokemon *mon) static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct Pokemon *mon)
{ {
s8 i, direction, taste; s8 i, direction, flavor;
sInfo->pokeblockStatBoosts[0] = pokeblock->spicy; sInfo->pokeblockStatBoosts[CONDITION_COOL] = pokeblock->spicy;
sInfo->pokeblockStatBoosts[1] = pokeblock->sour; sInfo->pokeblockStatBoosts[CONDITION_TOUGH] = pokeblock->sour;
sInfo->pokeblockStatBoosts[2] = pokeblock->bitter; sInfo->pokeblockStatBoosts[CONDITION_SMART] = pokeblock->bitter;
sInfo->pokeblockStatBoosts[3] = pokeblock->sweet; sInfo->pokeblockStatBoosts[CONDITION_CUTE] = pokeblock->sweet;
sInfo->pokeblockStatBoosts[4] = pokeblock->dry; sInfo->pokeblockStatBoosts[CONDITION_BEAUTY] = pokeblock->dry;
if (gPokeblockGain > 0) if (gPokeblockGain > 0)
direction = 1; direction = 1;
@@ -1056,7 +1053,7 @@ static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct
else else
return; return;
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
{ {
s16 amount = sInfo->pokeblockStatBoosts[i]; s16 amount = sInfo->pokeblockStatBoosts[i];
s8 boost = amount / 10; s8 boost = amount / 10;
@@ -1064,9 +1061,9 @@ static void CalculatePokeblockEffectiveness(struct Pokeblock *pokeblock, struct
if (amount % 10 >= 5) // round to the nearest if (amount % 10 >= 5) // round to the nearest
boost++; boost++;
taste = GetMonFlavorRelation(mon, sFlavors[i]); flavor = GetMonFlavorRelation(mon, sConditionToFlavor[i]);
if (taste == direction) if (flavor == direction)
sInfo->pokeblockStatBoosts[i] += boost * taste; sInfo->pokeblockStatBoosts[i] += boost * flavor;
} }
} }
@@ -1075,7 +1072,7 @@ static bool8 IsSheenMaxed(void)
if (GetBoxOrPartyMonData(sMenu->party[sMenu->info.curSelection].boxId, if (GetBoxOrPartyMonData(sMenu->party[sMenu->info.curSelection].boxId,
sMenu->party[sMenu->info.curSelection].monId, sMenu->party[sMenu->info.curSelection].monId,
MON_DATA_SHEEN, MON_DATA_SHEEN,
NULL) == 255) NULL) == MAX_SHEEN)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@@ -1125,7 +1122,7 @@ static void LoadAndCreateUpDownSprites(void)
LoadSpritePalette(&sSpritePalette_UpDown); LoadSpritePalette(&sSpritePalette_UpDown);
sInfo->numEnhancements = 0; sInfo->numEnhancements = 0;
for (i = 0; i < FLAVOR_COUNT; i++) for (i = 0; i < CONDITION_COUNT; i++)
{ {
if (sInfo->enhancements[i] != 0) if (sInfo->enhancements[i] != 0)
{ {
@@ -1368,7 +1365,7 @@ static bool8 LoadUsePokeblockMenuGfx(void)
LoadBgTilemap(2, sMenu->tilemapBuffer, 1280, 0); LoadBgTilemap(2, sMenu->tilemapBuffer, 1280, 0);
LoadPalette(gConditionGraphData_Pal, 48, 32); LoadPalette(gConditionGraphData_Pal, 48, 32);
LoadPalette(gConditionText_Pal, 240, 32); LoadPalette(gConditionText_Pal, 240, 32);
SetConditionGraphIOWindows(2); ConditionGraph_InitWindow(2);
break; break;
default: default:
sMenu->info.helperState = 0; sMenu->info.helperState = 0;
@@ -1419,7 +1416,7 @@ static void UpdateSelection(bool8 up)
else else
newLoadId = sMenu->nextLoadId; newLoadId = sMenu->nextLoadId;
sub_81D1F84(&sMenu->graph, sMenu->graph.unk14[sMenu->curLoadId], sMenu->graph.unk14[newLoadId]); ConditionGraph_SetNewPositions(&sMenu->graph, sMenu->graph.savedPositions[sMenu->curLoadId], sMenu->graph.savedPositions[newLoadId]);
if (sMenu->info.curSelection == sMenu->info.numSelections - 1) if (sMenu->info.curSelection == sMenu->info.numSelections - 1)
startedOnMon = FALSE; // moving off of Cancel startedOnMon = FALSE; // moving off of Cancel
@@ -1487,7 +1484,7 @@ static bool8 LoadNewSelection_CancelToMon(void)
sMenu->info.helperState++; sMenu->info.helperState++;
break; break;
case 2: case 2:
if (!TryUpdateConditionMonTransitionOn(&sMenu->graph, &sMenu->curMonXOffset)) if (!ConditionMenu_UpdateMonEnter(&sMenu->graph, &sMenu->curMonXOffset))
{ {
// Load the new adjacent pokemon (not the one being shown) // Load the new adjacent pokemon (not the one being shown)
LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId); LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId);
@@ -1514,7 +1511,7 @@ static bool8 LoadNewSelection_MonToCancel(void)
switch (sMenu->info.helperState) switch (sMenu->info.helperState)
{ {
case 0: case 0:
if (!TryUpdateConditionMonTransitionOff(&sMenu->graph, &sMenu->curMonXOffset)) if (!ConditionMenu_UpdateMonExit(&sMenu->graph, &sMenu->curMonXOffset))
sMenu->info.helperState++; sMenu->info.helperState++;
break; break;
case 1: case 1:
@@ -1538,7 +1535,7 @@ static bool8 LoadNewSelection_MonToMon(void)
switch (sMenu->info.helperState) switch (sMenu->info.helperState)
{ {
case 0: case 0:
TransitionConditionGraph(&sMenu->graph); ConditionGraph_TryUpdate(&sMenu->graph);
if (!MoveConditionMonOffscreen(&sMenu->curMonXOffset)) if (!MoveConditionMonOffscreen(&sMenu->curMonXOffset))
{ {
UpdateMonPic(sMenu->curLoadId); UpdateMonPic(sMenu->curLoadId);
@@ -1550,7 +1547,7 @@ static bool8 LoadNewSelection_MonToMon(void)
sMenu->info.helperState++; sMenu->info.helperState++;
break; break;
case 2: case 2:
if (!TryUpdateConditionMonTransitionOn(&sMenu->graph, &sMenu->curMonXOffset)) if (!ConditionMenu_UpdateMonEnter(&sMenu->graph, &sMenu->curMonXOffset))
{ {
// Load the new adjacent pokemon (not the one being shown) // Load the new adjacent pokemon (not the one being shown)
LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId); LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId);
@@ -1580,9 +1577,9 @@ static void SpriteCB_MonPic(struct Sprite *sprite)
static void SpriteCB_SelectionIconPokeball(struct Sprite *sprite) static void SpriteCB_SelectionIconPokeball(struct Sprite *sprite)
{ {
if (sprite->data[0] == sMenu->info.curSelection) if (sprite->data[0] == sMenu->info.curSelection)
StartSpriteAnim(sprite, 0); StartSpriteAnim(sprite, CONDITION_ICON_SELECTED);
else else
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, CONDITION_ICON_UNSELECTED);
} }
static void SpriteCB_SelectionIconCancel(struct Sprite *sprite) static void SpriteCB_SelectionIconCancel(struct Sprite *sprite)
@@ -1599,10 +1596,7 @@ static void SpriteCB_SelectionIconCancel(struct Sprite *sprite)
static void CalculateNumAdditionalSparkles(u8 monIndex) static void CalculateNumAdditionalSparkles(u8 monIndex)
{ {
u8 sheen = GetMonData(&gPlayerParty[monIndex], MON_DATA_SHEEN); u8 sheen = GetMonData(&gPlayerParty[monIndex], MON_DATA_SHEEN);
sMenu->numSparkles[sMenu->curLoadId] = GET_NUM_CONDITION_SPARKLES(sheen);
sMenu->numSparkles[sMenu->curLoadId] = (sheen != 255)
? sheen / (255 / (MAX_CONDITION_SPARKLES - 1) + 1)
: MAX_CONDITION_SPARKLES - 1;
} }
static void LoadConditionGfx(void) static void LoadConditionGfx(void)
+2 -2
View File
@@ -50,8 +50,8 @@
.include "src/multiboot.o" .include "src/multiboot.o"
.include "src/mirage_tower.o" .include "src/mirage_tower.o"
.include "src/berry_fix_program.o" .include "src/berry_fix_program.o"
.include "src/pokenav_conditions_2.o" .include "src/pokenav_conditions_gfx.o"
.include "src/pokenav_ribbons_2.o" .include "src/pokenav_ribbons_summary.o"
.include "src/ereader_helpers.o" .include "src/ereader_helpers.o"
.include "src/faraway_island.o" .include "src/faraway_island.o"
.include "src/m4a_1.o" .include "src/m4a_1.o"
+1 -1
View File
@@ -143,7 +143,7 @@
.include "src/pokedex_area_region_map.o" .include "src/pokedex_area_region_map.o"
.include "src/battle_pyramid_bag.o" .include "src/battle_pyramid_bag.o"
.include "src/pokenav.o" .include "src/pokenav.o"
.include "src/pokenav_match_call_ui.o" .include "src/pokenav_list.o"
.include "src/menu_specialized.o" .include "src/menu_specialized.o"
.include "src/faraway_island.o" .include "src/faraway_island.o"
.include "src/trainer_hill.o" .include "src/trainer_hill.o"