/** * 镭射卡五图预设 — 真实金属银系 * 参考实体卡:Pokémon holo / BTS photocard / 国产星穹镭射票 * 5 张卡都是金属底,仅银色微调 + 色带方向/速度不同 * * Prompt 字段: * bgPrompt — 背景主题描述(不含前缀/后缀,由 Gateway 拼接) * overlayPrompt — 装饰层描述(同上) * colorHint — 主色调提示(用于用户 prompt 的配色引导) */ export const LASER_BATCH_EXPORT_SIZE = { w: 450, h: 600 } /** 兼容字段:旧的 rich 模式已弃用 */ export const PRESET_VARIANTS = [ { id: 'dream', style: 'dream', beam: 'prism', backdropMode: 'grating', backdropTone: '#A8ACB2', // 冷银 sheenBandAngle: 135, sheenSpeed: 0.35, sheenIntensity: 0.40, foilCoverage: 0.75, laserStrength: 50, frostIntensity: 8, flowSpeed: 0.35, colorHint: '淡紫色 粉色 银色', bgPrompt: 'soft dreamy holographic background, lavender and pink layered gradient, gentle bubble bokeh and soft star sparkles, single diagonal sheen sweep at 135°, dreamy celestial mood, no text, no people, no watermark', overlayPrompt: 'thin pearl border, soft star scatter, subtle corner brackets', }, { id: 'classic', style: 'classic', beam: 'aurora', backdropMode: 'grating', backdropTone: '#A89E91', // 香槟银 sheenBandAngle: 120, sheenSpeed: 0.45, sheenIntensity: 0.38, foilCoverage: 0.70, laserStrength: 48, frostIntensity: 6, flowSpeed: 0.45, colorHint: '香槟金 暖金色 浅米色', bgPrompt: 'classic vintage refractor holographic surface, warm champagne and pale gold gradient, single diagonal sheen sweep at 120°, soft film grain texture, refined retro cardstock mood, no text, no people, no watermark', overlayPrompt: 'warm sepia border, vintage corner motif', }, { id: 'holoFull', style: 'holoFull', beam: 'neon', backdropMode: 'grating', backdropTone: '#B0ACA6', // 珍珠银 sheenBandAngle: 150, sheenSpeed: 0.30, sheenIntensity: 0.50, foilCoverage: 0.95, laserStrength: 62, frostIntensity: 10, flowSpeed: 0.30, colorHint: '银色 霓虹色 金属银', bgPrompt: 'full holographic tech background, silver metallic base with pearl glow, geometric neon circuit lines and star sparks, vivid diagonal sheen sweep at 150°, high foil coverage 95%, futuristic cyber-card mood, no text, no people, no watermark', overlayPrompt: 'neon bevel border, sharp diagonal sheen sweep, geometric corner accents', }, { id: 'ice', style: 'ice', beam: 'white', backdropMode: 'grating', backdropTone: '#9C9993', // 暖银 sheenBandAngle: 110, sheenSpeed: 0.50, sheenIntensity: 0.36, foilCoverage: 0.60, laserStrength: 44, frostIntensity: 5, flowSpeed: 0.50, colorHint: '浅蓝灰 冰蓝 银色', bgPrompt: 'cool ice holographic background, pale blue-gray base with crystalline frost texture, snowflake scatter and ice-crack corner motif, fast diagonal sheen sweep at 110° (speed 0.50), crisp clean winter mood, no text, no people, no watermark', overlayPrompt: 'thin frosted edge line, sparse ice flake scatter, light frost corner motif', }, { id: 'sunset', style: 'sunset', beam: 'sunset', backdropMode: 'grating', backdropTone: '#9E958A', // 玫瑰金底 sheenBandAngle: 140, sheenSpeed: 0.40, sheenIntensity: 0.42, foilCoverage: 0.80, laserStrength: 52, frostIntensity: 7, flowSpeed: 0.40, colorHint: '玫瑰金 暖橙色 粉色', bgPrompt: 'warm sunset holographic background, rose-gold base with amber and pink layered glow, soft floral corner accents, gentle diagonal sheen sweep at 140° (speed 0.40), romantic dreamy mood, no text, no people, no watermark', overlayPrompt: 'thin rose gold border, small heart corner accents', }, ] export const LASER_PRESET_IDS = PRESET_VARIANTS.map((p) => p.id) export function getLaserPresetByIndex(index) { const i = Number(index) if (!Number.isFinite(i) || i < 0 || i >= PRESET_VARIANTS.length) { return PRESET_VARIANTS[0] } return PRESET_VARIANTS[i] } export function getLaserPresetIndexById(presetId) { const id = String(presetId || '').trim() const idx = PRESET_VARIANTS.findIndex((p) => p.id === id) return idx >= 0 ? idx : 0 } /** * 构建 Dify 工作流所需的 render_configs(每个 variant 的完整渲染参数) * 用于 POST /api/v1/laser/generate 请求体 * @param {string[]} [presetIds] 需要生成的 preset ID 列表,默认全部5个 * @returns {Array<{preset_id: string, grating_config: object, bg_prompt: string, overlay_prompt: string}>} */ export function buildRenderConfigs(presetIds) { const ids = presetIds || LASER_PRESET_IDS return PRESET_VARIANTS .filter((p) => ids.includes(p.id)) .map((p) => ({ preset_id: p.id, grating_config: { sheen_band_angle: p.sheenBandAngle, sheen_intensity: p.sheenIntensity, sheen_speed: p.sheenSpeed, foil_coverage: p.foilCoverage, backdrop_tone: p.backdropTone, }, bg_prompt: p.bgPrompt || '', overlay_prompt: p.overlayPrompt || '', })) } export { resolveGratingConfig, DEFAULT_BACKDROP_TONE } from './laserGrating.js' // ========================================================================= // 新增:风格池 + 抽卡(45 个风格,5 档分层) // - 旧调用方(激光导出会、success.vue)继续用上方 export,完全兼容 // - 新调用方(抽卡、稀有度徽章)使用下方 export // ========================================================================= // 风格池与索引(转自 stylePool.js) export { LASER_STYLE_POOL, LASER_STYLE_IDS, LASER_STYLE_INDEX, RARITY_DISTRIBUTION, RARITY_COLORS, RARITY_STARS, } from './stylePool.js' // 抽卡算法(转自 gacha.js) export { drawGachaStyles, drawGachaStyleIds, pickRarity, pickStyleInRarity, findStyleById, RARITY_WEIGHTS, } from './gacha.js' /** * 兼容旧调用方:按数字索引取 style 对象 * 0-4 仍映射到原 dream/classic/holoFull/ice/sunset(与旧 PRESET_VARIANTS 顺序一致) * 5~44 映射到新池子 * @param {number} index */ export function getStyleByIndex(index) { const i = Number(index) if (!Number.isFinite(i) || i < 0) return LASER_STYLE_POOL[0] if (i < 5) { const oldIds = ['dream', 'classic', 'holoFull', 'ice', 'sunset'] return LASER_STYLE_POOL.find((s) => s.id === oldIds[i]) || LASER_STYLE_POOL[0] } return LASER_STYLE_POOL[i] || LASER_STYLE_POOL[0] } /** * 兼容旧调用方:按 style id 反查数字索引(用于 success.vue) * @param {string} id * @returns {number} */ export function getStyleIndexById(id) { const idx = LASER_STYLE_INDEX[String(id || '')] return Number.isFinite(idx) ? idx : 0 }