Merge branch 'master' of https://github.com/pret/pokeemerald into fr_doc

This commit is contained in:
Kurausukun 2021-03-29 18:36:18 -04:00
commit 102582a3df
70 changed files with 2615 additions and 2356 deletions

View File

@ -941,7 +941,7 @@
.byte 0xb5
.endm
.macro happinesstodamagecalculation
.macro friendshiptodamagecalculation
.byte 0xb6
.endm

View File

@ -1,4 +1,4 @@
gFonts
gUnknown_03002F84
gUnknown_03002F90
gDisableTextPrinters
gCurGlyph
gTextFlags

View File

@ -1678,7 +1678,7 @@ BattleScript_EffectReturn::
BattleScript_EffectFrustration::
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
happinesstodamagecalculation
friendshiptodamagecalculation
goto BattleScript_HitFromAtkString
BattleScript_EffectPresent::

View File

@ -1329,12 +1329,7 @@ void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnim
s16 ConvertScaleParam(s16 scale)
{
s32 val = 0x10000;
// UB: possible division by zero
#ifdef UBFIX
if (scale == 0)
return 0;
#endif //UBFIX
return val / scale;
return SAFE_DIV(val, scale);
}
void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd)

View File

@ -21,8 +21,8 @@ static u16 gLastTextFgColor;
static u16 gLastTextShadowColor;
const struct FontInfo *gFonts;
u8 gUnknown_03002F84;
struct Struct_03002F90 gUnknown_03002F90;
u8 gDisableTextPrinters;
struct TextGlyph gCurGlyph;
TextFlags gTextFlags;
const u8 gFontHalfRowOffsets[] =
@ -204,7 +204,7 @@ bool16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u8 speed, voi
CopyWindowToVram(gTempTextPrinter.printerTemplate.windowId, 2);
gTextPrinters[printerTemplate->windowId].active = 0;
}
gUnknown_03002F84 = 0;
gDisableTextPrinters = 0;
return TRUE;
}
@ -212,7 +212,7 @@ void RunTextPrinters(void)
{
int i;
if (gUnknown_03002F84 == 0)
if (gDisableTextPrinters == 0)
{
for (i = 0; i < NUM_TEXT_PRINTERS; ++i)
{
@ -461,9 +461,9 @@ u8 GetLastTextColor(u8 colorType)
}
}
inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 j, u32 i, u32 *ptr, s32 width, s32 height)
inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 j, u32 i, u32 *glyphPixels, s32 width, s32 height)
{
u32 xAdd, yAdd, r5, bits, toOrr, dummyX;
u32 xAdd, yAdd, pixelData, bits, toOrr, dummyX;
u8 *dst;
xAdd = j + width;
@ -471,69 +471,69 @@ inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 j, u32 i, u3
dummyX = j;
for (; i < yAdd; i++)
{
r5 = *ptr++;
pixelData = *glyphPixels++;
for (j = dummyX; j < xAdd; j++)
{
if ((toOrr = r5 & 0xF))
if ((toOrr = pixelData & 0xF))
{
dst = windowTiles + ((j / 8) * 32) + ((j % 8) / 2) + ((i / 8) * widthOffset) + ((i % 8) * 4);
bits = ((j & 1) * 4);
*dst = (toOrr << bits) | (*dst & (0xF0 >> bits));
}
r5 >>= 4;
pixelData >>= 4;
}
}
}
void CopyGlyphToWindow(struct TextPrinter *textPrinter)
{
struct Window *win;
struct WindowTemplate *winTempl;
u32 *unkStruct;
struct Window *window;
struct WindowTemplate *template;
u32 *glyphPixels;
u32 currX, currY, widthOffset;
s32 r4, r0;
s32 glyphWidth, glyphHeight;
u8 *windowTiles;
win = &gWindows[textPrinter->printerTemplate.windowId];
winTempl = &win->window;
window = &gWindows[textPrinter->printerTemplate.windowId];
template = &window->window;
if ((r4 = (winTempl->width * 8) - textPrinter->printerTemplate.currentX) > gUnknown_03002F90.width)
r4 = gUnknown_03002F90.width;
if ((glyphWidth = (template->width * 8) - textPrinter->printerTemplate.currentX) > gCurGlyph.width)
glyphWidth = gCurGlyph.width;
if ((r0 = (winTempl->height * 8) - textPrinter->printerTemplate.currentY) > gUnknown_03002F90.height)
r0 = gUnknown_03002F90.height;
if ((glyphHeight = (template->height * 8) - textPrinter->printerTemplate.currentY) > gCurGlyph.height)
glyphHeight = gCurGlyph.height;
currX = textPrinter->printerTemplate.currentX;
currY = textPrinter->printerTemplate.currentY;
unkStruct = (u32 *)&gUnknown_03002F90.unk0;
windowTiles = win->tileData;
widthOffset = winTempl->width * 32;
glyphPixels = gCurGlyph.gfxBufferTop;
windowTiles = window->tileData;
widthOffset = template->width * 32;
if (r4 < 9)
if (glyphWidth < 9)
{
if (r0 < 9)
if (glyphHeight < 9)
{
GLYPH_COPY(windowTiles, widthOffset, currX, currY, unkStruct, r4, r0);
GLYPH_COPY(windowTiles, widthOffset, currX, currY, glyphPixels, glyphWidth, glyphHeight);
}
else
{
GLYPH_COPY(windowTiles, widthOffset, currX, currY, unkStruct, r4, 8);
GLYPH_COPY(windowTiles, widthOffset, currX, currY + 8, unkStruct + 16, r4, r0 - 8);
GLYPH_COPY(windowTiles, widthOffset, currX, currY, glyphPixels, glyphWidth, 8);
GLYPH_COPY(windowTiles, widthOffset, currX, currY + 8, glyphPixels + 16, glyphWidth, glyphHeight - 8);
}
}
else
{
if (r0 < 9)
if (glyphHeight < 9)
{
GLYPH_COPY(windowTiles, widthOffset, currX, currY, unkStruct, 8, r0);
GLYPH_COPY(windowTiles, widthOffset, currX + 8, currY, unkStruct + 8, r4 - 8, r0);
GLYPH_COPY(windowTiles, widthOffset, currX, currY, glyphPixels, 8, glyphHeight);
GLYPH_COPY(windowTiles, widthOffset, currX + 8, currY, glyphPixels + 8, glyphWidth - 8, glyphHeight);
}
else
{
GLYPH_COPY(windowTiles, widthOffset, currX, currY, unkStruct, 8, 8);
GLYPH_COPY(windowTiles, widthOffset, currX + 8, currY, unkStruct + 8, r4 - 8, 8);
GLYPH_COPY(windowTiles, widthOffset, currX, currY + 8, unkStruct + 16, 8, r0 - 8);
GLYPH_COPY(windowTiles, widthOffset, currX + 8, currY + 8, unkStruct + 24, r4 - 8, r0 - 8);
GLYPH_COPY(windowTiles, widthOffset, currX, currY, glyphPixels, 8, 8);
GLYPH_COPY(windowTiles, widthOffset, currX + 8, currY, glyphPixels + 8, glyphWidth - 8, 8);
GLYPH_COPY(windowTiles, widthOffset, currX, currY + 8, glyphPixels + 16, 8, glyphHeight - 8);
GLYPH_COPY(windowTiles, widthOffset, currX + 8, currY + 8, glyphPixels + 24, glyphWidth - 8, glyphHeight - 8);
}
}
}
@ -542,7 +542,7 @@ void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
{
struct Window *window;
struct Bitmap pixels_data;
struct Struct_03002F90 *gUnk;
struct TextGlyph *glyph;
u8* glyphHeight;
if (gLastTextBgColor != 0)
@ -552,8 +552,8 @@ void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
pixels_data.width = window->window.width << 3;
pixels_data.height = window->window.height << 3;
gUnk = &gUnknown_03002F90;
glyphHeight = &gUnk->height;
glyph = &gCurGlyph;
glyphHeight = &glyph->height;
FillBitmapRect4Bit(
&pixels_data,
@ -1015,8 +1015,8 @@ u16 RenderText(struct TextPrinter *textPrinter)
break;
case CHAR_KEYPAD_ICON:
currChar = *textPrinter->printerTemplate.currentChar++;
gUnknown_03002F90.width = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY);
textPrinter->printerTemplate.currentX += gUnknown_03002F90.width + textPrinter->printerTemplate.letterSpacing;
gCurGlyph.width = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY);
textPrinter->printerTemplate.currentX += gCurGlyph.width + textPrinter->printerTemplate.letterSpacing;
return 0;
case EOS:
return 1;
@ -1050,8 +1050,8 @@ u16 RenderText(struct TextPrinter *textPrinter)
if (textPrinter->minLetterSpacing)
{
textPrinter->printerTemplate.currentX += gUnknown_03002F90.width;
width = textPrinter->minLetterSpacing - gUnknown_03002F90.width;
textPrinter->printerTemplate.currentX += gCurGlyph.width;
width = textPrinter->minLetterSpacing - gCurGlyph.width;
if (width > 0)
{
ClearTextSpan(textPrinter, width);
@ -1061,9 +1061,9 @@ u16 RenderText(struct TextPrinter *textPrinter)
else
{
if (textPrinter->japanese)
textPrinter->printerTemplate.currentX += (gUnknown_03002F90.width + textPrinter->printerTemplate.letterSpacing);
textPrinter->printerTemplate.currentX += (gCurGlyph.width + textPrinter->printerTemplate.letterSpacing);
else
textPrinter->printerTemplate.currentX += gUnknown_03002F90.width;
textPrinter->printerTemplate.currentX += gCurGlyph.width;
}
return 0;
case 1:
@ -1498,8 +1498,8 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
DecompressGlyphFont1(temp, 1);
break;
}
CpuCopy32(gUnknown_03002F90.unk0, pixels, 0x20);
CpuCopy32(gUnknown_03002F90.unk40, pixels + 0x20, 0x20);
CpuCopy32(gCurGlyph.gfxBufferTop, pixels, 0x20);
CpuCopy32(gCurGlyph.gfxBufferBottom, pixels + 0x20, 0x20);
pixels += 0x40;
break;
}
@ -1591,30 +1591,30 @@ void DecompressGlyphFont0(u16 glyphId, bool32 isJapanese)
if (isJapanese == 1)
{
glyphs = gFont0JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF));
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x80, gUnknown_03002F90.unk40); // gUnknown_03002F90 + 0x40
gUnknown_03002F90.width = 8; // gGlyphWidth
gUnknown_03002F90.height = 12; // gGlyphHeight
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
gCurGlyph.height = 12;
}
else
{
glyphs = gFont0LatinGlyphs + (0x20 * glyphId);
gUnknown_03002F90.width = gFont0LatinGlyphWidths[glyphId];
gCurGlyph.width = gFont0LatinGlyphWidths[glyphId];
if (gUnknown_03002F90.width <= 8)
if (gCurGlyph.width <= 8)
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
}
else
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, gUnknown_03002F90.unk20);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs + 0x18, gUnknown_03002F90.unk60);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
DecompressGlyphTile(glyphs + 0x18, gCurGlyph.gfxBufferBottom + 8);
}
gUnknown_03002F90.height = 13;
gCurGlyph.height = 13;
}
}
@ -1634,30 +1634,30 @@ void DecompressGlyphFont7(u16 glyphId, bool32 isJapanese)
{
int eff;
glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x80, gUnknown_03002F90.unk40); // gUnknown_03002F90 + 0x40
gUnknown_03002F90.width = 8; // gGlyphWidth
gUnknown_03002F90.height = 15; // gGlyphHeight
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
gCurGlyph.height = 15;
}
else
{
glyphs = gFont7LatinGlyphs + (0x20 * glyphId);
gUnknown_03002F90.width = gFont7LatinGlyphWidths[glyphId];
gCurGlyph.width = gFont7LatinGlyphWidths[glyphId];
if (gUnknown_03002F90.width <= 8)
if (gCurGlyph.width <= 8)
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
}
else
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, gUnknown_03002F90.unk20);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs + 0x18, gUnknown_03002F90.unk60);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
DecompressGlyphTile(glyphs + 0x18, gCurGlyph.gfxBufferBottom + 8);
}
gUnknown_03002F90.height = 15;
gCurGlyph.height = 15;
}
}
@ -1676,30 +1676,30 @@ void DecompressGlyphFont8(u16 glyphId, bool32 isJapanese)
if (isJapanese == TRUE)
{
glyphs = gFont0JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF));
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x80, gUnknown_03002F90.unk40); // gUnknown_03002F90 + 0x40
gUnknown_03002F90.width = 8; // gGlyphWidth
gUnknown_03002F90.height = 12; // gGlyphHeight
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
gCurGlyph.height = 12;
}
else
{
glyphs = gFont8LatinGlyphs + (0x20 * glyphId);
gUnknown_03002F90.width = gFont8LatinGlyphWidths[glyphId];
gCurGlyph.width = gFont8LatinGlyphWidths[glyphId];
if (gUnknown_03002F90.width <= 8)
if (gCurGlyph.width <= 8)
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
}
else
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, gUnknown_03002F90.unk20);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs + 0x18, gUnknown_03002F90.unk60);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
DecompressGlyphTile(glyphs + 0x18, gCurGlyph.gfxBufferBottom + 8);
}
gUnknown_03002F90.height = 12;
gCurGlyph.height = 12;
}
}
@ -1718,32 +1718,32 @@ void DecompressGlyphFont2(u16 glyphId, bool32 isJapanese)
if (isJapanese == TRUE)
{
glyphs = gFont2JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, gUnknown_03002F90.unk20); // gUnknown_03002F90 + 0x40
DecompressGlyphTile(glyphs + 0x80, gUnknown_03002F90.unk40); // gUnknown_03002F90 + 0x20
DecompressGlyphTile(glyphs + 0x88, gUnknown_03002F90.unk60); // gUnknown_03002F90 + 0x60
gUnknown_03002F90.width = gFont2JapaneseGlyphWidths[glyphId]; // gGlyphWidth
gUnknown_03002F90.height = 14; // gGlyphHeight
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom); // gCurGlyph + 0x20
DecompressGlyphTile(glyphs + 0x88, gCurGlyph.gfxBufferBottom + 8); // gCurGlyph + 0x60
gCurGlyph.width = gFont2JapaneseGlyphWidths[glyphId];
gCurGlyph.height = 14;
}
else
{
glyphs = gFont2LatinGlyphs + (0x20 * glyphId);
gUnknown_03002F90.width = gFont2LatinGlyphWidths[glyphId];
gCurGlyph.width = gFont2LatinGlyphWidths[glyphId];
if (gUnknown_03002F90.width <= 8)
if (gCurGlyph.width <= 8)
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
}
else
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, gUnknown_03002F90.unk20);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs + 0x18, gUnknown_03002F90.unk60);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
DecompressGlyphTile(glyphs + 0x18, gCurGlyph.gfxBufferBottom + 8);
}
gUnknown_03002F90.height = 14;
gCurGlyph.height = 14;
}
}
@ -1763,30 +1763,30 @@ void DecompressGlyphFont1(u16 glyphId, bool32 isJapanese)
{
int eff;
glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x80, gUnknown_03002F90.unk40); // gUnknown_03002F90 + 0x40
gUnknown_03002F90.width = 8; // gGlyphWidth
gUnknown_03002F90.height = 15; // gGlyphHeight
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
gCurGlyph.height = 15;
}
else
{
glyphs = gFont1LatinGlyphs + (0x20 * glyphId);
gUnknown_03002F90.width = gFont1LatinGlyphWidths[glyphId];
gCurGlyph.width = gFont1LatinGlyphWidths[glyphId];
if (gUnknown_03002F90.width <= 8)
if (gCurGlyph.width <= 8)
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
}
else
{
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, gUnknown_03002F90.unk20);
DecompressGlyphTile(glyphs + 0x10, gUnknown_03002F90.unk40);
DecompressGlyphTile(glyphs + 0x18, gUnknown_03002F90.unk60);
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x10, gCurGlyph.gfxBufferBottom);
DecompressGlyphTile(glyphs + 0x18, gCurGlyph.gfxBufferBottom + 8);
}
gUnknown_03002F90.height = 15;
gCurGlyph.height = 15;
}
}
@ -1803,8 +1803,8 @@ void DecompressGlyphFont9(u16 glyphId)
const u16* glyphs;
glyphs = gFont9JapaneseGlyphs + (0x100 * (glyphId >> 4)) + (0x8 * (glyphId & 0xF));
DecompressGlyphTile(glyphs, gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x80, gUnknown_03002F90.unk40);
gUnknown_03002F90.width = 8;
gUnknown_03002F90.height = 12;
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
gCurGlyph.height = 12;
}

View File

@ -360,20 +360,18 @@ typedef struct {
bool8 forceMidTextSpeed:1;
} TextFlags;
struct Struct_03002F90
struct TextGlyph
{
u32 unk0[8];
u32 unk20[8];
u32 unk40[8];
u32 unk60[8];
u32 gfxBufferTop[16];
u32 gfxBufferBottom[16];
u8 width;
u8 height;
};
extern TextFlags gTextFlags;
extern u8 gUnknown_03002F84;
extern struct Struct_03002F90 gUnknown_03002F90;
extern u8 gDisableTextPrinters;
extern struct TextGlyph gCurGlyph;
void SetFontsPointer(const struct FontInfo *fonts);
void DeactivateAllTextPrinters(void);

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 626 B

After

Width:  |  Height:  |  Size: 626 B

View File

Before

Width:  |  Height:  |  Size: 642 B

After

Width:  |  Height:  |  Size: 642 B

View File

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 329 B

View File

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 282 B

View File

Before

Width:  |  Height:  |  Size: 815 B

After

Width:  |  Height:  |  Size: 815 B

View File

Before

Width:  |  Height:  |  Size: 778 B

After

Width:  |  Height:  |  Size: 778 B

