Exact source used by this build. SHA-256: 0326e362af78496fa3d27964ff9064ed3be46c5c33dc2efd981798d33ee44427.

1 import type { Facing, Season, Weather } from '../../types';
2 import type { Quality } from '../items';
3 export type Taste = 'love' | 'like' | 'neutral' | 'dislike' | 'hate';
4 export type RelationshipStatus = 'friend' | 'dating' | 'engaged' | 'spouse';
5 export interface TasteList { itemIds: string[]; tags: string[] }
6 export type Tastes = Record<Taste, TasteList>;
7 export interface Poi { id: string; areaId: string; x: number; y: number; facing: Facing }
8 export interface ScheduleEntry { time: number; poiId: string; facing: Facing }
9 export interface VillagerDefinition {
10   id: string; name: string; description: string; homePoiId: string; workplacePoiId: string;
11   birthday: { season: Season; day: number }; marriageCandidate: boolean; giftTastes: Tastes;
12   shopId?: string; counterPoiId?: string; spriteKey: string; portraitKey: string; iconKey: string;
13   schedules: { weekday: ScheduleEntry[]; weekdays: Record<string, ScheduleEntry[]>; rain: ScheduleEntry[]; seasons: Partial<Record<Season, ScheduleEntry[]>>; festivals: Record<string, ScheduleEntry[]> };
14 }
15 export type HeartTier = 'blue' | 'green' | 'yellow' | 'red' | 'purple' | 'star';
16 export interface DialogueDefinition { key: string; villagerId?: string; text: string; conditions: { heartTier?: HeartTier; season?: Season; weekday?: number; weather?: Weather; location?: string; firstMeeting?: boolean; birthday?: boolean; giftTaste?: Taste } }
17 export type EventStep = { kind: 'move'; actorId: string; poiId: string } | { kind: 'face'; actorId: string; facing: Facing } | { kind: 'dialogue'; actorId: string; key: string } | { kind: 'choice'; key: string; choices: { id: string; key: string; friendshipDelta: number }[] } | { kind: 'fade'; direction: 'in' | 'out'; durationMs: number };
18 export interface HeartEventDefinition { id: string; villagerId: string; trigger: { minHearts: number; areaId: string; startMinute: number; endMinute: number; weather: Weather[] }; actors: { id: string; poiId: string; facing: Facing }[]; script: EventStep[] }
19 export interface MailDefinition { id: string; villagerId: string; key: string; trigger: { kind: 'friendship'; minHearts: number } | { kind: 'quest'; questId: string }; recipeId?: string }
20 export interface QuestDefinition { id: string; kind: 'delivery' | 'gathering' | 'slay' | 'fishing'; villagerId: string; key: string; itemId?: string; itemTag?: string; monsterTag?: string; quantity: number; durationDays: number; rewardItemId: string }
21 export interface VillagersConfig {
22   npcTilesPerSecond: number; updateIntervalMs: number; pointsPerHeart: number; friendshipCap: number; candidateCap: number; candidateDecayStop: number; spouseCap: number;
23   talkPoints: number; giftsPerDay: number; giftsPerWeek: number; weeklyGiftBonus: number; weeklyResetDay: number; tastePoints: Record<Taste, number>;
24   giftQualityMultipliers: Record<Quality, number>; birthdayMultiplier: number; decay: { friend: number; dating: number; spouse: number };
25   interactionRange: number; questPriceMultiplier: number; questFriendship: number; bouquetItemId: string; pendantItemId: string; weddingDelayDays: number;
26   bulletinPoiId: string; mailboxPoiId: string; bouquetHearts: number; pendantHearts: number; bouquetFriendshipPoints: number;
27   spouseChores: ('water_crops' | 'feed_animals' | 'repair_fences')[]; dialogueFallbackOrder: (keyof DialogueDefinition['conditions'] | 'default')[];
28   heartTiers: { id: HeartTier; minHearts: number; color: string; iconKey: string }[];
29 }
30 export interface VillagersContent { config: VillagersConfig; villagers: VillagerDefinition[]; pois: Poi[]; universalTastes: Tastes; dialogue: DialogueDefinition[]; events: HeartEventDefinition[]; mail: MailDefinition[]; quests: QuestDefinition[]; festivalDays: { id: string; season: Season; day: number }[] }
31 export interface RoutePoint { areaId: string; x: number; y: number; warpId?: string }
32 export interface NpcState { id: string; areaId: string; x: number; y: number; facing: Facing; poiId: string | null; targetPoiId: string; path: RoutePoint[]; traveledPath: RoutePoint[]; moving: boolean }
33 export interface VillagersWorld { day: string; npcs: Record<string, NpcState>; board: { id: string; questId: string; day: number } | null }
34 export interface Friendship { points: number; met: boolean; talkedDay: string | null; giftDay: string | null; giftWeek: number; giftsThisWeek: number; status: RelationshipStatus; weddingDay: number | null }
35 export interface PlayerQuest { id: string; questId: string; acceptedDay: number; expiresDay: number; progress: number; completed: boolean }
36 export interface VillagersPlayer { friendships: Record<string, Friendship>; dialogue: { villagerId: string; key: string; text: string } | null; activeEvent: { eventId: string; step: number } | null; seenEvents: string[]; eventChoices: Record<string, string>; mailbox: { id: string; mailId: string; receivedDay: number; read: boolean }[]; knownRecipes: string[]; quests: PlayerQuest[]; completedQuestIds: string[]; lastProcessedDay: number | null; spouseChores: { villagerId: string; day: number; kind: 'water_crops' | 'feed_animals' | 'repair_fences' }[] }
37