Skip to content

Commit

Permalink
Merge pull request #35 from Jaizu/contests
Browse files Browse the repository at this point in the history
Fixes and cleanup

closes #32
closes #2
  • Loading branch information
Deokishisu authored Feb 3, 2024
2 parents c6abe5e + 6265f7e commit 1a526f2
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 199 deletions.
4 changes: 0 additions & 4 deletions data/specials.inc
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,11 @@ gSpecials::
def_special NullFieldSpecial
def_special GetContestWinnerId
def_special GetContestPlayerId
def_special GetNpcContestantLocalId
def_special BufferContestWinnerTrainerName
def_special BufferContestWinnerMonName
def_special BufferContestTrainerAndMonNames
def_special GetContestMonConditionRanking
def_special SetContestTrainerGfxIds
def_special TryEnterContestMon
def_special GetContestantNamesAtRank
def_special SetLinkContestPlayerGfx
def_special GetContestMonCondition
def_special HasMonWonThisContestBefore
Expand Down Expand Up @@ -144,7 +141,6 @@ gSpecials::
def_special CountPartyAliveNonEggMons_IgnoreVar0x8004Slot
def_special ShouldReadyContestArtist
def_special SaveMuseumContestPainting
def_special DoesContestCategoryHaveMuseumPainting
def_special CountPlayerMuseumPaintings
def_special NullFieldSpecial
def_special NullFieldSpecial @ Mauville Gym specials
Expand Down
213 changes: 31 additions & 182 deletions src/contest_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,7 @@ struct ContestResults
{
struct ContestResultsInternal *data;
struct ContestMonResults (*monResults)[CONTESTANT_COUNT];
u8 *unusedBg; // Allocated/freed, never used
u8 *tilemapBuffers[4];
u8 *unused; // Allocated/freed, never used
};

static EWRAM_DATA struct ContestResults *sContestResults = NULL;
Expand Down Expand Up @@ -503,6 +501,7 @@ static void LoadContestMonName(u8 monIndex)
{
struct ContestPokemon *mon = &gContestMons[monIndex];
u8 *str = gDisplayedStringBattle;
FillWindowPixelBuffer(monIndex, PIXEL_FILL(0));
if (monIndex == gContestPlayerMonIndex)
str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGray);

Expand Down Expand Up @@ -1175,6 +1174,9 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
int strWidth;
u8 *spriteTilePtrs[4];
u8 *dst;
s32 i;
struct Sprite *sprite;
const u8 *src, *windowTilesPtr;

struct WindowTemplate windowTemplate;
memset(&windowTemplate, 0, sizeof(windowTemplate));
Expand All @@ -1189,44 +1191,41 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
tileWidth = DISPLAY_TILE_WIDTH;

AddTextPrinterParameterized3(windowId, FONT_NORMAL, (tileWidth * 8 - strWidth) / 2, 1, sContestLinkTextColors, TEXT_SKIP_DRAW, text);
{
s32 i;
struct Sprite *sprite;
const u8 *src, *windowTilesPtr;
windowTilesPtr = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);
src = (u8 *)sResultsTextWindow_Gfx;

sprite = &gSprites[spriteId];
spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + OBJ_VRAM0);
windowTilesPtr = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);
src = (u8 *)sResultsTextWindow_Gfx;

for (i = 1; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
spriteTilePtrs[i] = (void *)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + OBJ_VRAM0);
sprite = &gSprites[spriteId];
spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + OBJ_VRAM0);

for (i = 0; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
CpuFill32(0, spriteTilePtrs[i], 0x400);
for (i = 1; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
spriteTilePtrs[i] = (void *)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + OBJ_VRAM0);

dst = spriteTilePtrs[0];
CpuCopy32(src, dst, 0x20);
CpuCopy32(src + 128, dst + 0x100, 0x20);
CpuCopy32(src + 128, dst + 0x200, 0x20);
CpuCopy32(src + 64, dst + 0x300, 0x20);
for (i = 0; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
CpuFill32(0, spriteTilePtrs[i], 0x400);

for (i = 0; i < tileWidth; i++)
{
dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32];
CpuCopy32(src + 192, dst, 0x20);
CpuCopy32(windowTilesPtr, dst + 0x100, 0x20);
CpuCopy32(windowTilesPtr + 960, dst + 0x200, 0x20);
CpuCopy32(src + 224, dst + 0x300, 0x20);
windowTilesPtr += 0x20;
}
dst = spriteTilePtrs[0];
CpuCopy32(src, dst, 0x20);
CpuCopy32(src + 128, dst + 0x100, 0x20);
CpuCopy32(src + 128, dst + 0x200, 0x20);
CpuCopy32(src + 64, dst + 0x300, 0x20);

for (i = 0; i < tileWidth; i++)
{
dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32];
CpuCopy32(src + 32, dst, 0x20);
CpuCopy32(src + 160, dst + 0x100, 0x20);
CpuCopy32(src + 160, dst + 0x200, 0x20);
CpuCopy32(src + 96, dst + 0x300, 0x20);
CpuCopy32(src + 192, dst, 0x20);
CpuCopy32(windowTilesPtr, dst + 0x100, 0x20);
CpuCopy32(windowTilesPtr + 960, dst + 0x200, 0x20);
CpuCopy32(src + 224, dst + 0x300, 0x20);
windowTilesPtr += 0x20;
}

dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32];
CpuCopy32(src + 32, dst, 0x20);
CpuCopy32(src + 160, dst + 0x100, 0x20);
CpuCopy32(src + 160, dst + 0x200, 0x20);
CpuCopy32(src + 96, dst + 0x300, 0x20);

RemoveWindow(windowId);

return (DISPLAY_WIDTH - (tileWidth + 2) * 8) / 2;
Expand Down Expand Up @@ -1915,25 +1914,21 @@ static void AllocContestResults(void)
sContestResults = AllocZeroed(sizeof(*sContestResults));
sContestResults->data = AllocZeroed(sizeof(*sContestResults->data));
sContestResults->monResults = AllocZeroed(sizeof(*sContestResults->monResults));
sContestResults->unusedBg = AllocZeroed(BG_SCREEN_SIZE);
sContestResults->tilemapBuffers[0] = AllocZeroed(BG_SCREEN_SIZE);
sContestResults->tilemapBuffers[1] = AllocZeroed(BG_SCREEN_SIZE);
sContestResults->tilemapBuffers[2] = AllocZeroed(BG_SCREEN_SIZE);
sContestResults->tilemapBuffers[3] = AllocZeroed(BG_SCREEN_SIZE);
sContestResults->unused = AllocZeroed(0x1000);
AllocateMonSpritesGfx();
}

static void FreeContestResults(void)
{
FREE_AND_SET_NULL(sContestResults->data);
FREE_AND_SET_NULL(sContestResults->monResults);
FREE_AND_SET_NULL(sContestResults->unusedBg);
FREE_AND_SET_NULL(sContestResults->tilemapBuffers[0]);
FREE_AND_SET_NULL(sContestResults->tilemapBuffers[1]);
FREE_AND_SET_NULL(sContestResults->tilemapBuffers[2]);
FREE_AND_SET_NULL(sContestResults->tilemapBuffers[3]);
FREE_AND_SET_NULL(sContestResults->unused);
FREE_AND_SET_NULL(sContestResults);
FreeMonSpritesGfx();
}
Expand Down Expand Up @@ -2076,20 +2071,6 @@ void BufferContestantMonNickname(void)
StringCopy(gStringVar3, gContestMons[gSpecialVar_0x8006].nickname);
}

// Unused script special
void GetContestMonConditionRanking(void)
{
u32 i, rank;

for (i = 0, rank = 0; i < CONTESTANT_COUNT; i++)
{
if (gContestMonRound1Points[gSpecialVar_0x8006] < gContestMonRound1Points[i])
rank++;
}

gSpecialVar_0x8004 = rank;
}

void GetContestMonCondition(void)
{
gSpecialVar_0x8004 = gContestMonRound1Points[gSpecialVar_0x8006];
Expand Down Expand Up @@ -2301,67 +2282,13 @@ void SetContestTrainerGfxIds(void)
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId;
}

// Unused
void GetNpcContestantLocalId(void)
{
u16 localId;
u8 contestant = gSpecialVar_0x8005;
switch (contestant)
{
case 0:
localId = 3;
break;
case 1:
localId = 4;
break;
case 2:
localId = 5;
break;
default: // Invalid
localId = 100;
break;
}

gSpecialVar_0x8004 = localId;
}

void BufferContestTrainerAndMonNames(void)
{
BufferContestantTrainerName();
BufferContestantMonNickname();
BufferContestantMonSpecies();
}

// Unused
void DoesContestCategoryHaveMuseumPainting(void)
{
int contestWinner;
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
contestWinner = CONTEST_WINNER_MUSEUM_COOL - 1;
break;
case CONTEST_CATEGORY_BEAUTY:
contestWinner = CONTEST_WINNER_MUSEUM_BEAUTY - 1;
break;
case CONTEST_CATEGORY_CUTE:
contestWinner = CONTEST_WINNER_MUSEUM_CUTE - 1;
break;
case CONTEST_CATEGORY_SMART:
contestWinner = CONTEST_WINNER_MUSEUM_SMART - 1;
break;
case CONTEST_CATEGORY_TOUGH:
default:
contestWinner = CONTEST_WINNER_MUSEUM_TOUGH - 1;
break;
}

