diff --git a/src/lib/types/api/entities.ts b/src/lib/types/api/entities.ts new file mode 100644 index 00000000..062cecef --- /dev/null +++ b/src/lib/types/api/entities.ts @@ -0,0 +1,174 @@ +// Core entity types based on Rails blueprints +// These are the base types for game objects + +export interface LocalizedName { + en: string + ja: string +} + +// Weapon entity from WeaponBlueprint +export interface Weapon { + id: string + granblueId: string + name: LocalizedName + element: number + proficiency: number + rarity: number + maxLevel: number + maxSkillLevel: number + maxAwakeningLevel: number + series: number + ax: boolean + axType: number + hp: { + minHp: number + maxHp: number + maxHpFlb: number + maxHpUlb: number + } + atk: { + minAtk: number + maxAtk: number + maxAtkFlb: number + maxAtkUlb: number + } + uncap: { + flb: boolean + ulb: boolean + transcendence: boolean + } +} + +// Character entity from CharacterBlueprint +export interface Character { + id: string + granblueId: string + name: LocalizedName + element: number + rarity: number + maxLevel: number + flb: boolean + ulb: boolean + transcendence: boolean + special: boolean + recruits: string | null +} + +// Summon entity from SummonBlueprint +export interface Summon { + id: string + granblueId: string + name: LocalizedName + element: number + rarity: number + maxLevel: number + flb: boolean + ulb: boolean + transcendence: boolean + subaura: boolean + hp: { + minHp: number + maxHp: number + maxHpFlb: number + maxHpUlb: number + } + atk: { + minAtk: number + maxAtk: number + maxAtkFlb: number + maxAtkUlb: number + } +} + +// Job entity from JobBlueprint +export interface Job { + id: string + granblueId: string + name: LocalizedName + row: number + order: number + proficiency: [number, number] + masterLevel?: number + ultimateMastery?: number + accessory?: boolean + accessoryType?: number +} + +// JobSkill entity +export interface JobSkill { + id: string + name: LocalizedName + slug: string + category: number + main: boolean + sub: boolean +} + +// JobAccessory entity +export interface JobAccessory { + id: string + name: LocalizedName + slug: string + granblueId: string +} + +// Raid entity from RaidBlueprint +export interface Raid { + id: string + slug: string + name: LocalizedName + level: number + element: number + group?: RaidGroup +} + +// RaidGroup entity from RaidGroupBlueprint +export interface RaidGroup { + id: string + name: LocalizedName + section: string + order: number + difficulty: number + hl: boolean + extra: boolean + guidebooks: boolean +} + +// Awakening entity +export interface Awakening { + id: string + name: LocalizedName + slug: string +} + +// WeaponKey entity +export interface WeaponKey { + id: string + name: LocalizedName + slug: string + keyType: string + slot: number +} + +// SimpleAxSkill for weapon AX skills +export interface SimpleAxSkill { + modifier: number + strength: number +} + +// Guidebook entity +export interface Guidebook { + id: string + name: LocalizedName + slug: string +} + +// User entity +export interface User { + id: string + username: string + profilePicture?: string + role?: string + createdAt?: string + updatedAt?: string +} \ No newline at end of file diff --git a/src/lib/types/api/party.ts b/src/lib/types/api/party.ts new file mode 100644 index 00000000..4983bef8 --- /dev/null +++ b/src/lib/types/api/party.ts @@ -0,0 +1,168 @@ +// Party and Grid types based on Rails blueprints +// These define the party composition structure + +import type { + Weapon, + Character, + Summon, + Job, + JobSkill, + JobAccessory, + Raid, + Guidebook, + User, + Awakening, + WeaponKey, + SimpleAxSkill +} from './entities' + +// Grid item types - these are the junction tables between Party and entities + +// GridWeapon from GridWeaponBlueprint +export interface GridWeapon { + id: string + position: number + mainhand?: boolean + uncapLevel?: number + transcendenceStep?: number + element?: number + weapon: Weapon // Named properly, not "object" + weaponKeys?: WeaponKey[] + ax?: SimpleAxSkill[] + awakening?: { + type: Awakening + level: number + } +} + +// GridCharacter from GridCharacterBlueprint +export interface GridCharacter { + id: string + position: number + uncapLevel?: number + perpetuity?: boolean + transcendenceStep?: number + character: Character // Named properly, not "object" + awakening?: Awakening + rings?: Array<{ modifier: number; strength: number }> + earring?: { modifier: number; strength: number } + aetherial_mastery?: { modifier: number; strength: number } + over_mastery?: Array<{ modifier: number; strength: number }> +} + +// GridSummon from GridSummonBlueprint +export interface GridSummon { + id: string + position: number + main?: boolean + friend?: boolean + quickSummon?: boolean + uncapLevel?: number + transcendenceStep?: number + summon: Summon // Named properly, not "object" +} + +// JobSkillList for party job skills +export interface JobSkillList { + 0?: JobSkill + 1?: JobSkill + 2?: JobSkill + 3?: JobSkill +} + +// GuidebookList for party guidebooks +export interface GuidebookList { + 0?: Guidebook + 1?: Guidebook + 2?: Guidebook +} + +// Party from PartyBlueprint +export interface Party { + id: string + shortcode: string + name?: string + description?: string + fullAuto?: boolean + autoGuard?: boolean + autoSummon?: boolean + chargeAttack?: boolean + clearTime?: number + buttonCount?: number + turnCount?: number + chainCount?: number + visibility?: number + favorited?: boolean + extra?: boolean + remix?: boolean + + // Relationships + weapons: GridWeapon[] + characters: GridCharacter[] + summons: GridSummon[] + job?: Job + jobSkills?: JobSkillList + accessory?: JobAccessory + raid?: Raid + guidebooks?: GuidebookList + user?: User + sourceParty?: Party + remixes?: Party[] + + // Local client state + localId?: string + + // Timestamps + createdAt?: string + updatedAt?: string +} + +// Minimal party for list views +export interface PartyPreview { + id: string + shortcode: string + name?: string + favorited?: boolean + visibility?: number + raid?: { + name: { en: string; ja: string } + group?: { + difficulty?: number + extra?: boolean + guidebooks?: boolean + } + } + job?: { + name: { en: string; ja: string } + } + weapons: Array<{ + position: number + mainhand?: boolean + weapon: { + granblueId: number + name?: { en: string; ja: string } + } + }> + characters: Array<{ + position: number + character: { + granblueId: number + name?: { en: string; ja: string } + } + }> + summons: Array<{ + position: number + main?: boolean + friend?: boolean + summon: { + granblueId: number + name?: { en: string; ja: string } + } + }> + user?: { + id: string + username: string + } + createdAt?: string + updatedAt?: string +} \ No newline at end of file