View File

@ -28,11 +28,11 @@ void SetBerryTreesSeen(void);
extern const struct Berry gBerries[];
struct UnkStruct_0858AB24 {
u8 unk0;
u16 unk1;
struct BerryCrushBerryData {
u8 difficulty; // The number of A presses required to crush it
u16 powder;
};
extern const struct UnkStruct_0858AB24 gUnknown_0858AB24[];
extern const struct BerryCrushBerryData gBerryCrush_BerryData[];
#endif // GUARD_BERRY_H

View File

@ -3,6 +3,6 @@
#include "main.h"
void StartBerryCrush(MainCallback callback);
void StartBerryCrush(MainCallback exitCallback);
#endif // GUARD_BERRY_CRUSH_H

View File

@ -42,8 +42,8 @@
#define BATTLE_PIKE_FUNC_SET_IN_WILD_MON_ROOM 6
#define BATTLE_PIKE_FUNC_CLEAR_IN_WILD_MON_ROOM 7
#define BATTLE_PIKE_FUNC_SAVE 8
#define BATTLE_PIKE_FUNC_NULL_9 9
#define BATTLE_PIKE_FUNC_NULL_10 10
#define BATTLE_PIKE_FUNC_DUMMY_1 9
#define BATTLE_PIKE_FUNC_DUMMY_2 10
#define BATTLE_PIKE_FUNC_GET_ROOM_STATUS 11
#define BATTLE_PIKE_FUNC_GET_ROOM_STATUS_MON 12
#define BATTLE_PIKE_FUNC_HEAL_ONE_TWO_MONS 13

View File

@ -52,7 +52,7 @@
#define GAME_STAT_RODE_CABLE_CAR 48
#define GAME_STAT_ENTERED_HOT_SPRINGS 49
#define GAME_STAT_NUM_UNION_ROOM_BATTLES 50
#define GAME_STAT_51 51
#define GAME_STAT_PLAYED_BERRY_CRUSH 51
#define NUM_USED_GAME_STATS 52
#define NUM_GAME_STATS 64

View File

@ -28,7 +28,7 @@
#define HOLD_EFFECT_MACHO_BRACE 24
#define HOLD_EFFECT_EXP_SHARE 25
#define HOLD_EFFECT_QUICK_CLAW 26
#define HOLD_EFFECT_HAPPINESS_UP 27
#define HOLD_EFFECT_FRIENDSHIP_UP 27
#define HOLD_EFFECT_CURE_ATTRACT 28
#define HOLD_EFFECT_CHOICE_BAND 29
#define HOLD_EFFECT_FLINCH 30

View File

@ -56,7 +56,7 @@
#define VAR_CYCLING_ROAD_RECORD_COLLISIONS 0x4027
#define VAR_CYCLING_ROAD_RECORD_TIME_L 0x4028
#define VAR_CYCLING_ROAD_RECORD_TIME_H 0x4029
#define VAR_HAPPINESS_STEP_COUNTER 0x402A
#define VAR_FRIENDSHIP_STEP_COUNTER 0x402A
#define VAR_POISON_STEP_COUNTER 0x402B
#define VAR_RESET_RTC_ENABLE 0x402C
#define VAR_ENIGMA_BERRY_AVAILABLE 0x402D

View File

@ -74,6 +74,14 @@
#define abs(x) (((x) < 0) ? -(x) : (x))
#endif
// Used in cases where division by 0 can occur in the retail version.
// Avoids invalid opcodes on some emulators, and the otherwise UB.
#ifdef UBFIX
#define SAFE_DIV(a, b) ((b) ? (a) / (b) : 0)
#else
#define SAFE_DIV(a, b) ((a) / (b))
#endif
// Extracts the upper 16 bits of a 32-bit number
#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
@ -209,7 +217,7 @@ struct PyramidBag
struct BerryCrush
{
u16 berryCrushResults[4];
u16 pressingSpeeds[4]; // For the record with each possible group size, 2-5 players
u32 berryPowderAmount;
u32 unk;
};

View File

@ -5001,9 +5001,9 @@ extern const u16 gUsePokeblockUpDown_Pal[];
extern const u16 gUsePokeblockCondition_Pal[];
// Berry Crush
extern const u32 gUnknown_08DE34B8[];
extern const u16 gUnknown_08DE3398[];
extern const u32 gUnknown_08DE3FD4[];
extern const u32 gBerryCrush_Crusher_Gfx[];
extern const u16 gBerryCrush_Crusher_Pal[];
extern const u32 gBerryCrush_Crusher_Tilemap[];
// Pokenav
extern const u32 gPokenavMessageBox_Gfx[];

View File

@ -56,17 +56,17 @@
#define LINKCMD_BLENDER_SEND_KEYS 0x4444
#define LINKCMD_BLENDER_SCORE_BEST 0x4523
#define LINKCMD_BLENDER_SCORE_GOOD 0x5432
#define LINKCMD_0x5555 0x5555
#define LINKCMD_0x5566 0x5566
#define LINKCMD_DUMMY_1 0x5555
#define LINKCMD_DUMMY_2 0x5566
#define LINKCMD_READY_CLOSE_LINK 0x5FFF
#define LINKCMD_0x6666 0x6666
#define LINKCMD_0x7777 0x7777
#define LINKCMD_SEND_EMPTY 0x6666
#define LINKCMD_SEND_0xEE 0x7777
#define LINKCMD_BLENDER_PLAY_AGAIN 0x7779
#define LINKCMD_COUNTDOWN 0x7FFF
#define LINKCMD_CONT_BLOCK 0x8888
#define LINKCMD_BLENDER_NO_BERRIES 0x9999
#define LINKCMD_BLENDER_NO_PBLOCK_SPACE 0xAAAA
#define LINKCMD_0xAAAB 0xAAAB
#define LINKCMD_SEND_ITEM 0xAAAB
#define LINKCMD_READY_TO_TRADE 0xAABB
#define LINKCMD_READY_FINISH_TRADE 0xABCD
#define LINKCMD_INIT_BLOCK 0xBBBB
@ -76,17 +76,18 @@
#define LINKCMD_START_TRADE 0xCCDD
#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA
#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD
#define LINKCMD_0xDDEE 0xDDEE
#define LINKCMD_PLAYER_CANCEL_TRADE 0xDDEE
#define LINKCMD_REQUEST_CANCEL 0xEEAA
#define LINKCMD_CANCEL_TRADE 0xEEBB
#define LINKCMD_0xEECC 0xEECC
#define LINKCMD_BOTH_CANCEL_TRADE 0xEEBB
#define LINKCMD_PARTNER_CANCEL_TRADE 0xEECC
#define LINKCMD_NONE 0xEFFF
#define LINKTYPE_TRADE 0x1111
#define LINKTYPE_TRADE_CONNECTING 0x1122
#define LINKTYPE_TRADE_SETUP 0x1133
#define LINKTYPE_TRADE_DISCONNECTED 0x1144
#define LINKTYPE_BATTLE 0x2211
#define LINKTYPE_0x2222 0x2222 // unused battle?
#define LINKTYPE_UNUSED_BATTLE 0x2222 // Unused, inferred from gap
#define LINKTYPE_SINGLE_BATTLE 0x2233
#define LINKTYPE_DOUBLE_BATTLE 0x2244
#define LINKTYPE_MULTI_BATTLE 0x2255
@ -98,7 +99,7 @@
#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411
#define LINKTYPE_BERRY_BLENDER 0x4422
#define LINKTYPE_MYSTERY_EVENT 0x5501
#define LINKTYPE_0x5502 0x5502 // unused?
#define LINKTYPE_UNUSED_EREADER 0x5502 // Unused, inferred from gap
#define LINKTYPE_EREADER 0x5503
#define LINKTYPE_CONTEST_GMODE 0x6601
#define LINKTYPE_CONTEST_EMODE 0x6602
@ -290,17 +291,17 @@ bool8 HandleLinkConnection(void);
void SetLinkDebugValues(u32 seed, u32 flags);
void SetBerryBlenderLinkCallback(void);
void SetSuppressLinkErrorMessage(bool8 flag);
void sub_800B524(struct LinkPlayer *linkPlayer);
void ConvertLinkPlayerName(struct LinkPlayer *linkPlayer);
u8 GetSioMultiSI(void);
void ClearSavedLinkPlayers(void);
void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06);
void sub_800B348(void);
void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 disconnected);
void LocalLinkPlayerToBlock(void);
void LinkPlayerFromBlock(u32 who);
bool32 Link_AnyPartnersPlayingFRLG_JP(void);
void ResetLinkPlayerCount(void);
void SaveLinkPlayers(u8 a0);
void SetWirelessCommType0(void);
bool32 sub_800B504(void);
bool32 IsLinkRecvQueueLengthAtLeast3(void);
extern u16 gLinkPartnersHeldKeys[6];
extern u32 gLinkDebugSeed;

View File

@ -2904,7 +2904,7 @@ extern const u8 gText_CrushingResults[];
extern const u8 gText_BerryCrush2[];
extern const u8 gText_PressingSpeedRankings[];
extern const u8 gText_Var1Players[];
extern const u8 gText_ReadyToBerryCrush[];
extern const u8 gText_ReadyPickBerry[];
extern const u8 gText_WaitForAllChooseBerry[];
extern const u8 gText_EndedWithXUnitsPowder[];
extern const u8 gText_RecordingGameResults[];

View File

@ -66,7 +66,6 @@ void InitTrainerHillBattleStruct(void);
void FreeTrainerHillBattleStruct(void);
void CopyTrainerHillTrainerText(u8 which, u16 trainerId);
bool8 InTrainerHillChallenge(void);
void nullsub_129(void);
void PrintOnTrainerHillRecordsWindow(void);
void LoadTrainerHillObjectEventTemplates(void);
bool32 LoadTrainerHillFloorObjectEventScripts(void);

View File

@ -1815,7 +1815,7 @@ void SetBattlerSpriteYOffsetFromYScale(u8 spriteId)
{
int var = 64 - GetBattlerYDeltaFromSpriteId(spriteId) * 2;
u16 matrix = gSprites[spriteId].oam.matrixNum;
int var2 = (var << 8) / gOamMatrices[matrix].d;
int var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d);
if (var2 > 128)
var2 = 128;
@ -1828,7 +1828,7 @@ void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId)
{
int var = 64 - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2;
u16 matrix = gSprites[spriteId].oam.matrixNum;
int var2 = (var << 8) / gOamMatrices[matrix].d;
int var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d);
if (var2 > 128)
var2 = 128;

View File

@ -774,7 +774,8 @@ void BattleArena_DeductMindPoints(u8 battler, u16 stringId)
}
}
void sub_81A586C(u8 battler) // Unused.
// Unused
static void UpdateHPAtStart(u8 battler)
{
u16 *hpAtStart = gBattleStruct->arenaStartHp;

View File

@ -529,7 +529,7 @@ static const union AnimCmd * const sAnims_Select_Pokeball[] =
sAnim_Select_Pokeball_Moving,
};
static const union AffineAnimCmd gUnknown_0861050C[] =
static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Opening[] =
{
AFFINEANIMCMD_FRAME(5, 5, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
@ -545,7 +545,7 @@ static const union AffineAnimCmd gUnknown_0861050C[] =
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd gUnknown_0861056C[] =
static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Closing[] =
{
AFFINEANIMCMD_FRAME(128, 5, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
@ -559,7 +559,7 @@ static const union AffineAnimCmd gUnknown_0861056C[] =
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd gUnknown_086105BC[] =
static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Open[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END,
@ -567,9 +567,9 @@ static const union AffineAnimCmd gUnknown_086105BC[] =
static const union AffineAnimCmd * const sAffineAnims_Select_MonPicBgAnim[] =
{
gUnknown_0861050C,
gUnknown_0861056C,
gUnknown_086105BC,
sAffineAnim_Select_MonPicBg_Opening,
sAffineAnim_Select_MonPicBg_Closing,
sAffineAnim_Select_MonPicBg_Open,
};
static const struct SpriteTemplate sSpriteTemplate_Select_Pokeball =
@ -780,7 +780,7 @@ static const union AnimCmd * const sAnims_Swap_Pokeball[] =
sAnim_Swap_Pokeball_Moving,
};
static const union AffineAnimCmd gUnknown_08610768[] =
static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Opening[] =
{
AFFINEANIMCMD_FRAME(5, 5, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
@ -796,7 +796,7 @@ static const union AffineAnimCmd gUnknown_08610768[] =
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd gUnknown_086107C8[] =
static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Closing[] =
{
AFFINEANIMCMD_FRAME(128, 5, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
@ -810,7 +810,7 @@ static const union AffineAnimCmd gUnknown_086107C8[] =
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd gUnknown_08610818[] =
static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Open[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END,
@ -818,9 +818,9 @@ static const union AffineAnimCmd gUnknown_08610818[] =
static const union AffineAnimCmd * const sAffineAnims_Swap_MonPicBgAnim[] =
{
gUnknown_08610768,
gUnknown_086107C8,
gUnknown_08610818,
sAffineAnim_Swap_MonPicBg_Opening,
sAffineAnim_Swap_MonPicBg_Closing,
sAffineAnim_Swap_MonPicBg_Open,
};
static const struct SpriteTemplate sSpriteTemplate_Swap_Pokeball =

View File

@ -57,8 +57,8 @@ static void GetRoomType(void);
static void SetInWildMonRoom(void);
static void ClearInWildMonRoom(void);
static void SavePikeChallenge(void);
static void nullsub_76(void);
static void nullsub_124(void);
static void PikeDummy1(void);
static void PikeDummy2(void);
static void GetRoomInflictedStatus(void);
static void GetRoomInflictedStatusMon(void);
static void HealOneOrTwoMons(void);
@ -488,8 +488,8 @@ static void (* const sBattlePikeFunctions[])(void) =
[BATTLE_PIKE_FUNC_SET_IN_WILD_MON_ROOM] = SetInWildMonRoom,
[BATTLE_PIKE_FUNC_CLEAR_IN_WILD_MON_ROOM] = ClearInWildMonRoom,
[BATTLE_PIKE_FUNC_SAVE] = SavePikeChallenge,
[BATTLE_PIKE_FUNC_NULL_9] = nullsub_76,
[BATTLE_PIKE_FUNC_NULL_10] = nullsub_124,
[BATTLE_PIKE_FUNC_DUMMY_1] = PikeDummy1,
[BATTLE_PIKE_FUNC_DUMMY_2] = PikeDummy2,
[BATTLE_PIKE_FUNC_GET_ROOM_STATUS] = GetRoomInflictedStatus,
[BATTLE_PIKE_FUNC_GET_ROOM_STATUS_MON] = GetRoomInflictedStatusMon,
[BATTLE_PIKE_FUNC_HEAL_ONE_TWO_MONS] = HealOneOrTwoMons,
@ -715,12 +715,12 @@ static void SavePikeChallenge(void)
TrySavingData(SAVE_LINK);
}
static void nullsub_76(void)
static void PikeDummy1(void)
{
}
static void nullsub_124(void)
static void PikeDummy2(void)
{
}

View File

@ -258,7 +258,7 @@ static void Cmd_trysetperishsong(void);
static void Cmd_rolloutdamagecalculation(void);
static void Cmd_jumpifconfusedandstatmaxed(void);
static void Cmd_furycuttercalc(void);
static void Cmd_happinesstodamagecalculation(void);
static void Cmd_friendshiptodamagecalculation(void);
static void Cmd_presentdamagecalculation(void);
static void Cmd_setsafeguard(void);
static void Cmd_magnitudedamagecalculation(void);
@ -510,7 +510,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
Cmd_rolloutdamagecalculation, //0xB3
Cmd_jumpifconfusedandstatmaxed, //0xB4
Cmd_furycuttercalc, //0xB5
Cmd_happinesstodamagecalculation, //0xB6
Cmd_friendshiptodamagecalculation, //0xB6
Cmd_presentdamagecalculation, //0xB7
Cmd_setsafeguard, //0xB8
Cmd_magnitudedamagecalculation, //0xB9
@ -8471,7 +8471,7 @@ static void Cmd_furycuttercalc(void)
}
}
static void Cmd_happinesstodamagecalculation(void)
static void Cmd_friendshiptodamagecalculation(void)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN)
gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25;

View File

@ -878,12 +878,8 @@ static const u16 sFrontierTrainerIdRangesHard[][2] =
{FRONTIER_TRAINER_JAXON, FRONTIER_TRAINER_GRETEL}, // 200 - 299
};
// Trainer IDs? Don't make sense as part of previous array, min/max relationship reversed and never accessed
static const u16 sUnused_085DFA1A[][2] =
{
{179, 141}, // FRONTIER_TRAINER_ALISON - FRONTIER_TRAINER_KAYDEN
{200, 183}, // FRONTIER_TRAINER_JAXON - FRONTIER_TRAINER_HUNTER
};
// Unknown, unused data
static const u16 sUnused[] = { 179, 141, 200, 183 };
static const u8 sBattleTowerPartySizes[FRONTIER_MODE_COUNT] =
{

View File

@ -3949,7 +3949,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget)
return targetBattler;
}
static bool32 IsNotEventLegalMewOrDeoxys(u8 battlerId)
static bool32 IsMonEventLegal(u8 battlerId)
{
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
return TRUE;
@ -3970,7 +3970,7 @@ u8 IsMonDisobedient(void)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT)
return 0;
if (IsNotEventLegalMewOrDeoxys(gBattlerAttacker)) // only if species is Mew or Deoxys
if (IsMonEventLegal(gBattlerAttacker)) // only false if illegal Mew or Deoxys
{
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gBattlerAttacker) == 2)
return 0;

View File

@ -889,50 +889,50 @@ const struct Berry gBerries[] =
},
};
const struct UnkStruct_0858AB24 gUnknown_0858AB24[] = {
{ 50, 20},
{ 50, 20},
{ 50, 20},
{ 50, 20},
{ 50, 20},
{ 50, 30},
{ 50, 30},
{ 50, 30},
{ 50, 30},
{ 50, 30},
{ 60, 50},
{ 60, 50},
{ 60, 50},
{ 60, 50},
{ 60, 50},
{ 80, 70},
{ 80, 70},
{ 80, 70},
{ 80, 70},
{ 80, 70},
{100, 100},
{100, 100},
{100, 100},
{100, 100},
{100, 100},
{130, 150},
{130, 150},
{130, 150},
{130, 150},
{130, 150},
{160, 250},
{160, 250},
{160, 250},
{160, 250},
{160, 250},
{180, 500},
{180, 500},
{180, 500},
{180, 500},
{180, 500},
{200, 750},
{200, 750},
{150, 200}
const struct BerryCrushBerryData gBerryCrush_BerryData[] = {
[ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20},
[ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20},
[ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20},
[ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20},
[ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20},
[ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30},
[ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30},
[ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30},
[ITEM_LUM_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30},
[ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30},
[ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50},
[ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50},
[ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50},
[ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50},
[ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50},
[ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70},
[ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70},
[ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70},
[ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70},
[ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70},
[ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100},
[ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100},
[ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100},
[ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100},
[ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100},
[ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150},
[ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150},
[ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150},
[ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150},
[ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150},
[ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250},
[ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250},
[ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250},
[ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250},
[ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250},
[ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500},
[ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500},
[ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500},
[ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500},
[ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500},
[ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 200, .powder = 750},
[ITEM_STARF_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 200, .powder = 750},
[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 150, .powder = 200}
};
const struct BerryTree gBlankBerryTree = {};

File diff suppressed because it is too large Load Diff

View File

@ -904,7 +904,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId)
{
struct LinkPlayer *player = (struct LinkPlayer *)gBlockRecvBuffer[i];
gLinkPlayers[i] = *player;
sub_800B524(&gLinkPlayers[i]);
ConvertLinkPlayerName(&gLinkPlayers[i]);
ResetBlockReceivedFlag(i);
}
tState = 4;

