91 lines
4.1 KiB
TypeScript
91 lines
4.1 KiB
TypeScript
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 },
|
||
]
|
||
);
|
||
}
|