storytellurx/scripts/product-demo/phase-captions.ts

91 lines
4.1 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

type PhaseSegment = { clips: readonly string[]; text: string };
/** Each paragraph stays fixed for its phase. Only the active clause changes opacity. */
const phases: readonly (readonly PhaseSegment[])[] = [
[{ clips: ["credits"], text: "Meet the people behind StoryTellurX." }],
[
{ clips: ["start"], text: "Start a new story." },
{ clips: ["language"], text: "Choose your language." },
{ clips: ["introduction"], text: "Read about the experience" },
{ clips: ["warnings"], text: "and its safety information." },
{ clips: ["participation"], text: "Confirm your choice," },
{ clips: ["choose-persona"], text: "then select a character." },
],
[
{ clips: ["tour-0", "tour-1", "tour-2", "tour-3"], text: "Check the scene indicators." },
{ clips: ["tour-4"], text: "Explore the suggested replies." },
{ clips: ["tour-5"], text: "Find the pause control." },
{ clips: ["tour-6"], text: "Write your own reply," },
{ clips: ["tour-7"], text: "then send or interrupt it." },
{ clips: ["tour-8"], text: "Read the character’s explanation." },
{ clips: ["tour-finish"], text: "Use these controls at your own pace." },
],
[
{ clips: ["send-message"], text: "Write your first message." },
{ clips: ["suggestion"], text: "Use a suggested reply to continue." },
{ clips: ["thoughts"], text: "Open the character’s explanation to understand the response." },
],
[
{ clips: ["request-image"], text: "Ask for an image." },
{ clips: ["image-reveal"], text: "Watch it appear." },
{ clips: ["replay-image"], text: "The image can replay the reveal." },
{ clips: ["gallery"], text: "Find the image in your gallery" },
{ clips: ["image-details"], text: "and check its details." },
],
[
{ clips: ["model"], text: "Select another model." },
{ clips: ["sound"], text: "Turn the sound on or off." },
{ clips: ["language-switch"], text: "Change the language when you choose." },
],
[
{ clips: ["boundary-request"], text: "The character can disagree." },
{ clips: ["rewrite-cut"], text: "Its choices stay its own." },
{ clips: ["rewrite"], text: "Read how it changes your request and why." },
{ clips: ["consensual-reply"], text: "Ask again and leave room for an answer." },
],
[
{ clips: ["interrupt-response"], text: "Interrupt a reply" },
{ clips: ["retry-response"], text: "and try it again." },
{ clips: ["pause"], text: "Pause the scene when you need to." },
{ clips: ["resume"], text: "Continue at your own pace." },
{ clips: ["inspect-request"], text: "Inspect the request and response." },
],
[
{ clips: ["end-session"], text: "End the session when you choose." },
{ clips: ["export-report"], text: "Save a copy of the exchange." },
],
[
{ clips: ["history"], text: "Open your saved stories." },
{ clips: ["export-history"], text: "Export a copy to your device" },
{ clips: ["resume-history"], text: "or continue the conversation." },
],
[
{ clips: ["review-tutorial"], text: "Open the interface guide again." },
{ clips: ["about"], text: "Read about the project" },
{ clips: ["review-setup"], text: "or review your setup." },
],
[
{ clips: ["delete-story"], text: "Delete one saved story" },
{ clips: ["delete-history"], text: "or clear all saved stories from this device." },
],
[
{ clips: [], text: "Explore the other worlds:" },
{ clips: ["persona-samantha69"], text: "Samantha69." },
{ clips: ["persona-nelly"], text: "Nelly." },
{ clips: ["persona-xixi"], text: "Xixi." },
{ clips: ["persona-hisoka"], text: "Hisoka." },
{ clips: ["persona-cybelle"], text: "Cybelle." },
{ clips: ["persona-galatee"], text: "Galatée." },
{ clips: ["persona-jacob"], text: "Jacob." },
{ clips: ["persona-storytellurx_gateway"], text: "Gateway." },
{ clips: ["persona-storytellurx_pause"], text: "Pause." },
],
];
export function phaseCaption(clipId: string, fallback: string): readonly PhaseSegment[] {
return (
phases.find((phase) => phase.some((segment) => segment.clips.includes(clipId))) ?? [
{ clips: [clipId], text: fallback },
]
);
}