pokefirered/src/union_room_chat_objects.c
2020-01-25 21:00:51 -05:00

319 lines
8.5 KiB
C

#include "global.h"
#include "gflib.h"
#include "decompress.h"
#include "graphics.h"
#include "union_room_chat.h"
struct UnionRoomChat3
{
struct Sprite *selectorCursorSprite;
struct Sprite *characterSelectCursorSprite;
struct Sprite *textEntryCursorSprite;
struct Sprite *rButtonSprite;
struct Sprite *chatIconsSprite;
u16 cursorBlinkTimer;
};
static EWRAM_DATA struct UnionRoomChat3 *sWork = NULL;
static void SpriteCB_TextEntryCursor(struct Sprite * sprite);
static void SpriteCB_CharacterSelectCursor(struct Sprite * sprite);
static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/unk_845AC14.gbapal");
static const u32 sSelectorCursorGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AC34.4bpp.lz");
static const u32 sHorizontalBarGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AEB8.4bpp.lz");
static const u32 sMenuCursorGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AED8.4bpp.lz");
static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AF04.4bpp.lz");
static const struct CompressedSpriteSheet sSpriteSheets[] = {
{sSelectorCursorGfxTiles, 0x1000, 0},
{sMenuCursorGfxTiles, 0x0040, 1},
{sHorizontalBarGfxTiles, 0x0040, 2},
{sRButtonGfxTiles, 0x0080, 3},
{gUnionRoomChatIcons, 0x0400, 4}
};
static const struct SpritePalette sSpritePalette = {
sUnionRoomChatInterfacePal, 0
};
static const struct OamData sOamData_64x32_1 = {
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.priority = 1
};
static const union AnimCmd sAnim_CursorSmallOpen[] = {
ANIMCMD_FRAME(0x00, 30),
ANIMCMD_END
};
static const union AnimCmd sAnim_CursorSmallClosed[] = {
ANIMCMD_FRAME(0x20, 30),
ANIMCMD_END
};
static const union AnimCmd sAnim_CursorLargeOpen[] = {
ANIMCMD_FRAME(0x40, 30),
ANIMCMD_END
};
static const union AnimCmd sAnim_CursorLargeClosed[] = {
ANIMCMD_FRAME(0x60, 30),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnims_SelectorCursor[] = {
sAnim_CursorSmallOpen,
sAnim_CursorSmallClosed,
sAnim_CursorLargeOpen,
sAnim_CursorLargeClosed
};
static const struct SpriteTemplate sSpriteTemplate_SelectorCursor = {
.tileTag = 0,
.paletteTag = 0,
.oam = &sOamData_64x32_1,
.anims = sSpriteAnims_SelectorCursor,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
static const struct OamData sOamData_8x16_2 = {
.shape = SPRITE_SHAPE(8x16),
.size = SPRITE_SIZE(8x16),
.priority = 2
};
static const struct SpriteTemplate sSpriteTemplate_TextEntryCursor = {
.tileTag = 2,
.paletteTag = 0,
.oam = &sOamData_8x16_2,
.anims = gDummySpriteAnimTable,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_TextEntryCursor
};
static const struct SpriteTemplate sSpriteTemplate_CharacterSelectCursor = {
.tileTag = 1,
.paletteTag = 0,
.oam = &sOamData_8x16_2,
.anims = gDummySpriteAnimTable,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_CharacterSelectCursor
};
static const struct OamData sOamData_16x16_2 = {
.shape = SPRITE_SHAPE(16x16),
.size = SPRITE_SIZE(16x16),
.priority = 2
};
static const struct OamData sOamData_32x16_2 = {
.shape = SPRITE_SHAPE(32x16),
.size = SPRITE_SIZE(32x16),
.priority = 2
};
static const union AnimCmd sAnim_UnionRoomChatIcons_ToggleCase[] = {
ANIMCMD_FRAME(0x00, 2),
ANIMCMD_END
};
static const union AnimCmd sAnim_UnionRoomChatIcons_Dummy1[] = {
ANIMCMD_FRAME(0x08, 2),
ANIMCMD_END
};
static const union AnimCmd sAnim_UnionRoomChatIcons_Dummy2[] = {
ANIMCMD_FRAME(0x10, 2),
ANIMCMD_END
};
static const union AnimCmd sAnim_UnionRoomChatIcons_Register[] = {
ANIMCMD_FRAME(0x18, 2),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_UnionRoomChatIcons[] = {
sAnim_UnionRoomChatIcons_ToggleCase,
sAnim_UnionRoomChatIcons_Dummy1,
sAnim_UnionRoomChatIcons_Dummy2,
sAnim_UnionRoomChatIcons_Register
};
static const struct SpriteTemplate sSpriteTemplate_RButton = {
.tileTag = 3,
.paletteTag = 0,
.oam = &sOamData_16x16_2,
.anims = gDummySpriteAnimTable,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
static const struct SpriteTemplate sSpriteTemplate_UnionRoomChatIcons = {
.tileTag = 4,
.paletteTag = 0,
.oam = &sOamData_32x16_2,
.anims = sSpriteAnimTable_UnionRoomChatIcons,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
bool32 UnionRoomChat_TryAllocSpriteWork(void)
{
int i;
for (i = 0; i < NELEMS(sSpriteSheets); i++)
LoadCompressedSpriteSheet(&sSpriteSheets[i]);
LoadSpritePalette(&sSpritePalette);
sWork = Alloc(sizeof(struct UnionRoomChat3));
if (sWork == NULL)
return FALSE;
return TRUE;
}
void UnionRoomChat_FreeSpriteWork(void)
{
if (sWork != NULL)
Free(sWork);
}
void UnionRoomChat_CreateSelectorCursorObj(void)
{
u8 spriteId = CreateSprite(&sSpriteTemplate_SelectorCursor, 10, 24, 0);
sWork->selectorCursorSprite = &gSprites[spriteId];
}
void UnionRoomChat_ToggleSelectorCursorObjVisibility(bool32 invisible)
{
sWork->selectorCursorSprite->invisible = invisible;
}
void UnionRoomChat_MoveSelectorCursorObj(void)
{
u8 x, y;
u8 page = GetCurrentKeyboardPage();
UnionRoomChat_GetCursorColAndRow(&x, &y);
if (page != UNION_ROOM_KB_PAGE_COUNT)
{
StartSpriteAnim(sWork->selectorCursorSprite, 0);
sWork->selectorCursorSprite->pos1.x = x * 8 + 10;
sWork->selectorCursorSprite->pos1.y = y * 12 + 24;
}
else
{
StartSpriteAnim(sWork->selectorCursorSprite, 2);
sWork->selectorCursorSprite->pos1.x = 24;
sWork->selectorCursorSprite->pos1.y = y * 12 + 24;
}
}
void UnionRoomChat_UpdateObjPalCycle(int arg0)
{
const u16 *palette = &sUnionRoomChatInterfacePal[arg0 * 2 + 1];
u8 index = IndexOfSpritePaletteTag(0);
LoadPalette(palette, index * 16 + 0x101, 4);
}
void UnionRoomChat_SetSelectorCursorClosedImage(void)
{
if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)
StartSpriteAnim(sWork->selectorCursorSprite, 1);
else
StartSpriteAnim(sWork->selectorCursorSprite, 3);
sWork->cursorBlinkTimer = 0;
}
bool32 UnionRoomChat_AnimateSelectorCursorReopen(void)
{
if (sWork->cursorBlinkTimer > 3)
return FALSE;
if (++sWork->cursorBlinkTimer > 3)
{
if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)
StartSpriteAnim(sWork->selectorCursorSprite, 0);
else
StartSpriteAnim(sWork->selectorCursorSprite, 2);
return FALSE;
}
return TRUE;
}
void UnionRoomChat_SpawnTextEntryPointerSprites(void)
{
u8 spriteId = CreateSprite(&sSpriteTemplate_TextEntryCursor, 76, 152, 2);
sWork->textEntryCursorSprite = &gSprites[spriteId];
spriteId = CreateSprite(&sSpriteTemplate_CharacterSelectCursor, 64, 152, 1);
sWork->characterSelectCursorSprite = &gSprites[spriteId];
}
static void SpriteCB_TextEntryCursor(struct Sprite *sprite)
{
int var0 = UnionRoomChat_GetMessageEntryCursorPosition();
if (var0 == 15)
{
sprite->invisible = TRUE;
}
else
{
sprite->invisible = FALSE;
sprite->pos1.x = var0 * 8 + 76;
}
}
static void SpriteCB_CharacterSelectCursor(struct Sprite *sprite)
{
if (++sprite->data[0] > 4)
{
sprite->data[0] = 0;
if (++sprite->pos2.x > 4)
sprite->pos2.x = 0;
}
}
void CreatePageSwitchUISprites(void)
{
u8 spriteId = CreateSprite(&sSpriteTemplate_RButton, 8, 152, 3);
sWork->rButtonSprite = &gSprites[spriteId];
spriteId = CreateSprite(&sSpriteTemplate_UnionRoomChatIcons, 32, 152, 4);
sWork->chatIconsSprite = &gSprites[spriteId];
sWork->chatIconsSprite->invisible = TRUE;
}
void UpdateVisibleUnionRoomChatIcon(void)
{
if (GetCurrentKeyboardPage() == UNION_ROOM_KB_PAGE_COUNT)
{
if (UnionRoomChat_LenMessageEntryBuffer() != 0)
{
// REGISTER
sWork->chatIconsSprite->invisible = FALSE;
StartSpriteAnim(sWork->chatIconsSprite, 3);
}
else
{
sWork->chatIconsSprite->invisible = TRUE;
}
}
else
{
int anim = UnionRoomChat_GetWhetherShouldShowCaseToggleIcon();
if (anim == 3)
{
sWork->chatIconsSprite->invisible = TRUE;
}
else
{
// A <--> a
sWork->chatIconsSprite->invisible = FALSE;
StartSpriteAnim(sWork->chatIconsSprite, anim);
}
}
}