diff options
Diffstat (limited to 'src/union_room_chat_objects.c')
-rw-r--r-- | src/union_room_chat_objects.c | 318 |
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); + } + } +} |