[{"data":1,"prerenderedAt":1009},["ShallowReactive",2],{"doc-global_essentials\u002Fadvanced\u002Fset_up_coding":3},{"id":4,"title":5,"body":6,"description":17,"extension":1000,"meta":1001,"navigation":275,"path":1005,"seo":1006,"stem":1007,"__hash__":1008},"docs\u002Fdocs\u002Fglobal_essentials\u002Fadvanced\u002Fset_up_coding.md","Set Up Coding Environment",{"type":7,"value":8,"toc":976},"minimark",[9,14,18,21,26,34,39,64,77,81,141,143,147,153,186,195,232,236,325,329,340,342,346,353,357,371,375,382,449,452,454,458,469,503,506,508,512,520,522,526,529,695,699,702,741,783,785,789,792,796,860,864,870,943,945,949,972],[10,11,13],"h1",{"id":12},"setting-up-your-coding-environment","Setting Up Your Coding Environment",[15,16,17],"p",{},"This guide covers how to set up your development environment for writing custom scripts and styles for your game.",[19,20],"hr",{},[22,23,25],"h2",{"id":24},"recommended-visual-studio-code","Recommended: Visual Studio Code",[15,27,28,29,33],{},"We strongly recommend using ",[30,31,32],"strong",{},"Visual Studio Code (VS Code)"," for the best development experience.",[35,36,38],"h3",{"id":37},"quick-setup","Quick Setup",[40,41,42,53],"ol",{},[43,44,45,46],"li",{},"Download VS Code from ",[47,48,52],"a",{"href":49,"rel":50},"https:\u002F\u002Fcode.visualstudio.com\u002F",[51],"nofollow","code.visualstudio.com",[43,54,55,56,60,61],{},"Right-click on the root ",[57,58,59],"code",{},"assets"," folder → ",[30,62,63],{},"Open with Code",[15,65,66,69,70,72,73,76],{},[30,67,68],{},"Important:"," Open the root ",[57,71,59],{}," folder, not your game's subfolder. The root folder contains ",[57,74,75],{},"jsconfig.json"," which configures VS Code to use the engine's type definitions.",[35,78,80],{"id":79},"what-you-get","What You Get",[82,83,84,97],"table",{},[85,86,87],"thead",{},[88,89,90,94],"tr",{},[91,92,93],"th",{},"Feature",[91,95,96],{},"Description",[98,99,100,111,121,131],"tbody",{},[88,101,102,108],{},[103,104,105],"td",{},[30,106,107],{},"Autocomplete",[103,109,110],{},"Full autocomplete for all engine APIs",[88,112,113,118],{},[103,114,115],{},[30,116,117],{},"Type checking",[103,119,120],{},"Catches errors before runtime",[88,122,123,128],{},[103,124,125],{},[30,126,127],{},"Inline documentation",[103,129,130],{},"Hover over methods to see documentation",[88,132,133,138],{},[103,134,135],{},[30,136,137],{},"Error highlighting",[103,139,140],{},"Common mistakes highlighted as you type",[19,142],{},[22,144,146],{"id":145},"how-it-works","How It Works",[15,148,149,150,152],{},"The root ",[57,151,59],{}," folder contains two important files:",[82,154,155,165],{},[85,156,157],{},[88,158,159,162],{},[91,160,161],{},"File",[91,163,164],{},"Purpose",[98,166,167,176],{},[88,168,169,173],{},[103,170,171],{},[57,172,75],{},[103,174,175],{},"Configures VS Code to recognize JavaScript files and use type definitions",[88,177,178,183],{},[103,179,180],{},[57,181,182],{},"\u002Fengine_files\u002Ftypes.d.ts",[103,184,185],{},"TypeScript definitions for all engine APIs",[15,187,188,189,191,192,194],{},"When you open the ",[57,190,59],{}," folder in VS Code, the editor reads ",[57,193,75],{}," and automatically enables:",[196,197,198,214,220,226],"ul",{},[43,199,200,202,203,206,207,206,210,213],{},[30,201,107],{}," for ",[57,204,205],{},"window.engine",", ",[57,208,209],{},"game",[57,211,212],{},"vue",", and all other engine objects",[43,215,216,219],{},[30,217,218],{},"Parameter hints"," showing what arguments methods expect",[43,221,222,225],{},[30,223,224],{},"Return type information"," so you know what data you're working with",[43,227,228,231],{},[30,229,230],{},"Error detection"," for typos and incorrect method calls",[35,233,235],{"id":234},"example","Example",[237,238,243],"pre",{"className":239,"code":240,"language":241,"meta":242,"style":242},"language-javascript shiki shiki-themes github-light github-dark","const { game } = window.engine;\n\n\u002F\u002F VS Code will show autocomplete for all game methods\ngame.getCharacter(\"alice\");  \u002F\u002F ✓ Valid\ngame.getCharcter(\"alice\");   \u002F\u002F ✗ Typo highlighted as error\n","javascript","",[57,244,245,270,277,284,307],{"__ignoreMap":242},[246,247,250,254,258,261,264,267],"span",{"class":248,"line":249},"line",1,[246,251,253],{"class":252},"szBVR","const",[246,255,257],{"class":256},"sVt8B"," { ",[246,259,209],{"class":260},"sj4cs",[246,262,263],{"class":256}," } ",[246,265,266],{"class":252},"=",[246,268,269],{"class":256}," window.engine;\n",[246,271,273],{"class":248,"line":272},2,[246,274,276],{"emptyLinePlaceholder":275},true,"\n",[246,278,280],{"class":248,"line":279},3,[246,281,283],{"class":282},"sJ8bj","\u002F\u002F VS Code will show autocomplete for all game methods\n",[246,285,287,290,294,297,301,304],{"class":248,"line":286},4,[246,288,289],{"class":256},"game.",[246,291,293],{"class":292},"sScJk","getCharacter",[246,295,296],{"class":256},"(",[246,298,300],{"class":299},"sZZnC","\"alice\"",[246,302,303],{"class":256},");  ",[246,305,306],{"class":282},"\u002F\u002F ✓ Valid\n",[246,308,310,312,315,317,319,322],{"class":248,"line":309},5,[246,311,289],{"class":256},[246,313,314],{"class":292},"getCharcter",[246,316,296],{"class":256},[246,318,300],{"class":299},[246,320,321],{"class":256},");   ",[246,323,324],{"class":282},"\u002F\u002F ✗ Typo highlighted as error\n",[35,326,328],{"id":327},"tip-use-mjs-extension","Tip: Use .mjs Extension",[15,330,331,332,335,336,339],{},"Use ",[57,333,334],{},".mjs"," extension for your script files instead of ",[57,337,338],{},".js",". This tells VS Code to treat the file as an ES module, enabling better autocomplete and import support.",[19,341],{},[22,343,345],{"id":344},"recommended-plugin-es6-string-html","Recommended Plugin: es6-string-html",[15,347,348,349,352],{},"When writing custom HTML components in scripts, you'll use template strings for HTML. Install the ",[30,350,351],{},"es6-string-html"," VS Code extension to get syntax highlighting inside these templates.",[35,354,356],{"id":355},"installation","Installation",[40,358,359,362,365,368],{},[43,360,361],{},"Open VS Code",[43,363,364],{},"Go to Extensions (Ctrl+Shift+X)",[43,366,367],{},"Search for \"es6-string-html\"",[43,369,370],{},"Install the extension",[35,372,374],{"id":373},"usage","Usage",[15,376,377,378,381],{},"Add ",[57,379,380],{},"\u002F*html*\u002F"," comment before your template string:",[237,383,385],{"className":239,"code":384,"language":241,"meta":242,"style":242},"const MyComponent = vue.defineComponent({\n  template: \u002F*html*\u002F`\n    \u003Cdiv class=\"my-component\">\n      \u003Ch1>{{ title }}\u003C\u002Fh1>\n      \u003Cbutton @click=\"onClick\">Click me\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n  `\n});\n",[57,386,387,406,416,421,426,431,437,443],{"__ignoreMap":242},[246,388,389,391,394,397,400,403],{"class":248,"line":249},[246,390,253],{"class":252},[246,392,393],{"class":260}," MyComponent",[246,395,396],{"class":252}," =",[246,398,399],{"class":256}," vue.",[246,401,402],{"class":292},"defineComponent",[246,404,405],{"class":256},"({\n",[246,407,408,411,413],{"class":248,"line":272},[246,409,410],{"class":256},"  template: ",[246,412,380],{"class":282},[246,414,415],{"class":299},"`\n",[246,417,418],{"class":248,"line":279},[246,419,420],{"class":299},"    \u003Cdiv class=\"my-component\">\n",[246,422,423],{"class":248,"line":286},[246,424,425],{"class":299},"      \u003Ch1>{{ title }}\u003C\u002Fh1>\n",[246,427,428],{"class":248,"line":309},[246,429,430],{"class":299},"      \u003Cbutton @click=\"onClick\">Click me\u003C\u002Fbutton>\n",[246,432,434],{"class":248,"line":433},6,[246,435,436],{"class":299},"    \u003C\u002Fdiv>\n",[246,438,440],{"class":248,"line":439},7,[246,441,442],{"class":299},"  `\n",[246,444,446],{"class":248,"line":445},8,[246,447,448],{"class":256},"});\n",[15,450,451],{},"The HTML inside the template string will now have proper syntax highlighting, making it much easier to read and write.",[19,453],{},[22,455,457],{"id":456},"connecting-scripts-and-css","Connecting Scripts and CSS",[15,459,460,461,464,465,468],{},"Scripts and CSS files are treated as assets, just like images or sounds. Place them in your game's assets folder (e.g., ",[57,462,463],{},"games_assets\u002Fmy_game\u002F_core\u002Fscripts\u002F",") and connect them through the ",[30,466,467],{},"Manifest"," form in the engine's editor.",[40,470,471,485,492],{},[43,472,473,474,476,477,480,481,484],{},"Create your script (",[57,475,334],{},") or stylesheet (",[57,478,479],{},".css",") file in your game's assets folder (",[57,482,483],{},"games_assets\u002Fmy_game\u002F_core\u002F",")",[43,486,487,488,491],{},"Go to ",[30,489,490],{},"General > Manifest"," in the engine's editor",[43,493,494,495,498,499,502],{},"Add the files to the ",[30,496,497],{},"Scripts"," or ",[30,500,501],{},"CSS"," fields",[15,504,505],{},"Scripts are loaded and executed in the order they appear in the list.",[19,507],{},[22,509,511],{"id":510},"file-structure","File Structure",[237,513,518],{"className":514,"code":516,"language":517},[515],"language-text","assets\u002F                            # ← Open this folder in VS Code\n├── jsconfig.json                  # VS Code configuration\n├── games_assets\u002F\n│   └── my_game\u002F\n│       └── _core\u002F                 # Your assets (images, sounds, scripts, CSS)\n│           ├── icons\u002F\n│           ├── images\u002F\n│           ├── sounds\u002F\n│           ├── scripts\u002F\n│           │   └── script1.mjs    # Your scripts (edit in VS Code)\n│           └── styles\u002F\n│               └── style1.css     # Your styles (edit in VS Code)\n├── games_files\u002F\n│   └── my_game\u002F\n│       └── _core\u002F                 # JSON data managed by engine editor\n│           ├── manifest.json\n│           └── dungeons\u002F\n│               └── my_dungeon\u002F\n│                   ├── config.json\n│                   └── content_raw.txt   # Dungeon markup (editable in VS Code)\n└── engine_files\u002F\n    ├── plugins\u002F                   # Engine plugins (each with its own docs\u002F)\n    │   ├── global_essentials\u002F\n    │   │   └── docs\u002F              # Core engine documentation\n    │   └── auto_battler\u002F\n    │       └── docs\u002F              # Combat plugin documentation\n    └── types.d.ts                 # Type definitions (don't modify)\n","text",[57,519,516],{"__ignoreMap":242},[19,521],{},[22,523,525],{"id":524},"script-template","Script Template",[15,527,528],{},"Here's a minimal script template to get started:",[237,530,532],{"className":239,"code":531,"language":241,"meta":242,"style":242},"\u002F\u002F Import core engine objects\nconst { game, vue, primeVue } = window.engine;\n\n\u002F\u002F Your code here\nconsole.log(\"My script loaded!\");\n\n\u002F\u002F Example: Register a custom action\ngame.registerAction(\"my_action\", () => {\n    console.log(\"My action executed!\");\n});\n\n\u002F\u002F Example: Listen to game emitters\ngame.on(\"scene_play_after\", (sceneId) => {\n    console.log(\"Scene played:\", sceneId);\n});\n",[57,533,534,539,562,566,571,587,591,596,617,632,637,642,648,675,690],{"__ignoreMap":242},[246,535,536],{"class":248,"line":249},[246,537,538],{"class":282},"\u002F\u002F Import core engine objects\n",[246,540,541,543,545,547,549,551,553,556,558,560],{"class":248,"line":272},[246,542,253],{"class":252},[246,544,257],{"class":256},[246,546,209],{"class":260},[246,548,206],{"class":256},[246,550,212],{"class":260},[246,552,206],{"class":256},[246,554,555],{"class":260},"primeVue",[246,557,263],{"class":256},[246,559,266],{"class":252},[246,561,269],{"class":256},[246,563,564],{"class":248,"line":279},[246,565,276],{"emptyLinePlaceholder":275},[246,567,568],{"class":248,"line":286},[246,569,570],{"class":282},"\u002F\u002F Your code here\n",[246,572,573,576,579,581,584],{"class":248,"line":309},[246,574,575],{"class":256},"console.",[246,577,578],{"class":292},"log",[246,580,296],{"class":256},[246,582,583],{"class":299},"\"My script loaded!\"",[246,585,586],{"class":256},");\n",[246,588,589],{"class":248,"line":433},[246,590,276],{"emptyLinePlaceholder":275},[246,592,593],{"class":248,"line":439},[246,594,595],{"class":282},"\u002F\u002F Example: Register a custom action\n",[246,597,598,600,603,605,608,611,614],{"class":248,"line":445},[246,599,289],{"class":256},[246,601,602],{"class":292},"registerAction",[246,604,296],{"class":256},[246,606,607],{"class":299},"\"my_action\"",[246,609,610],{"class":256},", () ",[246,612,613],{"class":252},"=>",[246,615,616],{"class":256}," {\n",[246,618,620,623,625,627,630],{"class":248,"line":619},9,[246,621,622],{"class":256},"    console.",[246,624,578],{"class":292},[246,626,296],{"class":256},[246,628,629],{"class":299},"\"My action executed!\"",[246,631,586],{"class":256},[246,633,635],{"class":248,"line":634},10,[246,636,448],{"class":256},[246,638,640],{"class":248,"line":639},11,[246,641,276],{"emptyLinePlaceholder":275},[246,643,645],{"class":248,"line":644},12,[246,646,647],{"class":282},"\u002F\u002F Example: Listen to game emitters\n",[246,649,651,653,656,658,661,664,668,671,673],{"class":248,"line":650},13,[246,652,289],{"class":256},[246,654,655],{"class":292},"on",[246,657,296],{"class":256},[246,659,660],{"class":299},"\"scene_play_after\"",[246,662,663],{"class":256},", (",[246,665,667],{"class":666},"s4XuR","sceneId",[246,669,670],{"class":256},") ",[246,672,613],{"class":252},[246,674,616],{"class":256},[246,676,678,680,682,684,687],{"class":248,"line":677},14,[246,679,622],{"class":256},[246,681,578],{"class":292},[246,683,296],{"class":256},[246,685,686],{"class":299},"\"Scene played:\"",[246,688,689],{"class":256},", sceneId);\n",[246,691,693],{"class":248,"line":692},15,[246,694,448],{"class":256},[35,696,698],{"id":697},"importing-other-scripts","Importing Other Scripts",[15,700,701],{},"You only need one entry script defined in the Manifest. Scripts are loaded as ES6 Modules, so you can import other custom scripts:",[237,703,705],{"className":239,"code":704,"language":241,"meta":242,"style":242},"\u002F\u002F main_script.mjs (entry script defined in Manifest)\nimport { hi } from \".\u002Fhi.mjs\";\n\nhi();\n",[57,706,707,712,729,733],{"__ignoreMap":242},[246,708,709],{"class":248,"line":249},[246,710,711],{"class":282},"\u002F\u002F main_script.mjs (entry script defined in Manifest)\n",[246,713,714,717,720,723,726],{"class":248,"line":272},[246,715,716],{"class":252},"import",[246,718,719],{"class":256}," { hi } ",[246,721,722],{"class":252},"from",[246,724,725],{"class":299}," \".\u002Fhi.mjs\"",[246,727,728],{"class":256},";\n",[246,730,731],{"class":248,"line":279},[246,732,276],{"emptyLinePlaceholder":275},[246,734,735,738],{"class":248,"line":286},[246,736,737],{"class":292},"hi",[246,739,740],{"class":256},"();\n",[237,742,744],{"className":239,"code":743,"language":241,"meta":242,"style":242},"\u002F\u002F hi.mjs (imported module, not in Manifest)\nexport function hi() {\n    console.log(\"Hello from hi.mjs!\");\n}\n",[57,745,746,751,765,778],{"__ignoreMap":242},[246,747,748],{"class":248,"line":249},[246,749,750],{"class":282},"\u002F\u002F hi.mjs (imported module, not in Manifest)\n",[246,752,753,756,759,762],{"class":248,"line":272},[246,754,755],{"class":252},"export",[246,757,758],{"class":252}," function",[246,760,761],{"class":292}," hi",[246,763,764],{"class":256},"() {\n",[246,766,767,769,771,773,776],{"class":248,"line":279},[246,768,622],{"class":256},[246,770,578],{"class":292},[246,772,296],{"class":256},[246,774,775],{"class":299},"\"Hello from hi.mjs!\"",[246,777,586],{"class":256},[246,779,780],{"class":248,"line":286},[246,781,782],{"class":256},"}\n",[19,784],{},[22,786,788],{"id":787},"ai-agent-assistance","AI Agent Assistance",[15,790,791],{},"Dryad Engine is built to work well with AI coding assistants like Claude, ChatGPT, or Gemini.",[35,793,795],{"id":794},"why-it-works-well","Why It Works Well",[82,797,798,807],{},[85,799,800],{},[88,801,802,804],{},[91,803,93],{},[91,805,806],{},"Benefit for AI",[98,808,809,822,840,850],{},[88,810,811,816],{},[103,812,813],{},[30,814,815],{},"Typed API",[103,817,818,821],{},[57,819,820],{},"types.d.ts"," gives AI full knowledge of available methods, parameters, and return types",[88,823,824,829],{},[103,825,826],{},[30,827,828],{},"Markdown docs",[103,830,831,832,835,836,839],{},"Documentation lives inside each plugin's ",[57,833,834],{},"docs\u002F"," folder in ",[57,837,838],{},".md"," files AI can read and reference",[88,841,842,847],{},[103,843,844],{},[30,845,846],{},"Data-driven",[103,848,849],{},"AI can safely modify game data without breaking engine internals",[88,851,852,857],{},[103,853,854],{},[30,855,856],{},"Consistent patterns",[103,858,859],{},"Same structure across all games makes AI suggestions more reliable and versatile",[35,861,863],{"id":862},"getting-context","Getting Context",[15,865,866,867,869],{},"Point the AI agent to specific folders in ",[57,868,59],{}," directory for context:",[82,871,872,882],{},[85,873,874],{},[88,875,876,879],{},[91,877,878],{},"Folder",[91,880,881],{},"Use for",[98,883,884,894,904,914,923,933],{},[88,885,886,891],{},[103,887,888],{},[57,889,890],{},"engine_files\u002Fplugins\u002Fglobal_essentials\u002Fdocs\u002F",[103,892,893],{},"Core engine documentation (the docs you're reading right now)",[88,895,896,901],{},[103,897,898],{},[57,899,900],{},"engine_files\u002Fplugins\u002F[plugin]\u002Fdocs\u002F",[103,902,903],{},"Other plugin documentation (e.g., auto_battler, gender_pov)",[88,905,906,911],{},[103,907,908],{},[57,909,910],{},"engine_files\u002Ftypes.d.ts",[103,912,913],{},"Available methods and their signatures",[88,915,916,920],{},[103,917,918],{},[57,919,463],{},[103,921,922],{},"Your game's custom scripts",[88,924,925,930],{},[103,926,927],{},[57,928,929],{},"games_assets\u002Ftutorial\u002F_core\u002Fscripts\u002F",[103,931,932],{},"Example scripts from other games",[88,934,935,940],{},[103,936,937],{},[57,938,939],{},"games_files\u002Fmy_game\u002F_core\u002F",[103,941,942],{},"Where your game data lives",[19,944],{},[22,946,948],{"id":947},"next-steps","Next Steps",[196,950,951,958,965],{},[43,952,953,957],{},[47,954,956],{"href":955},"\u002Fdocs\u002Fglobal_essentials\u002Fbuiltins\u002Factions","Actions"," - Built-in actions reference",[43,959,960,964],{},[47,961,963],{"href":962},"\u002Fdocs\u002Fglobal_essentials\u002Fbuiltins\u002Fgame_emitters","Game Emitters"," - Game emitters reference",[43,966,967,971],{},[47,968,970],{"href":969},"\u002Fdocs\u002Fglobal_essentials\u002Fadvanced\u002Fvue","Vue Components"," - Vue components and advanced scripting",[973,974,975],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":242,"searchDepth":272,"depth":272,"links":977},[978,982,986,990,991,992,995,999],{"id":24,"depth":272,"text":25,"children":979},[980,981],{"id":37,"depth":279,"text":38},{"id":79,"depth":279,"text":80},{"id":145,"depth":272,"text":146,"children":983},[984,985],{"id":234,"depth":279,"text":235},{"id":327,"depth":279,"text":328},{"id":344,"depth":272,"text":345,"children":987},[988,989],{"id":355,"depth":279,"text":356},{"id":373,"depth":279,"text":374},{"id":456,"depth":272,"text":457},{"id":510,"depth":272,"text":511},{"id":524,"depth":272,"text":525,"children":993},[994],{"id":697,"depth":279,"text":698},{"id":787,"depth":272,"text":788,"children":996},[997,998],{"id":794,"depth":279,"text":795},{"id":862,"depth":279,"text":863},{"id":947,"depth":272,"text":948},"md",{"plugin":1002,"category":1003,"page":1004},"global_essentials","advanced","set_up_coding","\u002Fdocs\u002Fglobal_essentials\u002Fadvanced\u002Fset_up_coding",{"title":5,"description":17},"docs\u002Fglobal_essentials\u002Fadvanced\u002Fset_up_coding","_kNOQxETdLWLe36fRsXL1h6raK4Hrb6odwgDnWfiFv4",1779582261799]