summaryrefslogtreecommitdiff
path: root/src/contest_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/contest_util.c')
-rw-r--r--src/contest_util.c380
1 files changed, 207 insertions, 173 deletions
diff --git a/src/contest_util.c b/src/contest_util.c
index e5fd51db1..aae05d531 100644
--- a/src/contest_util.c
+++ b/src/contest_util.c
@@ -44,7 +44,6 @@
#include "constants/game_stat.h"
#include "constants/rgb.h"
#include "constants/songs.h"
-#include "constants/tv.h"
#include "contest.h"
enum {
@@ -61,10 +60,29 @@ enum {
#define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); }
+// Gfx/pal tags for the text window sprites on the contest results screen.
+// Both types of text windows are made up of 4 individual sprites
+// These tags are used by the spritesheets, and implicitly in the loop in CreateResultsTextWindowSprites
+#define TAG_TEXT_WINDOW_BASE 3009
+enum {
+ TAG_RESULTS_TEXT_WINDOW_LEFT = TAG_TEXT_WINDOW_BASE,
+ TAG_RESULTS_TEXT_WINDOW_MIDLEFT,
+ TAG_RESULTS_TEXT_WINDOW_MIDRIGHT,
+ TAG_RESULTS_TEXT_WINDOW_RIGHT,
+ TAG_LINK_TEXT_WINDOW_LEFT,
+ TAG_LINK_TEXT_WINDOW_MIDLEFT,
+ TAG_LINK_TEXT_WINDOW_MIDRIGHT,
+ TAG_LINK_TEXT_WINDOW_RIGHT, // 3016
+};
#define TAG_CONFETTI 3017
+#define TAG_WIRELESS_INDICATOR_WINDOW 22222
#define MAX_BAR_LENGTH 87
+// Starting x/y for the sliding results screen text box
+#define TEXT_BOX_X (DISPLAY_WIDTH + 32)
+#define TEXT_BOX_Y (DISPLAY_HEIGHT - 16)
+
struct ContestResultsInternal
{
u8 slidingTextBoxSpriteId;
@@ -105,14 +123,14 @@ struct ContestResults
static EWRAM_DATA struct ContestResults *sContestResults = NULL;
static void LoadAllContestMonIconPalettes(void);
-static void LoadContestResultsTilemaps(void);
+static void LoadContestResultsTitleBarTilemaps(void);
static u8 GetNumPreliminaryPoints(u8, bool8);
static s8 GetNumRound2Points(u8, bool8);
static void AddContestTextPrinter(int, u8 *, int);
static void AllocContestResults(void);
static void FreeContestResults(void);
static void LoadAllContestMonIcons(u8, u8);
-static void LoadContestResultSprites(void);
+static void CreateResultsTextWindowSprites(void);
static void TryCreateWirelessSprites(void);
static void Task_StartShowContestResults(u8 taskId);
static void CB2_StartShowContestResults(void);
@@ -166,11 +184,11 @@ static void SpriteCB_Confetti(struct Sprite *sprite);
static void Task_ShowContestEntryMonPic(u8 taskId);
static void Task_LinkContestWaitForConnection(u8 taskId);
-static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
-static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp");
+static const u16 sResultsTextWindow_Pal[] = INCBIN_U16("graphics/contest/results_screen/text_window.gbapal");
+static const u8 sResultsTextWindow_Gfx[] = INCBIN_U8("graphics/contest/results_screen/text_window.4bpp");
static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
-static const struct OamData sOamData_858D7F0 =
+static const struct OamData sOamData_ResultsTextWindow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -187,33 +205,33 @@ static const struct OamData sOamData_858D7F0 =
.affineParam = 0,
};
-static const struct SpriteTemplate sSpriteTemplate_858D7F8 =
+static const struct SpriteTemplate sSpriteTemplate_ResultsTextWindow =
{
- .tileTag = 3009,
- .paletteTag = 3009,
- .oam = &sOamData_858D7F0,
+ .tileTag = TAG_TEXT_WINDOW_BASE,
+ .paletteTag = TAG_TEXT_WINDOW_BASE,
+ .oam = &sOamData_ResultsTextWindow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const struct SpriteSheet sUnknown_0858D810[] =
+static const struct SpriteSheet sSpriteSheets_ResultsTextWindow[] =
{
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_LEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDLEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDRIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_RIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_LEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDLEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDRIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_RIGHT },
};
-static const struct SpritePalette sUnknown_0858D850 =
+static const struct SpritePalette sSpritePalette_ResultsTextWindow =
{
.data = sMiscBlank_Pal,
- .tag = 3009,
+ .tag = TAG_TEXT_WINDOW_BASE,
};
static const struct OamData sOamData_Confetti =
@@ -339,7 +357,7 @@ static const struct WindowTemplate sWindowTemplates[] =
DUMMY_WIN_TEMPLATE,
};
-static const struct OamData sUnknown_0858D8C0 =
+static const struct OamData sOamData_WirelessIndicatorWindow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -357,22 +375,22 @@ static const struct OamData sUnknown_0858D8C0 =
};
-static const struct SpriteTemplate sSpriteTemplate_858D8C8 =
+static const struct SpriteTemplate sSpriteTemplate_WirelessIndicatorWindow =
{
- .tileTag = 22222,
+ .tileTag = TAG_WIRELESS_INDICATOR_WINDOW,
.paletteTag = 0,
- .oam = &sUnknown_0858D8C0,
+ .oam = &sOamData_WirelessIndicatorWindow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const struct SpriteSheet sUnknown_0858D8E0 =
+static const struct SpriteSheet sSpriteSheet_WirelessIndicatorWindow =
{
.data = gMiscBlank_Gfx,
.size = 0x200,
- .tag = 22222
+ .tag = TAG_WIRELESS_INDICATOR_WINDOW
};
static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5};
@@ -430,12 +448,12 @@ static void LoadContestResultsBgGfx(void)
u16 tile1, tile2;
LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0));
- CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0);
- CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0);
- CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0);
- LoadContestResultsTilemaps();
+ CopyToBgTilemapBuffer(3, gContestResults_Bg_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0);
+ LoadContestResultsTitleBarTilemaps();
LoadCompressedPalette(gContestResults_Pal, 0, 0x200);
- LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20);
+ LoadPalette(sResultsTextWindow_Pal, 0xF0, sizeof(sResultsTextWindow_Pal));
for (i = 0; i < CONTESTANT_COUNT; i++)
{
@@ -479,7 +497,7 @@ static void LoadContestMonName(u8 monIndex)
struct ContestPokemon *mon = &gContestMons[monIndex];
u8 *str = gDisplayedStringBattle;
if (monIndex == gContestPlayerMonIndex)
- str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGrey);
+ str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGray);
StringCopy(str, mon->nickname);
AddContestTextPrinter(monIndex, gDisplayedStringBattle, 0);
@@ -515,14 +533,14 @@ static void CB2_StartShowContestResults(void)
LoadAllContestMonNames();
memset(sContestResults->data, 0, sizeof(*sContestResults->data));
memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults));
- LoadContestResultSprites();
+ CreateResultsTextWindowSprites();
TryCreateWirelessSprites();
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
gPaletteFade.bufferTransferDisabled = FALSE;
sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5);
SetMainCallback2(CB2_ShowContestResults);
- gBattle_WIN1H = 0x00F0;
- gBattle_WIN1V = 0x80A0;
+ gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH);
+ gBattle_WIN1V = WIN_RANGE(DISPLAY_HEIGHT - 32, DISPLAY_HEIGHT);
CreateTask(Task_SlideContestResultsBg, 20);
CalculateContestantsResultData();
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
@@ -587,10 +605,10 @@ static void Task_ShowContestResults(u8 taskId)
}
TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST);
- sub_80DEDA8(gSpecialVar_ContestRank);
- sub_80DEDA8(0xFE);
- gUnknown_02039F5C = TRUE;
- gUnknown_02039F5D = sub_80DEFA8(0xFE, 0);
+ SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting
+ SaveContestWinner(CONTEST_SAVE_FOR_ARTIST);
+ gCurContestWinnerIsForArtist = TRUE;
+ gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE);
var = VarGet(VAR_CONTEST_HALL_STATE);
VarSet(VAR_CONTEST_HALL_STATE, 0);
SetContinueGameWarpStatusToDynamicWarp();
@@ -637,10 +655,10 @@ static void Task_ShowContestResults(u8 taskId)
if (gContestFinalStandings[gContestPlayerMonIndex] == 0)
IncrementGameStat(GAME_STAT_WON_CONTEST);
- sub_80DEDA8(gSpecialVar_ContestRank);
- sub_80DEDA8(0xFE);
- gUnknown_02039F5C = TRUE;
- gUnknown_02039F5D = sub_80DEFA8(0xFE, 0);
+ SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting
+ SaveContestWinner(CONTEST_SAVE_FOR_ARTIST);
+ gCurContestWinnerIsForArtist = TRUE;
+ gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE);
TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST);
gTasks[taskId].func = Task_AnnouncePreliminaryResults;
}
@@ -679,7 +697,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId)
{
CreateTask(Task_FlashStarsAndHearts, 20);
x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, 144, 120, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, 120, 1088);
gTasks[taskId].tState++;
}
else if (gTasks[taskId].tState == 1)
@@ -702,7 +720,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId)
else if (gTasks[taskId].tState == 3)
{
x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, 144, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
gTasks[taskId].tState++;
}
else if (gTasks[taskId].tState == 4)
@@ -752,7 +770,7 @@ static void Task_AnnounceRound2Results(u8 taskId)
{
gTasks[taskId].tTimer = 0;
x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, 144, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
}
}
else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED)
@@ -837,11 +855,11 @@ static void Task_AnnounceWinner(u8 taskId)
gTasks[taskId].tTimer = 0;
GET_CONTEST_WINNER_ID(i);
StringCopy(gStringVar1, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar1);
+ ConvertInternationalContestantName(gStringVar1);
StringCopy(gStringVar2, gContestMons[i].nickname);
StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon);
x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, 144, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
gTasks[taskId].tState++;
}
break;
@@ -864,8 +882,8 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
switch (gTasks[taskId].tState)
{
case 0:
- gBattle_WIN0H = 0x00F0;
- gBattle_WIN0V = 0x5050;
+ gBattle_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH);
+ gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2);
GET_CONTEST_WINNER_ID(i);
species = gContestMons[i].species;
@@ -892,7 +910,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
LoadCompressedSpritePalette(pokePal);
SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT);
gMultiuseSpriteTemplate.paletteTag = pokePal->tag;
- spriteId = CreateSprite(&gMultiuseSpriteTemplate, 272, 80, 10);
+ spriteId = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH + 32, DISPLAY_HEIGHT / 2, 10);
gSprites[spriteId].data[1] = species;
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn;
@@ -912,7 +930,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
gTasks[taskId].tCounter = 32;
counter = gTasks[taskId].tCounter;
- gBattle_WIN0V = ((80 - counter) << 8) | (80 + counter);
+ gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2 - counter, DISPLAY_HEIGHT / 2 + counter);
if (counter == 32)
gTasks[taskId].tState++;
}
@@ -934,11 +952,11 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
{
u8 top = (gBattle_WIN0V >> 8);
top += 2;
- if (top > 80)
- top = 80;
+ if (top > DISPLAY_HEIGHT / 2)
+ top = DISPLAY_HEIGHT / 2;
- gBattle_WIN0V = (top << 8) | (160 - top);
- if (top == 80)
+ gBattle_WIN0V = WIN_RANGE(top, DISPLAY_HEIGHT - top);
+ if (top == DISPLAY_HEIGHT / 2)
gTasks[taskId].tState++;
}
break;
@@ -1136,9 +1154,9 @@ static void TryCreateWirelessSprites(void)
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(8, 8);
gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1;
- sheet = LoadSpriteSheet(&sUnknown_0858D8E0);
+ sheet = LoadSpriteSheet(&sSpriteSheet_WirelessIndicatorWindow);
RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1);
- spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0);
+ spriteId = CreateSprite(&sSpriteTemplate_WirelessIndicatorWindow, 8, 8, 0);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
}
}
@@ -1150,14 +1168,13 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
int strWidth;
u8 *spriteTilePtrs[4];
u8 *dst;
- {
- struct WindowTemplate windowTemplate;
- memset(&windowTemplate, 0, sizeof(windowTemplate));
- windowTemplate.width = 30;
- windowTemplate.height = 2;
- windowId = AddWindow(&windowTemplate);
- FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
- }
+
+ struct WindowTemplate windowTemplate;
+ memset(&windowTemplate, 0, sizeof(windowTemplate));
+ windowTemplate.width = 30;
+ windowTemplate.height = 2;
+ windowId = AddWindow(&windowTemplate);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
origWidth = GetStringWidth(1, text, 0);
strWidth = (origWidth + 9) / 8;
@@ -1169,16 +1186,16 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
s32 i;
struct Sprite *sprite;
const u8 *src, *windowTilesPtr;
- windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA));
- src = (u8 *)(sUnknown_0858D6D0);
+ windowTilesPtr = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);
+ src = (u8 *)sResultsTextWindow_Gfx;
sprite = &gSprites[spriteId];
spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + OBJ_VRAM0);
- for (i = 1; i < 4; i++)
+ for (i = 1; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
spriteTilePtrs[i] = (void*)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + OBJ_VRAM0);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
CpuFill32(0, spriteTilePtrs[i], 0x400);
dst = spriteTilePtrs[0];
@@ -1205,30 +1222,34 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
}
RemoveWindow(windowId);
- return (240 - (strWidth + 2) * 8) / 2;
+ return (DISPLAY_WIDTH - (strWidth + 2) * 8) / 2;
}
-static void LoadContestResultSprites(void)
+static void CreateResultsTextWindowSprites(void)
{
int i;
struct SpriteTemplate template;
- u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)];
+ u8 spriteIds[ARRAY_COUNT(sSpriteSheets_ResultsTextWindow)];
- template = sSpriteTemplate_858D7F8;
- for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
- LoadSpriteSheet(&sUnknown_0858D810[i]);
+ template = sSpriteTemplate_ResultsTextWindow;
+ for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++)
+ LoadSpriteSheet(&sSpriteSheets_ResultsTextWindow[i]);
- LoadSpritePalette(&sUnknown_0858D850);
- for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
+ LoadSpritePalette(&sSpritePalette_ResultsTextWindow);
+
+ // Create sprites for the two window types, each made up of 4 sprites
+ for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++)
{
- spriteIds[i] = CreateSprite(&template, 272, 144, 10);
+ spriteIds[i] = CreateSprite(&template, TEXT_BOX_X, TEXT_BOX_Y, 10);
template.tileTag++;
}
+ // Save sprite ids of the sliding text box onto its leftmost sprite
gSprites[spriteIds[0]].data[0] = spriteIds[1];
gSprites[spriteIds[0]].data[1] = spriteIds[2];
gSprites[spriteIds[0]].data[2] = spriteIds[3];
+ // Save sprite ids of the link text box onto its leftmost sprite
gSprites[spriteIds[4]].data[0] = spriteIds[5];
gSprites[spriteIds[4]].data[1] = spriteIds[6];
gSprites[spriteIds[4]].data[2] = spriteIds[7];
@@ -1248,10 +1269,10 @@ static void LoadContestResultSprites(void)
static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement)
{
struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId];
- sprite->pos1.x = 272;
- sprite->pos1.y = y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
+ sprite->x = TEXT_BOX_X;
+ sprite->y = y;
+ sprite->x2 = 0;
+ sprite->y2 = 0;
sprite->sTargetX = x + 32;
sprite->sSlideOutTimer = slideOutTimer;
sprite->sSlideIncrement = slideIncrement;
@@ -1263,10 +1284,10 @@ static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrem
static void StartTextBoxSlideOut(u16 slideIncrement)
{
struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId];
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
+ sprite->x += sprite->x2;
+ sprite->y += sprite->y2;
+ sprite->y2 = 0;
+ sprite->x2 = 0;
sprite->sSlideIncrement = slideIncrement;
sprite->sDistance = 0;
sprite->callback = SpriteCB_TextBoxSlideOut;
@@ -1275,10 +1296,10 @@ static void StartTextBoxSlideOut(u16 slideIncrement)
static void EndTextBoxSlideOut(struct Sprite *sprite)
{
- sprite->pos1.x = 272;
- sprite->pos1.y = 144;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
+ sprite->x = TEXT_BOX_X;
+ sprite->y = TEXT_BOX_Y;
+ sprite->y2 = 0;
+ sprite->x2 = 0;
sprite->callback = SpriteCallbackDummy;
sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN;
}
@@ -1288,21 +1309,21 @@ static void SpriteCB_TextBoxSlideIn(struct Sprite *sprite)
int i;
s16 delta = sprite->sDistance + sprite->sSlideIncrement;
- sprite->pos1.x -= delta >> 8;
+ sprite->x -= delta >> 8;
sprite->sDistance += sprite->sSlideIncrement;
sprite->sDistance &= 0xFF;
// Prevent overshooting target
- if (sprite->pos1.x < sprite->sTargetX)
- sprite->pos1.x = sprite->sTargetX;
+ if (sprite->x < sprite->sTargetX)
+ sprite->x = sprite->sTargetX;
for (i = 0; i < 3; i++)
{
struct Sprite *sprite2 = &gSprites[sprite->data[i]];
- sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64;
+ sprite2->x = sprite->x + sprite->x2 + (i + 1) * 64;
}
- if (sprite->pos1.x == sprite->sTargetX)
+ if (sprite->x == sprite->sTargetX)
sprite->callback = SpriteCB_EndTextBoxSlideIn;
}
@@ -1322,16 +1343,16 @@ static void SpriteCB_TextBoxSlideOut(struct Sprite *sprite)
s16 delta;
delta = sprite->sDistance + sprite->sSlideIncrement;
- sprite->pos1.x -= delta >> 8;
+ sprite->x -= delta >> 8;
sprite->sDistance += sprite->sSlideIncrement;
sprite->sDistance &= 0xFF;
for (i = 0; i < 3; i++)
{
struct Sprite *sprite2 = &gSprites[sprite->data[i]];
- sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64;
+ sprite2->x = sprite->x + sprite->x2 + (i + 1) * 64;
}
- if (sprite->pos1.x + sprite->pos2.x < -224)
+ if (sprite->x + sprite->x2 < -224)
EndTextBoxSlideOut(sprite);
}
@@ -1343,18 +1364,18 @@ static void ShowLinkResultsTextBox(const u8 *text)
x = DrawResultsTextWindow(text, sContestResults->data->linkTextBoxSpriteId);
sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId];
- sprite->pos1.x = x + 32;
- sprite->pos1.y = 80;
+ sprite->x = x + 32;
+ sprite->y = 80;
sprite->invisible = FALSE;
for (i = 0; i < 3; i++)
{
- gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64;
- gSprites[sprite->data[i]].pos1.y = sprite->pos1.y;
+ gSprites[sprite->data[i]].x = sprite->x + sprite->x2 + (i + 1) * 64;
+ gSprites[sprite->data[i]].y = sprite->y;
gSprites[sprite->data[i]].invisible = FALSE;
}
- gBattle_WIN0H = 0x00F0;
- gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16);
+ gBattle_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH);
+ gBattle_WIN0V = WIN_RANGE(sprite->y - 16, sprite->y + 16);
SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR
| WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR);
}
@@ -1377,7 +1398,7 @@ static void HideLinkResultsTextBox(void)
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
}
-static void LoadContestResultsTilemaps(void)
+static void LoadContestResultsTitleBarTilemaps(void)
{
u8 palette;
int x, y;
@@ -1386,58 +1407,58 @@ static void LoadContestResultsTilemaps(void)
y = 1;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
- CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Link_Tilemap, 5, 1, 5, 2);
x = 10;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL)
{
- CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Normal_Tilemap, 5, 1, 10, 2);
x = 15;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER)
{
- CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Super_Tilemap, 5, 1, 10, 2);
x = 15;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER)
{
- CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Hyper_Tilemap, 5, 1, 10, 2);
x = 15;
}
else // CONTEST_RANK_MASTER
{
- CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Master_Tilemap, 5, 1, 10, 2);
x = 15;
}
if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL)
{
palette = 0;
- CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cool_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY)
{
palette = 1;
- CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Beauty_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE)
{
palette = 2;
- CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cute_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART)
{
palette = 3;
- CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Smart_Tilemap, x, y, 5, 2);
}
else // CONTEST_CATEGORY_TOUGH
{
palette = 4;
- CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tough_Tilemap, x, y, 5, 2);
}
x += 5;
- CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tilemap, x, y, 6, 2);
CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette);
}
@@ -1564,13 +1585,13 @@ static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite)
else
{
s16 delta = sprite->data[1] + 0x600;
- sprite->pos1.x -= delta >> 8;
+ sprite->x -= delta >> 8;
sprite->data[1] += 0x600;
sprite->data[1] &= 0xFF;
- if (sprite->pos1.x < 120)
- sprite->pos1.x = 120;
+ if (sprite->x < DISPLAY_WIDTH / 2)
+ sprite->x = DISPLAY_WIDTH / 2;
- if (sprite->pos1.x == 120)
+ if (sprite->x == DISPLAY_WIDTH / 2)
{
sprite->callback = SpriteCallbackDummy;
sprite->data[1] = 0;
@@ -1582,10 +1603,10 @@ static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite)
static void SpriteCB_WinnerMonSlideOut(struct Sprite *sprite)
{
s16 delta = sprite->data[1] + 0x600;
- sprite->pos1.x -= delta >> 8;
+ sprite->x -= delta >> 8;
sprite->data[1] += + 0x600;
sprite->data[1] &= 0xFF;
- if (sprite->pos1.x < -32)
+ if (sprite->x < -32)
{
sprite->callback = SpriteCallbackDummy;
sprite->invisible = TRUE;
@@ -1600,7 +1621,7 @@ static void Task_CreateConfetti(u8 taskId)
gTasks[taskId].data[0] = 0;
if (sContestResults->data->confettiCount < 40)
{
- u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % 240) - 20, 44, 5);
+ u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % DISPLAY_WIDTH) - 20, 44, 5);
gSprites[spriteId].data[0] = Random() % 512;
gSprites[spriteId].data[1] = (Random() % 24) + 16;
gSprites[spriteId].data[2] = (Random() % 256) + 48;
@@ -1618,17 +1639,17 @@ static void SpriteCB_Confetti(struct Sprite *sprite)
s16 delta;
sprite->data[3] += sprite->data[0];
- sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]);
+ sprite->x2 = Sin(sprite->data[3] >> 8, sprite->data[1]);
delta = sprite->data[4] + sprite->data[2];
- sprite->pos1.x += delta >> 8;
+ sprite->x += delta >> 8;
sprite->data[4] += sprite->data[2];
sprite->data[4] &= 0xff;
- sprite->pos1.y++;
+ sprite->y++;
if (sContestResults->data->destroyConfetti)
sprite->invisible = TRUE;
- if (sprite->pos1.x > 248 || sprite->pos1.y > 116)
+ if (sprite->x > DISPLAY_WIDTH + 8 || sprite->y > 116)
{
DestroySprite(sprite);
sContestResults->data->confettiCount--;
@@ -2035,7 +2056,7 @@ void GiveMonContestRibbon(void)
void BufferContestantTrainerName(void)
{
StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName);
- sub_81DB5AC(gStringVar1);
+ ConvertInternationalContestantName(gStringVar1);
}
void BufferContestantMonNickname(void)
@@ -2074,7 +2095,7 @@ void BufferContestWinnerTrainerName(void)
u8 i;
GET_CONTEST_WINNER_ID(i);
StringCopy(gStringVar3, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar3);
+ ConvertInternationalContestantName(gStringVar3);
}
void BufferContestWinnerMonName(void)
@@ -2257,6 +2278,10 @@ static void Task_LinkContest_WaitDisconnect(u8 taskId)
}
}
+/*
+ A section of contest script functions starts here
+*/
+
void SetContestTrainerGfxIds(void)
{
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
@@ -2265,27 +2290,27 @@ void SetContestTrainerGfxIds(void)
}
// Unused
-void sub_80F8814(void)
+void GetNpcContestantLocalId(void)
{
- u16 var1;
- u8 var0 = gSpecialVar_0x8005;
- switch (var0)
+ u16 localId;
+ u8 contestant = gSpecialVar_0x8005;
+ switch (contestant)
{
case 0:
- var1 = 3;
+ localId = 3;
break;
case 1:
- var1 = 4;
+ localId = 4;
break;
case 2:
- var1 = 5;
+ localId = 5;
break;
- default:
- var1 = 100;
+ default: // Invalid
+ localId = 100;
break;
}
- gSpecialVar_0x8004 = var1;
+ gSpecialVar_0x8004 = localId;
}
void BufferContestTrainerAndMonNames(void)
@@ -2296,26 +2321,26 @@ void BufferContestTrainerAndMonNames(void)
}
// Unused
-void DoesContestCategoryHaveWinner(void)
+void DoesContestCategoryHaveMuseumPainting(void)
{
int contestWinner;
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
- contestWinner = 8;
+ contestWinner = CONTEST_WINNER_MUSEUM_COOL - 1;
break;
case CONTEST_CATEGORY_BEAUTY:
- contestWinner = 9;
+ contestWinner = CONTEST_WINNER_MUSEUM_BEAUTY - 1;
break;
case CONTEST_CATEGORY_CUTE:
- contestWinner = 10;
+ contestWinner = CONTEST_WINNER_MUSEUM_CUTE - 1;
break;
case CONTEST_CATEGORY_SMART:
- contestWinner = 11;
+ contestWinner = CONTEST_WINNER_MUSEUM_SMART - 1;
break;
case CONTEST_CATEGORY_TOUGH:
default:
- contestWinner = 12;
+ contestWinner = CONTEST_WINNER_MUSEUM_TOUGH - 1;
break;
}
@@ -2327,7 +2352,7 @@ void DoesContestCategoryHaveWinner(void)
void SaveMuseumContestPainting(void)
{
- sub_80DEDA8(0xFF);
+ SaveContestWinner(CONTEST_SAVE_FOR_MUSEUM);
}
void ShouldReadyContestArtist(void)
@@ -2344,14 +2369,14 @@ void ShouldReadyContestArtist(void)
}
}
-u8 CountPlayerContestPaintings(void)
+u8 CountPlayerMuseumPaintings(void)
{
int i;
u8 count = 0;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < NUM_CONTEST_WINNERS - MUSEUM_CONTEST_WINNERS_START; i++)
{
- if (gSaveBlock1Ptr->contestWinners[8 + i].species)
+ if (gSaveBlock1Ptr->contestWinners[MUSEUM_CONTEST_WINNERS_START + i].species)
count++;
}
@@ -2359,19 +2384,21 @@ u8 CountPlayerContestPaintings(void)
}
// Unused
-void sub_80F8970(void)
+void GetContestantNamesAtRank(void)
{
s16 conditions[CONTESTANT_COUNT];
int i, j;
s16 condition;
- s8 var0;
- u8 var2;
- u8 r8;
- u8 r7;
+ s8 numAtCondition;
+ u8 contestantOffset;
+ u8 tieRank;
+ u8 rank;
+ // Get round 1 points
for (i = 0; i < CONTESTANT_COUNT; i++)
conditions[i] = gContestMonRound1Points[i];
+ // Sort round 1 points
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
{
for (j = CONTESTANT_COUNT - 1; j > i; j--)
@@ -2384,58 +2411,65 @@ void sub_80F8970(void)
}
}
+ // Get round 1 points at specified rank
condition = conditions[gSpecialVar_0x8006];
- var0 = 0;
- r8 = 0;
+
+ // Count number of contestants with the same number of points
+ numAtCondition = 0;
+ tieRank = 0;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
{
- var0++;
+ numAtCondition++;
if (i == gSpecialVar_0x8006)
- r8 = var0;
+ tieRank = numAtCondition;
}
}
+ // Get rank of first contestant with the same number of points
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
break;
}
+ rank = i;
- r7 = i;
- var2 = r8;
+ // Get contestant id of player at rank (taking ties into account)
+ contestantOffset = tieRank;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (condition == gContestMonRound1Points[i])
{
- if (var2 == 1)
+ if (contestantOffset == 1)
break;
- var2--;
+ contestantOffset--;
}
}
+ // Use contestant id to get names
StringCopy(gStringVar1, gContestMons[i].nickname);
StringCopy(gStringVar2, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar2);
+ ConvertInternationalContestantName(gStringVar2);
- if (var0 == 1)
- gSpecialVar_0x8006 = r7;
- else if (r8 == var0)
- gSpecialVar_0x8006 = r7;
+ // Return adjusted rank
+ if (numAtCondition == 1)
+ gSpecialVar_0x8006 = rank;
+ else if (tieRank == numAtCondition)
+ gSpecialVar_0x8006 = rank;
else
- gSpecialVar_0x8006 = r7 + 4;
+ gSpecialVar_0x8006 = rank + CONTESTANT_COUNT;
}
-static void ExitContestWinnerPainting(void)
+static void ExitContestPainting(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-void ShowContestWinnerPainting(void)
+void ShowContestPainting(void)
{
SetMainCallback2(CB2_ContestPainting);
- gMain.savedCallback = ExitContestWinnerPainting;
+ gMain.savedCallback = ExitContestPainting;
}
void SetLinkContestPlayerGfx(void)