| 713 | } |
| 714 | |
| 715 | function buildShotImagePrompt( |
| 716 | shot: { |
| 717 | order?: number; |
| 718 | description?: string | null; |
| 719 | camera?: string | null; |
| 720 | scene?: string | null; |
| 721 | action?: string | null; |
| 722 | lighting?: string | null; |
| 723 | }, |
| 724 | visualBible?: string | null, |
| 725 | style?: string | null, |
| 726 | ): string { |
| 727 | return [ |
| 728 | `Create a storyboard key frame for shot ${shot.order || ""}.`, |
| 729 | `Style: ${style || "anime comic drama"}.`, |
| 730 | visualBible ? `Visual bible: ${visualBible}.` : null, |
| 731 | shot.scene ? `Scene: ${shot.scene}.` : null, |
| 732 | shot.description ? `Description: ${shot.description}.` : null, |
| 733 | shot.action ? `Action: ${shot.action}.` : null, |
| 734 | shot.camera ? `Camera: ${shot.camera}.` : null, |
| 735 | shot.lighting ? `Lighting: ${shot.lighting}.` : null, |
| 736 | "Single cinematic frame, consistent character designs, production-ready composition.", |
| 737 | ] |
| 738 | .filter(Boolean) |
| 739 | .join("\n"); |
| 740 | } |
| 741 | |
| 742 | function buildShotVideoPrompt( |
| 743 | shot: { |