if (gSaveBlock1Ptr->contestWinners[contestWinner].species == SPECIES_NONE)
gSpecialVar_0x8004 = FALSE;
else
gSpecialVar_0x8004 = TRUE;
}

void SaveMuseumContestPainting(void)
{
SaveContestWinner(CONTEST_SAVE_FOR_MUSEUM);
Expand Down Expand Up @@ -2395,84 +2322,6 @@ u8 CountPlayerMuseumPaintings(void)
return count;
}

// Unused
void GetContestantNamesAtRank(void)
{
s16 conditions[CONTESTANT_COUNT];
int i, j;
s16 condition;
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--)
{
if (conditions[j - 1] < conditions[j])
{
int temp;
SWAP(conditions[j], conditions[j - 1], temp)
}
}
}

// Get round 1 points at specified rank
condition = conditions[gSpecialVar_0x8006];

// 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)
{
numAtCondition++;
if (i == gSpecialVar_0x8006)
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;

// 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 (contestantOffset == 1)
break;
contestantOffset--;
}
}

// Use contestant id to get names
StringCopy(gStringVar1, gContestMons[i].nickname);
StringCopy(gStringVar2, gContestMons[i].trainerName);
ConvertInternationalContestantName(gStringVar2);

// Return adjusted rank
if (numAtCondition == 1)
gSpecialVar_0x8006 = rank;
else if (tieRank == numAtCondition)
gSpecialVar_0x8006 = rank;
else
gSpecialVar_0x8006 = rank + CONTESTANT_COUNT;
}

static void ExitContestPainting(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
Expand Down
26 changes: 13 additions & 13 deletions src/tileset_anims.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,14 @@ const u16 *const gTilesetAnims_BattleFrontierOutsideEast_Flower[] = {
gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame2
};

static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame0[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/0.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame1[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/1.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame2[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/2.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame3[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/3.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame4[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/4.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame5[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/5.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame6[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/6.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame7[] = INCBIN_U16("data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/7.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame0[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/0.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame1[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/1.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame2[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/2.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame3[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/3.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame4[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/4.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame5[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/5.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame6[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/6.4bpp");
static const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame7[] = INCBIN_U16("data/tilesets/secondary/seviiislands5/anim/mossdeep_tree_base/7.4bpp");

static const u16 *const gTilesetAnims_Mossdeep_Tree_Base[] = {
gTilesetAnims_Mossdeep_Tree_Base_Frame0,
Expand Down Expand Up @@ -393,7 +393,7 @@ void InitTilesetAnim_VermilionGym(void)
static void QueueAnimTiles_CeladonGym_Flowers(u16 timer)
{
u16 i = timer % ARRAY_COUNT(sTilesetAnims_CeladonGym_Flowers);

AppendTilesetAnimToBuffer(sTilesetAnims_CeladonGym_Flowers[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(739)), 4 * TILE_SIZE_4BPP);
}

Expand Down Expand Up @@ -502,20 +502,20 @@ void InitTilesetAnim_SeviiIslands67(void)
sSecondaryTilesetAnimCallback = TilesetAnim_SeviiIslands67;
}

static void QueueAnimTiles_SeviiIslands5_ShortGrassFlower(u16 timer)
static void QueueAnimTiles_seviiislands5_ShortGrassFlower(u16 timer)
{
AppendTilesetAnimToBuffer(sTilesetAnims_General_Flower[timer % NELEMS(sTilesetAnims_General_Flower)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x324)), 0x80);
}

static void TilesetAnim_SeviiIslands5(u16 timer)
static void TilesetAnim_seviiislands5(u16 timer)
{
if (timer % 16 == 2)
QueueAnimTiles_SeviiIslands5_ShortGrassFlower(timer >> 4);
QueueAnimTiles_seviiislands5_ShortGrassFlower(timer >> 4);
}

void InitTilesetAnim_SeviiIslands5(void)
{
sSecondaryTilesetAnimCounter = sPrimaryTilesetAnimCounter;
sSecondaryTilesetAnimCounterMax = sPrimaryTilesetAnimCounterMax;
sSecondaryTilesetAnimCallback = TilesetAnim_SeviiIslands5;
sSecondaryTilesetAnimCallback = TilesetAnim_seviiislands5;
}

0 comments on commit 1a526f2

Please sign in to comment.