[{"data":1,"prerenderedAt":1061},["ShallowReactive",2],{"navigation":3,"reference-navigation":62,"\u002Fdocs\u002Fgetting-started-bundles":365,"\u002Fdocs\u002Fgetting-started-bundles-surround":1056},[4,22,26,30,34,38,42,46,50,54,58],{"title":5,"path":6,"stem":7,"children":8},"Bundle Developer","\u002Fdocs\u002Fbundle-developer","1.docs\u002F1.bundle-developer\u002Findex",[9,10,14,18],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Terminology","\u002Fdocs\u002Fbundle-developer\u002Fterminology","1.docs\u002F1.bundle-developer\u002F1.terminology",{"title":15,"path":16,"stem":17},"Prerequisites","\u002Fdocs\u002Fbundle-developer\u002Fprerequisites","1.docs\u002F1.bundle-developer\u002F2.prerequisites",{"title":19,"path":20,"stem":21},"Bundle Layout","\u002Fdocs\u002Fbundle-developer\u002Flayout","1.docs\u002F1.bundle-developer\u002F3.layout",{"title":23,"path":24,"stem":25},"Custom Registry Developer Guide","\u002Fdocs\u002Fcustom-registries","1.docs\u002Fcustom-registries",{"title":27,"path":28,"stem":29},"Defining Bundle Entities","\u002Fdocs\u002Fdefining-bundle-entities","1.docs\u002Fdefining-bundle-entities",{"title":31,"path":32,"stem":33},"Defining Bundle Sounds","\u002Fdocs\u002Fdefining-bundle-sounds","1.docs\u002Fdefining-bundle-sounds",{"title":35,"path":36,"stem":37},"Defining Bundle Tile Transitions","\u002Fdocs\u002Fdefining-bundle-tile-transitions","1.docs\u002Fdefining-bundle-tile-transitions",{"title":39,"path":40,"stem":41},"Defining Bundle Tiles","\u002Fdocs\u002Fdefining-bundle-tiles","1.docs\u002Fdefining-bundle-tiles",{"title":43,"path":44,"stem":45},"Defining Bundle Visuals","\u002Fdocs\u002Fdefining-bundle-visuals","1.docs\u002Fdefining-bundle-visuals",{"title":47,"path":48,"stem":49},"Bundle Event System Developer Guide","\u002Fdocs\u002Fevent-system","1.docs\u002Fevent-system",{"title":51,"path":52,"stem":53},"Getting Started with Selene Bundles","\u002Fdocs\u002Fgetting-started-bundles","1.docs\u002Fgetting-started-bundles",{"title":55,"path":56,"stem":57},"Making Resource Packs","\u002Fdocs\u002Fmaking-resource-packs","1.docs\u002Fmaking-resource-packs",{"title":59,"path":60,"stem":61},"Bundle Network API Developer Guide","\u002Fdocs\u002Fnetwork-apis","1.docs\u002Fnetwork-apis",[63,212,253],{"title":64,"path":65,"stem":66,"children":67,"page":121},"Modules","\u002Freference\u002Fmodules","2.reference\u002F1.modules",[68,122,167],{"title":69,"path":70,"stem":71,"children":72,"page":121},"Common","\u002Freference\u002Fmodules\u002Fcommon","2.reference\u002F1.modules\u002F1.common",[73,77,81,85,89,93,97,101,105,109,113,117],{"title":74,"path":75,"stem":76},"debug","\u002Freference\u002Fmodules\u002Fcommon\u002Fdebug","2.reference\u002F1.modules\u002F1.common\u002Fdebug",{"title":78,"path":79,"stem":80},"mathx","\u002Freference\u002Fmodules\u002Fcommon\u002Fmathx","2.reference\u002F1.modules\u002F1.common\u002Fmathx",{"title":82,"path":83,"stem":84},"os","\u002Freference\u002Fmodules\u002Fcommon\u002Fos","2.reference\u002F1.modules\u002F1.common\u002Fos",{"title":86,"path":87,"stem":88},"package","\u002Freference\u002Fmodules\u002Fcommon\u002Fpackage","2.reference\u002F1.modules\u002F1.common\u002Fpackage",{"title":90,"path":91,"stem":92},"selene.grid","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.grid","2.reference\u002F1.modules\u002F1.common\u002Fselene.grid",{"title":94,"path":95,"stem":96},"selene.http","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.http","2.reference\u002F1.modules\u002F1.common\u002Fselene.http",{"title":98,"path":99,"stem":100},"selene.i18n","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.i18n","2.reference\u002F1.modules\u002F1.common\u002Fselene.i18n",{"title":102,"path":103,"stem":104},"selene.registries","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.registries","2.reference\u002F1.modules\u002F1.common\u002Fselene.registries",{"title":106,"path":107,"stem":108},"selene.resources","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.resources","2.reference\u002F1.modules\u002F1.common\u002Fselene.resources",{"title":110,"path":111,"stem":112},"selene.schedules","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.schedules","2.reference\u002F1.modules\u002F1.common\u002Fselene.schedules",{"title":114,"path":115,"stem":116},"stringx","\u002Freference\u002Fmodules\u002Fcommon\u002Fstringx","2.reference\u002F1.modules\u002F1.common\u002Fstringx",{"title":118,"path":119,"stem":120},"tablex","\u002Freference\u002Fmodules\u002Fcommon\u002Ftablex","2.reference\u002F1.modules\u002F1.common\u002Ftablex",false,{"title":123,"path":124,"stem":125,"children":126,"page":121},"Server","\u002Freference\u002Fmodules\u002Fserver","2.reference\u002F1.modules\u002F2.server",[127,131,135,139,143,147,151,155,159,163],{"title":128,"path":129,"stem":130},"selene.attributes","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.attributes","2.reference\u002F1.modules\u002F2.server\u002Fselene.attributes",{"title":132,"path":133,"stem":134},"selene.config","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.config","2.reference\u002F1.modules\u002F2.server\u002Fselene.config",{"title":136,"path":137,"stem":138},"selene.dimensions","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.dimensions","2.reference\u002F1.modules\u002F2.server\u002Fselene.dimensions",{"title":140,"path":141,"stem":142},"selene.entities","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.entities","2.reference\u002F1.modules\u002F2.server\u002Fselene.entities",{"title":144,"path":145,"stem":146},"selene.map","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.map","2.reference\u002F1.modules\u002F2.server\u002Fselene.map",{"title":148,"path":149,"stem":150},"selene.network","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.network","2.reference\u002F1.modules\u002F2.server\u002Fselene.network",{"title":152,"path":153,"stem":154},"selene.players","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.players","2.reference\u002F1.modules\u002F2.server\u002Fselene.players",{"title":156,"path":157,"stem":158},"selene.saves","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.saves","2.reference\u002F1.modules\u002F2.server\u002Fselene.saves",{"title":160,"path":161,"stem":162},"selene.server","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.server","2.reference\u002F1.modules\u002F2.server\u002Fselene.server",{"title":164,"path":165,"stem":166},"selene.sounds","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.sounds","2.reference\u002F1.modules\u002F2.server\u002Fselene.sounds",{"title":168,"path":169,"stem":170,"children":171,"page":121},"Client","\u002Freference\u002Fmodules\u002Fclient","2.reference\u002F1.modules\u002F3.client",[172,176,179,183,187,190,194,197,200,204,208],{"title":173,"path":174,"stem":175},"selene.camera","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.camera","2.reference\u002F1.modules\u002F3.client\u002Fselene.camera",{"title":140,"path":177,"stem":178},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.entities","2.reference\u002F1.modules\u002F3.client\u002Fselene.entities",{"title":180,"path":181,"stem":182},"selene.game","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.game","2.reference\u002F1.modules\u002F3.client\u002Fselene.game",{"title":184,"path":185,"stem":186},"selene.input","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.input","2.reference\u002F1.modules\u002F3.client\u002Fselene.input",{"title":144,"path":188,"stem":189},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.map","2.reference\u002F1.modules\u002F3.client\u002Fselene.map",{"title":191,"path":192,"stem":193},"selene.movement.grid","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.movement.grid","2.reference\u002F1.modules\u002F3.client\u002Fselene.movement.grid",{"title":148,"path":195,"stem":196},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.network","2.reference\u002F1.modules\u002F3.client\u002Fselene.network",{"title":164,"path":198,"stem":199},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.sounds","2.reference\u002F1.modules\u002F3.client\u002Fselene.sounds",{"title":201,"path":202,"stem":203},"selene.textures","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.textures","2.reference\u002F1.modules\u002F3.client\u002Fselene.textures",{"title":205,"path":206,"stem":207},"selene.ui.lml","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.ui.lml","2.reference\u002F1.modules\u002F3.client\u002Fselene.ui.lml",{"title":209,"path":210,"stem":211},"selene.visuals","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.visuals","2.reference\u002F1.modules\u002F3.client\u002Fselene.visuals",{"title":213,"path":214,"stem":215,"children":216,"page":121},"Data","\u002Freference\u002Fdata","2.reference\u002F2.data",[217,241],{"title":69,"path":218,"stem":219,"children":220,"page":121},"\u002Freference\u002Fdata\u002Fcommon","2.reference\u002F2.data\u002F1.common",[221,225,229,233,237],{"title":222,"path":223,"stem":224},"Component Definition","\u002Freference\u002Fdata\u002Fcommon\u002Fcomponentdefinition","2.reference\u002F2.data\u002F1.common\u002FComponentDefinition",{"title":226,"path":227,"stem":228},"Entity Definition","\u002Freference\u002Fdata\u002Fcommon\u002Fentitydefinition","2.reference\u002F2.data\u002F1.common\u002FEntityDefinition",{"title":230,"path":231,"stem":232},"Sound Definition","\u002Freference\u002Fdata\u002Fcommon\u002Fsounddefinition","2.reference\u002F2.data\u002F1.common\u002FSoundDefinition",{"title":234,"path":235,"stem":236},"Tile Definition","\u002Freference\u002Fdata\u002Fcommon\u002Ftiledefinition","2.reference\u002F2.data\u002F1.common\u002FTileDefinition",{"title":238,"path":239,"stem":240},"Transition Definition","\u002Freference\u002Fdata\u002Fcommon\u002Ftransitiondefinition","2.reference\u002F2.data\u002F1.common\u002FTransitionDefinition",{"title":168,"path":242,"stem":243,"children":244,"page":121},"\u002Freference\u002Fdata\u002Fclient","2.reference\u002F2.data\u002F3.client",[245,249],{"title":246,"path":247,"stem":248},"Audio Definition","\u002Freference\u002Fdata\u002Fclient\u002Faudiodefinition","2.reference\u002F2.data\u002F3.client\u002FAudioDefinition",{"title":250,"path":251,"stem":252},"Visual Definition","\u002Freference\u002Fdata\u002Fclient\u002Fvisualdefinition","2.reference\u002F2.data\u002F3.client\u002FVisualDefinition",{"title":254,"path":255,"stem":256,"children":257,"page":121},"Classes","\u002Freference\u002Fclasses","2.reference\u002F3.classes",[258,286,318],{"title":69,"path":259,"stem":260,"children":261,"page":121},"\u002Freference\u002Fclasses\u002Fcommon","2.reference\u002F3.classes\u002F1.common",[262,266,270,274,278,282],{"title":263,"path":264,"stem":265},"Coordinate","\u002Freference\u002Fclasses\u002Fcommon\u002Fcoordinate","2.reference\u002F3.classes\u002F1.common\u002FCoordinate",{"title":267,"path":268,"stem":269},"CustomRegistryObject","\u002Freference\u002Fclasses\u002Fcommon\u002Fcustomregistryobject","2.reference\u002F3.classes\u002F1.common\u002FCustomRegistryObject",{"title":271,"path":272,"stem":273},"LuaReference","\u002Freference\u002Fclasses\u002Fcommon\u002Fluareference","2.reference\u002F3.classes\u002F1.common\u002FLuaReference",{"title":275,"path":276,"stem":277},"Observable","\u002Freference\u002Fclasses\u002Fcommon\u002Fobservable","2.reference\u002F3.classes\u002F1.common\u002FObservable",{"title":279,"path":280,"stem":281},"RegistryObject","\u002Freference\u002Fclasses\u002Fcommon\u002Fregistryobject","2.reference\u002F3.classes\u002F1.common\u002FRegistryObject",{"title":283,"path":284,"stem":285},"Signal","\u002Freference\u002Fclasses\u002Fcommon\u002Fsignal","2.reference\u002F3.classes\u002F1.common\u002FSignal",{"title":123,"path":287,"stem":288,"children":289,"page":121},"\u002Freference\u002Fclasses\u002Fserver","2.reference\u002F3.classes\u002F2.server",[290,294,298,302,306,310,314],{"title":291,"path":292,"stem":293},"Dimension","\u002Freference\u002Fclasses\u002Fserver\u002Fdimension","2.reference\u002F3.classes\u002F2.server\u002FDimension",{"title":295,"path":296,"stem":297},"Entity","\u002Freference\u002Fclasses\u002Fserver\u002Fentity","2.reference\u002F3.classes\u002F2.server\u002FEntity",{"title":299,"path":300,"stem":301},"LoginQueueEntry","\u002Freference\u002Fclasses\u002Fserver\u002Floginqueueentry","2.reference\u002F3.classes\u002F2.server\u002FLoginQueueEntry",{"title":303,"path":304,"stem":305},"MapTree","\u002Freference\u002Fclasses\u002Fserver\u002Fmaptree","2.reference\u002F3.classes\u002F2.server\u002FMapTree",{"title":307,"path":308,"stem":309},"Player","\u002Freference\u002Fclasses\u002Fserver\u002Fplayer","2.reference\u002F3.classes\u002F2.server\u002FPlayer",{"title":311,"path":312,"stem":313},"ScopedChunkView","\u002Freference\u002Fclasses\u002Fserver\u002Fscopedchunkview","2.reference\u002F3.classes\u002F2.server\u002FScopedChunkView",{"title":315,"path":316,"stem":317},"TransientTile","\u002Freference\u002Fclasses\u002Fserver\u002Ftransienttile","2.reference\u002F3.classes\u002F2.server\u002FTransientTile",{"title":168,"path":319,"stem":320,"children":321,"page":121},"\u002Freference\u002Fclasses\u002Fclient","2.reference\u002F3.classes\u002F3.client",[322,326,330,334,337,341,345,349,353,357,361],{"title":323,"path":324,"stem":325},"Actor","\u002Freference\u002Fclasses\u002Fclient\u002Factor","2.reference\u002F3.classes\u002F3.client\u002FActor",{"title":327,"path":328,"stem":329},"Drawable","\u002Freference\u002Fclasses\u002Fclient\u002Fdrawable","2.reference\u002F3.classes\u002F3.client\u002FDrawable",{"title":331,"path":332,"stem":333},"DrawableVisual2D","\u002Freference\u002Fclasses\u002Fclient\u002Fdrawablevisual2d","2.reference\u002F3.classes\u002F3.client\u002FDrawableVisual2D",{"title":295,"path":335,"stem":336},"\u002Freference\u002Fclasses\u002Fclient\u002Fentity","2.reference\u002F3.classes\u002F3.client\u002FEntity",{"title":338,"path":339,"stem":340},"IsoVisualComponent","\u002Freference\u002Fclasses\u002Fclient\u002Fisovisualcomponent","2.reference\u002F3.classes\u002F3.client\u002FIsoVisualComponent",{"title":342,"path":343,"stem":344},"LuaTexture","\u002Freference\u002Fclasses\u002Fclient\u002Fluatexture","2.reference\u002F3.classes\u002F3.client\u002FLuaTexture",{"title":346,"path":347,"stem":348},"Skin","\u002Freference\u002Fclasses\u002Fclient\u002Fskin","2.reference\u002F3.classes\u002F3.client\u002FSkin",{"title":350,"path":351,"stem":352},"TextFieldTextFieldClickListener","\u002Freference\u002Fclasses\u002Fclient\u002Ftextfield.textfieldclicklistener","2.reference\u002F3.classes\u002F3.client\u002FTextField.TextFieldClickListener",{"title":354,"path":355,"stem":356},"Tile","\u002Freference\u002Fclasses\u002Fclient\u002Ftile","2.reference\u002F3.classes\u002F3.client\u002FTile",{"title":358,"path":359,"stem":360},"Visual2D","\u002Freference\u002Fclasses\u002Fclient\u002Fvisual2d","2.reference\u002F3.classes\u002F3.client\u002FVisual2D",{"title":362,"path":363,"stem":364},"Visual2DComponent","\u002Freference\u002Fclasses\u002Fclient\u002Fvisual2dcomponent","2.reference\u002F3.classes\u002F3.client\u002FVisual2DComponent",{"id":366,"title":51,"body":367,"description":1050,"extension":1051,"meta":1052,"navigation":1053,"path":52,"seo":1054,"stem":53,"__hash__":1055},"docs\u002F1.docs\u002Fgetting-started-bundles.md",{"type":368,"value":369,"toc":1038},"minimark",[370,374,387,406,411,414,428,434,438,444,496,503,507,522,539,542,556,559,576,587,591,600,620,623,626,682,685,759,762,792,796,834,837,841,847,861,868,878,883,908,913,926,931,942,946,953,963,967,992,996,1010,1014,1031,1034],[371,372,51],"h1",{"id":373},"getting-started-with-selene-bundles",[375,376,377,378,382,383,386],"p",{},"This guide walks you through creating your first Selene bundle: what a bundle is, the recommended directory layout, and how to declare your bundle metadata in ",[379,380,381],"code",{},"bundle.json",". It draws from the example bundles in this repository under ",[379,384,385],{},"bundles\u002F",":",[388,389,390,396,401],"ul",{},[391,392,393],"li",{},[379,394,395],{},"bundles\u002Fillarion-gobaith-data\u002F",[391,397,398],{},[379,399,400],{},"bundles\u002Fillarion-gobaith-ui\u002F",[391,402,403],{},[379,404,405],{},"bundles\u002Fmoonlight-inventory\u002F",[407,408,410],"h2",{"id":409},"what-is-a-selene-bundle","What is a Selene bundle?",[375,412,413],{},"A Selene bundle is a self-contained package of logic and\u002For data that the Selene engine can load. Bundles can provide:",[388,415,416,419,422,425],{},[391,417,418],{},"Data definitions (for tiles, entities, items, etc.)",[391,420,421],{},"Client UI logic and behaviors",[391,423,424],{},"Server-side game logic",[391,426,427],{},"Shared\u002Fcommon Lua modules",[375,429,430,431,433],{},"Each bundle lives in its own directory and is described by a ",[379,432,381],{}," file at its root.",[407,435,437],{"id":436},"minimal-bundle","Minimal bundle",[375,439,440,441,443],{},"The smallest possible bundle needs only a ",[379,442,381],{}," with a unique name and description:",[445,446,451],"pre",{"className":447,"code":448,"language":449,"meta":450,"style":450},"language-json shiki shiki-themes github-light github-dark","{\n  \"name\": \"moonlight-inventory\",\n  \"description\": \"Basic implementation for slot-based inventories.\"\n}\n","json","",[379,452,453,462,479,490],{"__ignoreMap":450},[454,455,458],"span",{"class":456,"line":457},"line",1,[454,459,461],{"class":460},"sVt8B","{\n",[454,463,465,469,472,476],{"class":456,"line":464},2,[454,466,468],{"class":467},"sj4cs","  \"name\"",[454,470,471],{"class":460},": ",[454,473,475],{"class":474},"sZZnC","\"moonlight-inventory\"",[454,477,478],{"class":460},",\n",[454,480,482,485,487],{"class":456,"line":481},3,[454,483,484],{"class":467},"  \"description\"",[454,486,471],{"class":460},[454,488,489],{"class":474},"\"Basic implementation for slot-based inventories.\"\n",[454,491,493],{"class":456,"line":492},4,[454,494,495],{"class":460},"}\n",[375,497,498,499,502],{},"Place this file in your bundle directory, for example ",[379,500,501],{},"bundles\u002Fmy-first-bundle\u002Fbundle.json",".",[407,504,506],{"id":505},"directory-layout","Directory layout",[375,508,509,510,513,514,517,518,521],{},"Bundles commonly organize content into ",[379,511,512],{},"client\u002F",", ",[379,515,516],{},"server\u002F",", and ",[379,519,520],{},"common\u002F"," to clarify runtime ownership and to keep resources discoverable:",[388,523,524,529,534],{},[391,525,526,528],{},[379,527,512],{}," – Code and data used by the client (e.g., UI, input handling, visuals)",[391,530,531,533],{},[379,532,516],{}," – Code and data used by the server (e.g., NPCs, quests, spawns)",[391,535,536,538],{},[379,537,520],{}," – Code and data shared between client and server",[375,540,541],{},"Within those, you’ll often see:",[388,543,544,550],{},[391,545,546,549],{},[379,547,548],{},"lua\u002F"," – Lua modules and scripts",[391,551,552,555],{},[379,553,554],{},"data\u002F"," – Static JSON data files consumed by systems",[375,557,558],{},"Examples from this repo:",[388,560,561,566,571],{},[391,562,563],{},[379,564,565],{},"bundles\u002Fillarion-gobaith-ui\u002Fclient\u002Flua\u002F",[391,567,568],{},[379,569,570],{},"bundles\u002Fillarion-gobaith-data\u002Fcommon\u002Flua\u002F",[391,572,573],{},[379,574,575],{},"bundles\u002Fillarion-gobaith-data\u002Fserver\u002Fdata\u002F",[375,577,578,579,582,583,586],{},"You can also include a ",[379,580,581],{},"README.md"," and ",[379,584,585],{},"LICENSE"," at the root of your bundle for documentation and licensing.",[407,588,590],{"id":589},"declaring-entrypoints","Declaring entrypoints",[375,592,593,594,597,598,502],{},"If your bundle includes executable logic (Lua modules to load on startup), list them in the ",[379,595,596],{},"entrypoints"," array in ",[379,599,381],{},[388,601,602,605,615],{},[391,603,604],{},"Paths are relative to the bundle root",[391,606,607,608,611,612],{},"They are typically Lua files located under ",[379,609,610],{},"client\u002Flua\u002F"," or ",[379,613,614],{},"common\u002Flua\u002F",[391,616,617,618],{},"Data-only bundles can omit ",[379,619,596],{},[375,621,622],{},"Examples:",[375,624,625],{},"Data bundle with a single shared entrypoint:",[445,627,629],{"className":447,"code":628,"language":449,"meta":450,"style":450},"{\n  \"name\": \"illarion-gobaith-data\",\n  \"description\": \"Data definitions for Illarion as a Selene bundle.\",\n  \"entrypoints\": [\n    \"common\u002Flua\u002Fgrid.lua\"\n  ]\n}\n",[379,630,631,635,646,657,665,671,677],{"__ignoreMap":450},[454,632,633],{"class":456,"line":457},[454,634,461],{"class":460},[454,636,637,639,641,644],{"class":456,"line":464},[454,638,468],{"class":467},[454,640,471],{"class":460},[454,642,643],{"class":474},"\"illarion-gobaith-data\"",[454,645,478],{"class":460},[454,647,648,650,652,655],{"class":456,"line":481},[454,649,484],{"class":467},[454,651,471],{"class":460},[454,653,654],{"class":474},"\"Data definitions for Illarion as a Selene bundle.\"",[454,656,478],{"class":460},[454,658,659,662],{"class":456,"line":492},[454,660,661],{"class":467},"  \"entrypoints\"",[454,663,664],{"class":460},": [\n",[454,666,668],{"class":456,"line":667},5,[454,669,670],{"class":474},"    \"common\u002Flua\u002Fgrid.lua\"\n",[454,672,674],{"class":456,"line":673},6,[454,675,676],{"class":460},"  ]\n",[454,678,680],{"class":456,"line":679},7,[454,681,495],{"class":460},[375,683,684],{},"Client UI bundle with multiple entrypoints:",[445,686,688],{"className":447,"code":687,"language":449,"meta":450,"style":450},"{\n  \"name\": \"illarion-gobaith-ui\",\n  \"description\": \"Illarion UI based on Gobaith era.\",\n  \"entrypoints\": [\n    \"client\u002Flua\u002Fviewport.lua\",\n    \"client\u002Flua\u002Fcursor.lua\",\n    \"client\u002Flua\u002Finput.lua\",\n    \"client\u002Flua\u002Fui.lua\"\n  ]\n}\n",[379,689,690,694,705,716,722,729,736,743,749,754],{"__ignoreMap":450},[454,691,692],{"class":456,"line":457},[454,693,461],{"class":460},[454,695,696,698,700,703],{"class":456,"line":464},[454,697,468],{"class":467},[454,699,471],{"class":460},[454,701,702],{"class":474},"\"illarion-gobaith-ui\"",[454,704,478],{"class":460},[454,706,707,709,711,714],{"class":456,"line":481},[454,708,484],{"class":467},[454,710,471],{"class":460},[454,712,713],{"class":474},"\"Illarion UI based on Gobaith era.\"",[454,715,478],{"class":460},[454,717,718,720],{"class":456,"line":492},[454,719,661],{"class":467},[454,721,664],{"class":460},[454,723,724,727],{"class":456,"line":667},[454,725,726],{"class":474},"    \"client\u002Flua\u002Fviewport.lua\"",[454,728,478],{"class":460},[454,730,731,734],{"class":456,"line":673},[454,732,733],{"class":474},"    \"client\u002Flua\u002Fcursor.lua\"",[454,735,478],{"class":460},[454,737,738,741],{"class":456,"line":679},[454,739,740],{"class":474},"    \"client\u002Flua\u002Finput.lua\"",[454,742,478],{"class":460},[454,744,746],{"class":456,"line":745},8,[454,747,748],{"class":474},"    \"client\u002Flua\u002Fui.lua\"\n",[454,750,752],{"class":456,"line":751},9,[454,753,676],{"class":460},[454,755,757],{"class":456,"line":756},10,[454,758,495],{"class":460},[375,760,761],{},"Data-only bundle without entrypoints:",[445,763,764],{"className":447,"code":448,"language":449,"meta":450,"style":450},[379,765,766,770,780,788],{"__ignoreMap":450},[454,767,768],{"class":456,"line":457},[454,769,461],{"class":460},[454,771,772,774,776,778],{"class":456,"line":464},[454,773,468],{"class":467},[454,775,471],{"class":460},[454,777,475],{"class":474},[454,779,478],{"class":460},[454,781,782,784,786],{"class":456,"line":481},[454,783,484],{"class":467},[454,785,471],{"class":460},[454,787,489],{"class":474},[454,789,790],{"class":456,"line":492},[454,791,495],{"class":460},[407,793,795],{"id":794},"common-file-types","Common file types",[388,797,798,816],{},[391,799,800,801,803,804],{},"JSON under ",[379,802,554],{}," – Structured data used by Selene systems, e.g.:\n",[388,805,806,811],{},[391,807,808],{},[379,809,810],{},"bundles\u002Fillarion-gobaith-data\u002Fcommon\u002Fdata\u002Ftiles.json",[391,812,813],{},[379,814,815],{},"bundles\u002Fillarion-gobaith-data\u002Fserver\u002Fdata\u002Fitems.json",[391,817,818,819,821,822],{},"Lua under ",[379,820,548],{}," – Logic modules and scripts, e.g.:\n",[388,823,824,829],{},[391,825,826],{},[379,827,828],{},"bundles\u002Fillarion-gobaith-ui\u002Fclient\u002Flua\u002Finput.lua",[391,830,831],{},[379,832,833],{},"bundles\u002Fillarion-gobaith-data\u002Fcommon\u002Flua\u002Fgrid.lua",[375,835,836],{},"Note: The specific shape of JSON files is determined by the systems that consume them (tiles, entities, skills, etc.). Use existing examples as templates and keep paths consistent.",[407,838,840],{"id":839},"creating-your-own-bundle","Creating your own bundle",[842,843,844],"ol",{},[391,845,846],{},"Create the directory",[388,848,849,852],{},[391,850,851],{},"Choose a unique, URL-safe name",[391,853,854,855,857,858],{},"Create a folder under ",[379,856,385],{},", e.g. ",[379,859,860],{},"bundles\u002Fmy-bundle\u002F",[842,862,863],{"start":464},[391,864,865,866],{},"Add ",[379,867,381],{},[388,869,870,873],{},[391,871,872],{},"Start with name and description",[391,874,865,875,877],{},[379,876,596],{}," only if you have Lua modules to load",[842,879,880],{"start":481},[391,881,882],{},"Add code and data",[388,884,885,890,895,901],{},[391,886,887,888],{},"Place shared modules under ",[379,889,614],{},[391,891,892,893],{},"Place client-only modules under ",[379,894,610],{},[391,896,897,898],{},"Place server-only modules under ",[379,899,900],{},"server\u002Flua\u002F",[391,902,903,904,907],{},"Put static data under ",[379,905,906],{},"*\u002Fdata\u002F"," next to where it is consumed",[842,909,910],{"start":492},[391,911,912],{},"Document and license",[388,914,915,921],{},[391,916,917,918,920],{},"Add a ",[379,919,581],{}," describing what your bundle provides and any external dependencies",[391,922,917,923,925],{},[379,924,585],{}," if you plan to distribute it",[842,927,928],{"start":667},[391,929,930],{},"Validate your layout",[388,932,933,939],{},[391,934,935,936,938],{},"Ensure every path in ",[379,937,596],{}," exists and is correct relative to the bundle root",[391,940,941],{},"Keep JSON valid; run a linter\u002Fformatter if available",[407,943,945],{"id":944},"referencing-external-assets","Referencing external assets",[375,947,948,949,952],{},"Some bundles may rely on external graphics or asset bundles. For example, ",[379,950,951],{},"illarion-gobaith-data"," notes that it depends on a separate asset bundle for visuals and does not embed restricted assets. If you reference external assets:",[388,954,955,960],{},[391,956,957,958],{},"Document the dependency in your ",[379,959,581],{},[391,961,962],{},"Avoid redistributing licensed assets unless permitted",[407,964,966],{"id":965},"tips-and-conventions","Tips and conventions",[388,968,969,976,982,989],{},[391,970,971,972,975],{},"Use lowercase, hyphenated bundle names (e.g., ",[379,973,974],{},"my-feature-pack",")",[391,977,978,979,981],{},"Keep ",[379,980,596],{}," minimal: load a top-level module that in turn requires other modules",[391,983,984,985,988],{},"Co-locate data with the runtime that consumes it (",[379,986,987],{},"server\u002Fdata\u002F"," for server-side systems, etc.)",[391,990,991],{},"Prefer deterministic file names and folder structures for discoverability",[407,993,995],{"id":994},"troubleshooting","Troubleshooting",[388,997,998,1004,1007],{},[391,999,1000,1001,1003],{},"A module does not load: double-check the ",[379,1002,596],{}," path and module syntax",[391,1005,1006],{},"Data not applied: ensure the JSON structure matches what the consuming system expects",[391,1008,1009],{},"Asset missing: verify the asset bundle or path is available and correctly referenced",[407,1011,1013],{"id":1012},"examples-to-study","Examples to study",[388,1015,1016,1021,1026],{},[391,1017,1018,1019],{},"Data-centric bundle: ",[379,1020,395],{},[391,1022,1023,1024],{},"Client UI bundle: ",[379,1025,400],{},[391,1027,1028,1029],{},"Minimal bundle: ",[379,1030,405],{},[375,1032,1033],{},"Open these bundles to copy patterns for your own. Start small, add a single entrypoint if needed, and grow from there.",[1035,1036,1037],"style",{},"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 .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);}",{"title":450,"searchDepth":464,"depth":464,"links":1039},[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049],{"id":409,"depth":464,"text":410},{"id":436,"depth":464,"text":437},{"id":505,"depth":464,"text":506},{"id":589,"depth":464,"text":590},{"id":794,"depth":464,"text":795},{"id":839,"depth":464,"text":840},{"id":944,"depth":464,"text":945},{"id":965,"depth":464,"text":966},{"id":994,"depth":464,"text":995},{"id":1012,"depth":464,"text":1013},"Learn how to create, structure, and package bundles for the Selene engine using the example bundles in this repository.","md",{},true,{"title":51,"description":1050},"2rYvv6Q60yGdurPzJYOzxeCo33Maw44ws-Gb92H8D1Y",[1057,1059],{"title":47,"path":48,"stem":49,"description":1058,"children":-1},"Register Lua callbacks for Selene bundle events and understand the common, server, and client events currently exposed by the engine.",{"title":55,"path":56,"stem":57,"description":1060,"children":-1},"Learn how to create client-side resource packs by overriding assets and visual definitions through bundles.",1792747966454]