From 32e3585c2b892552d542913d98a032462c620a5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:45:33 +0000 Subject: [PATCH] deploy: fd33a4289158ed9b48711ff5cde2f24cb89368b0 --- 404.html | 6 +-- ...-link-40fccb60e0766e3a2aa193d47af4aff4.png | Bin 0 -> 108315 bytes ...evels-e8bb20ab8e46d62174c0c1ea7bc3bbd6.png | Bin 0 -> 31892 bytes assets/js/0e384e19.f3201cf6.js | 1 - assets/js/0f1280df.ef62c2de.js | 1 + assets/js/109ef209.18455106.js | 1 - ...93b7f.140e7df4.js => 1df93b7f.fab44a3c.js} | 2 +- assets/js/3d9c95a4.3205b95d.js | 1 + assets/js/4315fc58.04756219.js | 1 - assets/js/4315fc58.67e700cc.js | 1 + assets/js/46e25335.77249d93.js | 1 - assets/js/46e25335.e9c2ac2b.js | 1 + assets/js/66e67a33.e81f603d.js | 1 - assets/js/91cb3e84.5acf482c.js | 1 - assets/js/91cb3e84.c31fc1c9.js | 1 + assets/js/935f2afb.8b5c524b.js | 1 + assets/js/935f2afb.917661f4.js | 1 - assets/js/b204be58.d04c2711.js | 1 + assets/js/b204be58.e680ec56.js | 1 - assets/js/bde67976.a3410ee9.js | 1 + assets/js/bde67976.c440d31c.js | 1 - assets/js/c5039d34.1f98e805.js | 1 - assets/js/c5039d34.4d9ce4af.js | 1 + assets/js/c8ed35e6.0ca10d1a.js | 1 + assets/js/c8ed35e6.183ac2d9.js | 1 - assets/js/d321bdfd.707b2e80.js | 1 - assets/js/d321bdfd.f25a4584.js | 1 + assets/js/main.1144ea72.js | 2 + ...CENSE.txt => main.1144ea72.js.LICENSE.txt} | 0 assets/js/main.f45c2246.js | 2 - assets/js/runtime~main.b5c94a30.js | 1 + assets/js/runtime~main.b9881285.js | 1 - blog/archive/index.html | 6 +-- blog/first-blog-post/index.html | 6 +-- blog/index.html | 6 +-- blog/tags/first/index.html | 6 +-- blog/tags/index.html | 6 +-- docs/APIs/Fmath/index.html | 10 ++-- docs/APIs/PewPew/index.html | 10 ++-- docs/APIs/standard-libraries/index.html | 8 ++-- docs/APIs/types/index.html | 8 ++-- .../manifest-files/index.html | 21 ++++---- docs/File Information/mesh-files/index.html | 13 ++--- docs/File Information/sound-files/index.html | 15 ++++-- docs/Guides/Lua/advanced/index.html | 6 +-- docs/Guides/Lua/beginner/index.html | 6 +-- docs/Guides/Lua/intermediate/index.html | 6 +-- docs/Guides/Other/fps-animation/index.html | 6 +-- docs/Other/game-limits/index.html | 25 ++++++++++ docs/Other/level-design-principles/index.html | 12 +++-- docs/Other/level-restrictions/index.html | 25 ---------- docs/Other/trivia/index.html | 28 ----------- docs/home/index.html | 45 ++++++++++++++++++ docs/intro/index.html | 35 -------------- img/documentation/jfxr-export-link.png | Bin 0 -> 108315 bytes img/documentation/manage-custom-levels.png | Bin 0 -> 31892 bytes index.html | 6 +-- search-index.json | 2 +- search/index.html | 6 +-- sitemap.xml | 2 +- 60 files changed, 178 insertions(+), 184 deletions(-) create mode 100644 assets/images/jfxr-export-link-40fccb60e0766e3a2aa193d47af4aff4.png create mode 100644 assets/images/manage-custom-levels-e8bb20ab8e46d62174c0c1ea7bc3bbd6.png delete mode 100644 assets/js/0e384e19.f3201cf6.js create mode 100644 assets/js/0f1280df.ef62c2de.js delete mode 100644 assets/js/109ef209.18455106.js rename assets/js/{1df93b7f.140e7df4.js => 1df93b7f.fab44a3c.js} (62%) create mode 100644 assets/js/3d9c95a4.3205b95d.js delete mode 100644 assets/js/4315fc58.04756219.js create mode 100644 assets/js/4315fc58.67e700cc.js delete mode 100644 assets/js/46e25335.77249d93.js create mode 100644 assets/js/46e25335.e9c2ac2b.js delete mode 100644 assets/js/66e67a33.e81f603d.js delete mode 100644 assets/js/91cb3e84.5acf482c.js create mode 100644 assets/js/91cb3e84.c31fc1c9.js create mode 100644 assets/js/935f2afb.8b5c524b.js delete mode 100644 assets/js/935f2afb.917661f4.js create mode 100644 assets/js/b204be58.d04c2711.js delete mode 100644 assets/js/b204be58.e680ec56.js create mode 100644 assets/js/bde67976.a3410ee9.js delete mode 100644 assets/js/bde67976.c440d31c.js delete mode 100644 assets/js/c5039d34.1f98e805.js create mode 100644 assets/js/c5039d34.4d9ce4af.js create mode 100644 assets/js/c8ed35e6.0ca10d1a.js delete mode 100644 assets/js/c8ed35e6.183ac2d9.js delete mode 100644 assets/js/d321bdfd.707b2e80.js create mode 100644 assets/js/d321bdfd.f25a4584.js create mode 100644 assets/js/main.1144ea72.js rename assets/js/{main.f45c2246.js.LICENSE.txt => main.1144ea72.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.f45c2246.js create mode 100644 assets/js/runtime~main.b5c94a30.js delete mode 100644 assets/js/runtime~main.b9881285.js create mode 100644 docs/Other/game-limits/index.html delete mode 100644 docs/Other/level-restrictions/index.html delete mode 100644 docs/Other/trivia/index.html create mode 100644 docs/home/index.html delete mode 100644 docs/intro/index.html create mode 100644 img/documentation/jfxr-export-link.png create mode 100644 img/documentation/manage-custom-levels.png diff --git a/404.html b/404.html index c0caafb..b300e60 100644 --- a/404.html +++ b/404.html @@ -5,10 +5,10 @@ Page Not Found | PPL Docs - - + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/images/jfxr-export-link-40fccb60e0766e3a2aa193d47af4aff4.png b/assets/images/jfxr-export-link-40fccb60e0766e3a2aa193d47af4aff4.png new file mode 100644 index 0000000000000000000000000000000000000000..98f21f531d3d2f1714c081786c039453b8c4fe39 GIT binary patch literal 108315 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

= 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 b)i(8VBxQM3xYeg!@TaDvshD-a;`aXlp$i1{ literal 0 HcmV?d00001 diff --git a/assets/images/manage-custom-levels-e8bb20ab8e46d62174c0c1ea7bc3bbd6.png b/assets/images/manage-custom-levels-e8bb20ab8e46d62174c0c1ea7bc3bbd6.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7291b34cd7178e11e1dbe02c440ed67741f08d GIT binary patch literal 31892 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 Lnrw}{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var n=t(4848),s=t(8453);const o={sidebar_position:1},l="Introduction",r={id:"intro",title:"Introduction",description:"This community-maintained wiki holds the resources useful for creating custom levels for PewPew Live.",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/ppl-docs/docs/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Types",permalink:"/ppl-docs/docs/APIs/types"}},a={},d=[{value:"Level structure",id:"level-structure",level:2},{value:"Uploading your level",id:"uploading-your-level",level:2},{value:"Recommended Lua Style guide",id:"recommended-lua-style-guide",level:2},{value:"Helpful tools and utilities",id:"helpful-tools-and-utilities",level:2}];function c(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(i.p,{children:"This community-maintained wiki holds the resources useful for creating custom levels for PewPew Live."}),"\n",(0,n.jsxs)(i.p,{children:["Levels are created by writing Lua code. If you are new to programming or new to Lua, a good first step is to start with the ",(0,n.jsx)(i.a,{href:"Guides/Lua/beginner",children:"Beginner"})," guide."]}),"\n",(0,n.jsxs)(i.p,{children:["If you are already familiar with programming, a good approach is to first look at the examples (for example, the ",(0,n.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/blob/d32dbec8a171c9bcc0f800dcd864f175c42c34fd/content/levels/simple_level/",children:"simple_level"}),") to get a feeling of how a level is made, and then come back to the wiki to get more precise information about the various aspect of level creation."]}),"\n",(0,n.jsxs)(i.p,{children:["If you have questions, the game's creator and many level creators are available on ",(0,n.jsx)(i.a,{href:"https://pewpew.live/discord",children:"Discord"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"level-structure",children:"Level structure"}),"\n",(0,n.jsxs)(i.p,{children:["A level is a directory that contains a ",(0,n.jsx)(i.a,{href:"File%20Information/manifest-files",children:"manifest"})," and Lua files. The Lua files fall in three categories:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Files that describe ",(0,n.jsx)(i.a,{href:"File%20Information/mesh-files",children:"graphics"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:["Files that describe ",(0,n.jsx)(i.a,{href:"File%20Information/sound-files",children:"sounds"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:["Files that describe the behavior of the level. They make use of the ",(0,n.jsx)(i.a,{href:"APIs/PewPew",children:"pewpew"})," and ",(0,n.jsx)(i.a,{href:"APIs/Fmath",children:"fmath"})," libraries, which require an understanding of the ",(0,n.jsx)(i.a,{href:"APIs/types",children:"types"})," used."]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"uploading-your-level",children:"Uploading your level"}),"\n",(0,n.jsxs)(i.p,{children:["You can upload your level by signing into your account on ",(0,n.jsx)(i.a,{href:"https://pewpew.live",children:"https://pewpew.live"})," and navigating to the ",(0,n.jsx)(i.em,{children:"Manage your custom levels"})," page."]}),"\n",(0,n.jsx)(i.h2,{id:"recommended-lua-style-guide",children:"Recommended Lua Style guide"}),"\n",(0,n.jsxs)(i.p,{children:["When writing code, it is recommended to follow ",(0,n.jsx)(i.a,{href:"https://github.com/luarocks/lua-style-guide",children:"LuaRocks's style guide"}),", but using 2 space\nindentation to be consistent with the rest of PewPew's codebase."]}),"\n",(0,n.jsx)(i.h2,{id:"helpful-tools-and-utilities",children:"Helpful tools and utilities"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://hybroid.pewpew.live/pps/",children:"PewPew Snippets"})," is an essential Visual Studio Code extension that offers autocompletion and useful code snippets for creating levels."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://github.com/ModEngineer/PewPewLive-MeshExporter",children:"PewPewLive-MeshExporter"})," is a Blender plugin for converting scenes into PewPew Live 3D meshes."]}),"\n"]})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>l,x:()=>r});var n=t(6540);const s={},o=n.createContext(s);function l(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0f1280df.ef62c2de.js b/assets/js/0f1280df.ef62c2de.js new file mode 100644 index 0000000..2c08efa --- /dev/null +++ b/assets/js/0f1280df.ef62c2de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[6894],{8002:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var n=i(4848),s=i(8453);const o={sidebar_position:2},l="Game limits",r={id:"Other/game-limits",title:"Game limits",description:"Entity count",source:"@site/docs/Other/game-limits.md",sourceDirName:"Other",slug:"/Other/game-limits",permalink:"/ppl-docs/docs/Other/game-limits",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/Other/game-limits.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Design principles",permalink:"/ppl-docs/docs/Other/level-design-principles"}},a={},c=[{value:"Entity count",id:"entity-count",level:2},{value:"Duration",id:"duration",level:2},{value:"Memory usage",id:"memory-usage",level:2}];function m(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"game-limits",children:"Game limits"}),"\n",(0,n.jsx)(t.h2,{id:"entity-count",children:"Entity count"}),"\n",(0,n.jsx)(t.p,{children:"At most 1300 entities can exist at any given moment. This includes the player's bullet. If there are already 1300 entities, no more entities will be created. This means that the player won't be able to shoot."}),"\n",(0,n.jsx)(t.h2,{id:"duration",children:"Duration"}),"\n",(0,n.jsxs)(t.p,{children:["A game lasts at most 1 hour. If the level has not called ",(0,n.jsx)(t.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_pewpew_lib#void-stop_game",children:(0,n.jsx)(t.code,{children:"stop_game"})})," by then, it will be called automatically.\nThe reason for this limitation is that replays then become too large."]}),"\n",(0,n.jsx)(t.h2,{id:"memory-usage",children:"Memory usage"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The Lua interpreter can't use more than 500KB of memory when running a level. Unless you have a memory leak in your level, this shouldn't be a problem."}),"\n",(0,n.jsx)(t.li,{children:"The Lua interpreter can't use more than 3MB of memory when loading a mesh. You will need to split a mesh into multiple files if you are hitting this limit."}),"\n",(0,n.jsx)(t.li,{children:"The Lua interpreter can't use more than 3MB of memory when loading sounds. Unless you are doing something really crazy, this will never be a problem."}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>r});var n=i(6540);const s={},o=n.createContext(s);function l(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/109ef209.18455106.js b/assets/js/109ef209.18455106.js deleted file mode 100644 index a72974b..0000000 --- a/assets/js/109ef209.18455106.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[9875],{5452:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=t(4848),i=t(8453);const s={sidebar_position:3},o="Trivia",a={id:"Other/trivia",title:"Trivia",description:"This page contains a random bag of technical information concerning PewPew Live.",source:"@site/docs/Other/trivia.md",sourceDirName:"Other",slug:"/Other/trivia",permalink:"/ppl-docs/docs/Other/trivia",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/Other/trivia.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Level restrictions",permalink:"/ppl-docs/docs/Other/level-restrictions"}},l={},c=[{value:"The Lua interpreter",id:"the-lua-interpreter",level:2},{value:"Version number",id:"version-number",level:2},{value:"Ports",id:"ports",level:2}];function p(e){const r={h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h1,{id:"trivia",children:"Trivia"}),"\n",(0,n.jsx)(r.p,{children:"This page contains a random bag of technical information concerning PewPew Live."}),"\n",(0,n.jsx)(r.h2,{id:"the-lua-interpreter",children:"The Lua interpreter"}),"\n",(0,n.jsx)(r.p,{children:"PewPew Live uses a fork of Lua 5.3."}),"\n",(0,n.jsx)(r.h2,{id:"version-number",children:"Version number"}),"\n",(0,n.jsx)(r.p,{children:"PewPew Live's version numbers consist of 3 parts: MAJOR.MINOR.BUILD"}),"\n",(0,n.jsx)(r.p,{children:"MAJOR and MINOR may get updated with any significant release.\nThe BUILD number is an ever-increasing number representing a point in time of PewPew Live's development."}),"\n",(0,n.jsx)(r.h2,{id:"ports",children:"Ports"}),"\n",(0,n.jsx)(r.p,{children:"PewPew Live uses several different ports."}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Multiplayer servers open the 51980 UDP port. If the port is unavailable, the server will try all ports up to 51989. If they are all taken, it will try to open ports random ports in the 49152-65535 range."}),"\n",(0,n.jsx)(r.li,{children:"LAN multiplayer room discovery is made by broadcasting on the ports 19869, 23902, 28013, 40124, 58240."}),"\n",(0,n.jsx)(r.li,{children:"The custom level development server exposes an http server on the TCP port 9000."}),"\n"]})]})}function d(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},8453:(e,r,t)=>{t.d(r,{R:()=>o,x:()=>a});var n=t(6540);const i={},s=n.createContext(i);function o(e){const r=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(s.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1df93b7f.140e7df4.js b/assets/js/1df93b7f.fab44a3c.js similarity index 62% rename from assets/js/1df93b7f.140e7df4.js rename to assets/js/1df93b7f.fab44a3c.js index 9016971..4467414 100644 --- a/assets/js/1df93b7f.140e7df4.js +++ b/assets/js/1df93b7f.fab44a3c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[4583],{8198:(e,t,s)=>{s.r(t),s.d(t,{default:()=>h});var n=s(4164),o=s(8774),r=s(4586),l=s(5476),a=s(1107);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var i=s(4848);function d(){const{siteConfig:e}=(0,r.A)();return(0,i.jsx)("header",{className:(0,n.A)("hero hero--primary",c.heroBanner),children:(0,i.jsxs)("div",{className:"container",children:[(0,i.jsx)(a.A,{as:"h1",className:"hero__title",children:e.title}),(0,i.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,i.jsxs)("div",{className:c.buttons,children:[(0,i.jsx)(o.A,{className:"button button--secondary button--lg",to:"/docs/intro",children:"Get started"}),(0,i.jsx)(o.A,{className:"button button--secondary button--lg",to:"/blog",style:{marginLeft:"1rem"},children:"Blog"})]})]})})}function h(){const{siteConfig:e}=(0,r.A)();return(0,i.jsx)(l.A,{title:"",description:"PPL Docs - Documentation for PPL level development",children:(0,i.jsx)(d,{})})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[4583],{8198:(e,t,s)=>{s.r(t),s.d(t,{default:()=>h});var n=s(4164),o=s(8774),r=s(4586),l=s(5476),a=s(1107);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var i=s(4848);function d(){const{siteConfig:e}=(0,r.A)();return(0,i.jsx)("header",{className:(0,n.A)("hero hero--primary",c.heroBanner),children:(0,i.jsxs)("div",{className:"container",children:[(0,i.jsx)(a.A,{as:"h1",className:"hero__title",children:e.title}),(0,i.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,i.jsxs)("div",{className:c.buttons,children:[(0,i.jsx)(o.A,{className:"button button--secondary button--lg",to:"/docs/home",children:"Get started"}),(0,i.jsx)(o.A,{className:"button button--secondary button--lg",to:"/blog",style:{marginLeft:"1rem"},children:"Blog"})]})]})})}function h(){const{siteConfig:e}=(0,r.A)();return(0,i.jsx)(l.A,{title:"",description:"PPL Docs - Documentation for PPL level development",children:(0,i.jsx)(d,{})})}}}]); \ No newline at end of file diff --git a/assets/js/3d9c95a4.3205b95d.js b/assets/js/3d9c95a4.3205b95d.js new file mode 100644 index 0000000..f5614b4 --- /dev/null +++ b/assets/js/3d9c95a4.3205b95d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[279],{9991:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var t=s(4848),n=s(8453);const l={sidebar_position:1},r="Home",o={id:"home",title:"Home",description:"This community-maintained wiki holds the resources useful for creating custom levels for PewPew Live.",source:"@site/docs/home.md",sourceDirName:".",slug:"/home",permalink:"/ppl-docs/docs/home",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/home.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Types",permalink:"/ppl-docs/docs/APIs/types"}},a={},d=[{value:"Level structure",id:"level-structure",level:2},{value:"Uploading your level",id:"uploading-your-level",level:2},{value:"PewPew Live's Lua",id:"pewpew-lives-lua",level:2},{value:"Recommended Lua Style guide",id:"recommended-lua-style-guide",level:2},{value:"Helpful tools and utilities",id:"helpful-tools-and-utilities",level:2}];function c(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"home",children:"Home"}),"\n",(0,t.jsx)(i.p,{children:"This community-maintained wiki holds the resources useful for creating custom levels for PewPew Live."}),"\n",(0,t.jsxs)(i.p,{children:["Levels are created by writing Lua code. If you are new to programming or new to Lua, a good first step is to start with the ",(0,t.jsx)(i.a,{href:"Guides/Lua/beginner",children:"Beginner"})," guide."]}),"\n",(0,t.jsxs)(i.p,{children:["If you are already familiar with programming, a good approach is to first look at the examples (for example, the ",(0,t.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/blob/d32dbec8a171c9bcc0f800dcd864f175c42c34fd/content/levels/simple_level/",children:"simple_level"}),") to get a feeling of how a level is made, and then come back to the wiki to get more precise information about the various aspect of level creation."]}),"\n",(0,t.jsxs)(i.p,{children:["If you have questions, the game's creator and many level creators are available on ",(0,t.jsx)(i.a,{href:"https://pewpew.live/discord",children:"Discord"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"level-structure",children:"Level structure"}),"\n",(0,t.jsxs)(i.p,{children:["A level is a directory that contains a ",(0,t.jsx)(i.a,{href:"File%20Information/manifest-files",children:"manifest"})," and Lua files. The Lua files fall in three categories:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Files that describe ",(0,t.jsx)(i.a,{href:"File%20Information/mesh-files",children:"graphics"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["Files that describe ",(0,t.jsx)(i.a,{href:"File%20Information/sound-files",children:"sounds"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["Files that describe the behavior of the level. They make use of the ",(0,t.jsx)(i.a,{href:"APIs/PewPew",children:"pewpew"})," and ",(0,t.jsx)(i.a,{href:"APIs/Fmath",children:"fmath"})," libraries, which require an understanding of the ",(0,t.jsx)(i.a,{href:"APIs/types",children:"types"})," used."]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"uploading-your-level",children:"Uploading your level"}),"\n",(0,t.jsxs)(i.p,{children:["You can upload your level by signing into your account on ",(0,t.jsx)(i.a,{href:"https://pewpew.live",children:"https://pewpew.live"})," and navigating to the ",(0,t.jsx)(i.em,{children:"Manage your custom levels"})," page."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"screenshot of UI for uploading",src:s(6727).A+"",width:"514",height:"248"})}),"\n",(0,t.jsx)(i.h2,{id:"pewpew-lives-lua",children:"PewPew Live's Lua"}),"\n",(0,t.jsx)(i.p,{children:"PewPew Live embeds a slightly customized version of Lua 5.3."}),"\n",(0,t.jsx)(i.p,{children:"Among the changes are:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Added a ",(0,t.jsx)(i.a,{href:"APIs/types",children:"fixed point type"})," to make the game logic deterministic everywhere."]}),"\n",(0,t.jsx)(i.li,{children:"Iteration over tables was made deterministic."}),"\n",(0,t.jsx)(i.li,{children:'The interpreter search for files in a virtual "dynamic" directory.'}),"\n",(0,t.jsxs)(i.li,{children:["The interpreter has aggressive ",(0,t.jsx)(i.a,{href:"Other/game-limits",children:"memory limits"}),"."]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"recommended-lua-style-guide",children:"Recommended Lua Style guide"}),"\n",(0,t.jsxs)(i.p,{children:["When writing code, it is recommended to follow ",(0,t.jsx)(i.a,{href:"https://github.com/luarocks/lua-style-guide",children:"LuaRocks's style guide"}),", but using 2 space\nindentation to be consistent with the rest of PewPew's codebase."]}),"\n",(0,t.jsx)(i.h2,{id:"helpful-tools-and-utilities",children:"Helpful tools and utilities"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"https://hybroid.pewpew.live/pps/",children:"PewPew Snippets"})," is an essential Visual Studio Code extension that offers autocompletion and useful code snippets for creating levels."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"https://github.com/ModEngineer/PewPewLive-MeshExporter",children:"PewPewLive-MeshExporter"})," is a Blender plugin for converting scenes into PewPew Live 3D meshes."]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},6727:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/manage-custom-levels-e8bb20ab8e46d62174c0c1ea7bc3bbd6.png"},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>o});var t=s(6540);const n={},l=t.createContext(n);function r(e){const i=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4315fc58.04756219.js b/assets/js/4315fc58.04756219.js deleted file mode 100644 index b944370..0000000 --- a/assets/js/4315fc58.04756219.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[7376],{2804:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>c,toc:()=>o});var t=i(4848),s=i(8453);const l={sidebar_position:2},d="pewpew library",c={id:"APIs/PewPew",title:"PewPew",description:"The pewpew library contains all the functions for configuring levels and managing entities.",source:"@site/docs/APIs/PewPew.md",sourceDirName:"APIs",slug:"/APIs/PewPew",permalink:"/ppl-docs/docs/APIs/PewPew",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/PewPew.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Types",permalink:"/ppl-docs/docs/APIs/types"},next:{title:"Fmath",permalink:"/ppl-docs/docs/APIs/Fmath"}},a={},o=[{value:"Enums",id:"enums",level:2},{value:"EntityType",id:"entitytype",level:3},{value:"MothershipType",id:"mothershiptype",level:3},{value:"CannonType",id:"cannontype",level:3},{value:"CannonFrequency",id:"cannonfrequency",level:3},{value:"BombType",id:"bombtype",level:3},{value:"BonusType",id:"bonustype",level:3},{value:"WeaponType",id:"weapontype",level:3},{value:"AsteroidSize",id:"asteroidsize",level:3},{value:"Functions",id:"functions",level:2},{value:"print()",id:"print",level:3},{value:"print_debug_info()",id:"print_debug_info",level:3},{value:"set_level_size()",id:"set_level_size",level:3},{value:"add_wall()",id:"add_wall",level:3},{value:"remove_wall()",id:"remove_wall",level:3},{value:"add_update_callback()",id:"add_update_callback",level:3},{value:"get_number_of_players()",id:"get_number_of_players",level:3},{value:"increase_score_of_player()",id:"increase_score_of_player",level:3},{value:"increase_score_streak_of_player()",id:"increase_score_streak_of_player",level:3},{value:"get_score_streak_level()",id:"get_score_streak_level",level:3},{value:"stop_game()",id:"stop_game",level:3},{value:"get_player_inputs()",id:"get_player_inputs",level:3},{value:"get_score_of_player()",id:"get_score_of_player",level:3},{value:"configure_player()",id:"configure_player",level:3},{value:"configure_player_hud()",id:"configure_player_hud",level:3},{value:"get_player_configuration()",id:"get_player_configuration",level:3},{value:"configure_player_ship_weapon()",id:"configure_player_ship_weapon",level:3},{value:"add_damage_to_player_ship()",id:"add_damage_to_player_ship",level:3},{value:"add_arrow_to_player_ship()",id:"add_arrow_to_player_ship",level:3},{value:"remove_arrow_from_player_ship()",id:"remove_arrow_from_player_ship",level:3},{value:"make_player_ship_transparent()",id:"make_player_ship_transparent",level:3},{value:"set_player_ship_speed()",id:"set_player_ship_speed",level:3},{value:"get_all_entities()",id:"get_all_entities",level:3},{value:"get_entities_colliding_with_disk()",id:"get_entities_colliding_with_disk",level:3},{value:"get_entity_count()",id:"get_entity_count",level:3},{value:"get_entity_type()",id:"get_entity_type",level:3},{value:"play_ambient_sound()",id:"play_ambient_sound",level:3},{value:"play_sound()",id:"play_sound",level:3},{value:"create_explosion()",id:"create_explosion",level:3},{value:"new_asteroid()",id:"new_asteroid",level:3},{value:"new_asteroid_with_size()",id:"new_asteroid_with_size",level:3},{value:"new_baf()",id:"new_baf",level:3},{value:"new_baf_red()",id:"new_baf_red",level:3},{value:"new_baf_blue()",id:"new_baf_blue",level:3},{value:"new_bomb()",id:"new_bomb",level:3},{value:"new_bonus()",id:"new_bonus",level:3},{value:"new_crowder()",id:"new_crowder",level:3},{value:"new_floating_message()",id:"new_floating_message",level:3},{value:"new_customizable_entity()",id:"new_customizable_entity",level:3},{value:"new_inertiac()",id:"new_inertiac",level:3},{value:"new_mothership()",id:"new_mothership",level:3},{value:"new_pointonium()",id:"new_pointonium",level:3},{value:"new_player_ship()",id:"new_player_ship",level:3},{value:"new_player_bullet()",id:"new_player_bullet",level:3},{value:"new_rolling_cube()",id:"new_rolling_cube",level:3},{value:"new_rolling_sphere()",id:"new_rolling_sphere",level:3},{value:"new_wary()",id:"new_wary",level:3},{value:"new_ufo()",id:"new_ufo",level:3},{value:"rolling_cube_set_enable_collisions_with_walls()",id:"rolling_cube_set_enable_collisions_with_walls",level:3},{value:"ufo_set_enable_collisions_with_walls()",id:"ufo_set_enable_collisions_with_walls",level:3},{value:"entity_get_position()",id:"entity_get_position",level:3},{value:"entity_get_is_alive()",id:"entity_get_is_alive",level:3},{value:"entity_get_is_started_to_be_destroyed()",id:"entity_get_is_started_to_be_destroyed",level:3},{value:"entity_set_position()",id:"entity_set_position",level:3},{value:"entity_set_radius()",id:"entity_set_radius",level:3},{value:"entity_set_update_callback()",id:"entity_set_update_callback",level:3},{value:"entity_destroy()",id:"entity_destroy",level:3},{value:"entity_react_to_weapon()",id:"entity_react_to_weapon",level:3},{value:"customizable_entity_set_position_interpolation()",id:"customizable_entity_set_position_interpolation",level:3},{value:"customizable_entity_set_mesh()",id:"customizable_entity_set_mesh",level:3},{value:"customizable_entity_set_flipping_meshes()",id:"customizable_entity_set_flipping_meshes",level:3},{value:"customizable_entity_set_mesh_color()",id:"customizable_entity_set_mesh_color",level:3},{value:"customizable_entity_set_string()",id:"customizable_entity_set_string",level:3},{value:"customizable_entity_set_mesh_xyz()",id:"customizable_entity_set_mesh_xyz",level:3},{value:"customizable_entity_set_mesh_z()",id:"customizable_entity_set_mesh_z",level:3},{value:"customizable_entity_set_mesh_scale()",id:"customizable_entity_set_mesh_scale",level:3},{value:"customizable_entity_set_mesh_xyz_scale()",id:"customizable_entity_set_mesh_xyz_scale",level:3},{value:"customizable_entity_set_mesh_angle()",id:"customizable_entity_set_mesh_angle",level:3},{value:"customizable_entity_skip_mesh_attributes_interpolation()",id:"customizable_entity_skip_mesh_attributes_interpolation",level:3},{value:"customizable_entity_configure_music_response()",id:"customizable_entity_configure_music_response",level:3},{value:"customizable_entity_add_rotation_to_mesh()",id:"customizable_entity_add_rotation_to_mesh",level:3},{value:"customizable_entity_set_visibility_radius()",id:"customizable_entity_set_visibility_radius",level:3},{value:"customizable_entity_configure_wall_collision()",id:"customizable_entity_configure_wall_collision",level:3},{value:"customizable_entity_set_player_collision_callback()",id:"customizable_entity_set_player_collision_callback",level:3},{value:"customizable_entity_set_weapon_collision_callback()",id:"customizable_entity_set_weapon_collision_callback",level:3},{value:"customizable_entity_start_spawning()",id:"customizable_entity_start_spawning",level:3},{value:"customizable_entity_start_exploding()",id:"customizable_entity_start_exploding",level:3}];function r(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"pewpew-library",children:"pewpew library"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pewpew"})," library contains all the functions for configuring levels and managing entities."]}),"\n",(0,t.jsx)(n.h2,{id:"enums",children:"Enums"}),"\n",(0,t.jsx)(n.h3,{id:"entitytype",children:"EntityType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"ASTEROID"}),"\n",(0,t.jsx)(n.li,{children:"BAF"}),"\n",(0,t.jsx)(n.li,{children:"INERTIAC"}),"\n",(0,t.jsx)(n.li,{children:"MOTHERSHIP"}),"\n",(0,t.jsx)(n.li,{children:"MOTHERSHIP_BULLET"}),"\n",(0,t.jsx)(n.li,{children:"ROLLING_CUBE"}),"\n",(0,t.jsx)(n.li,{children:"ROLLING_SPHERE"}),"\n",(0,t.jsx)(n.li,{children:"UFO"}),"\n",(0,t.jsx)(n.li,{children:"WARY"}),"\n",(0,t.jsx)(n.li,{children:"CROWDER"}),"\n",(0,t.jsx)(n.li,{children:"CUSTOMIZABLE_ENTITY"}),"\n",(0,t.jsx)(n.li,{children:"SHIP"}),"\n",(0,t.jsx)(n.li,{children:"BOMB"}),"\n",(0,t.jsx)(n.li,{children:"BAF_BLUE"}),"\n",(0,t.jsx)(n.li,{children:"BAF_RED"}),"\n",(0,t.jsx)(n.li,{children:"WARY_MISSILE"}),"\n",(0,t.jsx)(n.li,{children:"UFO_BULLET"}),"\n",(0,t.jsx)(n.li,{children:"PLAYER_BULLET"}),"\n",(0,t.jsx)(n.li,{children:"BOMB_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"PLAYER_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"BONUS"}),"\n",(0,t.jsx)(n.li,{children:"FLOATING_MESSAGE"}),"\n",(0,t.jsx)(n.li,{children:"POINTONIUM"}),"\n",(0,t.jsx)(n.li,{children:"BONUS_IMPLOSION"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"mothershiptype",children:"MothershipType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"THREE_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"FOUR_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"FIVE_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"SIX_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"SEVEN_CORNERS"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cannontype",children:"CannonType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SINGLE"}),"\n",(0,t.jsx)(n.li,{children:"TIC_TOC"}),"\n",(0,t.jsx)(n.li,{children:"DOUBLE"}),"\n",(0,t.jsx)(n.li,{children:"TRIPLE"}),"\n",(0,t.jsx)(n.li,{children:"FOUR_DIRECTIONS"}),"\n",(0,t.jsx)(n.li,{children:"DOUBLE_SWIPE"}),"\n",(0,t.jsx)(n.li,{children:"HEMISPHERE"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cannonfrequency",children:"CannonFrequency"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"FREQ_30"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_15"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_10"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_7_5"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_6"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_5"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_3"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_2"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_1"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"bombtype",children:"BombType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"FREEZE"}),"\n",(0,t.jsx)(n.li,{children:"REPULSIVE"}),"\n",(0,t.jsx)(n.li,{children:"ATOMIZE"}),"\n",(0,t.jsx)(n.li,{children:"SMALL_ATOMIZE"}),"\n",(0,t.jsx)(n.li,{children:"SMALL_FREEZE"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"bonustype",children:"BonusType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"REINSTANTIATION"}),"\n",(0,t.jsx)(n.li,{children:"SHIELD"}),"\n",(0,t.jsx)(n.li,{children:"SPEED"}),"\n",(0,t.jsx)(n.li,{children:"WEAPON"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"weapontype",children:"WeaponType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"BULLET"}),"\n",(0,t.jsx)(n.li,{children:"FREEZE_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"REPULSIVE_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"ATOMIZE_EXPLOSION"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"asteroidsize",children:"AsteroidSize"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SMALL"}),"\n",(0,t.jsx)(n.li,{children:"MEDIUM"}),"\n",(0,t.jsx)(n.li,{children:"LARGE"}),"\n",(0,t.jsx)(n.li,{children:"VERY_LARGE"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"functions",children:"Functions"}),"\n",(0,t.jsx)(n.h3,{id:"print",children:(0,t.jsx)(n.code,{children:"print()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.print(str: string)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Prints ",(0,t.jsx)(n.code,{children:"str"})," in the console for debugging."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local some_number = 42\npewpew.print("the value of some_number is: " .. some_number)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"print_debug_info",children:(0,t.jsx)(n.code,{children:"print_debug_info()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.print_debug_info()\n"})}),"\n",(0,t.jsx)(n.p,{children:"Prints debug info: the number of entities created and the amount of memory used by the script."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.print_debug_info()\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"set_level_size",children:(0,t.jsx)(n.code,{children:"set_level_size()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.set_level_size(\n width: FixedPoint,\n height: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the level's size. Implicetely adds walls to make sure that entities can not go outside of the level's boundaries. ",(0,t.jsx)(n.code,{children:"width"})," and ",(0,t.jsx)(n.code,{children:"height"})," are clamped to the range ]0fx, 6000fx]. If this function is not called, the level size is (10fx, 10fx), which is uselessly small for most cases."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local width = 300fx\nlocal height = 200fx\npewpew.set_level_size(width, height)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_wall",children:(0,t.jsx)(n.code,{children:"add_wall()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_wall(\n start_x: FixedPoint,\n start_y: FixedPoint,\n end_x: FixedPoint,\n end_y: FixedPoint\n): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Adds a wall to the level from (",(0,t.jsx)(n.code,{children:"start_x"}),",",(0,t.jsx)(n.code,{children:"start_y"}),") to (",(0,t.jsx)(n.code,{children:"end_x"}),",",(0,t.jsx)(n.code,{children:"end_y"}),"), and returns its wall ID. A maximum of 200 walls can be added to a level."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.add_wall(100fx, 100fx, 200fx, 200fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"remove_wall",children:(0,t.jsx)(n.code,{children:"remove_wall()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.remove_wall(wall_id: int)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Remove the wall with the given ",(0,t.jsx)(n.code,{children:"wall_id"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local wall_id = pewpew.add_wall(100fx, 100fx, 200fx, 200fx)\n-- Later, when the wall needs to be removed:\npewpew.remove_wall(wall_id)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_update_callback",children:(0,t.jsx)(n.code,{children:"add_update_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_update_callback(update_callback: function)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Adds a callback that will be updated at each game tick."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local tick_count = 0\npewpew.add_update_callback(function()\n pewpew.print("this is tick " .. tick_count)\n tick_count = tick_count + 1\nend)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_number_of_players",children:(0,t.jsx)(n.code,{children:"get_number_of_players()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_number_of_players(): int\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the number of players in the game."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"increase_score_of_player",children:(0,t.jsx)(n.code,{children:"increase_score_of_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.increase_score_of_player(\n player_index: int,\n delta: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Increases the score of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"})," by an amount of ",(0,t.jsx)(n.code,{children:"delta"}),". ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]. Note that ",(0,t.jsx)(n.code,{children:"delta"})," can be negative."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"increase_score_streak_of_player",children:(0,t.jsx)(n.code,{children:"increase_score_streak_of_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.increase_score_streak_of_player(\n player_index: int,\n delta: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Increases the score streak counter of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"})," by an amount of ",(0,t.jsx)(n.code,{children:"delta"}),". This counter is used to determine at which level of score streak the player is at. In turn, the score streak level is used to determine how much pointonium is given. Typically the score streak counter should be increased when an enemy is destroyed with the same score that the enemy provide. ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]. Note that ",(0,t.jsx)(n.code,{children:"delta"})," can be negative."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_score_streak_level",children:(0,t.jsx)(n.code,{children:"get_score_streak_level()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_score_streak_level(player_index: int): int\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns a number between 0 and 3. 0 is the lowest score streak (no pointonium is given), while 3 is the highest (3 pointoniums is usually given)"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"stop_game",children:(0,t.jsx)(n.code,{children:"stop_game()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.stop_game()\n"})}),"\n",(0,t.jsx)(n.p,{children:"Ends the current game."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_player_inputs",children:(0,t.jsx)(n.code,{children:"get_player_inputs()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_player_inputs(player_index: int): FixedPoint, FixedPoint, FixedPoint, FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the inputs of the player at the specified ",(0,t.jsx)(n.code,{children:"index"}),". The return values are in order: the movement joystick's angle (between 0 and 2pi), the movement joystick's distance (between 0 and 1), the shoot joystick's angle (between 0 and 2pi), and the shoot joystick's distance (between 0 and 1)."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local move_angle, move_distance, shoot_angle, shoot_distance = pewpew.get_player_inputs(0)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_score_of_player",children:(0,t.jsx)(n.code,{children:"get_score_of_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_score_of_player(player_index: int): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the score of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"}),". ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"configure_player",children:(0,t.jsx)(n.code,{children:"configure_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.configure_player(\n player_index: int,\n configuration: table {\n has_lost: bool,\n shield: int,\n camera_x_override: FixedPoint,\n camera_y_override: FixedPoint,\n camera_distance: FixedPoint,\n camera_rotation_x_axis: FixedPoint,\n move_joystick_color: int,\n shoot_joystick_color: int\n }\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configures the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"}),". ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]. A ",(0,t.jsx)(n.code,{children:"camera_distance"})," less than 0fx makes the camera move away from the ship. ",(0,t.jsx)(n.code,{children:"camera_rotation_x_axis"})," is in radian and rotates along the X axis.\nTo temporarily override the XY position of the camera, set ",(0,t.jsx)(n.strong,{children:"both"})," ",(0,t.jsx)(n.code,{children:"camera_x_override"})," and ",(0,t.jsx)(n.code,{children:"camera_y_override"}),"; this will make the camera be interpolated from wherever it was, to that new position."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.configure_player(0, {shield = 3, camera_distance = 50fx, move_joystick_color = 0xffff00ff})\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"configure_player_hud",children:(0,t.jsx)(n.code,{children:"configure_player_hud()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.configure_player_hud(\n player_index: int,\n configuration: table {\n top_left_line: string\n }\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configures the player's HUD.",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.configure_player_hud(0, {top_left_line = "Hello World"})\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_player_configuration",children:(0,t.jsx)(n.code,{children:"get_player_configuration()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_player_configuration(player_index: int): table {\n shield: int,\n has_lost: bool\n }\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns a map containing the configuration of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local shield = pewpew.get_player_configuration(0).shield\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"configure_player_ship_weapon",children:(0,t.jsx)(n.code,{children:"configure_player_ship_weapon()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.configure_player_ship_weapon(\n ship_id: EntityId,\n configuration: table {\n frequency: int,\n cannon: int,\n duration: int\n }\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configures the weapon of the ship identified with ",(0,t.jsx)(n.code,{children:"ship_id"})," using ",(0,t.jsx)(n.code,{children:"configuration"}),". ",(0,t.jsx)(n.code,{children:"frequency"})," determines the frequency of the shots. ",(0,t.jsx)(n.code,{children:"cannon"})," determines the type of cannon. ",(0,t.jsx)(n.code,{children:"duration"})," determines the number of game ticks during which the weapon will be available. Once the duration expires, the weapon reverts to its permanent configuration. If ",(0,t.jsx)(n.code,{children:"duration"})," is omitted, the weapon will be permanently set to this configuration. If ",(0,t.jsx)(n.code,{children:"frequency"})," or ",(0,t.jsx)(n.code,{children:"cannon"})," is omitted, the ship is configured to not have any weapon."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local weapon_config = {frequency = pewpew.CannonFrequency.FREQ_10, cannon = pewpew.CannonType.DOUBLE}\nlocal ship_id = player_helpers.new_player_ship(100fx, 200fx, 0)\npewpew.configure_player_ship_weapon(ship_id, weapon_config)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_damage_to_player_ship",children:(0,t.jsx)(n.code,{children:"add_damage_to_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_damage_to_player_ship(\n ship_id: EntityId,\n damage: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Reduces the amount of shield of the player that owns the ship by ",(0,t.jsx)(n.code,{children:"damage"})," points. If the player receives damage while having 0 shields left, the player loses."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_arrow_to_player_ship",children:(0,t.jsx)(n.code,{children:"add_arrow_to_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_arrow_to_player_ship(\n ship_id: EntityId,\n target_id: EntityId,\n color: int\n): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Adds an arrow to the ship identified with ",(0,t.jsx)(n.code,{children:"ship_id"})," pointing towards the entity identified with ",(0,t.jsx)(n.code,{children:"entity_id"}),", and returns the identifier of the arrow. ",(0,t.jsx)(n.code,{children:"color"})," specifies the arrow's color. The arrow is automatically removed when the target entity is destroyed."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"remove_arrow_from_player_ship",children:(0,t.jsx)(n.code,{children:"remove_arrow_from_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.remove_arrow_from_player_ship(\n ship_id: EntityId,\n arrow_id: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Removes the arrow identified by ",(0,t.jsx)(n.code,{children:"arrow_id"})," from the ship identified by ",(0,t.jsx)(n.code,{children:"ship_id"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"make_player_ship_transparent",children:(0,t.jsx)(n.code,{children:"make_player_ship_transparent()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.make_player_ship_transparent(\n ship_id: EntityId,\n transparency_duration: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the player ship transparent for ",(0,t.jsx)(n.code,{children:"transparency_duration"})," game ticks."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"set_player_ship_speed",children:(0,t.jsx)(n.code,{children:"set_player_ship_speed()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.set_player_ship_speed(\n ship_id: EntityId,\n factor: FixedPoint,\n offset: FixedPoint,\n duration: int\n): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets and returns the ",(0,t.jsx)(n.strong,{children:"effective speed"})," of the specified player ship as a function of the ",(0,t.jsx)(n.strong,{children:"base speed"})," of the ship. By default, a player ship moves according to its base speed, which is 10 distance units per tick (in the future, different ships may have different base speeds).\nAssuming the base speed of the ship is S, the new effective speed will be ",(0,t.jsx)(n.code,{children:"(factor*S)+offset"}),". ",(0,t.jsx)(n.code,{children:"duration"})," is the number of ticks during which the effective speed will be applied. Afterwards, the ship's speed reverts to its base speed. If ",(0,t.jsx)(n.code,{children:"duration"})," is negative, the effective speed never reverts to the base speed."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_all_entities",children:(0,t.jsx)(n.code,{children:"get_all_entities()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_all_entities(): List\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the list of the entityIDs of all the entities currently in the level. This includes the various bullets and ",(0,t.jsx)(n.em,{children:"all"})," the custom entities."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local entities = pewpew.get_all_entities()\npewpew.print("There are " .. #entities .. " entities in the level")\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_entities_colliding_with_disk",children:(0,t.jsx)(n.code,{children:"get_entities_colliding_with_disk()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_entities_colliding_with_disk(\n center_x: FixedPoint,\n center_y: FixedPoint,\n radius: FixedPoint\n): List\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the list of collidable entities (which includes all enemies) that overlap with the given disk."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local entities = pewpew.get_entities_colliding_with_disk(100fx, 100fx, 30fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_entity_count",children:(0,t.jsx)(n.code,{children:"get_entity_count()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_entity_count(type: int): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the number of entities of type ",(0,t.jsx)(n.code,{children:"type"})," that are alive."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local number_of_bafs = pewpew.get_entity_count(pewpew.EntityType.BAF)\nlocal number_of_asteroids = pewpew.get_entity_count(pewpew.EntityType.ASTEROID)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_entity_type",children:(0,t.jsx)(n.code,{children:"get_entity_type()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_entity_type(entity_id: EntityId): int\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the type of the given entity."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local type = pewpew.get_entity_type(id)\nif type == pewpew.EntityType.BAF then\n pewpew.print("the entity is a BAF")\nend\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"play_ambient_sound",children:(0,t.jsx)(n.code,{children:"play_ambient_sound()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.play_ambient_sound(\n sound_path: string,\n index: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Plays the sound described at ",(0,t.jsx)(n.code,{children:"sound_path"})," at the index ",(0,t.jsx)(n.code,{children:"index"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.play_ambient_sound("/dynamic/my_custom_sound.lua", 0)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"play_sound",children:(0,t.jsx)(n.code,{children:"play_sound()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.play_sound(\n sound_path: string,\n index: int,\n x: FixedPoint,\n y: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Plays the sound described at ",(0,t.jsx)(n.code,{children:"sound_path"})," at the in-game location of ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.play_sound("/dynamic/my_custom_sound.lua", 0, 100fx, 100fx)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"create_explosion",children:(0,t.jsx)(n.code,{children:"create_explosion()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.create_explosion(\n x: FixedPoint,\n y: FixedPoint,\n color: int,\n scale: FixedPoint,\n particle_count: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates an explosion of particles at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),". ",(0,t.jsx)(n.code,{children:"color"})," specifies the color of the explosion. ",(0,t.jsx)(n.code,{children:"scale"})," describes how large the explosion will be. It should be in the range ]0, 10], with 1 being an average explosion. ",(0,t.jsx)(n.code,{children:"particle_count"})," specifies the number of particles that make up the explosion. It must be in the range [1, 100]."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.create_explosion(200fx, 100fx, 0xffffffff, 1fx, 20) -- medium explosion\npewpew.create_explosion(300fx, 100fx, 0xffffffff, 3fx, 50) -- large red explosion\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_asteroid",children:(0,t.jsx)(n.code,{children:"new_asteroid()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_asteroid(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Asteroid at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_asteroid_with_size",children:(0,t.jsx)(n.code,{children:"new_asteroid_with_size()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_asteroid_with_size(\n x: FixedPoint,\n y: FixedPoint,\n size: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Asteroid at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," with an AsteroidSize given by ",(0,t.jsx)(n.code,{children:"size"})," and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_baf",children:(0,t.jsx)(n.code,{children:"new_baf()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_baf(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint,\n lifetime: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new BAF at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. ",(0,t.jsx)(n.code,{children:"angle"})," specifies the angle at which the BAF will move. ",(0,t.jsx)(n.code,{children:"speed"})," specifies the maximum speed it will reach. ",(0,t.jsx)(n.code,{children:"lifetime"})," indicates the number of game ticks after which the BAF is destroyed the next time it hits a wall. Specify a negative ",(0,t.jsx)(n.code,{children:"lifetime"})," to create a BAF that lives forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_baf_red",children:(0,t.jsx)(n.code,{children:"new_baf_red()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_baf_red(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint,\n lifetime: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new red BAF at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. A red BAF has more health points than a regular BAF. ",(0,t.jsx)(n.code,{children:"angle"})," specifies the angle at which the BAF will move. ",(0,t.jsx)(n.code,{children:"speed"})," specifies the maximum speed it will reach. ",(0,t.jsx)(n.code,{children:"lifetime"})," indicates the number of game ticks after which the BAF is destroyed the next time it hits a wall. Specify a negative ",(0,t.jsx)(n.code,{children:"lifetime"})," to create a BAF that lives forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_baf_blue",children:(0,t.jsx)(n.code,{children:"new_baf_blue()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_baf_blue(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint,\n lifetime: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new blue BAF at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. A blue BAF bounces on walls with a slightly randomized angle. ",(0,t.jsx)(n.code,{children:"angle"})," specifies the angle at which the BAF will move. ",(0,t.jsx)(n.code,{children:"speed"})," specifies the maximum speed it will reach. ",(0,t.jsx)(n.code,{children:"lifetime"})," indicates the number of game ticks after which the BAF is destroyed the next time it hits a wall. Specify a negative ",(0,t.jsx)(n.code,{children:"lifetime"})," to create a BAF that lives forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_bomb",children:(0,t.jsx)(n.code,{children:"new_bomb()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_bomb(\n x: FixedPoint,\n y: FixedPoint,\n type: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Bomb at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.new_bomb(10fx, 10fx, pewpew.BombType.SMALL_ATOMIZE)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_bonus",children:(0,t.jsx)(n.code,{children:"new_bonus()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_bonus(\n x: FixedPoint,\n y: FixedPoint,\n type: int,\n config: table {\n box_duration: int,\n cannon: int,\n frequency: int,\n weapon_duration: int,\n number_of_shields: int,\n speed_factor: FixedPoint,\n speed_offset: FixedPoint,\n speed_duration: int,\n taken_callback: function\n }\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Bonus at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," of the type ",(0,t.jsx)(n.code,{children:"type"}),", and returns its entityId.\nFor shield bonuses, the option ",(0,t.jsx)(n.code,{children:"number_of_shields"})," determines how many shields are given out.\nFor weapon bonuses, the options ",(0,t.jsx)(n.code,{children:"cannon"}),", ",(0,t.jsx)(n.code,{children:"frequency"}),", ",(0,t.jsx)(n.code,{children:"weapon_duration"})," have the same meaning as in ",(0,t.jsx)(n.code,{children:"pewpew.configure_player_ship_weapon"}),".\nFor speed bonuses, the options ",(0,t.jsx)(n.code,{children:"speed_factor"}),", ",(0,t.jsx)(n.code,{children:"speed_offset"}),",and ",(0,t.jsx)(n.code,{children:"speed_duration"})," have the same meaning as in ",(0,t.jsx)(n.code,{children:"set_player_speed"}),". ",(0,t.jsx)(n.code,{children:"taken_callback"})," is called when the bonus is taken, and is mandatory for the reinstantiation bonus. The callback receives as arguments the entity id of the bonus, the player id, and the ship's entity id.\nThe default box duration is 400 ticks."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.new_bonus(10fx, 10fx, pewpew.BonusType.WEAPON, {cannon = pewpew.CannonType.TIC_TOC, frequency = pewpew.CannonFrequency.FREQ_5, weapon_duration = 100})\npewpew.new_bonus(10fx, 10fx, pewpew.BonusType.SHIELD, {number_of_shields = 3})\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_crowder",children:(0,t.jsx)(n.code,{children:"new_crowder()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_crowder(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Crowder at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_floating_message",children:(0,t.jsx)(n.code,{children:"new_floating_message()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_floating_message(\n x: FixedPoint,\n y: FixedPoint,\n str: string,\n config: table {\n scale: FixedPoint,\n ticks_before_fade: int,\n is_optional: bool\n }\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new floating message at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", with ",(0,t.jsx)(n.code,{children:"str"})," as the message. The scale is a number that determines how large the message will be. ",(0,t.jsx)(n.code,{children:"1"})," is the default scale. ",(0,t.jsx)(n.code,{children:"ticks_before_fade"})," determines how many ticks occur before the message starts to fade out. ",(0,t.jsx)(n.code,{children:"is_optional"})," can be used to tell the game if the message can be hidden depending on the user's UI settings.\nIf not specified, ",(0,t.jsx)(n.code,{children:"scale"})," is 1, ",(0,t.jsx)(n.code,{children:"ticks_before_fade"})," is 30 and ",(0,t.jsx)(n.code,{children:"is_optional"})," is ",(0,t.jsx)(n.code,{children:"false"}),".\nReturns the floating message's entityId."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.new_floating_message(10fx, 10fx, "hello", {scale = 2fx, ticks_before_fade = 60, is_optional = true})\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_customizable_entity",children:(0,t.jsx)(n.code,{children:"new_customizable_entity()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_customizable_entity(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new customizable entity at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_inertiac",children:(0,t.jsx)(n.code,{children:"new_inertiac()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_inertiac(\n x: FixedPoint,\n y: FixedPoint,\n acceleration: FixedPoint,\n angle: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Inertiac at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. The inertiac will accelerate according to ",(0,t.jsx)(n.code,{children:"acceleration"}),". It spawns with a random velocity in a direction specified by ",(0,t.jsx)(n.code,{children:"angle"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_mothership",children:(0,t.jsx)(n.code,{children:"new_mothership()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_mothership(\n x: FixedPoint,\n y: FixedPoint,\n type: int,\n angle: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Mothership at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.new_mothership(50fx, 50fx, pewpew.MothershipType.THREE_CORNERS, fmath.tau() / 4fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_pointonium",children:(0,t.jsx)(n.code,{children:"new_pointonium()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_pointonium(\n x: FixedPoint,\n y: FixedPoint,\n value: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Pointonium at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),". Value must be 64, 128, or 256."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_player_ship",children:(0,t.jsx)(n.code,{children:"new_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_player_ship(\n x: FixedPoint,\n y: FixedPoint,\n player_index: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Player Ship at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," for the player identified by ",(0,t.jsx)(n.code,{children:"player_index"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_player_bullet",children:(0,t.jsx)(n.code,{children:"new_player_bullet()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_player_bullet(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n player_index: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new bullet at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," with the angle ",(0,t.jsx)(n.code,{children:"angle"})," belonging to the player at the index ",(0,t.jsx)(n.code,{children:"player_index"}),". Returns the entityId of the bullet."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_rolling_cube",children:(0,t.jsx)(n.code,{children:"new_rolling_cube()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_rolling_cube(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Rolling Cube at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_rolling_sphere",children:(0,t.jsx)(n.code,{children:"new_rolling_sphere()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_rolling_sphere(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Rolling Sphere at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_wary",children:(0,t.jsx)(n.code,{children:"new_wary()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_wary(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Wary at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_ufo",children:(0,t.jsx)(n.code,{children:"new_ufo()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_ufo(\n x: FixedPoint,\n y: FixedPoint,\n dx: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new UFO at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," moving horizontally at the speed of ",(0,t.jsx)(n.code,{children:"dx"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"rolling_cube_set_enable_collisions_with_walls",children:(0,t.jsx)(n.code,{children:"rolling_cube_set_enable_collisions_with_walls()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.rolling_cube_set_enable_collisions_with_walls(\n entity_id: EntityId,\n collide_with_walls: bool\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets whether the rolling cube identified with ",(0,t.jsx)(n.code,{children:"id"})," collides with walls. By default it does not."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local x,y = pewpew.rolling_cube_set_enable_collisions_with_walls(id, true)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"ufo_set_enable_collisions_with_walls",children:(0,t.jsx)(n.code,{children:"ufo_set_enable_collisions_with_walls()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.ufo_set_enable_collisions_with_walls(\n entity_id: EntityId,\n collide_with_walls: bool\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets whether the ufo identified with ",(0,t.jsx)(n.code,{children:"id"})," collides with walls. By default it does not."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local x,y = pewpew.ufo_set_enable_collisions_with_walls(id, true)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_get_position",children:(0,t.jsx)(n.code,{children:"entity_get_position()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_get_position(entity_id: EntityId): FixedPoint, FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the position of the entity identified by ",(0,t.jsx)(n.code,{children:"id"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local x,y = pewpew.entity_get_position(entity_id)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_get_is_alive",children:(0,t.jsx)(n.code,{children:"entity_get_is_alive()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_get_is_alive(entity_id: EntityId): bool\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns whether the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," is alive or not."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_get_is_started_to_be_destroyed",children:(0,t.jsx)(n.code,{children:"entity_get_is_started_to_be_destroyed()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_get_is_started_to_be_destroyed(entity_id: EntityId): bool\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns whether the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," is in the process of being destroyed. Returns false if the entity does not exist."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_set_position",children:(0,t.jsx)(n.code,{children:"entity_set_position()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_set_position(\n entity_id: EntityId,\n x: FixedPoint,\n y: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the position of the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," to ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_set_radius",children:(0,t.jsx)(n.code,{children:"entity_set_radius()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_set_radius(\n entity_id: EntityId,\n radius: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the radius of the entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". To give you a sense of scale, motherships have a radius of 28fx."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_set_update_callback",children:(0,t.jsx)(n.code,{children:"entity_set_update_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_set_update_callback(\n entity_id: EntityId,\n callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets a callback that will be called at every tick as long as the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," is alive. Remove the callback by passing a nil ",(0,t.jsx)(n.code,{children:"callback"}),". The callbacks gets called with the entity ID."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local function my_update_callback(entity_id)\n local x,y = pewpew.entity_get_position(entity_id)\n pewpew.entity_set_position(entity_id, x + 2fx, y) -- move the entity to the right\nend\npewpew.entity_set_update_callback(entity_id, my_update_callback)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_destroy",children:(0,t.jsx)(n.code,{children:"entity_destroy()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_destroy(entity_id: EntityId)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," immediately disappear forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_react_to_weapon",children:(0,t.jsx)(n.code,{children:"entity_react_to_weapon()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_react_to_weapon(\n entity_id: EntityId,\n weapon: table {\n type: int,\n x: FixedPoint,\n y: FixedPoint,\n player_index: int\n }\n): bool\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," react to the weapon described in ",(0,t.jsx)(n.code,{children:"weapon_description"}),". Returns whether the entity reacted to the weapon. The returned value is typically used to decide whether the weapon should continue to exist or not. In the case of an explosion, ",(0,t.jsx)(n.code,{children:"x"})," and ",(0,t.jsx)(n.code,{children:"y"})," should store the origin of the explosion. In the case of a bullet, ",(0,t.jsx)(n.code,{children:"x"})," and ",(0,t.jsx)(n.code,{children:"y"})," should store the vector of the bullet. The player identified by ",(0,t.jsx)(n.code,{children:"player_index"})," will be assigned points. If ",(0,t.jsx)(n.code,{children:"player_index"})," is invalid, no player will be assigned points."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_position_interpolation",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_position_interpolation()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_position_interpolation(\n entity_id: EntityId,\n enable: bool\n)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Sets whether the position of the mesh wil be interpolated when rendering. In general, this should be set to true if the entity will be moving smoothly."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh(\n entity_id: EntityId,\n file_path: string,\n index: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," to the mesh described in the file ",(0,t.jsx)(n.code,{children:"file_path"})," at the index ",(0,t.jsx)(n.code,{children:"index"}),". ",(0,t.jsx)(n.code,{children:"index"})," starts at 0. If ",(0,t.jsx)(n.code,{children:"file_path"})," is an empty string, the mesh is removed."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local id = pewpew.new_customizable_entity(0fx, 0fx)\npewpew.customizable_entity_set_mesh(id, "/dynamic/graphics.lua", 0)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_flipping_meshes",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_flipping_meshes()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_flipping_meshes(\n entity_id: EntityId,\n file_path: string,\n index_0: int,\n index_1: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Similar to ",(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh"}),", but sets two meshes that will be used in alternation. By specifying 2 separate meshes, 60 fps animations can be achieved."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local id = pewpew.new_customizable_entity(0fx, 0fx)\npewpew.customizable_entity_set_flipping_meshes(id, "/dynamic/graphics.lua", 0, 1)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_color",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_color()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_color(\n entity_id: EntityId,\n color: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the color multiplier for the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_string",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_string()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_string(\n entity_id: EntityId,\n text: string\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the string to be displayed as part of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_xyz",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_xyz()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_xyz(\n entity_id: EntityId,\n x: FixedPoint,\n y: FixedPoint,\n z: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the position of the mesh to x,y,z, relative to the center ofthe customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_z",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_z()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_z(\n entity_id: EntityId,\n z: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the height of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". A ",(0,t.jsx)(n.code,{children:"z"})," greater to 0 makes the mesh be closer, while a ",(0,t.jsx)(n.code,{children:"z"})," less than 0 makes the mesh be further away."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_scale",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_scale()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_scale(\n entity_id: EntityId,\n scale: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the scale of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". A ",(0,t.jsx)(n.code,{children:"scale"})," less than 1 makes the mesh appear smaller, while a ",(0,t.jsx)(n.code,{children:"scale"})," greater than 1 makes the mesh appear larger."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_xyz_scale",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_xyz_scale()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_xyz_scale(\n entity_id: EntityId,\n x_scale: FixedPoint,\n y_scale: FixedPoint,\n z_scale: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the scale of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," along the x,y,z axis. A ",(0,t.jsx)(n.code,{children:"scale"})," less than 1 makes the mesh appear smaller, while a ",(0,t.jsx)(n.code,{children:"scale"})," greater than 1 makes the mesh appear larger."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_angle",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_angle()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_angle(\n entity_id: EntityId,\n angle: FixedPoint,\n x_axis: FixedPoint,\n y_axis: FixedPoint,\n z_axis: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the rotation angle of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". The rotation is applied along the axis defined by ",(0,t.jsx)(n.code,{children:"x_axis"}),",",(0,t.jsx)(n.code,{children:"y_axis"}),",",(0,t.jsx)(n.code,{children:"z_axis"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"-- Rotate the entity by 45 degrees along the z_axis\npewpew.customizable_entity_set_mesh_angle(entity_id, fmath.tau() / 8fx, 0fx, 0fx, 1fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_skip_mesh_attributes_interpolation",children:(0,t.jsx)(n.code,{children:"customizable_entity_skip_mesh_attributes_interpolation()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_skip_mesh_attributes_interpolation(entity_id: EntityId)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Skips the interpolation of the mesh's attributes (x, y, z, scale_x, scale_y, scale_z, rotation)."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_configure_music_response",children:(0,t.jsx)(n.code,{children:"customizable_entity_configure_music_response()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_configure_music_response(\n entity_id: EntityId,\n config: table {\n color_start: int,\n color_end: int,\n scale_x_start: FixedPoint,\n scale_x_end: FixedPoint,\n scale_y_start: FixedPoint,\n scale_y_end: FixedPoint,\n scale_z_start: FixedPoint,\n scale_z_end: FixedPoint\n }\n)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Configures the way the entity is going to respond to the music."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:" -- Makes the entity larger\n pewpew.customizable_entity_configure_music_response(entity_id, {scale_x_start = 1fx, scale_x_end = 2fx})\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_add_rotation_to_mesh",children:(0,t.jsx)(n.code,{children:"customizable_entity_add_rotation_to_mesh()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_add_rotation_to_mesh(\n entity_id: EntityId,\n angle: FixedPoint,\n x_axis: FixedPoint,\n y_axis: FixedPoint,\n z_axis: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Adds a rotation to the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". The rotation is applied along the axis defined by ",(0,t.jsx)(n.code,{children:"x_axis"}),",",(0,t.jsx)(n.code,{children:"y_axis"}),",",(0,t.jsx)(n.code,{children:"z_axis"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"-- Rotate the entity by 45 degrees along the z_axis\npewpew.customizable_entity_add_rotation_to_mesh(entity_id, fmath.tau() / 8fx, 0fx, 0fx, 1fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_visibility_radius",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_visibility_radius()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_visibility_radius(\n entity_id: EntityId,\n radius: FixedPoint\n)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Sets the radius defining the visibility of the entity. This allows the game to know when an entity is actually visible, which in turns allows to massively optimize the rendering. Use the smallest value possible. If not set, the rendering radius is an unspecified large number that effectively makes the entity always be rendered, even if not visible."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_configure_wall_collision",children:(0,t.jsx)(n.code,{children:"customizable_entity_configure_wall_collision()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_configure_wall_collision(\n entity_id: EntityId,\n collide_with_walls: bool,\n collision_callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"collide_with_walls"})," configures whether the entity should stop when colliding with walls. If ",(0,t.jsx)(n.code,{children:"collision_callback"})," is not nil, it is called anytime a collision is detected. The callback gets called with the entity id of the entity withthe callback, and with the normal to the wall."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'function my_wall_collision_callback(entity_id, wall_normal_x, wall_normal_y)\n pewpew.print("A wall collision happened with entity " .. entity_id)\nend\nlocal id = pewpew.new_customizable_entity(100fx, 100fx)\npewpew.customizable_entity_configure_wall_collision(id, my_wall_collision_callback)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_player_collision_callback",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_player_collision_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_player_collision_callback(\n entity_id: EntityId,\n collision_callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the callback for when the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," collides with a player's ship. The callback gets called with the entity id of the entity with the callback, and the player_index and ship_id that were involved in the collision. Don't forget to set a radius on the customizable entity, otherwise no collisions will be detected."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'function my_collision_callback(entity_id, player_index, ship_entity_id)\n pewpew.print("The entity: " .. entity_id)\n pewpew.print("Collided with the ship: " .. ship_entity_id)\n pewpew.print("That belongs to the player: " .. player_index)\nend\nlocal id = pewpew.new_customizable_entity(100fx, 100fx)\npewpew.customizable_entity_set_player_collision_callback(id, my_collision_callback)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_weapon_collision_callback",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_weapon_collision_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_weapon_collision_callback(\n entity_id: EntityId,\n weapon_collision_callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the callback for when the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," collides with a player's weapon. The callback gets called with the entity_id of the entity on which the callback is set, the player_index of the player that triggered the weapon, and the type of the weapon. The callback ",(0,t.jsx)(n.em,{children:"must"})," return a boolean saying whether the entity reacts to the weapon. In the case of a bullet, this boolean determines whether the bullet should be destroyed."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local id = pewpew.new_customizable_entity(100fx, 100fx)\npewpew.customizable_entity_set_weapon_collision_callback(id, function(entity_id, player_index, weapon_type)\n pewpew.print("Collided with weapon from player: " .. player_index)\n if weapon_type == pewpew.WeaponType.BULLET then\n pewpew.print("Collided with bullet!")\n end\n return true\nend)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_start_spawning",children:(0,t.jsx)(n.code,{children:"customizable_entity_start_spawning()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_start_spawning(\n entity_id: EntityId,\n spawning_duration: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," spawn for a duration of ",(0,t.jsx)(n.code,{children:"spawning_duration"})," game ticks."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_start_exploding",children:(0,t.jsx)(n.code,{children:"customizable_entity_start_exploding()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_start_exploding(\n entity_id: EntityId,\n explosion_duration: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," explode for a duration of ",(0,t.jsx)(n.code,{children:"explosion_duration"})," game ticks. After the explosion, the entity is destroyed. ",(0,t.jsx)(n.code,{children:"explosion_duration"})," must be less than 255. Any scale applied to the entity is also applied to the explosion."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(r,{...e})}):r(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>c});var t=i(6540);const s={},l=t.createContext(s);function d(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4315fc58.67e700cc.js b/assets/js/4315fc58.67e700cc.js new file mode 100644 index 0000000..6b6dd80 --- /dev/null +++ b/assets/js/4315fc58.67e700cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[7376],{2804:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>c,toc:()=>o});var t=i(4848),s=i(8453);const l={sidebar_position:2},d="pewpew library",c={id:"APIs/PewPew",title:"pewpew library",description:"The pewpew library contains all the functions for configuring levels and managing entities.",source:"@site/docs/APIs/PewPew.md",sourceDirName:"APIs",slug:"/APIs/PewPew",permalink:"/ppl-docs/docs/APIs/PewPew",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/PewPew.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Types",permalink:"/ppl-docs/docs/APIs/types"},next:{title:"fmath library",permalink:"/ppl-docs/docs/APIs/Fmath"}},a={},o=[{value:"Enums",id:"enums",level:2},{value:"EntityType",id:"entitytype",level:3},{value:"MothershipType",id:"mothershiptype",level:3},{value:"CannonType",id:"cannontype",level:3},{value:"CannonFrequency",id:"cannonfrequency",level:3},{value:"BombType",id:"bombtype",level:3},{value:"BonusType",id:"bonustype",level:3},{value:"WeaponType",id:"weapontype",level:3},{value:"AsteroidSize",id:"asteroidsize",level:3},{value:"Functions",id:"functions",level:2},{value:"print()",id:"print",level:3},{value:"print_debug_info()",id:"print_debug_info",level:3},{value:"set_level_size()",id:"set_level_size",level:3},{value:"add_wall()",id:"add_wall",level:3},{value:"remove_wall()",id:"remove_wall",level:3},{value:"add_update_callback()",id:"add_update_callback",level:3},{value:"get_number_of_players()",id:"get_number_of_players",level:3},{value:"increase_score_of_player()",id:"increase_score_of_player",level:3},{value:"increase_score_streak_of_player()",id:"increase_score_streak_of_player",level:3},{value:"get_score_streak_level()",id:"get_score_streak_level",level:3},{value:"stop_game()",id:"stop_game",level:3},{value:"get_player_inputs()",id:"get_player_inputs",level:3},{value:"get_score_of_player()",id:"get_score_of_player",level:3},{value:"configure_player()",id:"configure_player",level:3},{value:"configure_player_hud()",id:"configure_player_hud",level:3},{value:"get_player_configuration()",id:"get_player_configuration",level:3},{value:"configure_player_ship_weapon()",id:"configure_player_ship_weapon",level:3},{value:"add_damage_to_player_ship()",id:"add_damage_to_player_ship",level:3},{value:"add_arrow_to_player_ship()",id:"add_arrow_to_player_ship",level:3},{value:"remove_arrow_from_player_ship()",id:"remove_arrow_from_player_ship",level:3},{value:"make_player_ship_transparent()",id:"make_player_ship_transparent",level:3},{value:"set_player_ship_speed()",id:"set_player_ship_speed",level:3},{value:"get_all_entities()",id:"get_all_entities",level:3},{value:"get_entities_colliding_with_disk()",id:"get_entities_colliding_with_disk",level:3},{value:"get_entity_count()",id:"get_entity_count",level:3},{value:"get_entity_type()",id:"get_entity_type",level:3},{value:"play_ambient_sound()",id:"play_ambient_sound",level:3},{value:"play_sound()",id:"play_sound",level:3},{value:"create_explosion()",id:"create_explosion",level:3},{value:"new_asteroid()",id:"new_asteroid",level:3},{value:"new_asteroid_with_size()",id:"new_asteroid_with_size",level:3},{value:"new_baf()",id:"new_baf",level:3},{value:"new_baf_red()",id:"new_baf_red",level:3},{value:"new_baf_blue()",id:"new_baf_blue",level:3},{value:"new_bomb()",id:"new_bomb",level:3},{value:"new_bonus()",id:"new_bonus",level:3},{value:"new_crowder()",id:"new_crowder",level:3},{value:"new_floating_message()",id:"new_floating_message",level:3},{value:"new_customizable_entity()",id:"new_customizable_entity",level:3},{value:"new_inertiac()",id:"new_inertiac",level:3},{value:"new_mothership()",id:"new_mothership",level:3},{value:"new_pointonium()",id:"new_pointonium",level:3},{value:"new_player_ship()",id:"new_player_ship",level:3},{value:"new_player_bullet()",id:"new_player_bullet",level:3},{value:"new_rolling_cube()",id:"new_rolling_cube",level:3},{value:"new_rolling_sphere()",id:"new_rolling_sphere",level:3},{value:"new_wary()",id:"new_wary",level:3},{value:"new_ufo()",id:"new_ufo",level:3},{value:"rolling_cube_set_enable_collisions_with_walls()",id:"rolling_cube_set_enable_collisions_with_walls",level:3},{value:"ufo_set_enable_collisions_with_walls()",id:"ufo_set_enable_collisions_with_walls",level:3},{value:"entity_get_position()",id:"entity_get_position",level:3},{value:"entity_get_is_alive()",id:"entity_get_is_alive",level:3},{value:"entity_get_is_started_to_be_destroyed()",id:"entity_get_is_started_to_be_destroyed",level:3},{value:"entity_set_position()",id:"entity_set_position",level:3},{value:"entity_set_radius()",id:"entity_set_radius",level:3},{value:"entity_set_update_callback()",id:"entity_set_update_callback",level:3},{value:"entity_destroy()",id:"entity_destroy",level:3},{value:"entity_react_to_weapon()",id:"entity_react_to_weapon",level:3},{value:"customizable_entity_set_position_interpolation()",id:"customizable_entity_set_position_interpolation",level:3},{value:"customizable_entity_set_mesh()",id:"customizable_entity_set_mesh",level:3},{value:"customizable_entity_set_flipping_meshes()",id:"customizable_entity_set_flipping_meshes",level:3},{value:"customizable_entity_set_mesh_color()",id:"customizable_entity_set_mesh_color",level:3},{value:"customizable_entity_set_string()",id:"customizable_entity_set_string",level:3},{value:"customizable_entity_set_mesh_xyz()",id:"customizable_entity_set_mesh_xyz",level:3},{value:"customizable_entity_set_mesh_z()",id:"customizable_entity_set_mesh_z",level:3},{value:"customizable_entity_set_mesh_scale()",id:"customizable_entity_set_mesh_scale",level:3},{value:"customizable_entity_set_mesh_xyz_scale()",id:"customizable_entity_set_mesh_xyz_scale",level:3},{value:"customizable_entity_set_mesh_angle()",id:"customizable_entity_set_mesh_angle",level:3},{value:"customizable_entity_skip_mesh_attributes_interpolation()",id:"customizable_entity_skip_mesh_attributes_interpolation",level:3},{value:"customizable_entity_configure_music_response()",id:"customizable_entity_configure_music_response",level:3},{value:"customizable_entity_add_rotation_to_mesh()",id:"customizable_entity_add_rotation_to_mesh",level:3},{value:"customizable_entity_set_visibility_radius()",id:"customizable_entity_set_visibility_radius",level:3},{value:"customizable_entity_configure_wall_collision()",id:"customizable_entity_configure_wall_collision",level:3},{value:"customizable_entity_set_player_collision_callback()",id:"customizable_entity_set_player_collision_callback",level:3},{value:"customizable_entity_set_weapon_collision_callback()",id:"customizable_entity_set_weapon_collision_callback",level:3},{value:"customizable_entity_start_spawning()",id:"customizable_entity_start_spawning",level:3},{value:"customizable_entity_start_exploding()",id:"customizable_entity_start_exploding",level:3}];function r(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"pewpew-library",children:"pewpew library"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pewpew"})," library contains all the functions for configuring levels and managing entities."]}),"\n",(0,t.jsx)(n.h2,{id:"enums",children:"Enums"}),"\n",(0,t.jsx)(n.h3,{id:"entitytype",children:"EntityType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"ASTEROID"}),"\n",(0,t.jsx)(n.li,{children:"BAF"}),"\n",(0,t.jsx)(n.li,{children:"INERTIAC"}),"\n",(0,t.jsx)(n.li,{children:"MOTHERSHIP"}),"\n",(0,t.jsx)(n.li,{children:"MOTHERSHIP_BULLET"}),"\n",(0,t.jsx)(n.li,{children:"ROLLING_CUBE"}),"\n",(0,t.jsx)(n.li,{children:"ROLLING_SPHERE"}),"\n",(0,t.jsx)(n.li,{children:"UFO"}),"\n",(0,t.jsx)(n.li,{children:"WARY"}),"\n",(0,t.jsx)(n.li,{children:"CROWDER"}),"\n",(0,t.jsx)(n.li,{children:"CUSTOMIZABLE_ENTITY"}),"\n",(0,t.jsx)(n.li,{children:"SHIP"}),"\n",(0,t.jsx)(n.li,{children:"BOMB"}),"\n",(0,t.jsx)(n.li,{children:"BAF_BLUE"}),"\n",(0,t.jsx)(n.li,{children:"BAF_RED"}),"\n",(0,t.jsx)(n.li,{children:"WARY_MISSILE"}),"\n",(0,t.jsx)(n.li,{children:"UFO_BULLET"}),"\n",(0,t.jsx)(n.li,{children:"PLAYER_BULLET"}),"\n",(0,t.jsx)(n.li,{children:"BOMB_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"PLAYER_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"BONUS"}),"\n",(0,t.jsx)(n.li,{children:"FLOATING_MESSAGE"}),"\n",(0,t.jsx)(n.li,{children:"POINTONIUM"}),"\n",(0,t.jsx)(n.li,{children:"BONUS_IMPLOSION"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"mothershiptype",children:"MothershipType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"THREE_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"FOUR_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"FIVE_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"SIX_CORNERS"}),"\n",(0,t.jsx)(n.li,{children:"SEVEN_CORNERS"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cannontype",children:"CannonType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SINGLE"}),"\n",(0,t.jsx)(n.li,{children:"TIC_TOC"}),"\n",(0,t.jsx)(n.li,{children:"DOUBLE"}),"\n",(0,t.jsx)(n.li,{children:"TRIPLE"}),"\n",(0,t.jsx)(n.li,{children:"FOUR_DIRECTIONS"}),"\n",(0,t.jsx)(n.li,{children:"DOUBLE_SWIPE"}),"\n",(0,t.jsx)(n.li,{children:"HEMISPHERE"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cannonfrequency",children:"CannonFrequency"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"FREQ_30"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_15"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_10"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_7_5"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_6"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_5"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_3"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_2"}),"\n",(0,t.jsx)(n.li,{children:"FREQ_1"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"bombtype",children:"BombType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"FREEZE"}),"\n",(0,t.jsx)(n.li,{children:"REPULSIVE"}),"\n",(0,t.jsx)(n.li,{children:"ATOMIZE"}),"\n",(0,t.jsx)(n.li,{children:"SMALL_ATOMIZE"}),"\n",(0,t.jsx)(n.li,{children:"SMALL_FREEZE"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"bonustype",children:"BonusType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"REINSTANTIATION"}),"\n",(0,t.jsx)(n.li,{children:"SHIELD"}),"\n",(0,t.jsx)(n.li,{children:"SPEED"}),"\n",(0,t.jsx)(n.li,{children:"WEAPON"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"weapontype",children:"WeaponType"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"BULLET"}),"\n",(0,t.jsx)(n.li,{children:"FREEZE_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"REPULSIVE_EXPLOSION"}),"\n",(0,t.jsx)(n.li,{children:"ATOMIZE_EXPLOSION"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"asteroidsize",children:"AsteroidSize"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SMALL"}),"\n",(0,t.jsx)(n.li,{children:"MEDIUM"}),"\n",(0,t.jsx)(n.li,{children:"LARGE"}),"\n",(0,t.jsx)(n.li,{children:"VERY_LARGE"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"functions",children:"Functions"}),"\n",(0,t.jsx)(n.h3,{id:"print",children:(0,t.jsx)(n.code,{children:"print()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.print(str: string)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Prints ",(0,t.jsx)(n.code,{children:"str"})," in the console for debugging."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local some_number = 42\npewpew.print("the value of some_number is: " .. some_number)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"print_debug_info",children:(0,t.jsx)(n.code,{children:"print_debug_info()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.print_debug_info()\n"})}),"\n",(0,t.jsx)(n.p,{children:"Prints debug info: the number of entities created and the amount of memory used by the script."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.print_debug_info()\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"set_level_size",children:(0,t.jsx)(n.code,{children:"set_level_size()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.set_level_size(\n width: FixedPoint,\n height: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the level's size. Implicetely adds walls to make sure that entities can not go outside of the level's boundaries. ",(0,t.jsx)(n.code,{children:"width"})," and ",(0,t.jsx)(n.code,{children:"height"})," are clamped to the range ]0fx, 6000fx]. If this function is not called, the level size is (10fx, 10fx), which is uselessly small for most cases."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local width = 300fx\nlocal height = 200fx\npewpew.set_level_size(width, height)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_wall",children:(0,t.jsx)(n.code,{children:"add_wall()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_wall(\n start_x: FixedPoint,\n start_y: FixedPoint,\n end_x: FixedPoint,\n end_y: FixedPoint\n): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Adds a wall to the level from (",(0,t.jsx)(n.code,{children:"start_x"}),",",(0,t.jsx)(n.code,{children:"start_y"}),") to (",(0,t.jsx)(n.code,{children:"end_x"}),",",(0,t.jsx)(n.code,{children:"end_y"}),"), and returns its wall ID. A maximum of 200 walls can be added to a level."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.add_wall(100fx, 100fx, 200fx, 200fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"remove_wall",children:(0,t.jsx)(n.code,{children:"remove_wall()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.remove_wall(wall_id: int)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Remove the wall with the given ",(0,t.jsx)(n.code,{children:"wall_id"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local wall_id = pewpew.add_wall(100fx, 100fx, 200fx, 200fx)\n-- Later, when the wall needs to be removed:\npewpew.remove_wall(wall_id)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_update_callback",children:(0,t.jsx)(n.code,{children:"add_update_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_update_callback(update_callback: function)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Adds a callback that will be updated at each game tick."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local tick_count = 0\npewpew.add_update_callback(function()\n pewpew.print("this is tick " .. tick_count)\n tick_count = tick_count + 1\nend)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_number_of_players",children:(0,t.jsx)(n.code,{children:"get_number_of_players()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_number_of_players(): int\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the number of players in the game."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"increase_score_of_player",children:(0,t.jsx)(n.code,{children:"increase_score_of_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.increase_score_of_player(\n player_index: int,\n delta: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Increases the score of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"})," by an amount of ",(0,t.jsx)(n.code,{children:"delta"}),". ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]. Note that ",(0,t.jsx)(n.code,{children:"delta"})," can be negative."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"increase_score_streak_of_player",children:(0,t.jsx)(n.code,{children:"increase_score_streak_of_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.increase_score_streak_of_player(\n player_index: int,\n delta: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Increases the score streak counter of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"})," by an amount of ",(0,t.jsx)(n.code,{children:"delta"}),". This counter is used to determine at which level of score streak the player is at. In turn, the score streak level is used to determine how much pointonium is given. Typically the score streak counter should be increased when an enemy is destroyed with the same score that the enemy provide. ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]. Note that ",(0,t.jsx)(n.code,{children:"delta"})," can be negative."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_score_streak_level",children:(0,t.jsx)(n.code,{children:"get_score_streak_level()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_score_streak_level(player_index: int): int\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns a number between 0 and 3. 0 is the lowest score streak (no pointonium is given), while 3 is the highest (3 pointoniums is usually given)"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"stop_game",children:(0,t.jsx)(n.code,{children:"stop_game()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.stop_game()\n"})}),"\n",(0,t.jsx)(n.p,{children:"Ends the current game."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_player_inputs",children:(0,t.jsx)(n.code,{children:"get_player_inputs()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_player_inputs(player_index: int): FixedPoint, FixedPoint, FixedPoint, FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the inputs of the player at the specified ",(0,t.jsx)(n.code,{children:"index"}),". The return values are in order: the movement joystick's angle (between 0 and 2pi), the movement joystick's distance (between 0 and 1), the shoot joystick's angle (between 0 and 2pi), and the shoot joystick's distance (between 0 and 1)."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local move_angle, move_distance, shoot_angle, shoot_distance = pewpew.get_player_inputs(0)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_score_of_player",children:(0,t.jsx)(n.code,{children:"get_score_of_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_score_of_player(player_index: int): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the score of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"}),". ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"configure_player",children:(0,t.jsx)(n.code,{children:"configure_player()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.configure_player(\n player_index: int,\n configuration: table {\n has_lost: bool,\n shield: int,\n camera_x_override: FixedPoint,\n camera_y_override: FixedPoint,\n camera_distance: FixedPoint,\n camera_rotation_x_axis: FixedPoint,\n move_joystick_color: int,\n shoot_joystick_color: int\n }\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configures the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"}),". ",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]. A ",(0,t.jsx)(n.code,{children:"camera_distance"})," less than 0fx makes the camera move away from the ship. ",(0,t.jsx)(n.code,{children:"camera_rotation_x_axis"})," is in radian and rotates along the X axis.\nTo temporarily override the XY position of the camera, set ",(0,t.jsx)(n.strong,{children:"both"})," ",(0,t.jsx)(n.code,{children:"camera_x_override"})," and ",(0,t.jsx)(n.code,{children:"camera_y_override"}),"; this will make the camera be interpolated from wherever it was, to that new position."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.configure_player(0, {shield = 3, camera_distance = 50fx, move_joystick_color = 0xffff00ff})\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"configure_player_hud",children:(0,t.jsx)(n.code,{children:"configure_player_hud()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.configure_player_hud(\n player_index: int,\n configuration: table {\n top_left_line: string\n }\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configures the player's HUD.",(0,t.jsx)(n.code,{children:"player_index"})," must in the range [0, get_number_of_players() - 1]."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.configure_player_hud(0, {top_left_line = "Hello World"})\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_player_configuration",children:(0,t.jsx)(n.code,{children:"get_player_configuration()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_player_configuration(player_index: int): table {\n shield: int,\n has_lost: bool\n }\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns a map containing the configuration of the player at the specified ",(0,t.jsx)(n.code,{children:"player_index"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local shield = pewpew.get_player_configuration(0).shield\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"configure_player_ship_weapon",children:(0,t.jsx)(n.code,{children:"configure_player_ship_weapon()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.configure_player_ship_weapon(\n ship_id: EntityId,\n configuration: table {\n frequency: int,\n cannon: int,\n duration: int\n }\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configures the weapon of the ship identified with ",(0,t.jsx)(n.code,{children:"ship_id"})," using ",(0,t.jsx)(n.code,{children:"configuration"}),". ",(0,t.jsx)(n.code,{children:"frequency"})," determines the frequency of the shots. ",(0,t.jsx)(n.code,{children:"cannon"})," determines the type of cannon. ",(0,t.jsx)(n.code,{children:"duration"})," determines the number of game ticks during which the weapon will be available. Once the duration expires, the weapon reverts to its permanent configuration. If ",(0,t.jsx)(n.code,{children:"duration"})," is omitted, the weapon will be permanently set to this configuration. If ",(0,t.jsx)(n.code,{children:"frequency"})," or ",(0,t.jsx)(n.code,{children:"cannon"})," is omitted, the ship is configured to not have any weapon."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local weapon_config = {frequency = pewpew.CannonFrequency.FREQ_10, cannon = pewpew.CannonType.DOUBLE}\nlocal ship_id = player_helpers.new_player_ship(100fx, 200fx, 0)\npewpew.configure_player_ship_weapon(ship_id, weapon_config)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_damage_to_player_ship",children:(0,t.jsx)(n.code,{children:"add_damage_to_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_damage_to_player_ship(\n ship_id: EntityId,\n damage: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Reduces the amount of shield of the player that owns the ship by ",(0,t.jsx)(n.code,{children:"damage"})," points. If the player receives damage while having 0 shields left, the player loses."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add_arrow_to_player_ship",children:(0,t.jsx)(n.code,{children:"add_arrow_to_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.add_arrow_to_player_ship(\n ship_id: EntityId,\n target_id: EntityId,\n color: int\n): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Adds an arrow to the ship identified with ",(0,t.jsx)(n.code,{children:"ship_id"})," pointing towards the entity identified with ",(0,t.jsx)(n.code,{children:"entity_id"}),", and returns the identifier of the arrow. ",(0,t.jsx)(n.code,{children:"color"})," specifies the arrow's color. The arrow is automatically removed when the target entity is destroyed."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"remove_arrow_from_player_ship",children:(0,t.jsx)(n.code,{children:"remove_arrow_from_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.remove_arrow_from_player_ship(\n ship_id: EntityId,\n arrow_id: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Removes the arrow identified by ",(0,t.jsx)(n.code,{children:"arrow_id"})," from the ship identified by ",(0,t.jsx)(n.code,{children:"ship_id"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"make_player_ship_transparent",children:(0,t.jsx)(n.code,{children:"make_player_ship_transparent()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.make_player_ship_transparent(\n ship_id: EntityId,\n transparency_duration: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the player ship transparent for ",(0,t.jsx)(n.code,{children:"transparency_duration"})," game ticks."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"set_player_ship_speed",children:(0,t.jsx)(n.code,{children:"set_player_ship_speed()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.set_player_ship_speed(\n ship_id: EntityId,\n factor: FixedPoint,\n offset: FixedPoint,\n duration: int\n): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets and returns the ",(0,t.jsx)(n.strong,{children:"effective speed"})," of the specified player ship as a function of the ",(0,t.jsx)(n.strong,{children:"base speed"})," of the ship. By default, a player ship moves according to its base speed, which is 10 distance units per tick (in the future, different ships may have different base speeds).\nAssuming the base speed of the ship is S, the new effective speed will be ",(0,t.jsx)(n.code,{children:"(factor*S)+offset"}),". ",(0,t.jsx)(n.code,{children:"duration"})," is the number of ticks during which the effective speed will be applied. Afterwards, the ship's speed reverts to its base speed. If ",(0,t.jsx)(n.code,{children:"duration"})," is negative, the effective speed never reverts to the base speed."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_all_entities",children:(0,t.jsx)(n.code,{children:"get_all_entities()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_all_entities(): List\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the list of the entityIDs of all the entities currently in the level. This includes the various bullets and ",(0,t.jsx)(n.em,{children:"all"})," the custom entities."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local entities = pewpew.get_all_entities()\npewpew.print("There are " .. #entities .. " entities in the level")\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_entities_colliding_with_disk",children:(0,t.jsx)(n.code,{children:"get_entities_colliding_with_disk()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_entities_colliding_with_disk(\n center_x: FixedPoint,\n center_y: FixedPoint,\n radius: FixedPoint\n): List\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the list of collidable entities (which includes all enemies) that overlap with the given disk."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local entities = pewpew.get_entities_colliding_with_disk(100fx, 100fx, 30fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_entity_count",children:(0,t.jsx)(n.code,{children:"get_entity_count()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_entity_count(type: int): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the number of entities of type ",(0,t.jsx)(n.code,{children:"type"})," that are alive."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local number_of_bafs = pewpew.get_entity_count(pewpew.EntityType.BAF)\nlocal number_of_asteroids = pewpew.get_entity_count(pewpew.EntityType.ASTEROID)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"get_entity_type",children:(0,t.jsx)(n.code,{children:"get_entity_type()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.get_entity_type(entity_id: EntityId): int\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the type of the given entity."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local type = pewpew.get_entity_type(id)\nif type == pewpew.EntityType.BAF then\n pewpew.print("the entity is a BAF")\nend\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"play_ambient_sound",children:(0,t.jsx)(n.code,{children:"play_ambient_sound()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.play_ambient_sound(\n sound_path: string,\n index: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Plays the sound described at ",(0,t.jsx)(n.code,{children:"sound_path"})," at the index ",(0,t.jsx)(n.code,{children:"index"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.play_ambient_sound("/dynamic/my_custom_sound.lua", 0)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"play_sound",children:(0,t.jsx)(n.code,{children:"play_sound()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.play_sound(\n sound_path: string,\n index: int,\n x: FixedPoint,\n y: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Plays the sound described at ",(0,t.jsx)(n.code,{children:"sound_path"})," at the in-game location of ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.play_sound("/dynamic/my_custom_sound.lua", 0, 100fx, 100fx)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"create_explosion",children:(0,t.jsx)(n.code,{children:"create_explosion()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.create_explosion(\n x: FixedPoint,\n y: FixedPoint,\n color: int,\n scale: FixedPoint,\n particle_count: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates an explosion of particles at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),". ",(0,t.jsx)(n.code,{children:"color"})," specifies the color of the explosion. ",(0,t.jsx)(n.code,{children:"scale"})," describes how large the explosion will be. It should be in the range ]0, 10], with 1 being an average explosion. ",(0,t.jsx)(n.code,{children:"particle_count"})," specifies the number of particles that make up the explosion. It must be in the range [1, 100]."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.create_explosion(200fx, 100fx, 0xffffffff, 1fx, 20) -- medium explosion\npewpew.create_explosion(300fx, 100fx, 0xffffffff, 3fx, 50) -- large red explosion\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_asteroid",children:(0,t.jsx)(n.code,{children:"new_asteroid()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_asteroid(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Asteroid at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_asteroid_with_size",children:(0,t.jsx)(n.code,{children:"new_asteroid_with_size()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_asteroid_with_size(\n x: FixedPoint,\n y: FixedPoint,\n size: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Asteroid at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," with an AsteroidSize given by ",(0,t.jsx)(n.code,{children:"size"})," and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_baf",children:(0,t.jsx)(n.code,{children:"new_baf()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_baf(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint,\n lifetime: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new BAF at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. ",(0,t.jsx)(n.code,{children:"angle"})," specifies the angle at which the BAF will move. ",(0,t.jsx)(n.code,{children:"speed"})," specifies the maximum speed it will reach. ",(0,t.jsx)(n.code,{children:"lifetime"})," indicates the number of game ticks after which the BAF is destroyed the next time it hits a wall. Specify a negative ",(0,t.jsx)(n.code,{children:"lifetime"})," to create a BAF that lives forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_baf_red",children:(0,t.jsx)(n.code,{children:"new_baf_red()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_baf_red(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint,\n lifetime: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new red BAF at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. A red BAF has more health points than a regular BAF. ",(0,t.jsx)(n.code,{children:"angle"})," specifies the angle at which the BAF will move. ",(0,t.jsx)(n.code,{children:"speed"})," specifies the maximum speed it will reach. ",(0,t.jsx)(n.code,{children:"lifetime"})," indicates the number of game ticks after which the BAF is destroyed the next time it hits a wall. Specify a negative ",(0,t.jsx)(n.code,{children:"lifetime"})," to create a BAF that lives forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_baf_blue",children:(0,t.jsx)(n.code,{children:"new_baf_blue()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_baf_blue(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint,\n lifetime: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new blue BAF at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. A blue BAF bounces on walls with a slightly randomized angle. ",(0,t.jsx)(n.code,{children:"angle"})," specifies the angle at which the BAF will move. ",(0,t.jsx)(n.code,{children:"speed"})," specifies the maximum speed it will reach. ",(0,t.jsx)(n.code,{children:"lifetime"})," indicates the number of game ticks after which the BAF is destroyed the next time it hits a wall. Specify a negative ",(0,t.jsx)(n.code,{children:"lifetime"})," to create a BAF that lives forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_bomb",children:(0,t.jsx)(n.code,{children:"new_bomb()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_bomb(\n x: FixedPoint,\n y: FixedPoint,\n type: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Bomb at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.new_bomb(10fx, 10fx, pewpew.BombType.SMALL_ATOMIZE)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_bonus",children:(0,t.jsx)(n.code,{children:"new_bonus()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_bonus(\n x: FixedPoint,\n y: FixedPoint,\n type: int,\n config: table {\n box_duration: int,\n cannon: int,\n frequency: int,\n weapon_duration: int,\n number_of_shields: int,\n speed_factor: FixedPoint,\n speed_offset: FixedPoint,\n speed_duration: int,\n taken_callback: function\n }\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Bonus at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," of the type ",(0,t.jsx)(n.code,{children:"type"}),", and returns its entityId.\nFor shield bonuses, the option ",(0,t.jsx)(n.code,{children:"number_of_shields"})," determines how many shields are given out.\nFor weapon bonuses, the options ",(0,t.jsx)(n.code,{children:"cannon"}),", ",(0,t.jsx)(n.code,{children:"frequency"}),", ",(0,t.jsx)(n.code,{children:"weapon_duration"})," have the same meaning as in ",(0,t.jsx)(n.code,{children:"pewpew.configure_player_ship_weapon"}),".\nFor speed bonuses, the options ",(0,t.jsx)(n.code,{children:"speed_factor"}),", ",(0,t.jsx)(n.code,{children:"speed_offset"}),",and ",(0,t.jsx)(n.code,{children:"speed_duration"})," have the same meaning as in ",(0,t.jsx)(n.code,{children:"set_player_speed"}),". ",(0,t.jsx)(n.code,{children:"taken_callback"})," is called when the bonus is taken, and is mandatory for the reinstantiation bonus. The callback receives as arguments the entity id of the bonus, the player id, and the ship's entity id.\nThe default box duration is 400 ticks."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.new_bonus(10fx, 10fx, pewpew.BonusType.WEAPON, {cannon = pewpew.CannonType.TIC_TOC, frequency = pewpew.CannonFrequency.FREQ_5, weapon_duration = 100})\npewpew.new_bonus(10fx, 10fx, pewpew.BonusType.SHIELD, {number_of_shields = 3})\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_crowder",children:(0,t.jsx)(n.code,{children:"new_crowder()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_crowder(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Crowder at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_floating_message",children:(0,t.jsx)(n.code,{children:"new_floating_message()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_floating_message(\n x: FixedPoint,\n y: FixedPoint,\n str: string,\n config: table {\n scale: FixedPoint,\n ticks_before_fade: int,\n is_optional: bool\n }\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new floating message at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", with ",(0,t.jsx)(n.code,{children:"str"})," as the message. The scale is a number that determines how large the message will be. ",(0,t.jsx)(n.code,{children:"1"})," is the default scale. ",(0,t.jsx)(n.code,{children:"ticks_before_fade"})," determines how many ticks occur before the message starts to fade out. ",(0,t.jsx)(n.code,{children:"is_optional"})," can be used to tell the game if the message can be hidden depending on the user's UI settings.\nIf not specified, ",(0,t.jsx)(n.code,{children:"scale"})," is 1, ",(0,t.jsx)(n.code,{children:"ticks_before_fade"})," is 30 and ",(0,t.jsx)(n.code,{children:"is_optional"})," is ",(0,t.jsx)(n.code,{children:"false"}),".\nReturns the floating message's entityId."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'pewpew.new_floating_message(10fx, 10fx, "hello", {scale = 2fx, ticks_before_fade = 60, is_optional = true})\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_customizable_entity",children:(0,t.jsx)(n.code,{children:"new_customizable_entity()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_customizable_entity(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new customizable entity at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_inertiac",children:(0,t.jsx)(n.code,{children:"new_inertiac()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_inertiac(\n x: FixedPoint,\n y: FixedPoint,\n acceleration: FixedPoint,\n angle: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Inertiac at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId. The inertiac will accelerate according to ",(0,t.jsx)(n.code,{children:"acceleration"}),". It spawns with a random velocity in a direction specified by ",(0,t.jsx)(n.code,{children:"angle"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_mothership",children:(0,t.jsx)(n.code,{children:"new_mothership()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_mothership(\n x: FixedPoint,\n y: FixedPoint,\n type: int,\n angle: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Mothership at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"pewpew.new_mothership(50fx, 50fx, pewpew.MothershipType.THREE_CORNERS, fmath.tau() / 4fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_pointonium",children:(0,t.jsx)(n.code,{children:"new_pointonium()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_pointonium(\n x: FixedPoint,\n y: FixedPoint,\n value: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Pointonium at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),". Value must be 64, 128, or 256."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_player_ship",children:(0,t.jsx)(n.code,{children:"new_player_ship()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_player_ship(\n x: FixedPoint,\n y: FixedPoint,\n player_index: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Player Ship at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," for the player identified by ",(0,t.jsx)(n.code,{children:"player_index"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_player_bullet",children:(0,t.jsx)(n.code,{children:"new_player_bullet()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_player_bullet(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n player_index: int\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new bullet at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," with the angle ",(0,t.jsx)(n.code,{children:"angle"})," belonging to the player at the index ",(0,t.jsx)(n.code,{children:"player_index"}),". Returns the entityId of the bullet."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_rolling_cube",children:(0,t.jsx)(n.code,{children:"new_rolling_cube()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_rolling_cube(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Rolling Cube at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_rolling_sphere",children:(0,t.jsx)(n.code,{children:"new_rolling_sphere()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_rolling_sphere(\n x: FixedPoint,\n y: FixedPoint,\n angle: FixedPoint,\n speed: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Rolling Sphere at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_wary",children:(0,t.jsx)(n.code,{children:"new_wary()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_wary(\n x: FixedPoint,\n y: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new Wary at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"new_ufo",children:(0,t.jsx)(n.code,{children:"new_ufo()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.new_ufo(\n x: FixedPoint,\n y: FixedPoint,\n dx: FixedPoint\n): EntityId\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a new UFO at the location ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})," moving horizontally at the speed of ",(0,t.jsx)(n.code,{children:"dx"}),", and returns its entityId."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"rolling_cube_set_enable_collisions_with_walls",children:(0,t.jsx)(n.code,{children:"rolling_cube_set_enable_collisions_with_walls()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.rolling_cube_set_enable_collisions_with_walls(\n entity_id: EntityId,\n collide_with_walls: bool\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets whether the rolling cube identified with ",(0,t.jsx)(n.code,{children:"id"})," collides with walls. By default it does not."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local x,y = pewpew.rolling_cube_set_enable_collisions_with_walls(id, true)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"ufo_set_enable_collisions_with_walls",children:(0,t.jsx)(n.code,{children:"ufo_set_enable_collisions_with_walls()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.ufo_set_enable_collisions_with_walls(\n entity_id: EntityId,\n collide_with_walls: bool\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets whether the ufo identified with ",(0,t.jsx)(n.code,{children:"id"})," collides with walls. By default it does not."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local x,y = pewpew.ufo_set_enable_collisions_with_walls(id, true)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_get_position",children:(0,t.jsx)(n.code,{children:"entity_get_position()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_get_position(entity_id: EntityId): FixedPoint, FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the position of the entity identified by ",(0,t.jsx)(n.code,{children:"id"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local x,y = pewpew.entity_get_position(entity_id)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_get_is_alive",children:(0,t.jsx)(n.code,{children:"entity_get_is_alive()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_get_is_alive(entity_id: EntityId): bool\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns whether the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," is alive or not."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_get_is_started_to_be_destroyed",children:(0,t.jsx)(n.code,{children:"entity_get_is_started_to_be_destroyed()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_get_is_started_to_be_destroyed(entity_id: EntityId): bool\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns whether the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," is in the process of being destroyed. Returns false if the entity does not exist."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_set_position",children:(0,t.jsx)(n.code,{children:"entity_set_position()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_set_position(\n entity_id: EntityId,\n x: FixedPoint,\n y: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the position of the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," to ",(0,t.jsx)(n.code,{children:"x"}),",",(0,t.jsx)(n.code,{children:"y"})]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_set_radius",children:(0,t.jsx)(n.code,{children:"entity_set_radius()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_set_radius(\n entity_id: EntityId,\n radius: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the radius of the entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". To give you a sense of scale, motherships have a radius of 28fx."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_set_update_callback",children:(0,t.jsx)(n.code,{children:"entity_set_update_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_set_update_callback(\n entity_id: EntityId,\n callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets a callback that will be called at every tick as long as the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," is alive. Remove the callback by passing a nil ",(0,t.jsx)(n.code,{children:"callback"}),". The callbacks gets called with the entity ID."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"local function my_update_callback(entity_id)\n local x,y = pewpew.entity_get_position(entity_id)\n pewpew.entity_set_position(entity_id, x + 2fx, y) -- move the entity to the right\nend\npewpew.entity_set_update_callback(entity_id, my_update_callback)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_destroy",children:(0,t.jsx)(n.code,{children:"entity_destroy()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_destroy(entity_id: EntityId)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," immediately disappear forever."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"entity_react_to_weapon",children:(0,t.jsx)(n.code,{children:"entity_react_to_weapon()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.entity_react_to_weapon(\n entity_id: EntityId,\n weapon: table {\n type: int,\n x: FixedPoint,\n y: FixedPoint,\n player_index: int\n }\n): bool\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the entity identified by ",(0,t.jsx)(n.code,{children:"id"})," react to the weapon described in ",(0,t.jsx)(n.code,{children:"weapon_description"}),". Returns whether the entity reacted to the weapon. The returned value is typically used to decide whether the weapon should continue to exist or not. In the case of an explosion, ",(0,t.jsx)(n.code,{children:"x"})," and ",(0,t.jsx)(n.code,{children:"y"})," should store the origin of the explosion. In the case of a bullet, ",(0,t.jsx)(n.code,{children:"x"})," and ",(0,t.jsx)(n.code,{children:"y"})," should store the vector of the bullet. The player identified by ",(0,t.jsx)(n.code,{children:"player_index"})," will be assigned points. If ",(0,t.jsx)(n.code,{children:"player_index"})," is invalid, no player will be assigned points."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_position_interpolation",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_position_interpolation()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_position_interpolation(\n entity_id: EntityId,\n enable: bool\n)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Sets whether the position of the mesh wil be interpolated when rendering. In general, this should be set to true if the entity will be moving smoothly."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh(\n entity_id: EntityId,\n file_path: string,\n index: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," to the mesh described in the file ",(0,t.jsx)(n.code,{children:"file_path"})," at the index ",(0,t.jsx)(n.code,{children:"index"}),". ",(0,t.jsx)(n.code,{children:"index"})," starts at 0. If ",(0,t.jsx)(n.code,{children:"file_path"})," is an empty string, the mesh is removed."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local id = pewpew.new_customizable_entity(0fx, 0fx)\npewpew.customizable_entity_set_mesh(id, "/dynamic/graphics.lua", 0)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_flipping_meshes",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_flipping_meshes()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_flipping_meshes(\n entity_id: EntityId,\n file_path: string,\n index_0: int,\n index_1: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Similar to ",(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh"}),", but sets two meshes that will be used in alternation. By specifying 2 separate meshes, 60 fps animations can be achieved."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local id = pewpew.new_customizable_entity(0fx, 0fx)\npewpew.customizable_entity_set_flipping_meshes(id, "/dynamic/graphics.lua", 0, 1)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_color",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_color()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_color(\n entity_id: EntityId,\n color: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the color multiplier for the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_string",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_string()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_string(\n entity_id: EntityId,\n text: string\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the string to be displayed as part of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_xyz",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_xyz()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_xyz(\n entity_id: EntityId,\n x: FixedPoint,\n y: FixedPoint,\n z: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the position of the mesh to x,y,z, relative to the center ofthe customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_z",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_z()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_z(\n entity_id: EntityId,\n z: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the height of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". A ",(0,t.jsx)(n.code,{children:"z"})," greater to 0 makes the mesh be closer, while a ",(0,t.jsx)(n.code,{children:"z"})," less than 0 makes the mesh be further away."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_scale",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_scale()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_scale(\n entity_id: EntityId,\n scale: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the scale of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". A ",(0,t.jsx)(n.code,{children:"scale"})," less than 1 makes the mesh appear smaller, while a ",(0,t.jsx)(n.code,{children:"scale"})," greater than 1 makes the mesh appear larger."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_xyz_scale",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_xyz_scale()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_xyz_scale(\n entity_id: EntityId,\n x_scale: FixedPoint,\n y_scale: FixedPoint,\n z_scale: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the scale of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," along the x,y,z axis. A ",(0,t.jsx)(n.code,{children:"scale"})," less than 1 makes the mesh appear smaller, while a ",(0,t.jsx)(n.code,{children:"scale"})," greater than 1 makes the mesh appear larger."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_mesh_angle",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_mesh_angle()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_mesh_angle(\n entity_id: EntityId,\n angle: FixedPoint,\n x_axis: FixedPoint,\n y_axis: FixedPoint,\n z_axis: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the rotation angle of the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". The rotation is applied along the axis defined by ",(0,t.jsx)(n.code,{children:"x_axis"}),",",(0,t.jsx)(n.code,{children:"y_axis"}),",",(0,t.jsx)(n.code,{children:"z_axis"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"-- Rotate the entity by 45 degrees along the z_axis\npewpew.customizable_entity_set_mesh_angle(entity_id, fmath.tau() / 8fx, 0fx, 0fx, 1fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_skip_mesh_attributes_interpolation",children:(0,t.jsx)(n.code,{children:"customizable_entity_skip_mesh_attributes_interpolation()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_skip_mesh_attributes_interpolation(entity_id: EntityId)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Skips the interpolation of the mesh's attributes (x, y, z, scale_x, scale_y, scale_z, rotation)."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_configure_music_response",children:(0,t.jsx)(n.code,{children:"customizable_entity_configure_music_response()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_configure_music_response(\n entity_id: EntityId,\n config: table {\n color_start: int,\n color_end: int,\n scale_x_start: FixedPoint,\n scale_x_end: FixedPoint,\n scale_y_start: FixedPoint,\n scale_y_end: FixedPoint,\n scale_z_start: FixedPoint,\n scale_z_end: FixedPoint\n }\n)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Configures the way the entity is going to respond to the music."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:" -- Makes the entity larger\n pewpew.customizable_entity_configure_music_response(entity_id, {scale_x_start = 1fx, scale_x_end = 2fx})\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_add_rotation_to_mesh",children:(0,t.jsx)(n.code,{children:"customizable_entity_add_rotation_to_mesh()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_add_rotation_to_mesh(\n entity_id: EntityId,\n angle: FixedPoint,\n x_axis: FixedPoint,\n y_axis: FixedPoint,\n z_axis: FixedPoint\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Adds a rotation to the mesh of the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"}),". The rotation is applied along the axis defined by ",(0,t.jsx)(n.code,{children:"x_axis"}),",",(0,t.jsx)(n.code,{children:"y_axis"}),",",(0,t.jsx)(n.code,{children:"z_axis"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:"-- Rotate the entity by 45 degrees along the z_axis\npewpew.customizable_entity_add_rotation_to_mesh(entity_id, fmath.tau() / 8fx, 0fx, 0fx, 1fx)\n"})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_visibility_radius",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_visibility_radius()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_visibility_radius(\n entity_id: EntityId,\n radius: FixedPoint\n)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Sets the radius defining the visibility of the entity. This allows the game to know when an entity is actually visible, which in turns allows to massively optimize the rendering. Use the smallest value possible. If not set, the rendering radius is an unspecified large number that effectively makes the entity always be rendered, even if not visible."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_configure_wall_collision",children:(0,t.jsx)(n.code,{children:"customizable_entity_configure_wall_collision()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_configure_wall_collision(\n entity_id: EntityId,\n collide_with_walls: bool,\n collision_callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"collide_with_walls"})," configures whether the entity should stop when colliding with walls. If ",(0,t.jsx)(n.code,{children:"collision_callback"})," is not nil, it is called anytime a collision is detected. The callback gets called with the entity id of the entity withthe callback, and with the normal to the wall."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'function my_wall_collision_callback(entity_id, wall_normal_x, wall_normal_y)\n pewpew.print("A wall collision happened with entity " .. entity_id)\nend\nlocal id = pewpew.new_customizable_entity(100fx, 100fx)\npewpew.customizable_entity_configure_wall_collision(id, my_wall_collision_callback)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_player_collision_callback",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_player_collision_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_player_collision_callback(\n entity_id: EntityId,\n collision_callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the callback for when the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," collides with a player's ship. The callback gets called with the entity id of the entity with the callback, and the player_index and ship_id that were involved in the collision. Don't forget to set a radius on the customizable entity, otherwise no collisions will be detected."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'function my_collision_callback(entity_id, player_index, ship_entity_id)\n pewpew.print("The entity: " .. entity_id)\n pewpew.print("Collided with the ship: " .. ship_entity_id)\n pewpew.print("That belongs to the player: " .. player_index)\nend\nlocal id = pewpew.new_customizable_entity(100fx, 100fx)\npewpew.customizable_entity_set_player_collision_callback(id, my_collision_callback)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_set_weapon_collision_callback",children:(0,t.jsx)(n.code,{children:"customizable_entity_set_weapon_collision_callback()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_set_weapon_collision_callback(\n entity_id: EntityId,\n weapon_collision_callback: function\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Sets the callback for when the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," collides with a player's weapon. The callback gets called with the entity_id of the entity on which the callback is set, the player_index of the player that triggered the weapon, and the type of the weapon. The callback ",(0,t.jsx)(n.em,{children:"must"})," return a boolean saying whether the entity reacts to the weapon. In the case of a bullet, this boolean determines whether the bullet should be destroyed."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-lua",children:'local id = pewpew.new_customizable_entity(100fx, 100fx)\npewpew.customizable_entity_set_weapon_collision_callback(id, function(entity_id, player_index, weapon_type)\n pewpew.print("Collided with weapon from player: " .. player_index)\n if weapon_type == pewpew.WeaponType.BULLET then\n pewpew.print("Collided with bullet!")\n end\n return true\nend)\n'})}),"\n"]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_start_spawning",children:(0,t.jsx)(n.code,{children:"customizable_entity_start_spawning()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_start_spawning(\n entity_id: EntityId,\n spawning_duration: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," spawn for a duration of ",(0,t.jsx)(n.code,{children:"spawning_duration"})," game ticks."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"customizable_entity_start_exploding",children:(0,t.jsx)(n.code,{children:"customizable_entity_start_exploding()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"pewpew.customizable_entity_start_exploding(\n entity_id: EntityId,\n explosion_duration: int\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Makes the customizable entity identified by ",(0,t.jsx)(n.code,{children:"id"})," explode for a duration of ",(0,t.jsx)(n.code,{children:"explosion_duration"})," game ticks. After the explosion, the entity is destroyed. ",(0,t.jsx)(n.code,{children:"explosion_duration"})," must be less than 255. Any scale applied to the entity is also applied to the explosion."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(r,{...e})}):r(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>c});var t=i(6540);const s={},l=t.createContext(s);function d(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46e25335.77249d93.js b/assets/js/46e25335.77249d93.js deleted file mode 100644 index e6eb0ef..0000000 --- a/assets/js/46e25335.77249d93.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[9612],{4212:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var s=i(4848),t=i(8453);const o={sidebar_position:1},r="Manifest files",l={id:"File Information/manifest-files",title:"Manifest files",description:"Manifests are written in JSON.",source:"@site/docs/File Information/manifest-files.md",sourceDirName:"File Information",slug:"/File Information/manifest-files",permalink:"/ppl-docs/docs/File Information/manifest-files",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/File Information/manifest-files.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Standard libraries",permalink:"/ppl-docs/docs/APIs/standard-libraries"},next:{title:"Mesh files",permalink:"/ppl-docs/docs/File Information/mesh-files"}},a={},d=[{value:"Manifest fields",id:"manifest-fields",level:2}];function c(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"manifest-files",children:"Manifest files"}),"\n",(0,s.jsx)(n.p,{children:"Manifests are written in JSON.\nExample of a manifest file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:'title="manifest.json"',children:'{\n "name": "The name of the level",\n "descriptions": ["A short description for your level."],\n "information": "Information regarding your level. Up to 350 characters long. Can include #ff0000ffcolor!",\n "entry_point": "level.lua",\n "has_score_leaderboard": true,\n "rank_thresholds_1p": { "bronze": 1000, "silver": 2000, "gold": 3000 }\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"manifest-fields",children:"Manifest fields"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"name"})," is the name of the level. Keep it short (30 char max)."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"descriptions"})," is an array of strings. You can put multiple descriptions, but for now only the first string is displayed anywhere."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"information"})," is an optional string that can be 350 characters long that should contain information relevant to the level."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"entry_point"})," contains the path to the main entry point of the level."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"entry_point"})," must be ",(0,s.jsx)(n.code,{children:"level.lua"}),"."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"has_score_leaderboard"})," is a boolean that specifies whether the level should have a score leaderboard."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"rank_thresholds_1p"})," contains the requirements for the players to unlock bronze, silver, and gold stars. You must not include this field if ",(0,s.jsx)(n.code,{children:"has_score_leaderboard"})," is false. If all the thresholds are 0, then the level will not give out stars."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var s=i(6540);const t={},o=s.createContext(t);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46e25335.e9c2ac2b.js b/assets/js/46e25335.e9c2ac2b.js new file mode 100644 index 0000000..e66ac90 --- /dev/null +++ b/assets/js/46e25335.e9c2ac2b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[9612],{4212:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var s=i(4848),t=i(8453);const r={sidebar_position:1},o="Manifest files",l={id:"File Information/manifest-files",title:"Manifest files",description:"Manifests are mandatory files for every submited levels.",source:"@site/docs/File Information/manifest-files.md",sourceDirName:"File Information",slug:"/File Information/manifest-files",permalink:"/ppl-docs/docs/File Information/manifest-files",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/File Information/manifest-files.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Standard libraries",permalink:"/ppl-docs/docs/APIs/standard-libraries"},next:{title:"Mesh files",permalink:"/ppl-docs/docs/File Information/mesh-files"}},a={},d=[{value:"Fields descriptions",id:"fields-descriptions",level:2}];function c(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"manifest-files",children:"Manifest files"}),"\n",(0,s.jsx)(n.p,{children:"Manifests are mandatory files for every submited levels."}),"\n",(0,s.jsx)(n.p,{children:"They describe the content of the level, and are written in JSON."}),"\n",(0,s.jsx)(n.p,{children:"Example of a manifest file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:'title="manifest.json"',children:'{\n "name": "The name of the level",\n "descriptions": ["A short description for your level."],\n "information": "Information regarding your level. Up to 350 characters long. Can include #ff0000ffcolor!",\n "entry_point": "level.lua",\n "has_score_leaderboard": true,\n "rank_thresholds_1p": { "bronze": 1000, "silver": 2000, "gold": 3000 }\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"fields-descriptions",children:"Fields descriptions"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"name"})," is the name of the level. Keep it short (30 char max)."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"descriptions"})," is an array of strings. You can put multiple descriptions, but for now only the first string is displayed."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"information"})," is an optional string that can be 350 characters long that should contain information relevant to the level."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"entry_point"})," contains the path to the main entry point of the level."]}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"warning",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"entry_point"})," must be ",(0,s.jsx)(n.code,{children:"level.lua"}),"."]}),(0,s.jsx)(n.p,{children:"In the future other entry points may be supported."})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"has_score_leaderboard"})," is a boolean that specifies whether the level should have a score leaderboard."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"rank_thresholds_1p"})," contains the requirements for the players to unlock bronze, silver, and gold stars. You must not include this field if ",(0,s.jsx)(n.code,{children:"has_score_leaderboard"})," is false. If all the thresholds are 0, then the level will not give out stars."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/66e67a33.e81f603d.js b/assets/js/66e67a33.e81f603d.js deleted file mode 100644 index d3e1fc4..0000000 --- a/assets/js/66e67a33.e81f603d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[4592],{5833:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var i=n(4848),r=n(8453);const s={sidebar_position:2},o="Level restrictions",l={id:"Other/level-restrictions",title:"Level restrictions",description:"Entity count",source:"@site/docs/Other/level-restrictions.md",sourceDirName:"Other",slug:"/Other/level-restrictions",permalink:"/ppl-docs/docs/Other/level-restrictions",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/Other/level-restrictions.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Design principles",permalink:"/ppl-docs/docs/Other/level-design-principles"},next:{title:"Trivia",permalink:"/ppl-docs/docs/Other/trivia"}},a={},c=[{value:"Entity count",id:"entity-count",level:2},{value:"Duration",id:"duration",level:2},{value:"Memory usage",id:"memory-usage",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"level-restrictions",children:"Level restrictions"}),"\n",(0,i.jsx)(t.h2,{id:"entity-count",children:"Entity count"}),"\n",(0,i.jsx)(t.p,{children:"At most 1300 entities can exist at any given moment. This includes the player's bullet. If there are already 1300 entities, no more entities will be created. This means that the player won't be able to shoot."}),"\n",(0,i.jsx)(t.h2,{id:"duration",children:"Duration"}),"\n",(0,i.jsxs)(t.p,{children:["A game lasts at most 1 hour. If the level has not called ",(0,i.jsx)(t.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_pewpew_lib#void-stop_game",children:(0,i.jsx)(t.code,{children:"stop_game"})})," by then, it will be called automatically.\nThe reason for this limitation is that replays then become too large."]}),"\n",(0,i.jsx)(t.h2,{id:"memory-usage",children:"Memory usage"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"The Lua interpreter can't use more than 500KB of memory when running a level. Unless you have a memory leak in your level, this shouldn't be a problem."}),"\n",(0,i.jsx)(t.li,{children:"The Lua interpreter can't use more than 3MB of memory when loading a mesh. You will need to split a mesh into multiple files if you are hitting this limit."}),"\n",(0,i.jsx)(t.li,{children:"The Lua interpreter can't use more than 3MB of memory when loading sounds. Unless you are doing something really crazy, this will never be a problem."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var i=n(6540);const r={},s=i.createContext(r);function o(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/91cb3e84.5acf482c.js b/assets/js/91cb3e84.5acf482c.js deleted file mode 100644 index 418901c..0000000 --- a/assets/js/91cb3e84.5acf482c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[298],{7962:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>x,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var t=i(4848),d=i(8453);const s={sidebar_position:3},r="fmath library",a={id:"APIs/Fmath",title:"Fmath",description:"fmath contains a set of mathematical functions that work with FixedPoint numbers and integers. fmath replaces Lua's math library in game scripts (you can use Lua's math library outside of game scripts).",source:"@site/docs/APIs/Fmath.md",sourceDirName:"APIs",slug:"/APIs/Fmath",permalink:"/ppl-docs/docs/APIs/Fmath",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/Fmath.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"PewPew",permalink:"/ppl-docs/docs/APIs/PewPew"},next:{title:"Standard libraries",permalink:"/ppl-docs/docs/APIs/standard-libraries"}},o={},c=[{value:"Functions",id:"functions",level:2},{value:"max_fixedpoint()",id:"max_fixedpoint",level:3},{value:"random_fixedpoint()",id:"random_fixedpoint",level:3},{value:"random_int()",id:"random_int",level:3},{value:"sqrt()",id:"sqrt",level:3},{value:"from_fraction()",id:"from_fraction",level:3},{value:"to_int()",id:"to_int",level:3},{value:"abs_fixedpoint()",id:"abs_fixedpoint",level:3},{value:"to_fixedpoint()",id:"to_fixedpoint",level:3},{value:"sincos()",id:"sincos",level:3},{value:"atan2()",id:"atan2",level:3},{value:"tau()",id:"tau",level:3}];function l(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fmath-library",children:"fmath library"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"fmath"})," contains a set of mathematical functions that work with FixedPoint numbers and integers. ",(0,t.jsx)(n.code,{children:"fmath"})," replaces Lua's ",(0,t.jsx)(n.code,{children:"math"})," library in game scripts (you can use Lua's ",(0,t.jsx)(n.code,{children:"math"})," library outside of game scripts)."]}),"\n",(0,t.jsx)(n.h2,{id:"functions",children:"Functions"}),"\n",(0,t.jsx)(n.h3,{id:"max_fixedpoint",children:(0,t.jsx)(n.code,{children:"max_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.max_fixedpoint(): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the maximum value a fixedpoint integer can take."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"random_fixedpoint",children:(0,t.jsx)(n.code,{children:"random_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.random_fixedpoint(\n min: FixedPoint,\n max: FixedPoint\n): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns a random fixedpoint value in the range [",(0,t.jsx)(n.code,{children:"min"}),", ",(0,t.jsx)(n.code,{children:"max"}),"]. ",(0,t.jsx)(n.code,{children:"max"})," must be greater or equal to ",(0,t.jsx)(n.code,{children:"min"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"random_int",children:(0,t.jsx)(n.code,{children:"random_int()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.random_int(\n min: int,\n max: int\n): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns an integer in the range [",(0,t.jsx)(n.code,{children:"min"}),", ",(0,t.jsx)(n.code,{children:"max"}),"]. ",(0,t.jsx)(n.code,{children:"max"})," must be greater or equal to ",(0,t.jsx)(n.code,{children:"min"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"sqrt",children:(0,t.jsx)(n.code,{children:"sqrt()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.sqrt(x: FixedPoint): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the square root of ",(0,t.jsx)(n.code,{children:"x"}),". ",(0,t.jsx)(n.code,{children:"x"})," must be greater or equal to 0."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"from_fraction",children:(0,t.jsx)(n.code,{children:"from_fraction()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.from_fraction(\n numerator: int,\n denominator: int\n): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the fixedpoint value representing the fraction ",(0,t.jsx)(n.code,{children:"numerator"}),"/",(0,t.jsx)(n.code,{children:"denominator"}),". ",(0,t.jsx)(n.code,{children:"denominator"})," must not be equal to zero."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"to_int",children:(0,t.jsx)(n.code,{children:"to_int()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.to_int(value: FixedPoint): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the integral part of the ",(0,t.jsx)(n.code,{children:"value"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"abs_fixedpoint",children:(0,t.jsx)(n.code,{children:"abs_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.abs_fixedpoint(value: FixedPoint): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the absolute value."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"to_fixedpoint",children:(0,t.jsx)(n.code,{children:"to_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.to_fixedpoint(value: int): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns a fixedpoint value with the integral part of ",(0,t.jsx)(n.code,{children:"value"}),", and no fractional part."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"sincos",children:(0,t.jsx)(n.code,{children:"sincos()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.sincos(angle: FixedPoint): FixedPoint, FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the sinus and cosinus of ",(0,t.jsx)(n.code,{children:"angle"}),". ",(0,t.jsx)(n.code,{children:"angle"})," is in radian."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"atan2",children:(0,t.jsx)(n.code,{children:"atan2()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.atan2(\n y: FixedPoint,\n x: FixedPoint\n): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the principal value of the arc tangent of y/x. Returns a value in the range [0, 2\u03c0[."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"tau",children:(0,t.jsx)(n.code,{children:"tau()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.tau(): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns \u03c4 (aka 2\u03c0)."})]})}function x(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var t=i(6540);const d={},s=t.createContext(d);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/91cb3e84.c31fc1c9.js b/assets/js/91cb3e84.c31fc1c9.js new file mode 100644 index 0000000..bcdc402 --- /dev/null +++ b/assets/js/91cb3e84.c31fc1c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[298],{7962:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>x,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var t=i(4848),d=i(8453);const s={sidebar_position:3},r="fmath library",a={id:"APIs/Fmath",title:"fmath library",description:"fmath contains a set of mathematical functions that work with FixedPoint numbers and integers. fmath replaces Lua's math library in game scripts (you can use Lua's math library outside of game scripts).",source:"@site/docs/APIs/Fmath.md",sourceDirName:"APIs",slug:"/APIs/Fmath",permalink:"/ppl-docs/docs/APIs/Fmath",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/Fmath.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"pewpew library",permalink:"/ppl-docs/docs/APIs/PewPew"},next:{title:"Standard libraries",permalink:"/ppl-docs/docs/APIs/standard-libraries"}},o={},c=[{value:"Functions",id:"functions",level:2},{value:"max_fixedpoint()",id:"max_fixedpoint",level:3},{value:"random_fixedpoint()",id:"random_fixedpoint",level:3},{value:"random_int()",id:"random_int",level:3},{value:"sqrt()",id:"sqrt",level:3},{value:"from_fraction()",id:"from_fraction",level:3},{value:"to_int()",id:"to_int",level:3},{value:"abs_fixedpoint()",id:"abs_fixedpoint",level:3},{value:"to_fixedpoint()",id:"to_fixedpoint",level:3},{value:"sincos()",id:"sincos",level:3},{value:"atan2()",id:"atan2",level:3},{value:"tau()",id:"tau",level:3}];function l(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"fmath-library",children:"fmath library"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"fmath"})," contains a set of mathematical functions that work with FixedPoint numbers and integers. ",(0,t.jsx)(n.code,{children:"fmath"})," replaces Lua's ",(0,t.jsx)(n.code,{children:"math"})," library in game scripts (you can use Lua's ",(0,t.jsx)(n.code,{children:"math"})," library outside of game scripts)."]}),"\n",(0,t.jsx)(n.h2,{id:"functions",children:"Functions"}),"\n",(0,t.jsx)(n.h3,{id:"max_fixedpoint",children:(0,t.jsx)(n.code,{children:"max_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.max_fixedpoint(): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the maximum value a fixedpoint integer can take."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"random_fixedpoint",children:(0,t.jsx)(n.code,{children:"random_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.random_fixedpoint(\n min: FixedPoint,\n max: FixedPoint\n): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns a random fixedpoint value in the range [",(0,t.jsx)(n.code,{children:"min"}),", ",(0,t.jsx)(n.code,{children:"max"}),"]. ",(0,t.jsx)(n.code,{children:"max"})," must be greater or equal to ",(0,t.jsx)(n.code,{children:"min"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"random_int",children:(0,t.jsx)(n.code,{children:"random_int()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.random_int(\n min: int,\n max: int\n): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns an integer in the range [",(0,t.jsx)(n.code,{children:"min"}),", ",(0,t.jsx)(n.code,{children:"max"}),"]. ",(0,t.jsx)(n.code,{children:"max"})," must be greater or equal to ",(0,t.jsx)(n.code,{children:"min"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"sqrt",children:(0,t.jsx)(n.code,{children:"sqrt()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.sqrt(x: FixedPoint): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the square root of ",(0,t.jsx)(n.code,{children:"x"}),". ",(0,t.jsx)(n.code,{children:"x"})," must be greater or equal to 0."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"from_fraction",children:(0,t.jsx)(n.code,{children:"from_fraction()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.from_fraction(\n numerator: int,\n denominator: int\n): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the fixedpoint value representing the fraction ",(0,t.jsx)(n.code,{children:"numerator"}),"/",(0,t.jsx)(n.code,{children:"denominator"}),". ",(0,t.jsx)(n.code,{children:"denominator"})," must not be equal to zero."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"to_int",children:(0,t.jsx)(n.code,{children:"to_int()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.to_int(value: FixedPoint): int\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the integral part of the ",(0,t.jsx)(n.code,{children:"value"}),"."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"abs_fixedpoint",children:(0,t.jsx)(n.code,{children:"abs_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.abs_fixedpoint(value: FixedPoint): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the absolute value."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"to_fixedpoint",children:(0,t.jsx)(n.code,{children:"to_fixedpoint()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.to_fixedpoint(value: int): FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns a fixedpoint value with the integral part of ",(0,t.jsx)(n.code,{children:"value"}),", and no fractional part."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"sincos",children:(0,t.jsx)(n.code,{children:"sincos()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.sincos(angle: FixedPoint): FixedPoint, FixedPoint\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Returns the sinus and cosinus of ",(0,t.jsx)(n.code,{children:"angle"}),". ",(0,t.jsx)(n.code,{children:"angle"})," is in radian."]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"atan2",children:(0,t.jsx)(n.code,{children:"atan2()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.atan2(\n y: FixedPoint,\n x: FixedPoint\n): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns the principal value of the arc tangent of y/x. Returns a value in the range [0, 2\u03c0[."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"tau",children:(0,t.jsx)(n.code,{children:"tau()"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-tsx",children:"fmath.tau(): FixedPoint\n"})}),"\n",(0,t.jsx)(n.p,{children:"Returns \u03c4 (aka 2\u03c0)."})]})}function x(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var t=i(6540);const d={},s=t.createContext(d);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.8b5c524b.js b/assets/js/935f2afb.8b5c524b.js new file mode 100644 index 0000000..ab582ba --- /dev/null +++ b/assets/js/935f2afb.8b5c524b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Home","href":"/ppl-docs/docs/home","docId":"home","unlisted":false},{"type":"category","label":"APIs","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Types","href":"/ppl-docs/docs/APIs/types","docId":"APIs/types","unlisted":false},{"type":"link","label":"pewpew library","href":"/ppl-docs/docs/APIs/PewPew","docId":"APIs/PewPew","unlisted":false},{"type":"link","label":"fmath library","href":"/ppl-docs/docs/APIs/Fmath","docId":"APIs/Fmath","unlisted":false},{"type":"link","label":"Standard libraries","href":"/ppl-docs/docs/APIs/standard-libraries","docId":"APIs/standard-libraries","unlisted":false}]},{"type":"category","label":"File Information","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Manifest files","href":"/ppl-docs/docs/File Information/manifest-files","docId":"File Information/manifest-files","unlisted":false},{"type":"link","label":"Mesh files","href":"/ppl-docs/docs/File Information/mesh-files","docId":"File Information/mesh-files","unlisted":false},{"type":"link","label":"Sound files","href":"/ppl-docs/docs/File Information/sound-files","docId":"File Information/sound-files","unlisted":false}]},{"type":"category","label":"Guides","collapsible":true,"collapsed":false,"items":[{"type":"category","label":"Lua","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Beginner Lua Tutorial","href":"/ppl-docs/docs/Guides/Lua/beginner","docId":"Guides/Lua/beginner","unlisted":false},{"type":"link","label":"Intermediate","href":"/ppl-docs/docs/Guides/Lua/intermediate","docId":"Guides/Lua/intermediate","unlisted":false},{"type":"link","label":"Advanced","href":"/ppl-docs/docs/Guides/Lua/advanced","docId":"Guides/Lua/advanced","unlisted":false}]},{"type":"category","label":"Other","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"60 FPS Animation","href":"/ppl-docs/docs/Guides/Other/fps-animation","docId":"Guides/Other/fps-animation","unlisted":false}]}]},{"type":"category","label":"Other","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Design principles","href":"/ppl-docs/docs/Other/level-design-principles","docId":"Other/level-design-principles","unlisted":false},{"type":"link","label":"Game limits","href":"/ppl-docs/docs/Other/game-limits","docId":"Other/game-limits","unlisted":false}]}]},"docs":{"APIs/Fmath":{"id":"APIs/Fmath","title":"fmath library","description":"fmath contains a set of mathematical functions that work with FixedPoint numbers and integers. fmath replaces Lua\'s math library in game scripts (you can use Lua\'s math library outside of game scripts).","sidebar":"tutorialSidebar"},"APIs/PewPew":{"id":"APIs/PewPew","title":"pewpew library","description":"The pewpew library contains all the functions for configuring levels and managing entities.","sidebar":"tutorialSidebar"},"APIs/standard-libraries":{"id":"APIs/standard-libraries","title":"Standard libraries","description":"Only a subset of the standard Lua libraries are available in PewPew Live:","sidebar":"tutorialSidebar"},"APIs/types":{"id":"APIs/types","title":"Types","description":"int","sidebar":"tutorialSidebar"},"File Information/manifest-files":{"id":"File Information/manifest-files","title":"Manifest files","description":"Manifests are mandatory files for every submited levels.","sidebar":"tutorialSidebar"},"File Information/mesh-files":{"id":"File Information/mesh-files","title":"Mesh files","description":"In PewPew Live, a mesh is a collection of lines in 3D.","sidebar":"tutorialSidebar"},"File Information/sound-files":{"id":"File Information/sound-files","title":"Sound files","description":"Example of a file that defines a single sound:","sidebar":"tutorialSidebar"},"Guides/Lua/advanced":{"id":"Guides/Lua/advanced","title":"Advanced","description":"In this tutorial, we will learn how to make more advanced levels, including meshes, custom enemies, and other cool gameplay features!","sidebar":"tutorialSidebar"},"Guides/Lua/beginner":{"id":"Guides/Lua/beginner","title":"Beginner Lua Tutorial","description":"https://onecompiler.com/lua can be used to try Lua in the browser.","sidebar":"tutorialSidebar"},"Guides/Lua/intermediate":{"id":"Guides/Lua/intermediate","title":"Intermediate","description":"If you are here, you made it through the learning process of the Lua language! Keep in mind, this section assumes that you know basic Lua. If you need to freshen up, look back onto the Beginner tutorials!","sidebar":"tutorialSidebar"},"Guides/Other/fps-animation":{"id":"Guides/Other/fps-animation","title":"60 FPS Animation","description":"Tutorial created by WinterNox.","sidebar":"tutorialSidebar"},"home":{"id":"home","title":"Home","description":"This community-maintained wiki holds the resources useful for creating custom levels for PewPew Live.","sidebar":"tutorialSidebar"},"Other/game-limits":{"id":"Other/game-limits","title":"Game limits","description":"Entity count","sidebar":"tutorialSidebar"},"Other/level-design-principles":{"id":"Other/level-design-principles","title":"Design principles","description":"General guidelines","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.917661f4.js b/assets/js/935f2afb.917661f4.js deleted file mode 100644 index 8cd1310..0000000 --- a/assets/js/935f2afb.917661f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Introduction","href":"/ppl-docs/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"APIs","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Types","href":"/ppl-docs/docs/APIs/types","docId":"APIs/types","unlisted":false},{"type":"link","label":"PewPew","href":"/ppl-docs/docs/APIs/PewPew","docId":"APIs/PewPew","unlisted":false},{"type":"link","label":"Fmath","href":"/ppl-docs/docs/APIs/Fmath","docId":"APIs/Fmath","unlisted":false},{"type":"link","label":"Standard libraries","href":"/ppl-docs/docs/APIs/standard-libraries","docId":"APIs/standard-libraries","unlisted":false}]},{"type":"category","label":"File Information","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Manifest files","href":"/ppl-docs/docs/File Information/manifest-files","docId":"File Information/manifest-files","unlisted":false},{"type":"link","label":"Mesh files","href":"/ppl-docs/docs/File Information/mesh-files","docId":"File Information/mesh-files","unlisted":false},{"type":"link","label":"Sound files","href":"/ppl-docs/docs/File Information/sound-files","docId":"File Information/sound-files","unlisted":false}]},{"type":"category","label":"Guides","collapsible":true,"collapsed":false,"items":[{"type":"category","label":"Lua","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Beginner Lua Tutorial","href":"/ppl-docs/docs/Guides/Lua/beginner","docId":"Guides/Lua/beginner","unlisted":false},{"type":"link","label":"Intermediate","href":"/ppl-docs/docs/Guides/Lua/intermediate","docId":"Guides/Lua/intermediate","unlisted":false},{"type":"link","label":"Advanced","href":"/ppl-docs/docs/Guides/Lua/advanced","docId":"Guides/Lua/advanced","unlisted":false}]},{"type":"category","label":"Other","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"60 FPS Animation","href":"/ppl-docs/docs/Guides/Other/fps-animation","docId":"Guides/Other/fps-animation","unlisted":false}]}]},{"type":"category","label":"Other","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Design principles","href":"/ppl-docs/docs/Other/level-design-principles","docId":"Other/level-design-principles","unlisted":false},{"type":"link","label":"Level restrictions","href":"/ppl-docs/docs/Other/level-restrictions","docId":"Other/level-restrictions","unlisted":false},{"type":"link","label":"Trivia","href":"/ppl-docs/docs/Other/trivia","docId":"Other/trivia","unlisted":false}]}]},"docs":{"APIs/Fmath":{"id":"APIs/Fmath","title":"Fmath","description":"fmath contains a set of mathematical functions that work with FixedPoint numbers and integers. fmath replaces Lua\'s math library in game scripts (you can use Lua\'s math library outside of game scripts).","sidebar":"tutorialSidebar"},"APIs/PewPew":{"id":"APIs/PewPew","title":"PewPew","description":"The pewpew library contains all the functions for configuring levels and managing entities.","sidebar":"tutorialSidebar"},"APIs/standard-libraries":{"id":"APIs/standard-libraries","title":"Standard libraries","description":"Only a subset of the standard Lua libraries are available in PewPew Live:","sidebar":"tutorialSidebar"},"APIs/types":{"id":"APIs/types","title":"Types","description":"int","sidebar":"tutorialSidebar"},"File Information/manifest-files":{"id":"File Information/manifest-files","title":"Manifest files","description":"Manifests are written in JSON.","sidebar":"tutorialSidebar"},"File Information/mesh-files":{"id":"File Information/mesh-files","title":"Mesh files","description":"In PewPew Live, a mesh is a collection of lines in 3D.","sidebar":"tutorialSidebar"},"File Information/sound-files":{"id":"File Information/sound-files","title":"Sound files","description":"Example of a file that defines a single sound:","sidebar":"tutorialSidebar"},"Guides/Lua/advanced":{"id":"Guides/Lua/advanced","title":"Advanced","description":"In this tutorial, we will learn how to make more advanced levels, including meshes, custom enemies, and other cool gameplay features!","sidebar":"tutorialSidebar"},"Guides/Lua/beginner":{"id":"Guides/Lua/beginner","title":"Beginner Lua Tutorial","description":"https://onecompiler.com/lua can be used to try Lua in the browser.","sidebar":"tutorialSidebar"},"Guides/Lua/intermediate":{"id":"Guides/Lua/intermediate","title":"Intermediate","description":"If you are here, you made it through the learning process of the Lua language! Keep in mind, this section assumes that you know basic Lua. If you need to freshen up, look back onto the Beginner tutorials!","sidebar":"tutorialSidebar"},"Guides/Other/fps-animation":{"id":"Guides/Other/fps-animation","title":"60 FPS Animation","description":"Tutorial created by WinterNox.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"This community-maintained wiki holds the resources useful for creating custom levels for PewPew Live.","sidebar":"tutorialSidebar"},"Other/level-design-principles":{"id":"Other/level-design-principles","title":"Design principles","description":"General guidelines","sidebar":"tutorialSidebar"},"Other/level-restrictions":{"id":"Other/level-restrictions","title":"Level restrictions","description":"Entity count","sidebar":"tutorialSidebar"},"Other/trivia":{"id":"Other/trivia","title":"Trivia","description":"This page contains a random bag of technical information concerning PewPew Live.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b204be58.d04c2711.js b/assets/js/b204be58.d04c2711.js new file mode 100644 index 0000000..43b6f63 --- /dev/null +++ b/assets/js/b204be58.d04c2711.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[9363],{3621:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var i=n(4848),s=n(8453),r=n(6540);function o(){const e=(0,r.useRef)(null);return(0,i.jsxs)("div",{children:[(0,i.jsx)("input",{type:"text",defaultValue:"2.718",onInput:t=>{e.current.innerText=function(e){let t=parseFloat(e);if(isNaN(t))return"Error!";let n=Math.abs(t),i=Math.floor(n);i>2<<51&&(i=2<<51);let s=t<0?"-":"",r=Math.floor(n%1*4096),o="";return 0!=r&&(o="."+r),`${s}${i}${o}fx`}(t.target.value)}}),(0,i.jsx)("br",{}),(0,i.jsx)("code",{ref:e,children:"2.2940fx"})]})}const a={sidebar_position:1},l="Types",d={id:"APIs/types",title:"Types",description:"int",source:"@site/docs/APIs/types.mdx",sourceDirName:"APIs",slug:"/APIs/types",permalink:"/ppl-docs/docs/APIs/types",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/types.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Home",permalink:"/ppl-docs/docs/home"},next:{title:"pewpew library",permalink:"/ppl-docs/docs/APIs/PewPew"}},c={},u=[{value:"int",id:"int",level:2},{value:"FixedPoint",id:"fixedpoint",level:2},{value:"EntityId",id:"entityid",level:2},{value:"String",id:"string",level:2},{value:"float",id:"float",level:2}];function h(e){const t={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"types",children:"Types"}),"\n",(0,i.jsx)(t.h2,{id:"int",children:"int"}),"\n",(0,i.jsx)(t.p,{children:"Stores integers. Used for many things, including durations and colors.\nDurations represents a number of game ticks. There are 30 game ticks per seconds. For example, a duration of 45 ticks represents 1.5 seconds.\nColors are stored in 32 bits in the RGBA order. For example, 0xff000080 encodes pure red (0xff0000) with an alpha value of 0x80."}),"\n",(0,i.jsx)(t.h2,{id:"fixedpoint",children:"FixedPoint"}),"\n",(0,i.jsx)(t.p,{children:"Stores fixed point numbers.\nUsed for storing and computing all the game related values that require more precision than what integer numbers can provide. That includes coordinates, angles, velocities, etc...\nThis built-in type is specific to PewPew, and does not exist in other Lua interpreters, which is why it is documented more thoroughly than the other types.\nA FixedPoint constant is defined using a number followed by the fx postfix:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-lua",children:"local a = 100fx\n"})}),"\n",(0,i.jsx)(t.p,{children:"You can perform regular arithmetic operations on it (+, -, /, *, <, ==, >, and, or, xor), but you can't mix FixedPoint values with non-FixedPoint values:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-lua",children:"local a = 100fx\nlocal b = a / 3fx -- Ok\nlocal c = a / 3 -- Not ok! 3 is not a FixedPoint\n"})}),"\n",(0,i.jsx)(t.p,{children:"Internally, FixedPoint numbers are implemented using dux_fixed, which uses 64 bits integers. 52 bits are used to encode the integral part, leaving 12 bits for the fractional part.\nYou can initialize the fractional part by placing a '.' followed by an integer in the range [0, 4095]:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-lua",children:"local a = 1fx -- Stores the value 1\nlocal b = 1.0fx -- Stores the value 1\nlocal c = 1.2048fx -- Stores the value 1.5\nlocal d = 1.4095fx -- Stores the value 1.9997558...\nlocal e = -1.4095fx -- Stores the value -1.9997558...\nlocal f = 1.4096fx -- Not ok! The decimal part must be less than 4096\n"})}),"\n",(0,i.jsx)(t.p,{children:"Here's an interactive converter that can help understanding the format:"}),"\n",(0,i.jsx)(o,{}),"\n",(0,i.jsx)(t.h2,{id:"entityid",children:"EntityId"}),"\n",(0,i.jsx)(t.p,{children:"An integer that identifies an entity. EntityIds are guaranteed to be unique: they are not reused for the duration of a game."}),"\n",(0,i.jsx)(t.h2,{id:"string",children:"String"}),"\n",(0,i.jsx)(t.p,{children:"Stores a sequence of characters.\nTypically used to hold text and file paths. The API only accepts strings less than 1000 bytes long."}),"\n",(0,i.jsx)(t.h2,{id:"float",children:"float"}),"\n",(0,i.jsx)(t.p,{children:"Stores floating point numbers. Because they make determinism hard to guarantee, floats must only be used in Lua scripts that define meshes or sounds. Although it is still technically possible to use floats in game scripts, they will eventually be forbidden."})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var i=n(6540);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b204be58.e680ec56.js b/assets/js/b204be58.e680ec56.js deleted file mode 100644 index 3cb2c28..0000000 --- a/assets/js/b204be58.e680ec56.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[9363],{3621:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var i=n(4848),s=n(8453),r=n(6540);function o(){const e=(0,r.useRef)(null);return(0,i.jsxs)("div",{children:[(0,i.jsx)("input",{type:"text",defaultValue:"2.718",onInput:t=>{e.current.innerText=function(e){let t=parseFloat(e);if(isNaN(t))return"Error!";let n=Math.abs(t),i=Math.floor(n);i>2<<51&&(i=2<<51);let s=t<0?"-":"",r=Math.floor(n%1*4096),o="";return 0!=r&&(o="."+r),`${s}${i}${o}fx`}(t.target.value)}}),(0,i.jsx)("br",{}),(0,i.jsx)("code",{ref:e,children:"2.2940fx"})]})}const a={sidebar_position:1},l="Types",d={id:"APIs/types",title:"Types",description:"int",source:"@site/docs/APIs/types.mdx",sourceDirName:"APIs",slug:"/APIs/types",permalink:"/ppl-docs/docs/APIs/types",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/types.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/ppl-docs/docs/intro"},next:{title:"PewPew",permalink:"/ppl-docs/docs/APIs/PewPew"}},c={},u=[{value:"int",id:"int",level:2},{value:"FixedPoint",id:"fixedpoint",level:2},{value:"EntityId",id:"entityid",level:2},{value:"String",id:"string",level:2},{value:"float",id:"float",level:2}];function h(e){const t={code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"types",children:"Types"}),"\n",(0,i.jsx)(t.h2,{id:"int",children:"int"}),"\n",(0,i.jsx)(t.p,{children:"Stores integers. Used for many things, including durations and colors.\nDurations represents a number of game ticks. There are 30 game ticks per seconds. For example, a duration of 45 ticks represents 1.5 seconds.\nColors are stored in 32 bits in the RGBA order. For example, 0xff000080 encodes pure red (0xff0000) with an alpha value of 0x80."}),"\n",(0,i.jsx)(t.h2,{id:"fixedpoint",children:"FixedPoint"}),"\n",(0,i.jsx)(t.p,{children:"Stores fixed point numbers.\nUsed for storing and computing all the game related values that require more precision than what integer numbers can provide. That includes coordinates, angles, velocities, etc...\nThis built-in type is specific to PewPew, and does not exist in other Lua interpreters, which is why it is documented more thoroughly than the other types.\nA FixedPoint constant is defined using a number followed by the fx postfix:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-lua",children:"local a = 100fx\n"})}),"\n",(0,i.jsx)(t.p,{children:"You can perform regular arithmetic operations on it (+, -, /, *, <, ==, >, and, or, xor), but you can't mix FixedPoint values with non-FixedPoint values:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-lua",children:"local a = 100fx\nlocal b = a / 3fx -- Ok\nlocal c = a / 3 -- Not ok! 3 is not a FixedPoint\n"})}),"\n",(0,i.jsx)(t.p,{children:"Internally, FixedPoint numbers are implemented using dux_fixed, which uses 64 bits integers. 52 bits are used to encode the integral part, leaving 12 bits for the fractional part.\nYou can initialize the fractional part by placing a '.' followed by an integer in the range [0, 4095]:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-lua",children:"local a = 1fx -- Stores the value 1\nlocal b = 1.0fx -- Stores the value 1\nlocal c = 1.2048fx -- Stores the value 1.5\nlocal d = 1.4095fx -- Stores the value 1.9997558...\nlocal e = -1.4095fx -- Stores the value -1.9997558...\nlocal f = 1.4096fx -- Not ok! The decimal part must be less than 4096\n"})}),"\n",(0,i.jsx)(t.p,{children:"Here's an interactive converter that can help understanding the format:"}),"\n",(0,i.jsx)(o,{}),"\n",(0,i.jsx)(t.h2,{id:"entityid",children:"EntityId"}),"\n",(0,i.jsx)(t.p,{children:"An integer that identifies an entity. EntityIds are guaranteed to be unique: they are not reused for the duration of a game."}),"\n",(0,i.jsx)(t.h2,{id:"string",children:"String"}),"\n",(0,i.jsx)(t.p,{children:"Stores a sequence of characters.\nTypically used to hold text and file paths. The API only accepts strings less than 1000 bytes long."}),"\n",(0,i.jsx)(t.h2,{id:"float",children:"float"}),"\n",(0,i.jsx)(t.p,{children:"Stores floating point numbers. Because they make determinism hard to guarantee, floats must only be used in Lua scripts that define meshes or sounds. Although it is still technically possible to use floats in game scripts, they will eventually be forbidden."})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var i=n(6540);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bde67976.a3410ee9.js b/assets/js/bde67976.a3410ee9.js new file mode 100644 index 0000000..d5b0310 --- /dev/null +++ b/assets/js/bde67976.a3410ee9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[3619],{9950:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var s=i(4848),t=i(8453);const r={sidebar_position:3},o="Sound files",l={id:"File Information/sound-files",title:"Sound files",description:"Example of a file that defines a single sound:",source:"@site/docs/File Information/sound-files.md",sourceDirName:"File Information",slug:"/File Information/sound-files",permalink:"/ppl-docs/docs/File Information/sound-files",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/File Information/sound-files.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Mesh files",permalink:"/ppl-docs/docs/File Information/mesh-files"},next:{title:"Beginner Lua Tutorial",permalink:"/ppl-docs/docs/Guides/Lua/beginner"}},a={},c=[];function u(e){const n={a:"a",code:"code",h1:"h1",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"sound-files",children:"Sound files"}),"\n",(0,s.jsx)(n.p,{children:"Example of a file that defines a single sound:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-lua",children:'sounds = {\n {\n frequency = 500,\n sustain = 0.3,\n waveform = "triangle",\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"The following fields can be used to describe a sound:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"attack (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"decay (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"sustain (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"sustainPunch (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"amplification"}),"\n",(0,s.jsx)(n.li,{children:"harmonics"}),"\n",(0,s.jsx)(n.li,{children:"harmonicsFalloff"}),"\n",(0,s.jsx)(n.li,{children:"tremoloDepth"}),"\n",(0,s.jsx)(n.li,{children:"tremoloFrequency (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"frequency (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"frequencyDeltaSweep"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump1Onset"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump2Onset"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump1Amount"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump2Amount"}),"\n",(0,s.jsx)(n.li,{children:"frequencySweep"}),"\n",(0,s.jsx)(n.li,{children:"vibratoFrequency (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"vibratoDepth (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"flangerOffset"}),"\n",(0,s.jsx)(n.li,{children:"flangerOffsetSweep"}),"\n",(0,s.jsx)(n.li,{children:"repeatFrequency"}),"\n",(0,s.jsx)(n.li,{children:'waveform ("sine", "triangle", "sawtooth", "square", "tangent", "whistle", "breaker", "whitenoise", "pinknoise", "brownnoise")'}),"\n"]}),"\n",(0,s.jsx)(n.h1,{id:"creating-a-sound-with-jfxr",children:"Creating a sound with JFXR"}),"\n",(0,s.jsxs)(n.p,{children:["While it's possible to hand-craft sounds by hand-editing sound files, in practice most people use the GUI ",(0,s.jsx)(n.a,{href:"https://pewpew.live/jfxr/index.html",children:"jfxr"})," for sound creation."]}),"\n",(0,s.jsx)(n.p,{children:'After obtaining a sound you are satisfied with, you can "export" the sound by using the link to your sound generated by jfxr.'}),"\n",(0,s.jsxs)(n.p,{children:["A script then transforms the resulting jfxr link (for example ",(0,s.jsx)(n.a,{href:"https://pewpew.live/jfxr/index.html#%7B%22_version%22%3A1%2C%22_name%22%3A%22Pickup%2Fcoin%206%22%2C%22_locked%22%3A%5B%5D%2C%22sampleRate%22%3A44100%2C%22attack%22%3A0%2C%22sustain%22%3A0.1%2C%22sustainPunch%22%3A60%2C%22decay%22%3A0.14%2C%22tremoloDepth%22%3A0%2C%22tremoloFrequency%22%3A10%2C%22frequency%22%3A700%2C%22frequencySweep%22%3A0%2C%22frequencyDeltaSweep%22%3A0%2C%22repeatFrequency%22%3A0%2C%22frequencyJump1Onset%22%3A25%2C%22frequencyJump1Amount%22%3A75%2C%22frequencyJump2Onset%22%3A66%2C%22frequencyJump2Amount%22%3A0%2C%22harmonics%22%3A0%2C%22harmonicsFalloff%22%3A0.5%2C%22waveform%22%3A%22square%22%2C%22interpolateNoise%22%3Atrue%2C%22vibratoDepth%22%3A0%2C%22vibratoFrequency%22%3A10%2C%22squareDuty%22%3A90%2C%22squareDutySweep%22%3A0%2C%22flangerOffset%22%3A6%2C%22flangerOffsetSweep%22%3A0%2C%22bitCrush%22%3A16%2C%22bitCrushSweep%22%3A0%2C%22lowPassCutoff%22%3A22050%2C%22lowPassCutoffSweep%22%3A0%2C%22highPassCutoff%22%3A0%2C%22highPassCutoffSweep%22%3A0%2C%22compression%22%3A1%2C%22normalization%22%3Atrue%2C%22amplification%22%3A100%7D",children:"this link"}),") into a table consumable by PewPew Live."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"screenshot of using JFXR to export a sound",src:i(1580).A+"",width:"749",height:"477"})}),"\n",(0,s.jsxs)(n.p,{children:["See this ",(0,s.jsx)(n.a,{href:"https://github.com/jyaif/ppl-utils/blob/cd0607d3448915319ce9abc1f6019287566f6bdd/content/levels/useful_helpers/helpers/boxes/cannon_pickup_sound.lua#L3",children:"example"}),"."]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1580:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/jfxr-export-link-40fccb60e0766e3a2aa193d47af4aff4.png"},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bde67976.c440d31c.js b/assets/js/bde67976.c440d31c.js deleted file mode 100644 index 331551a..0000000 --- a/assets/js/bde67976.c440d31c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[3619],{9950:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var s=i(4848),t=i(8453);const r={sidebar_position:3},o="Sound files",l={id:"File Information/sound-files",title:"Sound files",description:"Example of a file that defines a single sound:",source:"@site/docs/File Information/sound-files.md",sourceDirName:"File Information",slug:"/File Information/sound-files",permalink:"/ppl-docs/docs/File Information/sound-files",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/File Information/sound-files.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Mesh files",permalink:"/ppl-docs/docs/File Information/mesh-files"},next:{title:"Beginner Lua Tutorial",permalink:"/ppl-docs/docs/Guides/Lua/beginner"}},c={},a=[];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"sound-files",children:"Sound files"}),"\n",(0,s.jsx)(n.p,{children:"Example of a file that defines a single sound:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-lua",children:'sounds = {\n {\n frequency = 500,\n sustain = 0.3,\n waveform = "triangle",\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"The following fields can be used to describe a sound:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"attack (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"decay (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"sustain (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"sustainPunch (in seconds)"}),"\n",(0,s.jsx)(n.li,{children:"amplification"}),"\n",(0,s.jsx)(n.li,{children:"tremoloDepth"}),"\n",(0,s.jsx)(n.li,{children:"tremoloFrequency (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"frequency (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"frequencyDeltaSweep"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump1Onset"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump2Onset"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump1Amount"}),"\n",(0,s.jsx)(n.li,{children:"frequencyJump2Amount"}),"\n",(0,s.jsx)(n.li,{children:"frequencySweep"}),"\n",(0,s.jsx)(n.li,{children:"vibratoFrequency (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"vibratoDepth (in hertz)"}),"\n",(0,s.jsx)(n.li,{children:"flangerOffset"}),"\n",(0,s.jsx)(n.li,{children:"flangerOffsetSweep"}),"\n",(0,s.jsx)(n.li,{children:"repeatFrequency"}),"\n",(0,s.jsx)(n.li,{children:'waveform ("sine", "triangle", "sawtooth", "square", "tangent", "whistle", "breaker", "whitenoise", "pinknoise", "brownnoise")'}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.a,{href:"https://pewpew.live/jfxr/index.html",children:"jfxr"})," for sound creation. A script then transforms the resulting jfxr link (for example ",(0,s.jsx)(n.a,{href:"https://pewpew.live/jfxr/index.html#%7B%22_version%22%3A1%2C%22_name%22%3A%22Pickup%2Fcoin%206%22%2C%22_locked%22%3A%5B%5D%2C%22sampleRate%22%3A44100%2C%22attack%22%3A0%2C%22sustain%22%3A0.1%2C%22sustainPunch%22%3A60%2C%22decay%22%3A0.14%2C%22tremoloDepth%22%3A0%2C%22tremoloFrequency%22%3A10%2C%22frequency%22%3A700%2C%22frequencySweep%22%3A0%2C%22frequencyDeltaSweep%22%3A0%2C%22repeatFrequency%22%3A0%2C%22frequencyJump1Onset%22%3A25%2C%22frequencyJump1Amount%22%3A75%2C%22frequencyJump2Onset%22%3A66%2C%22frequencyJump2Amount%22%3A0%2C%22harmonics%22%3A0%2C%22harmonicsFalloff%22%3A0.5%2C%22waveform%22%3A%22square%22%2C%22interpolateNoise%22%3Atrue%2C%22vibratoDepth%22%3A0%2C%22vibratoFrequency%22%3A10%2C%22squareDuty%22%3A90%2C%22squareDutySweep%22%3A0%2C%22flangerOffset%22%3A6%2C%22flangerOffsetSweep%22%3A0%2C%22bitCrush%22%3A16%2C%22bitCrushSweep%22%3A0%2C%22lowPassCutoff%22%3A22050%2C%22lowPassCutoffSweep%22%3A0%2C%22highPassCutoff%22%3A0%2C%22highPassCutoffSweep%22%3A0%2C%22compression%22%3A1%2C%22normalization%22%3Atrue%2C%22amplification%22%3A100%7D",children:"this link"}),") into a table consumable by PewPew Live."]}),(0,s.jsxs)(n.p,{children:["See this ",(0,s.jsx)(n.a,{href:"https://github.com/jyaif/ppl-utils/blob/cd0607d3448915319ce9abc1f6019287566f6bdd/content/levels/useful_helpers/helpers/boxes/cannon_pickup_sound.lua#L3",children:"example"}),"."]})]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c5039d34.1f98e805.js b/assets/js/c5039d34.1f98e805.js deleted file mode 100644 index ef2f574..0000000 --- a/assets/js/c5039d34.1f98e805.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[8538],{1287:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>o,frontMatter:()=>s,metadata:()=>c,toc:()=>h});var l=n(4848),r=n(8453);const s={sidebar_position:3},d="Standard libraries",c={id:"APIs/standard-libraries",title:"Standard libraries",description:"Only a subset of the standard Lua libraries are available in PewPew Live:",source:"@site/docs/APIs/standard-libraries.md",sourceDirName:"APIs",slug:"/APIs/standard-libraries",permalink:"/ppl-docs/docs/APIs/standard-libraries",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/standard-libraries.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Fmath",permalink:"/ppl-docs/docs/APIs/Fmath"},next:{title:"Manifest files",permalink:"/ppl-docs/docs/File Information/manifest-files"}},a={},h=[{value:"String library",id:"string-library",level:2},{value:"Table library",id:"table-library",level:2},{value:"Math library",id:"math-library",level:2}];function t(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.h1,{id:"standard-libraries",children:"Standard libraries"}),"\n",(0,l.jsxs)(i.p,{children:["Only a subset of the standard Lua libraries are available in PewPew Live:\nThe ",(0,l.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_standard_lua_libs#string-library",children:"string"})," library, the ",(0,l.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_standard_lua_libs#table-library",children:"table"})," library, and (for meshes and sound effects only) the ",(0,l.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_standard_lua_libs#math-library",children:"math"})," library."]}),"\n",(0,l.jsx)(i.admonition,{type:"info",children:(0,l.jsx)(i.p,{children:"Level files do not have access to the math library. Use fmath instead."})}),"\n",(0,l.jsx)(i.h2,{id:"string-library",children:"String library"}),"\n",(0,l.jsx)(i.p,{children:"The library exposes the following functions:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"byte"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"char"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"dump"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"find"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"format"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"gmatch"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"gsub"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"len"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"lower"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"match"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"rep"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"reverse"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sub"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"upper"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"pack"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"packsize"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"unpack"})}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["The official Lua website has the ",(0,l.jsx)(i.a,{href:"https://www.lua.org/manual/5.3/manual.html#6.4",children:"documentation"})," for the string library."]}),"\n",(0,l.jsx)(i.h2,{id:"table-library",children:"Table library"}),"\n",(0,l.jsx)(i.p,{children:"The library exposes the following functions:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"concat"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"insert"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"pack"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"unpack"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"remove"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"move"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sort"})}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["The official Lua website has the ",(0,l.jsx)(i.a,{href:"https://www.lua.org/manual/5.3/manual.html#6.6",children:"documentation"})," for the table library."]}),"\n",(0,l.jsx)(i.h2,{id:"math-library",children:"Math library"}),"\n",(0,l.jsxs)(i.p,{children:["The Lua ",(0,l.jsx)(i.code,{children:"math"})," library is only available for meshes and sound effects.\nIt is not available when creating levels because the functions it offer are often for dealing with floating point numbers."]}),"\n",(0,l.jsx)(i.p,{children:"The library exposes the following functions:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"abs"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"acos"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"asin"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"atan"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"ceil"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"cos"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"deg"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"exp"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"tointeger"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"floor"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"fmod"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"ult"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"log"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"max"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"min"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"modf"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"rad"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"random"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sin"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sincos"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sqrt"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"tan"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"type"})}),"\n"]}),"\n",(0,l.jsx)(i.p,{children:"and the constants:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"pi"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"huge"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"maxinteger"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"mininteger"})}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["The only absent API is ",(0,l.jsx)(i.code,{children:"randomseed"})," (the RNG is already seeded with a good seed).\nIf you need a predictable random sequence, use your own RNG implemented in Lua."]}),"\n",(0,l.jsxs)(i.p,{children:["The official Lua website has the ",(0,l.jsx)(i.a,{href:"https://www.lua.org/manual/5.3/manual.html#6.7",children:"documentation"})," for the math library."]})]})}function o(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(t,{...e})}):t(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>d,x:()=>c});var l=n(6540);const r={},s=l.createContext(r);function d(e){const i=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),l.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c5039d34.4d9ce4af.js b/assets/js/c5039d34.4d9ce4af.js new file mode 100644 index 0000000..108d6ec --- /dev/null +++ b/assets/js/c5039d34.4d9ce4af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[8538],{1287:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>o,frontMatter:()=>s,metadata:()=>c,toc:()=>h});var l=n(4848),r=n(8453);const s={sidebar_position:3},d="Standard libraries",c={id:"APIs/standard-libraries",title:"Standard libraries",description:"Only a subset of the standard Lua libraries are available in PewPew Live:",source:"@site/docs/APIs/standard-libraries.md",sourceDirName:"APIs",slug:"/APIs/standard-libraries",permalink:"/ppl-docs/docs/APIs/standard-libraries",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/APIs/standard-libraries.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"fmath library",permalink:"/ppl-docs/docs/APIs/Fmath"},next:{title:"Manifest files",permalink:"/ppl-docs/docs/File Information/manifest-files"}},a={},h=[{value:"String library",id:"string-library",level:2},{value:"Table library",id:"table-library",level:2},{value:"Math library",id:"math-library",level:2}];function t(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.h1,{id:"standard-libraries",children:"Standard libraries"}),"\n",(0,l.jsxs)(i.p,{children:["Only a subset of the standard Lua libraries are available in PewPew Live:\nThe ",(0,l.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_standard_lua_libs#string-library",children:"string"})," library, the ",(0,l.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_standard_lua_libs#table-library",children:"table"})," library, and (for meshes and sound effects only) the ",(0,l.jsx)(i.a,{href:"https://github.com/jyaif/ppl-utils/wiki/API_standard_lua_libs#math-library",children:"math"})," library."]}),"\n",(0,l.jsx)(i.admonition,{type:"info",children:(0,l.jsx)(i.p,{children:"Level files do not have access to the math library. Use fmath instead."})}),"\n",(0,l.jsx)(i.h2,{id:"string-library",children:"String library"}),"\n",(0,l.jsx)(i.p,{children:"The library exposes the following functions:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"byte"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"char"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"dump"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"find"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"format"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"gmatch"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"gsub"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"len"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"lower"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"match"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"rep"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"reverse"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sub"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"upper"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"pack"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"packsize"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"unpack"})}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["The official Lua website has the ",(0,l.jsx)(i.a,{href:"https://www.lua.org/manual/5.3/manual.html#6.4",children:"documentation"})," for the string library."]}),"\n",(0,l.jsx)(i.h2,{id:"table-library",children:"Table library"}),"\n",(0,l.jsx)(i.p,{children:"The library exposes the following functions:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"concat"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"insert"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"pack"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"unpack"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"remove"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"move"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sort"})}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["The official Lua website has the ",(0,l.jsx)(i.a,{href:"https://www.lua.org/manual/5.3/manual.html#6.6",children:"documentation"})," for the table library."]}),"\n",(0,l.jsx)(i.h2,{id:"math-library",children:"Math library"}),"\n",(0,l.jsxs)(i.p,{children:["The Lua ",(0,l.jsx)(i.code,{children:"math"})," library is only available for meshes and sound effects.\nIt is not available when creating levels because the functions it offer are often for dealing with floating point numbers."]}),"\n",(0,l.jsx)(i.p,{children:"The library exposes the following functions:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"abs"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"acos"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"asin"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"atan"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"ceil"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"cos"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"deg"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"exp"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"tointeger"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"floor"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"fmod"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"ult"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"log"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"max"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"min"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"modf"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"rad"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"random"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sin"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sincos"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"sqrt"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"tan"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"type"})}),"\n"]}),"\n",(0,l.jsx)(i.p,{children:"and the constants:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"pi"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"huge"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"maxinteger"})}),"\n",(0,l.jsx)(i.li,{children:(0,l.jsx)(i.code,{children:"mininteger"})}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["The only absent API is ",(0,l.jsx)(i.code,{children:"randomseed"})," (the RNG is already seeded with a good seed).\nIf you need a predictable random sequence, use your own RNG implemented in Lua."]}),"\n",(0,l.jsxs)(i.p,{children:["The official Lua website has the ",(0,l.jsx)(i.a,{href:"https://www.lua.org/manual/5.3/manual.html#6.7",children:"documentation"})," for the math library."]})]})}function o(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(t,{...e})}):t(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>d,x:()=>c});var l=n(6540);const r={},s=l.createContext(r);function d(e){const i=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),l.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c8ed35e6.0ca10d1a.js b/assets/js/c8ed35e6.0ca10d1a.js new file mode 100644 index 0000000..438c62b --- /dev/null +++ b/assets/js/c8ed35e6.0ca10d1a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[3076],{9904:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var s=n(4848),r=n(8453);const l={sidebar_position:1},t="Design principles",a={id:"Other/level-design-principles",title:"Design principles",description:"General guidelines",source:"@site/docs/Other/level-design-principles.md",sourceDirName:"Other",slug:"/Other/level-design-principles",permalink:"/ppl-docs/docs/Other/level-design-principles",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/Other/level-design-principles.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"60 FPS Animation",permalink:"/ppl-docs/docs/Guides/Other/fps-animation"},next:{title:"Game limits",permalink:"/ppl-docs/docs/Other/game-limits"}},o={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Gameplay advice",id:"gameplay-advice",level:2},{value:"Users will try to camp in the corners",id:"users-will-try-to-camp-in-the-corners",level:3},{value:"Fair randomness",id:"fair-randomness",level:3},{value:"Be mindful of farming",id:"be-mindful-of-farming",level:3}];function c(e){const i={h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"design-principles",children:"Design principles"}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Gameplay is king."}),"\n",(0,s.jsxs)(i.li,{children:["To be consistent with the rest of the game:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Prefer procedurally generated graphics over manually created graphics."}),"\n",(0,s.jsx)(i.li,{children:"Prefer angular designs instead of curved designs."}),"\n",(0,s.jsx)(i.li,{children:"Prefer abstract designs over realistic designs."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"gameplay-advice",children:"Gameplay advice"}),"\n",(0,s.jsx)(i.h3,{id:"users-will-try-to-camp-in-the-corners",children:"Users will try to camp in the corners"}),"\n",(0,s.jsx)(i.p,{children:"Corners reduce the exposure of the players' ships, so players will naturally tend to hide there. Either incentivize players to move by putting bonuses away from the corners, or de-incentivize players from staying there by spawning enemies there.\nThe same thing applies (to a lesser extent) to level's borders."}),"\n",(0,s.jsx)(i.h3,{id:"fair-randomness",children:"Fair randomness"}),"\n",(0,s.jsx)(i.p,{children:"If players have a very slim chance of getting a bonus that massively increases their score, the top of the leaderboard will be populated by people that were lucky, not by people that were skilled. This is not necessarily a bad thing, but it's something to keep in mind."}),"\n",(0,s.jsx)(i.h3,{id:"be-mindful-of-farming",children:"Be mindful of farming"}),"\n",(0,s.jsx)(i.p,{children:"Ask yourself if it is possible for the player to accumulate a lot of points (or a lot of shields) simply by not triggering an event. For example, I once made a level where shields kept appearing until all enemies were killed. Some players discovered that by leaving one enemy alive, they could farm shields."})]})}function p(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>t,x:()=>a});var s=n(6540);const r={},l=s.createContext(r);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c8ed35e6.183ac2d9.js b/assets/js/c8ed35e6.183ac2d9.js deleted file mode 100644 index 060b80d..0000000 --- a/assets/js/c8ed35e6.183ac2d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[3076],{9904:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var s=n(4848),r=n(8453);const l={sidebar_position:1},t="Design principles",a={id:"Other/level-design-principles",title:"Design principles",description:"General guidelines",source:"@site/docs/Other/level-design-principles.md",sourceDirName:"Other",slug:"/Other/level-design-principles",permalink:"/ppl-docs/docs/Other/level-design-principles",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/Other/level-design-principles.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"60 FPS Animation",permalink:"/ppl-docs/docs/Guides/Other/fps-animation"},next:{title:"Level restrictions",permalink:"/ppl-docs/docs/Other/level-restrictions"}},o={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Gameplay advice",id:"gameplay-advice",level:2},{value:"Users will try to camp in the corners",id:"users-will-try-to-camp-in-the-corners",level:3},{value:"Fair randomness",id:"fair-randomness",level:3},{value:"Be mindful of farming",id:"be-mindful-of-farming",level:3}];function c(e){const i={h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h1,{id:"design-principles",children:"Design principles"}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Gameplay is king."}),"\n",(0,s.jsx)(i.li,{children:"Prefer procedurally generated graphics over manually created graphics."}),"\n",(0,s.jsx)(i.li,{children:"Prefer angular designs instead of curved designs."}),"\n",(0,s.jsx)(i.li,{children:"Prefer abstract designs over realistic designs."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"gameplay-advice",children:"Gameplay advice"}),"\n",(0,s.jsx)(i.h3,{id:"users-will-try-to-camp-in-the-corners",children:"Users will try to camp in the corners"}),"\n",(0,s.jsx)(i.p,{children:"Corners reduce the exposure of the players' ships, so players will naturally tend to hide there. Either incentivize players to move by putting bonuses away from the corners, or de-incentivize players from staying there by spawning enemies there.\nThe same thing applies (to a lesser extent) to level's borders."}),"\n",(0,s.jsx)(i.h3,{id:"fair-randomness",children:"Fair randomness"}),"\n",(0,s.jsx)(i.p,{children:"If players have a very slim chance of getting a bonus that massively increases their score, the top of the leaderboard will be populated by people that were lucky, not by people that were skilled. This is not necessarily a bad thing, but it's something to keep in mind."}),"\n",(0,s.jsx)(i.h3,{id:"be-mindful-of-farming",children:"Be mindful of farming"}),"\n",(0,s.jsx)(i.p,{children:"Ask yourself if it is possible for the player to accumulate a lot of points (or a lot of shields) simply by not triggering an event. For example, I once made a level where shields kept appearing until all enemies were killed. Some players discovered that by leaving one enemy alive, they could farm shields."})]})}function p(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>t,x:()=>a});var s=n(6540);const r={},l=s.createContext(r);function t(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d321bdfd.707b2e80.js b/assets/js/d321bdfd.707b2e80.js deleted file mode 100644 index fba01c1..0000000 --- a/assets/js/d321bdfd.707b2e80.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[4387],{676:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>o,default:()=>f,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(4848),i=n(8453);const r={sidebar_position:2},o="Mesh files",l={id:"File Information/mesh-files",title:"Mesh files",description:"In PewPew Live, a mesh is a collection of lines in 3D.",source:"@site/docs/File Information/mesh-files.md",sourceDirName:"File Information",slug:"/File Information/mesh-files",permalink:"/ppl-docs/docs/File Information/mesh-files",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/File Information/mesh-files.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Manifest files",permalink:"/ppl-docs/docs/File Information/manifest-files"},next:{title:"Sound files",permalink:"/ppl-docs/docs/File Information/sound-files"}},a={},c=[{value:"Vertexes",id:"vertexes",level:2},{value:"Segments chains",id:"segments-chains",level:2},{value:"Colors",id:"colors",level:2},{value:"Procedural rendering",id:"procedural-rendering",level:2}];function d(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"mesh-files",children:"Mesh files"}),"\n",(0,t.jsxs)(s.p,{children:["In PewPew Live, a mesh is a collection of lines in 3D.\nTo create a mesh, you need to list the coordinates of the points making up the model, and how the points are linked.\nLua scripts describing meshes needs to create a table called ",(0,t.jsx)(s.code,{children:"meshes"}),". That table must contain one or more meshes."]}),"\n",(0,t.jsx)(s.p,{children:"Example of a file that defines two meshes:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-lua",children:"meshes = {\n { -- A 500x500 square\n vertexes = {{0,0,0}, {500,0,0}, {500,500,0}, {0,500,0}},\n colors = {0xffffffff, 0xffff00ff, 0xff00ffff, 0xff0000ff},\n segments = {{0,1,2,3,0}}\n },\n { -- A right-angled triangle\n vertexes = {{0,0,0}, {500,0,0}, {0,500,0}},\n colors = {0xffff00ff, 0xff00ffff, 0xff0000ff},\n segments = {{0,1,2,0}}\n }\n}\n"})}),"\n",(0,t.jsx)(s.h2,{id:"vertexes",children:"Vertexes"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"vertexes"})," field contains the list of vertexes. Vertexes are represented by three numbers. Those numbers can be floating point numbers."]}),"\n",(0,t.jsx)(s.h2,{id:"segments-chains",children:"Segments chains"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"segment"})," field describes which vertexes should be joined by a segment. It contain a list of segment chains. Each segment chain is a table that holds a lists of 0-based indexes to vertexes that should be connected by a segment."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Important"}),": There is a difference between ",(0,t.jsx)(s.code,{children:"segments = {{0,1}, {1,2}}"})," and ",(0,t.jsx)(s.code,{children:"segments = {{0,1,2}}"}),". In the first case, 2 separate segments will be generated. In the second case, two segments linked with a miter join will be generated."]}),"\n",(0,t.jsx)(s.h2,{id:"colors",children:"Colors"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.em,{children:"optional"})," ",(0,t.jsx)(s.code,{children:"colors"})," field contains the colors of each vertexes. If the ",(0,t.jsx)(s.code,{children:"colors"})," field is present, it ",(0,t.jsx)(s.strong,{children:"must"})," contain as many colors as there are vertexes. Colors are 32 bit RGBA values."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-lua",children:"0xff0000ff -- opaque red\n0xff000080 -- slightly transparent red\n0xff000000 -- fully transparent red\n"})}),"\n",(0,t.jsx)(s.p,{children:"Note that all meshes are rendered with additive blending."}),"\n",(0,t.jsx)(s.h2,{id:"procedural-rendering",children:"Procedural rendering"}),"\n",(0,t.jsxs)(s.p,{children:["Astute readers may have realized that because ",(0,t.jsx)(s.code,{children:"meshes"})," is described in a Lua script, it can be generated at runtime. See for instance this ",(0,t.jsx)(s.a,{href:"https://github.com/jyaif/ppl-utils/blob/d32dbec8a171c9bcc0f800dcd864f175c42c34fd/content/levels/advanced_graphics/polar_graphic.lua#L36",children:"example"}),"."]})]})}function f(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>l});var t=n(6540);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d321bdfd.f25a4584.js b/assets/js/d321bdfd.f25a4584.js new file mode 100644 index 0000000..38eef64 --- /dev/null +++ b/assets/js/d321bdfd.f25a4584.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[4387],{676:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(4848),i=n(8453);const r={sidebar_position:2},o="Mesh files",l={id:"File Information/mesh-files",title:"Mesh files",description:"In PewPew Live, a mesh is a collection of lines in 3D.",source:"@site/docs/File Information/mesh-files.md",sourceDirName:"File Information",slug:"/File Information/mesh-files",permalink:"/ppl-docs/docs/File Information/mesh-files",draft:!1,unlisted:!1,editUrl:"https://github.com/pewpewlive/ppl-docs/edit/master/docs/File Information/mesh-files.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Manifest files",permalink:"/ppl-docs/docs/File Information/manifest-files"},next:{title:"Sound files",permalink:"/ppl-docs/docs/File Information/sound-files"}},a={},c=[{value:"Vertexes",id:"vertexes",level:2},{value:"Segments chains",id:"segments-chains",level:2},{value:"Colors",id:"colors",level:2},{value:"Procedural rendering",id:"procedural-rendering",level:2}];function d(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"mesh-files",children:"Mesh files"}),"\n",(0,t.jsx)(s.p,{children:"In PewPew Live, a mesh is a collection of lines in 3D."}),"\n",(0,t.jsxs)(s.p,{children:["To create a mesh, you need to list the coordinates of the points making up the model, and how the points are linked.\nLua scripts describing meshes needs to create a table called ",(0,t.jsx)(s.code,{children:"meshes"}),". That table must contain one or more meshes."]}),"\n",(0,t.jsx)(s.p,{children:"Example of a file that defines two meshes:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-lua",children:"meshes = {\n { -- A 500x500 square\n vertexes = {{0,0,0}, {500,0,0}, {500,500,0}, {0,500,0}},\n colors = {0xffffffff, 0xffff00ff, 0xff00ffff, 0xff0000ff},\n segments = {{0,1,2,3,0}}\n },\n { -- A right-angled triangle\n vertexes = {{0,0,0}, {500,0,0}, {0,500,0}},\n colors = {0xffff00ff, 0xff00ffff, 0xff0000ff},\n segments = {{0,1,2,0}}\n }\n}\n"})}),"\n",(0,t.jsx)(s.h2,{id:"vertexes",children:"Vertexes"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"vertexes"})," field contains the list of vertexes. Vertexes are represented by three numbers. Those numbers can be floating point numbers."]}),"\n",(0,t.jsx)(s.h2,{id:"segments-chains",children:"Segments chains"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"segment"})," field describes which vertexes should be joined by a segment. It contain a list of segment chains. Each segment chain is a table that holds a lists of 0-based indexes to vertexes that should be connected by a segment."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Important"}),": There is a difference between ",(0,t.jsx)(s.code,{children:"segments = {{0,1}, {1,2}}"})," and ",(0,t.jsx)(s.code,{children:"segments = {{0,1,2}}"}),". In the first case, 2 separate segments will be generated. In the second case, two segments linked with a miter join will be generated."]}),"\n",(0,t.jsx)(s.h2,{id:"colors",children:"Colors"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.em,{children:"optional"})," ",(0,t.jsx)(s.code,{children:"colors"})," field contains the colors of each vertexes. If the ",(0,t.jsx)(s.code,{children:"colors"})," field is present, it ",(0,t.jsx)(s.strong,{children:"must"})," contain as many colors as there are vertexes. Colors are 32 bit RGBA values."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-lua",children:"0xff0000ff -- opaque red\n0xff000080 -- slightly transparent red\n0xff000000 -- fully transparent red\n"})}),"\n",(0,t.jsx)(s.p,{children:"Note that all meshes are rendered with additive blending."}),"\n",(0,t.jsx)(s.h2,{id:"procedural-rendering",children:"Procedural rendering"}),"\n",(0,t.jsxs)(s.p,{children:["Astute readers may have realized that because ",(0,t.jsx)(s.code,{children:"meshes"})," is described in a Lua script, it can be generated at runtime. See for instance this ",(0,t.jsx)(s.a,{href:"https://github.com/jyaif/ppl-utils/blob/d32dbec8a171c9bcc0f800dcd864f175c42c34fd/content/levels/advanced_graphics/polar_graphic.lua#L36",children:"example"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"This is the prefered way of creating complex meshes, as it is both more efficient and more consistent with the rest of the game."})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>l});var t=n(6540);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.1144ea72.js b/assets/js/main.1144ea72.js new file mode 100644 index 0000000..066b272 --- /dev/null +++ b/assets/js/main.1144ea72.js @@ -0,0 +1,2 @@ +/*! For license information please see main.1144ea72.js.LICENSE.txt */ +(self.webpackChunkppl_docs=self.webpackChunkppl_docs||[]).push([[8792],{5391:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"0be36c6e":[()=>Promise.all([n.e(4132),n.e(5559)]).then(n.bind(n,6304)),"@site/docs/Guides/Other/60-fps-animation.mdx",6304],"0f1280df":[()=>n.e(6894).then(n.bind(n,8002)),"@site/docs/Other/game-limits.md",8002],17896441:[()=>Promise.all([n.e(1869),n.e(8222),n.e(8401)]).then(n.bind(n,5022)),"@theme/DocItem",5022],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,1283)),"@theme/SearchPage",1283],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,8198)),"@site/src/pages/index.tsx",8198],"3164f9fb":[()=>n.e(198).then(n.bind(n,8730)),"@site/docs/Guides/Lua/intermediate.md",8730],"3679e0b2":[()=>n.e(3151).then(n.bind(n,4988)),"@site/blog/2024-03-20-first-blog-post.md",4988],"3d9c95a4":[()=>n.e(279).then(n.bind(n,9991)),"@site/docs/home.md",9991],"4315fc58":[()=>n.e(7376).then(n.bind(n,2804)),"@site/docs/APIs/PewPew.md",2804],"46e25335":[()=>n.e(9612).then(n.bind(n,4212)),"@site/docs/File Information/manifest-files.md",4212],"59bfc863":[()=>n.e(2501).then(n.t.bind(n,2945,19)),"/home/runner/work/ppl-docs/ppl-docs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",2945],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"61036be0":[()=>n.e(2256).then(n.bind(n,1869)),"@site/docs/Guides/Lua/beginner.md",1869],"6875c492":[()=>Promise.all([n.e(1869),n.e(8222),n.e(8544),n.e(4813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"7370b24e":[()=>n.e(8573).then(n.t.bind(n,4061,19)),"/home/runner/work/ppl-docs/ppl-docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],"7d528a0b":[()=>n.e(3736).then(n.bind(n,2520)),"@site/blog/2024-03-20-first-blog-post.md?truncated=true",2520],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"91cb3e84":[()=>n.e(298).then(n.bind(n,7962)),"@site/docs/APIs/Fmath.md",7962],"935f2afb":[()=>n.e(8581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8222),n.e(8544),n.e(7643)]).then(n.bind(n,7785)),"@theme/BlogListPage",7785],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],b204be58:[()=>n.e(9363).then(n.bind(n,3621)),"@site/docs/APIs/types.mdx",3621],ba59bd01:[()=>n.e(2129).then(n.t.bind(n,2845,19)),"~blog/default/ppl-docs-blog-tags-first-609.json",2845],bde67976:[()=>n.e(3619).then(n.bind(n,9950)),"@site/docs/File Information/sound-files.md",9950],c5039d34:[()=>n.e(8538).then(n.bind(n,1287)),"@site/docs/APIs/standard-libraries.md",1287],c8ed35e6:[()=>n.e(3076).then(n.bind(n,9904)),"@site/docs/Other/level-design-principles.md",9904],c9cd16d1:[()=>n.e(1414).then(n.bind(n,637)),"@site/docs/Guides/Lua/advanced.md",637],c9e852ed:[()=>n.e(9630).then(n.t.bind(n,819,19)),"~blog/default/ppl-docs-blog-archive-e7c.json",819],ccc49370:[()=>Promise.all([n.e(1869),n.e(8222),n.e(8544),n.e(3249)]).then(n.bind(n,4029)),"@theme/BlogPostPage",4029],cd2705ba:[()=>n.e(1341).then(n.t.bind(n,328,19)),"~blog/default/ppl-docs-blog-fc8.json",328],d321bdfd:[()=>n.e(4387).then(n.bind(n,676)),"@site/docs/File Information/mesh-files.md",676],d86380de:[()=>n.e(199).then(n.t.bind(n,8460,19)),"~blog/default/ppl-docs-blog-tags-first-609-list.json",8460],d8d6d394:[()=>n.e(7413).then(n.t.bind(n,5587,19)),"~blog/default/ppl-docs-blog-tags-tags-0e1.json",5587],f0258939:[()=>n.e(4123).then(n.t.bind(n,1966,19)),"/home/runner/work/ppl-docs/ppl-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],fe8ddc1f:[()=>n.e(5634).then(n.t.bind(n,1142,19)),"/home/runner/work/ppl-docs/ppl-docs/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",1142]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(6921),c=n(3102);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},f=[],p=[],h=(0,u.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),a().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,s.jsx)(c.W,{value:i,children:(0,s.jsx)(o,{...a,...n})})}})}const f=[{path:"/ppl-docs/blog",component:d("/ppl-docs/blog","489"),exact:!0},{path:"/ppl-docs/blog/archive",component:d("/ppl-docs/blog/archive","32a"),exact:!0},{path:"/ppl-docs/blog/first-blog-post",component:d("/ppl-docs/blog/first-blog-post","f8c"),exact:!0},{path:"/ppl-docs/blog/tags",component:d("/ppl-docs/blog/tags","643"),exact:!0},{path:"/ppl-docs/blog/tags/first",component:d("/ppl-docs/blog/tags/first","676"),exact:!0},{path:"/ppl-docs/search",component:d("/ppl-docs/search","53f"),exact:!0},{path:"/ppl-docs/docs",component:d("/ppl-docs/docs","e64"),routes:[{path:"/ppl-docs/docs",component:d("/ppl-docs/docs","7d1"),routes:[{path:"/ppl-docs/docs",component:d("/ppl-docs/docs","f8e"),routes:[{path:"/ppl-docs/docs/APIs/Fmath",component:d("/ppl-docs/docs/APIs/Fmath","255"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/APIs/PewPew",component:d("/ppl-docs/docs/APIs/PewPew","e71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/APIs/standard-libraries",component:d("/ppl-docs/docs/APIs/standard-libraries","3df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/APIs/types",component:d("/ppl-docs/docs/APIs/types","4bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/File Information/manifest-files",component:d("/ppl-docs/docs/File Information/manifest-files","69a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/File Information/mesh-files",component:d("/ppl-docs/docs/File Information/mesh-files","527"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/File Information/sound-files",component:d("/ppl-docs/docs/File Information/sound-files","7f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/Guides/Lua/advanced",component:d("/ppl-docs/docs/Guides/Lua/advanced","6e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/Guides/Lua/beginner",component:d("/ppl-docs/docs/Guides/Lua/beginner","276"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/Guides/Lua/intermediate",component:d("/ppl-docs/docs/Guides/Lua/intermediate","d78"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/Guides/Other/fps-animation",component:d("/ppl-docs/docs/Guides/Other/fps-animation","ecf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/home",component:d("/ppl-docs/docs/home","0d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/Other/game-limits",component:d("/ppl-docs/docs/Other/game-limits","7a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/ppl-docs/docs/Other/level-design-principles",component:d("/ppl-docs/docs/Other/level-design-principles","9c1"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/ppl-docs/",component:d("/ppl-docs/","181"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(4625),i=n(545),s=n(8193);const l=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),c=n(6347),d=n(2831),f=n(4848);function p(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var h=n(5260),g=n(4586),m=n(6025),y=n(6342),b=n(1003),v=n(2131),w=n(4090),x=n(2967),k=n(440),S=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,v.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,c.zy)();return e+(0,k.applyTrailingSlash)((0,m.A)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.w})]}),n&&(0,f.jsx)(b.be,{image:n}),(0,f.jsx)(_,{}),(0,f.jsx)(E,{}),(0,f.jsx)(S.A,{tag:x.Cy,locale:e}),(0,f.jsx)(h.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(6125),P=n(6988),N=n(205);function j(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),j("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?j("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=j("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(O,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(c.qh,{location:t,render:()=>e})})}}const F=R,D="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${D}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n

\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(6921);const Z=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),I(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(i.vd,{children:(0,f.jsx)(o.Kd,{children:(0,f.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};I(window.location.pathname).then(s)}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/ppl-docs/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/ppl-docs/docs","mainDocId":"home","docs":[{"id":"APIs/Fmath","path":"/ppl-docs/docs/APIs/Fmath","sidebar":"tutorialSidebar"},{"id":"APIs/PewPew","path":"/ppl-docs/docs/APIs/PewPew","sidebar":"tutorialSidebar"},{"id":"APIs/standard-libraries","path":"/ppl-docs/docs/APIs/standard-libraries","sidebar":"tutorialSidebar"},{"id":"APIs/types","path":"/ppl-docs/docs/APIs/types","sidebar":"tutorialSidebar"},{"id":"File Information/manifest-files","path":"/ppl-docs/docs/File Information/manifest-files","sidebar":"tutorialSidebar"},{"id":"File Information/mesh-files","path":"/ppl-docs/docs/File Information/mesh-files","sidebar":"tutorialSidebar"},{"id":"File Information/sound-files","path":"/ppl-docs/docs/File Information/sound-files","sidebar":"tutorialSidebar"},{"id":"Guides/Lua/advanced","path":"/ppl-docs/docs/Guides/Lua/advanced","sidebar":"tutorialSidebar"},{"id":"Guides/Lua/beginner","path":"/ppl-docs/docs/Guides/Lua/beginner","sidebar":"tutorialSidebar"},{"id":"Guides/Lua/intermediate","path":"/ppl-docs/docs/Guides/Lua/intermediate","sidebar":"tutorialSidebar"},{"id":"Guides/Other/fps-animation","path":"/ppl-docs/docs/Guides/Other/fps-animation","sidebar":"tutorialSidebar"},{"id":"home","path":"/ppl-docs/docs/home","sidebar":"tutorialSidebar"},{"id":"Other/game-limits","path":"/ppl-docs/docs/Other/game-limits","sidebar":"tutorialSidebar"},{"id":"Other/level-design-principles","path":"/ppl-docs/docs/Other/level-design-principles","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/ppl-docs/docs/home","label":"home"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.1.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.1"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.40.1"}}}');var u=n(4848);const c={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(c);function f(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(8193),o=n(5260),i=n(440),s=n(5476),l=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(c,{error:t})]})}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(p,{fallback:()=>(0,l.jsx)(u,{error:t,tryAgain:n}),children:[(0,l.jsx)(o.A,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.A,{children:(0,l.jsx)(u,{error:t,tryAgain:n})})]})}const f=e=>(0,l.jsx)(d,{...e});class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??f)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(4625),o=n(440),i=n(4586),s=n(6654),l=n(8193),u=n(3427),c=n(6025),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.A)(),{withBaseUrl:x}=(0,c.h)(),k=(0,u.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=f||p;const _=(0,s.A)(E),C=E?.replace("pathname://","");let T=void 0!==C?(A=C,y&&(e=>e.startsWith("/"))(A)?x(A):A):void 0;var A;T&&_&&(T=(0,o.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const L=(0,r.useRef)(!1),P=n?a.k2:a.N_,N=l.A.canUseIntersectionObserver,j=(0,r.useRef)(),O=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,r.useEffect)((()=>(!N&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{N&&j.current&&j.current.disconnect()})),[j,T,N,_]);const I=T?.startsWith("#")??!1,R=!b.target||"_self"===b.target,F=!T||!_||!R||I;return m||!I&&F||k.collectLink(T),b.id&&k.collectAnchor(b.id),F?(0,d.jsx)("a",{ref:S,href:T,...E&&!_&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(P,{...b,onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,N&&e&&_&&(j.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(j.current.unobserve(e),j.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),j.current.observe(e))},to:T,...n&&{isActive:g,activeClassName:h}})}const p=r.forwardRef(f)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>l});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,h:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.z)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>g,vT:()=>f,Gy:()=>c,HW:()=>m,ht:()=>d,r7:()=>h,jh:()=>p});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function h(e){const t=d(e);return s(t)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return l(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(2719)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:f}}=(0,o.p)();if("h1"===t||!n)return(0,u.jsx)(t,{...c,id:void 0});d.collectAnchor(n);const p=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,u.jsxs)(t,{...c,className:(0,r.A)("anchor",f?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,u.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},5476:(e,t,n)=>{"use strict";n.d(t,{A:()=>Rt});var r=n(6540),a=n(4164),o=n(7489),i=n(1003),s=n(6347),l=n(1312),u=n(5062),c=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??h,{containerRef:n,onClick:r}=p();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(7559),y=n(4090);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(g,{className:b.skipToContent})}var w=n(6342),x=n(5041);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,x.Mj)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:T.announcementBarPlaceholder}),(0,c.jsx)(C,{className:T.announcementBarContent}),o&&(0,c.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var L=n(9876),P=n(3104);var N=n(9532),j=n(5600);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,L.M)(),t=(0,j.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(O.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(O);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,j.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:R(o)})),[a,o,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=F();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(5293),z=n(2303);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Q(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(Q),H={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.G)();return r?null:(0,c.jsx)(V,{className:t,buttonClassName:"dark"===n?H.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var q=n(3465);function G(){return(0,c.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,L.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(G,{}),(0,c.jsx)(W,{className:"margin-right--md"}),(0,c.jsx)(Y,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...u}=e;const d=(0,X.A)(r),f=(0,X.A)(t),p=(0,X.A)(a,{forcePrependBaseUrl:!0}),h=o&&a&&!(0,J.A)(a),g=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,h&&(0,c.jsx)(te.A,{...s&&{width:12,height:12}})]})};return a?(0,c.jsx)(Z.A,{href:l?p:a,...u,...g}):(0,c.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...u,...g})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,c.jsxs)("div",{ref:l,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.A)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:s.children??s.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(qe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[u,d,h]),(0,c.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.A)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(qe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,c.jsx)(r,{...n})}var he=n(2131);function ge(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";var ye=n(1088),be=n(5391),ve=n(5597),we=n(4070),xe=n(5891),ke=n(2384),Se=n(4471),Ee=n(7674),_e=n(6841),Ce=n(3810);const Te='',Ae='',Le='',Pe='',Ne='',je='',Oe='',Ie={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Re(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,u=1===n,c=[];i?c.push(je):s&&c.push(Oe);const d=c.map((e=>`${e}`)),f=`${l?Te:u?Ae:Le}`,p=[`${(0,Ce.C)(t.t,(0,Ee.g)(a,"t"),o)}`];if(!i&&!s&&ye.tb){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;p.push(`${(0,Se.$)(e??[])}`)}else l||p.push(`${(0,_e.Z)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const h=`${Pe}`;return[...d,f,``,...p,"",h].join("")}function Fe(){return`${Ne}${(0,l.T)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var De=n(2849),Me=n(3385);async function ze(){const e=await Promise.all([n.e(489),n.e(5741)]).then(n.t.bind(n,489,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Be="_highlight";const $e=function(e){let{handleSearchBarToggle:t}=e;const n=(0,z.A)(),{siteConfig:{baseUrl:a},i18n:{currentLocale:o}}=(0,le.A)(),i=(0,we.vT)();let u=a;try{const{preferredVersion:e}=(0,ve.g1)(i?.pluginId??ye.UB);e&&!e.isLast&&(u=e.path+"/")}catch(D){if(ye.I$&&!(D instanceof N.dV))throw D}const d=(0,s.W6)(),f=(0,s.zy)(),p=(0,r.useRef)(null),h=(0,r.useRef)(new Map),g=(0,r.useRef)(!1),[m,y]=(0,r.useState)(!1),[b,v]=(0,r.useState)(!1),[w,x]=(0,r.useState)(""),k=(0,r.useRef)(null),S=(0,r.useRef)(""),[E,_]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(ye.Hg))return;let e="";if(f.pathname.startsWith(u)){const t=f.pathname.substring(u.length);let n;for(const e of ye.Hg){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}S.current!==e&&(h.current.delete(e),S.current=e),_(e)}),[f.pathname,u]);const C=!!ye.O6&&Array.isArray(ye.Hg)&&""===E,T=(0,r.useCallback)((async()=>{if(C||h.current.get(E))return;h.current.set(E,"loading"),k.current?.autocomplete.destroy(),y(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,xe.Z)(u,E),ze()]);if(k.current=n(p.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,be.A)(Ie.searchBar,{[Ie.searchBarLeft]:"left"===ye.ZG}),noPrefix:!0,dropdownMenu:Ie.dropdownMenu,input:Ie.input,hint:Ie.hint,suggestions:Ie.suggestions,suggestion:Ie.suggestion,cursor:Ie.cursor,dataset:Ie.dataset,empty:Ie.empty}},[{source:(0,ke.m)(e,t,ye.AT),templates:{suggestion:Re,empty:Fe,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!E||!ye.dz))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),i=new URLSearchParams;let s;if(i.set("q",t),E){const e=E&&Array.isArray(ye.Hg)?ye.Hg.find((e=>"string"==typeof e?e===E:e.path===E)):E,t=e?(0,Me.p)(e,o).label:E;s=ye.dz&&n?(0,l.T)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:t}):(0,l.T)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:t})}else s=(0,l.T)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(ye.Hg)||ye.dz&&n||i.set("ctx",E),u!==a){if(!u.startsWith(a))throw new Error(`Version url '${u}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);i.set("version",u.substring(a.length))}const c=`${a}search?${i.toString()}`;return r.href=c,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),d.push(c))})),r})({query:t,isEmpty:n}),i=document.createElement("div");return i.className=Ie.hitFooter,i.appendChild(r),i}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;p.current?.blur();let o=n;if(ye.CU&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(Be,t);o+=`?${e.toString()}`}r&&(o+=r),d.push(o)})).on("autocomplete:closed",(()=>{p.current?.blur()})),h.current.set(E,"done"),y(!1),g.current){const e=p.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[C,E,u,a,d]);(0,r.useEffect)((()=>{if(!ye.CU)return;const e=n?new URLSearchParams(f.search).getAll(Be):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new ye.CU(t);n.unmark(),0!==e.length&&n.mark(e),x(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[n,f.search,f.pathname]);const[A,L]=(0,r.useState)(!1),P=(0,r.useCallback)((()=>{g.current=!0,T(),L(!0),t?.(!0)}),[t,T]),j=(0,r.useCallback)((()=>{L(!1),t?.(!1)}),[t]),O=(0,r.useCallback)((()=>{T()}),[T]),I=(0,r.useCallback)((e=>{x(e.target.value),e.target.value&&v(!0)}),[]),R=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!ye.WW)return;const e=e=>{!(R?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),p.current?.focus(),P())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[R,P]);const F=(0,r.useCallback)((()=>{const e=new URLSearchParams(f.search);e.delete(Be);const t=e.toString(),n=f.pathname+(""!=t?`?${t}`:"")+f.hash;n!=f.pathname+f.search+f.hash&&d.push(n),x(""),k.current?.autocomplete.setVal("")}),[f.pathname,f.search,f.hash,d]);return(0,c.jsxs)("div",{className:(0,be.A)("navbar__search",Ie.searchBarContainer,{[Ie.searchIndexLoading]:m&&b,[Ie.focused]:A}),hidden:C,children:[(0,c.jsx)("input",{placeholder:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:O,onFocus:P,onBlur:j,onChange:I,ref:p,value:w}),(0,c.jsx)(De.A,{className:Ie.searchBarLoadingRing}),ye.WW&&ye.pk&&(""!==w?(0,c.jsx)("button",{className:Ie.searchClearButton,onClick:F,children:"\u2715"}):n&&(0,c.jsxs)("div",{className:Ie.searchHintContainer,children:[(0,c.jsx)("kbd",{className:Ie.searchHint,children:R?"\u2318":"ctrl"}),(0,c.jsx)("kbd",{className:Ie.searchHint,children:"K"})]}))]})},Ue={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Qe(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.A)(n,Ue.navbarSearchContainer),children:t})}var Ve=n(1754);const He=e=>e.docs.find((t=>t.id===e.mainDocId));const We={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,le.A)(),f=(0,he.o)(),{search:p,hash:h}=(0,s.zy)(),g=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${h}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(pe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ge,{className:me}),m]}),items:g})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(Qe,{className:n,children:(0,c.jsx)($e,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,Ve.QB)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,Ve.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,Ve.Vd)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,s.zy)(),f=(0,we.zK)(n),p=(0,we.jh)(n),{savePreferredVersionName:h}=(0,ve.g1)(n),g=[...a,...p.map((e=>{const t=f.alternateDocVersions[e.name]??He(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>h(e.name)}})),...o],m=(0,Ve.Vd)(n)[0],y=t&&g.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&g.length>1?void 0:He(m).path;return g.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,c.jsx)(pe,{...i,mobile:t,label:y,to:b,items:g,isActive:r?()=>!1:void 0})}};function qe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=We[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function Ge(){const e=(0,L.M)(),t=(0,w.p)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(qe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ye(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ke(){const e=0===(0,w.p)().navbar.items.length,t=F();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ye,{onClick:()=>t.hide()}),t.content]})}function Ze(){const e=(0,L.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(D,{header:(0,c.jsx)(K,{}),primaryMenu:(0,c.jsx)(Ge,{}),secondaryMenu:(0,c.jsx)(Ke,{})}):null}const Xe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Je(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function et(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,L.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,P.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Xe.navbarHideable,!d&&Xe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Je,{onClick:i.toggle}),(0,c.jsx)(Ze,{})]})}var tt=n(440);const nt={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function rt(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function at(e){let{error:t}=e;const n=(0,tt.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:nt.errorBoundaryError,children:n})}class ot extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const it="right";function st(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function lt(){const{toggle:e,shown:t}=(0,L.M)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(st,{})})}const ut={colorModeToggle:"colorModeToggle_DEke"};function ct(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(ot,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(qe,{...e})},t)))})}function dt(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ft(){const e=(0,L.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??it)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,c.jsx)(dt,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(lt,{}),(0,c.jsx)(G,{}),(0,c.jsx)(ct,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ct,{items:r}),(0,c.jsx)(W,{className:ut.colorModeToggle}),!a&&(0,c.jsx)(Qe,{children:(0,c.jsx)($e,{})})]})})}function pt(){return(0,c.jsx)(et,{children:(0,c.jsx)(ft,{})})}function ht(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.A)(n),l=(0,X.A)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...i,children:[a,r&&!(0,J.A)(r)&&(0,c.jsx)(te.A,{})]})}function gt(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(ht,{item:t})},t.href??t.to)}function mt(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(gt,{item:e},t)))})]})}function yt(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(mt,{column:e},t)))})}function bt(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function vt(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(ht,{item:t})}function wt(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(vt,{item:e}),t.length!==n+1&&(0,c.jsx)(bt,{})]},n)))})})}function xt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(yt,{columns:t}):(0,c.jsx)(wt,{links:t})}var kt=n(1122);const St={footerLogoLink:"footerLogoLink_BH7S"};function Et(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(kt.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function _t(e){let{logo:t}=e;return t.href?(0,c.jsx)(Z.A,{href:t.href,className:St.footerLogoLink,target:t.target,children:(0,c.jsx)(Et,{logo:t})}):(0,c.jsx)(Et,{logo:t})}function Ct(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Tt(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function At(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(Tt,{style:a,links:n&&n.length>0&&(0,c.jsx)(xt,{links:n}),logo:r&&(0,c.jsx)(_t,{logo:r}),copyright:t&&(0,c.jsx)(Ct,{copyright:t})})}const Lt=r.memo(At),Pt=(0,N.fM)([M.a,x.oq,P.Tv,ve.VQ,i.Jx,function(e){let{children:t}=e;return(0,c.jsx)(j.y_,{children:(0,c.jsx)(L.e,{children:(0,c.jsx)(I,{children:t})})})}]);function Nt(e){let{children:t}=e;return(0,c.jsx)(Pt,{children:t})}var jt=n(1107);function Ot(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(jt.A,{as:"h1",className:"hero__title",children:(0,c.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(rt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(at,{error:t})})]})})})}const It={mainWrapper:"mainWrapper_z2l0"};function Rt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,y.J)(),(0,c.jsxs)(Nt,{children:[(0,c.jsx)(i.be,{title:s,description:l}),(0,c.jsx)(v,{}),(0,c.jsx)(A,{}),(0,c.jsx)(pt,{}),(0,c.jsx)("div",{id:d,className:(0,a.A)(m.G.wrapper.main,It.mainWrapper,r),children:(0,c.jsx)(o.A,{fallback:e=>(0,c.jsx)(Ot,{...e}),children:t})}),!n&&(0,c.jsx)(Lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),s=n(1122),l=n(4848);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.A)(t.src),dark:(0,a.A)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:c,titleClassName:d,...f}=e,p=(0,a.A)(s?.href||"/"),h=n?"":t,g=s?.alt??h;return(0,l.jsxs)(r.A,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(u,{logo:s,alt:g,imageClassName:c}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function u(e){let{className:t,children:n}=e;const u=(0,o.A)(),{colorMode:c}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>u});var r=n(6540),a=n(8193),o=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return f(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function h(e){if(!a.A.canUseDOM)return e?c:d}function g(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:c,style:u?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(c.current,n),i?.(n))},className:l,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,u]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&u(t)}),[a,t]),a?(0,s.jsx)(g,{...n,collapsed:l}):null}function y(e){let{lazy:t,...n}=e;const r=t?m:g;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>g,oq:()=>h});var r=n(6540),a=n(2303),o=n(9466),i=n(9532),s=n(6342),l=n(4848);const u=(0,o.Wf)("docusaurus.announcement.dismiss"),c=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===u.get(),f=e=>u.set(String(e)),p=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&f(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(p.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>m});var r=n(6540),a=n(8193),o=n(9532),i=n(9466),s=n(6342),l=n(4848);const u=r.createContext(void 0),c="theme",d=(0,i.Wf)(c),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,h=e=>a.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),g=e=>{d.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[a,o]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&g(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,l.jsx)(u.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(u);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>y,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),s=n(1754),l=n(9532),u=n(9466),c=n(4848);const d=e=>`docs-preferred-version-${e}`,f={save:(e,t,n)=>{(0,u.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.Wf)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const h=r.createContext(null);function g(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){f.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,c.jsx)(h.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return s.C5?(0,c.jsx)(m,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function b(){const e=(0,r.useContext)(h);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>u});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(s.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(s);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>h});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),s=n(9532);function l(e){!function(e){const t=(0,i.W6)(),n=(0,s._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6342),c=n(4848);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,u.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[i,s]=(0,r.useState)(!1);l((()=>{if(i)return s(!1),!1}));const c=(0,r.useCallback)((()=>{s((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function p(e){let{children:t}=e;const n=f();return(0,c.jsx)(d.Provider,{value:n,children:t})}function h(){const e=r.useContext(d);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>u,YL:()=>l,y_:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,a.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>p,w8:()=>m,C5:()=>f,B5:()=>E,Vd:()=>x,QB:()=>S,fW:()=>k,OF:()=>w,Y:()=>b});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),s=n(5597),l=n(2252),u=n(6588);function c(e){return Array.from(new Set(e))}var d=n(9169);const f=!!i.Gy;function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}const h=(e,t)=>void 0!==e&&(0,d.ys)(e,t),g=(e,t)=>e.some((e=>m(e,t)));function m(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||g(e.items,t))}function y(e,t){switch(e.type){case"category":return m(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||m(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,u.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,s.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,l.r)(),i=t.routes,s=i.find((e=>(0,a.B6)(n.pathname,e)));if(!s)return null;const u=s.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,o.v)(i),sidebarName:u,sidebarItems:c}}},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>d,Jx:()=>h});var r=n(6540),a=n(4164),o=n(5260),i=n(3102);function s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(6025),u=n(4586);var c=n(4848);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const s=function(e){const{siteConfig:t}=(0,u.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.h)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:s}),t&&(0,c.jsx)("meta",{property:"og:title",content:s}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),s=(0,a.A)(i,t);return(0,c.jsxs)(f.Provider,{value:s,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function h(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>u,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>c});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,gk:()=>p});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),s=n(4848);const l=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>l});n(6540);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,a.zy)(),u=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=s===i?e:e.replace(`/${s}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},2849:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(6540);var r=n(5391);const a={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var o=n(4848);function i(e){let{className:t}=e;return(0,o.jsxs)("div",{className:(0,r.A)(a.loadingRing,t),children:[(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{})]})}},5891:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(8291),a=n.n(r),o=n(1088);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.IH.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},2384:(e,t,n)=>{"use strict";n.d(t,{m:()=>l});var r=n(8291),a=n.n(r);var o=n(1088);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.BH);if(0===l.length)return void s([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:a.missed,term:a.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>o;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){o=t;const s={missed:a.missed,term:a.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.BH)if("en"===i)o.sx||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const a of s)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)l.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(l))}(l,t),c=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(c.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{$:()=>r})},3103:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Z:()=>r})},7674:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{g:()=>r})},6841:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(3103);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.Z)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.Z)(e)}`:(0,r.Z)(e):o.join("")}},3810:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(3103),a=n(6841);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var s=n(1088);function l(e,t,n,o){void 0===o&&(o=s.rG);const{chunkIndex:l,chunks:u}=function(e,t,n){const o=[];let s=0,l=0,u=-1;for(;sl){const t=i(e.substring(l,c)).map((e=>({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===u&&(u=o.length),l=c+d,o.push({html:(0,a.Z)(e.substring(c,l),n,!0),textLength:d})}}if(l({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:u,chunks:o}}(e,t,n),c=u.slice(0,l),d=u[l],f=[d.html],p=u.slice(l+1);let h=d.textLength,g=0,m=0,y=!1,b=!1;for(;h0){const e=c.pop();h+e.textLength<=o?(f.unshift(e.html),g+=e.textLength,h+=e.textLength):(y=!0,c.length=0)}else{if(!(p.length>0))break;{const e=p.shift();h+e.textLength<=o?(f.push(e.html),m+=e.textLength,h+=e.textLength):(b=!0,p.length=0)}}return(y||c.length>0)&&f.unshift("\u2026"),(b||p.length>0)&&f.push("\u2026"),f.join("")}},3385:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{p:()=>r})},1088:(e,t,n)=>{"use strict";n.d(t,{CU:()=>o,UB:()=>p,tb:()=>u,O6:()=>m,I$:()=>h,BH:()=>r,sx:()=>a,ZG:()=>f,WW:()=>c,pk:()=>d,Hg:()=>g,IH:()=>i,rG:()=>l,AT:()=>s,dz:()=>y});n(8291);const r=["en"],a=!1,o=null,i="search-index{dir}.json",s=8,l=50,u=!1,c=!0,d=!0,f="right",p=void 0,h=!0,g=null,m=!1,y=!1},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>p,sC:()=>A,AO:()=>f});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var a=p(n);a&&a!==h&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var s=l(t),g=l(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},8291:(e,t,n)=>{var r,a;!function(){var o,i,s,l,u,c,d,f,p,h,g,m,y,b,v,w,x,k,S,E,_,C,T,A,L,P,N,j,O,I,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=R.utils.clone(t)||{};l.position=[i,s],l.index=a.length,a.push(new R.Token(n.slice(i,o),l))}i=o+1}}return a},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:os?u+=2:i==s&&(t+=n[l+1]*r[u+1],l+=2,u+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new R.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new R.TokenSet;a.node.edges["*"]=s}if(0==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new R.TokenSet;a.node.edges["*"]=l}1==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new R.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),s=0;s1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(a.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new R.QueryParseError(r,a.start,a.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new R.QueryParseError(r,a.start,a.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new R.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=a)}()},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,i(e,c,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},5302:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,s="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(s+=e.slice(i,p),i=p+d.length,f)s+=f[1];else{var h=e[i],g=n[2],m=n[3],y=n[4],b=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var x=null!=g&&null!=h&&h!==g,k="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||c,_=y||b;r.push({name:m||o++,prefix:g||"",delimiter:E,optional:S,repeat:k,partial:x,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+l(E)+"]+?"})}}return i{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},64:()=>{Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var u=s[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),h=f.indexOf(p);if(h>-1){++a;var g=f.substring(0,h),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(h+p.length),b=[];g&&b.push.apply(b,i([g])),b.push(m),y&&b.push.apply(b,i([y])),"string"==typeof u?s.splice.apply(s,[l,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return s}(n.tokens)}}}})}(Prism)},2719:(e,t,n)=>{var r={"./prism-json":2514,"./prism-lua":64};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=2719},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n