storebound/examples/demo-game/storebound.config.ts

85 lines
4.3 KiB
TypeScript

// 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;