// storebound config of the demo game "Prism Puddle" (fictional, made for this repo). Placeholder ids and URLs only: // nothing here points at a real store record. Run the commands from this folder (see README.md). import type { ShipConfig } from '../../cli/lib/config'; const config: ShipConfig = { app: { name: 'Prism Puddle', copyright: '2026 Example Studio', privacyPolicyUrl: 'https://example.com/privacy', supportUrl: 'https://example.com/support', website: 'https://example.com', contactEmail: 'support@example.com', }, languages: [ { id: 'en', play: 'en-US', apple: 'en-US' }, { id: 'tr', play: 'tr-TR', apple: 'tr' }, { id: 'ja', play: 'ja-JP', apple: 'ja' }, { id: 'ar', play: 'ar', apple: 'ar-SA', rtl: true }, ], play: { packageName: 'com.example.prismpuddle' }, apple: { bundleId: 'com.example.prismpuddle', ipad: true }, // `storebound scan` findings that are true for this fictional demo and accepted on purpose (README.md) scan: { ignore: [ { rule: 'template-answers', reason: 'fictional demo game: its Example Studio copyright is the placeholder of a project that is never uploaded' }, { rule: 'play-package-name', reason: 'fictional demo game: com.example.* is the repo placeholder and is never uploaded' }, { rule: 'play-testing-requirement', reason: 'fictional demo game without a Play developer account, so there is no account type to set' }, ], }, renders: 'store/renders', // One artwork -> every icon: `storebound icons` (sources in store/icon, from bg.svg and fg.svg; output is gitignored) icons: { composite: 'store/icon/icon.png', foreground: 'store/icon/foreground.png', background: 'store/icon/background.png', out: 'store/icons', web: 'store/icons/web', capacitorAssets: 'store/icons/capacitor', androidRes: 'store/icons/android/res', }, shots: { copy: 'store/shots/copy.json', frames: 'store/shots/frames', out: 'store/renders', fonts: { title: 'Paytone One', body: 'Montserrat' }, scenes: [ { id: 'hero', palette: 'violet', hero: true, over: 30, frames: [{ src: 'play.png', rotate: -4 }], badges: [{ y: 0.42, side: 'l', icon: 'offline', iconBg: 'blue', rot: -4 }, { y: 0.68, side: 'r', icon: 'bolt', iconBg: 'violet', rot: 3 }] }, { id: 'combo', palette: 'candy', frames: [{ src: 'combo.png', rotate: 3 }], badges: [{ y: 0.55, side: 'r', hot: true, rot: 4 }] }, { id: 'map', palette: 'sky', frames: [{ src: 'map.png', scale: 0.86 }, { src: 'stars.png', x: -30, dy: 10, scale: 0.68, rotate: -8 }], badges: [{ y: 0.62, side: 'r', icon: 'map', iconBg: 'blue', rot: 3 }] }, { id: 'stars', palette: 'gold', frames: [{ src: 'stars.png', rotate: -3 }], badges: [{ y: 0.74, side: 'l', stars: true, rot: -3 }] }, ], feature: { frame: 'play.png', palette: 'violet' }, // A/B variant: other first screenshot and order (store listing experiment / Product Page Optimization treatment) variants: { b: { scenes: ['combo', 'hero', 'stars', 'map'], copy: 'store/shots/copy-b.json', palettes: { combo: 'night' } } }, // App preview + promo video: `shots record` films the autoplay mode, `shots video` cuts the store files video: { clips: 'store/video/clips', seconds: 20, targets: ['iphone', 'youtube'], captionScenes: ['hero', 'combo', 'map'], record: { clips: { play: { path: '/?scene=play&auto=1', waitFor: 'window.game && game.ready', delayMs: 300, seconds: 8 }, combo: { path: '/?scene=combo&auto=1&t=4', waitFor: 'window.game && game.ready', delayMs: 300, seconds: 7 }, map: { path: '/?scene=map&auto=1', waitFor: 'window.game && game.ready', delayMs: 300, seconds: 6 }, }, }, }, capture: { source: 'web', baseUrl: 'http://127.0.0.1:8740', query: 'lang={lang}&seed=3', shots: { play: { path: '/?scene=play&t=8', waitFor: 'window.game && game.ready', delayMs: 200, device: 'both' }, combo: { path: '/?scene=combo&t=8', waitFor: 'window.game && game.ready', delayMs: 200, device: 'both' }, map: { path: '/?scene=map&t=0', waitFor: 'window.game && game.ready', delayMs: 200, device: 'both' }, stars: { path: '/?scene=stars&t=2', waitFor: 'window.game && game.ready', delayMs: 200, device: 'both' }, }, }, }, }; export default config;