85 lines
4.3 KiB
TypeScript
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;
|