View File

@ -2250,7 +2250,7 @@ const struct Item gItems[] =
.name = _("SOOTHE BELL"),
.itemId = ITEM_SOOTHE_BELL,
.price = 100,
.holdEffect = HOLD_EFFECT_HAPPINESS_UP,
.holdEffect = HOLD_EFFECT_FRIENDSHIP_UP,
.description = sSootheBellDesc,
.pocket = POCKET_ITEMS,
.type = ITEM_USE_BAG_MENU,

View File

@ -543,7 +543,7 @@ static const struct WindowTemplate sLevelUpStatsWindowTemplate =
.baseBlock = 0x2E9,
};
static const struct WindowTemplate sUnusedWindowTemplate_08615978 =
static const struct WindowTemplate sUnusedWindowTemplate1 =
{
.bg = 2,
.tilemapLeft = 2,
@ -554,7 +554,7 @@ static const struct WindowTemplate sUnusedWindowTemplate_08615978 =
.baseBlock = 0x1DF,
};
static const struct WindowTemplate sUnusedWindowTemplate_08615980 =
static const struct WindowTemplate sUnusedWindowTemplate2 =
{
.bg = 2,
.tilemapLeft = 0,
@ -669,7 +669,7 @@ static const u8 *const sDescriptionStringTable[] =
[PARTYBOX_DESC_DONT_HAVE] = gText_DontHave,
};
static const u16 sUnused_08615B94[] =
static const u16 sUnusedData[] =
{
0x0108, 0x0151, 0x0160, 0x015b, 0x002e, 0x005c, 0x0102, 0x0153, 0x014b, 0x00ed, 0x00f1, 0x010d, 0x003a, 0x003b, 0x003f, 0x0071,
0x00b6, 0x00f0, 0x00ca, 0x00db, 0x00da, 0x004c, 0x00e7, 0x0055, 0x0057, 0x0059, 0x00d8, 0x005b, 0x005e, 0x00f7, 0x0118, 0x0068,

View File

@ -67,7 +67,7 @@ static bool8 TryStartCoordEventScript(struct MapPosition *);
static bool8 TryStartWarpEventScript(struct MapPosition *, u16);
static bool8 TryStartMiscWalkingScripts(u16);
static bool8 TryStartStepCountScript(u16);
static void UpdateHappinessStepCounter(void);
static void UpdateFriendshipStepCounter(void);
static bool8 UpdatePoisonStepCounter(void);
void FieldClearPlayerInput(struct FieldInput *input)
@ -542,7 +542,7 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior)
}
IncrementRematchStepCounter();
UpdateHappinessStepCounter();
UpdateFriendshipStepCounter();
UpdateFarawayIslandStepCounter();
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED_MOVE) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior))
@ -607,14 +607,15 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior)
return FALSE;
}
void Unref_ClearHappinessStepCounter(void)
// Unused
static void ClearFriendshipStepCounter(void)
{
VarSet(VAR_HAPPINESS_STEP_COUNTER, 0);
VarSet(VAR_FRIENDSHIP_STEP_COUNTER, 0);
}
static void UpdateHappinessStepCounter(void)
static void UpdateFriendshipStepCounter(void)
{
u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER);
u16 *ptr = GetVarPointer(VAR_FRIENDSHIP_STEP_COUNTER);
int i;
(*ptr)++;

View File

@ -357,40 +357,42 @@ static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame
}
}
enum
{
TD_FRAMELIST = 0,
TD_GFX = 2,
TD_FRAME = 4,
TD_COUNTER,
TD_X,
TD_Y
};
#define tFramesHi data[0]
#define tFramesLo data[1]
#define tGfxHi data[2]
#define tGfxLo data[3]
#define tFrameId data[4]
#define tCounter data[5]
#define tX data[6]
#define tY data[7]
static bool32 sub_808A5F0(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData)
// Draws a single frame of the door animation, or skips drawing to wait between frames.
// Returns FALSE when the final frame has been reached
static bool32 AnimateDoorFrame(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *data)
{
if (taskData[TD_COUNTER] == 0)
DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]);
if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time)
if (tCounter == 0)
DrawDoor(gfx, &frames[tFrameId], tX, tY);
if (tCounter == frames[tFrameId].time)
{
taskData[TD_COUNTER] = 0;
taskData[TD_FRAME]++;
if (frames[taskData[TD_FRAME]].time == 0)
tCounter = 0;
tFrameId++;
if (frames[tFrameId].time == 0)
return FALSE;
else
return TRUE;
}
taskData[TD_COUNTER]++;
tCounter++;
return TRUE;
}
static void Task_AnimateDoor(u8 taskId)
{
u16 *taskData = gTasks[taskId].data;
struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]);
struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]);
u16 *data = gTasks[taskId].data;
struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(tFramesHi << 16 | tFramesLo);
struct DoorGraphics *gfx = (struct DoorGraphics *)(tGfxHi << 16 | tGfxLo);
if (sub_808A5F0(gfx, frames, taskData) == FALSE)
if (AnimateDoorFrame(gfx, frames, data) == FALSE)
DestroyTask(taskId);
}
@ -419,16 +421,16 @@ static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct Do
else
{
u8 taskId = CreateTask(Task_AnimateDoor, 0x50);
s16 *taskData = gTasks[taskId].data;
s16 *data = gTasks[taskId].data;
taskData[TD_X] = x;
taskData[TD_Y] = y;
tX = x;
tY = y;
taskData[TD_FRAMELIST + 1] = (u32)frames;
taskData[TD_FRAMELIST] = (u32)frames >> 16;
tFramesLo = (u32)frames;
tFramesHi = (u32)frames >> 16;
taskData[TD_GFX + 1] = (u32)gfx;
taskData[TD_GFX] = (u32)gfx >> 16;
tGfxLo = (u32)gfx;
tGfxHi = (u32)gfx >> 16;
return taskId;
}

View File

@ -480,13 +480,13 @@ static const struct Subsprite sSubsprites_HofMonitorBig[] =
static const struct SubspriteTable sSubspriteTable_HofMonitorBig = subsprite_table(sSubsprites_HofMonitorBig);
const union AnimCmd gSpriteAnim_855C2CC[] =
const union AnimCmd sAnim_Static[] =
{
ANIMCMD_FRAME(.imageValue = 0, .duration = 1),
ANIMCMD_JUMP(0)
};
const union AnimCmd gSpriteAnim_855C2D4[] =
const union AnimCmd sAnim_Flicker[] =
{
ANIMCMD_FRAME(.imageValue = 0, .duration = 16),
ANIMCMD_FRAME(.imageValue = 1, .duration = 16),
@ -499,15 +499,16 @@ const union AnimCmd gSpriteAnim_855C2D4[] =
ANIMCMD_END
};
const union AnimCmd *const gSpriteAnimTable_855C2F8[] =
// Flicker on and off, for the Pokéballs / monitors during the PokéCenter heal effect
const union AnimCmd *const sAnims_Flicker[] =
{
gSpriteAnim_855C2CC,
gSpriteAnim_855C2D4
sAnim_Static,
sAnim_Flicker
};
static const union AnimCmd *const sAnimTable_HofMonitor[] =
static const union AnimCmd *const sAnims_HofMonitor[] =
{
gSpriteAnim_855C2CC
sAnim_Static
};
static const struct SpriteTemplate sSpriteTemplate_PokeballGlow =
@ -515,7 +516,7 @@ static const struct SpriteTemplate sSpriteTemplate_PokeballGlow =
.tileTag = 0xFFFF,
.paletteTag = FLDEFF_PAL_TAG_POKEBALL_GLOW,
.oam = &sOam_8x8,
.anims = gSpriteAnimTable_855C2F8,
.anims = sAnims_Flicker,
.images = sPicTable_PokeballGlow,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_PokeballGlow
@ -526,7 +527,7 @@ static const struct SpriteTemplate sSpriteTemplate_PokecenterMonitor =
.tileTag = 0xFFFF,
.paletteTag = FLDEFF_PAL_TAG_GENERAL_0,
.oam = &sOam_16x16,
.anims = gSpriteAnimTable_855C2F8,
.anims = sAnims_Flicker,
.images = sPicTable_PokecenterMonitor,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_PokecenterMonitor
@ -537,7 +538,7 @@ static const struct SpriteTemplate sSpriteTemplate_HofMonitorBig =
.tileTag = 0xFFFF,
.paletteTag = FLDEFF_PAL_TAG_HOF_MONITOR,
.oam = &sOam_16x16,
.anims = sAnimTable_HofMonitor,
.anims = sAnims_HofMonitor,
.images = sPicTable_HofMonitorBig,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_HallOfFameMonitor
@ -548,7 +549,7 @@ static const struct SpriteTemplate sSpriteTemplate_HofMonitorSmall =
.tileTag = 0xFFFF,
.paletteTag = FLDEFF_PAL_TAG_HOF_MONITOR,
.oam = &sOam_32x16,
.anims = sAnimTable_HofMonitor,
.anims = sAnims_HofMonitor,
.images = sPicTable_HofMonitorSmall,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_HallOfFameMonitor
@ -3853,16 +3854,8 @@ static void Task_MoveDeoxysRock(u8 taskId)
case 0:
data[4] = sprite->pos1.x << 4;
data[5] = sprite->pos1.y << 4;
// UB: Possible divide by zero
#ifdef UBFIX
#define DIVISOR (data[8] ? data[8] : 1);
#else
#define DIVISOR (data[8])
#endif
data[6] = (data[2] * 16 - data[4]) / DIVISOR;
data[7] = (data[3] * 16 - data[5]) / DIVISOR;
data[6] = SAFE_DIV(data[2] * 16 - data[4], data[8]);
data[7] = SAFE_DIV(data[3] * 16 - data[5], data[8]);
data[0]++;
case 1:
if (data[8] != 0)

View File

@ -16,7 +16,6 @@
#include "constants/songs.h"
#include "constants/map_types.h"
// structures
struct FlashStruct
{
u8 fromType;
@ -26,7 +25,6 @@ struct FlashStruct
void (*func)(void);
};
// static functions
static void FieldCallback_Flash(void);
static void FldEff_UseFlash(void);
static bool8 TryDoMapTransition(void);
@ -42,7 +40,6 @@ static void Task_EnterCaveTransition2(u8 taskId);
static void Task_EnterCaveTransition3(u8 taskId);
static void Task_EnterCaveTransition4(u8 taskId);
// rodata
static const struct FlashStruct sTransitionTypes[] =
{
{MAP_TYPE_TOWN, MAP_TYPE_UNDERGROUND, TRUE, FALSE, DoEnterCaveTransition},
@ -64,15 +61,14 @@ static const struct FlashStruct sTransitionTypes[] =
{},
};
static const u16 gCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal");
static const u16 gCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal");
static const u16 sCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal");
static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal");
static const u16 gUnknown_085B2890[] = INCBIN_U16("graphics/misc/85B2890.gbapal");
static const u16 gUnknown_085B28A0[] = INCBIN_U16("graphics/misc/85B28A0.gbapal");
static const u32 gCaveTransitionTilemap[] = INCBIN_U32("graphics/misc/cave_transition_map.bin.lz");
static const u32 gCaveTransitionTiles[] = INCBIN_U32("graphics/misc/cave_transition.4bpp.lz");
static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/misc/cave_transition_enter.gbapal");
static const u16 sCaveTransitionPalette_Exit[] = INCBIN_U16("graphics/misc/cave_transition_exit.gbapal");
static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/misc/cave_transition_map.bin.lz");
static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/misc/cave_transition.4bpp.lz");
// text
bool8 SetUpFieldMove_Flash(void)
{
// In Ruby and Sapphire, Registeel's tomb is opened by using Fly. In Emerald,
@ -220,10 +216,10 @@ static void Task_ExitCaveTransition1(u8 taskId)
static void Task_ExitCaveTransition2(u8 taskId)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
LZ77UnCompVram(gCaveTransitionTiles, (void *)(VRAM + 0xC000));
LZ77UnCompVram(gCaveTransitionTilemap, (void *)(VRAM + 0xF800));
LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(gUnknown_085B28A0, 0xE0, 0x10);
LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000));
LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800));
LoadPalette(sCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(sCaveTransitionPalette_Exit, 0xE0, 0x10);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
| BLDCNT_EFFECT_BLEND
| BLDCNT_TGT2_BG1
@ -274,11 +270,11 @@ static void Task_ExitCaveTransition4(u8 taskId)
if (count < 8)
{
gTasks[taskId].data[2]++;
LoadPalette(&gUnknown_085B28A0[count], 0xE0, 16 - 2 * count);
LoadPalette(&sCaveTransitionPalette_Exit[count], 0xE0, 16 - 2 * count);
}
else
{
LoadPalette(gCaveTransitionPalette_White, 0, 0x20);
LoadPalette(sCaveTransitionPalette_White, 0, 0x20);
gTasks[taskId].func = Task_ExitCaveTransition5;
gTasks[taskId].data[2] = 8;
}
@ -305,8 +301,8 @@ static void Task_EnterCaveTransition1(u8 taskId)
static void Task_EnterCaveTransition2(u8 taskId)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
LZ77UnCompVram(gCaveTransitionTiles, (void *)(VRAM + 0xC000));
LZ77UnCompVram(gCaveTransitionTilemap, (void *)(VRAM + 0xF800));
LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000));
LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800));
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
@ -319,8 +315,8 @@ static void Task_EnterCaveTransition2(u8 taskId)
| DISPCNT_OBJ_1D_MAP
| DISPCNT_BG0_ON
| DISPCNT_OBJ_ON);
LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
LoadPalette(sCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(sCaveTransitionPalette_Black, 0, 0x20);
gTasks[taskId].func = Task_EnterCaveTransition3;
gTasks[taskId].data[0] = 16;
gTasks[taskId].data[1] = 0;
@ -335,7 +331,7 @@ static void Task_EnterCaveTransition3(u8 taskId)
{
gTasks[taskId].data[2]++;
gTasks[taskId].data[2]++;
LoadPalette(&gUnknown_085B2890[15 - count], 0xE0, 2 * (count + 1));
LoadPalette(&sCaveTransitionPalette_Enter[15 - count], 0xE0, 2 * (count + 1));
}
else
{
@ -363,7 +359,7 @@ static void Task_EnterCaveTransition4(u8 taskId)
}
else
{
LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
LoadPalette(sCaveTransitionPalette_Black, 0, 0x20);
SetMainCallback2(gMain.savedCallback);
}
}

View File

@ -2383,13 +2383,13 @@ void ClearRankingHallRecords(void)
{
s32 i, j, k;
// BUG: Passing 0 as a pointer instead of a pointer holding a value of 0.
#ifdef BUGFIX
u8 zero = 0;
#define ZERO (&zero)
#else
// UB: Passing 0 as a pointer instead of a pointer holding a value of 0.
#ifdef UBFIX
u8 emptyId[TRAINER_ID_LENGTH] = {0};
#define ZERO emptyId
#else
#define ZERO 0
#endif
#endif
for (i = 0; i < HALL_FACILITIES_COUNT; i++)
{

View File

@ -1543,9 +1543,9 @@ const u16 gUnknown_08DE3350[] = INCBIN_U16("graphics/frontier_pass/tilemap1.bin"
const u16 gUnknown_08DE3374[] = INCBIN_U16("graphics/frontier_pass/tilemap2.bin");
// Berry Crush
const u16 gUnknown_08DE3398[] = INCBIN_U16("graphics/berry_crusher/tiles.gbapal");
const u32 gUnknown_08DE34B8[] = INCBIN_U32("graphics/berry_crusher/tiles.4bpp.lz");
const u32 gUnknown_08DE3FD4[] = INCBIN_U32("graphics/berry_crusher/tiles.bin.lz");
const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal");
const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz");
const u32 gBerryCrush_Crusher_Tilemap[] = INCBIN_U32("graphics/berry_crush/crusher.bin.lz");
// random garbage at the end.
static const u8 sEmpty3[0x54BAC] = {0};

View File

@ -1576,7 +1576,7 @@ static void Task_IntroSpinAndZoomPokeball(u8 taskId)
gTasks[taskId].func = Task_IntroWaitToSetupPart3LegendsFight;
}
PanFadeAndZoomScreen(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]);
PanFadeAndZoomScreen(0x78, 0x50, SAFE_DIV(0x10000, gTasks[taskId].data[1]), gTasks[taskId].data[0]);
if (gIntroFrameCounter == 28)
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA);

