not-tonight/src/data/outfits.ts
2026-07-19 16:20:53 +10:00

85 lines
4.0 KiB
TypeScript

import type { OutfitSlot } from './types';
// Outfit vocabulary. Types/colours the generator draws from and dress-code rules
// predicate on. Slot taxonomy cross-checked against the 90sDJsim wardrobe catalog
// (docs/ASSETS.md §1) so a future art pass maps 1:1.
export interface OutfitTypeDef {
type: string;
weight: number;
colours: readonly string[];
canLogo?: boolean;
canVintage?: boolean;
}
export const PALETTE: Record<string, number> = {
white: 0xf2f2f2,
black: 0x14141c,
grey: 0x8a8a94,
navy: 0x1e2a52,
red: 0xc03434,
green: 0x2e7d46,
blue: 0x3465c0,
pink: 0xe06fa4,
purple: 0x7a4fc0,
yellow: 0xd8c23a,
orange: 0xd07c2e,
brown: 0x6e4a2e,
cream: 0xe8ddc0,
denim: 0x4a6a95,
};
export const OUTFIT_VOCAB: Record<OutfitSlot, readonly OutfitTypeDef[]> = {
shoes: [
{ type: 'sneaker', weight: 5, colours: ['white', 'black', 'red', 'grey'], canLogo: true, canVintage: true },
{ type: 'boot', weight: 2, colours: ['black', 'brown'] },
{ type: 'dress', weight: 2, colours: ['black', 'brown'] },
{ type: 'heel', weight: 2, colours: ['black', 'red', 'pink', 'white'] },
{ type: 'thong', weight: 1, colours: ['black', 'blue', 'yellow'] }, // the footwear, obviously
{ type: 'loafer', weight: 1, colours: ['brown', 'black', 'cream'] },
{ type: 'platform', weight: 1, colours: ['black', 'purple', 'pink'], canVintage: true },
],
legs: [
{ type: 'jeans', weight: 5, colours: ['denim', 'black', 'grey'] },
{ type: 'chinos', weight: 3, colours: ['cream', 'navy', 'brown'] },
{ type: 'skirt', weight: 3, colours: ['black', 'red', 'denim', 'pink'] },
{ type: 'trackies', weight: 2, colours: ['grey', 'black', 'navy'], canLogo: true },
{ type: 'shorts', weight: 2, colours: ['denim', 'cream', 'black'] },
{ type: 'slacks', weight: 2, colours: ['black', 'grey', 'navy'] },
{ type: 'cargo', weight: 1, colours: ['green', 'grey', 'brown'] },
],
top: [
{ type: 'tee', weight: 5, colours: ['white', 'black', 'grey', 'red', 'green', 'navy'], canLogo: true, canVintage: true },
{ type: 'shirt', weight: 4, colours: ['white', 'blue', 'pink', 'cream'] },
{ type: 'singlet', weight: 2, colours: ['white', 'black', 'grey'], canLogo: true },
{ type: 'polo', weight: 2, colours: ['navy', 'white', 'green', 'red'], canLogo: true },
{ type: 'crop', weight: 2, colours: ['white', 'black', 'pink', 'purple'] },
{ type: 'dressShirt', weight: 2, colours: ['white', 'black'] },
{ type: 'jersey', weight: 1, colours: ['red', 'blue', 'yellow'], canLogo: true, canVintage: true },
],
outer: [
{ type: 'none', weight: 6, colours: ['black'] },
{ type: 'blazer', weight: 2, colours: ['black', 'navy', 'grey'] },
{ type: 'bomber', weight: 2, colours: ['black', 'green', 'navy'], canLogo: true, canVintage: true },
{ type: 'hoodie', weight: 2, colours: ['black', 'grey', 'red'], canLogo: true },
{ type: 'leather', weight: 1, colours: ['black', 'brown'], canVintage: true },
{ type: 'puffer', weight: 1, colours: ['black', 'orange', 'purple'], canLogo: true },
],
hair: [
{ type: 'short', weight: 5, colours: ['black', 'brown', 'yellow', 'grey'] },
{ type: 'long', weight: 3, colours: ['black', 'brown', 'yellow', 'red'] },
{ type: 'bun', weight: 2, colours: ['black', 'brown', 'yellow'] },
{ type: 'mullet', weight: 2, colours: ['brown', 'yellow', 'black'], canVintage: true },
{ type: 'shaved', weight: 2, colours: ['black', 'brown'] },
{ type: 'dyed', weight: 1, colours: ['pink', 'green', 'purple', 'blue'] },
],
accessory: [
{ type: 'none', weight: 6, colours: ['black'] },
{ type: 'bucketHat', weight: 2, colours: ['cream', 'black', 'green'], canLogo: true, canVintage: true },
{ type: 'cap', weight: 2, colours: ['black', 'red', 'navy'], canLogo: true },
{ type: 'sunnies', weight: 2, colours: ['black'] }, // sunglasses. at night. a tell in itself
{ type: 'bumbag', weight: 1, colours: ['black', 'purple', 'yellow'], canLogo: true, canVintage: true },
{ type: 'chain', weight: 1, colours: ['yellow', 'grey'] },
],
};