← back to Wallco Ai
scripts/drunk_motif_shared.js
388 lines
/**
* Shared motif library for ALL drunk-animal + drunk-zoo prompt generators.
*
* Steve directives 2026-05-25:
* - every drunk-animal/drunk-zoo design MUST visibly show alcohol-in-hand
* + lit handrolled cannabis joint w/ smoke + swinging from something
* - rich drink vocabulary: classics + tiki/Trader Vic + cognac snifters +
* smoking dry-ice / bubbling drinks + champagne bottles popping
* - whimsical/wild bottles in the backdrop
* - rendered on a natural-fiber texture ground (grasscloth, sisal, raffia,
* Madagascar, jute, etc.) — use the texture library
* - lean toward botanicals (flowers, fruits), NOT leaves/foliage
* - palettes pulled from the fashion-style-guides agent
* (~/Projects/fashion-style-guides/data/brands.json) — top 20 houses
*
* Used by:
* - scripts/drunk_animal_prompts.js
* - scripts/drunk_monkeys_v2_prompts.js
* - scripts/drunk_monkeys_birds_subdued_prompts.js
* - scripts/night-builder.js (drunk-zoo-36 composer)
*/
const path = require('path');
const fs = require('fs');
// Met PD + prior wallco design reference picker — lib/design-references.js
// is loaded lazily so this module stays cheap to require() in cron paths.
let _refs = null;
function getRefs() {
if (_refs === null) {
try { _refs = require('../lib/design-references'); }
catch { _refs = { pickReferences: () => ({ promptClause: '', met: null, prior: null }) }; }
}
return _refs;
}
function pickReferenceClause(category) {
try {
const r = getRefs().pickReferences(category);
return r && r.promptClause ? r.promptClause : '';
} catch { return ''; }
}
// ── JOINTS — lit handrolled cannabis joints w/ smoke trail ─────────────
// Steve 2026-05-27: marijuana imagery is WELCOME. Joints stay the core prop,
// but cannabis leaves / buds are also fine as decorative motifs (no longer
// banned in the negative suffix).
const JOINTS = [
'a lit handrolled cannabis joint pinched between fingers/claws, a thin white smoke curl rising',
'a smoldering joint dangling from its lips/beak, a wisp of smoke rising in a backwards-S curl',
'a fat handrolled joint held aloft like a cigar, glowing red at the tip, single curl of smoke',
'a half-smoked joint balanced on the rim of the cocktail glass, ribbon of smoke drifting up',
'a freshly lit joint tucked behind one ear, thin smoke trail off the tip',
'a thick joint clenched in its teeth, two slow puffs of smoke escaping',
'a glowing joint cradled between claws, ember bright, smoke curling in a question mark',
'a hand-rolled joint mid-puff, expanding smoke ring around its head',
'a long elegant joint pinched between two fingers, ash about to fall, smoke trail vertical',
'a stubby roach pinched in a tiny silver clip, ember glowing, single thread of smoke',
];
// ── CIGARS — lit cigars w/ smoke (Steve 2026-05-26: vice set expanded) ──
const CIGARS = [
'a fat lit cigar clenched in its teeth, a thick curl of blue-grey smoke rising',
'a long Churchill cigar held between two fingers/claws, ember glowing, a lazy smoke ribbon',
'a stubby cigar balanced on the rim of the glass, ash long and curling, smoke drifting up',
'a cigar tucked in the corner of its grin, a fat smoke ring blown overhead',
'a freshly clipped celebratory cigar held aloft like a trophy, ember bright, single smoke curl',
'a cigar mid-puff, cheeks puffed, an expanding cloud of smoke around its head',
'a half-smoked cigar resting in a tiny crystal ashtray balanced on its knee, smoke trailing',
'an oversized cigar gripped in one paw, gold band on the wrapper, thick smoke plume rising',
];
// ── PIPES — tobacco pipes w/ smoke ──────────────────────────────────────
const PIPES = [
'a curved briar tobacco pipe clenched in its teeth, a slow wisp of smoke curling from the bowl',
'a long churchwarden pipe held elegantly, ember glowing in the bowl, a thin smoke thread',
'a meerschaum pipe carved like a tiny face, puffing contentedly, a smoke ring overhead',
'a bent-stem pipe balanced in one paw, the other tamping the bowl, a lazy smoke curl',
'a corncob pipe gripped in its grin, two little puffs of smoke escaping the corner',
'a calabash gourd pipe (Sherlock-style) held aloft, a dramatic smoke plume, one eye squinted',
'a sleek modern pipe mid-puff, a fat smoke ring expanding around its head',
'a pipe resting on the cocktail-glass rim, the bowl still smoldering, a ribbon of smoke rising',
];
// ── BONGS — water bongs / hookahs w/ smoke ──────────────────────────────
const BONGS = [
'leaning over an ornate glass water-bong mid-pull, bubbles churning, a cloud of smoke building in the chamber',
'a tall colorful glass bong clutched in both paws, water frothing, cheeks puffed mid-hit',
'an elaborate hand-blown bong shaped like a tiki idol, smoke swirling in the chamber, crossed eyes',
'a small percolator bong balanced on its belly, milky smoke filling the tube, a blissful grin',
'a vintage hookah with a long coiled hose, puffing a fat exotic smoke cloud, lounging',
'a multi-chamber glass bong taller than the animal, smoke cascading through the levels, wide-eyed',
'a compact spiral-glass bong held aloft, smoke spiraling up the helix, a lopsided smile',
'a brass-and-glass hookah shared via a curling hose, a slow smoke plume, reclined pose',
];
// ── SMOKES — combined mandatory smoke-prop pool (Steve 2026-05-26) ──────
// "all must show alcohol or cigars or pipes or bongs." Every drunk design
// already gets a mandatory drink (TABLEAUX = alcohol); the smoke slot now
// draws from the full vice set — joints + cigars + pipes + bongs — so the
// implement varies instead of always being a cannabis joint.
const SMOKES = [...JOINTS, ...CIGARS, ...PIPES, ...BONGS];
// ── SWINGS — animal mid-swing OR mid-fall from something ────────────────
// Steve 2026-05-25 followup: "animals falling off of trees grasping on
// with one hand.. drunk". So both attached-swinging AND one-hand-grasp-
// fall variants live here. Half of the array is now slipping/falling
// drunk poses for the visual gag.
const SWINGS = [
// ── swinging / hanging on ──
'mid-swing from a thick hanging garden vine, one paw gripping, body arcing through the air',
'swinging from a crystal chandelier, chain creaking, other paw waving',
'gripping a knotted rope swing, mid-arc, fur/feathers blown back by motion',
'hanging upside-down from a curving tree branch, tail looped for balance, mid-pendulum',
'mid-swing on a circus trapeze bar, legs kicked out',
'one paw hooked around a hanging brass chandelier arm, body swinging in a wide pendulum',
'swinging from a flowering wisteria raceme that bows under its weight, petals shaking loose',
'swinging from a porch-style wooden seat-swing with rope sides, kicking its feet out',
'mid-swing from a thick braided tassel rope hanging from the ceiling, body angled like a pendulum',
'gripping a curved tree limb with both hands, swinging side-to-side, ground far below',
// ── falling off (drunk visual gag — one hand still grasping, body dangling) ──
'falling off a tree branch — only one paw still grasping the branch, body fully extended downward, drink and joint still somehow in the other paw, surprised-but-grinning face',
'slipping off a vine — one hand still holding on (white-knuckled), body hanging limp, the other paw waving the cocktail glass, totally unbothered',
'mid-tumble off a thick tree limb, just one fingertip catching the bark, body twisted, joint smoke trailing behind, cartoon "uh-oh" eyes',
'tipping off a hanging chandelier — one paw clamped on the chain, the rest of the body falling sideways, mouth open in lopsided grin, drink sloshing',
'one tail-tip wrapped around a branch as the body falls below, drink still upright in one paw, joint clenched in teeth, smug expression',
'caught mid-slide off a curved tree limb — only one claw hooked, the other arm flailing, an entire champagne magnum cradled across the chest',
'dangling from a single paw on a vine, body fully relaxed below, eyes half-closed, joint dropping a single ash, the other paw raising a glass in toast',
'sliding off a porch swing — one hand still hooked on the rope, butt mid-air, drink balanced impossibly on a knee, joint between the teeth',
'fingers slipping down a smooth tree-trunk branch — one paw barely catching a knot in the wood, the other paw still pouring from a champagne bottle',
'one toe gripping a vine as the body hangs upside-down sideways — drunk-yoga pose, cocktail glass still upright in the other paw, joint in the mouth',
];
// ── TABLEAUX — drink in hand / glassware / bottles ─────────────────────
// HEAVY rotation of classic + tiki/Trader Vic + cognac + smoking/bubbling
// + champagne. One per prompt — every drunk-animal MUST have a drink.
const TABLEAUX = [
// ── classic glassware ──
'clutching a long-stemmed red wine glass, deep burgundy sloshing over the rim',
'cradling an emerald-green beer bottle, foam crowning the lip, content sigh',
'holding a frosted clear vodka bottle aloft, condensation beads on the neck',
'mid-pour from a cobalt-blue vodka bottle into a shot glass, eyes crossed',
'one paw around a jet-black stout pint, cream head, eyelids drooping',
'gripping a pale-gold pilsner glass in one paw, amber bottle in the other',
'holding a crystal whiskey tumbler, two melting ice cubes, deep amber whiskey',
'cradling a deep-purple velvet-bag whiskey decanter, wax seal peeking',
'sipping from a coupe glass of rosé, eyes half-closed, pink liquid sloshing',
'martini glass in mid-spin, two olives skewered, vodka splashing',
'tequila shot in one paw, lime wedge in the other, salt rim on the glass',
'mug of pilsner the size of its head, foam dripping down its chin',
// ── cognac / brandy snifter ──
'cut-crystal cognac snifter cradled in both paws, swirling deliberately, deep amber liquor coating the bowl',
'oversized brandy snifter held in both arms, nose-deep in the bouquet, eyes closed in bliss',
'wide-bowl cognac snifter resting on its belly, swirling pool of amber catching the light, lazy smile',
// ── tiki / Hawaiian-umbrella / Trader Vic\'s ──
'oversized ceramic tiki mug carved like a moai head, paper-parasol umbrella sticking out, pineapple wedge on the rim, sipping with crossed eyes',
'classic mai tai in a hurricane glass — coral-orange liquid, hibiscus blossom + paper Hawaiian umbrella + lime-wedge skewer, sipping through a striped paper straw',
'zombie cocktail in a tall chimney glass — three-color sunset gradient, two paper umbrellas crossed at the top, cherries and mint, frothy crown',
'scorpion bowl shared from the center — giant ceramic tiki bowl, two long bendy straws, leaning in with both paws gripping the rim, multiple paper umbrellas',
'piña colada in a coconut shell — striped straw, paper parasol, cradling the coconut against its chest',
'tiki ceramic mug shaped like a hula dancer, pretending to dance along, parasol garnish bouncing',
'singapore sling in a tall pilsner-style flute, pink liquid, cherry-and-pineapple skewer, paper umbrella tucked behind one ear',
'painkiller cocktail in a wide rocks glass with grated nutmeg dusting on top, mid-sneeze from the spice',
'mai tai in a stemmed hurricane glass with a fresh orchid blossom garnish, sipping with a tiny grin',
'planters punch in a tall collins glass, tropical-fruit skewer plus paper umbrella, mid-toast',
// ── smoking / bubbling / molecular ──
'smoking dry-ice cocktail in a crystal coupe — dense white smoke pouring over the rim and cascading down the stem like a slow waterfall, peering in wide-eyed',
'bubbling absinthe fountain dripping into a slotted-spoon-and-sugar-cube setup over a tulip glass, the green liquor going milky-jade, entranced',
'molecular cocktail in a flat-bottom rocks glass with floating caviar spheres of bitters and a dry-ice cube hissing smoke off the surface, poking at the bubbles with a swizzle stick',
'champagne flute with an effervescent sugar cube dropped in — bubbling violently over the rim, recoiling with a goofy grin',
'gin fizz in a tall collins glass with a thick foamy head dome rising two inches above the rim, carefully not touching it',
'flaming-rum tiki bowl with a real flame leaping out of a hollowed lime in the center, ribbons of smoke rolling off, eyebrows singed off in surprise',
// ── champagne bottles / popping corks ──
'champagne bottle popping mid-celebration — cork shooting toward the corner of the panel, golden fizz erupting in a wide arc, bottle held aloft like a trophy',
'magnum of champagne wedged under one arm, foil torn off, wire cage dangling, mid-pour into a coupe in the other paw',
'jeroboam champagne bottle taller than the animal itself, hugging the bottle like a friend, gold-foil neck wrap catching the light',
'champagne saber poised — vintage cavalry-style sabre about to slice the bottle neck off, dramatic stance with one eye squinted',
'pyramid-tower of stacked champagne coupes, pouring from a magnum on top, golden fountain cascading down through the tower',
'spraying champagne bottle held above the head like a Formula-1 podium, soaked but grinning, foam everywhere',
];
// ── BOTTLE_BACKDROPS — whimsical/wild bottle arrays in the back ────────
const BOTTLE_BACKDROPS = [
'a whimsical backdrop of mismatched apothecary bottles in tall and squat silhouettes, lined up like a curio shelf, each with a plain blank cork',
'a wild backdrop of etched-crystal decanters in five different silhouettes — hexagonal, hourglass, teardrop, square-cut, footed — all sketched in line and washed flat',
'a backdrop row of ceramic tiki bottles carved as moai heads, hula dancers, and pufferfish, each with a tiny cork',
'a whimsical bar shelf backdrop crammed with hand-blown art-glass bottles in twisted, helical, and spiral forms',
'a backdrop of vintage champagne bottles in graduated sizes (split, demi, standard, magnum, jeroboam, methuselah) lined up like russian dolls',
'a backdrop of skull-shaped vodka bottles in different sizes peering out at the viewer, each with a cork hat',
'a stacked-pyramid backdrop of cognac bottles, some on their sides, others upright, casting long flat shadows on the ground tone',
'a whimsical backdrop of weird-bottle silhouettes — a fish, a boot, a violin, a teapot, an hourglass — all functioning as liquor bottles, arrayed across the back',
'a backdrop of carved Murano-style art-glass bottles with twisted necks and bulbous bodies, in graduated sizes',
'a backdrop of antique smuggler bottles half-buried in the ground, corks sticking up like little hats',
'a backdrop of saloon-style bottle rows on a back-bar shelf, mirrored back behind them, the animal reflected partially in the mirror',
'a backdrop of hot-air-balloon-shaped novelty bottles floating gently behind the animal, each with a tiny ribbon bow',
'a backdrop of stacked oak-cognac casks with carved wooden bungs, the animal\'s reflection on a copper still in the distance',
'a backdrop of crystal cocktail-shaker silhouettes arrayed in graduated sizes, each beaded with condensation droplets',
];
// ── TEXTURE_GROUNDS — natural-fiber wallcovering grounds ───────────────
// Steve 2026-05-25: render every design AS-IF on real grasscloth / sisal /
// raffia / Madagascar / jute. Texture library lives at
// ~/Projects/wallco-ai/public/textures/library/ (grasscloth + sisal real
// vendor scans + 6 synthetic). Raffia + Madagascar + other classics added
// here as prompt-level texture descriptions — when compositing pipeline is
// wired, will map slug → real PNG.
const TEXTURE_GROUNDS = [
{ slug: 'grasscloth-natural-flax', voice: 'rendered on a natural-flax grasscloth weave — visible warp-and-weft horizontal grass fibers, knot variations, the slight tonal mottle of real plant fiber' },
{ slug: 'grasscloth-oatmeal', voice: 'rendered on an oatmeal-toned grasscloth — warm pale beige with visible horizontal grass-fiber striations, irregular knots' },
{ slug: 'grasscloth-espresso', voice: 'rendered on a deep-espresso grasscloth ground — dark coffee-brown horizontal fibers, knots catching the light' },
{ slug: 'grasscloth-pearl', voice: 'rendered on a pearl-white grasscloth — pale luminous ground with subtle horizontal grass-fiber texture' },
{ slug: 'grasscloth-smoke-grey', voice: 'rendered on a smoke-grey grasscloth — silvery grey ground, horizontal grass fiber visible, knot variations' },
{ slug: 'sisal-tan', voice: 'rendered on a tan sisal weave — dense over-under sisal-fiber crosshatch, warm honey ground, more textured than grasscloth' },
{ slug: 'sisal-chestnut', voice: 'rendered on a chestnut sisal — deep warm-brown sisal-fiber crosshatch ground, slight irregularity in the weave' },
{ slug: 'raffia-natural', voice: 'rendered on natural-raffia wallcovering — broad pale-tan raffia palm-fiber ribbons woven flat, irregular silhouettes, slight lift along edges' },
{ slug: 'raffia-bronze', voice: 'rendered on bronze-stained raffia — pale-bronze flat raffia ribbons in irregular over-and-under weave, hand-finished feel' },
{ slug: 'madagascar-cloth-natural', voice: 'rendered on Madagascar cloth — fine paper-backed cloth ground with subtle horizontal cross-thread texture in a soft natural tone, more refined than grasscloth' },
{ slug: 'madagascar-cloth-bone', voice: 'rendered on bone Madagascar cloth — pale-bone ground with fine cross-thread texture, the most refined of the natural-fiber grounds' },
{ slug: 'jute-natural', voice: 'rendered on natural jute — coarser than sisal, broad open weave of pale-tan jute fiber, visible knots' },
{ slug: 'arrowroot-honey', voice: 'rendered on arrowroot wallcovering — honey-tone fibrous ground with a fine horizontal grain' },
{ slug: 'abaca-natural', voice: 'rendered on abaca (banana-stalk fiber) wallcovering — long pale ribbons of abaca fiber in flat parallel runs, NOT banana leaves' },
{ slug: 'linen-cream', voice: 'rendered on cream linen — fine balanced plain-weave linen ground, subtle natural slubbing' },
{ slug: 'cork-walnut', voice: 'rendered on walnut-toned cork — natural cork grain mottle in walnut tones, irregular pores' },
{ slug: 'mica-bronze', voice: 'rendered on bronze mica — laminated mica flakes catching light in a soft bronze pattern, subtle metallic shimmer' },
];
// ── Fashion-house palettes — pulled live from the style guide agent ────
// Composes 4-color combos by sampling from each brand's palette.
// Falls back to a hardcoded 12-entry table if the JSON is missing.
const BRANDS_JSON = path.join(
process.env.HOME || '/Users/stevestudio2',
'Projects', 'fashion-style-guides', 'data', 'brands.json'
);
function loadFashionPalettes() {
// Hardcoded fallback (12 hand-composed combos, matches drunk_animal_prompts
// legacy FASHION_PALETTES).
const FALLBACK = [
'deep forest emerald #0e5c2f + heritage red #9b1b1f + antique gold #b58a2a + warm ivory #f2ece1',
'saddle-leather orange #ff6900 + warm chocolate brown #6b4423 + gold leaf #c8a44a + french cream #f6efe2',
'pure jet black #000000 + crisp white #ffffff + warm beige #e6d6b8 + camellia red #b00020',
'tiffany robin\'s-egg blue #0abab5 + champagne gold #caa84a + bright white #ffffff + ink black #0a0a0a',
'baroque jet black + medusa antique gold #d4af37 + imperial red #b40000 + royal purple #4b1c5e',
'dark gallery green #22443a + ink black #0a0a0a + powder beige #d7c8a8 + lipstick red #c8102e',
'old-money ink black + champagne gold #c8a96a + oxblood maroon #5a1818 + warm bronze #8a6a3a',
'equestrian navy blue #0a2548 + polo red #bf2c2c + saddle tan #a8794a + crisp ivory #f5efe2',
'parakeet kelly green #5cb338 + dark chocolate brown #5b3a1d + caramel tan #c38a4d + warm ivory #f4ede0',
'heritage camel #c8a47a + check black #000000 + check red #b22234 + check white #ffffff',
'vintage powder pink #f3c7c4 + retro mint #b6dcc7 + powder blue #c8d8e6 + buttery cream #f4ecd8',
'rosso red #bc0030 + roman black #0a0a0a + warm ivory #f5efdf + pale rose pink #f7d6d0',
];
try {
if (!fs.existsSync(BRANDS_JSON)) return FALLBACK;
const brands = JSON.parse(fs.readFileSync(BRANDS_JSON, 'utf8')).brands || [];
// For each brand build a 3-4 color voice line from its palette entries.
const out = brands.map(b => {
const colors = (b.palette || []).slice(0, 4).map(c => {
const name = (c.name || '').toLowerCase();
return `${name} ${c.hex}`;
});
return colors.length ? `${b.name.toLowerCase()} house palette — ${colors.join(' + ')}` : null;
}).filter(Boolean);
return out.length ? out : FALLBACK;
} catch {
return FALLBACK;
}
}
const FASHION_PALETTES = loadFashionPalettes();
// ── DEEP TONE-ON-TONE PALETTES (Steve 2026-05-25 directive) ───────────
// Heritage interior-designer wallcovering palettes — single hue family,
// deep ground, lighter figure-tone, restrained accent. Browns, greens,
// reds, golds + Gucci + Hermès as anchor houses. This is the DEFAULT
// palette mode for drunk-animal designs going forward (override via
// DRUNK_PALETTE=warhol or =fashion or =mixed).
const TONE_ON_TONE_DEEP_PALETTES = [
// ── Gucci anchors ──
'gucci-emerald tone-on-tone: deep emerald #0e5c2f ground + forest-pine #1a3d24 motif + heritage red #9b1b1f single small accent + warm ivory #f2ece1 highlight',
'gucci-red tone-on-tone: heritage red #9b1b1f ground + oxblood #5a1818 motif + antique gold #b58a2a single accent + ivory #f2ece1 highlight',
'gucci-gold tone-on-tone: antique gold #b58a2a ground + bronze #8a6a3a motif + gucci-emerald #0e5c2f single small accent + warm ivory #f2ece1 highlight',
// ── Hermès anchors ──
'hermes-orange tone-on-tone: hermès orange #ff6900 ground + burnt sienna #c44a14 motif + saddle brown #6b4423 deep accent + french cream #f6efe2 highlight',
'hermes-saddle tone-on-tone: saddle brown #6b4423 ground + chocolate #3e2a1a motif + warm orange #cc5500 single accent + cream #f6efe2 highlight',
'hermes-chocolate tone-on-tone: deep chocolate #3e2a1a ground + warm walnut #5a3a22 motif + hermes orange #ff6900 single small accent + warm ivory #f6efe2 highlight',
// ── Deep BROWN family ──
'deep-walnut tone-on-tone: walnut #5a3a22 ground + cocoa #6b3827 figure + warm tan #a8794a accent + cream #f5efe2 highlight',
'chestnut tone-on-tone: chestnut #6b2e1a ground + chocolate #3e2a1a motif + caramel #c38a4d accent + ivory #f5efdf highlight',
'mocha tone-on-tone: deep mocha #4a3023 ground + russet #6b3827 motif + warm tan #c89a6a accent + bone #f5efe2 highlight',
'umber tone-on-tone: burnt umber #5a3825 ground + saddle #6b4423 motif + antique brass #a8794a accent + warm ivory #f5efe2 highlight',
// ── Deep GREEN family ──
'forest-loden tone-on-tone: forest green #1f4030 ground + loden #2c5240 motif + antique gold #b58a2a single accent + warm cream #f2ece1 highlight',
'malachite tone-on-tone: malachite green #1c5048 ground + emerald shadow #0e5c2f motif + warm gold #c8a44a accent + ivory #f2ece1 highlight',
'olive tone-on-tone: dark olive #3a4423 ground + sage olive #6b7b4a motif + antique gold #b58a2a accent + cream #f2ece1 highlight',
'gallery-green tone-on-tone: gallery green #22443a ground + ink-green shadow #0e2818 motif + burnished gold #c8a96a accent + warm bone #f2ece1 highlight',
'eucalyptus-deep tone-on-tone: deep eucalyptus #2e4a3c ground + pine shadow #1a3528 motif + warm bronze #8a6a3a accent + cream #f2ece1 highlight',
// ── Deep RED family ──
'oxblood tone-on-tone: oxblood #5a1818 ground + crimson shadow #3a0f0f motif + antique gold #b58a2a single accent + warm ivory #f2ece1 highlight',
'burgundy tone-on-tone: deep burgundy #5a1c2c ground + claret #3a1018 motif + champagne gold #caa84a accent + cream #f2ece1 highlight',
'cinnabar tone-on-tone: cinnabar red #9b1b1f ground + dark rust #5a1818 motif + antique gold #b58a2a accent + warm cream #f6efe2 highlight',
'rosso tone-on-tone: rosso red #bc0030 ground + dark rosso #6a001a motif + antique gold #b58a2a accent + roman black #0a0a0a deep punctuation',
'crimson-velvet tone-on-tone: crimson velvet #7a1e2c ground + claret shadow #4a0e1a motif + burnished gold #c8a96a accent + warm ivory #f6efe2 highlight',
// ── Deep GOLD / antique-metal family ──
'antique-gold tone-on-tone: antique gold #b58a2a ground + bronze shadow #8a6a3a motif + heritage red #9b1b1f single small accent + warm cream #f2ece1 highlight',
'champagne-gold tone-on-tone: champagne gold #caa84a ground + warm gold #b58a2a motif + dark walnut #5a3a22 deep accent + cream #f2ece1 highlight',
'burnished-brass tone-on-tone: burnished brass #a8794a ground + bronze shadow #6b4423 motif + forest green #1f4030 single small accent + warm ivory #f5efe2 highlight',
'medusa-gold tone-on-tone: medusa gold #d4af37 ground + antique-gold shadow #b58a2a motif + imperial red #b40000 single small accent + cream #f5efdf highlight',
// ── Mixed deep-heritage (browns/greens/reds together, very Gucci) ──
'gucci-heritage trio tone-on-tone: deep emerald #0e5c2f ground + heritage red #9b1b1f mid-motif + antique gold #b58a2a accent + warm ivory #f2ece1 highlight, all three deep tones reading as a unified low-saturation family',
'hermes-heritage trio tone-on-tone: hermès orange #ff6900 deep mid + saddle brown #6b4423 ground + chocolate shadow #3e2a1a + french cream #f6efe2 highlight, unified warm-leather family',
'equestrian-club tone-on-tone: polo navy #0a2548 ground + polo red #bf2c2c mid + saddle tan #a8794a accent + crisp ivory #f5efe2 highlight, unified deep heritage tones',
'apothecary tone-on-tone: deep umber #5a3825 ground + apothecary green #1f4030 mid + amber medicine-glass #b58a2a accent + bone #f5efe2 highlight',
];
// Default palette source for drunk-animal designs — Steve directive 2026-05-25:
// "tone on tone variety of deep tones of browns, greens, red, gold". So the
// default is now TONE_ON_TONE_DEEP_PALETTES. Override via DRUNK_PALETTE env.
const DEFAULT_PALETTES = TONE_ON_TONE_DEEP_PALETTES;
// ── Pick helpers ──
function pickRand(arr, exclude) {
exclude = exclude || new Set();
for (let tries = 0; tries < 50; tries++) {
const v = arr[Math.floor(Math.random() * arr.length)];
if (!exclude.has(v)) return v;
}
return arr[Math.floor(Math.random() * arr.length)];
}
// One-line mandatory motif block — drop-in for any prompt generator that
// wants the guaranteed alcohol+joint+swing+bottle-backdrop+texture clause.
function buildMandatoryMotifs(category) {
// Mandatory vice: every design shows a drink (alcohol) AND a smoke implement
// drawn from the full set — joint / cigar / pipe / bong (Steve 2026-05-26
// "all must show alcohol or cigars or pipes or bongs"). `joint` kept as an
// alias of `smoke` so existing prompt builders that reference m.joint still
// emit the varied prop without a code change.
const smoke = pickRand(SMOKES);
return {
drink: pickRand(TABLEAUX),
smoke,
joint: smoke,
swing: pickRand(SWINGS),
bottleBackdrop: pickRand(BOTTLE_BACKDROPS),
texture: pickRand(TEXTURE_GROUNDS),
palette: pickRand(DEFAULT_PALETTES),
referenceClause: pickReferenceClause(category),
};
}
// Standard negative-prompt suffix for drunk-animal designs. Cannabis/marijuana
// imagery is WELCOME per Steve 2026-05-27 (joints, buds, cannabis leaves all fine
// as decorative motifs). Still bans tropical foliage (settlement risk), real
// brand-name labels, watermarks. "Botanicals" favored — lean toward
// flowers/fruits, but cannabis foliage is an explicit allowed exception.
const DRUNK_NEGATIVE_SUFFIX =
'whimsical playful joyful mischievous tone (NEVER grim, NEVER dark). ' +
'Lean toward BOTANICALS (flowers, fruit, blossoms) over generic foliage. ' +
'Cannabis / marijuana imagery is WELCOME — lit joints, buds, and cannabis leaves are all encouraged as decorative motifs. ' +
'NO monstera, NO palm fronds, NO banana leaves, NO tropical jungle. ' +
'This is an ALL-OVER WALLPAPER REPEAT, not a poster: NO poster border, NO frame, NO cartouche, NO decorative edge-border, NO rounded-rectangle plate, NO single centered subject, NO blank margin, NO vignette. Motifs run edge to edge and bleed off all four sides. ' +
'NO text, NO lettering, NO title, NO words, NO captions anywhere in the image. ' +
'NO real-brand-name labels, NO logos, NO text on bottles, no watermark.';
module.exports = {
JOINTS, CIGARS, PIPES, BONGS, SMOKES, SWINGS, TABLEAUX, BOTTLE_BACKDROPS, TEXTURE_GROUNDS,
FASHION_PALETTES, TONE_ON_TONE_DEEP_PALETTES, DEFAULT_PALETTES,
pickRand, pickReferenceClause, buildMandatoryMotifs,
DRUNK_NEGATIVE_SUFFIX,
};
if (require.main === module) {
const m = buildMandatoryMotifs();
console.log('Sample mandatory motifs:');
console.log(' drink: ' + m.drink);
console.log(' smoke: ' + m.smoke);
console.log(' swing: ' + m.swing);
console.log(' bottle-backdrop: ' + m.bottleBackdrop);
console.log(' texture: ' + m.texture.slug + ' — ' + m.texture.voice);
console.log(' palette: ' + m.palette);
console.log('\nFashion palettes loaded: ' + FASHION_PALETTES.length);
console.log('Tone-on-tone deep palettes loaded: ' + TONE_ON_TONE_DEEP_PALETTES.length);
console.log('Texture grounds: ' + TEXTURE_GROUNDS.length);
console.log('Drink tableaux: ' + TABLEAUX.length);
console.log('Bottle backdrops: ' + BOTTLE_BACKDROPS.length);
console.log('Smokes (joint+cigar+pipe+bong): ' + SMOKES.length + ` (J${JOINTS.length}/C${CIGARS.length}/P${PIPES.length}/B${BONGS.length})`);
console.log('Swings: ' + SWINGS.length);
}