View File

@ -41,8 +41,8 @@ struct LinkTestBGInfo
{
u32 screenBaseBlock;
u32 paletteNum;
u32 dummy_8;
u32 dummy_C;
u32 baseChar;
u32 unused;
};
static struct BlockTransfer sBlockSend;
@ -97,28 +97,26 @@ struct Link gLink;
u8 gLastRecvQueueCount;
u16 gLinkSavedIme;
EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0;
EWRAM_DATA u8 gUnknown_020223BD = 0;
static EWRAM_DATA u8 sLinkTestDebugValuesEnabled = 0;
static EWRAM_DATA u8 sDummyFlag = FALSE;
EWRAM_DATA u32 gBerryBlenderKeySendAttempts = 0;
EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {};
EWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {};
EWRAM_DATA bool8 gLinkOpen = FALSE;
static EWRAM_DATA bool8 sLinkOpen = FALSE;
EWRAM_DATA u16 gLinkType = 0;
EWRAM_DATA u16 gLinkTimeOutCounter = 0;
static EWRAM_DATA u16 sTimeOutCounter = 0;
EWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {};
EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {};
EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {};
static EWRAM_DATA struct LinkPlayer sSavedLinkPlayers[MAX_RFU_PLAYERS] = {};
EWRAM_DATA struct {
u32 status;
u8 lastRecvQueueCount;
u8 lastSendQueueCount;
u8 unk_06;
bool8 disconnected;
} sLinkErrorBuffer = {};
static EWRAM_DATA u16 sReadyCloseLinkAttempts = 0; // never read
static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
// Static ROM declarations
static void InitLocalLinkPlayer(void);
static void VBlankCB_LinkError(void);
static void CB2_LinkTest(void);
@ -131,7 +129,7 @@ static void LinkCB_BlockSend(void);
static void LinkCB_BlockSendEnd(void);
static void SetBlockReceivedFlag(u8 who);
static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
static void LinkTest_PrintHex(u32 pos, u8 a0, u8 a1, u8 a2);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8 taskId);
@ -160,8 +158,6 @@ static void DoSend(void);
static void StopTimer(void);
static void SendRecvDone(void);
// .rodata
static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal");
static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/interface/wireless_link_display.4bpp.lz");
static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/interface/wireless_link_display.bin.lz");
@ -226,15 +222,13 @@ static const struct WindowTemplate sLinkErrorWindowTemplates[] = {
};
static const u8 sTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY };
static const u8 sUnused_082ED224[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00};
// .text
static const u8 sUnusedData[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00};
bool8 IsWirelessAdapterConnected(void)
{
SetWirelessCommType1();
InitRFUAPI();
if (rfu_LMAN_REQBN_softReset_and_checkID() == 0x8001)
if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)
{
rfu_REQ_stopMode();
rfu_waitREQComplete();
@ -251,13 +245,13 @@ void Task_DestroySelf(u8 taskId)
DestroyTask(taskId);
}
static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 a4)
static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 baseChar)
{
LoadPalette(sLinkTestDigitsPal, paletteNum * 16, 0x20);
DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof sLinkTestDigitsGfx);
DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * baseChar), sizeof sLinkTestDigitsGfx);
gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
gLinkTestBGInfo.paletteNum = paletteNum;
gLinkTestBGInfo.dummy_8 = a4;
gLinkTestBGInfo.baseChar = baseChar;
switch (bgNum)
{
case 1:
@ -274,17 +268,19 @@ static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charB
SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0);
}
void sub_80094EC(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
// Unused
static void LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
{
LoadPalette(sLinkTestDigitsPal, paletteNum * 16, 0x20);
DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof sLinkTestDigitsGfx);
gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
gLinkTestBGInfo.paletteNum = paletteNum;
gLinkTestBGInfo.dummy_8 = 0;
gLinkTestBGInfo.baseChar = 0;
SetGpuReg(sBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock));
}
void LinkTestScreen(void)
// Unused
static void LinkTestScreen(void)
{
int i;
@ -346,10 +342,9 @@ static void InitLink(void)
int i;
for (i = 0; i < CMD_LENGTH; i++)
{
gSendCmd[i] = 0xEfff;
}
gLinkOpen = TRUE;
gSendCmd[i] = LINKCMD_NONE;
sLinkOpen = TRUE;
EnableSerial();
}
@ -402,7 +397,7 @@ void CloseLink(void)
{
LinkRfu_Shutdown();
}
gLinkOpen = FALSE;
sLinkOpen = FALSE;
DisableSerial();
}
@ -413,14 +408,14 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used)
if (sLinkTestLastBlockSendPos != sBlockSend.pos)
{
LinkTest_prnthex(sBlockSend.pos, 2, 3, 2);
LinkTest_PrintHex(sBlockSend.pos, 2, 3, 2);
sLinkTestLastBlockSendPos = sBlockSend.pos;
}
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos)
{
LinkTest_prnthex(sBlockRecv[i].pos, 2, i + 4, 2);
LinkTest_PrintHex(sBlockRecv[i].pos, 2, i + 4, 2);
sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos;
}
}
@ -435,8 +430,8 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used)
ResetBlockReceivedFlag(i);
if (gLinkTestBlockChecksums[i] != 0x0342)
{
gLinkTestDebugValuesEnabled = FALSE;
gUnknown_020223BD = FALSE;
sLinkTestDebugValuesEnabled = FALSE;
sDummyFlag = FALSE;
}
}
}
@ -469,7 +464,7 @@ static void LinkTestProcessKeyInput(void)
{
SetCloseLinkCallback();
}
if (gLinkTestDebugValuesEnabled)
if (sLinkTestDebugValuesEnabled)
{
SetLinkDebugValues(gMain.vblankCounter2, gLinkCallback ? gLinkVSyncDisabled : gLinkVSyncDisabled | 0x10);
}
@ -489,7 +484,7 @@ u16 LinkMain2(const u16 *heldKeys)
{
u8 i;
if (!gLinkOpen)
if (!sLinkOpen)
{
return 0;
}
@ -555,10 +550,10 @@ static void ProcessRecvCmds(u8 unused)
case LINKCMD_BLENDER_SEND_KEYS:
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
break;
case LINKCMD_0x5555:
case LINKCMD_DUMMY_1:
gLinkDummy2 = TRUE;
break;
case LINKCMD_0x5566:
case LINKCMD_DUMMY_2:
gLinkDummy2 = TRUE;
break;
case LINKCMD_INIT_BLOCK:
@ -612,7 +607,7 @@ static void ProcessRecvCmds(u8 unused)
linkPlayer->neverRead = 0;
linkPlayer->progressFlags = 0;
}
sub_800B524(linkPlayer);
ConvertLinkPlayerName(linkPlayer);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0
|| strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
@ -664,22 +659,19 @@ static void BuildSendCmd(u16 command)
gSendCmd[0] = LINKCMD_BLENDER_SEND_KEYS;
gSendCmd[1] = gMain.heldKeys;
break;
case LINKCMD_0x5555:
gSendCmd[0] = LINKCMD_0x5555;
case LINKCMD_DUMMY_1:
gSendCmd[0] = LINKCMD_DUMMY_1;
break;
case LINKCMD_0x6666:
gSendCmd[0] = LINKCMD_0x6666;
case LINKCMD_SEND_EMPTY:
gSendCmd[0] = LINKCMD_SEND_EMPTY;
gSendCmd[1] = 0;
break;
case LINKCMD_0x7777:
case LINKCMD_SEND_0xEE:
{
u8 i;
gSendCmd[0] = LINKCMD_0x7777;
gSendCmd[0] = LINKCMD_SEND_0xEE;
for (i = 0; i < 5; i++)
{
gSendCmd[i + 1] = 0xEE;
}
break;
}
case LINKCMD_INIT_BLOCK:
@ -690,8 +682,8 @@ static void BuildSendCmd(u16 command)
case LINKCMD_BLENDER_NO_PBLOCK_SPACE:
gSendCmd[0] = LINKCMD_BLENDER_NO_PBLOCK_SPACE;
break;
case LINKCMD_0xAAAB:
gSendCmd[0] = LINKCMD_0xAAAB;
case LINKCMD_SEND_ITEM:
gSendCmd[0] = LINKCMD_SEND_ITEM;
gSendCmd[1] = gSpecialVar_ItemId;
break;
case LINKCMD_SEND_BLOCK_REQ:
@ -702,14 +694,13 @@ static void BuildSendCmd(u16 command)
gSendCmd[0] = LINKCMD_READY_CLOSE_LINK;
gSendCmd[1] = gReadyCloseLinkType;
break;
case LINKCMD_0x5566:
gSendCmd[0] = LINKCMD_0x5566;
case LINKCMD_DUMMY_2:
gSendCmd[0] = LINKCMD_DUMMY_2;
break;
case LINKCMD_SEND_HELD_KEYS:
if (gHeldKeyCodeToSend == 0 || gLinkTransferringData)
{
break;
}
gSendCmd[0] = LINKCMD_SEND_HELD_KEYS;
gSendCmd[1] = gHeldKeyCodeToSend;
break;
@ -819,7 +810,7 @@ bool32 Link_AnyPartnersPlayingFRLG_JP(void)
void OpenLinkTimed(void)
{
sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED;
gLinkTimeOutCounter = 0;
sTimeOutCounter = 0;
OpenLink();
}
@ -892,7 +883,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers)
}
}
}
else if (++gLinkTimeOutCounter > 600)
else if (++sTimeOutCounter > 600)
{
sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT;
}
@ -909,9 +900,7 @@ bool8 IsLinkPlayerDataExchangeComplete(void)
for (i = 0; i < GetLinkPlayerCount(); i++)
{
if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType)
{
count++;
}
}
if (count == GetLinkPlayerCount())
{
@ -936,9 +925,7 @@ void ResetLinkPlayers(void)
int i;
for (i = 0; i <= MAX_LINK_PLAYERS; i++)
{
gLinkPlayers[i] = (struct LinkPlayer){};
}
}
static void ResetBlockSend(void)
@ -966,9 +953,8 @@ static bool32 InitBlockSend(const void *src, size_t size)
else
{
if (src != gBlockSendBuffer)
{
memcpy(gBlockSendBuffer, src, size);
}
sBlockSend.src = gBlockSendBuffer;
}
BuildSendCmd(LINKCMD_INIT_BLOCK);
@ -980,9 +966,7 @@ static bool32 InitBlockSend(const void *src, size_t size)
static void LinkCB_BlockSendBegin(void)
{
if (++sBlockSendDelayCounter > 2)
{
gLinkCallback = LinkCB_BlockSend;
}
}
static void LinkCB_BlockSend(void)
@ -1020,13 +1004,9 @@ void SetBerryBlenderLinkCallback(void)
{
gBerryBlenderKeySendAttempts = 0;
if (gWirelessCommType)
{
Rfu_SetBerryBlenderLinkCallback();
}
else
{
gLinkCallback = LinkCB_BerryBlenderSendHeldKeys;
}
}
// Unused
@ -1044,9 +1024,8 @@ static void SendBerryBlenderNoSpaceForPokeblocks(void)
u8 GetMultiplayerId(void)
{
if (gWirelessCommType == TRUE)
{
return Rfu_GetMultiplayerId();
}
return SIO_MULTI_CNT->id;
}
@ -1061,18 +1040,16 @@ u8 bitmask_all_link_players_but_self(void)
bool8 SendBlock(u8 unused, const void *src, u16 size)
{
if (gWirelessCommType == TRUE)
{
return Rfu_InitBlockSend(src, size);
}
return InitBlockSend(src, size);
}
bool8 SendBlockRequest(u8 blockReqType)
{
if (gWirelessCommType == TRUE)
{
return Rfu_SendBlockRequest(blockReqType);
}
if (gLinkCallback == NULL)
{
gBlockRequestType = blockReqType;
@ -1085,31 +1062,25 @@ bool8 SendBlockRequest(u8 blockReqType)
bool8 IsLinkTaskFinished(void)
{
if (gWirelessCommType == TRUE)
{
return IsLinkRfuTaskFinished();
}
return gLinkCallback == NULL;
}
u8 GetBlockReceivedStatus(void)
{
if (gWirelessCommType == TRUE)
{
return Rfu_GetBlockReceivedStatus();
}
return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0);
}
static void SetBlockReceivedFlag(u8 who)
{
if (gWirelessCommType == TRUE)
{
Rfu_SetBlockReceivedFlag(who);
}
else
{
gBlockReceivedStatus[who] = TRUE;
}
}
void ResetBlockReceivedFlags(void)
@ -1119,16 +1090,12 @@ void ResetBlockReceivedFlags(void)
if (gWirelessCommType == TRUE)
{
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
Rfu_ResetBlockReceivedFlag(i);
}
}
else
{
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
gBlockReceivedStatus[i] = FALSE;
}
}
}
@ -1147,9 +1114,7 @@ void ResetBlockReceivedFlag(u8 who)
void CheckShouldAdvanceLinkState(void)
{
if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1)
{
gShouldAdvanceLinkState = 1;
}
}
static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)
@ -1159,92 +1124,90 @@ static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)
chksum = 0;
for (i = 0; i < size / 2; i++)
{
chksum += src[i];
}
return chksum;
}
static void LinkTest_prnthexchar(char a0, u8 a1, u8 a2)
static void LinkTest_PrintNumChar(char val, u8 x, u8 y)
{
u16 *vAddr;
vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + 1 + gLinkTestBGInfo.dummy_8);
vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + 1 + gLinkTestBGInfo.baseChar);
}
static void LinkTest_prntchar(char a0, u8 a1, u8 a2)
static void LinkTest_PrintChar(char val, u8 x, u8 y)
{
u16 *vAddr;
vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + gLinkTestBGInfo.dummy_8);
vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + gLinkTestBGInfo.baseChar);
}
static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2)
static void LinkTest_PrintHex(u32 num, u8 x, u8 y, u8 length)
{
char sp[32 / 2];
char buff[16];
int i;
for (i = 0; i < a2; i++)
for (i = 0; i < length; i++)
{
sp[i] = pos & 0xf;
pos >>= 4;
buff[i] = num & 0xF;
num >>= 4;
}
for (i = a2 - 1; i >= 0; i--)
for (i = length - 1; i >= 0; i--)
{
LinkTest_prnthexchar(sp[i], a0, a1);
a0++;
LinkTest_PrintNumChar(buff[i], x, y);
x++;
}
}
static void LinkTest_prntint(int a0, u8 a1, u8 a2, u8 a3)
static void LinkTest_PrintInt(int num, u8 x, u8 y, u8 length)
{
char sp[32 / 2];
int sp10;
char buff[16];
int negX;
int i;
sp10 = -1;
if (a0 < 0)
negX = -1;
if (num < 0)
{
sp10 = a1;
a0 = -a0;
negX = x;
num = -num;
}
for (i = 0; i < a3; i++)
for (i = 0; i < length; i++)
{
sp[i] = a0 % 10;
a0 /= 10;
buff[i] = num % 10;
num /= 10;
}
for (i = a3 - 1; i >= 0; i--)
for (i = length - 1; i >= 0; i--)
{
LinkTest_prnthexchar(sp[i], a1, a2);
a1++;
}
if (sp10 != -1)
{
LinkTest_prnthexchar(*"\n", sp10, a2);
LinkTest_PrintNumChar(buff[i], x, y);
x++;
}
if (negX != -1)
LinkTest_PrintNumChar(*"\n", negX, y);
}
static void LinkTest_prntstr(const char *a0, u8 a1, u8 a2)
static void LinkTest_PrintString(const char *str, u8 x, u8 y)
{
int r6;
int xOffset;
int i;
int r5;
int yOffset;
r5 = 0;
r6 = 0;
for (i = 0; a0[i] != 0; a0++)
yOffset = 0;
xOffset = 0;
for (i = 0; str[i] != 0; str++)
{
if (a0[i] == *"\n")
if (str[i] == *"\n")
{
r5++;
r6 = 0;
yOffset++;
xOffset = 0;
}
else
{
LinkTest_prntchar(a0[i], a1 + r6, a2 + r5);
r6++;
LinkTest_PrintChar(str[i], x + xOffset, y + yOffset);
xOffset++;
}
}
}
@ -1260,29 +1223,28 @@ static void LinkCB_RequestPlayerDataExchange(void)
static void Task_PrintTestData(u8 taskId)
{
char sp[32];
char testTitle[32];
int i;
strcpy(sp, sASCIITestPrint);
LinkTest_prntstr(sp, 5, 2);
LinkTest_prnthex(gShouldAdvanceLinkState, 2, 1, 2);
LinkTest_prnthex(gLinkStatus, 15, 1, 8);
LinkTest_prnthex(gLink.state, 2, 10, 2);
LinkTest_prnthex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2);
LinkTest_prnthex(GetMultiplayerId(), 15, 12, 2);
LinkTest_prnthex(gLastSendQueueCount, 25, 1, 2);
LinkTest_prnthex(gLastRecvQueueCount, 25, 2, 2);
LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2);
LinkTest_prnthex(gLinkDebugSeed, 2, 12, 8);
LinkTest_prnthex(gLinkDebugFlags, 2, 13, 8);
LinkTest_prnthex(GetSioMultiSI(), 25, 5, 1);
LinkTest_prnthex(IsSioMultiMaster(), 25, 6, 1);
LinkTest_prnthex(IsLinkConnectionEstablished(), 25, 7, 1);
LinkTest_prnthex(HasLinkErrorOccurred(), 25, 8, 1);
strcpy(testTitle, sASCIITestPrint);
LinkTest_PrintString(testTitle, 5, 2);
LinkTest_PrintHex(gShouldAdvanceLinkState, 2, 1, 2);
LinkTest_PrintHex(gLinkStatus, 15, 1, 8);
LinkTest_PrintHex(gLink.state, 2, 10, 2);
LinkTest_PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2);
LinkTest_PrintHex(GetMultiplayerId(), 15, 12, 2);
LinkTest_PrintHex(gLastSendQueueCount, 25, 1, 2);
LinkTest_PrintHex(gLastRecvQueueCount, 25, 2, 2);
LinkTest_PrintHex(GetBlockReceivedStatus(), 15, 5, 2);
LinkTest_PrintHex(gLinkDebugSeed, 2, 12, 8);
LinkTest_PrintHex(gLinkDebugFlags, 2, 13, 8);
LinkTest_PrintHex(GetSioMultiSI(), 25, 5, 1);
LinkTest_PrintHex(IsSioMultiMaster(), 25, 6, 1);
LinkTest_PrintHex(IsLinkConnectionEstablished(), 25, 7, 1);
LinkTest_PrintHex(HasLinkErrorOccurred(), 25, 8, 1);
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4);
}
LinkTest_PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4);
}
void SetLinkDebugValues(u32 seed, u32 flags)
@ -1298,9 +1260,8 @@ u8 GetSavedLinkPlayerCountAsBitFlags(void)
flags = 0;
for (i = 0; i < gSavedLinkPlayerCount; i++)
{
flags |= (1 << i);
}
return flags;
}
@ -1311,9 +1272,8 @@ u8 GetLinkPlayerCountAsBitFlags(void)
flags = 0;
for (i = 0; i < GetLinkPlayerCount(); i++)
{
flags |= (1 << i);
}
return flags;
}
@ -1324,9 +1284,7 @@ void SaveLinkPlayers(u8 playerCount)
gSavedLinkPlayerCount = playerCount;
gSavedMultiplayerId = GetMultiplayerId();
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
gSavedLinkPlayers[i] = gLinkPlayers[i];
}
sSavedLinkPlayers[i] = gLinkPlayers[i];
}
// The number of players when trading began. This is frequently compared against the
@ -1349,7 +1307,7 @@ bool8 DoesLinkPlayerCountMatchSaved(void)
for (i = 0; i < gSavedLinkPlayerCount; i++)
{
if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)
if (gLinkPlayers[i].trainerId == sSavedLinkPlayers[i].trainerId)
{
if (gLinkType == LINKTYPE_BATTLE_TOWER)
{
@ -1375,12 +1333,15 @@ bool8 DoesLinkPlayerCountMatchSaved(void)
void ClearSavedLinkPlayers(void)
{
int i;
// Clearly not what was meant to be written, but here it is anyway.
for (i = 0; i < 4; i++)
{
CpuSet(&gSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer));
}
// The CpuSet loop below is incorrectly writing to NULL
// instead of sSavedLinkPlayers.
// Additionally it's using the wrong array size.
#ifdef UBFIX
memset(sSavedLinkPlayers, 0, sizeof(sSavedLinkPlayers));
#else
for (i = 0; i < MAX_LINK_PLAYERS; i++)
CpuSet(&sSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer));
#endif
}
void CheckLinkPlayersMatchSaved(void)
@ -1389,8 +1350,8 @@ void CheckLinkPlayersMatchSaved(void)
for (i = 0; i < gSavedLinkPlayerCount; i++)
{
if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId
|| StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)
if (sSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId
|| StringCompare(sSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)
{
gLinkErrorOccurred = TRUE;
CloseLink();
@ -1413,9 +1374,8 @@ u8 GetLinkPlayerCount_2(void)
bool8 IsLinkMaster(void)
{
if (gWirelessCommType)
{
return Rfu_IsMaster();
}
return EXTRACT_MASTER(gLinkStatus);
}
@ -1568,9 +1528,8 @@ void SetLinkStandbyCallback(void)
else
{
if (gLinkCallback == NULL)
{
gLinkCallback = LinkCB_Standby;
}
gLinkDummy1 = FALSE;
}
}
@ -1606,7 +1565,7 @@ static void LinkCB_StandbyForAll(void)
static void CheckErrorStatus(void)
{
if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus))
if (sLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus))
{
if (!gSuppressLinkErrorMessage)
{
@ -1620,12 +1579,12 @@ static void CheckErrorStatus(void)
}
}
void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 unk_06)
void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 disconnected)
{
sLinkErrorBuffer.status = status;
sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount;
sLinkErrorBuffer.unk_06 = unk_06;
sLinkErrorBuffer.disconnected = disconnected;
}
void CB2_LinkError(void)
@ -1645,16 +1604,15 @@ void CB2_LinkError(void)
ScanlineEffect_Stop();
if (gWirelessCommType)
{
if (!sLinkErrorBuffer.unk_06)
{
if (!sLinkErrorBuffer.disconnected)
gWirelessCommType = 3;
}
ResetLinkRfuGFLayer();
}
SetVBlankCallback(VBlankCB_LinkError);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates));
sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800);
sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(BG_SCREEN_SIZE);
SetBgTilemapBuffer(1, tilemapBuffer);
if (InitWindows(sLinkErrorWindowTemplates))
{
@ -1714,14 +1672,16 @@ static void CB2_PrintErrorMessage(void)
switch (gMain.state)
{
case 00:
if (sLinkErrorBuffer.unk_06)
// Below is only true for the RFU, so the other error
// type is inferred to be from a wired connection
if (sLinkErrorBuffer.disconnected)
ErrorMsg_MoveCloserToPartner();
else
ErrorMsg_CheckConnections();
break;
case 02:
ShowBg(0);
if (sLinkErrorBuffer.unk_06)
if (sLinkErrorBuffer.disconnected)
ShowBg(1);
break;
case 30:
@ -1748,7 +1708,7 @@ static void CB2_PrintErrorMessage(void)
{
PlaySE(SE_PIN);
gWirelessCommType = 0;
sLinkErrorBuffer.unk_06 = 0;
sLinkErrorBuffer.disconnected = FALSE;
sub_81700F8();
}
}
@ -1762,10 +1722,9 @@ static void CB2_PrintErrorMessage(void)
}
}
}
if (gMain.state != 160)
{
gMain.state++;
}
}
// TODO: there might be a file boundary here, let's name it
@ -1795,7 +1754,7 @@ bool8 HasLinkErrorOccurred(void)
return gLinkErrorOccurred;
}
void sub_800B348(void)
void LocalLinkPlayerToBlock(void)
{
struct LinkPlayerBlock *block;
@ -1816,11 +1775,11 @@ void LinkPlayerFromBlock(u32 who)
block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];
player = &gLinkPlayers[who_];
*player = block->linkPlayer;
sub_800B524(player);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
ConvertLinkPlayerName(player);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0
|| strcmp(block->magic2, sASCIIGameFreakInc) != 0)
SetMainCallback2(CB2_LinkError);
}
}
bool8 HandleLinkConnection(void)
@ -1833,9 +1792,7 @@ bool8 HandleLinkConnection(void)
gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds);
LinkMain2(&gMain.heldKeys);
if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && IsSendingKeysOverCable() == TRUE)
{
return TRUE;
}
}
else
{
@ -1844,9 +1801,7 @@ bool8 HandleLinkConnection(void)
if (IsSendingKeysOverCable() == TRUE)
{
if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5)
{
return TRUE;
}
}
}
return FALSE;
@ -1855,42 +1810,34 @@ bool8 HandleLinkConnection(void)
void SetWirelessCommType1(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
gWirelessCommType = 1;
}
}
static void SetWirelessCommType0_Internal(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
gWirelessCommType = 0;
}
}
void SetWirelessCommType0(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
gWirelessCommType = 0;
}
}
u32 GetLinkRecvQueueLength(void)
{
if (gWirelessCommType != 0)
{
return GetRfuRecvQueueLength();
}
return gLink.recvQueue.count;
}
bool32 sub_800B504(void)
bool32 IsLinkRecvQueueLengthAtLeast3(void)
{
if (GetLinkRecvQueueLength() > 2)
{
return TRUE;
}
return FALSE;
}
@ -1900,9 +1847,9 @@ u8 GetWirelessCommType(void)
return gWirelessCommType;
}
void sub_800B524(struct LinkPlayer *player)
void ConvertLinkPlayerName(struct LinkPlayer *player)
{
player->progressFlagsCopy = player->progressFlags;
player->progressFlagsCopy = player->progressFlags; // ? Perhaps relocating for a longer name field
ConvertInternationalString(player->name, player->language);
}
@ -2410,9 +2357,7 @@ void ResetSendBuffer(void)
for (i = 0; i < CMD_LENGTH; i++)
{
for (j = 0; j < QUEUE_CAPACITY; j++)
{
gLink.sendQueue.data[i][j] = 0xEFFF;
}
gLink.sendQueue.data[i][j] = LINKCMD_NONE;
}
}
@ -2429,9 +2374,7 @@ void ResetRecvBuffer(void)
for (j = 0; j < CMD_LENGTH; j++)
{
for (k = 0; k < QUEUE_CAPACITY; k++)
{
gLink.recvQueue.data[i][j][k] = 0xEFFF;
}
gLink.recvQueue.data[i][j][k] = LINKCMD_NONE;
}
}
}

