export interface UserProfile { id: string; displayName: string; avatarUrl: string; bio: string; joinedAt: number; badges: Badge[]; stats: UserStats; socialLinks: SocialLink[]; privacy: PrivacySettings; } export interface Badge { id: string; name: string; icon: string; description: string; earnedAt: number; } export interface UserStats { gamesPublished: number; gamesPlayed: number; totalPlayTimeMs: number; assetsShared: number; ratingsGiven: number; followersCount: number; followingCount: number; jamParticipations: number; } export interface SocialLink { platform: 'github' | 'twitter' | 'youtube' | 'discord' | 'website' | 'itch'; url: string; } export interface PrivacySettings { profilePublic: boolean; showActivity: boolean; allowMessages: boolean; showOnlineStatus: boolean; } export type AssetCategory = 'sprites' | 'tilesets' | 'animations' | 'audio-sfx' | 'audio-music' | 'fonts' | 'ui-themes' | 'templates' | 'scripts' | 'shaders' | 'models-3d' | 'particles' | 'complete-projects'; export type AssetLicense = 'free' | 'cc0' | 'cc-by' | 'cc-by-sa' | 'cc-by-nc' | 'commercial' | 'custom'; export interface MarketplaceAsset { id: string; name: string; description: string; authorId: string; category: AssetCategory; tags: string[]; license: AssetLicense; version: string; price: number; currency: string; thumbnailUrl: string; previewUrls: string[]; downloadCount: number; rating: number; ratingCount: number; fileSize: number; createdAt: number; updatedAt: number; compatibility: string[]; } export interface MarketplaceQuery { search?: string; category?: AssetCategory; tags?: string[]; license?: AssetLicense; priceMin?: number; priceMax?: number; sortBy: 'relevance' | 'newest' | 'popular' | 'rating' | 'price-asc' | 'price-desc'; page: number; pageSize: number; } export interface MarketplaceResult { assets: MarketplaceAsset[]; total: number; page: number; pageSize: number; } export declare function createMarketplaceQuery(partial?: Partial): MarketplaceQuery; export type GameVisibility = 'public' | 'unlisted' | 'private' | 'draft'; export type ContentRating = 'everyone' | 'teen' | 'mature'; export interface PublishedGame { id: string; title: string; slug: string; authorId: string; description: string; shortDescription: string; thumbnailUrl: string; coverImageUrl: string; screenshotUrls: string[]; visibility: GameVisibility; contentRating: ContentRating; genre: string[]; tags: string[]; version: string; engineVersion: string; playCount: number; likeCount: number; commentCount: number; rating: number; ratingCount: number; createdAt: number; updatedAt: number; publishedAt: number; controls: ControlSchemeInfo; features: GameFeature[]; minPlayers: number; maxPlayers: number; embeddable: boolean; remixable: boolean; sourceGameId?: string; } export type GameFeature = 'multiplayer' | 'mobile' | 'controller' | 'achievements' | 'leaderboards' | 'cloud-save' | 'vr' | 'ar'; export interface ControlSchemeInfo { keyboard: boolean; mouse: boolean; touch: boolean; gamepad: boolean; vr: boolean; } export interface PublishConfig { title: string; description: string; visibility: GameVisibility; contentRating: ContentRating; genre: string[]; tags: string[]; controls: ControlSchemeInfo; remixable: boolean; minPlayers: number; maxPlayers: number; } export interface Comment { id: string; authorId: string; targetId: string; targetType: 'game' | 'asset'; text: string; createdAt: number; updatedAt: number; likes: number; parentId?: string; isEdited: boolean; isPinned: boolean; } export interface Rating { authorId: string; targetId: string; targetType: 'game' | 'asset'; score: number; review?: string; createdAt: number; } export interface RatingAggregate { targetId: string; average: number; count: number; distribution: [number, number, number, number, number]; } export declare function computeRatingAggregate(ratings: Rating[]): RatingAggregate; export type JamPhase = 'upcoming' | 'submission' | 'voting' | 'results' | 'archived'; export interface GameJam { id: string; title: string; description: string; theme?: string; hostId: string; startDate: number; endDate: number; votingEndDate: number; phase: JamPhase; rules: string; prizes: JamPrize[]; categories: JamCategory[]; participants: number; submissions: number; maxTeamSize: number; allowLateSubmission: boolean; featured: boolean; } export interface JamPrize { place: number; description: string; value?: string; } export interface JamCategory { name: string; description: string; weight: number; } export interface JamSubmission { id: string; jamId: string; gameId: string; teamName: string; teamMembers: string[]; submittedAt: number; description: string; scores: JamScore[]; rank?: number; finalScore?: number; } export interface JamScore { category: string; score: number; voterId: string; } export declare function computeJamPhase(jam: GameJam, now: number): JamPhase; export declare function computeJamResults(submissions: JamSubmission[], categories: JamCategory[]): JamSubmission[]; export interface FeaturedCollection { id: string; title: string; description: string; gameIds: string[]; curatedBy: string; createdAt: number; displayOrder: number; } export interface DiscoveryFeed { featured: FeaturedCollection[]; trending: string[]; newReleases: string[]; topRated: string[]; staffPicks: string[]; forYou: string[]; } export interface GameRecommendation { gameId: string; score: number; reason: 'similar-genre' | 'same-author' | 'played-similar' | 'trending' | 'friends-playing'; } /** Simple content-based recommendation by genre/tag overlap. */ export declare function recommendGames(userPlayedGames: PublishedGame[], allGames: PublishedGame[], limit?: number): GameRecommendation[]; export type NotificationType = 'comment' | 'rating' | 'follow' | 'jam-start' | 'jam-result' | 'game-feature' | 'asset-review' | 'system' | 'achievement'; export interface UserNotification { id: string; userId: string; type: NotificationType; title: string; message: string; link?: string; read: boolean; createdAt: number; }