import type { CardDefinition } from '../../types'; import { getRecord, getBlobURL } from '$lib/atproto'; import RPGActorCard from './RPGActorCard.svelte'; import type { Did } from '@atcute/lexicons'; export type RpgSpriteRecord = { rows: number; columns: number; frames: number; width: number; height: number; frameWidth: number; frameHeight: number; isCustom?: boolean; createdAt?: string; spriteSheet: { $type: 'blob'; ref: { $link: string }; mimeType: string; size: number; }; }; export type RpgActorData = { sprite: RpgSpriteRecord; url: string; } | null; export const RPGActorCardDefinition = { type: 'rpgActor', contentComponent: RPGActorCard, createNew: (item) => { item.w = 4; item.h = 2; item.mobileW = 8; item.mobileH = 2; }, loadData: async (_items, { did }) => { try { const record = await getRecord({ did: did as Did, collection: 'actor.rpg.sprite', rkey: 'self' }); const value = record?.value as RpgSpriteRecord | undefined; if (!value?.spriteSheet) return null; const url = await getBlobURL({ did: did as Did, blob: value.spriteSheet }); return { sprite: value, url } satisfies RpgActorData; } catch { return null; } }, cacheLoadData: true, minW: 2, minH: 1, name: 'RPG Character', keywords: ['rpg', 'sprite', 'character', 'actor', 'avatar', 'pixel', 'game'], groups: ['Social'], canHaveLabel: true, icon: `` } as CardDefinition & { type: 'rpgActor' };