#!/usr/bin/env node /** * gen-art.mjs — 程序化生成 SVG 素材(金碧山水/纹样/饰件),零外部资源。 * 用法:node scripts/gen-art.mjs (产物写 src/renderer/assets/gen/*.svg) */ import { mkdirSync, writeFileSync } from 'node:fs' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' const OUT = join(dirname(fileURLToPath(import.meta.url)), '../src/renderer/assets/gen') mkdirSync(OUT, { recursive: true }) // ============ 1. 金碧山水全景(主背景) ============ function goldenLandscape() { const ridge = (y, amp, seed, opacity) => { const pts = [] let x = -40 let phase = seed while (x <= 1280) { const yy = y + Math.sin((x / 170) + phase) * amp + Math.sin((x / 71) + phase * 2.2) * amp * 0.3 pts.push(`${x.toFixed(0)},${yy.toFixed(0)}`) phase += 0.35 x += 80 } return `` } return ` ${ridge(420, 46, 1.4, 0.10)} ${ridge(500, 52, 2.1, 0.15)} ${ridge(590, 46, 3.2, 0.22)} ` } // ============ 2. 祥云纹带(分隔/装饰) ============ function cloudBand() { const cloud = (x, y, s, o) => ` ` let out = '' for (let i = 0; i < 6; i++) out += cloud(i * 200 - 20, ((i % 2) * 10) - 4, 0.9 + (i % 3) * 0.15, 0.5 - (i % 2) * 0.15) return `${out}` } // ============ 3. 回纹角饰(卡片角框) ============ function meanderCorner() { const sq = (x, y, s) => `` let p = '' for (let i = 0; i < 4; i++) { p += `` } return ` ` } // ============ 4. 仙鹤(点缀) ============ function crane() { return ` ` } // ============ 5. 星辰点缀层 ============ function starfield() { let p = '' for (let i = 0; i < 42; i++) { const x = ((i * 137) % 1200) const y = ((i * 83) % 420) const r = 0.6 + (i % 3) * 0.5 const o = 0.12 + ((i * 7) % 5) * 0.09 p += `` } return `${p}` } const out = { 'landscape-gold.svg': goldenLandscape(), 'cloud-band.svg': cloudBand(), 'meander-corner.svg': meanderCorner(), 'crane.svg': crane(), 'starfield.svg': starfield() } for (const [name, svg] of Object.entries(out)) { writeFileSync(join(OUT, name), svg, 'utf-8') console.log('✓', name, `${svg.length} B`) } console.log('gen-art done →', OUT)