summaryrefslogtreecommitdiff
path: root/src/union_room_chat_objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/union_room_chat_objects.c')
-rw-r--r--src/union_room_chat_objects.c318
1 files changed, 318 insertions, 0 deletions
diff --git a/src/union_room_chat_objects.c b/src/union_room_chat_objects.c
new file mode 100644
index 000000000..f97136a0a
--- /dev/null
+++ b/src/union_room_chat_objects.c
@@ -0,0 +1,318 @@
+#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);
+ }
+ }
+}