View File

@ -1697,7 +1697,7 @@ static void sub_801084C(u8 taskId)
if (AreNoPlayersReceiving())
{
ResetBlockReceivedFlags();
sub_800B348();
LocalLinkPlayerToBlock();
gTasks[taskId].data[0]++;
}
break;
@ -1786,7 +1786,7 @@ static void ReceiveRfuLinkPlayers(const struct SioInfo *sioInfo)
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
gLinkPlayers[i] = sioInfo->linkPlayers[i];
sub_800B524(gLinkPlayers + i);
ConvertLinkPlayerName(gLinkPlayers + i);
}
}
@ -1831,7 +1831,7 @@ static void Task_ExchangeLinkPlayers(u8 taskId)
ResetBlockReceivedFlag(r4);
r2 = (struct LinkPlayerBlock *)gBlockRecvBuffer[r4];
gLinkPlayers[r4] = r2->linkPlayer;
sub_800B524(gLinkPlayers + r4);
ConvertLinkPlayerName(gLinkPlayers + r4);
gTasks[taskId].data[0]++;
}
break;
@ -1887,7 +1887,7 @@ static void sub_8010D0C(u8 taskId)
case 0:
if (Rfu.playerCount)
{
sub_800B348();
LocalLinkPlayerToBlock();
SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock));
gTasks[taskId].data[0]++;
}

View File

@ -1616,6 +1616,9 @@ void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tra
void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
{
u32 unk;
#ifdef UBFIX
unk = 0;
#endif
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
READ_XCMD_BYTE(unk, 1)
@ -1657,18 +1660,12 @@ start_song:
mplayInfo = &gPokemonCryMusicPlayers[i];
mplayInfo->ident++;
#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong))
#define CRY_OFS(field) offsetof(struct PokemonCrySong, field)
gPokemonCrySongs[i] = gPokemonCrySong;
memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong));
*(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone;
*(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0);
*(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1);
*(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont);
#undef CRY_OFS
#undef CRY
gPokemonCrySongs[i].tone = tone;
gPokemonCrySongs[i].part[0] = &gPokemonCrySongs[i].part0;
gPokemonCrySongs[i].part[1] = &gPokemonCrySongs[i].part1;
gPokemonCrySongs[i].gotoTarget = (u32)&gPokemonCrySongs[i].cont;
mplayInfo->ident = ID_NUMBER;

View File

@ -197,8 +197,8 @@ static const u8 * const gBattlePyramid_MapHeaderStrings[] =
gText_Pyramid,
};
// text
bool8 sub_80D47D4(void)
// Unused
static bool8 StartMenu_ShowMapNamePopup(void)
{
HideStartMenu();
ShowMapNamePopup();
@ -333,24 +333,36 @@ static void ShowMapNamePopUpWindow(void)
CopyWindowToVram(GetMapNamePopUpWindowId(), 3);
}
static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
#define TILE_TOP_EDGE_START 0x21D
#define TILE_TOP_EDGE_END 0x228
#define TILE_LEFT_EDGE_TOP 0x229
#define TILE_RIGHT_EDGE_TOP 0x22A
#define TILE_LEFT_EDGE_MID 0x22B
#define TILE_RIGHT_EDGE_MID 0x22C
#define TILE_LEFT_EDGE_BOT 0x22D
#define TILE_RIGHT_EDGE_BOT 0x22E
#define TILE_BOT_EDGE_START 0x22F
#define TILE_BOT_EDGE_END 0x23A
static void DrawMapNamePopUpFrame(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
{
s32 i;
for (i = 0; i < 12; i++)
{
FillBgTilemapBufferRect(bg, 0x21D + i, i - 1 + x, y - 1, 1, 1, 0xE);
}
FillBgTilemapBufferRect(bg, 0x229, x - 1, y, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22A, deltaX + x, y, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22B, x - 1, y + 1 , 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22C, deltaX + x, y + 1, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22D, x - 1, y + 2, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22E, deltaX + x, y + 2, 1, 1, 0xE);
for (i = 0; i < 12; i++)
{
FillBgTilemapBufferRect(bg, 0x22F + i, i - 1 + x, y + deltaY, 1, 1, 0xE);
}
// Draw top edge
for (i = 0; i < 1 + TILE_TOP_EDGE_END - TILE_TOP_EDGE_START; i++)
FillBgTilemapBufferRect(bg, TILE_TOP_EDGE_START + i, i - 1 + x, y - 1, 1, 1, 14);
// Draw sides
FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_TOP, x - 1, y, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_TOP, deltaX + x, y, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_MID, x - 1, y + 1, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_MID, deltaX + x, y + 1, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_BOT, x - 1, y + 2, 1, 1, 14);
FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_BOT, deltaX + x, y + 2, 1, 1, 14);
// Draw bottom edge
for (i = 0; i < 1 + TILE_BOT_EDGE_END - TILE_BOT_EDGE_START; i++)
FillBgTilemapBufferRect(bg, TILE_BOT_EDGE_START + i, i - 1 + x, y + deltaY, 1, 1, 14);
}
static void LoadMapNamePopUpWindowBg(void)
@ -369,7 +381,7 @@ static void LoadMapNamePopUpWindowBg(void)
popUpThemeId = gRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId];
LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_BG), gMapPopUp_Outline_Table[popUpThemeId], 0x400, 0x21D);
CallWindowFunction(popupWindowId, sub_80D4A78);
CallWindowFunction(popupWindowId, DrawMapNamePopUpFrame);
PutWindowTilemap(popupWindowId);
if (gMapHeader.weather == WEATHER_UNDERWATER_BUBBLES)
LoadPalette(&gUnknown_0857F444, 0xE0, 0x20);

View File

