mirror of
https://github.com/pret/pokefirered.git
synced 2026-06-02 22:04:27 -05:00
213 lines
7.2 KiB
C
213 lines
7.2 KiB
C
#include "global.h"
|
|
#include "bg.h"
|
|
#include "box_party_pokemon_dropdown.h"
|
|
#include "malloc.h"
|
|
|
|
struct BPPD_MapRect
|
|
{
|
|
s16 destX;
|
|
s16 destY;
|
|
u16 width;
|
|
u16 height;
|
|
s16 destX2;
|
|
s16 destY2;
|
|
};
|
|
|
|
struct BPPD_Struct
|
|
{
|
|
struct BPPD_MapRect map1Rect;
|
|
struct BPPD_MapRect map2Rect;
|
|
const void * src1;
|
|
const void * src2;
|
|
u16 src1Height;
|
|
u16 src1Width;
|
|
u16 src2Width;
|
|
u16 src2Height;
|
|
u16 bytesPerRow;
|
|
u8 mapSize;
|
|
u8 bgId;
|
|
bool8 bgUpdateScheduled;
|
|
};
|
|
|
|
static EWRAM_DATA struct BPPD_Struct * sBoxPartyPokemonDropdownPtr = NULL;
|
|
static EWRAM_DATA u16 sBoxPartyPokemonDropdownCount = 0;
|
|
|
|
static void PushMap1(u8 idx);
|
|
static void PushMap2(u8 idx);
|
|
|
|
static const struct {
|
|
u16 height;
|
|
u16 width;
|
|
} sBGdims[2][4] = {
|
|
{
|
|
{0x0100, 0x0100},
|
|
{0x0200, 0x0100},
|
|
{0x0100, 0x0200},
|
|
{0x0200, 0x0200}
|
|
}, {
|
|
{0x0080, 0x0080},
|
|
{0x0100, 0x0100},
|
|
{0x0200, 0x0200},
|
|
{0x0400, 0x0400}
|
|
}
|
|
};
|
|
|
|
void AllocBoxPartyPokemonDropdowns(u8 num)
|
|
{
|
|
u16 i;
|
|
sBoxPartyPokemonDropdownPtr = Alloc(num * sizeof(struct BPPD_Struct));
|
|
sBoxPartyPokemonDropdownCount = sBoxPartyPokemonDropdownPtr == NULL ? 0 : num;
|
|
for (i = 0; i < sBoxPartyPokemonDropdownCount; i++)
|
|
{
|
|
sBoxPartyPokemonDropdownPtr[i].src1 = NULL;
|
|
sBoxPartyPokemonDropdownPtr[i].bgUpdateScheduled = FALSE;
|
|
}
|
|
}
|
|
|
|
void FreeBoxPartyPokemonDropdowns(void)
|
|
{
|
|
Free(sBoxPartyPokemonDropdownPtr);
|
|
}
|
|
|
|
void CopyAllBoxPartyPokemonDropdownsToVram(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < sBoxPartyPokemonDropdownCount; i++)
|
|
{
|
|
if (sBoxPartyPokemonDropdownPtr[i].bgUpdateScheduled == TRUE)
|
|
CopyBoxPartyPokemonDropdownToBgTilemapBuffer(i);
|
|
}
|
|
}
|
|
|
|
void SetBoxPartyPokemonDropdownMap2(u8 idx, u8 bgId, const void * src, u16 width, u16 height)
|
|
{
|
|
u16 screenSize;
|
|
u16 bgType;
|
|
|
|
if (idx < sBoxPartyPokemonDropdownCount)
|
|
{
|
|
sBoxPartyPokemonDropdownPtr[idx].src1 = NULL;
|
|
sBoxPartyPokemonDropdownPtr[idx].src2 = src;
|
|
sBoxPartyPokemonDropdownPtr[idx].bgId = bgId;
|
|
sBoxPartyPokemonDropdownPtr[idx].src2Width = width;
|
|
sBoxPartyPokemonDropdownPtr[idx].src2Height = height;
|
|
screenSize = GetBgAttribute(bgId, BG_ATTR_SCREENSIZE);
|
|
bgType = GetBgAttribute(bgId, BG_ATTR_BGTYPE);
|
|
sBoxPartyPokemonDropdownPtr[idx].src1Height = sBGdims[bgType][screenSize].height;
|
|
sBoxPartyPokemonDropdownPtr[idx].src1Width = sBGdims[bgType][screenSize].width;
|
|
if (bgType != 0)
|
|
sBoxPartyPokemonDropdownPtr[idx].mapSize = 1;
|
|
else
|
|
sBoxPartyPokemonDropdownPtr[idx].mapSize = 2;
|
|
sBoxPartyPokemonDropdownPtr[idx].bytesPerRow = width * sBoxPartyPokemonDropdownPtr[idx].mapSize;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.width = width;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.height = height;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX = 0;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY = 0;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX2 = 0;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY2 = 0;
|
|
sBoxPartyPokemonDropdownPtr[idx].map1Rect = sBoxPartyPokemonDropdownPtr[idx].map2Rect;
|
|
sBoxPartyPokemonDropdownPtr[idx].bgUpdateScheduled = TRUE;
|
|
}
|
|
}
|
|
|
|
void SetBoxPartyPokemonDropdownMap1Tiles(u8 idx, const void * src)
|
|
{
|
|
if (idx < sBoxPartyPokemonDropdownCount)
|
|
{
|
|
sBoxPartyPokemonDropdownPtr[idx].src1 = src;
|
|
sBoxPartyPokemonDropdownPtr[idx].bgUpdateScheduled = TRUE;
|
|
}
|
|
}
|
|
|
|
void SetBoxPartyPokemonDropdownMap2Pos(u8 idx, u16 x, u16 y)
|
|
{
|
|
if (idx < sBoxPartyPokemonDropdownCount)
|
|
{
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX2 = x;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY2 = y;
|
|
sBoxPartyPokemonDropdownPtr[idx].bgUpdateScheduled = TRUE;
|
|
}
|
|
}
|
|
|
|
void SetBoxPartyPokemonDropdownMap2Rect(u8 idx, u16 x, u16 y, u16 width, u16 height)
|
|
{
|
|
if (idx < sBoxPartyPokemonDropdownCount)
|
|
{
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX = x;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY = y;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.width = width;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.height = height;
|
|
sBoxPartyPokemonDropdownPtr[idx].bgUpdateScheduled = TRUE;
|
|
}
|
|
}
|
|
|
|
void AdjustBoxPartyPokemonDropdownPos(u8 idx, u8 op, s8 param)
|
|
{
|
|
if (idx < sBoxPartyPokemonDropdownCount)
|
|
{
|
|
switch (op)
|
|
{
|
|
case BPPD_MOVE_INNER_LEFT:
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX2 += param;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.width -= param;
|
|
break;
|
|
case BPPD_MOVE_OUTER_LEFT:
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX += param;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.width += param;
|
|
break;
|
|
case BPPD_MOVE_INNER_TOP:
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY2 += param;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.height -= param;
|
|
break;
|
|
case BPPD_MOVE_OUTER_TOP:
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY -= param;
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.height += param;
|
|
break;
|
|
case BPPD_MOVE_INNER_X:
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX2 += param;
|
|
break;
|
|
case BPPD_MOVE_INNER_Y:
|
|
sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY2 += param;
|
|
break;
|
|
}
|
|
sBoxPartyPokemonDropdownPtr[idx].bgUpdateScheduled = TRUE;
|
|
}
|
|
}
|
|
|
|
void CopyBoxPartyPokemonDropdownToBgTilemapBuffer(u8 idx)
|
|
{
|
|
if (idx < sBoxPartyPokemonDropdownCount)
|
|
{
|
|
if (sBoxPartyPokemonDropdownPtr[idx].src1 != NULL)
|
|
PushMap1(idx);
|
|
PushMap2(idx);
|
|
sBoxPartyPokemonDropdownPtr[idx].map1Rect = sBoxPartyPokemonDropdownPtr[idx].map2Rect;
|
|
}
|
|
}
|
|
|
|
static void PushMap1(u8 idx)
|
|
{
|
|
int i;
|
|
int run = sBoxPartyPokemonDropdownPtr[idx].mapSize * sBoxPartyPokemonDropdownPtr[idx].src1Height;
|
|
const void * addr = sBoxPartyPokemonDropdownPtr[idx].src1 + run * sBoxPartyPokemonDropdownPtr[idx].map1Rect.destY2 + sBoxPartyPokemonDropdownPtr[idx].map1Rect.destX2 * sBoxPartyPokemonDropdownPtr[idx].mapSize;
|
|
for (i = 0; i < sBoxPartyPokemonDropdownPtr[idx].map1Rect.height; i++)
|
|
{
|
|
CopyToBgTilemapBufferRect(sBoxPartyPokemonDropdownPtr[idx].bgId, addr, sBoxPartyPokemonDropdownPtr[idx].map1Rect.destX2, sBoxPartyPokemonDropdownPtr[idx].map1Rect.destY2 + i, sBoxPartyPokemonDropdownPtr[idx].map1Rect.width, 1);
|
|
addr += run;
|
|
}
|
|
}
|
|
|
|
static void PushMap2(u8 idx)
|
|
{
|
|
int i;
|
|
int run = sBoxPartyPokemonDropdownPtr[idx].mapSize * sBoxPartyPokemonDropdownPtr[idx].src2Width;
|
|
const void * addr = sBoxPartyPokemonDropdownPtr[idx].src2 + run * sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY + sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX * sBoxPartyPokemonDropdownPtr[idx].mapSize;
|
|
for (i = 0; i < sBoxPartyPokemonDropdownPtr[idx].map2Rect.height; i++)
|
|
{
|
|
CopyToBgTilemapBufferRect(sBoxPartyPokemonDropdownPtr[idx].bgId, addr, sBoxPartyPokemonDropdownPtr[idx].map2Rect.destX2, sBoxPartyPokemonDropdownPtr[idx].map2Rect.destY2 + i, sBoxPartyPokemonDropdownPtr[idx].map2Rect.width, 1);
|
|
addr += run;
|
|
}
|
|
}
|