1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._posthogChunkIds=e._posthogChunkIds||{},e._posthogChunkIds[n]="b0ddccf9-55a3-52f3-9ef9-ed8b58d8f6c7")}catch(e){}}();const e="Tap again to confirm",t={namePlaceholder:"Name this card",moreActions:"More actions",importBundle:"Import Bundle",exportBundle:"Export Bundle",enterStudio:"Canvas",save:"Save",saveTooltip:"Save (Ctrl+S)",publish:"Publish",publishTooltip:"Publish to Discover",publishUpdate:"Update",publishUpdateTooltip:"Update published listing",play:"Play",saveWorldFirst:"Save the world first",failedEnterStudio:"Could not open the Canvas",failedStartPlay:"Failed to start play session",creatorGuide:"Creator Guide",groups:{content:"Content · every scenario",presentation:"Presentation",publish:"Publish",creation:"AI Tools",card:"The card"},switchSimple:"Simple Mode",versionHistoryMenu:"Version History",untitledWorld:"Untitled World",marketplaceTitle:"Bundles",marketplaceSubtitle:"Browse community, manage installed bundles",saved:"Saved",loadWorldFailed:"Couldn't load this world",recoverDraftFound:"Unsaved changes from last time",recoverDraftAction:"Recover",saveTitle:"Save (Ctrl+S)",menuClassicMode:"Full mode",menuSimpleMode:"Simple mode",visualSwitch:"Canvas",visualEnterHint:"Turn the Canvas on",visualExitHint:"Turn the Canvas off â back to the Full editor",studioSwitch:"Studio",studioEnterHint:"Open Studio",studioExitHint:"Leave Studio â back to the Full editor",visualBeta:"Beta",visualIntroTitle:"Canvas editor (Beta)",visualIntroBody:"Turn on this switch and the whole card is laid out on one board: openings, lore, numbers, behaviors and the player screen, side by side. Edit anything where it sits, and the assistant works right on the board. Turn it off any time to come back to the Full editor.",visualIntroTry:"Try the Canvas",visualIntroLater:"Not now",recoverDraftMerged:"This card changed elsewhere since then â your recovered version was kept"},a={firstMessage:"First Message",lorebook:"Lorebook",worldbooks:"Scenarios",variables:"Variables",behaviors:"Behaviors",customUI:"Player interface",audio:"Audio",assets:"Assets",overview:"Overview",bundles:"Bundles",aiGeneration:"AI Generation",apps:"In-story Apps",sceneImages:"Scene Images",modules:"Scenarios",packs:"Mechanic packs",backgrounds:"Background"},o={listTitle:"Knowledge bases",bookCount_one:"{{count}} book",bookCount:"{{count}} books",mainBook:"Main book",mainBookDesc:"The card's main book â always on. Put the world, the protagonist and the rules every route needs here. (This equals your single lorebook today.)",allEntries:"All entries",allBadge:"Cross-book order",allDesc:"Entries from every knowledge base, merged in their actual send order â drag here to reorder entries across books.",bindingsTab:"Frontend lore",bindingsBadge:"Frontend-driven",bindingsPanelDesc:"The dedicated knowledge base for all frontend-controlled entries â add a <LoreButton> / <LoreSwitch> in your frontend code (Custom UI) and an entry is created here. The entry enters the prompt only while the player turns its control on.",controlCount_one:"{{count}} control",controlCount:"{{count}} controls",newBook:"New knowledge base",newBookName:"Book {{n}}",untitledBook:"(untitled book)",namePlaceholder:"Book name (e.g. Route A, Tavern)",entryCount_one:"{{count}} entry",entryCount:"{{count}} entries",toggleEnable:"Enable / disable this book",enableLabel:"Enabled",removeBook:"Delete this knowledge base",disabled:"Disabled",listHint:"A card can hold several independent knowledge bases. Each can be enabled/disabled as a whole and optionally bound to a variable / frontend / opening. Entries live inside each book.",activationTitle:"Auto-activate when",activationOptional:"(optional · or purely manual)",modeAlways:"Always on",modeConditions:"By variable",modeManual:"Manual / frontend",badgeAlways:"Always on",badgeManual:"Manual",badgeConditions:"By variable",badgePrefixVar:"when",logicLabel:"Match",logic_all:"All",logic_any:"Any",noVars:"No variables yet â add some in Variables first to gate this book by condition.",alwaysHint:"This book is always on (as long as it's enabled).",manualHint:"No variable rule: you control this book's on/off â put a button in your frontend, or flip the enable switch above. Binding is optional.",modeGreeting:"Bound to Opening",modeGreetingHint:"This book is active only when one of the selected openings is the session's starting message. Perfect for per-route independent knowledge.",greetingPickerTitle:"Bind to which openings",greetingNone:"No openings yet â add some in First Message first",badgeGreeting:"Opening",expandBook:"Expand",collapseBook:"Collapse",collapseSidebar:"Collapse book list",expandSidebar:"Expand book list",rename:"Rename",confirmRename:"Done"},n={title:"Scenarios",description:"Group entries into scenarios that switch on as a whole â entries in no scenario are Shared and always on;
1 the rest come online by variable conditions, per route or per scene. Only open scenarios reach the AI, so a big multi-world card stays within budget.",add:"Add scenario",coreNote:"Entries in no scenario are Shared and always on. Add a scenario below and assign entries to it so they activate only on a condition.",emptyTitle:"No scenarios yet",emptyDesc:"Create a scenario to gate a whole set of entries (its own presets, examples, lore) behind a variable â perfect for routes, chapters and scenes.",namePlaceholder:"Scenario name (e.g. Tavern, Route A)",memberCount_one:"{{count}} entry",memberCount:"{{count}} entries",remove:"Remove scenario",modeAlways:"Always on",modeConditions:"Variable conditions",alwaysHint:"This scenario is always open â its entries are always eligible (same as Shared).",logicLabel:"Match",logic_all:"All",logic_any:"Any",noVars:"No variables defined yet â add variables first to gate this scenario.",assignTitle:"Assign entries to scenarios",assignHint:'Pick which scenario each entry belongs to. "Shared" = always on. Openings are managed in First Message.',core:"Shared (always on)",untitledEntry:"(untitled entry)",mapTitle:"Structure map",mapOpenings:"Openings â activate",mapBooks:"Scenarios"},i={title:"First Message",description:"The opening message shown when a player starts a new session. Add several openings for players to swipe through.",addGreeting:"Add another opening",placeholder:"Write the opening message your players will see...",macros:"Macros:",tokens_one:"~{{count}} token",tokens:"~{{count}} tokens",deleteGreeting:"Delete Opening",confirmDelete:"Click again to confirm",noFirstMessage:"No First Message",noFirstMessageDesc:"The first message sets the scene â it introduces the setting, characters, and gives players something to respond to.",createFirstMessage:"Create First Message",learnMore:"Creator Guide â",initialVarsTitle:"When this opening starts",initialVarsHint:'Variables to seed when a player starts on this opening. Use this to make an opening a route/scenario preset â e.g. set route = "mayu" so the matching scenario (and frontend view) activate from turn one.',addInitialVar:"+ Seed a variableâ¦",removeInitialVar:"Remove",initialVarsReadonlyHint:"Seeded when a player picks this opening. Edit these under Variables â Per-opening values.",editInVariables:"Edit in Variables",noInitialVars:"No variables seeded for this opening â it uses defaults.",true:"true",false:"false",dragHint:"Drag the numbers to reorder",greetingName:"Greeting {{n}}",macrosPlain:"Write {{user}} for the player and {{char}} for the character; they become names in play."},r=JSON.parse(`{"unnamed":"Unnamed","fromBundle":"From a bundle","fromBundleNamed":"From bundle: {{name}}","unnamedFolder":"Unnamed folder","renameFolder":"Rename folder","deleteFolder":"Delete folder","removeTurn":"Remove turn","title":"Lorebook","description":"All content injected into the prompt â characters, system instructions, scenarios, lore","addEntry":"Add Entry","add":"Add","all":"All","filter":"Filter","editEntry":"Edit Entry","isCharacter":"This is a character","isCharacterHint":"Characters can have a portrait and a voice. The portrait shows beside their lines in chat and is used for story illustrations.","duplicate":"Duplicate","copySuffix":"copy","delete":"Delete","back":"Back","noEntries":"No entries yet","noEntriesDesc":"The lorebook holds everything the AI needs â character descriptions, world lore, system instructions, and more.","noEntriesLabel":"No entries","learnMore":"Creator Guide â","totalTokens_one":"Total: ~{{count}} token","totalTokens":"Total: ~{{count}} tokens","tokenBreakdown":{"perTurnLabel":"Per turn","disabledLabel":"Disabled","totalLabel":"Total","greeting":"First Message","greetingHint":"Sent once at session start, before the player's first message.","greetingHintMulti":"{{count}} greetings â the player sees one per session, not all of them. This row sums every greeting in the lorebook.","alwaysSent":"Always Sent","alwaysSentHint":"Entries marked \\"Always Send\\". Included in the prompt every turn â this is your predictable per-turn cost floor.","keywordTriggered":"Keyword Triggered","keywordTriggeredHint":"Fires only when the keywords match recent messages, capped by the lorebook token budget. Variable cost from 0 up to this number per turn.","dormant":"Standby","dormantHint":"Not sent every turn and has no keywords or conditions, so it never goes out on its own. That's standby lore: a behavior turns it on with \\"Enable lore entry\\". If you didn't mean that, give it keywords or a condition.","toggleHint":"Click to expand or collapse the per-bucket breakdown","healthHealthy":"Token count looks healthy.","healthCaution":"Getting big. Worth checking: is the same setting written across several entries? Are you repeating 'don't do X' (which can make the AI fixate on X)? Are you writing things the engine already handles? Pick one spot and trim it.","healthHeavy":"The less you write, the better the AI listens â when there's too much, it loses the point. Try merging duplicated settings, compressing long example lists into a single principle + word list, and dropping rules the engine already enforces.","tokUnit":"tok"},"entrySettings":"Entry Settings","scanDepth":"Scan Depth","scanDepthHint":"Number of recent messages to scan (1 - 50)","recursionDepth":"Recursion Depth","recursionDepthHint":"Max depth for cascading entry triggers. 0 = disabled.","addOfficialPresets":"Add Official Presets ({{count}} missing)","messages":"...messages...","name":"Name","portrait":"Portrait","sendAs":"Send as","content":"Content","dialogue":"Dialogue","entryPlaceholder":"Entry content...","resetToOfficial":"Reset to official","tags":"Tags","newTag":"+ New","tagPlaceholder":"Tag name...","rename":"Rename","depth":"Depth (messages from end)","depthHint":"Only matters when placed in the chat: how many messages up from the newest. 0 sits right next to the newest message, where the AI weighs it most; bigger numbers sit further back, more like background.","position":"Position","positionHint":"Sort order within this section. Lower = higher up. Drag to reorder automatically.","keywords":"Keywords","keywordsComma":"(separate with commas: ,)","keywordsPlaceholder":"tavern, inn, drink","keywordsHint":"This entry activates when these keywords appear in recent messages. Press Enter to insert a separator; comma (,), fullwidth (ï¼) and é¡¿å· (ã) all work.","whenConditions":"Variable conditions","whenConditionsHint":"Fire this entry when game variables match â even with no keywords. Combine with keywords for AND logic.","triggerMode":"Trigger mode","triggerModeManual":"Manual","triggerModeVariable":"Bind variables","variableBindExplain":"This entry is active only while the conditions below are met (prompt injection / Custom UI slots). Enabled and Always Send do not apply.","variableBindNoVars":"Define variables in the Variables section first","variableBoundBadge":"VAR","uiBindBadge":"UI:{{slot}}","worldbookLabel":"Scenario","worldbookCore":"Shared (every scenario)","worldbookHint":"Which scenario this entry belongs to. Shared entries reach every scenario; a scenario's own reach the AI only while that scenario is open.","worldbookBadge":"Scenario: {{name}}","viewClassic":"By position","viewTriggers":"By trigger","triggerBoard":{"title":"When the AI sees each entry","description":"Each card shows the conditions that make it enter the AI prompt. Combined triggers must all be true.","total_one":"{{count}} entry","total":"{{count}} entries","combined":"Combined","combinedHint":"Multiple conditions must all pass","alwaysSend":"Always send","alwaysSendHint":"Injected every turn â stable cache prefix","keywords":"Keywords","keywordsHint":"Fire when keywords appear in recent chat","variables":"Variables","variablesHint":"Fire when variable conditions match","frontend":"UI trigger","frontendHint":"Active while a custom UI trigger point is mounted","categoryEmpty":"No entries","combinedEmpty":"No entries require multiple trigger types yet","frontendEmpty":"Add UI trigger points in custom UI code â bindings will auto-create entr
1ies here","openBindings":"Open bindings â","slotLabel":"Slot {{slot}}","frontendChip":"UI: {{slot}}","variableChip":"Variable: {{condition}}","keywordChip":"Keywords: {{keywords}}","requiresAll":"Requires all:","everyTurn":"Every turn","noKeywordsYet":"No keywords yet","disabled":"Off","activationTitle":"Common UI trigger patterns","activationMount":"Conditional render: {open && <LoreSlot id=\\"x\\" />} â visible means active","activationClick":"Button toggles state that controls whether the trigger point exists","activationVariable":"useEffect when a variable changes â show the trigger point when true","activationTab":"Tabs / panels â render the trigger point only on the active view","activationScroll":"Scroll into view â IntersectionObserver then mount","activationHover":"Hover / long-press reveals a region that mounts the trigger point"},"keywordsEnterHint":"Press Enter to add the next keyword (commas , ï¼ã also work)","enabled":"Enabled","alwaysSend":"Always Send","alwaysSendRecommended":"(recommended for caching)","alwaysSendWarningTitle":"This may increase token costs","alwaysSendWarningDesc":"Entries in this section form a stable prompt prefix that LLM providers cache across turns. Making it keyword-triggered means the prefix changes when keywords match, reducing cache efficiency and increasing costs.","cacheWarningTitle":"This significantly increases token cost","cacheWarningDesc":"Keyword-triggered entries outside the Chat History section break prompt caching. When the keyword fires, the entire cached prefix is invalidated, forcing every turn to re-process all prior context. Move this entry to Chat History (with a depth) to keep the cache intact.","cancel":"Cancel","disableAlwaysSend":"Disable Always Send","turnOff":"Turn Off","tagAlreadyExists":"Tag already exists","deletedTag":"Deleted tag \\"{{name}}\\"","manageTags":"Manage Tags","defaultTagLabels":{"Characters":"Characters","Plot":"Plot","Style":"Style","Example":"Example","Preset":"Preset"},"filterMode":{"any":"Any","all":"All","anyHint":"Match any selected tag","allHint":"Must match all selected tags"},"tagManager":{"title":"Tag Manager","description":"Create, rename, and delete custom tags for this world. Built-in tags cannot be modified.","builtin":"built-in","orphan":"orphan","rename":"Rename","delete":"Delete","color":"Color","resetColor":"Reset to default","confirm":"Confirm","cancel":"Cancel","newPlaceholder":"New tag name...","add":"Add","usageCount_one":"{{count}} entry","usageCount":"{{count}} entries","unused":"unused","cleanupUnused":"Remove {{count}} unused tag(s)","cleanedUp":"Removed {{count}} unused tag(s)","deletedPill":"Tag deleted"},"addFolder":"Add Folder","newEntry":"New Entry","newFolder":"New Folder","secondaryKeywords":"Secondary Keywords","secondaryKeywordsPlaceholder":"healing, restoration","secondaryLogic":"Secondary Keywords","secondaryLogicLabel":"Secondary Logic","keywordsCount_one":"{{count}} keyword","keywordsCount":"{{count}} keywords","wholeWord":"Whole Word","preventRecursion":"Prevent Recursion","excludeRecursion":"Exclude from Recursion","sections":{"systemPresets":"Always sent to the AI","systemPresetsHint":"Every turn","examples":"Example dialogue","chatHistory":"Sent when mentioned","chatHistoryHint":"When a keyword comes up in the chat","postHistory":"At the end"},"sendAsOptions":{"system":"Instruction","systemHint":"AI follows these as rules.","user":"User","userHint":"Appears as a human message.","assistant":"AI","assistantHint":"AI thinks it said this. For prefill & CoT bypass."},"advanced":"Advanced","advancedKeywords":"Keywords","emptyTitle":"No entries","emptyFolder":"Empty â drag entries here","portraitVideo":"Moving portrait","portraitVideoHint":"Optional. With a clip here, chat shows it instead of the still portrait: âIdleâ loops, âSpeakingâ plays while this character talks.","portraitVideoRemove":"Remove","portraitVideoClip":{"idle":"Idle","speaking":"Speaking"},"pickToEdit":"Pick an entry on the left to edit it","historyLimit":"Conversation history the AI reads","historyLimitHint":"Latest N messages only â older turns leave the prompt but stay in the transcript. Lore, memory and pinned entries are unaffected.","historyLimitHintAll":"Everything the context window fits â the whole conversation reaches the AI, and the oldest turns drop only when the budget runs out.","examplePlainTextHint":"This example contains text outside the dialogue lines, so it's edited as plain text to keep every line intact.","addExampleMessage":"Add message"}`),s={title:"Variables",description:"Define game state variables to track player stats, items, and story progress.",addVariable:"Add Variable",add:"Add",noVariables:"No variables yet",noVariablesDesc:"The AI reads and updates variables during gameplay using bracket syntax like [health: -10].",learnMore:"Creator Guide â",editV
1ariable:"Edit Variable",delete:"Delete",back:"Back",id:"ID",idHint:"Used in templates as {{template}}",displayName:"Display Name",type:"Type",defaultValue:"Default Value",min:"Min",max:"Max",noMin:"No min",noMax:"No max",behaviorRules:"Behavior Rules",behaviorRulesPlaceholder:"e.g. 0 = death, 1-20 = critical, 20-50 = wounded...",behaviorRulesHint:`Describe in plain language when and how this variable should change â the engine handles telling the AI which update directive to emit. You don't need to write commands like "set hp=..." here.`,aiAccessLabel:"AI access",aiAccessOptions:{write:"AI can read & write",read:"AI read-only",none:"Engine only (hidden from AI)",precise:"AI read-only (precise tracking writes it)"},aiAccessHint:{write:"Shown to the AI every turn and updatable via its directives â for state only the AI can judge (affinity, mood).",read:"Shown to the AI with a read-only marker so it narrates the value, but AI directives targeting it are dropped â drive it from behaviors or your custom UI.",none:"Never sent to the AI. Still drives conditions, behaviors and your custom UI â for ledgers, counters and other bookkeeping.",precise:"Precise tracking is on: shown to the AI as read-only, and the storytelling AI's directives for it are dropped â the precise-tracking helper decides each turn how it changes. The setting here applies once precise tracking is off."},activationLabel:"Active when",activationModes:{always:"Always",manual:"Manual",conditions:"Conditions",greeting:"Openings"},enabledDefaultLabel:"Enabled at start",enabledOn:"On",enabledOff:"Off",manualHint:"Toggle it at runtime from a behavior via {{path}} (true/false). While off, the variable leaves the AI prompt and player UI but keeps its value.",conditionsHint:"Active only while these conditions match â the value is kept while inactive.",greetingHint:"Active only in sessions started from the checked openings.",alwaysHint:"Always active (default).",badges:{read:"read-only",none:"engine",manual:"manual",conditions:"conditional",greeting:"openings",precise:"precise"},invalidJson:"Invalid JSON: {{message}}",jsonUndo:"Undo",jsonRedo:"Redo",jsonExpand:"Expand editor",jsonCollapse:"Collapse editor",jsonPreserved:"Valid JSON · Key order and formatting preserved",jsonInvalidDraft:"Invalid JSON. Check brackets, quotes and commas.",jsonSaveBlocked:"Fix the JSON default value for â{{name}}â before saving.",jsonHint:"Must be valid JSON (object or array). Use double quotes around field names and string values.",unnamed:"Unnamed",booleanTrue:"True",booleanFalse:"False",idHintPrefix:"Used in templates as",idTaken:"That ID is already used by another variable â renamed to {{id}}",emptyTitle:"No variables",viewList:"Variables",viewOpenings:"Per-opening values",openingValues:{title:"Per-opening initial values",hint:"Each opening can override a variable's starting value. Cells left on âdefaultâ use the variable's default. This is the one place to set per-opening values â the First Message panel mirrors it read-only.",variable:"Variable",default:"Default",openingShort:"Opening ",untitledOpening:"(untitled opening)",useDefault:"· default ·",setOverride:"Set a value for this opening",revertToDefault:"Revert to default",unset:"(unset)",emptyTitle:"Nothing to seed yet",emptyDesc:"Add at least one variable and one opening (in First Message) to set per-opening starting values."},types:{number:"Number",string:"Text",boolean:"Switch",json:"JSON (Object / Array)"},optionsLabel:"Allowed values",optionsHint:"Pin the AI's output here: once filled in, this variable only ever takes one of these values. Leave it empty and the AI changes it freely, which can be less stable.",optionsAdd:"Add a value",optionsPlaceholder:"Type and press Enter",preciseLabel:"Precise tracking",preciseHint:"When on, a dedicated helper checks every turn whether this variable should change and by how much, which is more accurate and steadier than leaving it to the storytelling AI.",preciseStringHint:"When on, this variable changes more accurately and more steadily, and is always one of the allowed values",preciseDown:"Most it can fall per turn",preciseUp:"Most it can rise per turn",preciseRange:"Each turn it moves somewhere between â{{down}} and +{{up}}, as the story warrants",preciseUpOnly:"Each turn it can only rise, by at most +{{up}}, or stay",preciseDownOnly:"Each turn it can only fall, by at most â{{down}}, or stay",preciseZero:"Both are 0, so it will never change",preciseTooWide:"This range is too wide for precise tracking. The two numbers must add up to {{max}} or less",worldbookLabel:"Scenario",worldbookCore:"Shared (every scenario)",worldbookHint:"Which scenario this variable belongs to. Shared variables are read and written by every scenario; a scenario's own reach the AI only while that scenario is open, and the AI's writes are dropped while it is closed (the value itself is kept).",pickToEdit:"Pick a variable on the left to edit it",editing:{technicalInfo:"Technical information",idReferences:"Conditions, behaviors and templates use this ID. Referenced IDs are protected from direct changes.",emptyConditions:"No condition has been added yet. This currently adds no restriction; add a condition below.",emptyGreetings:"No opening is selected. This variable will stay inactive until you choose one.",missingGreeting:"Missing opening: {{id}}",disabledHint:"The initial switch is off, so this variable stays inactive even when its activation rule matches.",applyId:"Apply",idEmpty:"Enter an ID. The current ID has been kept.",idRejected:"The ID could not be changed. The current ID has been kept.",idInUse:"This ID is in use. Resolve the references below before changing it; the display name can still be edited.",idUsages:"ID references",codeReview:"Frontend code needs review",codeReviewHint:"Code is not rewritten. These are review hints, not confirmed ID references; dynamic access cannot be checked completely. The frontend normally uses display names, so review it after changing a name.",nameReferences:"The frontend may use this display name. After renaming it, check the corresponding interface code.",referenceAreas:{entry:"Entry or opening",variable:"Variable",behavior:"Behavior",rule:"Rule",module:"Scenario",interface:"Player interface",audio:"Audio",scene:"Scene",bundle:"Resource pack",settings:"Card settings"},codeReasons:{name:"Reads or writes this display name.",dynamic:"Computes variable names at runtime; inspect manually.",id:"Contains the ID text. It may be an ordinary string; inspect manually."}}},l={title:"Player interface",description:"Custom TSX components for messages and full-app UI",addComponent:"Add Component",surfaceMessage:"Message",surfaceApp:"App",compile:"Compile:",ok:"OK",addFile:"New File",addFileHint:"File name â the extension you type is kept (.tsx, .ts, .jsx, .js); without one we use .tsx",rename:"Rename",renameFile:"Rename File",renameFileHint:"Imports resolve without the extension, so changing only the extension is safe. Files that import this one by name are not updated.",fileBadExtension:"Use .tsx, .ts, .jsx or .js",fileBadPath:"A file name cannot start with / or c
1ontain ..",fileExists:"File already exists",create:"Create",cancel:"Cancel",fileImported:"File imported",failedReadFile:"Failed to read file",componentRemoved:"Component removed",namePlaceholder:"Component name",tsxCode:"TSX Code",tsxPlaceholder:"export default function Component({ variables }) { ... }",importFile:"Import File",remove:"Remove",messageRenderer:"Message Renderer",messageRendererDesc:"Custom per-message display",alreadyAdded:"Already added (max 1)",appComponent:"App Component",appDesc:"Full-screen custom interface",cannotMix:"Cannot mix with other surface type",learnMore:"Creator Guide â",quickTemplates:"Quick Templates",componentName:"Component Name",availableTools:"Available Tools",toolUseYumina:"variables, messages, sendMessage, setVariable, playAudio",toolChat:"scroll, streaming, swipes, input",toolMessageList:"scrollable message container",toolMessageInput:"text input + send",toolIcons:"Lucide icons",toolLoreSlot:"UI trigger point â when mounted, bound knowledge goes to the AI without showing its text to players",tabCode:"Code",tabBindings:"Bindings",bindingsEmpty:"Place UI trigger points in TSX â a lore entry is auto-created here for each trigger point.",bindingsHint:"These are hidden entries for the AI, not text shown to players. While the UI trigger point is mounted, the bound knowledge enters the AI prompt.",bindingsGoToCode:"Edit the player interface code â",bindingsActivationTitle:"When this hidden knowledge should be shown to the AI",bindingsActivationMount:"Conditional render â mounted = active, unmounted = off",bindingsActivationClick:"Button onClick toggles state that renders LoreSlot",bindingsActivationVariable:"Watch a variable â useEffect mounts LoreSlot when conditions match",bindingsActivationTab:"Tabs / routes â LoreSlot only on the active view",bindingsActivationScroll:"Scroll visibility â IntersectionObserver mounts when in view",bindingsOptionalConditions:"Optional: stack variable conditions. The UI trigger point must be mounted, and the variables must pass, before the AI sees it.",bindingsSlotBadge:"UI trigger",bindingsActivationSummary:"Enters the AI prompt while the player mounts/clicks this control in the UI.",bindingsSavedSlot:"Saved binding",bindingsCreating:"Creating entryâ¦",bindingsEntryConditionsHint:"Edit variable conditions on the lorebook entry â the list row shows a summary.",bindingsEntry:"Lorebook entry",bindingsSelectEntry:"â Select entry â",bindingsSlotConditions:"Slot conditions",bindingsSlotConditionsOptional:"Extra slot conditions (optional)",legacyTag:"Legacy",templateDefault:"Blank",insertSnippet:"Snippets",snippetChatCanvasRenderer:"Message Renderer",snippetChatCanvasRendererDesc:"Custom per-message styling for ChatCanvas",snippetXmlParser:"XML Tag Parser",snippetXmlParserDesc:"Parse and strip custom tags from AI output",snippetFloatingPanel:"Floating Panel",snippetFloatingPanelDesc:"Toggle button + floating panel",snippetStatDisplay:"Stat Bars",snippetStatDisplayDesc:"HP/MP bars + stat card",snippetCopied:"Snippet copied â paste it into your code",htmlCode:"HTML",htmlPlaceholder:`<div>Your HTML here</div> 2<script>window.yumina.onChange(function() { ... });<\/script>`,markdownCode:"Markdown",markdownPlaceholder:`# Heading 3 4Your markdown content here...`,builderBanner:"Arrange this card's interface like a slide deck",builderBannerHint:"Your existing frontend is preserved as the base layer and can be restored any time. Code editing stays right here.",builderBannerCta:"Open the visual builder",noRootComponent:"This world has no custom UI yet. Save the draft to regenerate a default.",entryFileBadge:"entry"},d={title:"In-story apps",blurb:"Apps the player opens from a dock beside the chat: messages, relationships, a feed, the clock⦠Each one keeps its data in one variable and the AI fills it in as the story goes â the preview above each card is the real app. You don't build anything.",add:"Add app",added:"Added â in the dock",footnote:"The app's words follow the card's language (Chinese, English or Spanish). Remove it from the Bundles page and its button, data and rules go with it.",sets:"Starter sets â what most cards of each kind track",addSet:"Add all four",setAdded:"All added",installed:"Added {{name}}"}
4,h={title:"Audio",description:"Background music and sound effects triggered by events, keywords, or variables",addTrack:"Add Track",searchPlaceholder:"Search audio...",noTracks:"No audio tracks yet",noTracksDesc:"Add background music and sound effects that play based on game events, keywords, or variable changes.",learnMore:"Creator Guide â",noTracksMatch:'No tracks match "{{query}}"',back:"Back",trackTitle:"Title",trackTitlePlaceholder:"Track name",delete:"Delete",audioSource:"Audio Source",urlLabel:"URL or Asset ID",urlPlaceholder:"https://... or @asset:id",browseAssets:"Browse Assets",playing:"Playing...",preview:"Preview",playbackSettings:"Playback Settings",trackType:"Track Type",defaultVolume:"Default Volume",loopAudio:"Loop Audio",fadeIn:"Fade In (s)",fadeOut:"Fade Out (s)",bgmConfigTitle:"BGM Configuration",bgmConfigSubtitle:"Playlist + trigger rules",bgmConfigDesc:"Applies to every play session of this world.",defaultPlaylist:"Default Playlist",addBgmFirst:"Add BGM tracks to the library first to create a playlist.",playMode:"Play Mode",autoPlay:"Auto-play",waitForFirstMessage:"Wait for first message",conditionalBGM:"Conditional BGM",addConditionalRule:"Add Conditional Rule",trackTypes:{bgm:"BGM",sfx:"SFX",ambient:"Ambient"},playModes:{loop:"Loop",shuffle:"Shuffle",sequential:"Sequential"},triggerTypes:{variable:"Variable condition",aiKeyword:"AI keyword",keyword:"Player keyword",turnCount:"Turn count",sessionStart:"Session start"},allConditionsMet:"ALL conditions met",anyConditionMet:"ANY condition met",selectTrack:"Select track...",when:"WHEN",play:"Play",priority:"Priority",onEnd:"On end",returnToDefault:"Return to default playlist",returnToPrevious:"Return to previous track",noConditionalRules:"No conditional BGM rules",noConditionalRulesDesc:"Add a rule to automatically switch music based on game state.",gapBetweenTracks:"Gap between tracks (s)",defineVariablesHint:"Define variables in the Variables section to add conditions.",triggerAiKeywordHint:"Trigger when AI response contains any of these words",triggerPlayerKeywordHint:"Trigger when player message contains any of these words",atTur
4n:"At turn",everyNTurns:"Every N turns",turnCountHint:'Set at least one. "At turn" fires once; "Every N turns" repeats.',sessionStartHint:"No additional configuration needed.",unnamed:"Unnamed",emptyNoTracks:"No tracks yet",emptySelectTrack:"Select a track to edit",stopPreviousBGM:"Stop previous BGM",keywordPlaceholder:"Type a keyword and press Enter",matchWholeWords:"Match whole words only",trackId:"Track ID",copyTrackId:"Copy ID",trackIdCopied:"Track ID copied",trackIdCopyFailed:"Copy failed. Select the ID and copy it manually.",trackIdHelp:"Use this ID in scripts and audio directives. It is different from the asset ID.",allowAiControl:"Allow AI control",allowAiControlHelp:"When off, AI cannot play, stop, or change this track. Scripts, behaviors, and playlists can still control it.",aiNoteLabel:"When to play",aiNoteSfxLabel:"Play once when this happens",aiNotePlaceholder:"e.g. lively and cheerful â festivals, markets, chasing around",aiPickTitle:"Let the AI play this track",aiPickHelp:"Write when it should play, and the AI switches to it when the story matches. Leave it empty and the track only follows the playlist and conditional rules.",aiPickSfxTitle:"Let the AI play this sound",aiPickSfxHelp:"Write what has to happen, and the AI plays it once when the story reaches that moment. Leave it empty and it only follows conditional rules.",aiNoteSfxPlaceholder:"e.g. someone draws a blade",aiPickOn:"On: the AI plays this when the story matches",aiPickOff:"Off until you write a cue",aiPickBadgeTitle:"The AI plays this when the story matches",musicRuleConflict:"When the AI wants to switch but a conditional rule is playing its own track",musicRuleConflictRules:"Rules first: the rule's track keeps playing, the AI waits this turn",musicRuleConflictAi:"AI first: switch to the AI's pick; rules stay out until it ends or the AI hands back",musicRuleAfter:"After an AI-picked track",musicRuleAfterLoop:"Keep looping until the AI switches or hands back to the playlist",musicRuleAfterOnce:"Play it once, then return to the default playlist",musicRuleDuck:"Dip the background music while an AI-picked sound plays, then restore it",atTurnPlaceholder:"e.g. 5",everyNTurnsPlaceholder:"e.g. 10",fallbackPlayTrack:"Play: {{name}}",previewFailed:"Couldn't play this track"},c={title:"Card settings",description:"Name, cover, announcements and the card's public page",importJson:"Import File",importJsonDesc:"Import a card you exported before (`.json`) or a character card (`.png` / `.json`). This replaces everything in this card.",chooseFile:"Choose File",confirmReplaceWorld:"This will replace the current world's contents (entries, variables, rules, components, etc.) with the imported JSON. The world ID, gallery, tags, and publish status will be kept. Save afterwards to apply the update. Continue?",importReplacedSaveReminder:"click Save to update the published world",coverImage:"Cover Image",coverImageDesc:"Two cover formats, each with its own image and crop. Keep faces and important details inside the preview.",changeCover:"Change Cover",uploadCover:"Upload Cover",fromAssets:"From Assets",imageFormats:"JPEG, PNG, GIF, or WebP",uploading:"Uploading...",change:"Change",galleryImages:"Gallery Images",galleryImagesDesc:"Up to 8 images showcasing your world. These appear on the public world page.",upload:"Upload",noGalleryImages:"No gallery images yet. Add images to showcase your world.",announcement:"Announcement",announcementPlaceholder:"Write an announcement...",markdownSupported:"Markdown supported",descriptionTitle:"Description",descriptionDesc:"Shown on the Discover card and the world detail page. Use this for lore, gameplay instructions, or credits.",descriptionPlaceholder:"Write a description...",approxTime:"Approx. Time",approxTimePlaceholder:"e.g., 2-3 hours, 30 min per session",tags:"Tags",searchOrAddTag:"Search or add a tag...",addTag:"Add",maxTagsError:"Maximum 7 tags allowed",tagExistsError:"Tag already exists",tagLengthError:"Tag must be 50 characters or less",maxGalleryError:"Maximum 8 gallery images allowed",saveWorldFirst:"Save the world first",saveWorldForAssets:"Save the world first to browse assets",saveWorldForCover:"Save the world first to add a cover",saveWorldForGallery:"Save the world first to add images",multiplayer:"Allow Multiplayer",language:"Language",languageDesc:"Affects language filtering in Discover and translation linking.",notSpecified:"Not specified",languageVariants:"Language Variants",loadingVariants:"Loading variants...",noVariants:"No linked variants yet. Link another world to enable the language picker.",addLanguageVersion:"Add Language Version",importLanguageVersion:"Import another language version",unlinkVariant:"Unlink variant",variantUnlinked:"Language variant unlinked",worlds:"worlds",selectLanguage:"Select language...",coverFromAssetFailed:"Couldn't set that as the cover",galleryAddFailed:"Couldn't add that image",imageRemoveFailed:"Couldn't remove the image",importCoverFailed:"Couldn't use the card image as the cover",continuity:"Smart tracking",continuityDesc:"After the AI writes each reply, a dedicated helper checks it once more: should a variable change, which song should play, which scene image should show. Much more accurate than leaving it to the storytelling AI. Off: only the storytelling AI changes them.",background:"Backgroun
4d",backgroundDesc:"A picture behind the chat. Text gets a dark layer over it so it stays readable.",worldTitle:"Card title",portraitUse:"Portrait artwork · recommended size above. Used for mobile cards, Library covers and portrait placements.",landscapeUse:"Landscape artwork · 16:9. Used for desktop Discover cards, opened Library details and wide Featured placements. Recommended size above.",reusePortrait:"Use portrait artwork and choose a landscape crop",landscapeNeeded:"Landscape artwork needed. Upload a wide image or approve a 16:9 crop of your portrait."},u={primaryBadge:"Main",setPrimary:"Set as primary",setPrimaryDraft:"Set as primary (publish first)",primaryExplainer:'A language can have several versions. The â
"Main" one is what people see when browsing; players can still switch to the others after opening the card.',newVariant:"New Variant",variantPrefix:"Variant",creating:"Creating...",saveFirst:"Save the world first to create variants",selectLanguage:"Select Language",selectLanguageForVariant:"Select language for new variant",rename:"Rename",enterToSave:"Enter âµ",delete:"Delete variant",confirmDelete:"Tap again to delete",changeLanguage:"Change Language",noLanguage:"Lang",skip:"Skip",changeLanguageFailed:"Couldn't change the language",renameFailed:"Couldn't rename this version",deleteFailed:"Couldn't delete this version",createFailed:"Couldn't create the version",setPrimaryFailed:"Couldn't set the primary version",languageVersions:"Language versions"},p={title:"Notify your players?",placeholder:"What changed? e.g. 'Added Chapter 3'",detailsPlaceholder:"Add details for players (optional)",majorUpdate:"Major update",skip:"Skip",notify:"Notify Players",sending:"Sending...",failed:"Could not save the update note. Your text is still here â please try again.",heldDescription:"These changes need review. Write a note for your players â it'll be posted when your update is approved and goes live.",heldNotify:"Save note for players"},m={menuItem:"Versions",title:"Version history",subtitle:"Update and Publish save changed content, cover and rating once. Ap
4proval marks the same version live. Keep up to {{automaticCap}} automatic records and {{cap}} named versions.",formTitle:"Save a named version",saveCurrent:"Save named version",saving:"Saving...",namePlaceholder:"Version name",noteOptional:"Add a note (optional)",capacity:"Named: {{used}} / {{cap}}",dirtyHint:"Unsaved edits will be saved first.",cleanHint:"Captures the current saved content, cover and rating.",savedListTitle:"Named versions ({{count}})",emptyTitle:"No versions yet",empty:"Publish or update to save a version automatically, or create a named version above.",safetySnapshotName:'Before restoring "{{name}}"',restore:"Restore to draft",delete:"Delete",needsServerSave:"Save your project first",saveFailed:"Failed to save version",deleteFailed:"Failed to delete version",restoreFailed:"Failed to restore version",atCapTitle:"Replace oldest version?",atCapBody:`You've reached the {{cap}} version limit. Saving will permanently delete "{{oldestName}}" (oldest). Continue?`,atCapConfirm:"Replace oldest",atCapCancel:"Cancel",restoreConfirmTitle:"Restore this version to your draft?",restoreConfirmBody:"This replaces your working content, cover and rating. Your public version stays unchanged; publish the restored draft when ready. Listing details such as the title and tags stay as they are.",restoreConfirmDirtyExtra:"Unsaved edits will be saved first so they're captured in the safety snapshot.",safetyToggleLabel:"Save current state as a safety snapshot first",safetyToggleHint:"Keeps a backup in automatic history (up to {{automaticCap}} records). Named versions are not replaced.",restoreConfirm:"Restore draft",restoreCancel:"Cancel",deleteConfirmTitle:"Delete this version?",deleteConfirmBody:'"{{name}}" will be permanently removed.',deleteConfirm:"Delete",deleteCancel:"Cancel",saved:"Saved",automaticTitle:"Automatic history ({{count}})",makeLive:"Make live",makeLiveTitle:"Switch the live version?",makeLiveBody:"Players will receive this previously published content, cover and rating. Your current working draft is preserved. Listing details such as the title and tags stay as they are.",currentLive:"Currently live",liveChanged:"Live version switched. Your working draft is preserved; publish it when you want those edits to go live.",makeLiveFailed:"Could not switch the live version. Refresh the history and try again.",saveBeforeSwitchFailed:"Save your latest edits before switching the live version.",withdrawBeforeSwitch:"Withdraw the pending review before switching the live version.",loadFailed:"Could not load version history.",retry:"Try again",source:{publish:"Saved version",live:"Saved version",backup:"Backup before restore",incoming:"Before applying changes"},previousPublished:"Previously published",notPublished:"Not published",live:"Currently live",previouslyLive:"Previously published",savedDraft:"Not published",legacy:"Older version · content only",automaticName:"Saved version · {{date}}",makeLiveSuccess:"Live version switched; your working draft was kept",needsReview:"This version needs review. Restore it to your draft and publish it normally.",backupName:"Backup before restore · {{date}}",restoredName:"Restored version · {{date}}",earlierName:"Earlier version · {{date}}"},g={title:"Assets",searchPlaceholder:"Search...",uploadButton:"Upload",uploadingButton:"Uploading...",uploadingCount:"Uploading {{count}}",noAssets:"No assets yet.",noMatching:"No matching assets.",dropToUpload:"Drop a file to upload",dropHint:"The uploaded asset will be selected automatically.",assetsTitle:"Assets",noMatchingAssets:"No matching assets.",wrongFileType:"This file type can't be used here.",linkFailed:"Couldn't add this asset to the card. Try again.",etaSeconds:"~{{n}}s left",etaMinutes:"~{{n}}m left",missingFile:"File missing"},y={conditions:"Conditions",addCondition:"+ Add",noConditions:"Add at least one condition",contains:"contains",trueValue:"true",falseValue:"false",jsonPlaceholder:'{"key": "value"} or []',containsPlaceholder:"member value",newVariable:"ï¼ New variableâ¦",newVariableName:"Variable name",createVariable:"Create and use",cancel:"Cancel",jumpToVariable:"Go to this variable"},w={title:"Bundles",description:"Browse community-published bundles and install them directly into your world â like downloading mods",tabHub:"Hub",tabLibrary:"My Library",tabInstalled:"Installed",importFromFile:"Import from file",exportTitle:"Export Bundle",install:"Install",searchHub:"Search community bundles...",searchLibrary:"Search my bundles...",noHubBundles:"No public bundles in the Hub yet",noHubMatches:"No bundles match your search",noLibraryBundles:"Your library is empty",noLibraryHint:'Use "Export Bundle" in any world to save reusable pieces here',noLibraryMatches:"No bundles match your search",installFailed:"Install failed",unrecognized:"Unrecognized bundle format",manageBundles:"Manage bundles",manageTitle:"Manage installed bundles",manageDescription:"Bundles imported into this world. Each has
4its own color in the Lorebook and Custom UI.",manageEmpty:"No bundles installed yet",manageEmptyHint:"Install a bundle from the Hub or your Library to see it here.",modifiedBadge:"Edited",removeBundle:"Remove bundle",deleteBundleTitle:"Delete bundle?",deleteBundleConfirm:`This removes everything "{{name}}" added to this world (entries, variables, rules, UI). This can't be undone.`,deleteModifiedTitle:"You've edited this bundle",deleteModifiedConfirm:'You changed "{{name}}" after importing it. Deleting will permanently remove your edits too. Are you sure?',deleteAnyway:"Delete anyway",deleteAction:"Delete",cancel:"Cancel",close:"Close",bundleRemoved:'Removed "{{name}}"',summaryEntries_one:"{{count}} entry",summaryEntries:"{{count}} entries",summaryVars_one:"{{count}} variable",summaryVars:"{{count}} variables",summaryRules_one:"{{count}} rule",summaryRules:"{{count}} rules",summaryBehaviors_one:"{{count}} behavior",summaryBehaviors:"{{count}} behaviors",summaryAudio:"{{count}} audio",summaryUI:"UI",summaryEmpty:"Empty"},v={title:"Behaviors",description:"Rules that react to game events.",addBehavior:"Add Behavior",searchPlaceholder:"Search behaviors...",noBehaviors:"No behaviors defined yet",noBehaviorsDesc:'Behaviors are automatic "if this, then that" rules â notify when health is low, escalate tension every 5 turns, or trigger combat on keywords.',learnMore:"Creator Guide â",noBehaviorsMatch:'No behaviors match "{{query}}"',back:"Back",editBehavior:"Edit Behavior",delete:"Delete",nameLabel:"Name",namePlaceholder:"e.g. Low HP Warning",descriptionLabel:"Description",descriptionPlaceholder:"What this behavior does...",whenLabel:"WHEN",eventHappens:"this event happens:",selectEvent:"Select event...",ifLabel:"IF",theseConditions:"these conditions are met:",doLabel:"DO",theseActions:"perform these actions:",addAction:"Add action",selectAction:"Select action...",limitsPriority:"Limits & Priority",priority:"Priority",priorityHint:"When several behaviors fire in the same turn, higher numbers go first. Usually no need to change it.",cooldown:"Cooldown (turns)",cooldownHint:"Minimum turns between firings",cooldownPlaceholder:"No cooldown",maxFireCount:"Max fires",maxFireCountPlaceholder:"Unlimited",maxFireCountHint:"Total number of times this behavior can fire",enabled:"Enabled",createFirst:"Create your first behavior",onlyIf:"ONLY IF",stopWhen:"STOP WHEN",stopWhenHint:"Optional",stopConditionsLabel:"Stop conditions",stopWhenNote:'While any stop condition is met, this behavior is paused. To stop after a fixed number of repeats, use "Max fires" under Limits & Priority.',optional:"optional",allMustBeTrue:"ALL must be true",anyCanBeTrue:"ANY can be true",advancedSettings:"Advanced settings",selectToEdit:"Select a behavior to edit",noActionsYet:"No actions yet.",customEffect:"Custom effect",selectVariable:"Select variable...",createVariable:'Create "{{name}}"',operandConstant:"Constant",operandVariable:"Variable",selectEntry:"Select entry...",selectTrack:"Select track...",selectBehavior:"Select behavior...",noAudioTracks:"No audio tracks defined",any:"Any",whenPresets:{everyTurn:"Every turn",everyTurnDesc:"After every player-AI exchange",playerKeyword:"Player says keyword",playerKeywordDesc:"Player message contains a word",aiKeyword:"AI says keyword",aiKeywordDesc:"AI response contains a word",sessionStart:"Session starts",sessionStartDesc:"When a new game begins",stateChanged:"Variable changes",stateChangedDesc:"Fires when a variable changes (optionally filter by variable)",varCrossed:"Variable crosses threshold",varCrossedDesc:"A number crosses a boundary",actionFired:"The player presses a button",actionFiredDesc:"A custom action is triggered",everyNTurns:"Every N turns",everyNTurnsDesc:"Fires at regular intervals",timerFired:"Timer finishes",timerFiredDesc:"A countdown reaches zero",everyNSecondsDesc:"While the game is open",everyNSeconds:"Every N seconds"},whenFields:{keyword:"Keyword",variable:"Variable",direction:"Direction",dropsBelow:"Drops below",risesAbove:"Rises above",value:"Value",actionId:"Button",everyNTurns:"Every N turns",timerId:"Timer ID",everyNSeconds:"Every ⦠seconds"},whenCategories:{messages:"Messages",gameState:"Game State",timing:"Timing",timers:"Timers"},doPresets:{changeVar:"Change variable",tellAi:"Tell the AI",stopTellAi:"Stop telling the AI",enableEntry:"Enable lore entry",disableEntry:"Disable lore entry",askAi:"Ask AI to respond",playMusic:"Play music",playSfx:"Play sound effect",stopAudio:"Stop audio",notify:"Show notification",startTimer:"Start timer",cancelTimer:"Cancel timer",toggleBehavior:"Enable/disable behavior",toggleVariable:"Enable/disable variable",toggleScenario:"Enable/disable scenario",moment:"Unlock a moment"}
4,doFields:{variable:"Variable to change",scenario:"Scenario",operation:"Operation",value:"Value",instructionId:"Instruction ID",instructionForAi:"Instruction for the AI",whichInstruction:"Which instruction to remove",entry:"Entry",contextForAi:"Context for the AI",track:"Track",message:"Message",displayName:"Display name",seconds:"Seconds",behavior:"Behavior",state:"State",enable:"Enable",disable:"Disable",notifyStyle:"Style",notifyStyleInfo:"Info",notifyStyleSuccess:"Success",notifyStyleWarning:"Warning",notifyStyleError:"Error",momentCollect:"Collected into (a list)",momentImage:"Picture (link)",momentTitlePlaceholder:"First meeting",momentTitle:"Title"},doCategories:{game:"Game",aiStory:"AI & Story",audio:"Audio",player:"Player",timers:"Timers",advanced:"Advanced"},effectOps:{set:"Set (=)",add:"Add (+)",subtract:"Subtract (-)",multiply:"Multiply (x)",toggle:"Toggle",append:"Append"},randomPick:{addAction:"Random pick (fair rotation)",title:"Random rotation",sentPickFrom:"Each trigger, randomly pick one from these:",sentPickFromVar:"Each trigger, randomly pick one from the list in",candFirst:"type a name, press Enter",sentInto:"Store the pick into â",intoPlaceholder:"e.g. today's guest â type to create",sentCooldownA:"Anyone picked in the last",sentCooldownB:"picks won't be chosen again",cooldownTitle:"Avoid repeats",cooldownPre:"The last",cooldownPost:"picks won't be chosen again",cooldownHelpOff:'0 = repeats allowed (the same one can come up twice in a row). A "pick" = one time this behavior fires.',cooldownHelpOn:`A "pick" = one time this behavior fires. Recent picks are auto-tracked so they can't repeat.`,advanced:"Advanced (weights / use a variable / when exhausted)",advUseVar:"Use an array variable as the candidate pool instead of a fixed list",weightsLabel:"Weights",weightsEqual:"Equal",weightsCustom:"Custom",weightsPlaceholder:"e.g. 3, 1, 1 â order matches candidates",weightsHelp:"One number per candidate, comma-separated, in the same order. Bigger = more often (3,1,1 means the first is 3à as likely as each of the others). It's relative, not a percentage.",weightsMismatch:"Weight count must match candidate count, or weights are ignored and everyone is equal.",exhaustedLabel:"When everyone is on cooldown",exhaustedFull:"Fall back to the full set",exhaustedKeep:"Keep the current value",historyBase:"rotation",historySuffix:"recent"},valueMode:{const:"Constant",var:"Variable",random:"Random"},random:{range:"Number in a range",list:"Pick from a list",dice:"Dice roll",from:"from",to:"to",roll:"Roll it",rollEmpty:"(no candidates)"},chance:"Chance to fire (%)",chanceHint:"Only fire this behavior this % of the time it otherwise would. Blank = always.",worldbookLabel:"Scenario",worldbookCore:"Shared (every scenario)",worldbookHint:"Which scenario this behavior belongs to. Shared ones can fire at any time; a scenario's own fire only while that scenario is open.",onlyIfEmptyHint:"optional -- leave empty for unconditional trigger",customEvent:"Custom: {{event}}",eventBadge:{turn:"TURN",user:"MSG",ai:"AI",start:"START",state:"STATE",threshold:"THRESH",action:"ACT",event:"EVT"}},b={exportBundle:"Export Bundle",importBundle:"Import Bundle",import:"Import",namePlaceholder:"Bundle name...",descriptionPlaceholder:"Description (optional)...",tagsPlaceholder:"Tags (comma-separated)...",itemsSelected:"{{count}} item selected",itemsSelected_other:"{{count}} items selected",saving:"Saving...",saveToLibrary:"Save to Library",bundleContents:"Bundle Contents",willBeAdded:"Will be added",variableConflicts:"Variable Conflicts",cancel:"Cancel",importing:"Importing...",fromFile:"From File",fromLibrary:"From Library",fromHub:"From Hub",searchHub:"Search Hub bundles...",popular:"Popular",newest:"Newest",noHubBundles:"No public bundles in the Hub yet",noHubMatches:"No bundles match your search",processing:"Processing...",dropToImport:"Drop file to import",dropOrBrowse:"Drop a .json file here or click to browse",supportedFormats:"Supports Yumina worlds, character cards, and bundles",loading:"Loading...",noBundlesInLibrary:"No bundles in your library",selectAll:"Select all",deselectAll:"Deselect all",messageRendererOverwrite:"Will replace your current message renderer",messageRendererNew:"Will set as your message renderer",unrecognizedFileFormat:"Unrecognized file format",failedParseFile:"Couldn't parse file â check it's valid JSON",failedLoadBundleContent:"Couldn't load bundle content",unrecognizedBundleFormat:"Unrecognized bundle format",failedImportBundle:"Couldn't import bundle"},f=JSON.parse(`{"outsideAi":{"menu":"Let an outside AI work on this card","title":"Let an outside AI work on this card","lead":"Give Claude Code, Codex or Cursor a token and it can read, edit and playtest this card with the same tools the creative assistant uses. Whatever it changes lights up here as it happens.","claude":"Claude Code: run in a terminal","other":"Other tools: the MCP address (HTTP), with the Authorization header","token":"Token (shown only once)","make":"Make a token","used":"Last used: {{when}}","unused":"Not used yet","revoke":"Revoke","copy":"Copy","changed":"{{actor}} changed · {{what}}"},"connectAi":{"costNote":"Playtests and images cost mushies as usual. A card is saved before an AI changes it â undo in Change History.","tokenExpires":"Expires {{date}}","title":"Connect your AI","menu":"Connect your AI","copy":"Copy","apps":{"claude":"Claude","chatgpt":"ChatGPT / Codex","cursor":"Cursor","claudeCode":"Claude Code","codexCli":"Codex CLI"},"steps":{"claude":{"1":"Open Connectors in Claude: Customize on the left in the desktop app, Settings on the web.","2":"Click Add â Add custom connector and name it Yumina.","3":"Paste this address, click Continue, then Add on the next page:","4":"Click Connect, then Allow on the Yumina page."},"chatgpt":{"1":"Settings â Plugins â Add (top right) â Add MCP server.","2":"Name it yumina and pick Streamable HTTP.","3":"Paste this URL and click Save:","4":"Sign in to Yumina and click Allow."}
4,"cursor":{"1":"Click this, or add this address in Cursor Settings â MCP:","2":"Sign in to Yumina and click Allow."},"claudeCode":{"1":"Run this in a terminal:","2":"Open Claude Code, type /mcp, pick yumina â Authenticate, then click Allow in the browser."},"codexCli":{"1":"Run this in a terminal, then click Allow in the browser:"}},"cursorButton":"Add to Cursor","connectedTitle":"Connected AIs","connectedNone":"None yet","lastUsed":"Last used {{when}}","disconnect":"Disconnect","tokenToggle":"Can't sign in? Make a token for this card","tokenAddress":"Address","tokenHeader":"Header (shown once)","tokenMake":"Make token","unused":"Not used yet","revoke":"Revoke","try":{"title":"Send it a message","where":{"claude":"In Claude, start a new chat and send:","chatgpt":"In ChatGPT or Codex, start a new chat and send:","cursor":"In Cursor, open the AI chat (Ctrl+L / âL) and send:","claudeCode":"Run claude in a terminal and send:","codexCli":"Run codex in a terminal and send:"},"allow":{"claude":"When it asks, click Always allow.","chatgpt":"When it asks, click Allow.","cursor":"When it asks, click Run.","claudeCode":"When it asks to use the yumina tools, choose Yes.","codexCli":"When it asks to use the yumina tools, allow it."},"notFound":{"claude":"No Yumina? Click + at the bottom left of the message box â Connectors, switch Yumina on, and resend.","chatgpt":"No Yumina? Check you clicked Allow in step 4, then resend in a new chat.","cursor":"No yumina? In Cursor Settings â MCP, check it has a green dot; if not, click it to sign in again.","claudeCode":"No yumina? Type /mcp, pick yumina, sign in again, and resend.","codexCli":"No yumina? Quit codex, run codex mcp login yumina, and resend."},"messageCard":"Use Yumina to open my card \\"{{card}}\\" and tell me what's in it right now.","messageList":"Use Yumina to list my cards.","waiting":"Waiting for the first messageâ¦","heard":"{{name}} is connected. Its changes show up live in the editor."},"switch":{"toggle":"Switch Yumina account","step1":"Disconnect it under Connected AIs above, then sign out of Yumina in your browser and sign in to the other account.","apps":{"claude":"In Claude's Connectors, open Yumina â Disconnect, then Connect and click Allow.","chatgpt":"Settings â Plugins: remove yumina, then add it again with the steps above.","cursor":"Cursor Settings â MCP: remove yumina, then add it again with the steps above.","claudeCode":"Type /mcp, pick yumina â Re-authenticate (or Authenticate), then click Allow in the browser.","codexCli":"Run this in a terminal, then click Allow in the browser:"}}},"changeLog":{"close":"Close","title":"Change History","empty":"Only the assistant's edits are recorded here. Your own edits live in Version history.","restorePointCount_one":"{{count}} restore point","restorePointCount":"{{count}} restore points","currentVersion":"Current version","now":"now","expand":"View changes","restore":"Restore to here","delete":"Delete","clearAll":"Clear all","kind":{"entry":"entry","variable":"variable","rule":"rule","reaction":"behavior","audio":"audio","customUI":"UI file","meta":"card setting"},"opAdded":"Added {{kind}} \\"{{name}}\\"","opRemoved":"Removed {{kind}} \\"{{name}}\\"","opModified":"Changed {{kind}} \\"{{name}}\\"","restoreConfirmTitle":"Restore to \\"{{time}}\\"","consequenceIntro":"Compared to now, your card will change:","consequenceEmpty":"This version matches the current content â restoring changes nothing.","autoBackupNote":"The current version is auto-backed-up, so you can undo this.","unsavedWarning":"You have unsaved edits; they'll be saved before restoring.","confirmRestore":"Restore","cancel":"Cancel","deleteConfirmTitle":"Delete this restore point?","deleteConfirmBody":"This only removes the restore point; your current card is untouched.","clearAllConfirmTitle":"Clear all restore points?","clearAllConfirmBody_one":"Deletes {{count}} restore point. Your current card is untouched. This can't be undone.","clearAllConfirmBody":"Deletes all {{count}} restore points. Your current card is untouched. This can't be und
4one.","deleteFailed":"Delete failed","loadFailed":"Failed to load change history","noChanges":"No differences from the previous version.","backupLabel":"Auto-backup before a restore","openVersionHistory":"Open version history"},"backToEditor":"Back to Editor","edit":"Edit","play":"Play","layoutPresets":"Layout Presets","addPanel":"Add Panel","moreActions":"More actions","openMarketplace":"Browse community bundles","importBundle":"Import Bundle","exportBundle":"Export Bundle","undo":"Undo (Ctrl+Z)","redo":"Redo (Ctrl+Y)","versionHistory":"Version History","noSnapshots":"No snapshots yet. Snapshots are created automatically when the AI agent makes changes.","restore":"Restore","unsaved":"Unsaved","save":"Save","variant":"Variant","mobile":{"singleWorkspace":"Mobile agent workspace","splitWorkspace":"Mobile split workspace","workspacePane":"Workspace","topPane":"Top pane","bottomPane":"Bottom pane","switchPanel":"Switch","focusPane":"Focus pane","backToSplit":"Back to split","choosePanel":"Choose panel","quickActions":"Quick","testingGroup":"Playtest","singleWorkspaceAction":"Single workspace","splitWorkspaceAction":"Split workspace","openSplit":"Open split","reviewMode":"Review change","changedVersion":"Changed","originalVersion":"Original","addedText":"Added","deletedText":"Deleted","backToAgent":"Back to Agent","resetSplit":"Reset split","resizeHandle":"Resize Studio split","desktopOnly":"Needs a bigger screen","tabAssistant":"Assistant","tabOpening":"Opening","tabLorebook":"Lore","tabPlaytest":"Playtest","tabMore":"More"},"groups":{"story":"Story","display":"Display","others":"Others","creation":"AI Tools"},"panels":{"firstMessage":"First Message","lorebook":"Lorebook","worldbooks":"Scenarios","variables":"Variables","behaviors":"Behaviors","frontEndCode":"Front End Code","audio":"Audio","assets":"Assets","overview":"Card settings","previewControls":"Preview Controls","canvas":"Interface preview","aiAssistant":"Creation assistant","playtest":"Playtest","marketplace":"Marketplace","sceneImages":"Scene Images","blueprint":"Canvas","modules":"Scenarios","interfaceCode":"Interface code & bindings","aiGeneration":"AI Generation","packs":"Mechanic packs","backgrounds":"Background"},"layouts":{"writing":"Writing","uiDesign":"UI Design","playTest":"Playtest","blueprint":"Canvas"},"aiChat":{"imageProposal":{"title":"The assistant wants to generate an image","promptLabel":"Description (editable)","aspect":"Aspect","count":"Images","estimate":"About {{amount}} mushies","estimateNote":"Charged on actual usage once delivered; nothing is charged if no image arrives.","price":"{{amount}} mushies","customNoteTags":"The prompt goes to the base model exactly as written (Danbooru tags); nothing rewrites it. This price is what is charged, and a failed image is refunded.","customNoteProse":"The prompt goes to the base model exactly as written (English prose); nothing rewrites it. This price is what is charged, and a failed image is refunded.","confirm":"Generate","decline":"No thanks","generating":"Drawing, about 30 seconds","generatingDetail":"Waiting {{seconds}}s. The image is saved to this card's bound asset folder.","done":"Generated ({{count}})","charged":"Charged {{amount}} mushies; saved to your asset library.","savedNote":"Saved to your asset library.","failed":"Generation failed","failedDetail":"This one did not come out ({{code}}); the charge was refunded.","declined":"Skipped, nothing generated.","stillGenerating":"Still drawing","stillGeneratingDetail":"Taking longer than usual; it will appear in the asset library when done."},"creditPause":{"retryStep":"Retry step","paused":"Not enough credits · progress saved","saved":"Not enough credits · result saved","ready":"Ready to continue","billing":"Result saved · billing pending","unavailable":"Paused · progress saved","detail":"Add credits to continue from here.","savedDetail":"The generated result is saved. Settle this step to continue.","readyDetail":"Your progress is saved. Continue when you're ready.","billingDetail":"Usage details are unavailable. Your result is saved; adding credits will not resolve this.","budgetDetail":"The next step's budget is unavailable. Refresh to check again.","available":"Available balance","budget":"Next step budget","actual":"This step's actual cost","settled":"Already paid","amount":"{{amount}} Mushies","estimateNote":"The next step has not started. Estimates do not deduct credits.","settleNote":"Not yet charged. Continuing will deduct {{amount}} Mushies.","settledNote":"This step is already paid. Continuing will reuse the saved result.","topUp":"Add credits","resume":"C
4ontinue","settleResume":"Settle and continue","resuming":"Continuingâ¦","refresh":"Refresh","shortfall":"{{amount}} Mushies short","errorStale":"The world has changed. Start a new request to avoid overwriting your edits.","restartHere":"Start again from here","restartMessage":"Continue from where you stopped, working from the card as it is now.","errorActive":"This task is already running. Please wait for its status to update.","errorFailed":"Could not resume the task. Your saved progress is still available; please retry.","errorBillingMissing":"Usage details are unavailable. Your result is saved and needs billing reconciliation.","errorBalance":"Couldn't refresh the balance. Please try again.","errorSave":"Couldn't save your current edits. Please save them before continuing.","restart":"Generation paused for an update","restartDetail":"Your saved progress is preserved. Select Continue to resume.","interrupted":"Generation interrupted · ready to continue","interruptedDetail":"Your saved progress is preserved. Select Continue to resume.","restartBudgetDetail":"An update interrupted generation. Your saved progress is preserved. Add credits to continue.","restartSavedDetail":"The result from before the update is saved. Settle this step to continue.","retryNote":"This step did not finish and will be generated again. Completed steps will not be repeated.","retryFailed":"Could not continue","retryResume":"Retry continuation","resumingDetail":"Restoring your task. Please wait.","balanceUnknown":"Your balance is unavailable. Refresh the status."},"resizeInput":"Resize input","conversations":"Conversations","newConversation":"New conversation","clearChat":"Clear chat","messages_one":"{{count}} message","messages":"{{count}} messages","startFresh":"Start fresh","contextFresh":"","contextComfortable":"","contextFilling":"Context is filling up. Starting a fresh conversation keeps the agent sharper.","contextTight":"Context is nearly full. Older turns will be summarized on the next send â consider starting fresh.","contextCompacting":"Context is over budget. Older turns are being summarized; start fresh to avoid losing detail.","emptyDesc":"Say what you want â it edits this card directly.","thinking":"Thinkingâ¦","thinkingStep":"Step {{step}}","recovering":"Still working","recoveringDetail":"Connection dropped. The assistant is still editing in the background â the result appears here when it finishes.","disconnectedTitle":"Connection dropped","disconnectedBody":"The assistant may have finished this in the background. Reconnect before running it again.","disconnectedDeadTitle":"That task did not finish","disconnectedDeadBody":"There is no result on the server either, and the card was not changed. Safe to send again.","reconnect":"Reconnect","resend":"Resend","resendCharges":"Resending charges again","stop":"Stop","waitingApproval":"Waiting for your approval...","cancel":"Cancel","placeholderReview":"Review the proposal above...","placeholderWorking":"Workingâ¦","placeholderDefault":"What should change?","loadConvFailed":"Couldn't load the conversation","attachFile":"Attach file (max 5)","undo":"Undo","regenerate":"Regenerate","undoConfirm":"Confirm undo","undoCancel":"Cancel","createConvFailed":"Couldn't create the conversation","deleteConvFailed":"Couldn't delete the conversation","deleteConv":"Delete conversation","deleteConvConfirm":"Delete?","attachmentUploadFailed":"Sent without the images","undoRollbackFailed":"Undid the messages, not the card changes","imageBatch":{"title":"Generate images","declined":"Generation skipped","selectAll":"Select all · {{count}} selected","library":"Save to asset library","portrait":"Character portrait","component":"UI image · {{key}}","existing":"Has an image · skipped","bindingNote":"Image saved. Retrying the assignment will not generate or charge for another image.","model":"Image model","estimateUnavailable":"Estimate unavailable","billingNote":"Each selected item generates one image. Charged by actual image usage; no extra assistant turns.","confirm":"Generate {{count}} images","background":"Generating in the background. You can leave and return.","pausedNote":"Paused for insufficient Mushies. Completed images are saved.","resume":"C
4ontinue remaining images","retryBinding":"Retry image assignment","retry":"Retry {{count}} failed items","syncFailed":"Could not refresh progress. The saved task may still be running.","requestFailed":"Could not submit. Refresh the saved task and try again.","refresh":"Refresh status","phase":{"running":"Generating images","paused":"Generation paused","completed":"Images ready","partial":"Some images need attention","failed":"Generation failed"},"item":{"pending":"Pending","queued":"Queued","running":"Generating","awaiting_credits":"Paused","succeeded":"Ready","failed":"Failed","skipped":"Skipped","binding_failed":"Assignment failed"},"pausedStorageNote":"Storage is full. Free space in Assets to continue.","pausedUnavailableNote":"Generation is temporarily unavailable. Completed images are saved.","pausedGenericNote":"Temporarily paused. Completed images are saved. Try continuing later."},"backgroundCompleted":"The assistant is done.","backgroundNeedsAction":"The assistant is waiting for you to confirm.","backgroundInterrupted":"The assistant stopped.","backgroundView":"View","otherWorldWorking":"The assistant is still working on another card. It's free here once that's done.","otherWorldWorkingNamed":"The assistant is still working on {{name}}. It's free here once that's done.","backToWorld":"Go back to that card","backToWorldNamed":"Back to {{name}}","suggestLore":"Write this card for me, name and blurb included","suggestVariables":"Add an Affection number and show it on the player's screen","suggestBehaviors":"Make the opening more vivid and end it on something the player can answer","suggestPolish":"Add two side characters, each with their own agenda","suggestTranslate":"Translate this whole card into English, name and description too","suggestReview":"Look this card over and fix the three things that most need it","sourceUploadFailed":"The file could not be stored with the card","statusUnavailable":"The assistant cannot read its status right now. Your card is untouched.","saveBeforeSendFailed":"Your latest changes couldn't be saved, so the message wasn't sent. Save or resolve the conflict, then try again.","proposalRejectedReply":"Understood. Let me know how you'd like to proceed.","agentError":{"generic":"The assistant hit an error. Please retry.","stalled":"The assistant stopped responding for 3 minutes, so the task ended. Please retry.","timedOut":"The task ran for more than 30 minutes and was stopped. Try smaller steps.","outputBudget":"The model ran out of output space before finishing its changes several times. Try smaller steps or another model.","provider":"The AI model service returned an error. Retry or pick another model.","serverRestart":"The server restarted during the task. Please retry.","superseded":"This task was replaced by a newer request.","stopped":"Stopped.","noCredits":"Not enough mushrooms to continue. Top up, then retry."},"turnEstimate_one":"From ~{{count}} mushie","turnEstimate_other":"From ~{{count}} mushies","digest":{"read":"Reading â{{source}}â · {{done}}/{{total}} parts","merge":"Building the reference · {{done}}/{{total}}","check":"Checking it against the book · {{done}}/{{total}}","save":"Saving the reference to this card"},"turnEstimateCold":"the first message in an hour costs more","turnCost_one":"This turn: {{count}} mushie","turnCost_other":"This turn: {{count}} mushies","generatingTool":"writing: {{tool}}","mode":{"label":"Assistant mode","advise":"Plan","build":"Build","placeholder":"What kind of game do you want to make?","buildFromBrief":"Build it","buildFromBriefMessage":"Build the first version from the creative brief.","briefSaved":"Plan ready","reviewBuild":"Review build plan","buildTitle":"Build the first version?","keepPlanning":"Keep brainstorming","startBuild":"Start building"},"send":"Send"},"sidebar":{"title":"Sidebar","previewControls":"Preview Controls","previewControlsDesc":"Overrides change Studio preview only and never edit saved world values.","variables":"Variables","variablesDesc":"Show preview variable values and controls.","overridesOnly":"Overrides Only","overridesOnlyDesc":"Filter to variables changed from defaults.","worldSummary":"World Summary","worldSummaryDesc":"Show key counts and renderer status.","componentSummary":"Component Summary","componentSummaryDesc":"Show visible component snapshots.","lorebook":"Lorebook","rules":"Behaviors","widgets":"Widgets","customUi":"Player interface","renderer":"Renderer","custom"
4:"Custom","default":"Default","componentSnapshot":"Component Snapshot","noVisibleComponents":"No visible components configured.","customComponent":"custom-component","shown":"{{count}} shown","resetAll":"Reset All","noOverrides":"No overrides yet. Change a value to pin it.","noVariables":"No variables available in this world.","override":"override","defaultBadge":"default","reset":"Reset","defaultValue":"Default: {{value}}","previewValue":"Preview: {{value}}"},"playtest":{"label":"Playtest","untitled":"Untitled","restart":"Restart playtest","bootError":"Failed to start playtest session","retry":"Retry","viewModeGroup":"Preview device","viewDesktop":"Desktop preview","viewMobile":"Mobile preview","staleHint":"Settings changed â restart the test to apply them","staleRestart":"Restart"},"debug":{"title":"Debug Inspector","input":"Input","thinking":"Thinking","streaming":"streaming...","noReasoning":"no reasoning tokens","noReasoningDetail":"Model did not emit reasoning tokens. Set reasoning effort to \\"medium\\" or \\"high\\" in settings, or the model may not support thinking.","rawResponse":"Raw Response"},"codeView":{"components":"Components","addComponent":"Add Component","addFile":"Add File","deleteComponent":"Delete Component","deleteRenderer":"Delete Message Renderer","confirmDelete":"Are you sure you want to delete this? This can be undone with Ctrl+Z.","noComponents":"No custom components yet","selectOrCreate":"Select a component or create one","ok":"OK","error":"Error","importFile":"Import File","fileImported":"File imported","failedReadFile":"Failed to read file","newFilePrompt":"File name (e.g. stat-bar.tsx, three-lib.js):","renamePrompt":"New file name:","renameComponent":"Rename File","fileBadExtension":"Use .tsx, .ts, .jsx or .js","fileBadPath":"A file name cannot start with / or contain ..","fileExists":"File already exists"},"canvas":{"desktop":"Desktop","tablet":"Tablet","mobile":"Mobile","emptyState":"Add a greeting entry or custom component to preview your world.","aiSkipped":"AI skipped in preview. The card may use its default values.","noComponent":"The frontend produced nothing to render","noComponentHint":"Most likely the entry file is missing an export default. Open Frontend Code and check.","noComponentFiles":"These files failed to compile:"},"proposal":{"proposedChange":"{{count}} proposed change","proposedChanges":"{{count}} proposed changes","applied":"Applied","error":"{{count}} error","errors":"{{count}} errors","rejected":"Rejected","approve":"Approve","reject":"Reject","inspect":"Compare","compareTitle":"Compare change","added":"Added","deleted":"Deleted","compareLoading":"Loading original version...","compareUsingSnapshot":"Original version loaded","compareSnapshotMissing":"Original snapshot unavailable; showing current draft fallback","compareSnapshotError":"Could not load original snapshot","compareUnavailable":"No change data available","closeCompare":"Close compare"},"entity":{"invalidArgs":"{{name}} didn't go through","collapse":"Collapse","viewFull":"View full content","create":"Create","update":"Update","delete":"Delete","write":"Write","read":"Read","compile":"Compile","load":"Load","link":"Link","install":"Install","audioVerb":"Audio","call":"Call","entry":"Entry","variable":"Variable","behavior":"Behavior","rule":"Rule","customComponent":"Custom Component","messageRenderer":"Message Renderer","audio":"Audio","asset":"Asset","template":"Template","settings":"Settings","entityCat":"Entity","tsx":"TSX","skill":"Skill","gameData":"Game data","sceneImage":"Scene image","behaviorCounts":"{{conditions}} conditions, {{effects}} effects","behaviorWhen":"when {{when}} · {{effects}} effects","everyTurn":"each turn","knobGroups":"Knobs · {{groups}} groups, {{knobs}} knobs","entityCount_one":"{{count}} item","entityCount_other":"{{count}} items","willDelete":"will be deleted","itemCount_one":"{{count}} item","itemCount_other":"{{count}} items","edit":"Edit","customUI":"Custom UI","interfaceDoc":"Player interface","uiDocOps_one":"{{count}} change","uiDocOps":"{{count}} changes","uiCode":"Interface code","uiOp":{"addPart":"New {{name}}","addPartUnnamed":"New part","updatePart":"Changed {{name}}","updatePartUnnamed":"Changed a part","removePart":"Removed {{name}}","removePartUnnamed":"Removed a part","movePart":"Moved {{name}} to another page","movePartUnnamed":"Moved a part to another page","reorder":"Brought {{name}} forward or back","reorderUnnamed":"Changed what sits on top","applyLook":"New look for {{name}}","applyLookUnnamed":"New look for a part","addPage":"New page","updatePage":"Page settings","renamePage":"Renamed a page","removePage":"Removed a page","setEntryPage":"Changed the first page","setTheme":"Colours and fonts","detachToCode":"Handed the screen over to code","other":"Other change"},"change":{"create":"New {{kind}} â{{name}}â","createUnnamed":"New {{kind}}","update":"Changed {{kind}} â{{name}}â","updateUnnamed":"Changed a {{kind}}","delete":"Deleted {{kind}} â{{name}}â","deleteUnnamed":"Deleted a {{kind}}","settings":"Changed the settings"},"kind":{"entry":"entry","variable":"variable","rule":"rule","behavior":"behavior","customUI":"interface code","audio":"audio track","sceneImage":"scene image","gameData":"Game data","settings":"settings","worldbook":"lore book","loreBinding":"entry link","uiKnobs":"style knobs","uiKnobGroups":"style knob groups","uiDoc":"player interface","other":"item"},"tool":{"write_entry":"Write an entry","write_variable":"Write a variable","write_behavior":"Write a behavior","write_custom_ui":"Write interface code","edit_custom_ui":"Edit interface code","write_ui_knob_groups":"Split into style knobs","set_ui_knobs":"Adjust style knobs","write_audio":"Write an audio track","write_scene_image":"Write a scene image","write_game_data":"Write game data","write_worldbook":"Write a lore book","write_lore_binding":"Link entries","delete_entities":"Delete items","apply_changes":"Several changes","edit_ui_doc":"Edit the interface","read_ui_doc":"Read the interface","read_entities":"Look through the card","read_entity":"Lo
4ok through the card","grep_world":"Search the card","validate_world":"Check the card","update_settings":"Change settings","load_skill":"Read a guide","list_assets":"Browse assets","browse_assets":"Browse assets","compile_tsx":"Check interface code","generate_image":"Make a picture","generate_images":"Make pictures","ask_user":"Ask you","analyze_token_cost":"Estimate usage","validate_ui_blueprint":"Check the interface","list_templates":"Browse templates","other":"Other step"},"field":{"name":"Name","content":"Content","description":"Description","keywords":"Keywords","secondary_keywords":"Secondary keywords","type":"Type","min":"Minimum","max":"Maximum","default_value":"Starting value","behavior_rules":"How it changes","category":"Category","enabled":"On","section":"Where it goes","role":"Role","position":"Order","priority":"Priority","always_send":"Always sent","conditions":"Conditions","condition_logic":"Condition logic","then":"Effects","actions":"Actions","trigger":"Trigger","event_type":"Event","cooldown_turns":"Cooldown","max_fire_count":"Times it can fire","tsx_code":"Code","new_code":"Code","old_code":"Code","url":"File","volume":"Volume","loop":"Loop","tags":"Tags","folder_id":"Folder","match_whole_words":"Whole words only","prevent_recursion":"No recursion","exclude_recursion":"Excluded from recursion","model":"Model","temperature":"Temperature","max_tokens":"Reply length","max_context":"Context length","player_name":"Player name","other":"Setting"},"audioType":{"bgm":"Music","sfx":"Sound effect","ambient":"Ambience"},"yes":"Yes","no":"No","apply":"Apply","changes":"Changes","entities":"Card content"},"sources":{"size":"{{n}} chars","remove":"Remove this source text from the card","removed":"Removed â{{name}}â","digest":{"read":"Building reference · read {{done}}/{{total}}","merge":"Building reference · merging {{done}}/{{total}}","check":"Building reference · checking {{done}}/{{total}}","save":"Building reference · saving"}},"focus":{"hint":"Click something on the canvas and the assistant works on just that. Shift-click to add more.","clear":"Clear","remove":"Stop showing this to the assistant","about":"About"},"job":{"askByKey":"About {{minutes}} min · on your own key","startMessage":"Start","ask":"About {{minutes}} min · {{mushies}} mushies","start":"Start","explainFirst":"See the plan","playingBanner":"The assistant is playing · {{label}}","presenceWorking":"Assistant at work","digestIntro":"Building a reference from â{{source}}â","digestStep":{"read":"Read the whole book, part by part","merge":"Merge into plot, people, factions, world and style","check":"Check disagreements against the text","save":"Save it with this card"}},"inspect":{"panelTitle":"Element inspector","showPanel":"Show element inspector","exit":"Exit","hidePanel":"Hide element inspector","askDecompose":"Let the AI lift out knobs","askDecomposeHint":"The agent reads this card's frontend and turns its colours, display strings and sizes into controls you can edit here â the code keeps working exactly as it does now.","pick":"Edit","emptyHint":"Turn on Edit, then click a part of the card.","sourceTitle":"Source","inComponent":"in {{name}}","inheritedFrom":"This node carries no source marker â showing the nearest one, {{label}}.","noSource":"Not drawn by this card's code â a platform component, or HTML inserted at runtime.","openCode":"Open the code","sendToAgent":"Hand to the AI","attached":"Handed to the AI","classesTitle":"Classes","snippetTitle":"Code","knobsBadge":"Base frontend","knobsHint":"These knobs were lifted out of the card's own frontend code. Changes apply at once; the code itself is untouched.","breadcrumbRoot":"Card","noFrontend":"This card has no frontend yet.","noFrontendHint":"Ask the AI on the right for one, or open the code panel and write it yourself.","keyboardHint":"â parent · â child · ââ sibling · Esc cancel","attachedBlock":"Selected block","clearAttachment":"Clear","desktop":"Desktop","phone":"Phone","editModeHint":"Edit is on: click a part of the card to select and drag it. Turn it off to tap buttons and fill forms as a player would.","zoomIn":"Zoom in","zoomOut":"Zoom out","zoomActual":"Show at 100%","zoomFit":"Fit to window (Ctrl+0)","zoomFitShort":"Fit · {{pct}}%","previewing":"Previewing · no AI, no credits"},"stopPlay":"Stop","stage":{"tabBlueprint":"Story","tabFrontend":"Player interface","tabGeneration":"AI generation","toStage":"Canvas workstation â the canvas fills the studio","toClassic":"Switch to the classic panel layout","collapse":"Collapse","close"
4:"Close","backToStage":"Back to the canvas layout"},"workspace":{"editors":"Panels","variants":"Languages & variants","primaryMetadata":"This is a secondary variant. Public details such as the cover and description belong to the primary variant in this language. Select it above to edit those details.","fullLists":"Full-page lists"},"testStarts":{"title":"Playtest start","fresh":"Start fresh","run":"Run with current draft","saveCurrent":"Save current playtest as a new start","delete":"Delete selected test start","name":"Test start name","nameHint":"For example: Before dungeon B","save":"Save start","hint":"Starts keep state and conversation after you exit. Running saves the current draft and creates a separate playtest.","messages":"{{count}} messages","draftNotReady":"The draft is saving or changed during the save. Finish saving before running it.","stateNotReady":"The playtest state has changed. Wait for updates to finish, then save the start again.","limit":"Each card can keep up to 30 test starts. Delete unused starts before saving another.","retry":"Reload starts","loadError":"Could not load playtest starts. Reload the list to try again.","saveError":"Could not confirm the saved start. Reload the list to check before saving again.","deleteError":"Could not confirm deletion. Reload the list before trying again."},"parts":{"kind":{"choice":"Card picker","field":"Form field","popup":"Popup"},"noVariable":"(no variable yet)","newVariable":"+ New variable","insert":"Insertâ¦","image":"Image","pickImage":"Pick an image","changeImage":"Change image","removeImage":"Remove image","saveFirst":"Save the card once before picking images.","moveUp":"Move up","moveDown":"Move down","remove":"Remove","expand":"Expand","collapse":"Collapse","choice":{"layout":"Look","layoutGrid":"Grid","layoutCarousel":"Full-width swipe","layoutList":"List","columns":"Per row","columnsAuto":"Auto","pickCount":"How many can be picked","pickOne":"One","pickMany":"Several","maxPick":"Up to","unlimited":"Any","tapRunsHint":"Tapping a card takes effect at once and runs its \\"When picked\\" steps.","variable":"Save the pick to","variableHint":"Saves the option's title (or the value you set for it).","variableHintMany":"With several picks, saves a list of options (a list variable).","newVariableName":"Pick","more":"Filter and confirm","tagFilter":"Tag filter","tagFilterHint":"Tag filter: a row of tags above the cards; tap one to show only that kind.","confirm":"Confirm button","confirmHint":"With a confirm button, tapping a card only selects it; confirming makes it count.","confirmLabel":"Button text","confirmDefault":"Choose this","confirmActions":"After confirming, also","options":"Options","title":"Title","subtitle":"One line","detail":"Details","detailPlaceholder":"Shown in the swipe and list looks","tags":"Tags","tagsPlaceholder":"Comma separated, e.g. gentle, school","value":"Value to save","valuePlaceholder":"Leave empty to use the title","after":"When picked","afterHint":"To show the player's pick in a text, write {{the picked option}}.","stepsCount_one":"{{count}} step when picked","stepsCount_other":"{{count}} steps when picked","addOption":"Add an option","newOption":"New option {{n}}","starterTitles":"Dawn\\nDusk\\nRain\\nStars","starterSubtitle":"One line about this option","theChoice":"the picked option"},"field":{"kind":"Kind","kind_text":"Short text","kind_textarea":"Paragraph","kind_chips":"Pick one","kind_number":"Number","kind_slider":"Slider","label":"Question","placeholder":"Hint text","customPlaceholder":"Text on the \\"write your own\\" chip","variable":"Save the answer to","variableHint":"The variable updates as the player types. Texts on the page can show it, and buttons can wait for it.","options":"Choices (one per line)","allowCustom":"Allow writing their own","range":"Range","min":"Min","max":"Max","step":"Step","newVariableName":"Name","newLabel":"What's your name?","newPlaceholder":"Type here","newOptions":"Option one\\nOption two\\nOption three","aiRule":"What the player filled in on the opening form: {{name}}
4. It is the player's own answer â write with it, don't change it for them."},"popup":{"variable":"Watch this variable","variableHint":"Pops up as soon as this variable has something in it. Let the AI or a button write to it.","newVariableName":"Popup text","theValue":"What the variable holds","title":"Title","body":"Text","buttonLabel":"Button text","closing":"When closed","clearOnClose":"Clear the variable on close","clearHint":"Closing clears the variable; writing something new pops it up again.","keepHint":"Closing only hides it this time; it pops up again when the content changes.","newTitle":"New message","newButton":"Got it","aiRule":"The interface popup â{{name}}â: write a sentence into this variable and the player sees it as a popup; it clears when they close it."},"list":{"source":"Rows come from","sourceStatic":"Rows I write","sourceEntries":"Entries","entriesWhich":"Which ones","entriesCharacters":"Characters · {{n}}","entriesFolder":"Folder â{{name}}â · {{n}}","newCharacter":"+ New characterâ¦","sourceVariable":"A variable","variableHint":"Pick which variable under \\"Reads variable\\" below. It needs to be a list.","newVariableName":"List","rows":"Rows","rowTitle":"Title","rowBody":"Text","newRow":"Row {{n}}","addRow":"Add a row","tokenTitle":"This row's title","tokenBody":"This row's text","tokenRow":"This row","tokenIndex":"Row number","card":"Card style","cardOn":"Draw each row as a card","cardHint":"Each row becomes a card: picture, title, a line of text, a badge.","cardTitle":"Card title","cardSubtitle":"Card text","cardBadge":"Badge","imageField":"Picture comes from this row field","imageShape":"Picture","shape_side":"Small, left","shape_wide":"Wide, top","shape_square":"Square, top","shape_tall":"Tall, top","columns":"Per row","lock":"Locked until","lockOn":"Show locked rows as locked","lockOffHint":"Good for a collection or achievements: what's not found yet is there, just locked.","lockHint":"Unlocks when the variable contains this row's \\"{{field}}\\".","lockVariableName":"Unlocked","lockVariable":"Watch this variable","lockField":"Match this row field","lockedText":"Shown while locked","rowActions":"Tapping a row","rowActionsHint":"{{token}} in a text becomes the tapped row."},"requires":{"label":"Only pressable once these are filled","hint":"The button lights up when every ticked variable has something in it.","noVariables":"This card has no variables yet.","gone":"(deleted variable)"},"looks":{"title":"Change the look","hint":"Only the appearance changes â content and settings stay. Every field can still be changed on its own afterwards.","names":{"choice-default":"Theme default","choice-glass":"Frosted glass","choice-bookmark":"Paper bookmark","choice-neon":"Neon frame","choice-cover":"Full cover","field-default":"Theme default","field-underline":"Underline","field-filled":"Filled","field-pill":"Pill","popup-default":"Theme default","popup-letter":"Letter","popup-banner":"Banner","popup-reward":"Reward","list-default":"Theme default","list-tiles":"Tiles","list-ledger":"Ledger","list-album":"Album","button-theme":"Theme default","button-solid":"Solid","button-outline":"Outline","button-soft":"Soft","button-glass":"Glass"}},"nameVariable":"Name the new variable","createVariable":"Create","cancelVariable":"Cancel"},"theme":{"title":"Look","hint":"Pick an official theme, then set its colour, type and corners.","none":"No theme","noneHint":"Platform default","accent":"Colour","font":"Type","radius":"Corners","scope":"A theme only changes how this card looks. Nothing you wrote is touched, and players see exactly what you see here.","sampleThem":"The lamp is lit, the door ajar.","sampleYou":"I push it open.","preset":{"paper":"Paper","night":"Night","terminal":"Terminal","blossom":"Blossom","velvet":"Velvet","harbor":"Harbor","linen":"Linen","coolant":"Coolant","moss":"Moss","tape":"Tape","gilded":"Gilded","tavern":"Tavern"},"fontName":{"sans":"Sans","serif":"Serif","mono":"Mono","rounded":"Round"},"radiusName":{"sharp":"Square","soft":"Soft","round":"Round"}},"layout":{"section":"Layout","hint":"Pick a layout and the card gets a portrait, meters, openers â whatever that layout is made of. Colour comes from the theme.","none":"Conversation only","noneHint":"The platform's chat","brings":"Adds these variables to the card: {{names}}. Undo takes them back.","leftovers_one":"The previous layout left {{count}} variable nothing uses","leftovers":"The previous layout left {{count}} variables nothing uses","leftoversDiscard":"Clear them","title":"This card","preset":{"portrait-scene":"Portrait scene","adventure-hud":"Adventure HUD","stat-panel":"Stat panel","character-sheet":"Character sheet","chapter-portrait":"Chapter Portrait","masthead":"Masthead","margin-notes":"Margin Notes","status-strip":"Status Strip","night-card":"Night Card","cassette":"Cassette","art-split":"Art Split","guild-card":"Guild Card"},"presetHint":{"portrait-scene":"Portrait + two meters + a details page. For a card about one character.","adventure-hud":"Where you are + day and time + two meters. For text adventure and exploration.","stat-panel":"Four meters + gold + day. For raising, managing, surviving.","character-sheet":"The player'
4s own name, role, location and story phase. For roleplay.","chapter-portrait":"A chapter banner across the top. The right column has the portrait, a mood line and three meters.","masthead":"Card name, four meters and the cast in a band at the top, with the conversation below.","margin-notes":"Light background with three notes on the right: title and place, four meters, and the people you know.","status-strip":"A strip under the input box showing time, gold, place, stamina, energy and who is around.","night-card":"The current day in the top right, and a character card in the bottom right with mood, place, four meters and the people you know.","cassette":"A cassette under the input box with the card name on its label, next to the current chapter, place and mood.","art-split":"The portrait fills the right half, with the card name and two meters at the bottom.","guild-card":"A parchment card on the left with the player's name, class, rank, gold, stamina and energy."},"vars":{"portrait":"Portrait","location":"Location","day":"Day","timeOfDay":"Time of Day","affinity":"Affection","stamina":"Stamina","energy":"Energy","progress":"Progress","gold":"Gold","inventory":"Inventory","roster":"Relationships","playerName":"Player Name","playerRole":"Role","gender":"Gender","age":"Age","phase":"Story Phase","mood":"Mood","rank":"Adventurer rank"},"varDefaults":{"timeOfDay":"Morning","location":"Somewhere unnamed","playerRole":"Traveller","phase":"Prologue","mood":"Calm","rank":"Copper"},"s":{"common":{"detailsOpen":"Details","detailsTitle":"Details","detailsBack":"Back to the conversation","inventoryTitle":"Carrying","inventoryEmpty":"Nothing yet. Have a behavior add to this variable and it shows up here.","rosterTitle":"People you know","rosterEmpty":"Nobody yet.","actionLook":"Look around","actionLookSays":"I look around, trying to make out where this is.","actionAsk":"Ask","actionAskSays":"âLet's start there â who are you?â","actionWait":"Say nothing","actionWaitSays":"I don't answer, and wait for them to speak first.","toolRewind":"Rewind","toolRegenerate":"Regenerate","toolCopy":"Copy","castLabel":"Cast"},"portrait-scene":{"portraitEmpty":"Add a portrait\\nSelect this, then pick an image on the right","meterPrimary":"Affection","meterSecondary":"Stamina"},"adventure-hud":{"placeLabel":"Location","whenFormat":"Day {day} · {timeOfDay}","meterPrimary":"Stamina","meterSecondary":"Energy"},"stat-panel":{"whenLabel":"When","whenFormat":"Day {day} · {timeOfDay}","goldLabel":"Gold","meterPrimary":"Affection","meterSecondary":"Stamina","meterThird":"Energy","meterFourth":"Progress"},"character-sheet":{"traitFormat":"{playerRole}","placeLabel":"Location","phaseLabel":"Story phase","meterPrimary":"Affection","meterSecondary":"Stamina"},"chapter-portrait":{"portraitEmpty":"Add a portrait\\nSelect this, then pick an image on the right","ribbonFormat":"⦠{phase} â¦","meterPrimary":"Affinity","meterSecondary":"Stamina","meterThird":"Energy"},"masthead":{"whenFormat":"Day {day} · {timeOfDay}","goldFormat":"Gold {gold}","meterPrimary":"Stamina","meterSecondary":"Energy","meterThird":"Affinity","meterFourth":"Progress"},"margin-notes":{"whenFormat":"Day {day} · {timeOfDay}","meterPrimary":"Affinity","meterSecondary":"Stamina","meterThird":"Energy","meterFourth":"Progress"},"status-strip":{"whenLabel":"Time","whenFormat":"D{day} · {timeOfDay}","goldLabel":"Gold","placeLabel":"Location","meterPrimary":"Stamina","meterSecondary":"Energy"},"night-card":{"clockFormat":"Day {day}","whenFormat":"Day {day} · {timeOfDay}","meterPrimary":"Affinity","meterSecondary":"Stamina","meterThird":"Energy","meterFourth":"Progress"},"cassette":{"sideFormat":"Side A · Day {day}","whereFormat":"{timeOfDay} · {location}","noteTitle":"Mood","meterPrimary":"Affinity"},"art-split":{"portraitEmpty":"Add a portrait\\nSelect this, then pick an image on the right","meterPrimary":"Affinity","meterSecondary":"Stamina"},"guild-card":{"guildTitle":"Adventurer","guildSubFormat":"Registered at {location}","nameLabel":"Name","roleLabel":"Class","rankLabel":"Rank","goldLabel":"Gold","meterPrimary":"Stamina","meterSecondary":"Energy"}}},"element":{"addParam":"+ Pass something in","paramValue":"Value, may use {{variable}}","paramName":"Name","newAi":"+ New AI","panelTitle":"This part","emptyHint":"Click any part of the card to change it â or add a new part below, or switch to another page to edit it.","newMeterName":"New meter","remove":"Remove","loadBearing":"The conversation and the composer are the card itself. They stay.","label":"Text","binding":"Reads","unusedKeep":"Keep","unusedRemove":"Delete","unusedVariable":"â{{name}}â is no longer used anywhere","more":"Position, arrangement and style","newVariableCreate":"Add","behaviorPick":"Pick a behavior","behaviorMissing":"â{{id}}â (no such behavior on this card)","behaviorNew":"+ New behaviorâ¦","behaviorNewName":"e.g. Go upstairs","behaviorOpen":"Open","newVariableName":"Name","newVariable":"+ New valueâ¦","missingVariable":"â{{id}}â (not on this card yet)","shows":"It shows","pageData":"What this page uses","pageBehaviors":"Behaviors","pageValues":"Values","barColor":"Bar colour","fillColor":"Fill","textColor":"Text colour","followsTheme":"follows the theme","themeColor":"Follow the theme","customColor":"Pick your own","box":"Position and size","kind":{"meter":"Meter","image":"Image","list":"List","chat":"Conversation","messages":"Conversation","composer":"Composer","custom"
4:"Code block","button":"Button","text":"Text","box":"Panel"},"onPhone":"Phone","onDesktop":"Desktop","hiddenHere":"This part is not on the desktop layout. Switch to phone to move it.","duplicate":"Duplicate","onPress":"When pressed, do in order","saysPlaceholder":"What the player says when the button is pressed","type":"Type","size":"Size","weight":"Weight","weightNormal":"Regular","weightMedium":"Medium","weightBold":"Bold","manyPicked":"{{count}} parts picked","noActions":"Nothing happens yet. Add a step.","addStep":"Add a step","stepKind":"What this step does","moveUp":"Move earlier","moveDown":"Move later","removeStep":"Remove this step","action":{"run-ai":"Call an AI","send-message":"Say a line for the player","set-variable":"Change a variable","switch-greeting":"Switch opening","go-page":"Go to page","toast":"Show a notice","run-behavior":"Set off a behavior","play-audio":"Play audio","stop-audio":"Stop audio","regenerate":"Regenerate","rewind":"Undo last turn","copy-message":"Copy last reply","random":"Pick at random"},"op":{"set":"Set to","add":"Add","subtract":"Subtract","toggle":"Flip (yes â no)"},"valueTrue":"Yes","valueFalse":"No","valuePlaceholder":"Value","unknownVariable":"â{{name}}â isn't a variable on this card, so it will show nothing in play","createVariable":"Create it","newNumberVariable":"+ New number variable","rangeMin":"Min","rangeMax":"Max","rangeStart":"Starts at","imageSource":"Picture","imageFixed":"This one picture","imageFollows":"Follows â{{name}}â","insertVariable":"Insert a variable's valueâ¦","toastPlaceholder":"The notice text","noVariables":"This card has no variables yet. Make one under Variables first.","noGreetings":"This card has no openings yet.","greetingN":"Opening {{n}}","greetingHint":"Switching the opening resets variables to that opening's starting values. Put variable changes after this step.","noTracks":"This card has no audio yet.","stopAll":"Stop everything","showWhen":"When to show","show":{"always":"Always","notStarted":"Before the chat starts","started":"After the chat starts","variable":"When a variable matches"},"cmp":{"eq":"is","neq":"is not","gt":"is more than","gte":"is at least","lt":"is less than","lte":"is at most","contains":"contains"},"showHint":"While editing, parts whose condition is not met show faded. Players don't see them.","page":"Page","pageN":"Page {{n}}","entryPage":"first page","renamePage":"Rename this page","addPage":"New page","removePage":"Delete this page","lastPage":"This is the only page left, so it can't be deleted.","addPart":"Add a part","newText":"New text","newButton":"Button","newListItems":"First item\\nSecond item\\nThird item","saveFirst":"Save the card once before picking an image or video.","pickImage":"Pick an image or video","changeImage":"Change","listItems":"List items (one per line)","placedOnPhone":"It has a place on the phone layout too â switch to phone to see it","placedOnDesktop":"It has a place on the desktop layout too â switch to desktop to see it","showPhone":"Show phone","showDesktop":"Show desktop","setEntry":"Set as first page","isEntry":"The card opens on this page","movePageUp":"Move up","movePageDown":"Move down","pageList":"All pages","leavesTo":"Switches to â{{name}}â once the chat starts","leavesToWhen":"Switches to â{{name}}â when {{when}}","leavesToHere":"While the player is on this page, switches to â{{name}}â once the chat starts","leavesToHereWhen":"While the player is on this page, switches to â{{name}}â when {{when}}","leaveVariableMet":"â{{variable}}â meets its condition","leaveNotStarted":"the chat hasn't started","noRoomNudge":"No empty spot left â it went near the bottom. Drag it into place.","randomMin":"Min","randomMax":"Max","randomFromPlaceholder":"One per line; one is picked at random","randomFromHint":"When pressed, one line above is picked at random and written to this variable. The card decides, not the AI.","randomNumberHint":"When pressed, a whole number in this range is picked at random and written to this variable.","videoPlay":"Play","videoLoop":"Loop","videoOnce":"Once","videoSound":"Sound","videoMuted":"Muted","videoWithSound":"On","layoutShared":"Same spot on phone and computer","layoutOwn":"Placed separately on the computer â moving it on one does not move the other","layoutOffDesktop":"Not shown on the computer","layoutOffHere":"Not shown on the computer","layoutFollowPhone":"Follow the phone again","nameLinked":"Renaming this renames the variable behind it ({{name}}) too â that is the name the AI reads.","pickStartImage":"Choose an image","changeStartImage":"Change image"},"style":{"none":"None","themeColors":"Theme colors","recentColors":"Recent","hex":"Color value","colorOpacity":"Opacity","fill":"Fill","fillNone":"None","fillColor":"Solid","fillGradient":"Gradient","fillImage":"Image","color":"Color","gradient":{"dusk":"Dusk","night":"Night sky","mint":"Mint","rose":"Rose","gold":"Gold","glass":"Glass"},"stopN":"Color {{n}}","removeStop":"Remove this color","addStop":"Add a color","angle":"Angle","fit":"How the image fits","fitCover":"Fill","fitContain":"Fit","fitFill":"Stretch","shape":"Shape","radius":"Corners","corner":{"0":"Top left","1":"Top right","2":"Bottom right","3":"Bottom left"},"perCorner":"Set each corner","border":"Border","borderWidth":"Border width","line":"Line","solid":"Solid","dashed":"Dashed","dotted":"Dotted","shadow":"Shadow","shadowPreset"
4:{"none":"None","soft":"Soft","medium":"Medium","lifted":"Lifted","glow":"Glow"},"effects":"Effects","opacity":"Opacity","blur":"Frosted","rotation":"Rotate","textStyle":"Text style","text":"Text","font":"Font","fontTheme":"Follow theme","fontGroup":{"card":"This card's fonts","system":"System","zh":"Chinese","ja":"Japanese","latin":"English"},"system":{"sans":"Sans","serif":"Serif","rounded":"Rounded","mono":"Monospace"},"fontName":{"noto-sans-sc":"Noto Sans SC","noto-serif-sc":"Noto Serif SC","zcool-xiaowei":"ZCOOL XiaoWei","zcool-kuaile":"ZCOOL KuaiLe","zcool-qingke-huangyou":"ZCOOL HuangYou","ma-shan-zheng":"Ma Shan Zheng (brush)","long-cang":"Long Cang (hand)","zhi-mang-xing":"Zhi Mang Xing (brush)","zen-maru-gothic":"Zen Maru Gothic","shippori-mincho":"Shippori Mincho","dotgothic16":"DotGothic16 (pixel)"},"uploadFont":"Upload a font fileâ¦","myFont":"My font","weightN":{"300":"Light","400":"Regular","500":"Medium","600":"Semibold","700":"Bold","900":"Black"},"italic":"Italic","align":"Align","alignLeft":"Left","alignCenter":"Center","alignRight":"Right","lineHeight":"Line height","letterSpacing":"Spacing","textShadow":"Text shadow","textFx":{"none":"None","soft":"Soft","crisp":"Crisp","glow":"Glow"},"stroke":"Outline","strokeN":{"none":"None","thin":"Thin","thick":"Thick"},"colorWord":{"black":"Black","white":"White","gray":"Grey","red":"Red","orange":"Orange","brown":"Brown","yellow":"Yellow","green":"Green","cyan":"Teal","blue":"Blue","purple":"Purple","pink":"Pink"},"customColor":"Custom colour"},"canvasEdit":{"arrange":"Arrange","alignToEachOther":"to each other","alignToPage":"to the page","align":{"left":"Align left","hcenter":"Center horizontally","right":"Align right","top":"Align top","vcenter":"Center vertically","bottom":"Align bottom"},"distributeH":"Space evenly across (3 or more)","distributeV":"Space evenly down (3 or more)","layer":"Order","order":{"front":"Bring to front","forward":"Bring forward","backward":"Send backward","back":"Send to back"},"layers":"Layers","showInEditor":"Show in the editor","hideInEditor":"Hide in the editor (players still see it)","keyboardHint":"Double-click to edit text · arrows nudge · Ctrl+C/V copy & paste · Delete removes · hold Alt to stop snapping","pasted":"Pasted","onlyPhone":"Phone only","onlyDesktop":"Desktop only","popupBadge":"Popup · shown when selected","offCanvasRule":"{{count}} of the selected parts aren't on this layout: align and move leave them alone; delete, copy and cut include them.","menu":{"cut":"Cut","copy":"Copy","paste":"Paste","duplicate":"Duplicate","delete":"Delete"}},"noApiKey":{"title":"No model key configured yet","body":"The assistant and playtest both run on your model key or platform credits. Set one up in Settings first.","action":"Go to settings"},"backToLibrary":"Back to my cards","back":"Back","messages":{"look":"Message look","fineTune":"Fine-tune text, bubbles and special formats","side":"Which side","sides":{"assistant":"AI","user":"Player","greeting":"Opening"},"presets":{"default":"Platform","bubbles":"Bubbles","novel":"Novel","letter":"Letter","terminal":"Terminal"},"sampleLine":"The rain stops. She looks back.","sampleReply":"I'm here.","bubble":"In a bubble","bubbleColor":"Bubble fill","borderColor":"Border","radius":"Corners","padding":"Padding","font":"Font","fontDefault":"Follow the theme","textColor":"Text colour","size":"Size","lineHeight":"Line height","italic":"Italic","greetingHint":"The opening starts from the AI's look; change only what should differ.","showNames":"Show the Narrator / You labels","maxWidth":"Max width","maxWidthNone":"None","gap":"Spacing","rules":"Special writing","rulesHint":"Things the AI writes by convention are drawn a different way. The rules are written into the lorebook entry \\"Interface conventions\\" automatically, so the AI follows them.","empty":"No special writing yet. Add one below â the preview shows it on a sample exchange.","add":"Add a convention","ruleName":"Name","find":"How to spot it","match":{"wrap":"Wrapped","line-prefix":"Line starts with","contains":"Contains","regex":"Advanced"}
4,"open":"Opens with","close":"Closes with","prefix":"Line prefix","text":"Text","pattern":"Advanced: my own rule","badPattern":"This rule isn't written right, so it does nothing for now.","patternHint":"Advanced: a matching rule that finds the text; the part in brackets is what gets shown. If this is new to you, the first three ways are enough.","show":"Show as","shows":{"reveal":"Tap-to-reveal thought","banner":"Banner","card":"Special message card","choices":"Choice buttons","speaker":"Speaker label","hide":"Hidden"},"cover":"Cover","covers":{"ink":"Ink","blur":"Blur","sticker":"Sticker"},"coverText":"Words on the cover","coverTextPh":"e.g. Tap to peek","chance":"Chance to reveal","chanceHint":"Revealed text is remembered per message and per regenerated version. Below 100%, a miss is remembered too and can't be retried.","missText":"Shown on a miss","missTextPh":"â¦couldn't make it out","cardTitle":"Card title","cardTitlePh":"Defaults to the matched text","fill":"Fill","names":"Name colours and pictures","addName":"Add a name","namePh":"Name","nameHint":"Names not listed get a colour automatically â always the same one per name.","applyToUser":"Also apply to the player's lines","teachAi":"Tell the AI to write it","aiHint":"Hint for the AI","aiHintHint":"Leave empty to use the grey sentence. The hint and example go into the lorebook entry \\"Interface conventions\\" (always sent) and update when the rule changes.","example":"Example","moveUp":"Move up","moveDown":"Move down","orderHint":"Earlier rules win","remove":"Remove","enable":"Enabled","expand":"Expand","rulePresets":{"inner-thought":"Hidden thoughts","scene-banner":"Scene banner","choice-buttons":"Choice buttons","speaker-label":"Speaker labels","special-card":"Special message card","hide-meta":"Hide notes","custom":"Custom"},"customName":"New convention","cardMarker":"[BROADCAST]","cardTitleDefault":"ð» Broadcast"},"review":{"showRaw":"Show raw data","hideRaw":"Hide raw data","noVisibleChange":"Nothing visible changed in the interface","aPart":"Part","none":"none","pageAdded":"New page â{{name}}â","pageRemoved":"Removed page â{{name}}â","pageRenamed":"Page â{{from}}â renamed to â{{to}}â","partAdded":"Added {{name}}","partRemoved":"Removed {{name}}","partChanged":"Changed {{name}}","aspect":{"name":"name","position":"position & size","text":"text","style":"style","actions":"what it does when tapped","binding":"what it shows","other":"other settings"},"themePreset":"Theme: {{from}} â {{to}}","themeFont":"Font changed","token":{"bg":"Page background","bg-solid":"Page base colour","text":"Story text","name":"Speaker name","bubble-bg":"Their bubble","user-bubble-bg":"Your bubble","user-text":"Your text","input-bg":"Input box","input-fg":"Input text","input-border":"Input border","send-bg":"Send button","send-fg":"Send icon","chip-bg":"Choice buttons","chip-fg":"Choice text","other":"Other look setting"}},"pageTemplates":{"templates":"Templates","templatesTitle":"Pick a template","newPage":"New","title":"New · pick a template","tutorTip":"Here are 18 ready-made templates â§ The top group is for openings (before the story starts); the rest are pages players open from the menu while playing. Click one to add it to your card, and it just works. Don't want one yet? Close this with the à â you can always come back with New.","sub":"30 ready-made templates (12 whole screens, 18 pages), already wired with variables, buttons and what the AI is told â add one and it plays. Colours, sizes and positions are still yours to change.","groupOpening":"Openings · before the story starts","blank":"Blank page","blankDesc":"Nothing on it. Arrange it yourself.","wired":"Wired: {{what}}","pages":"Pages","openingTitle":"Opening {{n}}
4","chatPageName":"Chat","close":"Close","tpl":{"title-screen":{"name":"Title screen","desc":"A title and a short prologue; Start goes into the story. Shown once, before it begins.","wired":"shown once","s":{"pageName":"Title","title":"Story title","prologue":"Winter came early that year. Just before the gates were barred, a last carriage rolled in through the snow, and no one inside said a word.","start":"Start"}},"pick-opening":{"name":"Pick an opening","desc":"One card per opening; the story starts from whichever is tapped.","wired":"your {{count}} openings","s":{"pageName":"Pick an opening","title":"Where does it start?","sub":"Each card is a different opening. Tap one to begin there.","partName":"Opening cards"},"samples":[{"name":"From the start","content":"[The plainest way in: the player has just arrived and knows nothing yet. Write the first thing they see and the first words they hear.]"},{"name":"In the middle","content":"[Something has already happened: the player opens their eyes halfway through the story. Say what happened, where they are, and what they have on them.]"},{"name":"Someone else","content":"[Same world, a different way in: this time the player is someone else. Say who that is and what they set out to do today.]"}]},"enter-name":{"name":"Enter your name","desc":"Asks a name and how to be addressed; the AI uses it from the first line.","wired":"player name, form of address","s":{"pageName":"Your name","title":"What's your name?","sub":"This is what people in the story will call you.","nameLabel":"Name","namePlaceholder":"Type your name","addressLabel":"How should people address you?","address1":"Sir","address2":"Miss","address3":"Just my name","addressCustom":"Something else","start":"Enter the story"}},"profile":{"name":"Character sheet","desc":"Name, gender, age, looks and one secret, with a card filling in as you type.","wired":"5 player variables","s":{"pageName":"Character sheet","title":"Who are you?","sub":"Write down who you are. Only the name is required.","cardEmpty":"No name yet","cardLine":"{{gender}} · {{age}}","nameLabel":"Name","namePlaceholder":"Your name","genderLabel":"Gender","gender1":"Male","gender2":"Female","gender3":"Rather not say","genderCustom":"Something else","ageLabel":"Age","agePlaceholder":"e.g. 24","looksLabel":"Looks","looksPlaceholder":"Hair, height, clothes, one thing people notice","secretLabel":"A secret","secretPlaceholder":"Nobody in the story knows. The AI remembers.","start":"Begin"}},"pick-origin":{"name":"Pick a background","desc":"Choose one of a few backgrounds, each saying how the story begins.","wired":"background + what the AI is told","s":{"pageName":"Background","title":"Who were you before this?","sub":"Pick a background. The story starts from there.","partName":"Background","option1Title":"Nobody in particular","option1Detail":"No name, no trouble. Everything starts from zero.","option2Title":"Someone known","option2Detail":"Well-born. Everyone knows you, and everyone is watching.","option3Title":"A stranger","option3Detail":"Just arrived. You know no one, and no one knows your past.","start":"This one"}},"difficulty":{"name":"Pick a difficulty","desc":"Gentle, standard or harsh; the AI writes to match.","wired":"difficulty + how each level plays","s":{"pageName":"Difficulty","title":"How hard should it be?","sub":"The AI will write to the difficulty you pick.","partName":"Difficulty","option1Title":"Gentle","option1Detail":"Enjoy the story. Nothing truly goes wrong.","option2Title":"Standard","option2Detail":"You can get hurt and fail, but there is always a way back.","option3Title":"Harsh","option3Detail":"Wrong choices cost you. Your character can die.","start":"Go"}},"confirm":{"name":"Confirm before starting","desc":"Sums up everything chosen so far; the story starts once confirmed. Always comes last.","wired":"reads every page before it","s":{"pageName":"Confirm","title":"Ready?","sub":"The story starts once you confirm.","nothingYet":"Nothing to confirm yet.","start":"Start like this","back":"Go back and change","separator":": "}},"random-draw":{"name":"Draw an opening","desc":"Who you are and where you stand, drawn at random, with a few redraws.","wired":"a table to draw from + redraws","s":{"pageName":"Draw","title":"Fate deals you a card","sub":"What you draw is who you are. Not happy? Draw again a few times.","empty":"Nothing drawn yet","drawName":"Draw button","drawButton":"Draw ({{draws_left}} left)","start":"Go with this","lot1":"Fallen noble â the family fortune is gone; all you have left is a ring.","lot2":"On the run â someone is looking for you, and you don't know
4why.","lot3":"New apprentice â you can't do anything yet, but you learn fast.","lot4":"Lost traveller â you woke with no memory and a note in your pocket.","lot5":"In debt â you owe money, due before sundown tomorrow.","lot6":"The chosen one â everyone says you are the one in the prophecy."}},"points":{"name":"Spend attribute points","desc":"Six points across four attributes; every check leans on them.","wired":"4 attributes + points","s":{"pageName":"Attributes","title":"Spend your points","sub":"Six points. Put them where you want to be strong.","pool":"{{points_left}} points left","attr_str":"Strength","attr_agi":"Agility","attr_cha":"Charm","attr_wit":"Wits","start":"Done"}},"status":{"name":"Status page","desc":"Numbers, place and time on one page; the AI updates them as it goes.","wired":"the variables you already have","s":{"opener":"Status","pageName":"Status","title":"Status","sub":"These change as the story goes.","backName":"Back button","none":"This card has no variables to show yet.","exHere":"Street corner"}},"bag":{"name":"Inventory","desc":"Tap an item to use it; a popup when the story hands you something.","wired":"inventory + new-item popup","s":{"opener":"Bag","pageName":"Bag","title":"Bag","sub":"Tap something to take it out and use it.","backName":"Back button","listName":"Inventory list","empty":"Nothing yet. What you pick up in the story lands here.","useMessage":"(I take out the {{item.name}})","popupName":"New item popup","popupTitle":"You got","popupButton":"Keep it","ex1_name":"Old pocket watch","ex1_note":"Stopped at 3:10. A name is engraved on the back.","ex2_name":"Half a loaf","ex2_note":"Left over from breakfast."}},"map":{"name":"Map","desc":"Tap a place to go there; places not unlocked yet can't be tapped.","wired":"location + places you can go","s":{"opener":"Map","pageName":"Map","title":"Map","sub":"Tap a place to go there. Greyed-out places are out of reach for now.","backName":"Back button","here":"You are at: {{location}}","listName":"Places","empty":"","locked":"{{item.name}} (not yet)","goMessage":"(I head to {{item.name}})","place_home":"Lodging","place_home_note":"Somewhere to rest.","place_street":"Street corner","place_street_note":"Busy, and full of rumours.","place_market":"Market","place_market_note":"You can buy anything, and sell anything.","place_river":"Riverside","place_river_note":"Quiet. Good for things no one should overhear.","place_outskirts":"Outskirts","place_outskirts_note":"No one knows what's out there.","exHere":"Street corner"}},"phone":{"name":"Phone messages","desc":"Messages the AI sends land in a phone, and the player can reply.","wired":"inbox + reply + new-message popup","s":{"opener":"Phone","pageName":"Phone","title":"Phone","sub":"Every message you've received.","backName":"Back button","listName":"Messages","empty":"No messages yet. New ones show up here.","replyName":"Reply box","replyLabel":"Reply","replyPlaceholder":"Type a replyâ¦","sendName":"Send button","send":"Send","replyMessage":"(I reply by phone: {{reply_draft}})","popupName":"New message popup","popupTitle":"New message","popupButton":"Got it","ex1_from":"Landlord","ex1_text":"Key's under the flowerpot by the door this month.","ex2_from":"Unknown number","ex2_text":"Don't go down to the river tonight."}},"relations":{"name":"Relationships","desc":"A card for everyone you know: how far things have gone.","wired":"relationship list","s":{"opener":"People","pageName":"People","title":"People","sub":"Who you know, and where things stand.","backName":"Back button","listName":"Relationship list","empty":"You don't know anyone yet. People you meet are kept here.","ex1_name":"Lan","ex1_level":"Acquaintance","ex1_note":"Lent you an umbrella. You still have it.","ex2_name":"Old Zhou","ex2_level":"Stranger","ex2_note":"Sells papers on the corner. Seems to know you."}},"schedule":{"name":"Daily actions","desc":"A few actions a day; time moves on as you pick them. For sims and management.","wired":"day, time of day, actions left","s":{"opener":"Schedule","pageName":"What today?","title":"What today?","sub":"A few things a day. Time moves on as you do them.","backName":"Back button","when":"Day {{day}} · {{period}}","left":"{{actions_left}} things left today","act1":"Work","act2":"Train","act3":"Go out","act4":"Rest","actMessage":"(Day {{day}}
4, {{period}}: I {act})","endName":"End day button","end":"End the day","endMessage":"(The day is over. Day {{day}} begins.)"}},"dice":{"name":"Dice check","desc":"The card rolls the die and hands the result to the AI, which can't change it.","wired":"the roll (AI read-only)","s":{"opener":"Dice","pageName":"Dice check","title":"Dice check","sub":"Roll when you're trusting to luck.","backName":"Back button","hint":"The AI is told the number and has to judge by it.","throwName":"Roll button","throw":"Roll (d20)","rollMessage":"(I roll: {{roll}})"}},"clues":{"name":"Clues and accusation","desc":"Clues you find are kept; accuse when you're ready, and a wrong guess costs.","wired":"clues + accusation + new-clue popup","s":{"opener":"Clues","pageName":"Clues","title":"Clues","sub":"Every clue you've found. Accuse when you're sure.","backName":"Back button","listName":"Clue list","empty":"No clues yet.","accuseLabel":"Who do you think it was?","accuseName":"Accuse","suspect1":"The butler","suspect2":"The visitor","suspect3":"The neighbour","accuse":"It was them","accuseMessage":"(I accuse: {{accused}})","popupName":"New clue popup","popupTitle":"Clue found","popupButton":"Noted","ex1_name":"Muddy footprint","ex1_where":"Back door steps","ex2_name":"Half-torn letter","ex2_where":"Study fireplace"}},"collection":{"name":"Collection","desc":"Things to find start greyed out and light up as the story hands them over.","wired":"6 collectibles + unlock popup","s":{"opener":"Collection","pageName":"Collection","title":"Collection","sub":"Each one lights up when you find it.","backName":"Back button","listName":"Collection list","empty":"","item_photo":"Old photo","item_photo_note":"A date is written on the back.","item_photo_hint":"Maybe in someone's drawer","item_letter":"A letter","item_letter_note":"It was never sent.","item_letter_hint":"Maybe someone never sent it","item_key":"Key","item_key_note":"No one knows which door it opens.","item_key_hint":"Maybe buried somewhere","item_badge":"Badge","item_badge_note":"You've seen that pattern before.","item_badge_hint":"Maybe someone still wears it","item_map":"Torn map","item_map_note":"The most important corner is missing.","item_map_hint":"Maybe torn into pieces","item_musicbox":"Music box","item_musicbox_note":"Wind it and it still plays.","item_musicbox_hint":"Maybe up in an attic","popupName":"Unlock popup","popupTitle":"Found","popupButton":"Keep it"}}},"vars":{"player_name":{"name":"Player name","rule":"The player's name. Everyone in the story calls the player by this name; never make up another."},"address":{"name":"Form of address","rule":"How the player wants to be addressed (e.g. Sir, Miss, or just their name). Characters address the player this way."},"gender":{"name":"Player gender","rule":"The player's gender. Keep descriptions and forms of address consistent with it."},"age":{"name":"Player age","rule":"The player's age."},"looks":{"name":"Player looks","rule":"What the player looks like. Describe the player this way; do not invent."},"secret":{"name":"Player's secret","rule":"The player's secret. Characters in the story do not know it unless the plot exposes it; narration may hint at it but never says it for the player."},"opening":{"name":"Opening","rule":"The opening the player picked."},"origin":{"name":"Background","rule":"The background the player picked. It decides where the player starts, what they can do, and how others see them."},"difficulty":{"name":"Difficulty","rule":"The difficulty the player picked; its name says what it means (e.g. Gentle, Standard, Harsh, or whatever the creator renamed them). Follow it strictly: the harder it is, the more real failure and cost; the gentler, the fewer real setbacks."},"draw":{"name":"Drawn opening","rule":"Who the player drew at the start, and their scenario. The story starts from there."},"draws_left":{"name":"Redraws left","rule":"The screen handles this; leave it alone."},"str":{"name":"Strength","rule":"The player's strength, 1â10, set by the player at the start. Use it for checks and description; do not change it."}
4,"agi":{"name":"Agility","rule":"The player's agility, 1â10, set by the player at the start. Use it for checks and description; do not change it."},"cha":{"name":"Charm","rule":"The player's charm, 1â10, set by the player at the start. Use it for checks and description; do not change it."},"wit":{"name":"Wits","rule":"The player's wits, 1â10, set by the player at the start. Use it for checks and description; do not change it."},"points_left":{"name":"Points left","rule":"The screen handles this; leave it alone."},"health":{"name":"Health","rule":"Health, 0â100. Goes down when hurt, up with healing or rest."},"stamina":{"name":"Stamina","rule":"Stamina, 0â100. Goes down with exertion, up with food or rest."},"location":{"name":"Location","rule":"Where the player is now, in a few words. Change it when they go somewhere new.","default":"Lodging"},"bag":{"name":"Inventory","rule":"The inventory, a list; each item is {\\"name\\": item name, \\"note\\": one line}. When the player gets something, push one, and in the same turn set new_item to \\"item â one line\\". When used up or lost, delete its index (from 0). Don't hand out items every turn."},"new_item":{"name":"Just received","rule":"What the player just got. Set it to \\"item â one line\\" in the same turn you push it into the inventory; the screen shows a popup."},"unlocked_places":{"name":"Places open","rule":"Ids of places the player can go (home / street / market / river / outskirts). When the story gives them a way to reach one, push its id; no duplicates."},"inbox":{"name":"Phone messages","rule":"Messages on the phone, a list; each is {\\"from\\": sender, \\"text\\": message}. When someone texts the player, push one and in the same turn set new_message to \\"sender: one line\\". Keep them short, like real texts."},"new_message":{"name":"New message","rule":"The message just received, \\"sender: one line\\". Set it in the same turn you push to the inbox; the screen shows a popup."},"reply_draft":{"name":"Reply being typed","rule":"What the player is typing on the phone; leave it alone."},"relations":{"name":"Relationships","rule":"People the player knows, a list; each is {\\"name\\": name, \\"level\\": relationship (stranger, acquaintance, friend, trusted, close), \\"note\\": one line on where things stand}. Push when they meet someone new; merge the level and note at that index when things change. Only when the story really moves."},"day":{"name":"Day","rule":"Which day of the story it is. The screen adds one when the player ends the day; don't add it yourself unless a night clearly passes in the story."},"period":{"name":"Time of day","rule":"The time of day (morning, afternoon, evening). After the player does something, move it on by one as the story allows; a new day starts in the morning.","default":"Morning"},"actions_left":{"name":"Actions left today","rule":"How many things the player can still do today; the screen handles this."},"roll":{"name":"Die roll","rule":"The d20 the player just rolled (1â20). When the player sends a roll, judge success by it: higher is better, 1 is a disaster, 20 a triumph. Never change it or reroll."},"clues":{"name":"Clues","rule":"Clues the player has found, a list; each is {\\"name\\": clue, \\"where\\": where it was found}. Push one when the player really finds it, and in the same turn set new_clue to \\"clue â one line\\". Don't give too many at once."},"new_clue":{"name":"New clue","rule":"The clue just found; the screen shows a popup."},"accused":{"name":"Accused","rule":"Who the player accused. When they send an accusation, judge it against the truth you hold and carry on; a wrong guess costs them."},"unlocked":{"name":"Collected","rule":"Ids of things collected (photo / letter / key / badge / map / musicbox). When the player really gets one in the story, push its id and in the same turn set unlock_note to \\"name â one line\\". At most one per turn; no duplicates."},"unlock_note":{"name":"Just collected","rule":"What was just collected; the screen shows a popup."}},"groupPlay":"While playing · opened from the chat page's Menu","menu":{"menuOpener":"Menu","menuTitle":"Menu","menuSub":"Tap what you want to see.","bgName":"Backgroun
4d glow","panelName":"Panel"},"strip":{"hint":"Open this page · drag to reorder · double-click to rename · right-click for more","copy":"Duplicate page","copyName":"{{name}} copy","deadEnd":"No way out","deadEndHint":"Nothing on this page goes to another page, and it has no chat â a player who lands here is stuck. Give a button a go-to-page action.","fold":"Hide pages","unfold":"Show pages","chatPage":"Chat screen","add":"New page"},"blockHint":"Pick an opening, enter a name, inventory, map⦠18 ready-made templates","groupWhole":"Whole screen"},"screenFirst":{"editOpening":"Click to edit the opening","openingKeys":"Ctrl+Enter to keep · Esc to cancel · clicking away keeps it too","notesTitle":"Setting","notesHint":"Players never see this; the AI reads it every turn","addNote":"Add a note","addNoteHint":"A character, a place, a rule â whatever comes to mind","noteNamePlaceholder":"Give it a name, e.g. \\"Lin Xia\\"","noteTextPlaceholder":"For the AI: who she is, how she talks, what she is to the player","addFeature":"Add a feature","toBoard":"Canvas"},"publishCheck":{"name":"Has a name","cover":"Has a cover","opening":"Has an opening","playtest":"Played it once","go":"Do it"},"preview":{"you":"you","character":"the character"},"floatBar":{"smaller":"Smaller text","bigger":"Larger text","bold":"Bold","italic":"Italic","color":"Text colour","more":"More"},"pageBg":{"title":"Page background","none":"None","color":"Colour","image":"Picture","dim":"Darken","applyAll":"Use on all {{n}} pages","allSame":"All pages use this"},"why":{"actionShort":"Button","open":"Show what happened this turn","title":"This turn","yourHint":"You wrote: {{hint}}","noHint":"You haven't said when this should change.","src":{"repaired":"Filled in","ai":"AI changed it","judge":"Precise tracking","rule":"Behavior","action":"Button","setup":"Opening setup","settle":"Follow-on","unknown":"Source unknown"},"repaired":"The AI described it but didn't change the value; a second AI checked and filled it in","judgeSure":"{{p}}% sure","ruleFired":" fired","action":"The player pressed a button","settle":"Worked out from another value that changed","drop":{"readOnly":"The AI tried to change it, but it's set so the AI can only read it","hidden":"The AI tried to change it, but it's hidden from the AI","inactive":"The AI tried to change it, but it isn't switched on right now","judge":"The AI tried to change it, but precise tracking owns it"},"tag":{"blocked":"Blocked","broken":"Malformed","same":"Same value","rulesOnly":"Behaviors only","silent":"AI left it"},"rejected":"The AI's write was malformed, so the old value was kept","judgeNoAnswer":"No verdict this turn, so it kept its value","judgeKeep":"Decided it shouldn't change ({{p}}% sure)","judgeBelow":"Leaned toward {{to}}, but only {{p}}% sure; it needs 80%","aiSame":"The AI wrote it, but to the value it already had","rulesOnly":"Only behaviors and buttons can change it","rule":{"fired":"Fired","notFired":"Didn't fire","stopped":"Its stop condition is true","cooldownTag":"Cooling down","cooldown":"{{n}} more turns to wait","maxedTag":"Used up","maxed":"Already fired {{n}} times","inactive":"The scenario it belongs to isn't open","chanceTag":"Missed the roll","chance":"Conditions were met, but its {{p}}% chance missed this time","everyN":"Fires every {{n}} turns; next on turn {{next}}","crossing":"Fires only at the moment the value crosses the line","playerWords":"Waits for the player to use a keyword","aiWords":"Waits for the AI to write a keyword","action":"Waits for the player to press a button","nextTurn":"Conditions are met now; it fires next turn","timing":"Its moment hasn't come yet","now":"{{name}} is {{c}} / needs {{target}}","left":"{{n}} to go","eta":"At the recent pace, about {{n}} more turns","unmet":"Conditions aren't met yet"},"close":"Collapse","empty":"Send a message. This shows why each value changed or didn't.","youSaid":"You said","changed":"Changed","nothing":"No values changed this turn.","oldServer":"This result came back without source details.","held":"Unchanged","silentMore":"AI left alone: {{names}} and {{n}} in all âº","rules":"Behaviors","rulesMore":"{{n}} more âº","judgeNotYet":"Hasn't happened yet ({{p}}% sure)","judgeUnsure":"Can't tell whether it happened ({{p}}% sure;
4 it needs 80%)","seen":{"title":"What the AI got","card":"Narrator","speaks":"is speaking","total":"{{n}} chars","history":"Last {{n}} messages","unsent":"Not sent this time: {{n}} entries (keywords not mentioned, or outside the current scenario)","seg":{"lore":"Lore · every turn","persona":"Player persona","platform":"Platform instructions","examples":"Example dialogue","lore-triggered":"Lore · mentioned this turn","memory":"Memory summary","inputs":"Handed over by other scenarios","history":"Recent conversation","pending":"Added by a behavior","state":"Values and last turn's changes","post":"Final instructions","game":"Game data","scene":"Live scene"}},"quietShort":"Quiet","quietWoke":"woke during a quiet stretch","groupAnswered":"answered the player after the AI before it","quietChanged":"changed it while things were quiet","events":"The AI set off","eventTag":"Event","jev":{"title":"Precise tracking asked","used":"Used","notUsed":"Not applied","bgm":"Music","image":"Scene image","sfx":"Sound â{{name}}â","noAnswer":"No answer","yes":"Yes","no":"No","keep":"Keep it","noImage":"No image","playlist":"Back to the playlist","noChange":"No change"},"timeline":{"you":"You","judge":"Tracking","silent":"Woken, stayed silent"},"places":{"now":"Now in","nowAi":"Now","cardOnly":"just the card","entered":"just entered","left":"just left","aiCame":"arrived","aiWent":"left"}}}`),k={namePlaceholder:"Name this card",coverImage:"Cover Image",uploadCover:"Upload Cover",changeCover:"Change Cover",simpleMode:"Simple",advancedMode:"Canvas",modeDialogTitle:"How do you want to make this card?",modeDialogSubtitle:"You can switch once you are inside.",modeSimpleTitle:"Simple",modeSimpleDesc:"One form, filled in order: who the character is, what the world is like, what the opening says. Fill it in and you can play.",modeAdvancedTitle:"Canvas",modeAdvancedDesc:"The whole card on one board: the opening, characters and world, the player's screen and values, all in view. Click anything to edit it.",storyColumn:"Story",charactersColumn:"Characters",aiRoleLabel:"AI Role",aiRolePlaceholder:`You are the narrator of a survival horror game... 5You are roleplaying as a tsundere classmate... 6You are the dungeon master of a fantasy adventure...`,settingLabel:"Setting",settingPlaceholder:"Describe the world, time period, and setting...",toneLabel:"Tone & Style",tonePlaceholder:"Describe the writing style and mood...",firstMessageLabel:"First Message",firstMessagePlaceholder:`Write the opening scene... 7 8*The tavern door creaks open. A figure in a dark cloak looks up from her drink...*`,examplesLabel:"Example Dialogues",addExample:"Add Example",examplePlaceholder:`{{user}}: What's your name? 9{{char}}: *adjusts glasses* You may call me...`,removeExample:"Remove",customEntriesLabel:"Custom Entries",addEntry:"Add Entry",entryNamePlaceholder:"Entry name...",entryContentPlaceholder:"Entry content...",removeEntry:"Remove",messageStyleLabel:"Message Style",styleDefault:"Default",styleSakura:"Sakura",styleScroll:"Ancient Scroll",styleStarry:"Starry Night",styleCyber:"Cyberpunk",styleForest:"Forest",addCharacter:"Add Character",removeCharacter:"Remove",charNamePlaceholder:"Character name...",charAppearanceLabel:"Appearance",charAppearancePlaceholder:"What do they look like? Height, hair, clothing, distinctive features...",charPersonalityLabel:"Personality",charPersonalityPlaceholder:"How do they act? Quirks, habits, temperament, emotional tendencies...",charBackgroun
9dLabel:"Background",charBackgroundPlaceholder:"Where are they from? What shaped them? Key life events...",charOtherLabel:"Other Details",charOtherPlaceholder:"Speech patterns, abilities, secrets, relationships, anything else...",charDescriptionLabel:"Description",charDescriptionPlaceholder:"Describe this character...",nameStillDefault:"Still your template's name â give the card a real one before publishing.",flavorTitle:"Where do you want to start?",noScreen:"no screen",hasScreen:"a screen"},C={endMarker:"· end ·",needWorldName:"Please name your world first",needWorldNameSaved:"Please name your world and save once first",removeFailed:"Failed to remove",badge:{required:"Required",optional:"Optional",keywordTriggered:"Keyword-triggered"},nav:{jumpTo:"Jump to",cover:"Cover",character:"Character",worldview:"Worldview",dialogueStyle:"Style",settings:"Settings",greeting:"Greeting",description:"About"},archetype:{chat:"Character Chat · 1:1 with one character",world:"World Sim · open world with multiple NPCs"},cover:{title:"Cover",hint:"You can add this later",clickToUpload:"Click to upload",aspectHint:"<strong>9:16</strong> or <strong>3:4</strong> recommended, at least 600px wide.",upload:"Upload cover",replace:"Replace cover"},character:{title:"Character",hintEmpty:"The character(s) the AI will play â add one or many",hintSingle:"The character the AI plays",hintMulti:"The characters the AI plays",unnamed:"Character {{n}} · unnamed",emptyHint:"No characters yet",add:"Add character",name:"Name",namePlaceholder:"e.g. Lyra · Holmes · the cafeteria cat",portraitAdd:"Add portrait",portraitChange:"Change portrait",portraitRemove:"Remove portrait",portraitHint:"Shown beside this character's lines in chat. Illustrated replies draw them with this picture's looks and art style.",delete:"Delete",gender:"Gender",genderFemale:"Female",genderMale:"Male",genderOther:"Other",persona:"Persona",personaFallback:`Appearance: how do they dress? height? signature traits? 10Personality: 3-5 keywords 11Background: where are they from? what shaped them? 12Quirks: catchphrases? habits? secrets?`,portraitTip:"Works best with one character and a clear face. Covers with big title text don't work well.",portraitEmptyHint:"Add a portrait: it's shown beside this character's lines in chat, and illustrated replies draw them with its looks and art style."},worldview:{title:"Worldview",hint:"Setting, era, tone, and world rules",defaultName:"Worldview",fallback:`[What does this world look like? The AI uses this to ground the whole story.] 13 14[Era / Setting] 15[Modern city? Medieval fantasy? Far-future space?] 16 17[Special rules] 18[Magic, superpowers, AI, political structure... what makes this world unique?] 19 20[Tone] 21[Slice-of-life chill? Cold suspense? Heroic adventure? Bittersweet healing?]`},dialogueStyle:{title:"Sample Dialogue & Style",hint:"Describe the writing style or give an example.",defaultName:"Sample Dialogue & Style",fallback:`[Speech] 22Neutral: [default voice â a full example line] 23Happy: [change] 24Annoyed: [change] 25Nervous: [change] 26Mannerisms: [fidgets, catchphrases] 27 28[Writing style] 29POV: [First-person? Third-person limited?] 30Focus: [Inner monologue / setting / action] 31Pacing: [Fast / slow / varied] 32 33[Sample scene â paste a chunk that reads like exactly what you want from the AI]`},settings:{title:"Settings",hintChat:"Optional background: past events, important items, or world rules.",hintWorld:"Background the AI needs: setting, history, or special rules. Use one entry or split it into topics.",unnamed:"Setting {{n}} · unnamed",emptyHint:"No settings yet",add:"Add setting",entryTitle:"Title",entryTitlePlaceholder:"e.g. Core setting · Power system · Location A",entryContent:"Content",entryContentFallback:`Describe this piece of setting in detail. 34 35Examples: 36- The world is ruled by 7 great sects, each with its own power system 37- Cultivation has nine tiers: Qi-gathering, foundation, golden core, infant... 38- Mortals can't see cultivator artifacts`,deleteEntry:"Delete this setting",keywordHint:"ð¡ This entry only loads into the AI context when the keywords {{keywords}} appear â avoids stuffing all settings at once. Edit triggers in the Canvas.",newName:"New setting"},advancedPromo:{title:"Canvas",bulletVariables:"Variables â track affinity, fear, trust⦠and show them as live stat bars",bulletBehaviors:'Behaviors â rules that react to state ("affinity > 80 â unlock a route")',bulletLorebooks:"Lorebook & scenarios â keyword-triggered knowledge, in groups you can tie to an opening",bulletCustomUi:"Custom UI, audio, unlimited creator notes and more",switchButton:"Switch to the Canvas",studioButton:"Try the creation assistant",studioHint:"The creation assistant can write, migrate, or polish your whole card with AI â describe what you want and let it draft the variables, behaviors and lore for you.",reimburseNote:"Creators: creation assistant costs can be reimbursed â just contact the official account."},greeting:{title:"Opening",hint:"The first message the player sees",macroUser:"is replaced with the player'
38s name",macroChar:"is replaced with the character's name",lengthHint:"100â300 words recommended",tab:"Opening {{n}}",add:"Add another opening",delete:"Delete #{{n}}",deleteConfirm:"Click again to delete",moveUp:"Move left",moveDown:"Move right",defaultBadge:"Default",multiHint:"Players land on opening 1 and can swipe through the rest â each opening is its own route.",advancedHint:"Want a different scenario or starting variables per opening? Set that up on the opening in the Canvas.",placeholderChat:`Example: 39 40The morning mist hasn't lifted, and {{user}} has lost their way at the edge of the elven forest. 41A distant harp note drifts in, as if from another century. 42 43A silver-haired figure steps out of the fog, green cloak brushing the wet moss. 44She stops three paces from you and says: 45 46"Human... this is not a place you should be."`,placeholderWorld:`Example: 47 48The alarms have been screaming for three hours. 49 50The central control room's lights flicker on and off. 51{{user}} grips a crowbar, breath fogging into a thin white plume. 52Three voices come through the comms channel â 53a mechanical baritone, a coughing engineer, 54and something else, repeating one word in a whisper. 55 56"...quarantine. quarantine. quarantine."`},description:{title:"About",hint:"What other people see when they browse Discover â one or tw
56o sentences",markdownSupported:"âï¸ Markdown supported · {{count}}/{{max}}",placeholderChat:"Example: You'll meet a mysterious elven guide, Lyra, in a misty forest. She's wary and quiet â but can you get her to lead you out?",placeholderWorld:"Example: 2147 aboard an abandoned space station, 48 hours of oxygen left. Choose between the engineer, the scavenger who broke in, and the AI that won't stop talking.",stillTemplate:"Still the template"},more:{summary:"More (marketplace, visual layer, background music, gallery, language)",switchToAdvanced:"Need finer control? Switch to the Canvas",marketplace:{title:"Marketplace",hint:"Community-made greetings, settings, components â one-click import"},css:{title:"Global CSS",hint:"Paste CSS that applies to the greeting and every AI response.",placeholder:`Example: 57 58.message { 59 border-radius: 16px; 60 background: linear-gradient(135deg, #1a1625, #2a1f3d); 61 padding: 16px 20px; 62} 63 64.message strong { 65 color: #c9a25e; 66}`,advancedConflict:"â ï¸ You modified the entry file in the Canvas â the CSS is saved in <code>{{file}}</code> but not auto-mounted. Either import it manually in the Canvas, or restore the default entry."},visual:{title:"Visual Layer",hint:"All of this card's interface code lives here. Anything installed from the marketplace gets its own group; the interface you write yourself goes in the main interface file.",userRootSubtitle:"Your main interface file",createUserRoot:"Create the main interface file",addFile:"New file",newFileName:"Filename",create:"Create",cancel:"Cancel",fileExists:"A file with that name already exists",confirmDelete:"Delete {{name}}?",confirmUninstall:"Uninstall '{{name}}'? This removes every file under it.",uninstall:"Uninstall this bundle",lines:"lines",chars:"chars",files:"files",composerNote:"Auto-generated (rewritten when bundles are installed/uninstalled â do not edit by hand)",composerShow:"View",composerHide:"Hide"},bgm:{title:"Background music",hint:"Plays on loop when the player enters this world. 30+ seconds of ambient music without a dominant melody works best.",upload:"Upload BGM",preview:"Preview",pause:"Pause",loop:"Loop",replace:"Replace",remove:"Remove BGM",namePlaceholder:"Track name",moreInAdvanced:"This world has {{count}} more BGM track(s) â manage triggers and multi-track playlists in the Canvas."},gallery:{title:"Gallery",hint:"Extra images shown when the world is published"},language:{title:"Language",hint:"Affects language filtering in Discover"}}},A={title:"Unsaved Changes",description:"Your changes will be lost if you leave without saving.",stay:"Stay",leave:"Leave without saving",saveAndLeave:"Save and leave",switchTitle:"Save before switching?",switchDescription:"Save your recent edits before switching editors â otherwise they'll be lost.",switchCancel:"Cancel",switchWithoutSaving:"Switch without saving",saveAndSwitch:"Save and switch"},S={staleWorldToast:"Couldn't save â try again in a moment",mergedToast:"Merged the assistant's edits â save again",mergedConflictsToast:"Merged â your version was kept",failed:"Couldn't save your changes",agentMergedNotice:"Merged with agent changes",coverRefreshFailed:"Cover uploaded, but the editor could not refresh. Reopen the world before adjusting the crop.",agentMergedConflictsNotice:"Merged â your version kept",mergedSavedToast:"Merged changes from elsewhere and saved",saveNow:"Save now"},T={submittedTitle:"Submitted for review",submittedBody:"We usually review within 24 hours. You'll get a notification when a decision is made.",submittedVariant_one:"{{count}} language variant is in the same review.",submittedVariant:"All {{count}} language variants are in the same review.",editableHint:`You can keep editing and saving while it's in review. Use "Update review" after saving so reviewers see it as your newest version, or withdraw to pull it out of the queue.`,updateReview:"Update review to latest version",newerChangesTitle:"You have newer changes than the submitted review",newerChangesBody:"This card is in review, but you've saved changes since submitting. Update the review so it covers your latest version, or withdraw it from the queue.",withdraw:"Withdraw from review",withdrawConfirm:"Withdraw this submission and return to draft? Your edits will not be lost.",rejectedTitle:"This submission needs revision",rejectedReason:"Reason: {{reason}}",rejectedDetail:"Note from reviewer: {{detail}}",resubmit:"Resubmit after editing",lockedToast:"In review â withdraw it to edit",editLockedToast:"This update is in review. Withdraw it to keep editing.",submitFailed:"Couldn't submit for review",submitRateLimited:"Too many submissions â wait {{minutes}} min",withdrawFailed:"Couldn't withdraw the submission",pendingEdit:{inReviewTitle:"Update in review",inReviewBody:"Your live card keeps showing its approved content; these changes go live once an admin approves them. You can keep editing anytime â any change just moves this back to a draft, no need to withdraw.",changedLabel:"Changed: {{list}}
66",withdrawBtn:"Withdraw request",lockedHint:"Withdrawing is optional â it just pulls the update out of the review queue.",rejectedTitle:"Update changes rejected",rejectedHint:"Your live card is unchanged. Edit these changes and resubmit.",resubmitBtn:"Resubmit for review",heldTitle:"Unpublished changes",heldBody:"These changes are saved but have not been submitted. Players still see the published version. Submit them for review when ready.",submitBtn:"Submit for review",editSettingsBtn:"Edit tags & settings",settingsHint:'Submitting sends only the changes listed above. "Edit tags & settings" opens the publish form, which rewrites your tags, playtime and visibility from whatever that form holds.',reasonEntries:"Lorebook entries",reasonFrontend:"Frontend / custom UI",reasonRating:"Content mode",reasonCover:"Cover image",reasonSeparator:", ",autoPublishBody:"Your changes are saved but are not live yet. Publish this update to make it available to players without waiting for an admin.",publishBtn:"Publish update"},stateControl:{chipInReview:"In review",chipInReviewNewer:"In review · new changes",chipRejected:"Rejected",chipHeldDraft:"Unpublished changes",chipNotLive:"Not live",notLiveTitle:"This version isn't live yet",notLiveBody:`What you saved is a draft â only you can see and playtest it. Click "Publish" to submit it for review; players can play it once it's approved.`,publishBtn:"Publish"},updateReviewFailed:"Couldn't update the review",heldToast:"Saved as unpublished changes. Open the publishing menu when you're ready to submit them."},I={entries:"Entries",variables:"Variables",rules:"Rules",behaviors:"Behaviors"},P={namePlaceholder:"Bundle name",descPlaceholder:"Describe what this bundle does...",editTitle:"Edit Bundle",unsaved:"Unsaved",coverImage:"Cover Image",uploading:"Uploading...",changeShort:"Change",changeCover:"Change Cover",uploadCover:"Upload Cover",fromAssets:"From Assets",imageFormats:"JPEG, PNG, GIF, or WebP",selectFromAssets:"Select from Assets",noImages:"No images in your assets",nameLabel:"Name",descriptionLabel:"Description",tagsLabel:"Tags",tagsPlaceholder:"renderer, universal, modern",bundlePublic:"Public",bundlePrivate:"Private",visiblePublic:"Visible in the Hub for everyone",visiblePrivate:"Only you can see this bundle",contents:"Contents",emptyBundle:"Empty bundle",messageRendererLabel:"Message Renderer",customRenderer:"Custom",contentManaged:"Content is managed via export from the world editor",dangerZone:"Danger Zone",deleteBundleTitle:"Delete this bundle",cannotUndo:"This action cannot be undone",areYouSure:"Are you sure?",deleteForever:"Delete Forever",saved:"Saved",bundleNotFound:"Bundle not found",nameRequired:"Name is required",failedUploadCover:"Couldn't upload cover"},N={behaviorInstr:"The atmosphere is tense. Describe the growing unease...",behaviorMsg:"Achievement unlocked!",failedParseWorld:"Failed to parse world file. Ensure it is valid Yumina JSON.",userMsg:"User message...",aiResponse:"AI response...",clickAgainConfirm:"Click again to confirm",deleteVariant:"Delete variant",playtestFailed:"Failed to create playtest session",componentRuntimeError:"Component runtime error",notFoundDraft:"Not found in current draft.",deletesListed:"This action deletes the listed item(s).",selectAll:"Select all",deselectAll:"Deselect all",failedImportWorld:"Failed to import world",visualLayer:"Visual layer",selectLanguage:"Select Language",adjustCoverCrop:"Adjust cover crop",cropSize:"Crop size",cardCover:"Card cover",galleryPreview:"Gallery preview",detailHeroPreview:"Detail banner · 16:5",crop:{hint:"Choose the crop for this artwork. The preview matches its Discover card.",dragHint:"Drag or resize the crop box",center:"Center",max:"Max",min:"Min crop box",reset:"Reset current view",save:"Save crop",phone:"Phone · 2:3",desktop:"Desktop · 16:9",framing:"Framing",wholeImage:"Whole image",fillFrame:"Fill frame",framingHint:"Covers fill their frame. Drag the crop to keep your subject visible. If the composition does not fit, upload different artwork for this format.",previewTitle:"Your world",previewDescription:"Your description appears here",previewCreator:"Creator",previewStats:"AI interactions and total playtime",previewHint:"Keep faces clear of the title, creator and save control. Statistics here are placeholders.",imageFailed:"Image could not load. Try reopening the crop editor.",placementDesktop:"Featured slot · desktop",placementPhone:"Featured slot · phone",placementHint:"Slot previews show typical desktop and phone framing; cards adapt to screen width."}},x="Choose Version",W="Select Version",D="Download Variant",R="with cover",F="data only",H="Download",E={replay:"Editor tour",skip:"Skip tour",next:"Next",start:"Let's go",done:"Finish",clickHint:"Click the glowing spot",steps:{welcome:{title:"Welcome to the Full editor!",body:`I'm Mushie! This is the workshop where world cards are made. 67Follow me for a lap â you'll try every important spot hands-on!`},nav:{title:"This is the navigation",body:"The editor has three areas: Content for your story and rules, Presentation for visuals and sound, and Publish for your card's public face. Let's go top to bottom!"},goFirstMessage:{title:"Start with the First Message",body:"The first message is what players see the moment they enter your world. Click here to open it!"},createGreeting:{title:"Create your first message",body:"Click this button to create your very first opening message!"},greetingContent:{title:"Write it here",body:"Write your opening here â {{userMacro}} stands for the player and {{charMacro}} for the character. Multiple first messages become selectable opening routes!"},goLorebook:{title:"Next: the Lorebook",body:"The lorebook holds your world's knowledge. Click here to take a look!"},kbBooks:{title:"Scenarios",body:"This column holds the card's scenarios. The card itself is the first: everything you write goes in there, and it is shared into every scenario you add later. Add one when your story needs a second place. For now, write something into the card."},entriesAdd:{title:"Add an entry",body:'Worldbuilding, character sheets, rules â you write them all as individual entries. Click "Add" to create your first one!'},entryContent:{title:"Title for you, content for the AI",body:"The name is just a label to keep yourself organized â the AI never sees it. What matters is the content: write the actual lore there. Add keywords, and the entry is only sent to the AI when the conversation touches that topic â precise and efficie
67nt."},goVariables:{title:"Now, Variables",body:"Variables track numbers that change during play. Click to check them out!"},varsAdd:{title:"Add a variable",body:'Affection, gold, quest progress â store them all as variables. The AI and your custom UI can read and write them. Click "Add variable" to create one!'},varsFields:{title:"Setting up a variable",body:'Give it a display name, pick a type (number/text/switch), and set the default value each playthrough starts with. The best part is "Behavior rules": tell the AI in plain words when and how the value should change â like "gain 5 affection on an intimate moment" â and it follows along.'},goBehaviors:{title:"Next: Behaviors",body:"Behaviors are your world's automation rules. Click here to enter!"},behaviorsAdd:{title:"Add a behavior",body:'Click "Add behavior" and create a rule!'},behaviorsDetail:{title:"How a behavior works",body:"Every behavior = When⦠(event) + If⦠(conditions) + Then⦠(actions). For example: when a variable changes, if affection reaches 100, then switch the BGM and unlock a new entry. Configure the three parts right here."},presentationSkip:{title:"Presentation: advanced stuff",body:"Custom UI, Audio and Assets under Presentation are advanced â building your card its own interface and soundtrack. Come back when you're comfortable; the Creator Guide has full tutorials. Skipping for now!"},overviewTitle:{title:"Name your card",body:"The Overview is your card's public face. The title is the first thing players see in the hub â make it a good one!"},overviewDescription:{title:"Write a description",body:"The description shows on your card's detail page and supports Markdown. Explain the gameplay and highlights so players want to click in!"},publish:{title:"Publish your world",body:"When you're ready, click here at the top right to submit for publishing. Once approved it appears in the hub for everyone to play!"},save:{title:"Remember to save",body:"Save any time here (Ctrl+S works too). A little dot on the button reminds you when there are unsaved changes."},studio:{title:"A different way to work",body:"The Canvas switch at the top left changes editors. Turn it on and the whole card is laid out on one board, every part a piece you can drag; on a desktop that is where a card opens by default, and this is the Full editor. Simple mode is in the â® menu. Switch whenever you like."},menuAdvanced:{title:"More advanced sections",body:"The menu also holds Custom UI, Audio and Assets â advanced tools for giving your card its own interface and soundtrack. Come back when you're comfortable; the Creator Guide has full tutorials!"},saveM:{title:"Remember to save",body:"Tap here at the top right to save any time. A little dot on the button reminds you when there are unsaved changes."},finish:{title:"Off you go!",body:"That's the whole lap! Hit PLAY any time to playtest your world. For a deeper dive, open the Creator Guide at the top right â and find me in the three-dot menu at the top to replay this tour. Have fun building!"},kbBooksM:{title:"Scenarios",body:"This row holds the card's scenarios. The card itself is the first: everything you write goes in there, and it is shared into every scenario you add later. Add one when your story needs a second place. For now, write something into the card."},publishM:{title:"Publish your world",body:"When you are ready, tap here to submit for publishing. Once approved it appears in the hub for everyone to play!"},menuOpen:{title:"The section menu",body:"Every area of the editor â First Message, Lorebook, Variables, Behaviors and more â lives in this menu. Tap it open!"},menuPick:{title:"Enter First Message",body:"See? These are all the areas. Let us start with First Message â tap it to enter!"},greetingWrite:{title:"Write the first line",body:"Type the opening your players will read â even one sentence is enough for now. The grey text is a writing guide; it disappears as soon as you start."},sWelcome:{title:"Welcome to the Simple Editor!",body:`I'm Mushie! This page is a short form: numbered cards from top to bottom. 68Fill in the ones marked REQUIRED and you already have a playable card. Let's walk it together!`},sCards:{title:"Cards, top to bottom",body:"Each numbered card is one part of your world. REQUIRED ones must be filled; OPTIONAL ones can wait. The list on the right jumps straight to any card."},sCharName:{title:"Name your character",body:"First, the star of the show. Replace the placeholder name with a real one â type it here!"},sPersona:{title:"Who are they?",body:"Appearance, background, personality â the grey text is a template you can follow. Concrete details beat vague adjectives: one memorable trait beats three generic ones."}
68,sWorldview:{title:"The world around them",body:"Where and when does this happen, and what are the rules? Optional, but a few lines here keep the AI consistent."},sStyle:{title:"How they talk",body:"Tell the AI how this character speaks and how you want the prose written. Sample sentences work better than descriptions."},sSettings:{title:"Extra settings",body:"Key items, past events, house rules â anything else the AI should always know. Most cards can skip this at first."},sGreeting:{title:"Write the opening",body:"The first message is what players see when they arrive â it sets the tone and length of everything after. Type your opening here, even a sentence is fine!"},sAbout:{title:"Describe your card",body:"One or two sentences shown on Discover. This is the pitch that makes people click in."},sSave:{title:"Save your work",body:"Save any time here (Ctrl+S works too). A little dot on the button reminds you when there are unsaved changes."},sPlay:{title:"Try it yourself",body:"Hit Play to test your card as a player â the fastest way to see whether the character feels right."},sPublish:{title:"Publish",body:"When you're happy, submit for publishing here. Once approved it appears on Discover for everyone to play."},sAdvanced:{title:"Need more power?",body:"Variables, behaviors, lorebooks, custom UI â switch Canvas on to unlock the full engine. Switch any time; I'll be waiting there with another tour."},sAdvancedM:{title:"Need more power?",body:"Scroll down: the Canvas unlocks variables, behaviors, lorebooks and custom UI. Switch any time; I'll be waiting there with another tour."},sFinish:{title:"You're all set!",body:`That's the simple editor! Fill in the cards, hit Play to test, publish when ready. 69Find me again in the three-dot menu at the top whenever you want a refresher.`}},skipStep:"Skip this step"},L={field_name:"World title",field_description:"Description",field_schema:"World content",field_language:"Language",field_languageGroupId:"Language group",field_variantLabel:"Version label",field_tags:"Tags",field_thumbnailUrl:"Cover image URL",field_galleryImages:"Gallery images",field_announcement:"Announcement",field_approxTime:"Estimated play time",tooLong:"{{field}} can have at most {{limit}} characters; currently {{actual}}. Shorten it and save again.",tooLongUnknown:"{{field}} can have at most {{limit}} characters. Shorten it and save again.",tooShort:"{{field}} needs at least {{limit}} characters. Fill it in and save again.",tooMany:"{{field}} can have at most {{limit}} items. Remove some and save again.",invalidType:"{{field}} has an invalid format (expected {{expected}}, received {{received}}). Check this field in the imported file.",fieldError:"{{field}}: {{reason}}",tooLarge:"This world is too large to save (limit: {{limit}} MB). Move large embedded assets to the Asset Library. Your edits are still here.",tooLargeMeasured:"This world needs {{actual}} MB to save; the limit is {{limit}} MB. Move large embedded assets to the Asset Library. Your edits are still here.",sessionExpired:"Your session expired. Sign in again to save. Your edits are still here.",forbidden:"You do not have permission to save this world. Check that you are signed in to the owner's account.",notFound:"This world no longer exists, or you no longer have access to it. Your edits are still here.",rateLimited:"Too many save requests. Wait a moment and save again. Your edits are still here.",serverUnavailable:"The server is temporarily unavailable (HTTP {{status}}). Try saving again shortly. Your edits are still here.",network:"Could not reach the server. Check your connection and save again. Your edits are still here.",unexpected:"An unexpected error stopped the save. Your edits are still here; please try again.",failed:"Failed to save (HTTP {{status}}). Your edits are still here; please try again.",accountRestricted:"Your account is restricted. You cannot create new worlds.",rateLimitedSeconds:"Too many save requests. Wait {{seconds}} seconds and save again. Your edits are still here."},M={rejectReasons:{inappropriate_content:"Inappropriate content",sexual_minors:"Sexual content involving minors",hate_or_harassment:"Hate speech or harassment",copyright_infringement:"Copyright infringement",mislabeled_age_rating:"Content mode mislabeled",mislabeled_audience:"Target audience mislabeled",low_quality:"Low quality / empty",broken_or_unplayable:"Broken or unplayable",duplicate:"Duplicate of existing world",metadata_issue:"Cover / description / tags issue",other:"Other (must explain below)"}},B={button:"Insert image or video",upload:"Upload from computer",library:"From assets",uploading:"Uploadingâ¦",failed:"Upload failed: {{name}}"},O={hintLabel:"Unlock hint",hintHelp:"What players see in the gallery before this picture is revealed. A tease, not a spoiler.",hintPlaceholder:"e.g. W-What the meow?!",learnMore:"Creator Guide â",uploadFiles:"Upload from computer",dropHint:"Drop images here to add several at once",uploading:"Uploading {{done}}/{{total}}â¦",uploadFailed:"Upload failed: {{name}}
69",title:"Scene Images",description:"Pictures sent into the story. Give each one a sentence saying when to send it and the AI follows it: every reply that meets the condition carries the image.",addImage:"Add Image",searchPlaceholder:"Search images...",noImages:"No scene images yet",noImagesDesc:"Upload a picture, describe the moment it belongs to, and the AI will show it when the story gets there.",noImagesMatch:'No images match "{{query}}"',back:"Back",unnamed:"Untitled image",nameLabel:"Title",namePlaceholder:"e.g. Minyu startled",delete:"Delete",idLabel:"Image ID",idHelp:"âCopy codeâ gives you the full tag. Paste it into a first message or an entry and the image appears there.",copyId:"Copy ID",copyCode:"Copy code",copyFailed:"Copy failed",imageSource:"Image",urlLabel:"URL or asset ID",urlPlaceholder:"https://... or @asset:id",browseAssets:"Browse Assets",sceneLabel:"When to show it",scenePlaceholder:"e.g. The cat Minyu gets startled and jumps",allowAi:"Let the AI show this image",scopeLabel:"Openings",scopeHelp:"Limit this image to certain first messages.",scopeAll:"Every opening",scopeNoGreetings:"Add first messages to scope images per opening.",greetingFallback:"Opening {{index}}",emptyNoImages:"Add an image to get started",emptySelect:"Select an image to edit",modeTitle:"Who places the images",modeJudge:"After each reply",modeJudgeHelp:`After every reply, each image's "when to show it" condition is checked and the image is placed at the end of that reply when it holds. A condition like "after every reply" sends it every turn. Works the same whichever model the player uses.`,modeNarrator:"Story AI inserts them",modeNarratorHelp:"Images can land between paragraphs, but only if the model follows instructions. Some models almost never do.",modeRecommended:"Recommended",modeLocked:"Smart tracking is off in Overview, so the story AI inserts images itself.",autoCount:"{{on}} of {{total}} show automatically",autoHelpJudge:'Write the condition for sending it; it is followed literally. For example "when the two sit across from each other in the café" or "after every reply". Every reply that meets it ends with this image, even if it was shown before.',autoHelpNarrator:'Write the condition for sending it; it is followed literally. For example "when the two sit across from each other in the café" or "after every reply". When it holds, the story AI inserts the image into the text.',autoOn:"On: sent automatically when its condition is met",autoOff:"Off until you write a sentence. Without one, it only appears where you paste its code.",autoNoPicture:"Add a picture and it will show automatically.",autoHeld:"Automatic showing was turned off, so this image only appears where you paste its code.",autoReenable:"Turn back on",autoBadgeTitle:"Sent automatically when its condition is met",modeJudgeShort:"After each reply",modeNarratorShort:"Story AI inserts"},_={characterLabel:"Voice",characterHint:"The voice this character's lines are read in when the player turns on voice readout. Leave it unset and the AI picks one to fit the character.",custom:"Custom voice",customGroup:"Custom voices",useCustom:"Use",customHint:"Your custom voices from Settings ⺠Voice, or paste any fish.audio voice ID. Players hear it when they turn voice readout on.",clear:"Clear",cardTitle:"Voice",cardDesc:"Voice readout and voice input on this card",narratorLabel:"Narrator voice",narratorHint:"Narration is read in this voice. Unset uses the player's own voice.",narrator:"Narrator voice",character:"Voice for {{name}}",follow:"Player's own setting",followHint:"This card does not decide; the player's choice in settings applies",preview:"Preview",hint:"Readout switches voice by speaker; a character without one reads in the narrator's, and if there is no narrator voice, in the player's own.",inputTitle:"Player voice input",inputHint:"When the player lets go of the mic. Werewolf, interrogation and the like suit sending right away",inputConfirm:"Review first",inputAuto:"Send right away",lang:{zh:"Chinese",en:"English",ja:"Japanese",es:"Spanish"},gender:{female:"F",male:"M"},close:"Close"},U={entries_one:"{{count}} entry",entries_other:"{{count}} entries",variables_one:"{{count}} variable",variables_other:"{{count}} variables",behaviors_one:"{{count}} behavior",behaviors_other:"{{count}} behaviors",components_one:"{{count}} component",components_other:"{{count}} components",empty:"Empty"},V={title:"Update â{{name}}â?",fromFile:"From the file {{file}}",fromCopy:"From {{name}}âs edited copy of your card",pickTarget:"This file matches more than one of your cards. Update which one?",statusPublished:"Published",statusDraft:"Draft",exactOrigin:"downloaded from this one",comparing:"Comparing with your cardâ¦",diffFailed:"Couldnât compare with your card. You can still update it â a backup is kept.",noChanges:"Nothing to update: this is the same as your card.",summary:"{{added}} added · {{modified}} changed · {{removed}} removed",more:"and {{count}} more",changedSinceCopy:"Youâve edited your card since they copied it. Updating replaces those edits too â they stay in the backup.",backupLine:"Your card
69is backed up first. Restore it any time from Version history.",publishedLine:"Your card is published, so this goes into its working copy. Submit it for review as usual to put it live.",apply:"Update â{{name}}â",saveAsNew:"Keep as a new project instead",applied:"Updated â{{name}}â",appliedHeld:"Updated the working copy of â{{name}}â. Submit it for review to put it live.",backupNoteFile:"Before applying {{file}}",backupNoteCopy:"Before applying {{name}}âs changes",error:{otherWorldUnsaved:"Another card has unsaved changes in the editor. Save it first, then try again.",backup:"Couldnât back up your card, so nothing was changed. Try again.",load:"Couldnât open your card. Nothing was changed.",save:"Couldnât save the update. Your card is unchanged, and the backup is in Version history."}},G=JSON.parse(`{"notes":{"fold":"Fold","unstick":"Unstick","stuckTo":"Stuck to {{count}}"},"replyRules":{"hide":"Hide","toEvent":"A story event","toChannel":"An interface channel","toFields":"Each \\"name: value\\" into that variable","toNothing":"Nowhere","byPattern":"Pattern","byTag":"Tag <â¦>","speakerBubbles":"A bubble per speaker (lines that open with a name)","title":"Reply processing"},"aiCustom":{"randomChoice":"If it still fails, pick a random allowed option","cooldown":"Cooldown (seconds)","fallbackPlaceholder":"Fallback lines, one per line (one is picked at random)","retries":"Retries","timeout":"Wait (seconds)","onError":"When it fails","sayNone":"Only back to the interface","sayChannel":"An interface channel","sayStory":"Into the story","say":"Where its words go","hintPlaceholder":"What this field means (for the AI)","optionsPlaceholder":"Allowed answers, separated by commas","op":{"push":"Add to list","add":"Add","set":"Set to"},"toVariable":"Variable {{name}}","toEvent":"A story event","toSay":"Its words","toNothing":"Only returned","type":{"list":"List","choice":"One ofâ¦","number":"Number","text":"Text"},"outputText":"One piece of text. Add fields to get JSON back.","output":"Answer","piecePlaceholder":"Added to its prompt while the condition holds","when":"When","pieces":"Prompt pieces (only while true)","ownThread":"Remembers its own past answers","history":"Recent messages it reads","addVariable":"+ a variable","sees":"What it sees","title":"Answer format"},"aiType":{"code":"Code-based","ui":"UI-based","turn":"Turn-based","custom":"Custom"},"placeAis":{"jobUi":"when the player interface calls it","off":"off","defaultName":"AI","title":"AI","group":"Group chat · they answer in turn","add":"Add an AI here","open":"Open settings","narratorStays":"the card's AI carries on here","narratorAway":"the AIs below answer here instead","keepNarrator":"Card's AI too","dropNarrator":"Card's AI out","memAll":"remembers the whole conversation","memRecent":"last {{n}} messages","memPool":"shares memory with {{names}}","memOwn":"remembers only what was said here","memOwnArchive":"remembers only what was said here · summed up on leaving","memReads":"reads the last {{n}} messages","memNothing":"nothing wired in","linkReceives":"gets what {{names}} writes","linkWrites":"writes for {{names}}","linkWritesNobody":"no AI reads what it writes yet","jobEveryTurns":"behind the scenes · every {{n}} turns","jobAfter":"behind the scenes · after an AI answers","jobConditions":"behind the scenes · when a value meets a condition","jobClosed":"behind the scenes · when a scenario ends","jobBehind":"behind the scenes","codeCallName":"Interface code · {{file}}","jobFromCode":"called from the interface code · {{file}} line {{line}}","jobFromCodeHere":"called from the interface code in this scenario","memLoreMatched":"reads entries by keyword","memLoreAll":"reads every entry","memLoreNone":"reads no entries","linkReadsModules":"limited to {{names}}","linkPicksModule":"picks one of {{names}} at runtime","jobImplemented":"implemented in interface code · {{file}} line {{line}}","jobUnimplemented":"not implemented yet"},"gameData":{"readBy":"Read by","aiReads":"Game data it reads","fields":"What it reports","code":"The line in the game code","copy":"Copy","copied":"Copied","deleteConfirm":"Delete the game data â{{name}}â? The AIs reading it will stop getting it.","newName":"Game data"},"roster":{"narrator":"Narrator","judge":"Precise tracking","job":{"reply":"Replies to the player","quiet":"Speaks up when it is quiet","writesFor":"Writes for {{names}}","writesForNobody":"No AI reads what it writes yet","judge":"Decides whether values change"},"where":{"card":"Whole card","elsewhere":"Everywhere else","behind":"Behind the scenes"},"voice":{"reply":"Replies to the player","quiet":"Speaks up when it is quiet","behind":"Works behind the scenes"},"form":{"title":"Add an AI","name":"Name","namePlaceholder":"e.g. Innkeeper","to":"Its job","when":"When it's there","always":"Always","byWords":"When the player says certain words","enterPlaceholder":"Words that bring it in, e.g. backyard, cellar","leavePlaceholder":"Words that send it away, e.g. go back (optional)","task":"What it does","taskPlaceholder":"e.g. Boil the recent conversation down to three lines: who owes whom what.","reads":"It reads the last {{n}} messages.","every":"Every","everyUnit":"turns","writesFor":"Writes for","writesForLater"
69:"Not yet","noReaders":"The narrator can not read what an AI behind the scenes writes. Add an AI that replies to the player first, so someone reads it.","create":"Add","cancel":"Cancel","alwaysReply":"It always replies","quietTaskPlaceholder":"e.g. When the player goes quiet for a while, find a reason to say something.","namePlaceholderReply":"e.g. Upstairs scenes, Battle narrator","newName":"New AI","namePlaceholderQuiet":"e.g. Small talk","namePlaceholderBehind":"e.g. Memory compression"}},"aiFrame":{"live":"Live · {{name}}","always":"Always used","cardLine":"AI: narrator · replies to the player","receives":"Receives","fromCard":"This card","fromPlaces":"Scenarios","lore":"{{n}} entries","vars":"{{n}} values","recent":"last {{n}} messages","in":{"memory":"past runs","worker":"writes to it","variables":"values","transcript":"conversation","memoryAny":"Every scenario's past runs","workerAny":"Every behind-the-scenes AI","variablesAny":"Every scenario's values","transcriptAny":"Every scenario's conversation"},"nothing":"Nothing wired in; it will make things up","writesFor":"Writes for {{names}}","gives":"Here, goes to: {{names}}","noTask":"No task yet, so it does nothing","shadowed":"{{name}} always replies first, so it never gets a turn","cardTaken":"AI: narrator · {{name}} replies instead"},"aiForm":{"hookUi":"Call it from a button in the Player interface","type":"Type","voice":"Its job","runWhen":"When it runs","where":"Where it is","whereCard":"The whole card (always there)","whereNone":"Not placed (off)","remove":"Remove this AI","run":{"reply":"Every time the player speaks, it replies","quiet":"After a quiet spell, it may cut in","turns":"Every few turns, behind the scenes","conditions":"When a value meets a condition","after":"Right after another AI replies","module-closed":"When a scenario ends"},"when":"When it is used","self":"Only it knows","makeOwn":"Give this scenario its own AI","toPlace":"Remove this AI and make it a plain scenario"},"aiTable":{"view":"AI table","title":"AI table","close":"Close","thing":"Entries and values","where":"Where","card":"This card","lore":"Entries","vars":"Values","writings":"Written by other AIs","writing":"Written by {{name}}","unnamed":"Unnamed entry","knows":"Knows","keyword":"When mentioned","whenThere":"In {{place}}","only":"Only it","no":"Doesn't know","sees":"Sees","tracked":"Sees (precise tracking changes it)","changes":"Can change","gets":"Receives","writer":"Writer","legendOwn":"Pink: only it, or it receives","legendCond":"Gold: only in a scenario, or when mentioned","legendNo":"Grey: doesn't know"},"frame":{"collapse":"Collapse","expand":"Open","members_one":"{{count}} item","members":"{{count}} items","cardFrame":"This card","membersSplit":"{{own}} own · {{shared}} shared","stripDrop":"Drop here = shared with every scenario","dropOwn":"Drop here · only in â{{name}}â","dropMove":"Move to â{{name}}â","dropSame":"Already here","shelf":{"lore":"Lore","state":"Variables","behavior":"Behaviors","opening":"Openings"},"shelfAdd":"Add {{what}}","memory":{"card":"Memory · whole card","own":"Memory · its own","pool":"Memory · with {{names}}","hint":"Open the scenario to change who it shares memory with","background":"Background"},"readiness":"{{done}}/{{total}} ready","readinessNext":"Next: {{label}}"},"scene":{"none":"No scene of its own","bare":"No screen of its own yet â the default chat","pick":"Pick a file","edit":"Edit","editHint":"Open this file","desktop":"Preview at desktop width","phone":"Preview at phone width","device":"Preview device","deviceDesktop":"Desktop","devicePhone":"Phone"},"loose":{"badge":"Not in play","hint":"drag it onto the card or into a scenario to use it","shareAll":"Put on the card","newTag":"new","dropHere":"Let go · leave it outside (not in play)"},"tools":{"open":"Player interface","voice":"Narrator voice","upload":"Upload","generate":"Generate","market":"Market"},"voice":{"narrator":"Narrator voice","character":"Voice for {{name}}","follow":"Player's own setting","followHint":"This card does not decide; the player's choice in settings applies","preview":"Preview","hasVoice":"Has a voice","hint":"Readout switches voice by speaker; a character without one reads in the narrator's, and if there is no narrator voice, in the player'
69s own.","inputTitle":"Player voice input","inputHint":"When the player lets go of the mic. Werewolf, interrogation and the like suit sending right away","inputConfirm":"Review first","inputAuto":"Send right away","lang":{"zh":"Chinese","en":"English","ja":"Japanese","es":"Spanish"},"gender":{"female":"F","male":"M"}},"look":{"layout":"Layout","theme":"Theme","editInterface":"Edit interface","custom":"Custom interface","replaceTitle":"Switch to â{{name}}â?","replaceBody":"â{{name}}â replaces your whole current interface â the parts and pages you arranged are swapped out, and the variables this layout uses are added. If you don't like it, Ctrl+Z undoes it.","replaceConfirm":"Replace interface","title":"Layout and theme","button":"Look"},"view":{"lock":"Hold the view","locked":"View locked","lockHint":"Lock the view: selecting, adding and jumping no longer move the board (Shift+L)","unlockHint":"Unlock: the board follows the selection again (Shift+L)","tidy":"Tidy up","tidyHint":"Put every dragged frame back into the automatic layout","menu":"View"},"station":{"activityStatus":{"ready":"done","pending":"running","failed":"failed","open":"open now"},"activityWorker":"What it has written","activityRuns":"Archived runs","activityRefresh":"Reload","activityEmpty":"This AI did nothing in your most recent playthrough.","problem":{"worker.noTask":"No task written, so this AI will never run.","worker.noTrigger":"No \\"When it runs\\" chosen, so this AI will never run.","worker.noInputs":"Nothing is wired into this writer, so it runs on its own entries alone â whatever it reports, it will have invented.","trigger.noClosingModules":"No scenario on this card archives, so âwhichever scenario just closedâ never arrives.","input.anyUnsupported":"This kind of wire cannot read âevery scenarioâ â name one.","input.anyNoArchiving":"No scenario on this card archives, so this wire has no past runs to carry.","input.anyNoWorkers":"There is no other background writer on this card, so this wire is empty for now.","trigger.sourceMissing":"The scenario that was meant to wake it is gone.","trigger.afterNotAnAi":"The AI it waits for does not reply to the player, or is gone; it will never wake.","trigger.sourceNeverCloses":"â{{name}}â never archives, so it has no moment of closing to wake this.","input.sourceMissing":"This wire points at a scenario that no longer exists.","input.self":"This wire points back at this scenario.","input.coreOnlyVariables":"Only a variables wire can point at the card itself.","input.memoryFromNonArchiving":"â{{name}}â does not archive on close, so it has no past runs to give.","input.transcriptFromNonArchiving":"â{{name}}â is not an archiving narrator, so it has no span to read.","input.workerFromNonWorker":"â{{name}}â is not an AI working behind the scenes, so it writes nothing.","input.workerNeverRuns":"â{{name}}â still needs a task or a trigger, so this wire is empty for now.","ai.unplaced":"Not placed anywhere, so it never speaks. Pick the card or a scenario under Where it is.","ai.placeMissing":"The place it lives in is gone, so it never speaks.","narrator.shadowed":"Only one narrator speaks at a time and â{{name}}â comes first, so this one is never used."},"problemsTitle":"This wiring cannot work","triggerConditions":"When a condition becomes true","triggerConditionsHint":"These conditions decide when the writer runs: once, on the falseâtrue edge, not every turn they stay true.","model":"Model","modelInherit":"Follow the player's choice","modelHint":"Falls back to the player's own model when they cannot run this one, so a card is never unplayable.","inputs":"Wired in from elsewhere","inputKind":{"memory":"A scenario's past runs","worker":"What an AI behind the scenes wrote","variables":"A scenario's variables","transcript":"A scenario's raw words"},"core":"Shared (whole card)","asHistory":"Lived it","asLore":"Archive","transcriptLimit":"At most","addInput":"ï¼ Wire one in","noOtherModules":"This card has only this scenario â nothing else to wire in yet.","inputsHint":"âLived itâ = the protagonist was there. âArchiveâ = a re
69cord they looked up. Raw words are expensive; prefer past runs.","inputsSummary":"The card itself + {{count}} wired in","inputsNone":"Only the card itself; no other scenario wired in yet","inputsEdit":"Edit","inputsDone":"Done","onClose":"When the player leaves","onClose_archive":"Archive and summarise","onClose_keep":"Keep it","onCloseHint_archive":"The span leaves the AI's context and becomes one summary; the player's transcript keeps every word. Re-activating starts clean.","onCloseHint_keep":"The span stays in context like ordinary history.","archivePromptPlaceholder":"Anything the summary must keep? e.g. âhow they died, what they learned, who they oweâ","trigger":"When it runs","triggerNever":"Never on its own","triggerClosed":"When a scenario closes","triggerTurns":"Every N turns","everyTurns":"Every","triggerHint":"âWhen a scenario closesâ is the usual one: a dungeon ends, this reads it and writes for the next scenario.","any":{"closed":"Whichever scenario just closed","memory":"Every scenario's past runs","worker":"Every other writer"},"task":"What it does","taskPlaceholder":"e.g. Compress the run that just ended into three lines â causes and debts only â for the next dungeon's narrator.","taskHint":"The scenario's own entries are who it is; this is the job. With no task it does not run.","takeOver":"This scenario runs the conversation itself","takeOverHint":"While it is on, its own AI answers the player â its own model, its own memory. Leave this off and the scenario just hands its lore and variables to whoever is narrating. That is what almost every scenario is.","makeWorker":"Or have it work behind the scenes instead, never speaking to the player","isWorker":"A background writer","isWorkerHint":"Never speaks to the player. Runs when its trigger fires and what it writes becomes context for the scenarios that do speak.","stopBeingWorker":"Make it a plain scenario","badge":{"narrator":"Runs the conversation","worker":"Background writer"},"badgeHint":{"narrator":"While this scenario is on, its own AI answers the player.","worker":"Runs in the background and writes context for the others."},"history":"Memory","historyHint_shared":"Reads the whole conversation, like every scenario always has.","historyHint_own":"Inside, the AI sees only what was said in this scenario. What is said here still joins the shared transcript, so every other place remembers it once you leave.","pool":{"card":"Whole card","own":"Its own pool","with":"Share this pool with","none":"No other scenario narrates yet.","hint":"Scenarios in one pool remember each other's runs and nothing from outside it. Everything stays in the transcript, and the card's own AI still sees it all.","selectAll":"Select all","selectNone":"Select none"},"historyLimit":"This narrator reads","historyLimitCard":"Same as the card","triggerQuiet":"After a quiet stretch","afterWho":"After â{{name}}â replies","afterPick":"Pick an AI that replies to the player","triggerAfter":"Right after another AI replies","quietSeconds":"Nobody speaks for","quietSecondsUnit":"seconds","triggerQuietHint":"While the game is open, this scenario is active and nothing has been said for this long, it decides whether to step in with a line, and may change values. If there is nothing worth saying it stays silent. Billed per call.","isQuietHint":"Woken after a quiet stretch; it decides whether to step in with a line or change values, and stays silent otherwise."},"addGreeting":"Opening","emptyCta":"Write the first opening","moduleDisabled":"Off","kinds":{"module":"Scenario","variable":"Variable","greeting":"Opening","entry":"Entry","rule":"Behavior","event":"Event","component":"Frontend","audio":"Audio","image":"Scene image","world":"Card"},"nodes":{"coreEntries":"Shared entries","frontend":"Card frontend","emptyContent":"(empty - click to write)","coreEntriesHintShort":"Always-on lore without wires","frontendHintShort":"The player-facing app","moduleEntries":"Scenario entries","moduleEntriesHintShort":"Always-on scenario lore without wires","untitledCard":"Untitled card","assets":"Assets","frontendReadsShort":"reads {{count}} variable(s)","ruleUnreadable":"Broken","ruleUnreadableTitle":"This behavior is missing part of itself","ruleUnreadableBody":"Something wrote it in a shape this version can't read, so it never runs and the canvas can't draw its wires. Open Behaviors to rewrite or delete it."},"events":{"clockEvery":"Every few seconds","playerInput":"Player input","eachTurn":"Each turn","sessionStart":"Session start","aiReply":"AI reply","stateChanged":"State changed","actionFired":"Button action"},"defaults":{"module":"New scenario","variable":"New variable","behavior":"New behavior","greeting":"New opening","entry":"New entry","worker":"New writer"},"insp":{"persistPlayer":"Kept across playthroughs (for this player)","code":"Code (runs in the card while playing)","elseMessagePlaceholder":"Not enough gold â {param.price} needed","elseMessage":"If the conditions don't hold, say","formulaPlaceholder":"e.g. Base attack * (1 + Level * 0.1)","formula":"Formula (worked out automatically)","sce
69neImageIntro":"Upload a picture and write when to show it. When the story gets there, it appears on its own.","deleteSceneImageConfirm":"Delete scene image \\"{{name}}\\"? The AI will no longer be able to show it.","name":"Name","note":"Sticky note","notePlaceholder":"What IS this scenario â a memo for yourself and the AIâ¦","noteHint":"The shared blackboard: the creation assistant reads this to understand the scenario, and can update it too. The AI never sees it during play.","content":"Content","openingText":"Opening text","openingPlaceholder":"The first message the player sees...","keywords":"Keywords","keywordsPlaceholder":"comma, separated","type":"Type","default":"Default","module":"Scenario","core":"Shared (always on)","sharedAll":"Shared with every scenario","openFull":"Open full editor","when":"When","effects":"Effects","effectCount_one":"{{count}} effect","effectCount":"{{count}} effects","enabled":"Enabled","deleteModule":"Delete scenario","deleteConfirm":"Delete scenario \\"{{name}}\\"? Its members become Shared (nothing else is deleted).","readOnly":"Read-only view.","coreEntriesHint":"Lore entries with no wires and no scenario live here, always on. Open the Lorebook to browse and edit them.","frontendHint":"The card frontend (TSX app). LoreSlot ports on this node accept wires from entries.","chainHint":"A chain wire: the upstream behavior emits an event this behavior listens for. Edit either behavior to change it â the wire itself can't be deleted.","logicLabel":"Condition logic","moduleEntriesHint":"These entries belong to this scenario and have no wires â they activate together with the scenario. Open the Lorebook to browse and edit them one by one.","delete":"Delete","deleteGreetingConfirm":"Delete opening \\"{{name}}\\"?","deleteEntryConfirm":"Delete entry \\"{{name}}\\"? Wires that reference it disappear too.","deleteVariableConfirm":"Delete variable \\"{{name}}\\"? Conditions and effects that reference it stop working.","deleteBehaviorConfirm":"Delete behavior \\"{{name}}\\"?","resize":"Drag to resize · double-click to reset","cardName":"Card name","cardDescription":"Short description","openAssets":"Asset library","ownedHint":"This wire is part of the card's structure â it can't be removed.","frontendReads":"Reads {{count}} variable(s) from the card's state.","frontendDynamicReads":"{{count}} more read(s) use a computed key, so they can't be shown as wires.","whenOpen":"When it's used","whenOpenHint":{"always":"On for the whole game.","conditions":"On while the variables say so. Wire a variable to this scenario to set the test, then click the wire to edit it.","greeting":"On only in games that started from one of the openings below.","manual":"No automatic rule â the Enabled switch below decides.","keywords":"Opens when the player says it and stays open until they say one of the leave words below."},"noOpenings":"This card has no openings yet, so nothing can turn this scenario on.","openingN":"Opening {{n}}","keywordPlaceholder":"a word that opens it, then Enter","leaveWordsLabel":"Leaves when the player says","leaveWordsPlaceholder":"e.g. back to the shop, outside","keywordExclusive":"Opening it closes other word-opened scenarios","shareModule":"Share this scenario","sharingModule":"Packingâ¦","sharedModule":"Saved to your bundles","shareModuleEmpty":"Fill it with something first â a scenario with nothing in it is not a thing to hand anybody.","conditionsWired":"{{count}} condition wired in â draw a variable at this entry to add one, click the wire to edit it.","varWhenExposed":"When the AI can see it","varWhenExposedHint":"The value always exists; this decides when it is in the prompt.","varInternal":"Engine only","varInternalHint":"Hidden from the AI and from the behavior pickers. For values the card keeps for itself.","liveCanon":"Lore Shift","allowLiveCanon":"Allow session editing","allowLiveCanonHint":"When on, players with the Lore Shift extension can change the entries and variables you marked as allowed, in their own playthrough only. Your card stays the same.","allowLiveCanonAdditions":"Allow new session lore","allowLiveCanonAdditionsHint":"When on, those players can also add new entries to their own playthrough, like a new character. What they add ranks below what you wrote.","liveCanonSaveFailed":"Could not save the Lore Shift settings. Try again.","liveCanonEntryEditable":"Players may edit this lore in a session","liveCanonEntryEditableHint":"Lets players with Lore Shift change this entry's text in their own playthrough. How it is sent, its triggers and your card stay as they are.","liveCanonVariableEditable":"Players may edit this value in a session","liveCanonVariableEditableHint":"Lets players with Lore Shift change this value in their own playthrough, like setting gold to 999. Only their playthrough; it takes effect next turn.","noVariables":"This card has no variables to stop on yet.","reachesPrompt":"When the AI reads it","belonging":"Where it belongs","startsAt":"Starts at","aiUse":"What the AI does with it","whenFires":"When it fires","editCanvasContent":"Edit text on canvas","variableName":"Variable name","typeHint":{"number":"Numbers such as health 100 or affection 20, which can increase or decrease.","string":"Text such as a character name or current location.","boolean":"A switch, such as whether the player has a key: true or false.","json":"Structured data such as an inventory list or a set of character attributes."},"openMemory":"Play memory","openModuleSettings":"Scenario settings","contextTitle":"What the AI reads","historyLimit":"Conversation history","historyAll":"Everything that fits","historyLatest":"Latest N","historyLatestCount":"How many re
69cent messages","historyWindow":"Window","historyLatestShort":"Latest N","historySummaryShort":"Summary + latest N","historySummaryHint":"Turns that leave the window are not lost: they fold into a running summary, sent ahead of the history.","summaryFocus":"What the summary must keep","summaryFocusHint":"One line to the summariser about what cannot be lost â relationships, promises, debts, the clock.","summaryFocusPlaceholder":"e.g. Keep every promise made, and who owes whom.","summaryCost":"The summary updates in the background on a cheap model; a typical update costs the player well under 1 mushie. Players can read and edit it in the Memory panel.","pinnedNote":"Pinned note","pinnedNoteHint":"A line placed near the end of the history on every turn, where the AI's attention is strongest. Style reminders and standing rules live well here.","pinnedNotePlaceholder":"e.g. Stay in second person. End every reply on an open beat.","pinnedDepth":"Messages from the end","pinnedDepthHint":"0 = after the newest message, 1 = just before it.","budget":"Context budget","budgetValue":"About {{tokens}} tokens","budgetAuthor":"this card's setting","budgetPlayer":"the player's setting","budgetLock":"Lock to this card","previewTitle":"What the AI reads each turn","previewHint":"In the order it is assembled. Counts are the board's estimate.","previewLore":"{{count}} always-on entries","previewExamples":"{{count}} example dialogues","previewSummary":"Summary of earlier turns","previewHistoryLatest":"History: latest {{count}} messages","previewTriggered":"{{count}} entries wait for a keyword or condition","previewVars":"{{count}} variables","scanDepth":"Keyword scan depth","scanDepthHint":"How many recent messages a keyword may appear in to bring its entry in.","recursionDepth":"Cascading triggers","recursionDepthHint":"An entry that comes in can trigger others, this many levels deep. 0 = off.","variablesToAi":"Variables shown to the AI","variablesToAiHint":"All: every readable variable, every turn. Only changed: just the ones that moved off their default. None: no state block at all â the interface's business.","variablesAll":"All","variablesChanged":"Only changed","variablesNone":"None","continuityOn":"On","cardAiTitle":"This card's AI","openContext":"Open Context settings","historyLimitHint":"How many earlier messages the AI sees each turn. \\"All within budget\\": as much as fits, dropping the oldest only when it runs out. \\"Latest N only\\": cheaper, but the AI forgets older events. Entries and memory are unaffected, and the chat log itself is never lost.","contextLock":"Lock the context budget to this card","contextLockHint":"How much the AI can read each turn (the context budget) follows your card's setting (about {{tokens}} tokens now), and players can't change it in their own settings. Off: each player decides. Their plan and the model's own limit still apply.","openSharedModule":"Open your bundles","whatItIs":"What it is","range":"Range","showOnScreen":"Show on the player screen","displayOnly":"Display only. Variable data is kept.","onScreen":"On the player screen","showOnScreenLine":"{{name}}: ","shownOnScreen":"â{{name}}â is on the player screen's chat page","rangeTo":"to","rulesPlaceholder":"When it goes up and when it goes down, in one sentence","liveCanonLoadFailed":"Could not load the Lore Shift settings.","deleteTrackConfirm":"Delete the track \\"{{name}}\\"?","more":"More","situationWhat":"This is a scenario, like a card inside the card: what you put in only applies while it's active. Things dragged out turn faded and stop applying. When it's active is set below.","situationCardAlways":"The card's own content applies in every scenario, so there's no need to put it in here.","situationAdvanced":"Advanced","unplaced":"Outside (not in play)","openPage":"Open full page","playtestSaveFirst":"Save this card first to playtest it.","playtestNoSession":"The playtest could not start. Please try again.","frontendFiles":"Files","frontendAiCalls":"AI calls in the code","frontendUses":"Platform features used","frontendFileLine":"{{lines}} lines","varFields":"What is inside","varFieldsHint":"List the fields inside the json and who writes them.","varFieldAdd":"Add a field","varFieldPath":"Path (weather, or drama.actors)","varFieldType":"Type","varFieldWriter":"Written by","varFieldWriter_ui":"interface code","varFieldWriter_ai":"AI directives","varFieldWriter_behavior":"a behavior","varFieldWriter_ai-call":"a custom AI call","varFieldWriterAny":"not said","varFieldRemove":"Remove this field"},"addModule":"Scenario","addVariable":"Variable","addBehavior":"Behavior","addInterface":"Player interface","autoLayout":"Formation","searchPlaceholder":"Search names, text, IDsâ¦","searchEmpty":"No matches","focusMode":"Focus mode â the canvas fills the studio","exitFocus":"Exit focus mode","logic":{"all":"ALL","any":"ANY"},"legend":{"title":"What the lines mean","activation":"Scenario activation","seed":"Opening seed","gate":"Entry gate","write":"Variable write","chain":"Emit chain","audio":"Audio","ui":"UI binding","event":"Event trigger","uiRead":"Read by the UI","close"
69:"Close"},"newModuleName":"New scenario","emptyHint":"This card is empty.","activation":{"always":"Always","manual":"Only the Enabled switch","conditions":"When a variable meets a condition","greeting":"When entering from a chosen opening","keywords":"When the player says certain words","workerNotice":"A writer runs on the trigger below."},"inspector":{"title":"Wire","operator":"Operator","value":"Value","seedValue":"Starting value","apply":"Apply","remove":"Remove"},"ports":{"write":"write","read":"value","gate":"gate","show":"show","trigger":"trigger","effect":"effect","select":"pick","seeds":"seeds","activate":"activate","fires":"fires","openings":"openings","opening":"belongs to"},"zoomIn":"Zoom in","zoomOut":"Zoom out","zoomReset":"Reset to 100%","fitView":"Fit everything","copySuffix":" copy","deletedSituation":"Deleted â{{name}}â; what was in it is back on the card","deletedSituationEmpty":"Deleted â{{name}}â","deletedMany":"Deleted {{count}} items","notePlaceholder":"Note to selfâ¦","menu":{"voice":"Voiceâ¦","portrait":"Portraitâ¦","addNote":"Sticky note","copy":"Copy","paste":"Paste","duplicate":"Duplicate","moveTo":"Move to","toFront":"Bring to top","inspectWire":"Inspect wire","shareAll":"Share with every scenario","onlyIn":"Only in â{{name}}â","add":"Add"},"live":{"badge":"Live","on":"Active","off":"Dormant"},"addEntry":"Setting entry","deadRead":"Never changes","deadReadHint":"The UI reads this variable, but no behavior, opening or the AI can ever write it â the player will watch a number that never moves.","readByUiHint":"Read by the card's frontend.","turn":{"added":"new","changed":"changed","title":"The assistant's last turn","summaryAdded":"{{count}} added","summaryChanged":"{{count}} changed","summaryRemoved":"{{count}} removed","undo":"Undo this turn","dismiss":"Got it","undoFailed":"Undo didn't go through â the card is unchanged."},"links":{"in":"{{count}} wire(s) in","out":"{{count}} wire(s) out"},"cost":{"alwaysOnHint":"Ships on every turn â this is recurring context cost","keywordHint":"Only sent when a keyword matches"},"wires":{"lit":"Wires","all":"Show every line","litHint":"Wires appear when you point at a row. Click to keep them all on.","allHint":"All wires shown. Click to go back to showing them on hover."},"block":{"collapse":"Collapse","expand":"Expand","more":"{{count}} more","showMore":"Full text","showLess":"Show less","addCover":"Add a cover","identity":"Card details","seeds":"Seeds {{count}} variable(s)","previewPaused":"Preview paused â the full preview or a playtest has it","previewZoom":"Zoom past 50% to run the preview","blurbPlaceholder":"A blurb â this is what players read in the library","openingPlaceholder":"Write the opening â the first thing anyone who plays this card reads","firedByHint":"fired by {{name}}","sharedRow":"shared","sharedRowHint":"Shared with every scenario â this row is the same object in each one; edit it anywhere and it changes everywhere","valueEditHint":"Click to change the starting value","valueToggleHint":"Click to toggle the starting value","settings":"Settings","ask":"Write this one for me","backgroundSample":"The rain pressed the whole city low.","backgroundUseCover":"Use the cover","backgroundAdd":"Add a background","backgroundProcessing":"{{blur}}px blur · {{dim}}% dark · {{opacity}}% opaque","backgroundBlurb":"Behind the chat","faceBlurb":"The card's front door","backgroundCount":"{{count}} backgrounds","backgroundOpen":"Open","listAll_one":"{{count}} in all","listAll_other":"{{count}} in all"},"blocks":{"card":"Cover & blurb","opening":"Opening","behavior":"Behaviors","state":"Variables","frontend":"Player interface","audio":"Audio","image":"Scene images","gamedata":"Game data","ais":"AI","scene":"Player interface","lore":{"always":"Character and world","keywords":"Keyword lore","conditions":"Conditional lore","manual":"Standby lore"},"empty":{"image":"No scene images yet","lore":"No entries yet","behavior":"No behaviors yet","state":"No variables yet","audio":"No tracks yet","opening":"No openings yet"},"add":{"opening":"Add an opening","lore":"Add an entry","behavior":"Add a behavior","state":"Add a variable"},"sub":{"image":"{{count}} image(s)","always":"{{count}} · ~{{tokens}} every turn","keywords":"{{count}} · only when a keyword hits","conditions":"{{count}} · only when the condition passes","manual":"{{count}} · switched by behaviors","state":"{{count}} · ~{{tokens}} injected every turn","behavior":"{{count}}","audio":"{{count}} track(s)","opening":"~{{tokens}} · sent once, at the start","frontend":"reads {{count}} variable(s)","frontendDynamic":"reads {{count}} variable(s) · {{dynamic}} more computed","frontendNone":"reads no variables","context":{"shared":"shared memory","own":"its own memory","pool":"Pooled memory","worker":"background"},"card":"What a player sees in Discover","background":"Painted behind the chat while they play","imageJudge":"{{on}} of {{count}} · picked after each reply","imageNarrator":"{{on}} of {{count}} · story AI inserts them","imageNone":"{{count}} · none say when to show"},"context":"Context","contextHint":"what the AI here reads each turn","addPack":"Use a ready-made system","background":"Chat background"},"gate":{"members_one":"{{count}} member","members":"{{count}} members"}
69,"rowEdit":{"close":"Collapse","bodyPlaceholder":"What this entry tells the AI...","sectionLabel":"Inject into","expand":"Expand editor"},"summary":{"ifMark":"guarded","tellAi":"Tell AI","entryOn":"Turn on entry","entryOff":"Turn off entry","varOn":"Enable","varOff":"Disable","music":"Play","sfx":"SFX","stopAudio":"Stop","notify":"Notify","moment":"Moment"},"detail":{"root":"Canvas"},"focus":{"done":"Done","autosaves":"Saves as you type"},"tree":{"search":"Search names, text, IDsâ¦","title":"Card outline","presets":"Default narration settings"},"contextWire":{"game":"reads live","memory":{"history":"memory · lived","lore":"memory · archive"},"worker":{"history":"briefing","lore":"briefing · archive"},"variables":{"history":"state","lore":"state"},"transcript":{"history":"verbatim","lore":"verbatim · archive"},"wakeOnClose":"wakes on close"},"addWorker":"Background writer","ctx":{"title":"What this scenario's AI sees","titleContent":"What this scenario hands over","perTurn":"~{{n}} / turn","own":"This scenario","core":"Shared â used by the whole card","alsoOn":"â{{name}}â is always on too","lore":"{{count}} always-on entries","standby":"{{count}} more wait for a keyword or a condition","vars":"{{count}} variables","behaviors":"{{count}} behaviors","nothing":"nothing in it yet","gated":"{{count}} other scenarios are conditional â whether they share a turn with this one depends on the state at the time.","history":"History","ownRun":"Its own run","ownRunArchive":"archived into one summary when it closes","ownRunKeep":"stays in context after it closes","handsOff":"It does not run the conversation, so all of this joins the context of whichever scenario does.","missingSource":"That scenario is gone, so this line does nothing.","lore_one":"{{count}} always-on entry","standby_one":"{{count}} more waits for a keyword or a condition","vars_one":"{{count}} variable","behaviors_one":"{{count}} behavior","gated_one":"{{count}} other scenario is conditional â whether it shares a turn with this one depends on the state at the time.","flowJoin":", ","as":{"history":"as history","lore":"as lore"},"flow":{"memory":"its finished runs ({{as}})","worker":"what it writes ({{as}})","variables":"its variables","transcript":"its last {{n}} messages ({{as}})"},"readsHint":"This scenario reads {{other}}: {{reads}}.","readByHint":"{{other}} reads this scenario: {{gives}}.","mutualHint":"Both ways with {{other}} â this scenario reads {{reads}}; {{other}} reads {{gives}}.","joinsNarrator":"joins the narrator","readBy":"Read by","noReaders":"Nothing reads this scenario yet.","chainTrap":"{{via}} reads {{source}}, but that does not travel through â a wire carries one hop. Add {{source}} here too if this scenario needs it.","stationNeeded":"Turn on \\"runs the conversation itself\\" above and this scenario gets its own memory: its own run, and wires to whatever else it should read.","row":{"usesCard":"Uses the card's context","readBy":"Read by {{names}}","memoryShared":"Shared memory · with {{names}}","memorySharedHint":"This scenario's AI reads the whole conversation, the way every scenario always has.","memoryPlainHint":"This scenario has no AI of its own. Its entries and variables join whoever is narrating, and that narrator remembers everything.","memoryOwnKeep":"Own memory · nothing from outside, returned on leaving","memoryOwnArchive":"Own memory · nothing from outside, archived on leaving","memoryOwnHint":"Inside, the AI sees only what was said in this scenario â walk in and it has never heard of anywhere else. What is said here still joins the shared transcript: leave, and every other place remembers it.","memoryPool":"Shared memory · only with {{names}}","memoryPoolHint":"These scenarios share one pool of memory: inside them the AI remembers what happened in each other's runs and nothing from other scenarios. The card's own AI still sees everything.","memoryWorker":"Background · reads only what is wired in","memoryWorkerHint":"Never answers the player. Runs on its trigger with the wires below as its whole world.","theCard":"the card","shared":"{{lore}} shared entries · {{vars}} shared variables","sharedHint":"The card's own entries and variables reach every scenario. One è¡é in every dungeon is one variable, not four.","trap":"{{source}} does not reach here (via {{via}})","connections":"Reads {{reads}} sources · read by {{gives}} scenarios","reviewConnections":"{{count}} indirect references to review","memoryCardAlone":"Remembers the whole conversation","memoryCardHint":"This is the AI that plays unless a scenario takes over, and it remembers everything said.","summaryOn":"earlier turns become a summary","pinnedRow":"Pinned: {{text}}","continuityOn":"Smart tracking: on","continuityOff":"Smart tracking: off"}},"turnCtx":{"title":"What the AI is getting","live":"playing","atRest":"at rest","narrator":"â{{name}}â is answering the player","noNarrator":"The card's own AI is answering â no scenario has taken over","on":"Switched on","off":"Off right now ({{count}})","standby":"{{count}} more entries are waiting on a keyword or a condition â only what gets said decides.","standby_one":"{{count}} more entry is waiting on a keyword or a condition â only what gets said decides.","carried":"carries â{{name}}â â {{what}}, as {{as}}","floorHint":"every turn, at least","contentCounts":"{{entries}} persistent entries · {{variables}} variables","estimateTitle":"How much the AI reads","currentEstimate":"Current state","initialEstimate":"Initial configuration","estimateExplanation":"Estimated from configuration and state. Excludes turn matching, chat history and memory; this is not the sent prompt.","beforeOpening":" No specific opening has been applied to the initial configuration.","conditionalCount":"{{count}}
69 entries depend on keywords, conditions or the frontend and are excluded from this estimate.","baselineEstimate":"Persistent content estimate","historyAll":"History: everything the budget allows","historyLimitCard":"History: latest {{count}} messages (card setting)","historyLimitModule":"History: latest {{count}} messages (this scenario's setting)","kind":{"lore":"Lore","variables":"Variables","presets":"Narrative settings"},"heaviest":"{{name}} alone is {{tokens}}"},"operators":{"eq":"is","neq":"is not","gt":">","gte":"â¥","lt":"<","lte":"â¤","contains":"contains"},"workspace":{"context":"Scope and connections","local":"Scenario content","shared":"Shared content","localHint":"Belongs to {{name}}.","sharedHint":"One shared object, shown in {{count}} scenarios. Editing it updates every instance.","references":"Connections · {{count}}","outgoing":"Uses this","incoming":"Feeds this","writes":"Writes this variable","activates":"Activated by this variable","true":"True","false":"False","focus":"Focus scenario","focusNamed":"Focus {{name}}","back":"Back to overview","module":"Scenario","invalid":{"number":"Enter a finite number. The previous value has not changed.","boolean":"Choose true or false.","json":"Enter a valid JSON object or array. The previous value has not changed."},"moveMemory":"Change memory group","moveMemoryHint":"{{name}} currently shares with {{members}}. Moving it here changes that relationship.","moveMemoryOwn":"{{name}} currently has its own memory. Join this group?","moveMemoryCard":"{{name}} currently reads the whole conversation. Joining this group limits its history to this group.","applyMemory":"Move to this group","cancel":"Cancel","currentGroup":"Shared with: {{members}}","ownGroup":"Independent memory"},"starter":{"settingTitle":"Character and world","settingHint":"Tell the story AI who is here, where it happens, and what to follow.","settingCreate":"Add a setting","openingTitle":"Opening message","openingHint":"What players see first. You can also let the player speak first.","openingCreate":"Add an opening","presetsTitle":"Default narration","presetsStatus":"Enabled · {{count}} entries","coverAndDescription":"Cover & description","defaultChatReady":"Default chat · ready to use","playerInterface":"Player interface","previewEmpty":"No opening message yet","playerCanStart":"Players can send the first message"},"entry":{"adjustDelivery":"When the AI sees this","deliveryDisabled":"Disabled. This is not automatically sent to the story AI.","deliveryAlways":"Sent to the story AI with every reply.","deliveryAlwaysScoped":"Sent with every reply while the scope below is active.","deliveryAiAlways":"{{name}} gets this every time.","deliveryKeywords":"Sent to the story AI when keywords match.","deliveryConditionsAny":"Sent when any of the {{count}} variable conditions is met.","deliveryConditionsAll":"Sent when all {{count}} variable conditions are met.","deliveryKeywordsConditionsAny":"Sent when keywords match and any of the {{count}} variable conditions is met.","deliveryKeywordsConditionsAll":"Sent when keywords match and all {{count}} variable conditions are met.","deliveryFrontend":"The connected frontend element controls whether this is sent to the story AI.","deliveryUnconfigured":"No automatic delivery is configured. Enable Always send, or add keywords, variable conditions, or a frontend connection.","deliveryModuleScope":"Only sent while its scenario is active.","deliveryAiOnly":"Only {{name}} sees this; the other AIs donât.","deliveryFrontendConditions":"The connected frontend element must also be active and its connection conditions must be met.","deliveryFrontendScope":"Only sent while the connected frontend element is active.","deliverySecondary":"Also follows the secondary keyword and matching settings.","deliveryUnplaced":"Outside, not in play: it reaches the storytelling AI only once you drag it onto the card or into a scenario."},"addSceneImage":"Scene image","addPurpose":{"sceneImage":"A picture the AI shows when its moment comes","setting":"An entry for the AI: a character, the world, the rules","opening":"The first words players see","variable":"No numbers yet","behavior":"No behaviors yet","interface":"Change the layout and appearance players see","module":"Organize content into chapters or scenes"},"writing":{"entryName":"Content name","characterName":"What's the character called?","entrySettings":"Settings","settingPlaceholder":"Write who the characters are, where the story happens, and what should stay trueâ¦","openingPlaceholder":"Write the first scene or the characterâs first wordsâ¦","settingHint":"These details are provided to the story AI.","openingHint":"Players see this when they start. Leaving it empty lets them speak first.","characters":"{{count}} characters","disabled":"Disabled","configuredDelivery":"Custom activation · view settings","moreSetting":"Add another character or setting","moreOpening":"Add another opening","sharedOnly":"Nothing here yet. Click ï¼ to add one, or drag one in from the card","folderSelect":"Select the {{count}} entries in this folder","chooseOpening":"Opening","playerPreview":"Player preview","editAppearance":"Edit appearance","previewHint":"This is what players see when they arrive; to talk to the character, press Play","emptyOpening":"Your opening will appear here","cardDetail
69s":"Cover, description and card details","sharedScope":"Shared across the card","relationships":"View connections","write":"Write content","defaultInterface":"Default chat interface","editOpening":"Edit opening","viewLabel":"Workspace view","contentView":"Content","relationshipView":"Relationships","mechanics":{"state":"State (variables)","addState":"Add variable","stateHint":"Track what changes in the story, such as health, affection or inventory.","behaviors":"Behaviors","addBehavior":"Add behavior","behaviorHint":"Respond to story events, such as changing health or unlocking a scene.","configure":"Configure","behaviorName":"Behavior name","activation":"Activation: {{mode}}","legacy":"Legacy behavior"},"showRelations":"View relationships","relationsFor":"View relationships for {{name}}","expandSetting":"Expand setting","collapseSetting":"Collapse setting","expandSettingFor":"Expand {{name}}","collapseSettingFor":"Collapse {{name}}","emptySetting":"No setting text yet","notWritten":"Not written","dragToReorder":"Drag to reorder","screenUnfold":"Show the screen","screenFold":"Fold","settingsCount":"{{count}} settings","expandSettings":"Expand settings","collapseSettings":"Collapse settings","expandText":"Expand text","collapseText":"Compact text","openingPurpose":"Players see this first","settingPurpose":"Provided to the story AI","previewOpening":"Preview opening","previewNoOpening":"No opening yet","expandRow":"Open for editing","collapseRow":"Close","deliveryOff":"Off â never sent","deliveryKeywords":"Keywords: {{keywords}}","deliveryConditions":"When {{count}} variable condition(s) match","deliveryFrontend":"Controlled by the interface","deliveryAlways":"Sent every turn","deliveryUnset":"No activation set","deliveryUnplaced":"Not in play · drag it in to use it"},"editing":{"noExtraConditions":"No extra conditions"},"continuity":{"scope":"Content scope","scopeHint":"The settings, variables and behaviors below belong to {{name}}.","missingModule":"Missing scenario · {{id}}","modules":"Scenarios","moduleContents":"{{entries}} settings · {{variables}} variables · {{behaviors}} behaviors","viewContents":"View content","moduleSettings":"{{name}} · Scenario settings"},"navigation":{"showInBlueprint":"Locate on canvas"},"relationships":{"show":"View relationships","title":"Relationships","untitled":"Untitled card","missing":"Referenced object is missing","missingObject":"This object is no longer in the card. Close this panel and select another object.","editObject":"View settings","add":"+ Relation","addPick":"Search for an object to relateâ¦","addEmpty":"Nothing here can be related directly","selectAll":"Select all related ({{count}})","remove":"Remove this relation","scope":"Belongs to","incoming":"Dependencies and sources","outgoing":"Uses and effects","members":"Contents","empty":"No configured relationships found yet.","configuredHint":"These are configured relationships. Openings, conditions and enabled states determine which are active during play.","dynamicCodeHint":"Custom code may also access data dynamically; those relationships cannot all be listed.","operations":{"set":"Set","add":"Add","subtract":"Subtract","multiply":"Multiply","toggle":"Toggle","append":"Append text","merge":"Merge fields","push":"Add list item","delete":"Delete field or item"},"kinds":{"trigger":"Event trigger","condition":"Condition","stop-condition":"Stop condition","activate-module":"Scenario activation","activate-variable":"Variable activation","gate-entry":"Entry activation","write-value":"Changes value","toggle-variable":"Enables or disables variable","toggle-entry":"Enables or disables entry","seed-value":"Sets initial value","read-variable":"Reads variable","display-entry":"Displays entry","read-context":"Reads scenario context","wake-module":"Wakes scenario","audio":"Controls audio","related":"Related configuration"}},"crash":{"title":"The canvas couldn't draw this card","body":"Your card is safe and nothing was lost. Something in it is in a shape this version can't read â open Full editors in the toolbar above to find and fix it, then come back.","retry":"Draw it again"},"directory":{"title":"Scenarios","expandAll":"Open all","collapseAll":"Shut all","ownCount_one":"{{count}} item","ais":"AIs","places":"Scenarios","ownCount":"{{count}} items"},"batch":{"selected_one":"{{count}} selected","selected":"{{count}} selected","moveTo":"Move toâ¦","duplicate":"Duplicate","toCore":"Shared by every scenario (the card)","delete":"Delete","clear":"Clear selection","hint":"Drag a box on empty canvas to select several; Ctrl/Shift-click adds one"},"rail":{"show":"Show the assistant rail","hide":"Hide the assistant rail â the board fills the stage"},"piece":{"dropHere":"Drop here"},"readiness":{"name":"give the card a real name","cover":"add a cover","opening":"write the opening","setting":"write one piece of setting","mechanics":"add variables or behaviors"},"ask":{"openingsEmpty":"Write the first opening for this card â read what is already here and match its tone.","openingsMore":"Write one more opening for this card, a different way in from the ones it already has.","loreEmpty":"Write three pieces of setting for this card: who the main character is, where this takes place, and what is currently wrong.","loreMore":"Write two more pieces of setting for this card that the existing ones leave out.","variablesEmpty":"Suggest two or three variables this card should track, with sensible ranges and starting values, and say in each one's rules how the AI should move it.","variablesMore":"Suggest one more variable this card should track that the existing ones do not cover.","behaviorsEmpty":"Write two or three behaviors that move this card's variables at the right moments.","behaviorsMore":"Write one more behavior for this card that the existing ones do not cover.","sceneImagesEmpty":"Suggest three moments in this card worth a picture, and write the 'when to show it' line for each.","sceneImagesMore":"Suggest two more moments in this card worth a picture.","audioEmpty":"Suggest what music and sound this card needs and when each should play.","audioMore":"Suggest one more piece of music or sound this card could use."},"xray":{"used":"used","usedHint":"Reached the model on the turn that just ran."},"clipboard":{"copied":"Copied {{count}}","pasted":"Pasted {{count}}"},"dropOutHint":"Put it aside here â it stops taking effect until you drag it back","moved":{"to":"Moved {{count}} to â{{where}}â","card":"the card","go":"Show me"},"row":{"gameNoReaders":"No AI reads it","gameNoFields":"Play once and the fields the game reports show up here","varType":{"number":"Number","string":"Text","boolean":"Switch","json":"List / table"},"precise":"Precise","audioNoCue":"AI won't play it on its own","imageManual":"AI won't show it on its own"},"sentence":{"every":"every","turns":"turns","remove":"Remove this line","operator":"Comparison","compareVariable":"Compare with another variable instead","compareConstant":"Compare with a fixed value instead","addCondition":"Add a condition","addEffect":"Add an effect","setPrefix":"Set","logicAll":"All must hold","logicAny":"Any may hold","ops":{"set":"to","add":"plus","subtract":"minus","multiply":"times","toggle":"toggle","append":"append"}},"tray":{"label":"Add","state":"Variable","behavior":"Behavior","audio":"Audio","image":"Scene images","background":"Chat background","packs":"Mechanic packs"},"noteDeleteConfirm":"Tap again to delete this note","search":{"placeholder":"Search names and text","none":"Nothing matches"},"tips":{"audioAi":"When on, the AI decides when to play this track as the story goes, going by its \\"
69when to play\\" line. When off, it only plays from the playlist and behaviors.","audioType":"BGM: background music that loops. Sound effect: a short one-off sound, like a door opening. Ambience: a sound that stays in the background, like rain or a crowd.","cooldown":"After it fires, how many turns before it can fire again. 3 means it stays quiet for the next 3 turns. 0 means no limit.","maxFire":"How many times it can fire in one playthrough. 1 means once, good for one-off story events. 0 means no limit.","effects":"What happens once the conditions are met. Add as many as you like: change a variable, switch an entry on or off, play music, notify the player, tell the AI somethingâ¦","keywords":"The entry is only sent to the AI when one of these words comes up in the chat. Write \\"castle, king\\" and the AI only reads it when the castle is mentioned. Separate words with commas.","liveCanon":"Lore Shift is an extension players can install. With it, a player can change the entries and variables you allow in their own playthrough, for example replace the lord of the castle. It only affects their playthrough; your card stays the same.","range":"The lowest and highest value. However the AI changes it, it stays inside this range, like affection 0 to 100.","reaches":"How and when this entry is sent to the AI: every turn, or on keywords or conditions, and where it goes in what the AI reads.","varWhen":"By default the AI can always see it. You can limit it to certain openings or a scenario, so it takes no space the rest of the time.","whenFires":"When this behavior checks: every turn by default, or when the player says something, a variable changes or a button is pressed.","onlyIf":"The effects below only happen when these are true. With several conditions, choose whether all must match or any one will do. Empty means it always runs.","alwaysSend":"On: sent to the AI every turn. Off: only sent when a keyword comes up or its conditions match, which saves words and keeps the AI focused.","excludeRecursion":"If another entry's text happens to contain this entry's keywords, it won't pull this one in. Only the player and AI's chat can trigger it.","preventRecursion":"Once this entry is sent, its own text won't trigger other entries' keywords.","secondary":"A second set of words used with the keywords to narrow things down, like \\"must also appear\\" or \\"must not appear\\". Usually left empty.","secondaryLogic":"How the second set is checked: any one of them, all of them, none of themâ¦","sendAs":"Who the AI reads it as. System: rules and background, the usual choice. User: as if the player said it. Assistant: as if the AI had said it.","wholeWord":"When on, only whole words count: \\"cat\\" won't match \\"category\\". Rarely needed for Chinese or Japanese.","imageScope":"Only use this picture in chats that started from these openings. All openings means any of them.","imageUrl":"Where the picture comes from: paste an image link, or pick one from your assets.","aiAccess":"Whether the AI can change it. Can change: the AI changes it as the story goes. Read only: the AI knows it, but only behaviors and the screen change it. Hidden: the AI doesn't know it exists.","preciseStep":"With precise tracking on, the most it can go up (or down) in one turn; the AI picks a number in between to fit the story.","section":"Where in what the AI reads this entry goes. Near the top it reads like background; placed in the chat, the closer to the newest message, the more the AI weighs it.","situationEnabled":"Off: the whole scenario is out of play, whatever its rule says. Turn it off to set it aside without deleting it."},"addSituation":{"title":"Add a scenario","what":"A new scenario, like a card inside the card: its own entries, variables, behaviors and memory. Drag things in and they apply in this scenario."},"addLoose":{"hint":"With a scenario or the card selected, it goes straight in; with nothing selected it starts outside (faded, not in play) until you drag it in:"},"addMenu":{"setup":"A setup screen (name, cast, start)","note":"A sticky note","story":"In the story","screen":"On the player'
69s screen","entry":"More characters or places","entryHint":"Side characters, another place, the world's rules, for the AI to read","opening":"Another opening","openingHint":"Players can start from a different scene","variable":"A number that changes","variableHint":"Affection, money, stamina⦠something the story keeps count of","behavior":"A behavior","behaviorHint":"If⦠thenâ¦: at 80 affection, sheâ¦","module":"A scenario","ai":"An AI call","gameData":"Game data","moduleHint":"Content for one chapter or scene, like a card inside the card","pages":"Opening pages, inventory, mapâ¦","pagesHint":"Ready-made pages: enter a name, pick a start, stats, phone messages⦠pick one and it works","packs":"Ready-made mechanics","market":"Resource market","packsHint":"A whole mechanic, set up and ready","audio":"Music and sound","audioHint":"Background music, sounds that play in a scene","background":"Chat background"},"numberAdd":{"affection":"Affection","money":"Money","stamina":"Stamina","custom":"Name my own","affectionRules":"Up when the player is kind or wins them over; down when the player offends or angers them.","moneyRules":"Down when buying; up when finishing jobs or selling.","staminaRules":"Down when fighting or travelling; back up with rest and food.","name":"Name","namePlaceholder":"e.g. Trust, Sanity, Reputation","range":"starts at {{start}}, {{min}} to {{max}}","rangeOpen":"starts at {{start}}, at least {{min}}","show":"Show it on the player's screen","add":"Add","cancel":"Cancel"},"ruleAdd":{"when":"When","then":",","gte":"reaches (â¥)","lte":"drops to (â¤)","eq":"equals","tell":"Tell the AI","change":"Change a number","notify":"Show a note","tellPlaceholder":"e.g. She starts seeking you out and remembers the books you like.","notifyPlaceholder":"e.g. She seems to have let her guard down.","once":"Only once","addNumber":"Add a number first","event":"When this happens in the story","eventPlaceholder":"e.g. he forgives you","eventRule":"Yes once the story shows that {{sentence}}; no until then. Once it has happened it stays yes."},"moments":{"screenWaiting":"Write the opening to see the player's screen here"},"situationGroups":{"opening":"When entering from a chosen opening","always":"Always","number":"When a variable meets a condition","word":"When the player says certain words","screen":"Only the Enabled switch","unplaced":"Not placed · drag onto the card or a scenario","worker":"Background writers"},"ai":{"slot":{"wake":"Wakes","remember":"Recalls","reads":"Links","does":"Does","sees":"Sees"},"wakeSend":"Every time the player sends","wakeSendHint":"While the player is in this scenario, it answers every message.","wakeSendCardHint":"When no scenario takes over, the card's own AI answers every message.","doesSpeak":"Talks to the player · changes values","joins":"While the player is here, these go to whichever AI is speaking","readsFrom":"Also reads {{names}}","givesTo":"Hands to {{names}}","wakeNone":"No run time set · it won't run","wakeTurns":"Runs every {{n}} turns","wakeConditions":"Runs when its conditions first hold","wakeClosed":"Runs when {{name}} ends","wakeAnyClosed":"Runs when any scenario ends","workerReads":"Reads only {{names}}","workerReadsNothing":"Nothing connected · it can only make things up","workerReadsNothingHint":"It can't see what the player did, so what it writes is invented and still costs money. Connect it to the scenario it should record.","workerWritesFor":"Writes for {{names}} · never talks to the player","workerWritesForNobody":"Nothing reads what it writes yet","wakeQuiet":"After {{n}}s of quiet · decides whether to speak","wakeAfter":"Runs right after â{{name}}â replies","doesInterject":"Steps in with a line · changes values","seesScene":"The live scene · told by the player interface","seesSceneHint":"The card's interface tells the AI what is on screen (setScene); it goes with every call.","line":{"lore":"{{n}} lore entries","vars":"{{n}} values","scene":"live scene","speak":"Talks","speakAndChange":"Talks · changes {{n}} values","cardWho":"The card's AI","wakeCardTakeover":"Every send, when no scenario takes over","noAiWho":"Shares the AI","situationWho":"Its own AI","wakeHere":"Every send while the player is here","quietWho":"Speaks when it's quiet","workerWho":"Behind the scenes","writesBehind":"Writes for other AIs","wholeConversation":"The whole conversation"}},"lens":{"title":"AIs on this card","card":"The card","judge":"Precise tracking","close"
69:"Close","kind":{"card":"narrator","narrator":"own AI","worker":"behind the scenes","quiet":"speaks when quiet","judge":"judges values"},"slot":{"wake":"Wakes","speaks":"Speaks?","sees":"Sees","remembers":"Recalls","does":"Does","cost":"Cost"},"wake":{"afterReply":"After every AI reply"},"speaks":{"always":"Always replies","decides":"Decides for itself; stays silent if nothing's worth saying","never":"Never talks to the player"},"sees":{"always":"{{n}} entries sent every turn","keyword":"{{n}} entries sent when mentioned","vars":"{{n}} values","recent":"The last {{n}} messages","all":"The whole conversation","scene":"The live scene","inputs":"{{n}} things handed over by other scenarios","own":"Its own {{n}} entries","turnOnly":"The player's message and this reply","rulesOf":"The rules of these {{n}} values","nothingWired":"Nothing connected â it can only make things up"},"does":{"reply":"Replies to the player","change":"Changes values (of {{n}})","events":"Sets off the interface's events","interject":"Steps in with a line","setTracked":"Sets these {{n}} values","writeBehind":"Writes something for other AIs"},"cost":{"player":"The player's chosen model · player pays","model":"{{model}} · player pays","cheap":"A cheap summary model · player pays","platform":"Platform pays"},"boardNote":"What's lit on the board is what this call sees; what's dimmed, it doesn't."},"codeCall":{"intro":"An AI call made by the interface code; its settings are in the code. This is what the scan found.","kind":"Kind","kind_complete":"generates a reply","kind_decide":"picks a choice","kind_context":"assembles context only","lore":"Lore it reads","loreNone":"none of the card's entries","loreAll":"every enabled entry","loreMatched":"entries matched by keyword","loreRaw":"no card lore","situations":"Limited to","situationsDynamic":"decided at runtime","picksSituation":"picks one of","session":"Rides the player's session","yes":"yes","no":"no","answer":"Answer","answerJson":"JSON","answerText":"plain text","model":"Model","openAt":"Open {{file}} at line {{line}}"},"files":{"summary":"Interface code · {{files}} files · {{lines}} lines","reads":"reads {{count}} variables","writes":"writes {{count}} variables","aiCalls":"{{count}} AI calls","readsList":"Reads: {{names}}","writesList":"Writes: {{names}}","usesList":"Uses: {{names}}","lines":"{{count}} lines","chipReads":"reads {{count}}","chipWrites":"writes {{count}}","chipAi":"AI Ã{{count}}","more":"{{count}} more files","use_ai":"AI calls","use_room":"multiplayer room","use_voice":"voice input","use_tts":"speech","use_storage":"saved data","use_media":"media library","use_social":"social sim","use_audio":"audio","use_assets":"assets","use_chat":"chat actions","use_session":"save actions"},"hints":{"title":"Also writable by hand","ai":{"codeCall":{"title":"AI call","body":"api.ai.complete; model, lore and answer shape are yours"},"replyRules":{"title":"Answer parsing","body":"reply rules, or a code behavior into variables"},"ownAi":{"title":"Outside AI","body":"âConnect your AIâ in the top bar (MCP)"}},"behavior":{"codeBehavior":{"title":"Code behavior","body":"JS; reads all variables, returns changes"},"fromCode":{"title":"Fired from the interface","body":"api.executeAction(id)"}}},"custom":{"mode_rule":"Rule","mode_custom":"Custom","empty":"Nothing implements this yet.","noteHint":"You can stick a note saying what it should do; the assistant or an outside AI writes it.","aiIntro":"Implemented by interface code. Below: the AI calls that read this scenario.","behaviorIntro":"Implemented by code.","implementedBy":"Implemented in {{count}} places","implementedCode":"Own code · {{count}} lines","firedFrom":"Fired from interface code · {{file}} line {{line}}"}}`),j={title:"Scenarios",listTitle:"This card's scenarios",count:"{{count}}",untitled:"(untitled scenario)",newModule:"New scenario",newModuleName:"Scenario {{n}}",namePlaceholder:"Scenario name (e.g. Dungeon A)",emptyTitle:"No scenarios yet",emptyDesc:"A scenario is a world of its own inside the card: its own entries, variables and behaviors, its own rule for when it opens, and optionally its own AI and memory. Anything not in a scenario is shared with every scenario.",noteAdd:"Add a note",whenOpe
69n:"When it opens",contents:"What is inside",contentsEntries:"Entries",contentsVars:"Variables",contentsBehaviors:"Behaviors",contentsInterface:"Player interface",addInto:"Add one to this scenario",nothingYet:"none yet",more:"{{count}} more",sharedIn:"Shared in from the card: {{lore}} entries · {{vars}} variables · {{behaviors}} behaviors",sharedInHint:"Entries, variables and behaviors in no scenario reach every scenario. Click a number to see them.",ai:"This scenario's AI",settings:"Scenario settings",enable:"Enabled",delete:"Delete scenario",noVars:"No variables yet: add one under Variables before this scenario can open on a variable.",scope:{all:"All",core:"Shared",empty:"Nothing in this scenario yet"},badge:{disabled:"Off",always:"Always on",manual:"Manual",greeting:"Bound to openings",keywords:"Keywords",conditions:"Follows variables",when:"when"},takesOver:"Narrates",worker:"Background writer",theCard:"The card",cardAlwaysOn:"Always on. Everything here is shared into every scenario, and it is what plays when no scenario has taken over.",cardAi:"The card's AI",whatIsThis:"A scenario is a place inside the card â its own entries, variables and AI. The card is the first one.",learnMore:"How scenarios work",scenePreviewHint:"The card's interface with this scenario's variables set, the way a player sees it here.",filterVariables:"Filter variablesâ¦",when:{always:"Always in use",manual:"Only the Enabled switch",greeting:"When the story starts from â{{names}}â",greetingNone:"No opening chosen yet · click to set",keywords:"When the player mentions â{{words}}â",keywordsNone:"No words yet · click to set",leaveWords:"leaves on â{{words}}â",wordsJoin:"â, â",conditions:"When {{detail}}",conditionsNone:"No condition yet · click to set"}}
69,Y={title:"Background",blurb:"A picture behind the chat. Text gets a dark layer over it so it stays readable.",emptyHint:"Start with the cover you already have â no upload, no generation.",useCover:"Use the cover",upload:"Upload one",cover:"Cover",coverName:"Cover",noCover:"This card has no cover yet.",untitled:"Untitled",isDefault:"Shown by default",aiPicks:"AI picks it",manual:"Not shown yet",blur:"Blur",dim:"Dim",opacity:"Opacity",dimVsOpacity:"Dim lays black over everything and is what buys legibility. Opacity fades the picture into the card's own background instead.",position:"Crop",pos:{center:"Center",top:"Top",bottom:"Bottom"},name:"Name",namePlaceholder:"Rainy rooftop",when:"When the AI should switch to it",whenPlaceholder:"A rainy night, or any scene outdoors and high up",whenHint:"Leave empty and the AI never picks this one â an opening or the default flag shows it instead.",defaultLabel:"Show this one before anything else picks",openings:"Only on these openings",remove:"Remove",noPicture:"No picture yet",before:"Original",after:"Processed",previewSentence:"The rain pressed the whole city low. She did not look back â she only tilted the umbrella your way."},q={title:"Mechanic packs",blurb:"A working set of variables, behaviors and lore, added in one click. Everything it adds is ordinary card content â open it, read it, change it.",add:"Add to this card",addedAgain:"Added â add again",installed:"Added {{name}}",countVariables_one:"{{count}} variable",countVariables:"{{count}} variables",countBehaviors_one:"{{count}} behavior",countBehaviors:"{{count}} behaviors",countEntries_one:"{{count}} entry",countEntries:"{{count}} entries",deterministic:"Real variables â the engine applies them, so switching model changes nothing.",promptOnly:"Prompt only â the model decides whether to comply. Use variables when it has to be exact.",footnote:"Packs stack â affection and survival can live on the same card. Remove one from the Bundles page and everything it brought goes with it."},K={personality:"Personality",scenario:"Scenario",systemPrompt:"System prompt",exampleDialogue:"Example dialogue",greeting:"Greeting",greetingN:"Greeting {{n}}",postHistory:"Post-history instructions",depthPrompt:"Character note",lorebookEntryN:"Lorebook entry {{n}}",worldbookName:"Imported lorebook",cardName:"Imported card"},z={banner:"This is the {{language}} version, but its content is still the original text. Translate it item by item, or let the assistant do it.",ask:"Ask the assistant to translate into {{language}}",dismiss:"Don't show again",prompt:"Translate this whole card into {{language}}: the title and description, every opening message, all entries (characters, world, settings), variable names and descriptions, what behaviors tell the AI, and the text on the interface. Keep the meaning, tone and personalities; adapt names the way {{language}} readers expect. Leave macros in curly braces and variable ids exactly as they are."},J={twoTapConfirm:e,shell:t,sections:a,kb:o,worldbooks:n,firstMessage:i,entries:r,variables:s,components:l,appPacks:d,audio:h,overview:c,variantBar:u,updateNotify:p,versionHistory:m,assetPicker:g,conditionEditor:y,bundlesSection:w,behaviors:v,bundle:b,studio:f,quickCreate:k,simple:C,unsavedDialog:A,save:S,review:T,bundleCreator:I,bundleEditor:P,extra:N,chooseVersion:x,selectVersionLabel:W,downloadVariant:D,downloadWithCover:R,downloadDataOnly:F,downloadLabel:H,tour:E,saveErrors:L,reviewState:M,imageInsert:B,sceneImages:O,voiceField:_,bundleCounts:U,worldChanges:V,blueprint:G,modules:j,interface:{compileFailed:"Your interface could not be built, so the card still shows the previous one. Everything else was saved."},backgrounds:Y,packs:q,tavernImport:K,variantTranslate:z};export{d as appPacks,g as assetPicker,h as audio,Y as backgrounds,v as behaviors,G as blueprint,b as bundle,U as bundleCounts,I as bundleCreator,P as bundleEditor,w as bundlesSection,x as chooseVersion,l as components,y as conditionEditor,J as default,F as downloadDataOnly,H as downloadLabel,D as downloadVariant,R as downloadWithCover,r as entries,N as extra,i as firstMessage,B as imageInsert,o as kb,j as modules,c as overview,q as packs,k as quickCreate,T as review,M as reviewState,S as save,L as saveErrors,O as sce
69neImages,a as sections,W as selectVersionLabel,t as shell,C as simple,f as studio,K as tavernImport,E as tour,e as twoTapConfirm,A as unsavedDialog,p as updateNotify,s as variables,u as variantBar,z as variantTranslate,m as versionHistory,_ as voiceField,V as worldChanges,n as worldbooks}; 70 71//# chunkId=b0ddccf9-55a3-52f3-9ef9-ed8b58d8f6c7
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.