@ -425,21 +425,21 @@ static void StartBardSong(bool8 useTemporaryLyrics)
gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics;
}
static void sub_81206F0(void)
static void EnableTextPrinters(void)
{
gUnknown_03002F84 = FALSE;
gDisableTextPrinters = FALSE;
}
static void BardSong_TextSubPrinter(struct TextPrinterTemplate * printer, u16 a1)
static void BardSong_DisableTextPrinters(struct TextPrinterTemplate * printer, u16 a1)
{
gUnknown_03002F84 = TRUE;
gDisableTextPrinters = TRUE;
}
static void sub_8120708(const u8 * src)
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, src, 0, 1, 1, BardSong_TextSubPrinter);
gUnknown_03002F84 = TRUE;
AddTextPrinterParameterized(0, 1, src, 0, 1, 1, BardSong_DisableTextPrinters);
gDisableTextPrinters = TRUE;
CopyWindowToVram(0, 3);
}
@ -620,7 +620,7 @@ static void Task_BardSong(u8 taskId)
else if (gStringVar4[task->tCharIndex] == CHAR_SPACE)
{
sub_81206F0();
EnableTextPrinters();
task->tCharIndex++;
task->tState = 2;
task->data[2] = 0;
@ -640,7 +640,7 @@ static void Task_BardSong(u8 taskId)
else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR)
{
gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space
sub_81206F0();
EnableTextPrinters();
task->tCharIndex++;
task->data[2] = 0;
}
@ -649,7 +649,7 @@ static void Task_BardSong(u8 taskId)
switch (task->data[1])
{
case 0:
sub_81206F0();
EnableTextPrinters();
task->data[1]++;
break;
case 1:

View File

@ -319,7 +319,7 @@ bool8 MenuHelpers_CallLinkSomething(void)
{
if (sub_81221D0() == TRUE)
return TRUE;
else if (sub_800B504() != TRUE)
else if (IsLinkRecvQueueLengthAtLeast3() != TRUE)
return FALSE;
else
return TRUE;

View File

@ -48,8 +48,8 @@ static void Task_StaticCountdown_Free(u8 taskId);
static void Task_StaticCountdown_Start(u8 taskId);
static void Task_StaticCountdown_Run(u8 taskId);
static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/link_games/321start_static.gbapal");
static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link_games/321start_static.4bpp.lz");
static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start_static.gbapal");
static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start_static.4bpp.lz");
static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] =
{
@ -374,8 +374,8 @@ static void CreateStartSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subprior
static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
static void SpriteCB_Start(struct Sprite *sprite);
static const u16 s321Start_Pal[] = INCBIN_U16("graphics/link_games/321start.gbapal");
static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/link_games/321start.4bpp.lz");
static const u16 s321Start_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start.gbapal");
static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start.4bpp.lz");
#define tState data[0]
#define tTilesTag data[2]

View File

@ -75,7 +75,7 @@ static u8 ButtonMode_ProcessInput(u8 selection);
static void ButtonMode_DrawChoices(u8 selection);
static void DrawTextOption(void);
static void DrawOptionMenuTexts(void);
static void sub_80BB154(void);
static void DrawBgWindowFrames(void);
EWRAM_DATA static bool8 sArrowPressed = FALSE;
@ -228,7 +228,7 @@ void CB2_InitOptionMenu(void)
DrawOptionMenuTexts();
gMain.state++;
case 9:
sub_80BB154();
DrawBgWindowFrames();
gMain.state++;
break;
case 10:
@ -642,25 +642,37 @@ static void DrawOptionMenuTexts(void)
CopyWindowToVram(WIN_OPTIONS, 3);
}
static void sub_80BB154(void)
#define TILE_TOP_CORNER_L 0x1A2
#define TILE_TOP_EDGE 0x1A3
#define TILE_TOP_CORNER_R 0x1A4
#define TILE_LEFT_EDGE 0x1A5
#define TILE_RIGHT_EDGE 0x1A7
#define TILE_BOT_CORNER_L 0x1A8
#define TILE_BOT_EDGE 0x1A9
#define TILE_BOT_CORNER_R 0x1AA
static void DrawBgWindowFrames(void)
{
// bg, tileNum, x, y, width, height, pal
FillBgTilemapBufferRect(1, 0x1A2, 1, 0, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A3, 2, 0, 0x1B, 1, 7);
FillBgTilemapBufferRect(1, 0x1A4, 28, 0, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A5, 1, 1, 1, 2, 7);
FillBgTilemapBufferRect(1, 0x1A7, 28, 1, 1, 2, 7);
FillBgTilemapBufferRect(1, 0x1A8, 1, 3, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A9, 2, 3, 0x1B, 1, 7);
FillBgTilemapBufferRect(1, 0x1AA, 28, 3, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A2, 1, 4, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A3, 2, 4, 0x1A, 1, 7);
FillBgTilemapBufferRect(1, 0x1A4, 28, 4, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A5, 1, 5, 1, 0x12, 7);
FillBgTilemapBufferRect(1, 0x1A7, 28, 5, 1, 0x12, 7);
FillBgTilemapBufferRect(1, 0x1A8, 1, 19, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A9, 2, 19, 0x1A, 1, 7);
FillBgTilemapBufferRect(1, 0x1AA, 28, 19, 1, 1, 7);
// bg, tile, x, y, width, height, palNum
// Draw title window frame
FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 0, 1, 1, 7);
FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 0, 27, 1, 7);
FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 28, 0, 1, 1, 7);
FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 1, 1, 2, 7);
FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 28, 1, 1, 2, 7);
FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 3, 1, 1, 7);
FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 3, 27, 1, 7);
FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 28, 3, 1, 1, 7);
// Draw options list window frame
FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 4, 1, 1, 7);
FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 4, 26, 1, 7);
FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 28, 4, 1, 1, 7);
FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 5, 1, 18, 7);
FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 28, 5, 1, 18, 7);
FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 19, 1, 1, 7);
FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 19, 26, 1, 7);
FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 28, 19, 1, 1, 7);
CopyBgTilemapBufferToVram(1);
}

View File

@ -3032,17 +3032,8 @@ static void SpriteCB_PokedexListMonSprite(struct Sprite *sprite)
else
{
u32 var;
sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256;
// UB: possible division by zero
#ifdef UBFIX
if (gSineTable[sprite->data[5] + 64] != 0)
var = 0x10000 / gSineTable[sprite->data[5] + 64];
else
var = 0;
#else
var = 0x10000 / gSineTable[sprite->data[5] + 64];
#endif //UBFIX
var = SAFE_DIV(0x10000, gSineTable[sprite->data[5] + 64]);
if (var > 0xFFFF)
var = 0xFFFF;
SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var);

View File

@ -4649,7 +4649,7 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex,
{ \
friendshipChange = itemEffect[itemEffectParam]; \
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); \
if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) \
if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) \
friendship += 150 * friendshipChange / 100; \
else \
friendship += friendshipChange; \
@ -5828,7 +5828,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
&& (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE))
{
s8 mod = sFriendshipEventModifiers[event][friendshipLevel];
if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP)
mod = (150 * mod) / 100;
friendship += mod;
if (mod > 0)

View File

