[{"data":1,"prerenderedAt":2220},["ShallowReactive",2],{"changelog":3},[4,184,291,368,404,580,776,1497,1764],{"id":5,"title":6,"body":7,"description":170,"extension":176,"meta":177,"navigation":179,"path":180,"seo":181,"stem":182,"__hash__":183},"changelog\u002Fchangelog\u002F0.10.0.md","v0.10.0",{"type":8,"value":9,"toc":169},"minimark",[10,14,19,46,50],[11,12,6],"h1",{"id":13},"v0100",[15,16,18],"h3",{"id":17},"breaking-changes","Breaking Changes",[20,21,22],"ul",{},[23,24,25,29,30,34,35,38,39,34,42,45],"li",{},[26,27,28],"strong",{},"Text emphasis now follows standard markdown"," – ",[31,32,33],"code",{},"*text*"," renders ",[26,36,37],{},"italic"," and ",[31,40,41],{},"**text**",[26,43,44],{},"bold",".",[15,47,49],{"id":48},"new-features","New Features",[20,51,52,74,101,115,134,150,163],{},[23,53,54,57,58,61,62,65,66,69,70,73],{},[26,55,56],{},"Multi-stack statuses"," – New ",[31,59,60],{},"multi_stack"," boolean on ",[31,63,64],{},"character_statuses",". When ",[31,67,68],{},"true",", each apply creates an independent instance with its own duration (DoT\u002Fpoison-style). When ",[31,71,72],{},"false"," (default), reapply refreshes the single instance.",[23,75,76,57,79,82,83,85,86,89,90,93,94,93,97,100],{},[26,77,78],{},"Status metadata bag",[31,80,81],{},"meta"," field on ",[31,84,64],{},", populated from a new ",[26,87,88],{},"Characters → Status Meta"," editor tab. Plugins (and games) define their own metadata keys here (e.g. ",[31,91,92],{},"power_scaling",", ",[31,95,96],{},"dot_damage_type",[31,98,99],{},"is_battle",")",[23,102,103,106,107,110,111,114],{},[26,104,105],{},"Per-instance source tracking"," – Statuses store an optional ",[31,108,109],{},"source"," field on each instance, captured from ",[31,112,113],{},"character.addStatus(status, { source: casterId })",". Useful for reflecting damage back to the caster, attributing log entries, etc.",[23,116,117,29,120,93,123,93,126,129,130,133],{},[26,118,119],{},"Status lifecycle emitters",[31,121,122],{},"status_added",[31,124,125],{},"status_removed",[31,127,128],{},"status_expired"," are now part of ",[31,131,132],{},"CORE_EMITTER_SIGNATURES",". Listen for any status transition without polling.",[23,135,136,142,143,146,147,149],{},[26,137,138,141],{},[31,139,140],{},"save_load_before"," emitter"," – Fires with the raw save JSON immediately before deserialization. Listeners may mutate ",[31,144,145],{},"saveData"," in place to migrate old-shape data, or return ",[31,148,72],{}," to abort the load. General-purpose primitive for game-side schema migrations.",[23,151,152,29,155,158,159,162],{},[26,153,154],{},"Unified popover system",[31,156,157],{},"v-popover"," now drives every floating UI surface (status \u002F item \u002F stat \u002F skill bricks, ability tooltips, record links, ",[31,160,161],{},"[v:status]"," references).",[23,164,165,168],{},[26,166,167],{},"Stat breakdown popup"," – Hovering a stat now lists every status contributing to its value, grouped by the source(Base, equipped items, learned skills, other statuses).",{"title":170,"searchDepth":171,"depth":171,"links":172},"",2,[173,175],{"id":17,"depth":174,"text":18},3,{"id":48,"depth":174,"text":49},"md",{"version":178},"0.10.0",true,"\u002Fchangelog\u002F0.10.0",{"title":6,"description":170},"changelog\u002F0.10.0","bBaz1OG9A1xir4JgxiX0aJIfeIuFuUWAOkt-4uvX0PU",{"id":185,"title":186,"body":187,"description":170,"extension":176,"meta":285,"navigation":179,"path":287,"seo":288,"stem":289,"__hash__":290},"changelog\u002Fchangelog\u002F0.9.0.md","v0.9.0",{"type":8,"value":188,"toc":280},[189,192,194,210,214,222,224],[11,190,186],{"id":191},"v090",[15,193,49],{"id":48},[20,195,196],{},[23,197,198,201,202,205,206,209],{},[26,199,200],{},"Save restoration"," – When ",[31,203,204],{},"manifest.version"," (or a mod's version) changes between saves, the engine can rebuild every character and every item from the current data definitions. See the new ",[26,207,208],{},"Advanced → Save Restoration"," doc.",[15,211,213],{"id":212},"editor-improvements","Editor Improvements",[20,215,216],{},[23,217,218,221],{},[26,219,220],{},"Better Spine DX"," – Character\u002Fasset popups now show a Spine stats panel listing every animation and skin from the loaded skeleton.",[15,223,18],{"id":17},[20,225,226,232],{},[23,227,228,231],{},[26,229,230],{},"Unified character canvas"," – Static and Spine characters now render into the same canvas shape.",[23,233,234,29,237,93,240,243,244,247,248,243,251,254,255,258,259,262,263],{},[26,235,236],{},"Action consolidation",[31,238,239],{},"add_status",[31,241,242],{},"add_skin_layer","\u002F",[31,245,246],{},"remove_skin_layer",", and ",[31,249,250],{},"add_item_slot",[31,252,253],{},"remove_item_slot"," are gone. Replaced by three new content actions with a shared ",[31,256,257],{},"targetId->item & item, targetId->!item"," syntax (",[31,260,261],{},"!"," prefix = remove):\n",[20,264,265,270,275],{},[23,266,267],{},[31,268,269],{},"{status: \"alice->buff1 & buff2, bob->!debuff\"}",[23,271,272],{},[31,273,274],{},"{skin_layer: \"alice->armor & helmet, bob->!cloak\"}",[23,276,277],{},[31,278,279],{},"{item_slot: \"alice->ring, bob->!belt\"}",{"title":170,"searchDepth":171,"depth":171,"links":281},[282,283,284],{"id":48,"depth":174,"text":49},{"id":212,"depth":174,"text":213},{"id":17,"depth":174,"text":18},{"version":286},"0.9.0","\u002Fchangelog\u002F0.9.0",{"title":186,"description":170},"changelog\u002F0.9.0","_Pn53aw_skjXzuTNgpRH3ovL3YaLrwJ3KQJUBeEWQoM",{"id":292,"title":293,"body":294,"description":170,"extension":176,"meta":362,"navigation":179,"path":364,"seo":365,"stem":366,"__hash__":367},"changelog\u002Fchangelog\u002F0.8.0.md","v0.8.0",{"type":8,"value":295,"toc":359},[296,299,301],[11,297,293],{"id":298},"v080",[15,300,49],{"id":48},[20,302,303,309,315,340,346],{},[23,304,305,308],{},[26,306,307],{},"New main screen"," – Cinematic per-game landing page with full-bleed background asset, glassy header, accent theming, ambient soundtrack, and a Continue\u002FNew Game buttons.",[23,310,311,314],{},[26,312,313],{},"Visual Dungeon Content Editor"," – New popup editor on Dungeon → Config for authoring DryadScript without touching raw text or relying on Google Docs.",[23,316,317,320,321,324,325,328,329,332,333,336,337,45],{},[26,318,319],{},"Lore & Encyclopedia"," – Author lore\u002Ftutorial records once, reference them inline as hoverable ",[31,322,323],{},"[[link]]"," tooltips (BG3-style stacking on nested links) and as a browseable Encyclopedia tab. Supports discover-on-encounter syntax (",[31,326,327],{},"[[!id]]","), custom labels (",[31,330,331],{},"[[id>label]]","), the ",[31,334,335],{},"{discover_lore}"," action, and progressive reveal via ",[31,338,339],{},"auto_discovery",[23,341,342,345],{},[26,343,344],{},"Multiple App instances"," – Saves now work correctly across multiple opened instances of the app.",[23,347,348,351,352,243,355,358],{},[26,349,350],{},"HTML editor asset picker"," – The Insert Image popup now lets you search and pick any project image (with thumbnails) alongside the existing URL paste, and a new Insert Video button does the same for ",[31,353,354],{},".mp4",[31,356,357],{},".webm","\u002Fother video assets.",{"title":170,"searchDepth":171,"depth":171,"links":360},[361],{"id":48,"depth":174,"text":49},{"version":363},"0.8.0","\u002Fchangelog\u002F0.8.0",{"title":293,"description":170},"changelog\u002F0.8.0","gGIRPMgCNdIBvlxY86IIBwHm8JiwDEGSbSx8uB9iStg",{"id":369,"title":370,"body":371,"description":170,"extension":176,"meta":398,"navigation":179,"path":400,"seo":401,"stem":402,"__hash__":403},"changelog\u002Fchangelog\u002F0.7.0.md","v0.7.0",{"type":8,"value":372,"toc":395},[373,376,378],[11,374,370],{"id":375},"v070",[15,377,49],{"id":48},[20,379,380,386,392],{},[23,381,382,385],{},[26,383,384],{},"Mobile compatibility"," — Phones and tablets are now supported in landscape. Portrait orientation shows a full-screen rotate-device prompt.",[23,387,388,391],{},[26,389,390],{},"Text dungeon overhaul"," — New text-dungeon layouts with a side column for custom components and a refreshed scene flow.",[23,393,394],{},"a lot of bug fixes and quality of life improvements",{"title":170,"searchDepth":171,"depth":171,"links":396},[397],{"id":48,"depth":174,"text":49},{"version":399},"0.7.0","\u002Fchangelog\u002F0.7.0",{"title":370,"description":170},"changelog\u002F0.7.0","08w1xHjeZdvC32B3S1QCX7zQ0by2g2JhMtuJh98GhD4",{"id":405,"title":406,"body":407,"description":170,"extension":176,"meta":574,"navigation":179,"path":576,"seo":577,"stem":578,"__hash__":579},"changelog\u002Fchangelog\u002F0.6.0.md","v0.6.0",{"type":8,"value":408,"toc":570},[409,412,414,551,555],[11,410,406],{"id":411},"v060",[15,413,49],{"id":48},[20,415,416,429,441,457,469,483,491,497,511,519,545],{},[23,417,418,424,425,428],{},[26,419,420,423],{},[31,421,422],{},"staticFaceForce"," prop"," on CharacterFace — Forces spine characters to use ",[31,426,427],{},"face_static"," image instead of live spine rendering. Use in logs, sidebar, and turn order to save performance.",[23,430,431,437,438,440],{},[26,432,433,436],{},[31,434,435],{},"face_static_precedence"," trait"," — Per-character opt-in to prefer ",[31,439,427],{}," over spine crop in CharacterFace.",[23,442,443,446,447,93,450,247,453,456],{},[26,444,445],{},"Spine viewport controls"," — Background spine assets support ",[31,448,449],{},"dx",[31,451,452],{},"dy",[31,454,455],{},"zoom"," viewport adjustments in the editor.",[23,458,459,465,466,468],{},[26,460,461,464],{},[31,462,463],{},"is_hidden"," status property"," — Statuses can be marked hidden from the UI via the ",[31,467,463],{}," field.",[23,470,471,474,475,478,479,482],{},[26,472,473],{},"Context-aware string resolution"," — ",[31,476,477],{},"game.resolveString()"," accepts an optional context parameter. New ",[31,480,481],{},"|stat(statId)|"," placeholder reads character stats from context.",[23,484,485,490],{},[26,486,487],{},[31,488,489],{},"game.getResolveContext()"," — Public API for accessing resolve context in custom placeholders.",[23,492,493,496],{},[26,494,495],{},"Create Game from Template"," — New wizard in the editor (New → New Game) lets you create a game from a pre-made template in seconds. Pick a template, enter a name, and you have a working game ready to edit.",[23,498,499,502,503,506,507,510],{},[26,500,501],{},"Ability Groups"," — New ",[31,504,505],{},"ability_groups"," editor tab under Characters. Assign abilities to groups via the ",[31,508,509],{},"group"," meta field. The RPG Battler ability panel and character sheet ability viewer render tabs per group. If no groups are defined, abilities display as a flat list.",[23,512,513,518],{},[26,514,515],{},[31,516,517],{},"getGroupedAbilities()"," — New Character API method that returns abilities organized by their assigned groups.",[23,520,521,524,525,528,529,532,533,536,537,540,541,544],{},[26,522,523],{},"Experience Plugin"," — New engine plugin for XP and leveling. Characters with a ",[31,526,527],{},"level"," trait automatically gain a managed ",[31,530,531],{},"xp"," resource. Configurable progression formulas (linear\u002Fexponential percentage scaling), multi-level overflow, ",[31,534,535],{},"character_level_up"," emitter, ",[31,538,539],{},"_level(characterId)"," condition, ",[31,542,543],{},"{xp: amount}"," action, and XP bar UI in the character sheet.",[23,546,547,550],{},[26,548,549],{},"RPG Battler Plugin"," — Turn-based RPG battle system with player-controlled party combat, ability groups, splash targeting, status durations, shared cooldowns, dynamic turn order, combat stats display, battle log service, defeated battle tracking, and more. See the plugin docs for full details.",[15,552,554],{"id":553},"bug-fixes","Bug Fixes",[20,556,557,560,563],{},[23,558,559],{},"Fixed a bug where items could not be consumed.",[23,561,562],{},"Fixed broken character equipped item slots position",[23,564,565,566,569],{},"Fixed ability card effects without ",[31,567,568],{},"id"," being treated as new (golden outline) instead of core (yellow outline).",{"title":170,"searchDepth":171,"depth":171,"links":571},[572,573],{"id":48,"depth":174,"text":49},{"id":553,"depth":174,"text":554},{"version":575},"0.6.0","\u002Fchangelog\u002F0.6.0",{"title":406,"description":170},"changelog\u002F0.6.0","jGlJaxifKGuEMzfJyq8tD5Y8HQH5ioSUqfsKMNuVIxQ",{"id":581,"title":582,"body":583,"description":170,"extension":176,"meta":770,"navigation":179,"path":772,"seo":773,"stem":774,"__hash__":775},"changelog\u002Fchangelog\u002F0.5.0.md","v0.5.0",{"type":8,"value":584,"toc":760},[585,588,592,597,601,631,638,649,653,701,705,747,749],[11,586,582],{"id":587},"v050",[11,589,591],{"id":590},"version-050","Version 0.5.0",[593,594,596],"h2",{"id":595},"improvements","Improvements",[15,598,600],{"id":599},"empty-paragraph-auto-skip","Empty Paragraph Auto-Skip",[20,602,603,613,624],{},[23,604,605,606,243,609,612],{},"Paragraphs that resolve to empty text after inline ",[31,607,608],{},"if{}",[31,610,611],{},"fi{}"," processing are now automatically skipped. The engine advances to the next paragraph without displaying a blank dialogue box.",[23,614,615,616,619,620,623],{},"This allows conditional paragraphs that produce no output (e.g., ",[31,617,618],{},"if{flag = 0}Optional text.fi{}",") to be silently bypassed when the condition fails, without needing manual ",[31,621,622],{},"{redirect}"," workarounds.",[23,625,626,627,630],{},"Only triggers when both the output text is empty ",[26,628,629],{},"and"," no actions are attached to the paragraph.",[15,632,634,635,100],{"id":633},"intro-scenes-intro-true","Intro Scenes (",[31,636,637],{},"{intro: true}",[20,639,640,646],{},[23,641,642,643,645],{},"Scene paragraphs can now use ",[31,644,637],{}," in params to play block 1 (column 1) only on the first visit. On subsequent visits, the engine automatically redirects to block 2 (column 2).",[23,647,648],{},"Useful for first-time introductions, name reveals, or one-time exposition that should be replaced by a shorter greeting on repeat visits.",[15,650,652],{"id":651},"spine-character-dolls","Spine Character Dolls",[20,654,655,662,668,674,689],{},[23,656,657,658,661],{},"Characters can now use ",[26,659,660],{},"Spine skeletal animations"," as an alternative to static layered images. Configure atlas, skeleton, and default animation in the character template's Spine section.",[23,663,664,667],{},[31,665,666],{},"CharacterDoll"," component auto-detects spine config and renders the Spine animation – no component changes needed for game scripts.",[23,669,670,673],{},[26,671,672],{},"Convention-based skin mapping"," – character attribute values are used directly as Spine skin names. Changing an attribute reactively updates the Spine skins.",[23,675,676,677,680,681,684,685,688],{},"New ",[31,678,679],{},"animation"," type for the ",[31,682,683],{},"char"," action: ",[31,686,687],{},"{char: \"mc.animation=idle\"}"," switches the playing animation from content without code.",[23,690,691,692,93,695,93,698,45],{},"Script API: ",[31,693,694],{},"character.setSpineAnimation(name)",[31,696,697],{},"character.isSpineCharacter()",[31,699,700],{},"character.getSpineSkins()",[15,702,704],{"id":703},"character-views","Character Views",[20,706,707,720,733,736],{},[23,708,676,709,711,712,715,716,719],{},[26,710,704],{}," system for rendering characters from different perspectives (back, side, etc.). Define views in ",[26,713,714],{},"Characters > Views",", then tag skin layers or add ",[31,717,718],{},"spine_views"," entries on templates\u002Fstatuses.",[23,721,722,723,726,727,729,730,45],{},"View-tagged layers are excluded from default rendering (scenes, portraits, galleries) and only appear when explicitly requested via the ",[31,724,725],{},"views"," prop on ",[31,728,666],{}," or ",[31,731,732],{},"CharacterSlot",[23,734,735],{},"Static and Spine rendering are independent per view -- a static character can have a Spine back-view, or vice versa.",[23,737,691,738,93,741,93,744,45],{},[31,739,740],{},"character.isSpineForView(view)",[31,742,743],{},"character.getSpineForView(view)",[31,745,746],{},"character.getImageLayersForViews(views)",[15,748,554],{"id":553},[20,750,751,754],{},[23,752,753],{},"Fixed a bug where items could not be equipped.",[23,755,756,759],{},[31,757,758],{},"{actor: false}"," now properly triggers exit animations before removing characters from the scene. Previously it cleared all actors instantly without playing exit transitions.",{"title":170,"searchDepth":171,"depth":171,"links":761},[762],{"id":595,"depth":171,"text":596,"children":763},[764,765,767,768,769],{"id":599,"depth":174,"text":600},{"id":633,"depth":174,"text":766},"Intro Scenes ({intro: true})",{"id":651,"depth":174,"text":652},{"id":703,"depth":174,"text":704},{"id":553,"depth":174,"text":554},{"version":771},"0.5.0","\u002Fchangelog\u002F0.5.0",{"title":582,"description":170},"changelog\u002F0.5.0","UPlGp-z-Aivlx2T1CTsCmRq-yjRywUc0WJNhDCycp4Q",{"id":777,"title":778,"body":779,"description":170,"extension":176,"meta":1491,"navigation":179,"path":1493,"seo":1494,"stem":1495,"__hash__":1496},"changelog\u002Fchangelog\u002F0.4.0.md","v0.4.0",{"type":8,"value":780,"toc":1468},[781,784,788,790,794,858,862,892,896,916,920,959,963,1014,1018,1032,1036,1064,1068,1084,1088,1119,1123,1134,1141,1171,1175,1192,1196,1216,1220,1322,1326,1331,1335,1349,1353,1456,1460],[11,782,778],{"id":783},"v040",[11,785,787],{"id":786},"version-040","Version 0.4.0",[593,789,49],{"id":48},[15,791,793],{"id":792},"consumable-items","Consumable Items",[20,795,796,803,822,825,828,842,849,855],{},[23,797,798,799,802],{},"Added first-class consumable item support. Mark items with ",[31,800,801],{},"is_consumable"," to enable one-time-use effects (potions, scrolls, buff foods).",[23,804,805,806,809,810,813,814,817,818,821],{},"Consumable fields: ",[31,807,808],{},"consume_duration"," (status duration, -1 = permanent), ",[31,811,812],{},"consume_max_stacks"," (stacking cap, -1 = unlimited), ",[31,815,816],{},"consume_percentage"," (% of max resource), ",[31,819,820],{},"consume_absolute"," (flat resource amount).",[23,823,824],{},"Consume order: apply status → percentage resources → flat resources → reduce quantity.",[23,826,827],{},"Same item type produces the same status ID, enabling automatic stacking via the existing status system.",[23,829,830,831,834,835,838,839,841],{},"Added ",[31,832,833],{},"item_consume_before"," \u002F ",[31,836,837],{},"item_consume_after"," emitters. ",[31,840,833],{}," is cancellable (return false to prevent consumption).",[23,843,830,844,834,846,848],{},[31,845,833],{},[31,847,837],{}," action script slots on item templates.",[23,850,830,851,854],{},[31,852,853],{},"inventory.reduceItemQuantity(item, amount)"," helper method.",[23,856,857],{},"ItemCard tooltip now displays consume effects (restore\u002Freduce) with color coding and duration.",[15,859,861],{"id":860},"custom-vue-directives","Custom Vue Directives",[20,863,864,878],{},[23,865,830,866,869,870,873,874,877],{},[31,867,868],{},"v-persist"," directive for keeping images in browser memory cache. Prevents decoded image data from being evicted when elements are removed from DOM (e.g., panels using ",[31,871,872],{},"v-if","). Usage: ",[31,875,876],{},"\u003Cimg :src=\"iconPath\" v-persist \u002F>",". Cache holds up to 600 entries with automatic FIFO eviction.",[23,879,830,880,883,884,887,888,891],{},[31,881,882],{},"v-fit"," directive that auto-shrinks font size so text fits within its container. Reacts to text changes and container resizes. Usage: ",[31,885,886],{},"\u003Cdiv v-fit>{{ name }}\u003C\u002Fdiv>",". Supports ",[31,889,890],{},"{ min }"," option for minimum font size.",[15,893,895],{"id":894},"trait-merge-mode","Trait Merge Mode",[20,897,898],{},[23,899,830,900,903,904,907,908,911,912,915],{},[31,901,902],{},"is_merge"," flag to character trait schema. When enabled, trait values accumulate across statuses instead of last-wins. Merge behavior is type-aware: ",[31,905,906],{},"chooseMany"," deduplicates, ",[31,909,910],{},"array"," concatenates, ",[31,913,914],{},"schema"," deep-merges.",[15,917,919],{"id":918},"stat-display-improvements","Stat Display Improvements",[20,921,922,928,938,952],{},[23,923,830,924,927],{},[31,925,926],{},"reduction_is_good"," flag to character stats. When enabled, indicates that reducing the stat is beneficial (e.g., cooldowns). When disabled (default), increasing the stat is beneficial (e.g., health, damage). Used mainly for UI coloring.",[23,929,830,930,933,934,937],{},[31,931,932],{},"color"," field to resource stats. Hex color (without ",[31,935,936],{},"#",") used for resource bar fill.",[23,939,830,940,943,944,947,948,951],{},[31,941,942],{},"game.registerStatGroupResolver(resolver)"," method. Registers a function that receives a character and returns an array of stat tag names. The engine builds groups by filtering stats matching each tag, sorts by ",[31,945,946],{},"order",", and resolves display names from locale key ",[31,949,950],{},"group.{tag}",". Enables per-character stat group control (e.g., show breeding stats only for MC).",[23,953,954,955,958],{},"Removed ",[31,956,957],{},"character_stat_groups"," state. Replaced by the stat group resolver pattern above.",[15,960,962],{"id":961},"ability-description-auto-generation","Ability Description Auto-Generation",[20,964,965,979,996,1006],{},[23,966,830,967,970,971,974,975,978],{},[31,968,969],{},"ingame_description"," field to ability definitions (htmlarea, aspect role only). Template for auto-generating player-facing descriptions. Supports ",[31,972,973],{},"[v]"," for the aspect's value and ",[31,976,977],{},"[sibling_id]"," for other aspect values in the same effect.",[23,980,830,981,984,985,93,988,991,992,995],{},[31,982,983],{},"ingame_description_ref"," field to ability definitions. Dot-path to the display name in fromFile-referenced data (e.g., ",[31,986,987],{},"\"name\"",[31,989,990],{},"\"traits.name\"","). Falls back to ",[31,993,994],{},"name",", then raw ID.",[23,997,830,998,1001,1002,1005],{},[31,999,1000],{},"game.buildAbilityDescription(abilityId, characterId?, isFlat?)"," method. Returns auto-generated description lines per effect, or flat if ",[31,1003,1004],{},"isFlat"," is true.",[23,1007,830,1008,1010,1011,45],{},[31,1009,994],{}," field to ability template effects and ability modifier effects. Optional display name returned by ",[31,1012,1013],{},"buildAbilityDescription",[15,1015,1017],{"id":1016},"ability-ui-components","Ability UI Components",[20,1019,1020,1026],{},[23,1021,830,1022,1025],{},[31,1023,1024],{},"AbilityCard"," component for displaying detailed ability information with icon, name, cooldown, resource costs, description, and auto-generated effects.",[23,1027,830,1028,1031],{},[31,1029,1030],{},"AbilitiesViewer"," component for listing and selecting character abilities.",[15,1033,1035],{"id":1034},"engine-level-locale-system","Engine-Level Locale System",[20,1037,1038,1051],{},[23,1039,1040,1041,38,1043,1046,1047,1050],{},"Added native Locale tab under General in the editor. Locale entries have ",[31,1042,568],{},[31,1044,1045],{},"val"," fields, supporting ",[31,1048,1049],{},"|placeholder|"," syntax for dynamic content.",[23,1052,830,1053,1056,1057,1059,1060,1063],{},[31,1054,1055],{},"game.getLine(lineId, params?)"," method. Looks up a locale entry by ID and substitutes ",[31,1058,1049],{}," tokens with provided params. Returns ",[31,1061,1062],{},"[lineId]"," if entry not found.",[15,1065,1067],{"id":1066},"plugin-script-loading","Plugin Script Loading",[20,1069,1070],{},[23,1071,1072,1075,1076,1079,1080,1083],{},[26,1073,1074],{},"Breaking Change:"," Removed automatic script loading from plugins. Plugins must now explicitly specify scripts to load via the ",[31,1077,1078],{},"scripts"," field in ",[31,1081,1082],{},"plugin.json",". This enables proper ES6 module usage without double-loading imported files.",[15,1085,1087],{"id":1086},"data-api","Data API",[20,1089,1090,1101],{},[23,1091,1092,1093,1096,1097,1100],{},"Changed ",[31,1094,1095],{},"game.getData()"," return type to ",[31,1098,1099],{},"any",". Most paths return a Map, but plugin single-file configs return plain objects.",[23,1102,1103,1106,1107,1110,1111,1114,1115,1118],{},[31,1104,1105],{},"game.drawFromPool()"," now returns ",[31,1108,1109],{},"PoolDrawResult[]"," (",[31,1112,1113],{},"{ id: string, quantity: number }[]",") instead of flat ",[31,1116,1117],{},"string[]",". Duplicate draws are stacked by quantity, eliminating manual counting loops in callers.",[15,1120,1122],{"id":1121},"editor-schema-field-improvements","Editor Schema Field Improvements",[20,1124,1125],{},[23,1126,1127,1128,38,1130,1133],{},"Added \"Hide empty\" checkbox to both ",[31,1129,914],{},[31,1131,1132],{},"schema[]"," field headers in the editor. \"Hide empty\" hides fields with undefined, null, empty string, or empty array values. The setting is global and persists across sessions.",[15,1135,1137,1138,100],{"id":1136},"template-variants-n","Template Variants (",[31,1139,1140],{},"~N",[20,1142,1143],{},[23,1144,1145,1146,1149,1150,93,1153,1156,1157,93,1160,93,1163,1166,1167,1170],{},"Templates (",[31,1147,1148],{},"$template_id",") now support automatic random variant selection. Add numbered variants with ",[31,1151,1152],{},"~2",[31,1154,1155],{},"~3",", etc. suffixes (e.g., ",[31,1158,1159],{},"$greeting",[31,1161,1162],{},"$greeting~2",[31,1164,1165],{},"$greeting~3","). When ",[31,1168,1169],{},"|$greeting|"," is resolved, the engine picks one at random. No special syntax needed from the caller.",[15,1172,1174],{"id":1173},"component-registration-api","Component Registration API",[20,1176,1177,1186],{},[23,1178,830,1179,1182,1183,45],{},[31,1180,1181],{},"game.registerComponent(name, component)"," method. Allows plugins to register reusable Vue components to ",[31,1184,1185],{},"window.engine.components",[23,1187,830,1188,1191],{},[31,1189,1190],{},"game.getComponent(name)"," method. Retrieves a registered component by name(you can still access them via window.engine.components).",[15,1193,1195],{"id":1194},"settings-api","Settings API",[20,1197,1198,1207],{},[23,1199,830,1200,38,1203,1206],{},[31,1201,1202],{},"game.getEngineSetting(key)",[31,1204,1205],{},"game.setEngineSetting(key, value)"," methods. Read and write engine-level settings (music_volume, sound_volume, font_size, typing_speed). Shared across all games, persisted to browser localStorage.",[23,1208,830,1209,38,1212,1215],{},[31,1210,1211],{},"game.getGameSetting(key)",[31,1213,1214],{},"game.setGameSetting(key, value)"," methods. Read and write per-game settings defined in game_settings.json. Persisted in save files.",[15,1217,1219],{"id":1218},"narrative-system","Narrative System",[20,1221,1222,1241,1248,1273,1279,1282,1288,1303],{},[23,1223,1224,1225,1228,1229,1232,1233,1236,1237,1240],{},"Added data-driven narrative composition system. Define ",[26,1226,1227],{},"slots"," (insertion points), ",[26,1230,1231],{},"states"," (matching conditions), ",[26,1234,1235],{},"tags"," (categorized value pools), and ",[26,1238,1239],{},"segments"," (text fragments with conditions). The engine selects the best-matching segment at runtime based on live game state.",[23,1242,1243,1244,1247],{},"Slots are referenced in any text with ",[31,1245,1246],{},"|@slotId|"," syntax — resolved inline through the standard text pipeline. Slots can nest other slots for hierarchical composition.",[23,1249,1250,1251,1254,1255,1258,1259,93,1262,93,1265,93,1268,93,1271,45],{},"States support two modes: ",[26,1252,1253],{},"gate"," (hard filter — mismatch eliminates the segment) and ",[26,1256,1257],{},"identity"," (soft preference — match increases priority, mismatch ignored). Supported types: ",[31,1260,1261],{},"boolean",[31,1263,1264],{},"number",[31,1266,1267],{},"range",[31,1269,1270],{},"chooseOne",[31,1272,906],{},[23,1274,1275,1276,1278],{},"Identity states with ",[31,1277,906],{}," use per-overlap scoring — each matching tag adds specificity independently, so a segment matching 3 of 5 tags ranks higher than one matching 1.",[23,1280,1281],{},"Selection pipeline: collect by slot → filter by gates → score identity → keep top specificity tier → anti-repeat (last 2 per slot) → weighted random → resolve content.",[23,1283,830,1284,1287],{},[31,1285,1286],{},"game.registerNarrativeState(id, evaluator)"," method. Registers a function that provides runtime values for state matching.",[23,1289,1290,1291,93,1294,93,1297,93,1300,45],{},"Added 4 editor subtabs under Narrative: ",[26,1292,1293],{},"Tags",[26,1295,1296],{},"Slots",[26,1298,1299],{},"States",[26,1301,1302],{},"Segments",[23,1304,830,1305,1308,1309,243,1311,1313,1314,1317,1318,1321],{},[31,1306,1307],{},"fromFileType: 'values'"," option for ",[31,1310,1270],{},[31,1312,906],{}," schema fields. Reads ",[31,1315,1316],{},"item.values"," arrays instead of ",[31,1319,1320],{},"item.id"," — enables tag-based option lists filtered by category.",[15,1323,1325],{"id":1324},"plugin-documentation-system","Plugin Documentation System",[20,1327,1328],{},[23,1329,1330],{},"Plugins can now ship their own documentation.",[15,1332,1334],{"id":1333},"built-in-plugins","Built-in Plugins",[20,1336,1337,1343],{},[23,1338,830,1339,1342],{},[26,1340,1341],{},"Auto Battler"," plugin — an ATB combat system with grid positioning, token-based status effects, AI decision-making, and autocast. Includes full documentation.",[23,1344,830,1345,1348],{},[26,1346,1347],{},"Gender & POV"," plugin — dynamic text substitution with two subsystems: POV (1st\u002F2nd person) for the main character, and Gender (masculine\u002Ffeminine pronouns) for NPCs.",[15,1350,1352],{"id":1351},"action-naming-convention","Action Naming Convention",[20,1354,1355],{},[23,1356,1357,1359,1360,1363,1364,1367,1368,93,1371,1367,1374,93,1377,1367,1380,93,1383,1367,1386,93,1389,1367,1392,93,1395,1367,1398,93,1400,1367,1403,93,1405,1367,1408,93,1410,1367,1413,93,1415,1367,1418,93,1420,1367,1423,93,1426,1367,1429,93,1432,1367,1435,93,1438,1367,1441,93,1444,1367,1447,93,1450,1367,1453,45],{},[26,1358,1074],{}," All built-in action names standardized to ",[31,1361,1362],{},"snake_case",". Renamed: ",[31,1365,1366],{},"joinParty"," → ",[31,1369,1370],{},"join_party",[31,1372,1373],{},"leaveParty",[31,1375,1376],{},"leave_party",[31,1378,1379],{},"createCharacter",[31,1381,1382],{},"create_character",[31,1384,1385],{},"updateCharacter",[31,1387,1388],{},"update_character",[31,1390,1391],{},"deleteCharacter",[31,1393,1394],{},"delete_character",[31,1396,1397],{},"addStatus",[31,1399,239],{},[31,1401,1402],{},"addSkinLayer",[31,1404,242],{},[31,1406,1407],{},"removeSkinLayer",[31,1409,246],{},[31,1411,1412],{},"addItemSlot",[31,1414,250],{},[31,1416,1417],{},"removeItemSlot",[31,1419,253],{},[31,1421,1422],{},"equipItem",[31,1424,1425],{},"equip_item",[31,1427,1428],{},"unequipItem",[31,1430,1431],{},"unequip_item",[31,1433,1434],{},"consumeItem",[31,1436,1437],{},"consume_item",[31,1439,1440],{},"addItem",[31,1442,1443],{},"add_item",[31,1445,1446],{},"learnRecipe",[31,1448,1449],{},"learn_recipe",[31,1451,1452],{},"choicesOver",[31,1454,1455],{},"choices_over",[15,1457,1459],{"id":1458},"art-manager-improvements","Art Manager Improvements",[20,1461,1462,1465],{},[23,1463,1464],{},"Improved character Art Manager popup with game-accurate preview. Shows game padding zone and character-sheet boundary line scaled to rendered image size.",[23,1466,1467],{},"Art offset (art_dx, art_dy) is now draggable directly on the character image.",{"title":170,"searchDepth":171,"depth":171,"links":1469},[1470],{"id":48,"depth":171,"text":49,"children":1471},[1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1484,1485,1486,1487,1488,1489,1490],{"id":792,"depth":174,"text":793},{"id":860,"depth":174,"text":861},{"id":894,"depth":174,"text":895},{"id":918,"depth":174,"text":919},{"id":961,"depth":174,"text":962},{"id":1016,"depth":174,"text":1017},{"id":1034,"depth":174,"text":1035},{"id":1066,"depth":174,"text":1067},{"id":1086,"depth":174,"text":1087},{"id":1121,"depth":174,"text":1122},{"id":1136,"depth":174,"text":1483},"Template Variants (~N)",{"id":1173,"depth":174,"text":1174},{"id":1194,"depth":174,"text":1195},{"id":1218,"depth":174,"text":1219},{"id":1324,"depth":174,"text":1325},{"id":1333,"depth":174,"text":1334},{"id":1351,"depth":174,"text":1352},{"id":1458,"depth":174,"text":1459},{"version":1492},"0.4.0","\u002Fchangelog\u002F0.4.0",{"title":778,"description":170},"changelog\u002F0.4.0","8ur2dNCgzT-dX1Irz7UDubZ_ODXubWW-YD-caFmfBOY",{"id":1498,"title":1499,"body":1500,"description":170,"extension":176,"meta":1758,"navigation":179,"path":1760,"seo":1761,"stem":1762,"__hash__":1763},"changelog\u002Fchangelog\u002F0.3.0.md","v0.3.0",{"type":8,"value":1501,"toc":1742},[1502,1505,1509,1511,1515,1524,1528,1533,1537,1565,1569,1582,1584,1595,1599,1616,1620,1638,1642,1657,1661,1681,1685,1693,1697,1702,1704],[11,1503,1499],{"id":1504},"v030",[11,1506,1508],{"id":1507},"version-030","Version 0.3.0",[593,1510,49],{"id":48},[15,1512,1514],{"id":1513},"html-editor","HTML Editor",[20,1516,1517],{},[23,1518,1519,1520,1523],{},"HTML editor forms now support adding local images using relative paths (e.g., ",[31,1521,1522],{},"assets\u002Fgames_assets\u002Fmy_game\u002F_core\u002Fimages\u002Ficon.webp",").",[15,1525,1527],{"id":1526},"template-validation","Template Validation",[20,1529,1530],{},[23,1531,1532],{},"Custom Vue Components are now validated at registration time. Includes tag mismatch analysis to help find mismatched HTML tags.",[15,1534,1536],{"id":1535},"character-api","Character API",[20,1538,1539,1556],{},[23,1540,1541,1544,1545,1548,1549,1552,1553,45],{},[26,1542,1543],{},"Breaking:"," ",[31,1546,1547],{},"character.getStat(name)"," now returns a number directly instead of a reactive ref. If you were using ",[31,1550,1551],{},"character.getStat(\"health\").value",", change it to ",[31,1554,1555],{},"character.getStat(\"health\")",[23,1557,830,1558,1561,1562,100],{},[31,1559,1560],{},"character.getStatRef(name)"," for when you need the reactive ComputedRef (e.g., for ",[31,1563,1564],{},"watch()",[15,1566,1568],{"id":1567},"inventory-api","Inventory API",[20,1570,1571],{},[23,1572,1573,1544,1575,1578,1579],{},[26,1574,1543],{},[31,1576,1577],{},"inventory.getCurrencyAmount(id)"," renamed to ",[31,1580,1581],{},"inventory.getItemQuantity(id)",[15,1583,1087],{"id":1086},[20,1585,1586],{},[23,1587,1588,1591,1592,1594],{},[31,1589,1590],{},"game.getData(path, original?)"," now returns a deep copy of the data by default, making it safe to modify without affecting the source. Pass ",[31,1593,68],{}," as the second parameter to get the original data for better performance (read-only).",[15,1596,1598],{"id":1597},"random-pools","Random Pools",[20,1600,1601,1607,1613],{},[23,1602,830,1603,1606],{},[31,1604,1605],{},"game.drawFromPool(entry, settings?)"," for weighted random selection using editor-defined pool entries with filters, entity groups, and multiple selection modes.",[23,1608,830,1609,1612],{},[31,1610,1611],{},"game.drawFromCollection(collection, settings?)"," for simple weighted draws from any array or Map without defining pool templates.",[23,1614,1615],{},"For more details see 'Random Pools' documentation.",[15,1617,1619],{"id":1618},"constant-properties","Constant Properties",[20,1621,1622,1632,1635],{},[23,1623,1624,1625,1110,1628,1631],{},"Properties can now be marked as ",[26,1626,1627],{},"constant",[31,1629,1630],{},"is_constant: true",") in the editor.",[23,1633,1634],{},"Constant properties cannot be modified at runtime and are excluded from save files.",[23,1636,1637],{},"Use for game constants that modders can override (e.g., base stats, multipliers, config values).",[15,1639,1641],{"id":1640},"game-events","Game Events",[20,1643,1644],{},[23,1645,1646,38,1649,1652,1653,1656],{},[31,1647,1648],{},"room_enter_before",[31,1650,1651],{},"room_enter_after"," events now receive ",[31,1654,1655],{},"dungeonId"," as a second parameter.",[15,1658,1660],{"id":1659},"localhost-development","Localhost Development",[20,1662,1663,1670],{},[23,1664,1665,1666,1669],{},"Added standalone development server (",[31,1667,1668],{},"dev-server.cjs",") for running the engine in localhost mode without Electron.",[23,1671,1672,1673,1676,1677,1680],{},"Run ",[31,1674,1675],{},"npm run dev-server"," to start the data API server, then ",[31,1678,1679],{},"npm run start"," for the Vite dev server.",[15,1682,1684],{"id":1683},"docs","Docs",[20,1686,1687,1690],{},[23,1688,1689],{},"Added Dungeons API documentation.",[23,1691,1692],{},"Updated exported components documentation with grouped categories and detailed prop descriptions.",[15,1694,1696],{"id":1695},"ui","UI",[20,1698,1699],{},[23,1700,1701],{},"Improved Character Sheet UI with flexible stat groups layout and resource bars for resource-type stats.",[15,1703,554],{"id":553},[20,1705,1706,1709,1716,1723,1729,1739],{},[23,1707,1708],{},"Fixed choices not appearing for text-type dungeons in scene mode.",[23,1710,1711,1712,1715],{},"Plugin array data is now converted to Map format in the data registry, consistent with other data types. Use ",[31,1713,1714],{},"getData(\"path\").get(id)"," to access items.",[23,1717,1718,1719,1722],{},"Fixed resource values not clamping to new max when a status is removed and ",[31,1720,1721],{},"can_overflow"," is false.",[23,1724,1725,1726,1728],{},"Fixed plugin ",[31,1727,1132],{}," fields showing numeric indexes (0, 1, 2) instead of property IDs as field labels.",[23,1730,1731,1732,38,1735,1738],{},"Fixed ",[31,1733,1734],{},"fromFileTypeAnd",[31,1736,1737],{},"fromFileTypeOr"," not working for plugin-generated forms.",[23,1740,1741],{},"Fixed file search not matching paths with Windows-style backslashes.",{"title":170,"searchDepth":171,"depth":171,"links":1743},[1744],{"id":48,"depth":171,"text":49,"children":1745},[1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757],{"id":1513,"depth":174,"text":1514},{"id":1526,"depth":174,"text":1527},{"id":1535,"depth":174,"text":1536},{"id":1567,"depth":174,"text":1568},{"id":1086,"depth":174,"text":1087},{"id":1597,"depth":174,"text":1598},{"id":1618,"depth":174,"text":1619},{"id":1640,"depth":174,"text":1641},{"id":1659,"depth":174,"text":1660},{"id":1683,"depth":174,"text":1684},{"id":1695,"depth":174,"text":1696},{"id":553,"depth":174,"text":554},{"version":1759},"0.3.0","\u002Fchangelog\u002F0.3.0",{"title":1499,"description":170},"changelog\u002F0.3.0","NZxX4XB2_2N6kDKyAzFx1JplFklNl8RRyx8EmNjBtV8",{"id":1765,"title":1766,"body":1767,"description":170,"extension":176,"meta":2214,"navigation":179,"path":2216,"seo":2217,"stem":2218,"__hash__":2219},"changelog\u002Fchangelog\u002F0.2.0.md","v0.2.0",{"type":8,"value":1768,"toc":2197},[1769,1772,1776,1778,1780,1862,1866,1978,1980,1983,2131,2135,2139,2143,2151,2155,2163,2167,2176,2178,2181,2186,2188,2193],[11,1770,1766],{"id":1771},"v020",[11,1773,1775],{"id":1774},"version-020","Version 0.2.0",[593,1777,18],{"id":17},[15,1779,1536],{"id":1535},[20,1781,1782],{},[23,1783,1784,1787,1788,1791,1792],{},[31,1785,1786],{},"createCharacterFromTemplate()"," has been removed. Use ",[31,1789,1790],{},"createCharacter()"," instead, which now accepts both template objects and template ID strings.\n",[1793,1794,1798],"pre",{"className":1795,"code":1796,"language":1797,"meta":170,"style":170},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F Before\ngame.createCharacterFromTemplate(\"npc_1\", \"npc_template\");\n\n\u002F\u002F After\ngame.createCharacter(\"npc_1\", \"npc_template\");\n","js",[31,1799,1800,1809,1834,1839,1845],{"__ignoreMap":170},[1801,1802,1805],"span",{"class":1803,"line":1804},"line",1,[1801,1806,1808],{"class":1807},"sJ8bj","\u002F\u002F Before\n",[1801,1810,1811,1815,1819,1822,1826,1828,1831],{"class":1803,"line":171},[1801,1812,1814],{"class":1813},"sVt8B","game.",[1801,1816,1818],{"class":1817},"sScJk","createCharacterFromTemplate",[1801,1820,1821],{"class":1813},"(",[1801,1823,1825],{"class":1824},"sZZnC","\"npc_1\"",[1801,1827,93],{"class":1813},[1801,1829,1830],{"class":1824},"\"npc_template\"",[1801,1832,1833],{"class":1813},");\n",[1801,1835,1836],{"class":1803,"line":174},[1801,1837,1838],{"emptyLinePlaceholder":179},"\n",[1801,1840,1842],{"class":1803,"line":1841},4,[1801,1843,1844],{"class":1807},"\u002F\u002F After\n",[1801,1846,1848,1850,1852,1854,1856,1858,1860],{"class":1803,"line":1847},5,[1801,1849,1814],{"class":1813},[1801,1851,1379],{"class":1817},[1801,1853,1821],{"class":1813},[1801,1855,1825],{"class":1824},[1801,1857,93],{"class":1813},[1801,1859,1830],{"class":1824},[1801,1861,1833],{"class":1813},[15,1863,1865],{"id":1864},"item-api","Item API",[20,1867,1868,1920],{},[23,1869,1870,1787,1873,1791,1876],{},[31,1871,1872],{},"createItemFromTemplate()",[31,1874,1875],{},"createItem()",[1793,1877,1879],{"className":1795,"code":1878,"language":1797,"meta":170,"style":170},"\u002F\u002F Before\ngame.createItemFromTemplate(\"iron_sword\");\n\n\u002F\u002F After\ngame.createItem(\"iron_sword\");\n",[31,1880,1881,1885,1899,1903,1907],{"__ignoreMap":170},[1801,1882,1883],{"class":1803,"line":1804},[1801,1884,1808],{"class":1807},[1801,1886,1887,1889,1892,1894,1897],{"class":1803,"line":171},[1801,1888,1814],{"class":1813},[1801,1890,1891],{"class":1817},"createItemFromTemplate",[1801,1893,1821],{"class":1813},[1801,1895,1896],{"class":1824},"\"iron_sword\"",[1801,1898,1833],{"class":1813},[1801,1900,1901],{"class":1803,"line":174},[1801,1902,1838],{"emptyLinePlaceholder":179},[1801,1904,1905],{"class":1803,"line":1841},[1801,1906,1844],{"class":1807},[1801,1908,1909,1911,1914,1916,1918],{"class":1803,"line":1847},[1801,1910,1814],{"class":1813},[1801,1912,1913],{"class":1817},"createItem",[1801,1915,1821],{"class":1813},[1801,1917,1896],{"class":1824},[1801,1919,1833],{"class":1813},[23,1921,1922,1787,1925,1928,1929],{},[31,1923,1924],{},"createInventoryFromTemplate()",[31,1926,1927],{},"createInventory()"," with optional second parameter instead.\n",[1793,1930,1932],{"className":1795,"code":1931,"language":1797,"meta":170,"style":170},"\u002F\u002F Before\ngame.createInventoryFromTemplate(\"shop_template\");\n\n\u002F\u002F After\ngame.createInventory(\"shop_id\", \"shop_template\");\n",[31,1933,1934,1938,1952,1956,1960],{"__ignoreMap":170},[1801,1935,1936],{"class":1803,"line":1804},[1801,1937,1808],{"class":1807},[1801,1939,1940,1942,1945,1947,1950],{"class":1803,"line":171},[1801,1941,1814],{"class":1813},[1801,1943,1944],{"class":1817},"createInventoryFromTemplate",[1801,1946,1821],{"class":1813},[1801,1948,1949],{"class":1824},"\"shop_template\"",[1801,1951,1833],{"class":1813},[1801,1953,1954],{"class":1803,"line":174},[1801,1955,1838],{"emptyLinePlaceholder":179},[1801,1957,1958],{"class":1803,"line":1841},[1801,1959,1844],{"class":1807},[1801,1961,1962,1964,1967,1969,1972,1974,1976],{"class":1803,"line":1847},[1801,1963,1814],{"class":1813},[1801,1965,1966],{"class":1817},"createInventory",[1801,1968,1821],{"class":1813},[1801,1970,1971],{"class":1824},"\"shop_id\"",[1801,1973,93],{"class":1813},[1801,1975,1949],{"class":1824},[1801,1977,1833],{"class":1813},[593,1979,49],{"id":48},[15,1981,1536],{"id":1982},"character-api-1",[20,1984,1985,2064],{},[23,1986,1987,1990,1991],{},[31,1988,1989],{},"createStatus()"," accepts both template objects and template ID strings.\n",[1793,1992,1994],{"className":1795,"code":1993,"language":1797,"meta":170,"style":170},"\u002F\u002F From template ID\nconst buff = game.createStatus(\"strength_buff\");\n\n\u002F\u002F From custom object\nconst custom = game.createStatus({ id: \"my_buff\", stats: { strength: 5 } });\n",[31,1995,1996,2001,2027,2031,2036],{"__ignoreMap":170},[1801,1997,1998],{"class":1803,"line":1804},[1801,1999,2000],{"class":1807},"\u002F\u002F From template ID\n",[1801,2002,2003,2007,2011,2014,2017,2020,2022,2025],{"class":1803,"line":171},[1801,2004,2006],{"class":2005},"szBVR","const",[1801,2008,2010],{"class":2009},"sj4cs"," buff",[1801,2012,2013],{"class":2005}," =",[1801,2015,2016],{"class":1813}," game.",[1801,2018,2019],{"class":1817},"createStatus",[1801,2021,1821],{"class":1813},[1801,2023,2024],{"class":1824},"\"strength_buff\"",[1801,2026,1833],{"class":1813},[1801,2028,2029],{"class":1803,"line":174},[1801,2030,1838],{"emptyLinePlaceholder":179},[1801,2032,2033],{"class":1803,"line":1841},[1801,2034,2035],{"class":1807},"\u002F\u002F From custom object\n",[1801,2037,2038,2040,2043,2045,2047,2049,2052,2055,2058,2061],{"class":1803,"line":1847},[1801,2039,2006],{"class":2005},[1801,2041,2042],{"class":2009}," custom",[1801,2044,2013],{"class":2005},[1801,2046,2016],{"class":1813},[1801,2048,2019],{"class":1817},[1801,2050,2051],{"class":1813},"({ id: ",[1801,2053,2054],{"class":1824},"\"my_buff\"",[1801,2056,2057],{"class":1813},", stats: { strength: ",[1801,2059,2060],{"class":2009},"5",[1801,2062,2063],{"class":1813}," } });\n",[23,2065,2066,93,2069,247,2072,2075,2076],{},[31,2067,2068],{},"addToParty()",[31,2070,2071],{},"removeFromParty()",[31,2073,2074],{},"deleteCharacter()"," now accept both Character instance and ID string.\n",[1793,2077,2079],{"className":1795,"code":2078,"language":1797,"meta":170,"style":170},"game.addToParty(\"alice\");       \u002F\u002F Using ID string\ngame.removeFromParty(\"bob\");    \u002F\u002F Using ID string\ngame.deleteCharacter(\"npc_1\");  \u002F\u002F Using ID string\n",[31,2080,2081,2099,2116],{"__ignoreMap":170},[1801,2082,2083,2085,2088,2090,2093,2096],{"class":1803,"line":1804},[1801,2084,1814],{"class":1813},[1801,2086,2087],{"class":1817},"addToParty",[1801,2089,1821],{"class":1813},[1801,2091,2092],{"class":1824},"\"alice\"",[1801,2094,2095],{"class":1813},");       ",[1801,2097,2098],{"class":1807},"\u002F\u002F Using ID string\n",[1801,2100,2101,2103,2106,2108,2111,2114],{"class":1803,"line":171},[1801,2102,1814],{"class":1813},[1801,2104,2105],{"class":1817},"removeFromParty",[1801,2107,1821],{"class":1813},[1801,2109,2110],{"class":1824},"\"bob\"",[1801,2112,2113],{"class":1813},");    ",[1801,2115,2098],{"class":1807},[1801,2117,2118,2120,2122,2124,2126,2129],{"class":1803,"line":174},[1801,2119,1814],{"class":1813},[1801,2121,1391],{"class":1817},[1801,2123,1821],{"class":1813},[1801,2125,1825],{"class":1824},[1801,2127,2128],{"class":1813},");  ",[1801,2130,2098],{"class":1807},[15,2132,2134],{"id":2133},"changelog-viewer","Changelog Viewer",[2136,2137,2138],"p",{},"Click on the engine version number in the main menu to view the changelog.",[15,2140,2142],{"id":2141},"file-browser","File Browser",[20,2144,2145,2148],{},[23,2146,2147],{},"Added \"Clear Cache\" button in file picker dropdown to refresh file list after adding new assets.",[23,2149,2150],{},"Added \"Resources\u002FFile Browser\" documentation page.",[15,2152,2154],{"id":2153},"ui-improvements","UI Improvements",[20,2156,2157,2160],{},[23,2158,2159],{},"Improved UI for the Editor Form Buttons.",[23,2161,2162],{},"Added key filtering for schema fields - filter input appears when schema is expanded.",[15,2164,2166],{"id":2165},"character-templates","Character Templates",[20,2168,2169],{},[23,2170,2171,2172,2175],{},"added ",[31,2173,2174],{},"starting_statuses"," field to Character Templates Form for adding statuses on character creation.",[593,2177,554],{"id":553},[15,2179,2142],{"id":2180},"file-browser-1",[20,2182,2183],{},[23,2184,2185],{},"Fixed WebP auto-conversion triggering on typed search strings instead of only on selected files.",[15,2187,1696],{"id":1695},[20,2189,2190],{},[23,2191,2192],{},"Fixed UI styling issues when OS dark mode is enabled.",[2194,2195,2196],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":170,"searchDepth":171,"depth":171,"links":2198},[2199,2203,2210],{"id":17,"depth":171,"text":18,"children":2200},[2201,2202],{"id":1535,"depth":174,"text":1536},{"id":1864,"depth":174,"text":1865},{"id":48,"depth":171,"text":49,"children":2204},[2205,2206,2207,2208,2209],{"id":1982,"depth":174,"text":1536},{"id":2133,"depth":174,"text":2134},{"id":2141,"depth":174,"text":2142},{"id":2153,"depth":174,"text":2154},{"id":2165,"depth":174,"text":2166},{"id":553,"depth":171,"text":554,"children":2211},[2212,2213],{"id":2180,"depth":174,"text":2142},{"id":1695,"depth":174,"text":1696},{"version":2215},"0.2.0","\u002Fchangelog\u002F0.2.0",{"title":1766,"description":170},"changelog\u002F0.2.0","gb6lXoULEq9eTNcQE8IR45U1Lh6WZ5T5f7rKHd5UZg0",1779582269232]