export type CharacterSex = 'male' | 'female'; export type HairStyleId = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; export declare const HAIR_STYLE_IDS: HairStyleId[]; export type HeadPresetId = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7; export declare const HEAD_PRESET_IDS: HeadPresetId[]; export type BodyTypeId = 'slim' | 'average' | 'athletic' | 'stocky'; export declare const BODY_TYPE_IDS: BodyTypeId[]; export type EyebrowStyleId = 0 | 1; export declare const EYEBROW_STYLE_IDS: EyebrowStyleId[]; /** Existing clean/full-beard values stay stable for all saved characters. */ export type FacialHairId = 0 | 1 | 2 | 3 | 4 | 5; export declare const FACIAL_HAIR_IDS: FacialHairId[]; /** * Modular outfit worn over the base body. Sex-neutral: the part list for each * sex is resolved from the outfit manifest at render time * (public/assets/models/outfits/manifest.json, built by scripts/build-outfits.mjs). * * `null` means no outfit - the character renders with the legacy painted-on * top/trousers/boots zones instead. */ export type OutfitId = 'peasant' | 'ranger'; export declare const OUTFIT_IDS: OutfitId[]; export declare const OUTFIT_LABELS: Record; /** * What the free starter look wears below the belt: the concept sheet's * cropped trousers, or its wrap skirt (F3 and F5). Optional so the NPC * appearance literals stay valid; omitted means trousers. */ export type LegwearId = 'trousers' | 'skirt'; export declare const LEGWEAR_IDS: LegwearId[]; export declare const LEGWEAR_LABELS: Record; export type CharacterAppearance = { sex: CharacterSex; /** * Optional so that omitting it means "no outfit" - the character keeps the * legacy painted-on look. That is the safe default for the many NPC * appearance literals that predate the outfit system. */ outfit?: OutfitId | null; legwear?: LegwearId; hairStyle: HairStyleId; headPreset: HeadPresetId; bodyType: BodyTypeId; eyebrowStyle: EyebrowStyleId; facialHair: FacialHairId; hairColor: string; beardColor: string; browColor: string; topColor: string; trousersColor: string; skinTone: string; bootColor: string; handsColor: string; eyeColor: string; }; export declare const HAIR_STYLE_LABELS: Record; export declare const BODY_TYPE_LABELS: Record; export declare const EYEBROW_STYLE_LABELS: Record; export declare const FACIAL_HAIR_LABELS: Record; export declare const HEAD_PRESET_LABELS: Record; export declare const COLOR_PRESETS: readonly ["#f6d7c3", "#e8b98a", "#c98a5c", "#8d5524", "#3b2214", "#1a1a1a", "#2b2b2b", "#2c3340", "#dfe7ef", "#1f1812", "#3d6b4f", "#2f4d7a", "#8b3a3a", "#c4a35a", "#c65d2e", "#6b4d8f", "#e8e4dc", "#5a6673", "#2e8b6e", "#7fa8c9", "#a8742f", "#4a2c1a", "#f2c14e", "#c9502e", "#7d6f52", "#5c4a34", "#8a7a5c", "#6b6152"]; export declare const EYE_COLOR_PRESETS: readonly ["#2a1a10", "#4a2c1a", "#7a5230", "#a8742f", "#3d6b4f", "#2e8b6e", "#3b6ea5", "#7fa8c9", "#5a6673", "#6b4d8f", "#1a1a1a", "#c4a35a"]; /** * Skin runs as an even light-to-dark ramp rather than sharing the generic * colour bag - picking a skin tone should feel like moving along a scale, not * hunting for the believable entries among greens and purples. */ export declare const SKIN_TONE_PRESETS: readonly ["#f7e2d2", "#f2d4bd", "#ebc4a5", "#e0b088", "#d19a6f", "#bf8459", "#a86d45", "#8f5734", "#754427", "#5c341c", "#452614", "#311b0e"]; /** Natural hair only, ordered fair to black, with greys and reds grouped. */ export declare const HAIR_COLOR_PRESETS: readonly ["#efe3c2", "#e2c684", "#c9a04e", "#b8862f", "#8f5a20", "#6d4320", "#523118", "#3a2211", "#241510", "#12100f", "#c1512a", "#8f3a20", "#b9b3a6", "#e6e3dc"]; /** Muted, hard-wearing cloth and leather - adventurer kit, not carnival. */ export declare const CLOTH_COLOR_PRESETS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"]; export declare const COLOR_PALETTE: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"]; export declare const EYE_COLORS: readonly ["#2a1a10", "#4a2c1a", "#7a5230", "#a8742f", "#3d6b4f", "#2e8b6e", "#3b6ea5", "#7fa8c9", "#5a6673", "#6b4d8f", "#1a1a1a", "#c4a35a"]; export declare const SKIN_TONES: readonly ["#f7e2d2", "#f2d4bd", "#ebc4a5", "#e0b088", "#d19a6f", "#bf8459", "#a86d45", "#8f5734", "#754427", "#5c341c", "#452614", "#311b0e"]; export declare const HAIR_COLORS: readonly ["#efe3c2", "#e2c684", "#c9a04e", "#b8862f", "#8f5a20", "#6d4320", "#523118", "#3a2211", "#241510", "#12100f", "#c1512a", "#8f3a20", "#b9b3a6", "#e6e3dc"]; export declare const TOP_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"]; export declare const TROUSER_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"]; export declare const BOOT_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"]; export declare const HANDS_COLORS: readonly ["#e8e4dc", "#b9b2a2", "#8a7a5c", "#6b6152", "#5c4a34", "#4a2c1a", "#3b2214", "#2b2b2b", "#1f1812", "#3d6b4f", "#2e6b52", "#4a5a3a", "#2f4d7a", "#3b6ea5", "#5a6673", "#8b3a3a", "#a8452e", "#c4a35a", "#a8742f", "#6b4d8f"]; export type HslColor = { h: number; s: number; l: number; }; export declare function hexToHsl(hex: string): HslColor; export declare function hslToHex(h: number, s: number, l: number): string; export declare function defaultAppearance(sex?: CharacterSex): CharacterAppearance; export declare function normalizeAppearance(raw: unknown): CharacterAppearance; /** * Victoria's character re-design. * * A SERVICE, not an item - it never enters a bag. Bought through the ordinary * shop path (stock, price, coin check) and delivered by opening the character * designer, exactly the way the Stable Master's draft horse is bought like * stock and delivered as quest state. * * Appearance only. The name is deliberately not editable: names are how players * know each other, they are unique-checked at creation, and letting someone * change one for gold turns every reputation into a costume. So the redesign * enters the designer at its appearance step and never shows the name field. */ export declare const CHARACTER_REDESIGN_KIND = "characterredesign"; export declare const CHARACTER_REDESIGN_PRICE = 10000; //# sourceMappingURL=appearance.d.ts.map