@ -40,11 +40,14 @@
#include "constants/songs.h"
#include "constants/tv.h"
EWRAM_DATA struct MartInfo gMartInfo = {0};
EWRAM_DATA struct ShopData *gShopDataPtr = NULL;
EWRAM_DATA struct ListMenuItem *gUnknown_02039F74 = NULL;
EWRAM_DATA u8 (*gUnknown_02039F78)[16] = {0};
EWRAM_DATA u8 gMartPurchaseHistoryId = 0;
#define TAG_SCROLL_ARROW 2100
#define TAG_ITEM_ICON_BASE 2110
static EWRAM_DATA struct MartInfo sMartInfo = {0};
static EWRAM_DATA struct ShopData *sShopData = NULL;
static EWRAM_DATA struct ListMenuItem *sListMenuItems = NULL;
static EWRAM_DATA u8 (*sItemNames)[16] = {0};
static EWRAM_DATA u8 sPurchaseHistoryId = 0;
EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0};
static void Task_ShopMenu(u8 taskId);
@ -276,15 +279,15 @@ static u8 CreateShopMenu(u8 martType)
int numMenuItems;
ScriptContext2_Enable();
gMartInfo.martType = martType;
sMartInfo.martType = martType;
if (martType == MART_TYPE_NORMAL)
{
struct WindowTemplate winTemplate;
winTemplate = sShopMenuWindowTemplates[0];
winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuySellQuit, ARRAY_COUNT(sShopMenuActions_BuySellQuit));
gMartInfo.windowId = AddWindow(&winTemplate);
gMartInfo.menuActions = sShopMenuActions_BuySellQuit;
sMartInfo.windowId = AddWindow(&winTemplate);
sMartInfo.menuActions = sShopMenuActions_BuySellQuit;
numMenuItems = ARRAY_COUNT(sShopMenuActions_BuySellQuit);
}
else
@ -292,35 +295,35 @@ static u8 CreateShopMenu(u8 martType)
struct WindowTemplate winTemplate;
winTemplate = sShopMenuWindowTemplates[1];
winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuyQuit, ARRAY_COUNT(sShopMenuActions_BuyQuit));
gMartInfo.windowId = AddWindow(&winTemplate);
gMartInfo.menuActions = sShopMenuActions_BuyQuit;
sMartInfo.windowId = AddWindow(&winTemplate);
sMartInfo.menuActions = sShopMenuActions_BuyQuit;
numMenuItems = ARRAY_COUNT(sShopMenuActions_BuyQuit);
}
SetStandardWindowBorderStyle(gMartInfo.windowId, 0);
PrintMenuTable(gMartInfo.windowId, numMenuItems, gMartInfo.menuActions);
InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gMartInfo.windowId, numMenuItems, 0);
PutWindowTilemap(gMartInfo.windowId);
CopyWindowToVram(gMartInfo.windowId, 1);
SetStandardWindowBorderStyle(sMartInfo.windowId, 0);
PrintMenuTable(sMartInfo.windowId, numMenuItems, sMartInfo.menuActions);
InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sMartInfo.windowId, numMenuItems, 0);
PutWindowTilemap(sMartInfo.windowId);
CopyWindowToVram(sMartInfo.windowId, 1);
return CreateTask(Task_ShopMenu, 8);
}
static void SetShopMenuCallback(void (* callback)(void))
{
gMartInfo.callback = callback;
sMartInfo.callback = callback;
}
static void SetShopItemsForSale(const u16 *items)
{
u16 i = 0;
gMartInfo.itemList = items;
gMartInfo.itemCount = 0;
sMartInfo.itemList = items;
sMartInfo.itemCount = 0;
while (gMartInfo.itemList[i])
while (sMartInfo.itemList[i])
{
gMartInfo.itemCount++;
sMartInfo.itemCount++;
i++;
}
}
@ -337,7 +340,7 @@ static void Task_ShopMenu(u8 taskId)
Task_HandleShopMenuQuit(taskId);
break;
default:
gMartInfo.menuActions[inputCode].func.void_u8(taskId);
sMartInfo.menuActions[inputCode].func.void_u8(taskId);
break;
}
}
@ -368,14 +371,14 @@ void CB2_ExitSellMenu(void)
static void Task_HandleShopMenuQuit(u8 taskId)
{
ClearStdWindowAndFrameToTransparent(gMartInfo.windowId, 2);
RemoveWindow(gMartInfo.windowId);
ClearStdWindowAndFrameToTransparent(sMartInfo.windowId, 2);
RemoveWindow(sMartInfo.windowId);
SaveRecordedItemPurchasesForTVShow();
ScriptContext2_Disable();
DestroyTask(taskId);
if (gMartInfo.callback)
gMartInfo.callback();
if (sMartInfo.callback)
sMartInfo.callback();
}
static void Task_GoToBuyOrSellMenu(u8 taskId)
@ -398,7 +401,7 @@ static void Task_ReturnToShopMenu(u8 taskId)
{
if (IsWeatherNotFadingIn() == TRUE)
{
if (gMartInfo.martType == MART_TYPE_DECOR2)
if (sMartInfo.martType == MART_TYPE_DECOR2)
DisplayItemMessageOnField(taskId, gText_CanIHelpWithAnythingElse, ShowShopMenuAfterExitingBuyOrSellMenu);
else
DisplayItemMessageOnField(taskId, gText_AnythingElseICanHelp, ShowShopMenuAfterExitingBuyOrSellMenu);
@ -407,7 +410,7 @@ static void Task_ReturnToShopMenu(u8 taskId)
static void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId)
{
CreateShopMenu(gMartInfo.martType);
CreateShopMenu(sMartInfo.martType);
DestroyTask(taskId);
}
@ -447,10 +450,10 @@ static void CB2_InitBuyMenu(void)
ResetSpriteData();
ResetTasks();
ClearScheduledBgCopiesToVram();
gShopDataPtr = AllocZeroed(sizeof(struct ShopData));
gShopDataPtr->scrollIndicatorsTaskId = TASK_NONE;
gShopDataPtr->itemSpriteIds[0] = SPRITE_NONE;
gShopDataPtr->itemSpriteIds[1] = SPRITE_NONE;
sShopData = AllocZeroed(sizeof(struct ShopData));
sShopData->scrollIndicatorsTaskId = TASK_NONE;
sShopData->itemSpriteIds[0] = SPRITE_NONE;
sShopData->itemSpriteIds[1] = SPRITE_NONE;
BuyMenuBuildListMenuTemplate();
BuyMenuInitBgs();
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
@ -480,9 +483,9 @@ static void CB2_InitBuyMenu(void)
static void BuyMenuFreeMemory(void)
{
Free(gShopDataPtr);
Free(gUnknown_02039F74);
Free(gUnknown_02039F78);
Free(sShopData);
Free(sListMenuItems);
Free(sItemNames);
FreeAllWindowBuffers();
}
@ -490,29 +493,29 @@ static void BuyMenuBuildListMenuTemplate(void)
{
u16 i;
gUnknown_02039F74 = Alloc((gMartInfo.itemCount + 1) * sizeof(*gUnknown_02039F74));
gUnknown_02039F78 = Alloc((gMartInfo.itemCount + 1) * sizeof(*gUnknown_02039F78));
for (i = 0; i < gMartInfo.itemCount; i++)
BuyMenuSetListEntry(&gUnknown_02039F74[i], gMartInfo.itemList[i], gUnknown_02039F78[i]);
sListMenuItems = Alloc((sMartInfo.itemCount + 1) * sizeof(*sListMenuItems));
sItemNames = Alloc((sMartInfo.itemCount + 1) * sizeof(*sItemNames));
for (i = 0; i < sMartInfo.itemCount; i++)
BuyMenuSetListEntry(&sListMenuItems[i], sMartInfo.itemList[i], sItemNames[i]);
StringCopy(gUnknown_02039F78[i], gText_Cancel2);
gUnknown_02039F74[i].name = gUnknown_02039F78[i];
gUnknown_02039F74[i].id = -2;
StringCopy(sItemNames[i], gText_Cancel2);
sListMenuItems[i].name = sItemNames[i];
sListMenuItems[i].id = LIST_CANCEL;
gMultiuseListMenuTemplate = sShopBuyMenuListTemplate;
gMultiuseListMenuTemplate.items = gUnknown_02039F74;
gMultiuseListMenuTemplate.totalItems = gMartInfo.itemCount + 1;
gMultiuseListMenuTemplate.items = sListMenuItems;
gMultiuseListMenuTemplate.totalItems = sMartInfo.itemCount + 1;
if (gMultiuseListMenuTemplate.totalItems > 8)
gMultiuseListMenuTemplate.maxShowed = 8;
else
gMultiuseListMenuTemplate.maxShowed = gMultiuseListMenuTemplate.totalItems;
gShopDataPtr->itemsShowed = gMultiuseListMenuTemplate.maxShowed;
sShopData->itemsShowed = gMultiuseListMenuTemplate.maxShowed;
}
static void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *name)
{
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
CopyItemName(item, name);
else
StringCopy(name, gDecorations[item].name);
@ -527,16 +530,16 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, s
if (onInit != TRUE)
PlaySE(SE_SELECT);
if (item != -2)
BuyMenuAddItemIcon(item, gShopDataPtr->iconSlot);
if (item != LIST_CANCEL)
BuyMenuAddItemIcon(item, sShopData->iconSlot);
else
BuyMenuAddItemIcon(-1, gShopDataPtr->iconSlot);
BuyMenuAddItemIcon(-1, sShopData->iconSlot);
BuyMenuRemoveItemIcon(item, gShopDataPtr->iconSlot ^ 1);
gShopDataPtr->iconSlot ^= 1;
if (item != -2)
BuyMenuRemoveItemIcon(item, sShopData->iconSlot ^ 1);
sShopData->iconSlot ^= 1;
if (item != LIST_CANCEL)
{
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
description = ItemId_GetDescription(item);
else
description = gDecorations[item].description;
@ -554,9 +557,9 @@ static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y)
{
u8 x;
if (item != -2)
if (item != LIST_CANCEL)
{
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
{
ConvertIntToDecimalStringN(
gStringVar1,
@ -581,26 +584,26 @@ static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y)
static void BuyMenuAddScrollIndicatorArrows(void)
{
if (gShopDataPtr->scrollIndicatorsTaskId == TASK_NONE && gMartInfo.itemCount + 1 > 8)
if (sShopData->scrollIndicatorsTaskId == TASK_NONE && sMartInfo.itemCount + 1 > 8)
{
gShopDataPtr->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(
sShopData->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(
SCROLL_ARROW_UP,
0xAC,
0xC,
0x94,
gMartInfo.itemCount - 7,
2100,
2100,
&gShopDataPtr->scrollOffset);
172,
12,
148,
sMartInfo.itemCount - 7,
TAG_SCROLL_ARROW,
TAG_SCROLL_ARROW,
&sShopData->scrollOffset);
}
}
static void BuyMenuRemoveScrollIndicatorArrows(void)
{
if (gShopDataPtr->scrollIndicatorsTaskId != TASK_NONE)
if (sShopData->scrollIndicatorsTaskId != TASK_NONE)
{
RemoveScrollIndicatorArrowPair(gShopDataPtr->scrollIndicatorsTaskId);
gShopDataPtr->scrollIndicatorsTaskId = TASK_NONE;
RemoveScrollIndicatorArrowPair(sShopData->scrollIndicatorsTaskId);
sShopData->scrollIndicatorsTaskId = TASK_NONE;
}
}
@ -613,13 +616,13 @@ static void BuyMenuPrintCursor(u8 scrollIndicatorsTaskId, u8 colorSet)
static void BuyMenuAddItemIcon(u16 item, u8 iconSlot)
{
u8 spriteId;
u8 *spriteIdPtr = &gShopDataPtr->itemSpriteIds[iconSlot];
u8 *spriteIdPtr = &sShopData->itemSpriteIds[iconSlot];
if (*spriteIdPtr != SPRITE_NONE)
return;
if (gMartInfo.martType == MART_TYPE_NORMAL || item == 0xFFFF)
if (sMartInfo.martType == MART_TYPE_NORMAL || item == 0xFFFF)
{
spriteId = AddItemIconSprite(iconSlot + 2110, iconSlot + 2110, item);
spriteId = AddItemIconSprite(iconSlot + TAG_ITEM_ICON_BASE, iconSlot + TAG_ITEM_ICON_BASE, item);
if (spriteId != MAX_SPRITES)
{
*spriteIdPtr = spriteId;
@ -629,7 +632,7 @@ static void BuyMenuAddItemIcon(u16 item, u8 iconSlot)
}
else
{
spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + 2110, iconSlot + 2110);
spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + TAG_ITEM_ICON_BASE, iconSlot + TAG_ITEM_ICON_BASE);
if (spriteId != MAX_SPRITES)
*spriteIdPtr = spriteId;
}
@ -637,12 +640,12 @@ static void BuyMenuAddItemIcon(u16 item, u8 iconSlot)
static void BuyMenuRemoveItemIcon(u16 item, u8 iconSlot)
{
u8 *spriteIdPtr = &gShopDataPtr->itemSpriteIds[iconSlot];
u8 *spriteIdPtr = &sShopData->itemSpriteIds[iconSlot];
if (*spriteIdPtr == SPRITE_NONE)
return;
FreeSpriteTilesByTag(iconSlot + 2110);
FreeSpritePaletteByTag(iconSlot + 2110);
FreeSpriteTilesByTag(iconSlot + TAG_ITEM_ICON_BASE);
FreeSpritePaletteByTag(iconSlot + TAG_ITEM_ICON_BASE);
DestroySprite(&gSprites[*spriteIdPtr]);
*spriteIdPtr = SPRITE_NONE;
}
@ -651,9 +654,9 @@ static void BuyMenuInitBgs(void)
{
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sShopBuyMenuBgTemplates, ARRAY_COUNT(sShopBuyMenuBgTemplates));
SetBgTilemapBuffer(1, gShopDataPtr->tilemapBuffers[1]);
SetBgTilemapBuffer(2, gShopDataPtr->tilemapBuffers[3]);
SetBgTilemapBuffer(3, gShopDataPtr->tilemapBuffers[2]);
SetBgTilemapBuffer(1, sShopData->tilemapBuffers[1]);
SetBgTilemapBuffer(2, sShopData->tilemapBuffers[3]);
SetBgTilemapBuffer(3, sShopData->tilemapBuffers[2]);
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
@ -673,7 +676,7 @@ static void BuyMenuInitBgs(void)
static void BuyMenuDecompressBgGraphics(void)
{
DecompressAndCopyTileDataToVram(1, gBuyMenuFrame_Gfx, 0x3A0, 0x3E3, 0);
LZDecompressWram(gBuyMenuFrame_Tilemap, gShopDataPtr->tilemapBuffers[0]);
LZDecompressWram(gBuyMenuFrame_Tilemap, sShopData->tilemapBuffers[0]);
LoadCompressedPalette(gMenuMoneyPal, 0xC0, 0x20);
}
@ -763,16 +766,16 @@ static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLaye
switch (metatileLayerType)
{
case 0:
BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[3], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[1], offset1, offset2, src + 4);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[3], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[1], offset1, offset2, src + 4);
break;
case 1:
BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[2], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[3], offset1, offset2, src + 4);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[2], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[3], offset1, offset2, src + 4);
break;
case 2:
BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[2], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[1], offset1, offset2, src + 4);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[2], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[1], offset1, offset2, src + 4);
break;
}
}
@ -796,7 +799,7 @@ static void BuyMenuCollectObjectEventData(void)
GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY);
for (y = 0; y < OBJECT_EVENTS_COUNT; y++)
gShopDataPtr->viewportObjects[y][OBJ_EVENT_ID] = OBJECT_EVENTS_COUNT;
sShopData->viewportObjects[y][OBJ_EVENT_ID] = OBJECT_EVENTS_COUNT;
for (y = 0; y < 5; y++)
{
for (x = 0; x < 7; x++)
@ -805,25 +808,25 @@ static void BuyMenuCollectObjectEventData(void)
if (objEventId != OBJECT_EVENTS_COUNT)
{
gShopDataPtr->viewportObjects[r8][OBJ_EVENT_ID] = objEventId;
gShopDataPtr->viewportObjects[r8][X_COORD] = x;
gShopDataPtr->viewportObjects[r8][Y_COORD] = y;
gShopDataPtr->viewportObjects[r8][LAYER_TYPE] = MapGridGetMetatileLayerTypeAt(facingX - 4 + x, facingY - 2 + y);
sShopData->viewportObjects[r8][OBJ_EVENT_ID] = objEventId;
sShopData->viewportObjects[r8][X_COORD] = x;
sShopData->viewportObjects[r8][Y_COORD] = y;
sShopData->viewportObjects[r8][LAYER_TYPE] = MapGridGetMetatileLayerTypeAt(facingX - 4 + x, facingY - 2 + y);
switch (gObjectEvents[objEventId].facingDirection)
{
case DIR_SOUTH:
gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 0;
sShopData->viewportObjects[r8][ANIM_NUM] = 0;
break;
case DIR_NORTH:
gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 1;
sShopData->viewportObjects[r8][ANIM_NUM] = 1;
break;
case DIR_WEST:
gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 2;
sShopData->viewportObjects[r8][ANIM_NUM] = 2;
break;
case DIR_EAST:
default:
gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 3;
sShopData->viewportObjects[r8][ANIM_NUM] = 3;
break;
}
r8++;
@ -840,25 +843,25 @@ static void BuyMenuDrawObjectEvents(void)
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
if (gShopDataPtr->viewportObjects[i][OBJ_EVENT_ID] == OBJECT_EVENTS_COUNT)
if (sShopData->viewportObjects[i][OBJ_EVENT_ID] == OBJECT_EVENTS_COUNT)
continue;
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[gShopDataPtr->viewportObjects[i][OBJ_EVENT_ID]].graphicsId);
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[sShopData->viewportObjects[i][OBJ_EVENT_ID]].graphicsId);
spriteId = AddPseudoObjectEvent(
gObjectEvents[gShopDataPtr->viewportObjects[i][OBJ_EVENT_ID]].graphicsId,
gObjectEvents[sShopData->viewportObjects[i][OBJ_EVENT_ID]].graphicsId,
SpriteCallbackDummy,
(u16)gShopDataPtr->viewportObjects[i][X_COORD] * 16 + 8,
(u16)gShopDataPtr->viewportObjects[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2,
(u16)sShopData->viewportObjects[i][X_COORD] * 16 + 8,
(u16)sShopData->viewportObjects[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2,
2);
if (BuyMenuCheckIfObjectEventOverlapsMenuBg(gShopDataPtr->viewportObjects[i]) == TRUE)
if (BuyMenuCheckIfObjectEventOverlapsMenuBg(sShopData->viewportObjects[i]) == TRUE)
{
gSprites[spriteId].subspriteTableNum = 4;
gSprites[spriteId].subspriteMode = SUBSPRITES_ON;
}
StartSpriteAnim(&gSprites[spriteId], gShopDataPtr->viewportObjects[i][ANIM_NUM]);
StartSpriteAnim(&gSprites[spriteId], sShopData->viewportObjects[i][ANIM_NUM]);
}
}
@ -877,8 +880,8 @@ static bool8 BuyMenuCheckIfObjectEventOverlapsMenuBg(s16 *object)
static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void)
{
s16 i;
u16 *dest = gShopDataPtr->tilemapBuffers[1];
const u16 *src = gShopDataPtr->tilemapBuffers[0];
u16 *dest = sShopData->tilemapBuffers[1];
const u16 *src = sShopData->tilemapBuffers[0];
for (i = 0; i < 1024; i++)
{
@ -891,7 +894,7 @@ static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void)
static bool8 BuyMenuCheckForOverlapWithMenuBg(int x, int y)
{
const u16 *metatile = gShopDataPtr->tilemapBuffers[0];
const u16 *metatile = sShopData->tilemapBuffers[0];
int offset1 = x * 2;
int offset2 = y * 64;
@ -913,7 +916,7 @@ static void Task_BuyMenu(u8 taskId)
if (!gPaletteFade.active)
{
s32 itemId = ListMenu_ProcessInput(tListTaskId);
ListMenuGetScrollAndRow(tListTaskId, &gShopDataPtr->scrollOffset, &gShopDataPtr->selectedRow);
ListMenuGetScrollAndRow(tListTaskId, &sShopData->scrollOffset, &sShopData->selectedRow);
switch (itemId)
{
@ -930,22 +933,22 @@ static void Task_BuyMenu(u8 taskId)
BuyMenuRemoveScrollIndicatorArrows();
BuyMenuPrintCursor(tListTaskId, 2);
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
{
gShopDataPtr->totalCost = (ItemId_GetPrice(itemId) >> GetPriceReduction(POKENEWS_SLATEPORT));
sShopData->totalCost = (ItemId_GetPrice(itemId) >> GetPriceReduction(POKENEWS_SLATEPORT));
}
else
{
gShopDataPtr->totalCost = gDecorations[itemId].price;
sShopData->totalCost = gDecorations[itemId].price;
}
if (!IsEnoughMoney(&gSaveBlock1Ptr->money, gShopDataPtr->totalCost))
if (!IsEnoughMoney(&gSaveBlock1Ptr->money, sShopData->totalCost))
{
BuyMenuDisplayMessage(taskId, gText_YouDontHaveMoney, BuyMenuReturnToItemList);
}
else
{
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
{
CopyItemName(itemId, gStringVar1);
if (ItemId_GetPocket(itemId) == POCKET_TM_HM)
@ -961,9 +964,9 @@ static void Task_BuyMenu(u8 taskId)
else
{
StringCopy(gStringVar1, gDecorations[itemId].name);
ConvertIntToDecimalStringN(gStringVar2, gShopDataPtr->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6);
ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6);
if (gMartInfo.martType == MART_TYPE_DECOR)
if (sMartInfo.martType == MART_TYPE_DECOR)
StringExpandPlaceholders(gStringVar4, gText_Var1IsItThatllBeVar2);
else // MART_TYPE_DECOR2
StringExpandPlaceholders(gStringVar4, gText_YouWantedVar1ThatllBeVar2);
@ -992,15 +995,15 @@ static void Task_BuyHowManyDialogueInit(u8 taskId)
BuyMenuPrintItemQuantityAndPrice(taskId);
ScheduleBgCopyTilemapToVram(0);
maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / gShopDataPtr->totalCost;
maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / sShopData->totalCost;
if (maxQuantity > MAX_BAG_ITEM_CAPACITY)
{
gShopDataPtr->maxQuantity = MAX_BAG_ITEM_CAPACITY;
sShopData->maxQuantity = MAX_BAG_ITEM_CAPACITY;
}
else
{
gShopDataPtr->maxQuantity = maxQuantity;
sShopData->maxQuantity = maxQuantity;
}
gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput;
@ -1010,9 +1013,9 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (AdjustQuantityAccordingToDPadInput(&tItemCount, gShopDataPtr->maxQuantity) == TRUE)
if (AdjustQuantityAccordingToDPadInput(&tItemCount, sShopData->maxQuantity) == TRUE)
{
gShopDataPtr->totalCost = (ItemId_GetPrice(tItemId) >> GetPriceReduction(POKENEWS_SLATEPORT)) * tItemCount;
sShopData->totalCost = (ItemId_GetPrice(tItemId) >> GetPriceReduction(POKENEWS_SLATEPORT)) * tItemCount;
BuyMenuPrintItemQuantityAndPrice(taskId);
}
else
@ -1027,7 +1030,7 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId)
PutWindowTilemap(1);
CopyItemName(tItemId, gStringVar1);
ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, BAG_ITEM_CAPACITY_DIGITS);
ConvertIntToDecimalStringN(gStringVar3, gShopDataPtr->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6);
ConvertIntToDecimalStringN(gStringVar3, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6);
BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, BuyMenuConfirmPurchase);
}
else if (JOY_NEW(B_BUTTON))
@ -1053,7 +1056,7 @@ static void BuyMenuTryMakePurchase(u8 taskId)
PutWindowTilemap(1);
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
{
if (AddBagItem(tItemId, tItemCount) == TRUE)
{
@ -1069,7 +1072,7 @@ static void BuyMenuTryMakePurchase(u8 taskId)
{
if (DecorationAdd(tItemId))
{
if (gMartInfo.martType == MART_TYPE_DECOR)
if (sMartInfo.martType == MART_TYPE_DECOR)
BuyMenuDisplayMessage(taskId, gText_ThankYouIllSendItHome, BuyMenuSubtractMoney);
else // MART_TYPE_DECOR2
BuyMenuDisplayMessage(taskId, gText_ThanksIllSendItHome, BuyMenuSubtractMoney);
@ -1084,11 +1087,11 @@ static void BuyMenuTryMakePurchase(u8 taskId)
static void BuyMenuSubtractMoney(u8 taskId)
{
IncrementGameStat(GAME_STAT_SHOPPED);
RemoveMoney(&gSaveBlock1Ptr->money, gShopDataPtr->totalCost);
RemoveMoney(&gSaveBlock1Ptr->money, sShopData->totalCost);
PlaySE(SE_SHOP);
PrintMoneyAmountInMoneyBox(0, GetMoney(&gSaveBlock1Ptr->money), 0);
if (gMartInfo.martType == MART_TYPE_NORMAL)
if (sMartInfo.martType == MART_TYPE_NORMAL)
{
gTasks[taskId].func = Task_ReturnToItemListAfterItemPurchase;
}
@ -1143,7 +1146,7 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId)
s16 *data = gTasks[taskId].data;
FillWindowPixelBuffer(4, PIXEL_FILL(1));
PrintMoneyAmount(4, 38, 1, gShopDataPtr->totalCost, TEXT_SPEED_FF);
PrintMoneyAmount(4, 38, 1, sShopData->totalCost, TEXT_SPEED_FF);
ConvertIntToDecimalStringN(gStringVar1, tItemCount, STR_CONV_MODE_LEADING_ZEROS, BAG_ITEM_CAPACITY_DIGITS);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
BuyMenuPrint(4, gStringVar4, 0, 1, 0, 0);
@ -1169,7 +1172,7 @@ static void Task_ExitBuyMenu(u8 taskId)
static void ClearItemPurchases(void)
{
gMartPurchaseHistoryId = 0;
sPurchaseHistoryId = 0;
memset(gMartPurchaseHistory, 0, sizeof(gMartPurchaseHistory));
}
@ -1179,27 +1182,23 @@ static void RecordItemPurchase(u8 taskId)
u16 i;
for (i = 0; i < 3; i++)
for (i = 0; i < ARRAY_COUNT(gMartPurchaseHistory); i++)
{
if (gMartPurchaseHistory[i].itemId == tItemId && gMartPurchaseHistory[i].quantity != 0)
{
if (gMartPurchaseHistory[i].quantity + tItemCount > 255)
{
gMartPurchaseHistory[i].quantity = 255;
}
else
{
gMartPurchaseHistory[i].quantity += tItemCount;
}
return;
}
}
if (gMartPurchaseHistoryId < 3)
if (sPurchaseHistoryId < ARRAY_COUNT(gMartPurchaseHistory))
{
gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = tItemId;
gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = tItemCount;
gMartPurchaseHistoryId++;
gMartPurchaseHistory[sPurchaseHistoryId].itemId = tItemId;
gMartPurchaseHistory[sPurchaseHistoryId].quantity = tItemCount;
sPurchaseHistoryId++;
}
}

View File

@ -170,7 +170,7 @@ static const struct MenuAction sStartMenuItems[] =
{gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}}
};
static const struct BgTemplate sUnknown_085105A8[] =
static const struct BgTemplate sBgTemplates_LinkBattleSave[] =
{
{
.bg = 0,
@ -183,13 +183,29 @@ static const struct BgTemplate sUnknown_085105A8[] =
}
};
static const struct WindowTemplate sUnknown_085105AC[] =
static const struct WindowTemplate sWindowTemplates_LinkBattleSave[] =
{
{0, 2, 0xF, 0x1A, 4, 0xF, 0x194},
{
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 15,
.width = 26,
.height = 4,
.paletteNum = 15,
.baseBlock = 0x194
},
DUMMY_WIN_TEMPLATE
};
static const struct WindowTemplate sSaveInfoWindowTemplate = {0, 1, 1, 0xE, 0xA, 0xF, 8};
static const struct WindowTemplate sSaveInfoWindowTemplate = {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
.width = 14,
.height = 10,
.paletteNum = 15,
.baseBlock = 8
};
// Local functions
static void BuildStartMenuActions(void);
@ -211,13 +227,13 @@ static void CreateStartMenuTask(TaskFunc followupFunc);
static void InitSave(void);
static u8 RunSaveCallback(void);
static void ShowSaveMessage(const u8 *message, u8 (*saveCallback)(void));
static void sub_80A0014(void);
static void HideSaveMessageWindow(void);
static void HideSaveInfoWindow(void);
static void SaveStartTimer(void);
static bool8 SaveSuccesTimer(void);
static bool8 SaveErrorTimer(void);
static void InitBattlePyramidRetire(void);
static void sub_80A03D8(void);
static void VBlankCB_LinkBattleSave(void);
static bool32 InitSaveWindowAfterLinkBattle(u8 *par1);
static void CB2_SaveAfterLinkBattle(void);
static void ShowSaveInfoWindow(void);
@ -887,7 +903,7 @@ static void SaveGameTask(u8 taskId)
EnableBothScriptContexts();
}
static void sub_80A0014(void)
static void HideSaveMessageWindow(void)
{
ClearDialogWindowAndFrame(0, TRUE);
}
@ -982,7 +998,7 @@ static u8 SaveConfirmInputCallback(void)
case -1: // B Button
case 1: // No
HideSaveInfoWindow();
sub_80A0014();
HideSaveMessageWindow();
return SAVE_CANCELED;
}
@ -1028,7 +1044,7 @@ static u8 SaveOverwriteInputCallback(void)
case -1: // B Button
case 1: // No
HideSaveInfoWindow();
sub_80A0014();
HideSaveMessageWindow();
return SAVE_CANCELED;
}
@ -1146,14 +1162,14 @@ static u8 BattlePyramidRetireInputCallback(void)
return SAVE_CANCELED;
case -1: // B Button
case 1: // No
sub_80A0014();
HideSaveMessageWindow();
return SAVE_SUCCESS;
}
return SAVE_IN_PROGRESS;
}
static void sub_80A03D8(void)
static void VBlankCB_LinkBattleSave(void)
{
TransferPlttBuffer();
}
@ -1167,7 +1183,7 @@ static bool32 InitSaveWindowAfterLinkBattle(u8 *state)
SetVBlankCallback(NULL);
ScanlineEffect_Stop();
DmaClear16(3, PLTT, PLTT_SIZE);
DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);
break;
case 1:
ResetSpriteData();
@ -1177,15 +1193,15 @@ static bool32 InitSaveWindowAfterLinkBattle(u8 *state)
break;
case 2:
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sUnknown_085105A8, ARRAY_COUNT(sUnknown_085105A8));
InitWindows(sUnknown_085105AC);
InitBgsFromTemplates(0, sBgTemplates_LinkBattleSave, ARRAY_COUNT(sBgTemplates_LinkBattleSave));
InitWindows(sWindowTemplates_LinkBattleSave);
LoadUserWindowBorderGfx_(0, 8, 224);
Menu_LoadStdPalAt(240);
break;
case 3:
ShowBg(0);
BlendPalettes(-1, 16, 0);
SetVBlankCallback(sub_80A03D8);
SetVBlankCallback(VBlankCB_LinkBattleSave);
EnableInterrupts(1);
break;
case 4:

