diff --git a/aventura.apk b/aventura.apk index c963d49..48daeb4 100644 Binary files a/aventura.apk and b/aventura.apk differ diff --git a/aventura.apk.idsig b/aventura.apk.idsig index 2341c58..e109f0f 100644 Binary files a/aventura.apk.idsig and b/aventura.apk.idsig differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 8eb12e2..3886e99 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index dfa4acc..d783c01 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index bcd1758..7eb8991 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 464a27f..5f787d1 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 8f9c23c..6ee015f 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index ddf5f74..94e9927 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 3eb3496..aa879fa 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index a02b6a9..d6ff6c6 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 5f9b32b..965f7f1 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 47d2053..9c6ea58 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 8fa60ea..0d8e944 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 05929d0..b0b1e36 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 089067f..b52f5d1 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index 25ae319..ee081a1 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index ae67d55..835897c 100644 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index 59b2aad..a869d2c 100644 Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index e2680e2..a0574e8 100644 Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png index 1f7f189..199cc82 100644 Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png index 18c4ea3..fc4f9c6 100644 Binary files a/src-tauri/icons/64x64.png and b/src-tauri/icons/64x64.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png index b0dc613..0c26105 100644 Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png index ebf3f0b..d5f3c06 100644 Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png index 4d23b49..d66ecc2 100644 Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png index 1735cd7..cf03ff8 100644 Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png index 42f69b9..c9e8f47 100644 Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png index a0cf4f7..c75754b 100644 Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png index fe8be56..d727e91 100644 Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png index 6617dc3..8a9cf65 100644 Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png index cf525ea..978bf50 100644 Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png index 40fd1a1..8238755 100644 Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index f2f36e5..adc14d3 100644 Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index 21ba33f..99832d7 100644 Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index 266d020..84ce9c5 100644 Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@1x.png b/src-tauri/icons/ios/AppIcon-20x20@1x.png index 604235d..aeeee9b 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@1x.png and b/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png index 123349e..8b8e8f2 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png and b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x.png b/src-tauri/icons/ios/AppIcon-20x20@2x.png index 123349e..8b8e8f2 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@2x.png and b/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@3x.png b/src-tauri/icons/ios/AppIcon-20x20@3x.png index d6a6c65..58c3ba3 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@3x.png and b/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@1x.png b/src-tauri/icons/ios/AppIcon-29x29@1x.png index 3d4ea6b..397384f 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@1x.png and b/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png index 0e1cfc2..8b5db19 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png and b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x.png b/src-tauri/icons/ios/AppIcon-29x29@2x.png index 0e1cfc2..8b5db19 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@2x.png and b/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@3x.png b/src-tauri/icons/ios/AppIcon-29x29@3x.png index 71dc228..7b47467 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@3x.png and b/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@1x.png b/src-tauri/icons/ios/AppIcon-40x40@1x.png index 123349e..8b8e8f2 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@1x.png and b/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png index 6734350..5d7a75b 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png and b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x.png b/src-tauri/icons/ios/AppIcon-40x40@2x.png index 6734350..5d7a75b 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@2x.png and b/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@3x.png b/src-tauri/icons/ios/AppIcon-40x40@3x.png index b19606c..b27ab85 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@3x.png and b/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-512@2x.png b/src-tauri/icons/ios/AppIcon-512@2x.png index f5e14d9..8896ccc 100644 Binary files a/src-tauri/icons/ios/AppIcon-512@2x.png and b/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@2x.png b/src-tauri/icons/ios/AppIcon-60x60@2x.png index b19606c..b27ab85 100644 Binary files a/src-tauri/icons/ios/AppIcon-60x60@2x.png and b/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@3x.png b/src-tauri/icons/ios/AppIcon-60x60@3x.png index 0ed14eb..ea74ca4 100644 Binary files a/src-tauri/icons/ios/AppIcon-60x60@3x.png and b/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@1x.png b/src-tauri/icons/ios/AppIcon-76x76@1x.png index f349dae..2834ca4 100644 Binary files a/src-tauri/icons/ios/AppIcon-76x76@1x.png and b/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@2x.png b/src-tauri/icons/ios/AppIcon-76x76@2x.png index 4f5cf20..8fe8c17 100644 Binary files a/src-tauri/icons/ios/AppIcon-76x76@2x.png and b/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png index 3d8c348..fd895a2 100644 Binary files a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png and b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/src-tauri/icons/logo-source.jpg b/src-tauri/icons/logo-source.jpg deleted file mode 100644 index 268ccc3..0000000 Binary files a/src-tauri/icons/logo-source.jpg and /dev/null differ diff --git a/src/lib/components/wizard/SetupWizard.svelte b/src/lib/components/wizard/SetupWizard.svelte index 4728dfd..767f18a 100644 --- a/src/lib/components/wizard/SetupWizard.svelte +++ b/src/lib/components/wizard/SetupWizard.svelte @@ -45,6 +45,8 @@ Check, AlertCircle, Book, + Trash2, + Plus, } from 'lucide-svelte'; interface Props { @@ -86,6 +88,16 @@ let manualCharacterTraits = $state(''); let showManualInput = $state(true); // Show manual input by default + // Supporting character input + let showSupportingCharacterForm = $state(false); + let editingSupportingCharacterIndex = $state(null); + let supportingCharacterName = $state(''); + let supportingCharacterRole = $state(''); + let supportingCharacterDescription = $state(''); + let supportingCharacterRelationship = $state(''); + let supportingCharacterTraits = $state(''); + let isElaboratingSupportingCharacter = $state(false); + // Step 2: Import Lorebook (optional - moved to early position) let importedLorebook = $state(null); let importedEntries = $state([]); @@ -102,6 +114,7 @@ // Step 7: Generate Opening let storyTitle = $state(''); + let openingGuidance = $state(''); // Creative writing mode: user guidance for opening scene let generatedOpening = $state(null); let isGeneratingOpening = $state(false); let openingError = $state(null); @@ -170,7 +183,22 @@ } } - // Step 3: Expand Setting + // Step 3: Use setting as-is without AI expansion + function useSettingAsIs() { + if (!settingSeed.trim()) return; + + // Create a minimal expanded setting from the seed text + expandedSetting = { + name: settingSeed.split('.')[0].trim().slice(0, 50) || 'Custom Setting', + description: settingSeed.trim(), + keyLocations: [], + atmosphere: '', + themes: [], + potentialConflicts: [], + }; + } + + // Step 3: Expand Setting with AI async function expandSetting() { if (!settingSeed.trim() || isExpandingSetting) return; @@ -323,6 +351,118 @@ } } + // Supporting character form management + function openSupportingCharacterForm() { + editingSupportingCharacterIndex = null; + supportingCharacterName = ''; + supportingCharacterRole = ''; + supportingCharacterDescription = ''; + supportingCharacterRelationship = ''; + supportingCharacterTraits = ''; + showSupportingCharacterForm = true; + } + + function editSupportingCharacter(index: number) { + const char = supportingCharacters[index]; + editingSupportingCharacterIndex = index; + supportingCharacterName = char.name; + supportingCharacterRole = char.role; + supportingCharacterDescription = char.description; + supportingCharacterRelationship = char.relationship; + supportingCharacterTraits = char.traits?.join(', ') || ''; + showSupportingCharacterForm = true; + } + + function cancelSupportingCharacterForm() { + showSupportingCharacterForm = false; + editingSupportingCharacterIndex = null; + supportingCharacterName = ''; + supportingCharacterRole = ''; + supportingCharacterDescription = ''; + supportingCharacterRelationship = ''; + supportingCharacterTraits = ''; + } + + function useSupportingCharacterAsIs() { + if (!supportingCharacterName.trim()) return; + + const newChar: GeneratedCharacter = { + name: supportingCharacterName.trim(), + role: supportingCharacterRole.trim() || 'supporting', + description: supportingCharacterDescription.trim() || '', + relationship: supportingCharacterRelationship.trim() || '', + traits: supportingCharacterTraits.trim() + ? supportingCharacterTraits.split(',').map(t => t.trim()).filter(Boolean) + : [], + }; + + if (editingSupportingCharacterIndex !== null) { + supportingCharacters[editingSupportingCharacterIndex] = newChar; + supportingCharacters = [...supportingCharacters]; // Trigger reactivity + } else { + supportingCharacters = [...supportingCharacters, newChar]; + } + + cancelSupportingCharacterForm(); + } + + async function elaborateSupportingCharacter() { + if (isElaboratingSupportingCharacter) return; + + const hasInput = supportingCharacterName.trim() || + supportingCharacterDescription.trim() || + supportingCharacterRelationship.trim(); + + if (!hasInput) return; + + isElaboratingSupportingCharacter = true; + + try { + // Use the same elaboration service but for supporting characters + const elaborated = await scenarioService.elaborateCharacter( + { + name: supportingCharacterName.trim() || undefined, + description: supportingCharacterDescription.trim() || undefined, + background: supportingCharacterRelationship.trim() || undefined, // Use relationship as background context + motivation: supportingCharacterRole.trim() || undefined, // Use role as motivation context + traits: supportingCharacterTraits.trim() + ? supportingCharacterTraits.split(',').map(t => t.trim()).filter(Boolean) + : undefined, + }, + expandedSetting, + selectedGenre, + customGenre || undefined, + settings.wizardSettings.characterElaboration + ); + + // Convert elaborated protagonist format to supporting character format + const newChar: GeneratedCharacter = { + name: elaborated.name, + role: supportingCharacterRole.trim() || 'supporting', + description: elaborated.description, + relationship: supportingCharacterRelationship.trim() || elaborated.background || '', + traits: elaborated.traits || [], + }; + + if (editingSupportingCharacterIndex !== null) { + supportingCharacters[editingSupportingCharacterIndex] = newChar; + supportingCharacters = [...supportingCharacters]; + } else { + supportingCharacters = [...supportingCharacters, newChar]; + } + + cancelSupportingCharacterForm(); + } catch (error) { + console.error('Failed to elaborate supporting character:', error); + } finally { + isElaboratingSupportingCharacter = false; + } + } + + function deleteSupportingCharacter(index: number) { + supportingCharacters = supportingCharacters.filter((_, i) => i !== index); + } + // Step 7: Generate Opening async function generateOpeningScene() { if (isGeneratingOpening) return; @@ -344,6 +484,7 @@ tone, }, title: storyTitle, + openingGuidance: selectedMode === 'creative-writing' && openingGuidance.trim() ? openingGuidance.trim() : undefined, }; // Prepare lorebook entries for opening generation context @@ -389,6 +530,7 @@ tone, }, title: storyTitle, + openingGuidance: selectedMode === 'creative-writing' && openingGuidance.trim() ? openingGuidance.trim() : undefined, }; // Generate opening if not already done @@ -805,20 +947,29 @@ > - {#if settingSeed.trim().length > 0} - + {#if settingSeed.trim().length > 0 && !expandedSetting} +
+ + +
{/if} {#if settingError} @@ -829,14 +980,23 @@

{expandedSetting.name}

- +
+ + +

{expandedSetting.description}

@@ -1058,39 +1218,169 @@

Supporting Cast

- +
+ + +
+ + {#if showSupportingCharacterForm} +
+

+ {editingSupportingCharacterIndex !== null ? 'Edit' : 'Add'} a supporting character. You can use them as-is or have AI elaborate on them. +

+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+
+ {/if} + + {#if supportingCharacters.length > 0}
- {#each supportingCharacters as char} + {#each supportingCharacters as char, index}
-
- {char.name} - {char.role} +
+
+ {char.name} + {char.role} +
+
+ + +

{char.description}

-

{char.relationship}

+ {#if char.relationship} +

{char.relationship}

+ {/if} + {#if char.traits && char.traits.length > 0} +
+ {#each char.traits as trait} + {trait} + {/each} +
+ {/if}
{/each}
- {:else} + {:else if !showSupportingCharacterForm}

- {protagonist - ? 'Click "Generate Characters" to create supporting cast members.' - : 'Generate a protagonist first to create supporting characters.'} + No supporting characters yet. Add one manually or generate multiple with AI.

{/if}
@@ -1183,6 +1473,26 @@ />
+ + {#if selectedMode === 'creative-writing'} +
+
+ +

Opening Scene Guidance

+ (Optional) +
+

+ As the author, describe what you want to happen in the opening scene. Include setting details, character positions, mood, or specific events. +

+ +
+ {/if} + {#if storyTitle.trim()}