View File

@ -1292,7 +1292,7 @@ const u8 gText_MatchCallMay_Intro1[] = _("My POKéMON and I help");
const u8 gText_MatchCallMay_Intro2[] = _("my father's research.");
const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!");
const u8 gText_NicknameHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?");
ALIGNED(4) const u8 gText_ReadyToBerryCrush[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p");
ALIGNED(4) const u8 gText_ReadyPickBerry[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p");
ALIGNED(4) const u8 gText_WaitForAllChooseBerry[] = _("Please wait while each member\nchooses a BERRY.");
ALIGNED(4) const u8 gText_EndedWithXUnitsPowder[] = _("{PAUSE_MUSIC}{PLAY_BGM MUS_LEVEL_UP}You ended up with {STR_VAR_1} units of\nsilky-smooth BERRY POWDER.{RESUME_MUSIC}\pYour total amount of BERRY POWDER\nis {STR_VAR_2}.\p");
ALIGNED(4) const u8 gText_RecordingGameResults[] = _("Recording your game results in the\nsave file.\lPlease wait.");

View File

@ -1160,12 +1160,12 @@ static void ReactToLinkTradeData(u8 mpId, u8 status)
{
switch (gBlockRecvBuffer[0][0])
{
case LINKCMD_CANCEL_TRADE:
case LINKCMD_BOTH_CANCEL_TRADE:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
PrintTradeMessage(TRADE_MSG_WAITING_FOR_FRIEND);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_1;
break;
case LINKCMD_0xEECC:
case LINKCMD_PARTNER_CANCEL_TRADE:
PrintTradeMessage(TRADE_MSG_FRIEND_WANTS_TO_TRADE);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_REDRAW_MAIN_MENU;
break;
@ -1180,7 +1180,7 @@ static void ReactToLinkTradeData(u8 mpId, u8 status)
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_LINK_TRADE_WAIT_FADE;
break;
case LINKCMD_0xDDEE:
case LINKCMD_PLAYER_CANCEL_TRADE:
PrintTradeMessage(TRADE_MSG_CANCELED);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_REDRAW_MAIN_MENU;
}
@ -1208,7 +1208,7 @@ static void QueueLinkTradeData(void)
&& sTradeMenuData->partnerLinkFlagChoseAction == WANTS_TO_CANCEL)
{
PrintTradeMessage(TRADE_MSG_CANCELED);
sTradeMenuData->linkData[0] = LINKCMD_0xEECC;
sTradeMenuData->linkData[0] = LINKCMD_PARTNER_CANCEL_TRADE;
sTradeMenuData->linkData[1] = 0;
QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA);
sTradeMenuData->playerLinkFlagStatus = sTradeMenuData->partnerLinkFlagStatus = 0;
@ -1219,7 +1219,7 @@ static void QueueLinkTradeData(void)
&& sTradeMenuData->partnerLinkFlagChoseAction == WANTS_TO_TRADE)
{
PrintTradeMessage(TRADE_MSG_FRIEND_WANTS_TO_TRADE);
sTradeMenuData->linkData[0] = LINKCMD_0xDDEE;
sTradeMenuData->linkData[0] = LINKCMD_PLAYER_CANCEL_TRADE;
sTradeMenuData->linkData[1] = 0;
QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA);
sTradeMenuData->playerLinkFlagStatus = sTradeMenuData->partnerLinkFlagStatus = 0;
@ -1229,7 +1229,7 @@ static void QueueLinkTradeData(void)
else if (sTradeMenuData->playerLinkFlagChoseAction == WANTS_TO_CANCEL
&& sTradeMenuData->partnerLinkFlagChoseAction == WANTS_TO_CANCEL)
{
sTradeMenuData->linkData[0] = LINKCMD_CANCEL_TRADE;
sTradeMenuData->linkData[0] = LINKCMD_BOTH_CANCEL_TRADE;
sTradeMenuData->linkData[1] = 0;
QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA);
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
@ -1255,7 +1255,7 @@ static void QueueLinkTradeData(void)
|| sTradeMenuData->partnerLinkFlagStatus == CANCEL_TRADE)
{
PrintTradeMessage(TRADE_MSG_CANCELED);
sTradeMenuData->linkData[0] = LINKCMD_0xDDEE;
sTradeMenuData->linkData[0] = LINKCMD_PLAYER_CANCEL_TRADE;
sTradeMenuData->linkData[1] = 0;
QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA);
sTradeMenuData->playerLinkFlagStatus = 0;

View File

@ -80,7 +80,7 @@ struct TrainerCardData
u8 cardTiles[0x2300];
u16 cardTilemapBuffer[0x1000];
u16 bgTilemapBuffer[0x1000];
u16 var_7CA8;
u16 cardTop;
u8 language;
};
@ -113,7 +113,7 @@ static void SetPlayerCardData(struct TrainerCard*, u8);
static void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard*);
static u8 VersionToCardType(u8);
static void SetDataFromTrainerCard(void);
static void HandleGpuRegs(void);
static void InitGpuRegs(void);
static void ResetGpuRegs(void);
static void InitBgsAndWindows(void);
static void SetTrainerCardCb2(void);
@ -158,31 +158,30 @@ static bool8 Task_DrawFlippedCardSide(struct Task* task);
static bool8 Task_SetCardFlipped(struct Task* task);
static bool8 Task_AnimateCardFlipUp(struct Task* task);
static bool8 Task_EndCardFlip(struct Task* task);
static void sub_80C32EC(u16);
static void UpdateCardFlipRegs(u16);
static void LoadMonIconGfx(void);
// const rom data
static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz");
static const u16 sUnused_0856F18C[] = INCBIN_U16("graphics/trainer_card/unknown_56F18C.gbapal");
static const u16 sHoennTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal");
static const u16 sKantoTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal");
static const u16 sHoennTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal");
static const u16 sKantoTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal");
static const u16 sHoennTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal");
static const u16 sKantoTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal");
static const u16 sHoennTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal");
static const u16 sKantoTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal");
static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz");
static const u16 sUnused_Pal[] = INCBIN_U16("graphics/trainer_card/unused.gbapal");
static const u16 sHoennTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal");
static const u16 sKantoTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal");
static const u16 sHoennTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal");
static const u16 sKantoTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal");
static const u16 sHoennTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal");
static const u16 sKantoTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal");
static const u16 sHoennTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal");
static const u16 sKantoTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal");
static const u16 sHoennTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg.gbapal");
static const u16 sKantoTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg_fr.gbapal");
static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal");
static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal");
static const u16 sTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal");
static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal");
static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal");
static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal");
static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal");
static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz");
static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz");
static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal");
static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal");
static const u16 sTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal");
static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal");
static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal");
static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal");
static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal");
static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz");
static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz");
static const struct BgTemplate sTrainerCardBgTemplates[4] =
{
@ -321,7 +320,6 @@ static bool8 (*const sTrainerCardFlipTasks[])(struct Task *) =
Task_EndCardFlip,
};
// code
static void VblankCb_TrainerCard(void)
{
LoadOam();
@ -620,7 +618,7 @@ static void CB2_InitTrainerCard(void)
gMain.state++;
break;
case 8:
HandleGpuRegs();
InitGpuRegs();
gMain.state++;
break;
case 9:
@ -841,7 +839,7 @@ static void SetDataFromTrainerCard(void)
}
}
static void HandleGpuRegs(void)
static void InitGpuRegs(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ShowBg(0);
@ -852,24 +850,23 @@ static void HandleGpuRegs(void)
SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);
SetGpuReg(REG_OFFSET_WIN0V, 160);
SetGpuReg(REG_OFFSET_WIN0H, 240);
SetGpuReg(REG_OFFSET_WIN0V, DISPLAY_HEIGHT);
SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);
if (gReceivedRemoteLinkPlayers)
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
else
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
}
// Part of animating card flip
static void sub_80C32EC(u16 arg0)
static void UpdateCardFlipRegs(u16 cardTop)
{
s8 quotient = (arg0 + 40) / 10;
s8 blendY = (cardTop + 40) / 10;
if (quotient <= 4)
quotient = 0;
sData->flipBlendY = quotient;
if (blendY <= 4)
blendY = 0;
sData->flipBlendY = blendY;
SetGpuReg(REG_OFFSET_BLDY, sData->flipBlendY);
SetGpuReg(REG_OFFSET_WIN0V, (sData->var_7CA8 * 256) | (160 - sData->var_7CA8));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(sData->cardTop, DISPLAY_HEIGHT - sData->cardTop));
}
static void ResetGpuRegs(void)
@ -1578,6 +1575,7 @@ u8 GetTrainerCardStars(u8 cardId)
}
#define tFlipState data[0]
#define tCardTop data[1]
static void FlipTrainerCard(void)
{
@ -1608,41 +1606,43 @@ static bool8 Task_BeginCardFlip(struct Task* task)
HideBg(3);
ScanlineEffect_Stop();
ScanlineEffect_Clear();
for (i = 0; i < 160; i++)
for (i = 0; i < DISPLAY_HEIGHT; i++)
gScanlineEffectRegBuffers[1][i] = 0;
task->tFlipState++;
return FALSE;
}
// Note: Cannot be DISPLAY_HEIGHT / 2, or cardHeight will be 0
#define CARD_FLIP_Y ((DISPLAY_HEIGHT / 2) - 3)
static bool8 Task_AnimateCardFlipDown(struct Task* task)
{
u32 r4, r5, r10, r7, r6, var_24, r9, var;
u32 cardHeight, r5, r10, cardTop, r6, var_24, cardBottom, var;
s16 i;
sData->allowDMACopy = FALSE;
if (task->data[1] >= 77)
task->data[1] = 77;
if (task->tCardTop >= CARD_FLIP_Y)
task->tCardTop = CARD_FLIP_Y;
else
task->data[1] += 7;
task->tCardTop += 7;
sData->var_7CA8 = task->data[1];
sub_80C32EC(task->data[1]);
sData->cardTop = task->tCardTop;
UpdateCardFlipRegs(task->tCardTop);
// ???
r7 = task->data[1];
r9 = 160 - r7;
r4 = r9 - r7;
r6 = -r7 << 16;
r5 = 0xA00000 / r4;
r5 += 0xFFFF0000;
cardTop = task->tCardTop;
cardBottom = DISPLAY_HEIGHT - cardTop;
cardHeight = cardBottom - cardTop;
r6 = -cardTop << 16;
r5 = (DISPLAY_HEIGHT << 16) / cardHeight;
r5 -= 1 << 16;
var_24 = r6;
var_24 += r5 * r4;
r10 = r5 / r4;
var_24 += r5 * cardHeight;
r10 = r5 / cardHeight;
r5 *= 2;
for (i = 0; i < r7; i++)
for (i = 0; i < cardTop; i++)
gScanlineEffectRegBuffers[0][i] = -i;
for (; i < (s16)(r9); i++)
for (; i < (s16)cardBottom; i++)
{
var = r6 >> 16;
r6 += r5;
@ -1650,11 +1650,11 @@ static bool8 Task_AnimateCardFlipDown(struct Task* task)
gScanlineEffectRegBuffers[0][i] = var;
}
var = var_24 >> 16;
for (; i < 160; i++)
for (; i < DISPLAY_HEIGHT; i++)
gScanlineEffectRegBuffers[0][i] = var;
sData->allowDMACopy = TRUE;
if (task->data[1] >= 77)
if (task->tCardTop >= CARD_FLIP_Y)
task->tFlipState++;
return FALSE;
@ -1736,33 +1736,32 @@ static bool8 Task_SetCardFlipped(struct Task* task)
static bool8 Task_AnimateCardFlipUp(struct Task* task)
{
u32 r4, r5, r10, r7, r6, var_24, r9, var;
u32 cardHeight, r5, r10, cardTop, r6, var_24, cardBottom, var;
s16 i;
sData->allowDMACopy = FALSE;
if (task->data[1] <= 5)
task->data[1] = 0;
if (task->tCardTop <= 5)
task->tCardTop = 0;
else
task->data[1] -= 5;
task->tCardTop -= 5;
sData->var_7CA8 = task->data[1];
sub_80C32EC(task->data[1]);
sData->cardTop = task->tCardTop;
UpdateCardFlipRegs(task->tCardTop);
// ???
r7 = task->data[1];
r9 = 160 - r7;
r4 = r9 - r7;
r6 = -r7 << 16;
r5 = 0xA00000 / r4;
r5 += 0xFFFF0000;
cardTop = task->tCardTop;
cardBottom = DISPLAY_HEIGHT - cardTop;
cardHeight = cardBottom - cardTop;
r6 = -cardTop << 16;
r5 = (DISPLAY_HEIGHT << 16) / cardHeight;
r5 -= 1 << 16;
var_24 = r6;
var_24 += r5 * r4;
r10 = r5 / r4;
var_24 += r5 * cardHeight;
r10 = r5 / cardHeight;
r5 /= 2;
for (i = 0; i < r7; i++)
for (i = 0; i < cardTop; i++)
gScanlineEffectRegBuffers[0][i] = -i;
for (; i < (s16)(r9); i++)
for (; i < (s16)cardBottom; i++)
{
var = r6 >> 16;
r6 += r5;
@ -1770,11 +1769,11 @@ static bool8 Task_AnimateCardFlipUp(struct Task* task)
gScanlineEffectRegBuffers[0][i] = var;
}
var = var_24 >> 16;
for (; i < 160; i++)
for (; i < DISPLAY_HEIGHT; i++)
gScanlineEffectRegBuffers[0][i] = var;
sData->allowDMACopy = TRUE;
if (task->data[1] <= 0)
if (task->tCardTop <= 0)
task->tFlipState++;
return FALSE;

View File

@ -74,7 +74,7 @@ static void GetChallengeWon(void);
static void TrainerHillSetTag(void);
static void SetUpDataStruct(void);
static void FreeDataStruct(void);
static void nullsub_2(void);
static void TrainerHillDummy(void);
static void SetTimerValue(u32 *dst, u32 val);
static u32 GetTimerValue(u32 *src);
static void SetTrainerHillMonLevel(struct Pokemon *mon, u8 level);
@ -358,7 +358,7 @@ static void SetUpDataStruct(void)
sHillData = AllocZeroed(sizeof(*sHillData));
sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F;
CpuCopy32(sDataPerTag[gSaveBlock1Ptr->trainerHill.tag], &sHillData->tag, sizeof(sHillData->tag) + 4 * sizeof(struct TrHillFloor));
nullsub_2();
TrainerHillDummy();
}
}
@ -397,7 +397,7 @@ void CopyTrainerHillTrainerText(u8 which, u16 trainerId)
static void TrainerHillStartChallenge(void)
{
nullsub_2();
TrainerHillDummy();
if (!ReadTrainerHillAndValidate())
gSaveBlock1Ptr->trainerHill.field_3D6E_0f = 1;
else
@ -573,12 +573,12 @@ static void IsTrainerHillChallengeActive(void)
gSpecialVar_Result = TRUE;
}
void nullsub_129(void)
static void TrainerHillDummy_Unused(void)
{
}
static void nullsub_2(void)
static void TrainerHillDummy(void)
{
}

View File

@ -5,7 +5,7 @@
#include "sound.h"
ALIGNED(4)
static const u8 sUnknown_08616124[] = {1, 2, 4};
static const u8 sScrollDistances[] = {1, 2, 4};
static const u16 sFont6BrailleGlyphs[] = INCBIN_U16("graphics/fonts/font6.fwjpnfont");
static void DecompressGlyphFont6(u16);
@ -135,7 +135,7 @@ u16 Font6Func(struct TextPrinter *textPrinter)
}
DecompressGlyphFont6(char_);
CopyGlyphToWindow(textPrinter);
textPrinter->printerTemplate.currentX += gUnknown_03002F90.width + textPrinter->printerTemplate.letterSpacing;
textPrinter->printerTemplate.currentX += gCurGlyph.width + textPrinter->printerTemplate.letterSpacing;
return 0;
case 1:
if (TextPrinterWait(textPrinter))
@ -164,15 +164,15 @@ u16 Font6Func(struct TextPrinter *textPrinter)
case 4:
if (textPrinter->scrollDistance)
{
if (textPrinter->scrollDistance < sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed])
if (textPrinter->scrollDistance < sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed])
{
ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor));
textPrinter->scrollDistance = 0;
}
else
{
ScrollWindow(textPrinter->printerTemplate.windowId, 0, sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor));
textPrinter->scrollDistance -= sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed];
ScrollWindow(textPrinter->printerTemplate.windowId, 0, sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor));
textPrinter->scrollDistance -= sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed];
}
CopyWindowToVram(textPrinter->printerTemplate.windowId, 2);
}
@ -206,12 +206,12 @@ static void DecompressGlyphFont6(u16 glyph)
const u16 *glyphs;
glyphs = sFont6BrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8);
DecompressGlyphTile(glyphs, (u16 *)gUnknown_03002F90.unk0);
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gUnknown_03002F90.unk20));
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gUnknown_03002F90.unk40));
DecompressGlyphTile(glyphs + 0x88, (u16 *)(gUnknown_03002F90.unk60));
gUnknown_03002F90.width = 0x10;
gUnknown_03002F90.height = 0x10;
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
DecompressGlyphTile(glyphs + 0x88, gCurGlyph.gfxBufferBottom + 8);
gCurGlyph.width = 0x10;
gCurGlyph.height = 0x10;
}
u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese)

View File

@ -16,10 +16,10 @@ gWindowBgTilemapBuffers:
gFonts:
.space 4
.align 2
gUnknown_03002F84:
gDisableTextPrinters:
.space 1
.align 4
gUnknown_03002F90:
gCurGlyph:
.space 132
.align 2
gTextFlags: