diff --git a/.github/stale.yml b/.github/stale.yml index dc8a83080..d44497a17 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -3,7 +3,9 @@ daysUntilStale: 60 # Number of days of inactivity before a stale issue is closed daysUntilClose: 90 # Issues with these labels will never be considered stale -exemptLabels: [] +exemptLabels: + - 'type:epic' + - 'type:debt' # Label to use when marking an issue as stale staleLabel: 'state:stale' # Comment to post when marking an issue as stale. Set to `false` to disable diff --git a/.gitignore b/.gitignore index 8537fc545..5a4019a72 100644 --- a/.gitignore +++ b/.gitignore @@ -39,10 +39,15 @@ desktop\.ini .directory # Generated files +*.js.map +*.css.map src/typedefs/ct.js/types.d.ts app/data/ctLibJSDocAst.json +app/data/ct.shared/ctSound.js app/data/ct.release/** app/data/ct.shared/** +app/data/monaco-workers/** +app/data/codicon-TEAEXHHG.ttf app/examples app/templates app/bundledAssets @@ -69,7 +74,7 @@ app/exportDesktop app/temp /temp app/data/fonts/style/.css -app/data/patronsCache.csv +app/data/patronsCache.* builds build cache @@ -77,6 +82,7 @@ tempChangelog.md prev trash /Changelog.md +app/nightly # tests error_screenshots/ @@ -115,4 +121,3 @@ app/data/ct.libs/gamedistribution/.vscode/settings.json # neutralino binaries src/ct.release/desktopPack/bin src/ct.release/desktopPack/game/neutralino.js -app/data/ct.shared/ctSound.js diff --git a/.gitmodules b/.gitmodules index 7d649c007..8dd135fae 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "DragonBonesJS"] - path = DragonBonesJS - url = https://github.com/DragonBones/DragonBonesJS.git [submodule "SSCD.js"] path = SSCD.js url = https://github.com/CosmoMyzrailGorynych/SSCD.js.git diff --git a/README.md b/README.md index 8ac87c656..f35ac6270 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Ct.js as a game editor is a web application as well, based on the NW.js framewor **Ct.js was made to be the cross-platform, always accessible integrated tool** that is not stuck in time like most other 2D game engines that use dated renderers, limited feature sets, and have hindering UIs. Ct.js lets you focus on your game's content without worrying about technical details like asset packing and loading, handling different screen resolutions, packing for desktop, and such. -Ct.js is opinionated and gamedev-centric. To make a game, you do not need to know web development or how to summon a demon — all the tools and the knowledge are already in ct.js. +Ct.js is opinionated and gamedev-centric. To make a game, you do not need to know web development or how to summon a demon — all the tools and knowledge are already in ct.js. **And all this is to be free** — as in beer, as in freedom, and as a reproach towards companies too deep in their corporate greed. @@ -36,15 +36,15 @@ Ct.js is opinionated and gamedev-centric. To make a game, you do not need to kno # Production builds -See the [releases page](https://github.com/ct-js/ct-js/releases) or [jump to itch.io page](https://comigo.itch.io/ct). Available for Windows, Mac and Linux. +See the [releases page](https://github.com/ct-js/ct-js/releases) or [jump to the itch.io page](https://comigo.itch.io/ct). Available for Windows, Mac and Linux. # Nightly builds -We host [dev builds at itch.io](https://comigo.itch.io/ct-nightly). This page will have nightly versions that are built from the `develop` branch from our repository. It means that you will get the latest features, improvement, bug fixes, **and new bugs** daily, out of the oven. Use with caution and have fun. [Itch.io app](https://itch.io/app) is strongly recommended. +We host [dev builds at itch.io](https://comigo.itch.io/ct-nightly). This page will have nightly versions that are built from the `develop` branch of our repository. It means that you will get the latest features, improvements, bug fixes, **and new bugs** daily, out of the oven. Use with caution and have fun. [The itch.io app](https://itch.io/app) is strongly recommended. # Getting help -For bugs, feature requests, developing questions, please use [GitHub issues](https://github.com/ct-js/ct-js/issues) so we can better track them. For general support about making games, ask a question at our [discord server](https://discord.gg/yuvuDW5). +For bugs, feature requests, development questions, please use [GitHub issues](https://github.com/ct-js/ct-js/issues) so we can better track them. For general support about making games, ask a question at our [discord server](https://discord.gg/yuvuDW5). # Repo structure & tools @@ -52,10 +52,10 @@ For bugs, feature requests, developing questions, please use [GitHub issues](htt * `data` * `ct.libs` — catmods (modules) that ship with ct.js. Feel free to create a pull request with your module! * `i18n` — UI language schemes. Open for pull requests! :) -* `src` — a source folder that compile into `/app` folder at a build time. +* `src` — a source folder that compiles into `/app` folder at a build time. * `ct.release` — the ct.js game library, aka its "core" * `js` — different top-level scripts, including 3rd-party libraries. - * `node_requires` — built and copied to the `/app` directory. + * `node_requires` — built and copied to the `/app` directory. * `pug` — HTML sources of editor's windows, written in [Pug](https://pugjs.org/). * `riotTags` — components that drive UI logic in ct.js. Written in [Pug](https://pugjs.org/) and [Riot.js v3](https://v3.riotjs.now.sh/). * `styl` — style sheets, written in [Stylus](http://stylus-lang.com/). @@ -69,7 +69,7 @@ For bugs, feature requests, developing questions, please use [GitHub issues](htt See the [main dev board](https://github.com/orgs/ct-js/projects/5/views/7) for hot issues and plans for next releases. Prioritize the "Current release" column, then "To Do", then "Backlog", though if you really want a feature from a backlog to come true right here, right now, no one can stop you :) -Please leave a comment in issues you want to work on so that we can assign you to them and avoid occasional double work from several contributors. +Please leave a comment on issues you want to work on so that we can assign you to them and avoid occasional double work from several contributors. ## Forking and installing the dev environment @@ -89,9 +89,9 @@ gulp -f devSetup.gulpfile.js gulp ``` -Use `gulp dev` instead of just `gulp` to run a dev service with live-reloading without opening ct.js in its default manner. In either case, you can stop this service in the usual manner for your terminal, e.g. `Ctrl+C`. If you are encountering unexplained issues, especially when switching to a new branch, run `gulp -f devSetup.gulpfile.js` again. +Use `gulp dev` instead of just `gulp` to run a dev service with live reloading without opening ct.js in its default manner. In either case, you can stop this service in the usual manner for your terminal, e.g. `Ctrl+C`. If you are encountering unexplained issues, especially when switching to a new branch, run `gulp -f devSetup.gulpfile.js` again. -VSCode can use [this extension](https://marketplace.visualstudio.com/items?itemName=ruakr.vsc-nwjs) to run ct.js with an attached debugger. Before running the debugger, to allow live-reloading, run `gulp dev`. +VSCode can use [this extension](https://marketplace.visualstudio.com/items?itemName=ruakr.vsc-nwjs) to run ct.js with an attached debugger. Before running the debugger, to allow live reloading, run `gulp dev`. ## Linting @@ -114,14 +114,14 @@ gulp lintI18n It's actually easy and robust. We have [regular ct.js](https://comigo.itch.io/ct) for core releases and [ct.js Nightly](https://comigo.itch.io/ct-nightly) as a canary/preview build. -* Once your PR was approved and merged, it gets into the `develop` branch. +* Once your PR is approved and merged, it gets into the `develop` branch. * Every change to `develop` triggers a CI build, and a new version of [ct.js Nightly](https://comigo.itch.io/ct-nightly) is released publicly. * To automatically update ct.js Nightly, we recommend using [the official itch.io app](https://itch.io/app). -* Every now and then maintainers decide to release a public version of ct.js — it involves version bumping, creating and cleaning changelog, updating screenshot, website, presskit data and such. Some stuff is automated, but it still involves manual work and public announcements on different channels. But if your change got into `develop`, it means it will reach the `master` branch as well. +* Every now and then maintainers decide to release a public version of ct.js — it involves version bumping, creating and cleaning changelog, updating screenshots, website, presskit data and such. Some stuff is automated, but it still involves manual work and public announcements on different channels. But if your change gets into `develop``, it means it will reach the `master` branch as well. ### Releasing ct.js -This is left for emergencies only, as Gitlab CI should prepare binaries for github and send them to itch.io as well +This is left for emergencies only, as Gitlab CI should prepare binaries for GitHub and send them to itch.io as well ```sh # Builds docs and adds them to ct.js app @@ -143,7 +143,7 @@ gulp sendGithubDraft gulp deploy ``` -The first run will be slow as it will download nw.js binaries. Next runs will use cached files. +The first run will be slow as it will download nw.js binaries. The next runs will use cached files. ## Naming conventions and references @@ -154,3 +154,11 @@ Use [Comigo's CSS naming guide](https://cosmomyzrailgorynych.github.io/css-namin We have some references for ct.js' internals on [our wiki](https://github.com/ct-js/ct-js/wiki). The ct.js app has a built-in CSS stylebook in the Meta section of the main menu. + +## Patrons + +Ct.js is supported by these wonderful people: + +

+ +

diff --git a/app/Changelog.md b/app/Changelog.md index 35afde62c..ee22c5f3e 100644 --- a/app/Changelog.md +++ b/app/Changelog.md @@ -1,3 +1,118 @@ +## v5.0.0 + +*Sat Jun 15 2024* + +### ✨ New Features + +* Add a custom error display in games so players can more easily report failures. Add a toggle to disable error reporting in-game and a field to specify a custom repor link. +* Add a method `tween.value` to the `tween` catmod, and add a Catnip block to animate arbitrary computed values. +* Add an option to main menu to autoapply asset changes before launching a game +* Add community's learning resources and games to the starting screen +* Allow using bitmap labels in buttons and textboxes, and introduce a new base class for Bitmap Text labels. Add an option to increase bitmap font rendering that fixes issues with bitmap fonts +* Behaviors: add Behavior added and Behavior removed events +* Context menu item for styles to create a template with a Text base class from it +* Customize debugger's layout: split-screen, multi-windowed, and automatic (based on the screen count) +* New programming language: Catnip +* New UI themes: + * Alma Sakura + * Golden Eye + * One Dark Pro + * Synthwave '84 +* `room.makeCopyAligned` and `room.makeCopyAlignedRef` methods to dynamically add copies that align to camera's boundaries, in the same way you set up them in room editor's UI tools. +* Specify additional typedefs for JS properties of behaviors, templates, and rooms. Available for JavaScript projects only. + +### ⚡️ General Improvements + +* :bento: Update the `light` catmod for ct.js v5 +* Add `'neutralino'` case to `u.getEnvironment` (Closes #517) +* Add additional checks for extended fields and fields in asset types. Fixes not being able to use array fields for asset types in content schemas +* Align table cells to the top +* Improve layout of project scripts +* Improve performance of afterDraw injection of matter.js catmod +* Internal: `'always strict'` on ct.IDE's compiled TS files +* Internal: Enforce stricter type checks in ct.js client library +* Internal: Bundle most node_modules and ct.IDE's scripts into one file. This makes loading ct.IDE faster, as well as reduces the bundle size and install time. It also drops `--mixed-context` nw.js flag. +* Internal: Update `nw-builder` to v4.7.4 +* Limit max project name length +* Relayout the debugger screen to open the console in another window. Solves issues with JS breakpoints and "stop on exception" button +* Remember opened assets when a project is saved, and reopen them when a project is loaded +* Rename "editor" to "engine" in the ct.js' devtools banner +* Replace `resedit-cli` with `resedit` for ct.IDE: removes dependency for node.js in desktop exporter. +* Rework ct.js games' CSS to be less invasive to 3rd-party widgets and such +* Rework font asset type into typefaces +* Update patrons screen and move its logic into a module +* Update QR code generator for game debugger + +### 🐛 Bug Fixes + +* Add a safeguard to `tween.add` to not update values if the animated object was `kill`ed. +* Add proper handling of missing event declaration. Warn user about events that use missing catmods when exporting a project and in a template editro +* Fix `updateWindowMenu` error appearing on non-MacOS devices +* Fix ancient settings for monaco editor that showed errors on ES5+ features +* Fix being able to get several context menus by right-clicking other stuff with an already opened menu +* Fix being able to select game canvas on iOS browsers +* Fix built-in asset gallery not being accessible on Mac +* Fix canvases and code editors in tandem, style, room and scriptable editors disappearing after opening a tab -> switching to another one -> resizing window -> going back to the tab with a code editor or a pixi.js canvas. +* Fix cases when content types' typedefs were not updated +* Fix copy alignment being bound to copy-pasted copies in the room editor +* Fix copy rearrangement effects resetting upon reopening a room. +* Fix emitter's rectangular shapes being misaligned +* Fix error spam about uninicialized position and scale changes in `room-entities-properties` +* Fix monaco-editors hotkeys for changing font size +* Fix old current room name in `templates.copy` documentation +* Fix SnapTarget in room editor interfering with clicks on canvas +* Fix `templates.each` method. It can also be used with arrow function now, too, as it passes a copy to the first argument of your function. +* Fix textboxes' html inputs remaining on screen when a room changes +* Fix the `tween` catmods throwing errors despite using the `silent: true` option or `.catch` handlers +* Internal: Fix `gulp docs` failing on windows with new node.js versions +* Internal: Fix context-menu tags overwriting their `ref` attribute with "root" +* Internal: Fix devSetup.gulpfile.js failing on Node.js v20.13+ and Windows +* Internal: Rename properties of context-menu tag so it doesn't pull in global values +* Make monaco-editor pass Ctrl+S, F5 & Alt+F5 hotkeys to ct.IDE so you can save/launch projects while in a code editor +* Minor visual fixes for tabs +* Prevent dragging sound thumbnails in the sound editor + +### 🍱 Demos, Dependencies and Stuff + +* Gallery: Add textures for buttons and panels +* Add tutorial projects ported to Catnip by @firecakes +* Add a Catnip example of LabRaid +* Pull the latest docs +* Rename examples by tagging them with used language, remove two unsupported examples +* Update Comments and Debug translation files +* Update the list of boosters + +### 📝 Docs + +* :bug: Example code error (Follow a copy of a template called "Character") Fixes #133 +* :bug: Grammar fixes on homepage +* :bug: Make the patrons list centered +* Add a patron list to README.md +* Add Catnip examples to ct.js tutorials +* Add Learn Catnip category +* 100% russian documentation translation +* Move a couple comments in catnip's declarationExtractor to a proper place + +### 🌐 Website + +* :bug: Fix the broken "games made with ct.js section", put a button to submit a game +* :bug: Set unique names for forms +* :construction: I may have summoned demons +* :globe_with_meridians: Add Chinese Simplified translation (#44 by @emaoshushu) +* :globe_with_meridians: Add Japanese translation (#45 by @taxi13245) +* :sparkles: Add forms for submitting games and learning resources +* :sparkles: Create an embeddable widget with supporters +* :zap: Add a honeypot for all the fields +* :zap: Add patrons panel to homepage +* :zap: Update wording on the homepage +* Add a nice language comparison thingie + +### 👾 Misc + +* :fire: Internal: Delete now unused `app/projects` folder from the repo +* :fire: Internal: Remove the `DragonBones` submodule +* :globe_with_meridians: Update Russian UI translation file + ## v4.0.2 *Sun Feb 25 2024* diff --git a/app/data/boosters.yaml b/app/data/boosters.yaml deleted file mode 100644 index 3995dbe99..000000000 --- a/app/data/boosters.yaml +++ /dev/null @@ -1,9 +0,0 @@ -cats: -- Dēmētrius ille -- GAKONS - -businessCats: -- Chocopelli -- Lawrence Chrysler - -sponsors: [] diff --git a/app/data/ct.libs/desktop/module.json b/app/data/ct.libs/desktop/module.json index d6922e218..255abda15 100644 --- a/app/data/ct.libs/desktop/module.json +++ b/app/data/ct.libs/desktop/module.json @@ -3,6 +3,7 @@ "name": "Desktop features", "tagline": "A module that provides useful desktop-specific features, such as manipulating the window, toggling the debugger/devtools, and more!", "version": "0.3.0", + "icon": "monitor", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/gamepad/module.json b/app/data/ct.libs/gamepad/module.json index 6e70ec04a..355fefa39 100644 --- a/app/data/ct.libs/gamepad/module.json +++ b/app/data/ct.libs/gamepad/module.json @@ -4,6 +4,7 @@ "tagline": "Connect your gamepad to the Actions system.", "name_Ru": "Геймпад", "tagline_Ru": "Подключает джойстики к системе Действий.", + "icon": "airplay", "version": "2.0.0", "packageName": "gamepad", "authors": [ diff --git a/app/data/ct.libs/keyboard/module.json b/app/data/ct.libs/keyboard/module.json index ebccfc33a..b5252a3ac 100644 --- a/app/data/ct.libs/keyboard/module.json +++ b/app/data/ct.libs/keyboard/module.json @@ -2,6 +2,7 @@ "main": { "name": "Keyboard", "tagline": "Add keyboard events to the Actions system.", + "icon": "airplay", "name_Ru": "Клавиатура", "tagline_Ru": "Добавляет события клавиатуры в систему Действий.", "version": "4.0.0", diff --git a/app/data/ct.libs/keyboard/types.d.ts b/app/data/ct.libs/keyboard/types.d.ts index a539cb2c9..54ff33bb3 100644 --- a/app/data/ct.libs/keyboard/types.d.ts +++ b/app/data/ct.libs/keyboard/types.d.ts @@ -35,12 +35,6 @@ declare namespace keyboard { */ var ctrl: boolean; - /** - * Temporarily suspend e.preventDefault() calls. For example, to allow for a HTML text - * box to be used. - */ - var permitDefault: boolean; - /** * Resets all the `ct.keyboard` parameters. */ diff --git a/app/data/ct.libs/light/index.js b/app/data/ct.libs/light/index.js index daedd8159..194258863 100644 --- a/app/data/ct.libs/light/index.js +++ b/app/data/ct.libs/light/index.js @@ -17,16 +17,16 @@ const light = (function addCtLight() { * @returns {PIXI.Sprite} */ add(texture, x, y, options) { - const light = new PIXI.Sprite(texture); - light.blendMode = PIXI.BLEND_MODES.ADD; - light.x = x; - light.y = y; + const l = new PIXI.Sprite(texture); + l.blendMode = PIXI.BLEND_MODES.ADD; + l.x = x; + l.y = y; if (options) { - Object.assign(light, options); + Object.assign(l, options); } - lightLayer.addChild(light); - light.lights.push(light); - return light; + lightLayer.addChild(l); + light.lights.push(l); + return l; }, /** * @param {PIXI.Texture | PIXI.Sprite} copyOrLight @@ -58,27 +58,29 @@ const light = (function addCtLight() { lightSprite.width = Math.ceil(camera.width); lightSprite.height = Math.ceil(camera.height); } - renderer.render(lightLayer, renderTexture); + renderer.render(lightLayer, { + renderTexture: renderTexture + }); }, - updateOne(light) { - if (light.owner) { - if (!templates.valid(light.owner)) { - light.remove(light); + updateOne(l) { + if (l.owner) { + if (!templates.valid(l.owner)) { + l.remove(l); return; } - light.transform.setFromMatrix(light.owner.worldTransform); - light.scale.x *= light.scaleFactor || 1; - light.scale.y *= light.scaleFactor || 1; - light.angle -= light.rotationFactor || 0; - if (light.copyOpacity) { - light.alpha = light.owner.alpha; + l.transform.setFromMatrix(l.owner.worldTransform); + l.scale.x *= l.scaleFactor || 1; + l.scale.y *= l.scaleFactor || 1; + l.angle -= l.rotationFactor || 0; + if (l.copyOpacity) { + l.alpha = l.owner.alpha; } } }, update() { rooms.current.updateTransform(); - for (const light of light.lights) { - light.updateOne(light); + for (const l of light.lights) { + light.updateOne(l); } }, clear() { @@ -114,5 +116,6 @@ const light = (function addCtLight() { light.render(); } }; + return light; })(); window.light = light; diff --git a/app/data/ct.libs/light/injections/beforeroomoncreate.js b/app/data/ct.libs/light/injections/beforeroomoncreate.js index d2d41ef5d..950bc7626 100644 --- a/app/data/ct.libs/light/injections/beforeroomoncreate.js +++ b/app/data/ct.libs/light/injections/beforeroomoncreate.js @@ -1,4 +1,4 @@ if (this === rooms.current) { light.clear(); - light.ambientColor =u.hexToPixi(rooms.current.lightAmbientColor || '#FFFFFF'); + light.ambientColor = u.hexToPixi(rooms.current.lightAmbientColor || '#FFFFFF'); } diff --git a/app/data/ct.libs/light/module.json b/app/data/ct.libs/light/module.json index cb8a1bebe..1c1fbece3 100644 --- a/app/data/ct.libs/light/module.json +++ b/app/data/ct.libs/light/module.json @@ -4,7 +4,7 @@ "name_Ru": "Система освещения", "tagline": "Create dynamic lights with textures that follow your copies.", "tagline_Ru": "Создавай динамические источники света, прикреплённые к копиям, с помощью текстур.", - "version": "1.0.0", + "version": "2.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/matter/injections/afterdraw.js b/app/data/ct.libs/matter/injections/afterdraw.js index 5d04d1df7..23b3d6f24 100644 --- a/app/data/ct.libs/matter/injections/afterdraw.js +++ b/app/data/ct.libs/matter/injections/afterdraw.js @@ -1,9 +1,6 @@ -if (this.matterEnable) { +if (this.matterEnable && !this.matterStatic) { this.rotation = this.matterBody.angle; - this.x = this.matterBody.position.x; - this.y = this.matterBody.position.y; - //this.speed = this.matterBody.speed; + this.position.set(this.matterBody.position.x, this.matterBody.position.y); this.hspeed = this.matterBody.velocity.x; this.vspeed = this.matterBody.velocity.y; - //this.direction = u.pdn(this.hspeed, this.vspeed); } diff --git a/app/data/ct.libs/matter/injections/htmlbottom.html b/app/data/ct.libs/matter/injections/htmltop.html similarity index 100% rename from app/data/ct.libs/matter/injections/htmlbottom.html rename to app/data/ct.libs/matter/injections/htmltop.html diff --git a/app/data/ct.libs/place/blocks.js b/app/data/ct.libs/place/blocks.js new file mode 100644 index 000000000..008f7ea59 --- /dev/null +++ b/app/data/ct.libs/place/blocks.js @@ -0,0 +1,59 @@ +module.exports = [{ + name: 'Move this copy along a line stopping at', + name_Ru: 'Переместить эту копию по линии, останавливаясь перед', + type: 'command', + code: 'move template bullet', + icon: 'move', + category: 'Movement', + pieces: [{ + type: 'argument', + key: 'cgroup', + typeHint: 'string', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }], + jsTemplate: (values) => { + if (values.return !== 'undefined') { + return `${values.return} = this.moveBullet(${values.cgroup}, ${values.precision || 1});`; + } + return `this.moveBullet(${values.cgroup}, ${values.precision || 1});`; + } +}, { + name: 'Move this copy stopping at', + name_Ru: 'Переместить эту копию, останавливаясь перед', + type: 'command', + code: 'move template smart', + icon: 'move', + category: 'Movement', + pieces: [{ + type: 'argument', + key: 'cgroup', + typeHint: 'string', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }], + jsTemplate: (values) => { + if (values.return !== 'undefined') { + return `${values.return} = this.moveSmart(${values.cgroup}, ${values.precision || 1});`; + } + return `this.moveSmart(${values.cgroup}, ${values.precision || 1});`; + } +}]; diff --git a/app/data/ct.libs/place/module.json b/app/data/ct.libs/place/module.json index 8382c69d0..97f241ba3 100644 --- a/app/data/ct.libs/place/module.json +++ b/app/data/ct.libs/place/module.json @@ -4,6 +4,7 @@ "tagline": "Check for collisions, move copies continuously, and add basic collision avoidance to your copies.", "tagline_Ru": "Проверяет столкновения, последовательно передвигает копии и предоставляет простые методы обхода препятствий вашим копиям.", "version": "4.0.0", + "icon": "copy", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/place/types.d.ts b/app/data/ct.libs/place/types.d.ts index beb5b2a5a..b5453b8ef 100644 --- a/app/data/ct.libs/place/types.d.ts +++ b/app/data/ct.libs/place/types.d.ts @@ -72,6 +72,10 @@ declare namespace place { * @param {IShapeBearer} c1 The first object to check collision with * @param {IShapeBearer} c2 The second object to check collision against * + * @catnipLabel are colliding + * @catnipLabel_Ru сталкиваются + * @catnipIcon copy + * * @returns {boolean} `true` if there was a collision, `false` otherwise */ function collide(c1: IShapeBearer, c2: IShapeBearer): boolean; @@ -98,6 +102,7 @@ declare namespace place { * * @param {Copy} me The object to check collisions on * @param {String} [cgroup] The collision group to check against + * @catnipName_Ru свободно */ function free(me: Copy, cgroup?: string): boolean; @@ -111,6 +116,7 @@ declare namespace place { * @param {String} [cgroup] The collision group to check against * @returns {Copy|PIXI.Sprite|false} The collided copy or tile, or `false` * if there is no collision. + * @catnipName_Ru занято */ function occupied(me: Copy, x: number, y: number, cgroup?: string): Copy | PIXI.Sprite | false; @@ -123,8 +129,13 @@ declare namespace place { * @param {String} [cgroup] The collision group to check against * @returns {Copy|PIXI.Sprite|false} The collided copy, or `false` * if there were no collisions. + * @catnipName_Ru занято */ function occupied(me: Copy, cgroup?: string): Copy | false; + /** + * @catnipName all occupying + * @catnipName_Ru все занимающие место + */ function occupiedMultiple(me: Copy, cgroup?: string): Array | false; function occupiedMultiple(me: Copy, x: number, y: number, cgroup?: string): Array | false; @@ -142,7 +153,10 @@ declare namespace place { * @param {number} x The x coordinate to check, as if `me` was placed there * @param {number} y The y coordinate to check, as if `me` was placed there * @param {String} [template] The name of the template to check against + * @catnipAsset template:template * @returns {Copy|false} The collided copy or `false`, if there was no collision. + * @catnipName occupied by a template + * @catnipName_Ru занято шаблоном */ function meet(me: Copy, x: number, y: number, template: string): Copy | false; /** @@ -151,9 +165,14 @@ declare namespace place { * * @param {Copy} me The object to check collisions on * @param {String} [template] The name of the template to check agains + * @catnipAsset template:template * @returns {Copy|Array} The collided copy or `false`, if there was no collision. */ function meet(me: Copy, template: string): Copy | false; + /** + * @catnipName all template's occupying copies + * @catnipName_Ru все занимающие место копии шаблона + */ function meetMultiple(me: Copy, template: string): Array; function meetMultiple(me: Copy, x: number, y: number, template: string):Array; @@ -170,9 +189,15 @@ declare namespace place { * @param {number} [x] The x coordinate to check, as if `me` was placed there. * @param {number} [y] The y coordinate to check, as if `me` was placed there. * @param {number} cgroup The collision group of tile layers to test against. + * @catnipName occupied by a tile + * @catnipName_Ru занято плиткой */ function tiles(me: Copy, x: number, y: number, cgroup: string): false|PIXI.Sprite; function tiles(me: Copy, cgroup: string): false|PIXI.Sprite; + /** + * @catnipName all occupying tiles + * @catnipName_Ru все занимающие место плитки + */ function tilesMultiple(me: Copy, x: number, y: number, cgroup: string): false|PIXI.Sprite[]; function tilesMultiple(me: Copy, cgroup: string): false|PIXI.Sprite[]; @@ -189,14 +214,22 @@ declare namespace place { * @param {number} [x] The x coordinate to check, as if `me` was placed there. * @param {number} [y] The y coordinate to check, as if `me` was placed there. * @param {number} cgroup The collision group of tile layers to test against. + * @catnipName occupied by a copy + * @catnipName_Ru занято копией */ function copies(me: Copy, x: number, y: number, cgroup: string): false|Copy; function copies(me: Copy, cgroup: string): false|Copy; + /** + * @catnipName all occupying copies + * @catnipName_Ru все занимающие место копии + */ function copiesMultiple(me: Copy, x: number, y: number, cgroup: string): false|Copy[]; function copiesMultiple(me: Copy, cgroup: string): false|Copy[]; /** * Returns the latest distance after calling `ct.place.furthest` or `ct.place.nearest`. + * @catnipName last distance + * @catnipName_Ru последнее расстояние */ var lastdist: number; @@ -206,6 +239,8 @@ declare namespace place { * @param {number} y The vertical position of the starting point * @param {string} template The name of the template against which copies * the distance will be measured + * @catnipAsset template:template + * @catnipName_Ru ближайший */ function nearest(x: number, y: number, template: string): Copy | false; @@ -215,6 +250,8 @@ declare namespace place { * @param {number} y The vertical position of the starting point * @param {string} template The name of the template against which copies * the distance will be measured + * @catnipAsset template:template + * @catnipName_Ru наиболее удалённый */ function furthest(x: number, y: number, template: string): Copy | false; @@ -225,10 +262,6 @@ declare namespace place { * This function is especially useful for side-view games and any fast-moving copies, * as it allows precise movement without clipping or passing through surfaces. * - * @remarks - * You will usually need to premultiply `maxLength` with `u.delta` - * so that the speed is consistent under different FPS rates. - * * @param {Copy} me The copy that needs to be moved * @param {number} direction The direction in which to perform a movement * @param {number} maxLength The maximum distance a copy can traverse @@ -238,6 +271,10 @@ declare namespace place { * @returns {Copy|boolean} If there was no collision and a copy reached its target, * returns `false`. If a copy met an obstacle as another copy, returns this copy. * If there was a tile, returns `true`. + * + * @catnipSaveReturn + * @catnipName Move a copy along a line + * @catnipName_Ru Передвинуть копию вдоль линии */ function moveAlong( me: Copy, direction: number, maxLength: number, cgroup?: string, stepSize?: number @@ -250,10 +287,6 @@ declare namespace place { * and set precision with `stepSize` (default is `1`, which means pixel-by-pixel movement). * This movement suits characters in top-down and side-view worlds. * - * @remarks - * You will usually need to premultiply `dx` and `dy` with `u.delta` - * so that the speed is consistent under different FPS rates. - * * @param {Copy} me The copy that needs to be moved * @param {number} dx Amount of pixels to move by X axis * @param {number} dy Amount of pixels to move by Y axis @@ -262,6 +295,10 @@ declare namespace place { * @param {number} [stepSize=1] Precision of movement * @returns {false|ISeparateMovementResult} `false` if it reached its target, * an object with each axis specified otherwise. + * + * @catnipSaveReturn + * @catnipName Move a copy by distance + * @catnipName_Ru Передвинуть копию на расстояние */ function moveByAxes(me: Copy, dx: number, dy: number, cgroup?: string, stepSize?: number): false | ISeparateMovementResult; @@ -283,6 +320,8 @@ declare namespace place { * (usually the speed of a copy) * @param {string} cgroup The collision group to test against. If not defined, * will test against all the copies + * @catnipName Move a copy avoiding obstacles + * @catnipName_Ru Передвинуть копию, обходя препятствия */ function go(me: Copy, x: number, y: number, length: number, cgroup?: string): void; @@ -373,6 +412,8 @@ declare namespace place { * Enables collision checks on the specified tilemap, with an optional collision group. * @param {Tilemap} tilemap The tilemap on which to enable collisions. * @param {string} cgroup Collision group. + * @catnipName Enable tilemap collisions + * @catnipName_Ru Включить столкновения у слоя тайлов */ function enableTilemapCollisions(tilemap: Tilemap, cgroup?: string): void; } diff --git a/app/data/ct.libs/pointer/index.js b/app/data/ct.libs/pointer/index.js index 44a15c22b..2c3203229 100644 --- a/app/data/ct.libs/pointer/index.js +++ b/app/data/ct.libs/pointer/index.js @@ -112,7 +112,8 @@ const pointer = (function mountCtPointer() { } }; var handleMove = function (e) { - if (settings.preventDefault) { + // Allow default browser events inside error messages + if (settings.preventDefault && !(e.target.closest && e.target.closest('.ct-Errors'))) { e.preventDefault(); } let pointerHover = pointer.hover.find(p => p.id === e.pointerId); @@ -136,7 +137,8 @@ const pointer = (function mountCtPointer() { } }; var handleDown = function (e) { - if (settings.preventDefault) { + // Allow default browser events inside error messages + if (settings.preventDefault && !(e.target.closest && e.target.closest('.ct-Errors'))) { e.preventDefault(); } pointer.type = e.pointerType; @@ -148,7 +150,8 @@ const pointer = (function mountCtPointer() { } }; var handleUp = function (e) { - if (settings.preventDefault) { + // Allow default browser events inside error messages + if (settings.preventDefault && !(e.target.closest && e.target.closest('.ct-Errors'))) { e.preventDefault(); } const p = pointer.down.find(p => p.id === e.pointerId); @@ -162,7 +165,8 @@ const pointer = (function mountCtPointer() { }; var handleWheel = function handleWheel(e) { setKey('Wheel', ((e.wheelDelta || -e.detail) < 0) ? -1 : 1); - if (settings.preventDefault) { + // Allow default browser events inside error messages + if (settings.preventDefault && !(e.target.closest && e.target.closest('.ct-Errors'))) { e.preventDefault(); } }; diff --git a/app/data/ct.libs/pointer/module.json b/app/data/ct.libs/pointer/module.json index 7ef872408..78b0be6bc 100644 --- a/app/data/ct.libs/pointer/module.json +++ b/app/data/ct.libs/pointer/module.json @@ -5,6 +5,7 @@ "tagline": "A uniform API for any type of pointer devices, be it touchscreens, pen tablets, or mouse.", "tagline_Ru": "Единый API для всех видов указателей — мышек, тач-экранов, графических планшетов и т.д.", "version": "1.0.1", + "icon": "ui", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/pointer/types.d.ts b/app/data/ct.libs/pointer/types.d.ts index d027d413b..1a03523db 100644 --- a/app/data/ct.libs/pointer/types.d.ts +++ b/app/data/ct.libs/pointer/types.d.ts @@ -89,8 +89,17 @@ interface IPointer { } declare namespace pointer { + /** + * @catnipIgnore + */ var hover: IPointer[]; + /** + * @catnipIgnore + */ var down: IPointer[]; + /** + * @catnipIgnore + */ var released: IPointer[]; /** The horizontal position at which the primary pointer is positioned. */ var x: number; @@ -234,11 +243,6 @@ declare namespace pointer { function isButtonPressed(button: PointerButtonName, pointer: IPointer): boolean; function lock(): void; function unlock(): void; - /** - * Temporarily suspend e.preventDefault() calls. For example, to allow for a HTML text - * box to be used. - */ - var permitDefault: boolean; /** * Equals to `true` when the pointer is locked. * Note that the pointer can still be unlocked while the locking mode is on, diff --git a/app/data/ct.libs/random/index.js b/app/data/ct.libs/random/index.js index 8bb516c4e..205f3aad8 100644 --- a/app/data/ct.libs/random/index.js +++ b/app/data/ct.libs/random/index.js @@ -3,12 +3,23 @@ const random = function random(x) { return Math.random() * x; }; +function processRandomInput(input) { + if (input.length === 1 && typeof input[0] === "string") { + return input[0].split(","); + } + return input; +} Object.assign(random, { dice(...variants) { - return variants[Math.floor(Math.random() * variants.length)]; + const dices = processRandomInput(variants); + if (Array.isArray(dices) && dices.length > 0) { + const result = dices[Math.floor(Math.random() * dices.length)]; + const parsedResult = parseFloat(result); + return isNaN(parsedResult) ? result : parsedResult; + } }, histogram(...histogram) { - const coeffs = [...histogram]; + const coeffs = [...processRandomInput(histogram)]; let sumCoeffs = 0; for (let i = 0; i < coeffs.length; i++) { sumCoeffs += coeffs[i]; diff --git a/app/data/ct.libs/random/module.json b/app/data/ct.libs/random/module.json index 11b795543..460d8b39f 100644 --- a/app/data/ct.libs/random/module.json +++ b/app/data/ct.libs/random/module.json @@ -3,6 +3,7 @@ "name": "random", "tagline": "Compute random stuff!", "tagline_Ru": "Вычисляй случайные значения!", + "icon": "sort-numerically", "version": "2.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", diff --git a/app/data/ct.libs/random/types.d.ts b/app/data/ct.libs/random/types.d.ts index 665ca5b51..ebd56e902 100644 --- a/app/data/ct.libs/random/types.d.ts +++ b/app/data/ct.libs/random/types.d.ts @@ -6,16 +6,18 @@ interface IPoint { /** Returns a random float value between 0 and x, exclusive. */ declare function random(x: number): number; declare namespace random { - /** Returns a random given argument. */ + /** + * Returns random argument from comma separated arguments (without spaces): + * Numbers will return float. Words will return string. These can be mixed. + */ function dice(...dices: T[]): T; function dice(...dices: any): any; /** * Returns a weighted random number from 0 to 1 according to a given histogram. * Each argument defines the probability of a random value to appear in a bucket. - * @example If you call `ct.random.histogram(1, 10)`, the method will return values - * in a range [0.5;1) ten times more often than in a range [0;0.5). - * @example If you call `ct.random.histogram(1, 10, 2)`, the method will return values + * Example: + * If you call `random.histogram(1, 10, 2)`, the method will return values * in a range [0.333;0.667) ten times more often than in a range [0;0.333) * and five times more often than in a range [0.667;1). */ @@ -38,13 +40,19 @@ declare namespace random { /** Returns a random float value between `x1` and `x2`, exclusive. */ function range(x1: number, x2: number): number - /** Returns a random float value between 0 and 360, exclusive. */ + /** + * Returns a random float value between 0 and 360, exclusive. + * @catnipName random angle + */ function deg(): number; /** Returns a pair of random coordinates from 0 to a corresponding room side. */ function coord(): IPoint; - /** Returns a random element from the passed array */ + /** + * Returns a random element from the passed array + * @catnipName random from array + */ function from(a: T[]): T; function from(a: any[]): any; @@ -56,15 +64,30 @@ declare namespace random { */ function text(text: string): string; - /** When given both `x` and `y`, randomly returns `true` approximately `x` times out of `y`. When given only a value between 0…100, returns `true` approximately `x` times out of 100. E.g. `ct.random.chance(30)` means a 30% success rate. */ + /** + * When given both `x` and `y`, randomly returns `true` approximately `x` times + * out of `y`. When given only a value between 0…100, returns `true` + * approximately `x` times out of 100. E.g. `random.chance(30)` means + * a 30% success rate. + */ function chance(x: number, y?: number): boolean; - /** Returns next seeded random number. */ + /** + * Returns next seeded random number. + */ function seeded(): number; - /** Sets the seed of the `ct.random.seeded()` method. */ + /** + * Sets the seed of the `random.seeded()` method. + * @catnipName Set the seed for the "random seeded" block + */ function setSeed(seed: number): void; - /** Creates a new seeded random number generator. It is a function that you can store and use in the same way as `ct.random.seeded()`. */ + /** + * Creates a new seeded random number generator. It is a function that you can store + * and use in the same way as `random.seeded()`. + * @catnipName Create a seeded randomizer function with seed + * @catnipSaveReturn + */ function createSeededRandomizer(seed: number): () => number; } diff --git a/app/data/ct.libs/splashscreen/module.json b/app/data/ct.libs/splashscreen/module.json index 1feef79c9..08c119b0e 100644 --- a/app/data/ct.libs/splashscreen/module.json +++ b/app/data/ct.libs/splashscreen/module.json @@ -4,6 +4,7 @@ "name_Ru": "Вступительный экран-обложка", "tagline": "Create splash screens at project settings.", "tagline_Ru": "Создай вступительное интро с помощью настроек проекта.", + "icon": "monitor", "version": "0.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", diff --git a/app/data/ct.libs/sprite/module.json b/app/data/ct.libs/sprite/module.json index 375f24032..0c4faa2f1 100644 --- a/app/data/ct.libs/sprite/module.json +++ b/app/data/ct.libs/sprite/module.json @@ -3,6 +3,7 @@ "name": "Sprite Composer", "tagline": "Create new animations from one sprite, freeing yourself from the necessity to split and stitch frames manually.", "version": "1.0.0", + "icon": "texture", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/transition/module.json b/app/data/ct.libs/transition/module.json index 3cd9b645c..b011ff901 100644 --- a/app/data/ct.libs/transition/module.json +++ b/app/data/ct.libs/transition/module.json @@ -4,6 +4,7 @@ "tagline": "Add nice and smooth transitions between levels, or whenever you need them.", "tagline_Ru": "Добавь красивые плавные переходы между уровнями, или вызови их когда угодно.", "version": "1.0.0", + "icon": "monitor", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/transition/types.d.ts b/app/data/ct.libs/transition/types.d.ts index b189c86e4..fbbd479ee 100644 --- a/app/data/ct.libs/transition/types.d.ts +++ b/app/data/ct.libs/transition/types.d.ts @@ -8,11 +8,15 @@ declare namespace transition { * The beginning of a fading transition, which paints the whole screen through time. * The arguments `duration` and `color` are optional, * and default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function fadeOut(duration?: number, color?: number): Promise; /** * The end of a fading transition. The arguments `duration` and `color` are optional, * and default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function fadeIn(duration?: number, color?: number): Promise; @@ -22,6 +26,8 @@ declare namespace transition { * which will zoom in 10 times. Setting values larger than `1` will zoom out instead. * The arguments `duration` and `color` are optional, and default to `500` (0.5 seconds) * and `0x000000` (black color). + * + * @catnipPromise then */ function scaleOut(duration?: number, scaling?: number, color?: number): Promise; /** @@ -30,6 +36,8 @@ declare namespace transition { * The default `scaling` is `0.1`, which will zoom in 10 times. Setting values larger * than `1` will zoom out instead. The arguments `duration` and `color` are optional, * and default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function scaleIn(duration?: number, scaling?: number, color?: number): Promise; @@ -39,6 +47,8 @@ declare namespace transition { * covering the screen with an opaque color. * The arguments `duration` and `color` are optional, and * default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function slideOut(duration?: number, direction?: CtTransitionDirection, color?: number): Promise; /** @@ -47,6 +57,8 @@ declare namespace transition { * covering the screen with an opaque color. * The arguments `duration` and `color` are optional, * and default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function slideIn(duration?: number, direction?: CtTransitionDirection, color?: number): Promise; @@ -55,6 +67,8 @@ declare namespace transition { * that smoothly grows from a size of a point to cover the whole screen * in a given opaque color. The arguments `duration` and `color` are optional, * and default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function circleOut(duration?: number, color?: number): Promise; /** @@ -62,6 +76,8 @@ declare namespace transition { * that covers the whole screen in a given opaque color but smoothly * shrinks to a point. The arguments `duration` and `color` are optional, * and default to `500` (0.5 seconds) and `0x000000` (black color). + * + * @catnipPromise then */ function circleIn(duration?: number, color?: number): Promise; } diff --git a/app/data/ct.libs/tween/DOCS.md b/app/data/ct.libs/tween/DOCS.md index e13e26cd4..8f576c152 100644 --- a/app/data/ct.libs/tween/DOCS.md +++ b/app/data/ct.libs/tween/DOCS.md @@ -33,7 +33,30 @@ tween.add({ }); ``` -### Default interpolation methods +## tween.value(options: object, onTick: (value: number) => void) + +Creates a new custom tween that animates one numeric value. Options are: + +* `options.from` Initial value +* `options.to` Target value +* `options.curve` An interpolating function. You can write your own, or use default ones written below. The default one is `tween.ease`. +* `options.duration` The duration of easing, in milliseconds. +* `options.isUi` If true, use `u.timeUi` instead of `u.time`. The default is `false`. +* `options.silent` If set to true, suppresses errors when the timer was interrupted or stopped manually. + +### **Example:** Animate copy's scale from 0 to 1. + +```js +tween.value({ + from: 0, + to: 1, + duration: 350 +}, newValue => { + this.scale.x = this.scale.y = newValue; +}); +``` + +## Default interpolation methods * `tween.linear` diff --git a/app/data/ct.libs/tween/blocks.js b/app/data/ct.libs/tween/blocks.js new file mode 100644 index 000000000..2b9e1b4de --- /dev/null +++ b/app/data/ct.libs/tween/blocks.js @@ -0,0 +1,375 @@ +/* eslint-disable camelcase */ +module.exports = [{ + name: 'Animate a value', + name_Ru: 'Анимировать значение', + displayName: 'Animate a value', + displayName_Ru: 'Анимировать', + type: 'command', + code: 'animate propVal', + pieces: [{ + type: 'argument', + key: 'value', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'to', + i18nKey: 'toDestination' + }, { + type: 'argument', + key: 'to', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'for', + i18nKey: 'forDuring' + }, { + type: 'argument', + key: 'ms', + typeHint: 'number', + required: true, + defaultConstant: 1000 + }, { + type: 'asyncMarker' + }, { + type: 'break' + }, { + type: 'icon', + icon: 'redo' + }, { + type: 'label', + name: 'then', + i18nKey: 'then' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'then' + }, { + type: 'icon', + icon: 'alert-octagon' + }, { + type: 'label', + name: 'catch', + i18nKey: 'catch' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'catch' + }, { + type: 'options', + options: [{ + key: 'isUi', + name: 'Animate in UI time', + name_Ru: 'Анимировать в UI времени', + typeHint: 'boolean' + }, { + key: 'curve', + name: 'Curve', + name_Ru: 'Кривая', + typeHint: 'wildcard' + }] + }], + jsTemplate: values => ` + tween.value({ + from: ${values.value}, + to: ${values.to}, + duration: ${values.ms}, + isUi: ${values.isUi}, + curve: ${values.curve || 'tween.ease'} + }, value => { + ${values.value} = value; + }).then(() => { + ${values.then} + }).catch(() => { + ${values.catch} + }); + ` +}, { + name: 'Animate property', + name_Ru: 'Анимировать свойство', + displayName: 'Animate object\'s', + displayName_Ru: 'Анимировать у объекта', + type: 'command', + code: 'animate', + pieces: [{ + type: 'argument', + key: 'target', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'property', + i18nKey: 'property' + }, { + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'to', + i18nKey: 'toDestination' + }, { + type: 'argument', + key: 'value', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'for', + i18nKey: 'forDuring' + }, { + type: 'argument', + key: 'ms', + typeHint: 'number', + required: true, + defaultConstant: 1000 + }, { + type: 'asyncMarker' + }, { + type: 'break' + }, { + type: 'icon', + icon: 'redo' + }, { + type: 'label', + name: 'then', + i18nKey: 'then' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'then' + }, { + type: 'icon', + icon: 'alert-octagon' + }, { + type: 'label', + name: 'catch', + i18nKey: 'catch' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'catch' + }, { + type: 'options', + options: [{ + key: 'isUi', + name: 'Animate in UI time', + name_Ru: 'Анимировать в UI времени', + typeHint: 'boolean' + }, { + key: 'curve', + name: 'Curve', + name_Ru: 'Кривая', + typeHint: 'wildcard' + }] + }], + jsTemplate: values => ` + tween.add({ + obj: ${values.target}, + duration: ${values.ms}, + isUi: ${values.isUi}, + fields: { + ${values.property}: ${values.value} + }, + curve: ${values.curve || 'tween.ease'} + }).then(() => { + ${values.then} + }).catch(() => { + ${values.catch} + }); + ` +}, { + name: 'Animate scale', + name_Ru: 'Анимировать размер', + displayName: 'Animate object\'s', + displayName_Ru: 'Анимировать у объекта', + type: 'command', + code: 'animate scale', + pieces: [{ + type: 'argument', + key: 'target', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'scale', + i18nKey: 'scale' + }, { + type: 'label', + name: 'to', + i18nKey: 'toDestination' + }, { + type: 'argument', + key: 'x', + typeHint: 'number', + required: true + }, { + type: 'argument', + key: 'y', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'for', + i18nKey: 'forDuring' + }, { + type: 'argument', + key: 'ms', + typeHint: 'number', + required: true, + defaultConstant: 1000 + }, { + type: 'asyncMarker' + }, { + type: 'break' + }, { + type: 'icon', + icon: 'redo' + }, { + type: 'label', + name: 'then', + i18nKey: 'then' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'then' + }, { + type: 'icon', + icon: 'alert-octagon' + }, { + type: 'label', + name: 'catch', + i18nKey: 'catch' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'catch' + }, { + type: 'options', + options: [{ + key: 'isUi', + name: 'Animate in UI time', + name_Ru: 'Анимировать в UI времени', + typeHint: 'boolean' + }, { + key: 'curve', + name: 'Curve', + name_Ru: 'Кривая', + typeHint: 'wildcard' + }] + }], + jsTemplate: values => ` + tween.add({ + obj: ${values.target}.scale, + duration: ${values.ms}, + isUi: ${values.isUi}, + fields: { + x: ${values.x}, + y: ${values.y} + }, + curve: ${values.curve || 'tween.ease'} + }).then(() => { + ${values.then} + }).catch(() => { + ${values.catch} + }); + ` +}, { + name: 'Animate position', + name_Ru: 'Анимировать расположение', + displayName: 'Animate object\'s', + displayName_Ru: 'Анимировать у объекта', + type: 'command', + code: 'animate position', + pieces: [{ + type: 'argument', + key: 'target', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'position', + i18nKey: 'position' + }, { + type: 'label', + name: 'to', + i18nKey: 'toDestination' + }, { + type: 'argument', + key: 'x', + typeHint: 'number', + required: true + }, { + type: 'argument', + key: 'y', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'for', + i18nKey: 'forDuring' + }, { + type: 'argument', + key: 'ms', + typeHint: 'number', + required: true, + defaultConstant: 1000 + }, { + type: 'asyncMarker' + }, { + type: 'break' + }, { + type: 'icon', + icon: 'redo' + }, { + type: 'label', + name: 'then', + i18nKey: 'then' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'then' + }, { + type: 'icon', + icon: 'alert-octagon' + }, { + type: 'label', + name: 'catch', + i18nKey: 'catch' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'catch' + }, { + type: 'options', + options: [{ + key: 'isUi', + name: 'Animate in UI time', + name_Ru: 'Анимировать в UI времени', + typeHint: 'boolean' + }, { + key: 'curve', + name: 'Curve', + name_Ru: 'Кривая', + typeHint: 'wildcard' + }] + }], + jsTemplate: values => ` + tween.add({ + obj: ${values.target}, + duration: ${values.ms}, + isUi: ${values.isUi}, + fields: { + x: ${values.x}, + y: ${values.y} + }, + curve: ${values.curve || 'tween.ease'} + }).then(() => { + ${values.then} + }).catch(() => { + ${values.catch} + }); + ` +}]; diff --git a/app/data/ct.libs/tween/index.js b/app/data/ct.libs/tween/index.js index 557a4f900..c91845a2a 100644 --- a/app/data/ct.libs/tween/index.js +++ b/app/data/ct.libs/tween/index.js @@ -20,6 +20,8 @@ * @returns {Promise} A promise which is resolved if the effect was fully played, * or rejected if it was interrupted manually by code, room switching or instance kill. * You can call a `stop()` method on this promise to interrupt it manually. + * + * @catnipIgnore */ add(options) { const twoon = { @@ -27,39 +29,72 @@ fields: options.fields || {}, curve: options.curve || tween.ease, duration: options.duration || 1000, - timer: new CtTimer(options.duration, false, options.isUi || false) + timer: new CtTimer(options.duration, false, options.isUi || false), + starting: {}, + reject: (message) => twoon.timer.reject(message), + resolve: (fields) => twoon.timer.resolve(fields) }; - const promise = new Promise((resolve, reject) => { - twoon.resolve = resolve; - twoon.reject = reject; - twoon.starting = {}; - for (const field in twoon.fields) { - twoon.starting[field] = twoon.obj[field] || 0; + twoon.promise = twoon.timer.promise; + twoon.starting = {}; + for (const field in twoon.fields) { + twoon.starting[field] = twoon.obj[field] || 0; + } + tween.tweens.push(twoon); + twoon.promise = twoon.promise.then(() => { + if (!twoon.obj.kill) { + for (const field in twoon.fields) { + twoon.obj[field] = twoon.fields[field]; + } } - tween.tweens.push(twoon); - }); - if (options.silent) { - promise.catch(() => void 0); - twoon.timer.catch(() => void 0); + }, options.silent && (() => void 0)); + twoon.promise.stop = () => { + twoon.timer.reject({ + code: 0, + info: 'Stopped by game logic', + from: 'tween' + }); + }; + return twoon.promise; + }, + value(options, onTick) { + const twoon = { + from: options.from, + to: options.to, + curve: options.curve || tween.ease, + duration: options.duration || 1000, + timer: new CtTimer(options.duration, false, options.isUi || false), + starting: {}, + reject: (message) => twoon.timer.reject(message), + resolve: (fields) => twoon.timer.resolve(fields), + onTick + }; + twoon.promise = twoon.timer.promise; + twoon.starting = {}; + for (const field in twoon.fields) { + twoon.starting[field] = twoon.obj[field] || 0; } - promise.stop = function stop() { - twoon.reject({ + tween.tweens.push(twoon); + twoon.promise = twoon.promise.then(() => { + onTick(twoon.to); + }, options.silent && (() => void 0)); + twoon.promise.stop = () => { + twoon.timer.reject({ code: 0, info: 'Stopped by game logic', from: 'tween' }); }; - return promise; + return twoon.promise; }, - /** - * Linear interpolation. - * Here and below, these parameters are used: - * - * @param {Number} s Starting value - * @param {Number} d The change of value to transition to, the Delta - * @param {Number} a The current timing state, 0-1 - * @returns {Number} Interpolated value - */ + /** + * Linear interpolation. + * Here and below, these parameters are used: + * + * @param {Number} s Starting value + * @param {Number} d The change of value to transition to, the Delta + * @param {Number} a The current timing state, 0-1 + * @returns {Number} Interpolated value + */ linear(s, d, a) { return d * a + s; }, diff --git a/app/data/ct.libs/tween/injections/beforeroomstep.js b/app/data/ct.libs/tween/injections/beforeroomstep.js index c4fc784a6..e5170e613 100644 --- a/app/data/ct.libs/tween/injections/beforeroomstep.js +++ b/app/data/ct.libs/tween/injections/beforeroomstep.js @@ -2,7 +2,7 @@ let i = 0; while (i < tween.tweens.length) { const twoon = tween.tweens[i]; - if (twoon.obj.kill) { + if (twoon.obj && twoon.obj.kill) { twoon.reject({ code: 2, info: 'Copy is killed' @@ -14,10 +14,14 @@ if (a > 1) { a = 1; } - for (const field in twoon.fields) { - const s = twoon.starting[field], - d = twoon.fields[field] - twoon.starting[field]; - twoon.obj[field] = twoon.curve(s, d, a); + if (twoon.obj) { + for (const field in twoon.fields) { + const s = twoon.starting[field], + d = twoon.fields[field] - twoon.starting[field]; + twoon.obj[field] = twoon.curve(s, d, a); + } + } else { + twoon.onTick(twoon.curve(twoon.from, twoon.to - twoon.from, a)); } if (a === 1) { twoon.resolve(twoon.fields); diff --git a/app/data/ct.libs/tween/injections/roomonleave.js b/app/data/ct.libs/tween/injections/roomonleave.js index 70433d198..2e83a2572 100644 --- a/app/data/ct.libs/tween/injections/roomonleave.js +++ b/app/data/ct.libs/tween/injections/roomonleave.js @@ -1,10 +1,3 @@ if (!this.kill) { - for (const twoon of tween.tweens) { - twoon.reject({ - info: 'Room switch', - code: 1, - from: 'tween' - }); - } tween.tweens = []; } diff --git a/app/data/ct.libs/tween/module.json b/app/data/ct.libs/tween/module.json index fde0344a5..12d53e76e 100644 --- a/app/data/ct.libs/tween/module.json +++ b/app/data/ct.libs/tween/module.json @@ -3,6 +3,7 @@ "name": "ct.tween", "tagline": "Animate values through time with different interpolation curves.", "version": "1.1.0", + "icon": "interpolation-smooth", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/tween/types.d.ts b/app/data/ct.libs/tween/types.d.ts index 8f24f777d..5c86a081f 100644 --- a/app/data/ct.libs/tween/types.d.ts +++ b/app/data/ct.libs/tween/types.d.ts @@ -35,6 +35,8 @@ declare namespace tween { * Creates a new tween effect and adds it to the game loop. * Returns a Promise which is resolved if the effect was fully played, * or rejected if it was interrupted manually by code, room switching or Copy kill. + * + * @catnipIgnore */ function add(options: ITweenOptions): ITween; diff --git a/app/data/ct.shared/ctSound.js b/app/data/ct.shared/ctSound.js deleted file mode 100644 index 2a8d39b2f..000000000 --- a/app/data/ct.shared/ctSound.js +++ /dev/null @@ -1,623 +0,0 @@ -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var __async = (__this, __arguments, generator) => { - return new Promise((resolve, reject) => { - var fulfilled = (value) => { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - }; - var rejected = (value) => { - try { - step(generator.throw(value)); - } catch (e) { - reject(e); - } - }; - var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); - step((generator = generator.apply(__this, __arguments)).next()); - }); -}; - -// src/ct.release/sounds.ts -var sounds_exports = {}; -__export(sounds_exports, { - default: () => sounds_default, - exportedSounds: () => exportedSounds, - pannedSounds: () => pannedSounds, - pixiSoundInstances: () => pixiSoundInstances, - pixiSoundPrefix: () => pixiSoundPrefix, - playRandomVariant: () => playRandomVariant, - playVariant: () => playVariant, - playWithoutEffects: () => playWithoutEffects, - soundMap: () => soundMap, - soundsLib: () => soundsLib -}); -module.exports = __toCommonJS(sounds_exports); -var PannerFilter = class extends PIXI.sound.filters.Filter { - constructor(refDistance, rolloffFactor) { - const { audioContext } = PIXI.sound.context; - const panner = audioContext.createPanner(); - panner.panningModel = "equalpower"; - panner.distanceModel = "inverse"; - panner.refDistance = refDistance; - panner.rolloffFactor = rolloffFactor; - const destination = panner; - super(destination); - this._panner = panner; - } - reposition(tracked) { - if (tracked.kill) { - return; - } - this._panner.positionX.value = tracked.x / camera.referenceLength; - this._panner.positionY.value = tracked.y / camera.referenceLength; - } - destroy() { - super.destroy(); - this._panner = null; - } -}; -var pannedSounds = /* @__PURE__ */ new Map(); -var _a; -var exportedSounds = (_a = [ - /*!@sounds@*/ -][0]) != null ? _a : []; -var soundMap = {}; -for (const exportedSound of exportedSounds) { - soundMap[exportedSound.name] = exportedSound; -} -var pixiSoundInstances = {}; -var fxNames = Object.keys(PIXI.sound.filters).filter((name) => name !== "Filter" && name !== "StreamFilter"); -var fxNamesToClasses = {}; -for (const fxName of fxNames) { - fxNamesToClasses[fxName] = PIXI.sound.filters[fxName]; -} -var pixiSoundPrefix = "pixiSound-"; -var randomRange = (min, max) => Math.random() * (max - min) + min; -var withSound = (name, fn) => { - const pixiFind = PIXI.sound.exists(name) && PIXI.sound.find(name); - if (pixiFind) { - return fn(pixiFind, name); - } - if (name in pixiSoundInstances) { - return fn(pixiSoundInstances[name], name); - } - if (name in soundMap) { - let lastVal; - for (const variant of soundMap[name].variants) { - const assetName = `${pixiSoundPrefix}${variant.uid}`; - lastVal = fn(pixiSoundInstances[assetName], assetName); - } - return lastVal; - } - throw new Error(`[sounds] Sound "${name}" was not found. Is it a typo?`); -}; -var playVariant = (sound, variant, options) => { - var _a2, _b, _c, _d, _e; - const pixiSoundInst = PIXI.sound.find(`${pixiSoundPrefix}${variant.uid}`).play(options); - if ((_a2 = sound.volume) == null ? void 0 : _a2.enabled) { - pixiSoundInst.volume = randomRange(sound.volume.min, sound.volume.max) * ((options == null ? void 0 : options.volume) || 1); - } else if ((options == null ? void 0 : options.volume) !== void 0) { - pixiSoundInst.volume = options.volume; - } - if ((_b = sound.pitch) == null ? void 0 : _b.enabled) { - pixiSoundInst.speed = randomRange(sound.pitch.min, sound.pitch.max) * ((options == null ? void 0 : options.speed) || 1); - } else if ((options == null ? void 0 : options.speed) !== void 0) { - pixiSoundInst.speed = options.speed; - } - if ((_c = sound.distortion) == null ? void 0 : _c.enabled) { - soundsLib.addDistortion( - pixiSoundInst, - randomRange(sound.distortion.min, sound.distortion.max) - ); - } - if ((_d = sound.reverb) == null ? void 0 : _d.enabled) { - soundsLib.addReverb( - pixiSoundInst, - randomRange(sound.reverb.secondsMin, sound.reverb.secondsMax), - randomRange(sound.reverb.decayMin, sound.reverb.decayMax), - sound.reverb.reverse - ); - } - if ((_e = sound.eq) == null ? void 0 : _e.enabled) { - soundsLib.addEqualizer( - pixiSoundInst, - ...sound.eq.bands.map((band) => randomRange(band.min, band.max)) - // 🍝 - ); - } - return pixiSoundInst; -}; -var playWithoutEffects = (sound, variant, options) => { - const pixiSoundInst = PIXI.sound.find(`${pixiSoundPrefix}${variant.uid}`).play(options); - return pixiSoundInst; -}; -var playRandomVariant = (sound, options) => { - const variant = sound.variants[Math.floor(Math.random() * sound.variants.length)]; - return playVariant(sound, variant, options); -}; -var soundsLib = { - /** - * Preloads a sound. This is usually applied to music files before playing - * as they are not preloaded by default. - * - * @param {string} name The name of a sound - * @returns {Promise} A promise that resolves into the name of the loaded sound asset. - */ - load(name) { - return __async(this, null, function* () { - const promises = []; - withSound(name, (soundRes, resName) => { - const s = PIXI.sound.play(resName, { - muted: true - }); - if (s instanceof Promise) { - promises.push(s); - s.then((i) => { - i.stop(); - }); - } else { - s.stop(); - } - }); - yield Promise.all(promises); - return name; - }); - }, - /** - * Plays a sound. - * - * @param {string} name Sound's name - * @param {PlayOptions} [options] Options used for sound playback. - * @param {Function} options.complete When completed. - * @param {number} options.end End time in seconds. - * @param {filters.Filter[]} options.filters Filters that apply to play. - * @param {Function} options.loaded If not already preloaded, callback when finishes load. - * @param {boolean} options.loop Override default loop, default to the Sound's loop setting. - * @param {boolean} options.muted If sound instance is muted by default. - * @param {boolean} options.singleInstance Setting true will stop any playing instances. - * @param {number} options.speed Override default speed, default to the Sound's speed setting. - * @param {number} options.start Start time offset in seconds. - * @param {number} options.volume Override default volume. - * @returns Either a sound instance, or a promise that resolves into a sound instance. - */ - play(name, options) { - if (name in soundMap) { - const exported = soundMap[name]; - return playRandomVariant(exported, options); - } - if (name in pixiSoundInstances) { - return pixiSoundInstances[name].play(options); - } - throw new Error(`[sounds.play] Sound "${name}" was not found. Is it a typo?`); - }, - playAt(name, position, options) { - const sound = soundsLib.play(name, options); - const { panning } = soundMap[name]; - if (sound instanceof Promise) { - sound.then((instance) => { - soundsLib.addPannerFilter( - instance, - position, - panning.refDistance, - panning.rolloffFactor - ); - }); - } else { - soundsLib.addPannerFilter( - sound, - position, - panning.refDistance, - panning.rolloffFactor - ); - } - return sound; - }, - /** - * Stops a sound if a name is specified, otherwise stops all sound. - * - * @param {string|IMediaInstance} [name] Sound's name, or the sound instance. - * - * @returns {void} - */ - stop(name) { - if (name) { - if (typeof name === "string") { - withSound(name, (sound) => sound.stop()); - } else { - name.stop(); - } - } else { - PIXI.sound.stopAll(); - } - }, - /** - * Pauses a sound if a name is specified, otherwise pauses all sound. - * - * @param {string} [name] Sound's name - * - * @returns {void} - */ - pause(name) { - if (name) { - withSound(name, (sound) => sound.pause()); - } else { - PIXI.sound.pauseAll(); - } - }, - /** - * Resumes a sound if a name is specified, otherwise resumes all sound. - * - * @param {string} [name] Sound's name - * - * @returns {void} - */ - resume(name) { - if (name) { - withSound(name, (sound) => sound.resume()); - } else { - PIXI.sound.resumeAll(); - } - }, - /** - * Returns whether a sound with the specified name was added to the game. - * This doesn't tell whether it is fully loaded or not, it only checks - * for existance of sound's metadata in your game. - * - * @param {string} name Sound's name - * - * @returns {boolean} - */ - exists(name) { - return name in soundMap || name in pixiSoundInstances; - }, - /** - * Returns whether a sound is currently playing if a name is specified, - * otherwise if any sound is currently playing. - * - * @param {string} [name] Sound's name - * - * @returns {boolean} `true` if the sound is playing, `false` otherwise. - */ - playing(name) { - if (!name) { - return PIXI.sound.isPlaying(); - } - if (name in pixiSoundInstances) { - return pixiSoundInstances[name].isPlaying; - } else if (name in soundMap) { - for (const variant of soundMap[name].variants) { - if (pixiSoundInstances[`${pixiSoundPrefix}${variant.uid}`].isPlaying) { - return true; - } - } - } else { - throw new Error(`[sounds] Sound "${name}" was not found. Is it a typo?`); - } - return false; - }, - /** - * Get or set the volume for a sound. - * - * @param {string|IMediaInstance} name Sound's name or instance - * @param {number} [volume] The new volume where 1 is 100%. - * If empty, will return the existing volume. - * - * @returns {number} The current volume of the sound. - */ - volume(name, volume) { - if (volume !== void 0) { - if (typeof name === "string") { - withSound(name, (sound) => { - sound.volume = volume; - }); - } else { - name.volume = volume; - } - } - if (typeof name === "string") { - return withSound(name, (sound) => sound.volume); - } - return name.volume; - }, - /** - * Set the global volume for all sounds. - * @param {number} value The new volume where 1 is 100%. - * - */ - globalVolume(value) { - PIXI.sound.volumeAll = value; - }, - /** - * Fades a sound to a given volume. Can affect either a specific instance or the whole group. - * - * @param [name] Sound's name or instance to affect. If null, all sounds are faded. - * @param [newVolume] The new volume where 1 is 100%. Default is 0. - * @param [duration] The duration of transition, in milliseconds. Default is 1000. - */ - fade(name, newVolume = 0, duration = 1e3) { - const start = { - time: performance.now(), - value: null - }; - if (name) { - start.value = soundsLib.volume(name); - } else { - start.value = PIXI.sound.context.volume; - } - const updateVolume = (currentTime) => { - const elapsed = currentTime - start.time; - const progress = Math.min(elapsed / duration, 1); - const value = start.value + (newVolume - start.value) * progress; - if (name) { - soundsLib.volume(name, value); - } else { - soundsLib.globalVolume(value); - } - if (progress < 1) { - requestAnimationFrame(updateVolume); - } - }; - requestAnimationFrame(updateVolume); - }, - /** - * Adds a filter to the specified sound and remembers its constructor name. - * This method is not intended to be called directly. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - */ - addFilter(sound, filter, filterName) { - const fx = filter; - fx.preserved = filterName; - if (sound === false) { - PIXI.sound.filtersAll = [...PIXI.sound.filtersAll || [], fx]; - } else if (typeof sound === "string") { - withSound(sound, (soundInst) => { - soundInst.filters = [...soundInst.filters || [], fx]; - }); - } else if (sound) { - sound.filters = [...sound.filters || [], fx]; - } else { - throw new Error(`[sounds.addFilter] Invalid sound: ${sound}`); - } - }, - /** - * Adds a distortion filter. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - * @param {number} amount The amount of distortion to set from 0 to 1. Default is 0. - */ - addDistortion(sound, amount) { - const fx = new PIXI.sound.filters.DistortionFilter(amount); - soundsLib.addFilter(sound, fx, "DistortionFilter"); - return fx; - }, - /** - * Adds an equalizer filter. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - * @param {number} f32 Default gain for 32 Hz. Default is 0. - * @param {number} f64 Default gain for 64 Hz. Default is 0. - * @param {number} f125 Default gain for 125 Hz. Default is 0. - * @param {number} f250 Default gain for 250 Hz. Default is 0. - * @param {number} f500 Default gain for 500 Hz. Default is 0. - * @param {number} f1k Default gain for 1000 Hz. Default is 0. - * @param {number} f2k Default gain for 2000 Hz. Default is 0. - * @param {number} f4k Default gain for 4000 Hz. Default is 0. - * @param {number} f8k Default gain for 8000 Hz. Default is 0. - * @param {number} f16k Default gain for 16000 Hz. Default is 0. - */ - // eslint-disable-next-line max-params - addEqualizer(sound, f32, f64, f125, f250, f500, f1k, f2k, f4k, f8k, f16k) { - const fx = new PIXI.sound.filters.EqualizerFilter(f32, f64, f125, f250, f500, f1k, f2k, f4k, f8k, f16k); - soundsLib.addFilter(sound, fx, "EqualizerFilter"); - return fx; - }, - /** - * Combine all channels into mono channel. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - */ - addMonoFilter(sound) { - const fx = new PIXI.sound.filters.MonoFilter(); - soundsLib.addFilter(sound, fx, "MonoFilter"); - return fx; - }, - /** - * Adds a reverb filter. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - * @param {number} seconds Seconds for reverb. Default is 3. - * @param {number} decay The decay length. Default is 2. - * @param {boolean} reverse Reverse reverb. Default is false. - */ - addReverb(sound, seconds, decay, reverse) { - const fx = new PIXI.sound.filters.ReverbFilter(seconds, decay, reverse); - soundsLib.addFilter(sound, fx, "ReverbFilter"); - return fx; - }, - /** - * Adds a filter for stereo panning. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - * @param {number} pan The amount of panning: -1 is left, 1 is right. Default is 0 (centered). - */ - addStereoFilter(sound, pan) { - const fx = new PIXI.sound.filters.StereoFilter(pan); - soundsLib.addFilter(sound, fx, "StereoFilter"); - return fx; - }, - /** - * Adds a 3D sound filter. - * This filter can only be applied to sound instances. - * - * @param sound The sound to apply effect to. - * @param position Any object with x and y properties — for example, copies. - */ - addPannerFilter(sound, position, refDistance, rolloffFactor) { - const fx = new PannerFilter(refDistance, rolloffFactor); - soundsLib.addFilter(sound, fx, "PannerFilter"); - pannedSounds.set(position, fx); - sound.on("end", () => { - pannedSounds.delete(position); - }); - return fx; - }, - /** - * Adds a telephone-sound filter. - * - * @param sound If set to false, applies the filter globally. - * If set to a string, applies the filter to the specified sound asset. - * If set to a media instance or PIXI.Sound instance, applies the filter to it. - */ - addTelephone(sound) { - const fx = new PIXI.sound.filters.TelephoneFilter(); - soundsLib.addFilter(sound, fx, "TelephoneFilter"); - return fx; - }, - /** - * Remove a filter to the specified sound. - * - * @param {string} [name] The sound to affect. Can be a name of the sound asset - * or the specific sound instance you get from running `sounds.play`. - * If set to false, it affects all sounds. - * @param {string} [filter] The name of the filter. If omitted, all the filters are removed. - * - * @returns {void} - */ - removeFilter(name, filter) { - const setFilters = (newFilters) => { - if (typeof name === "string") { - withSound(name, (soundInst) => { - soundInst.filters = newFilters; - }); - } else { - name.filters = newFilters; - } - }; - if (!name && !filter) { - PIXI.sound.filtersAll = []; - return; - } - if (name && !filter) { - setFilters([]); - return; - } - let filters; - if (!name) { - filters = PIXI.sound.filtersAll; - } else { - filters = typeof name === "string" ? withSound(name, (soundInst) => soundInst.filters) : name.filters; - } - if (filter && !filter.includes("Filter")) { - filter += "Filter"; - } - const copy = [...filters]; - filters.forEach((f, i) => { - if (f.preserved === filter) { - copy.splice(i, 1); - } - }); - if (!name) { - PIXI.sound.filtersAll = copy; - } else { - setFilters(copy); - } - }, - /** - * Set the speed (playback rate) of a sound. - * - * @param {string|IMediaInstance} name Sound's name or instance - * @param {number} [value] The new speed, where 1 is 100%. - * If empty, will return the existing speed value. - * - * @returns {number} The current speed of the sound. - */ - speed(name, value) { - if (value) { - if (typeof name === "string") { - withSound(name, (sound) => { - sound.speed = value; - }); - } else { - name.speed = value; - } - return value; - } - if (typeof name === "string") { - if (name in soundMap) { - return pixiSoundInstances[soundMap[name].variants[0].uid].speed; - } - if (name in pixiSoundInstances) { - return pixiSoundInstances[name].speed; - } - throw new Error(`[sounds.speed] Invalid sound name: ${name}. Is it a typo?`); - } - return name.speed; - }, - /** - * Set the global speed (playback rate) for all sounds. - * @param {number} value The new speed, where 1 is 100%. - * - */ - speedAll(value) { - PIXI.sound.speedAll = value; - }, - /** - * Toggle muted property for all sounds. - * @returns {boolean} `true` if all sounds are muted. - */ - toggleMuteAll() { - return PIXI.sound.toggleMuteAll(); - }, - /** - * Toggle paused property for all sounds. - * @returns {boolean} `true` if all sounds are paused. - */ - togglePauseAll() { - return PIXI.sound.togglePauseAll(); - } -}; -var sounds_default = soundsLib; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - exportedSounds, - pannedSounds, - pixiSoundInstances, - pixiSoundPrefix, - playRandomVariant, - playVariant, - playWithoutEffects, - soundMap, - soundsLib -}); diff --git a/app/data/fonts/Caveat-Bold.ttf b/app/data/fonts/Caveat-Bold.ttf new file mode 100644 index 000000000..64c12c7cd Binary files /dev/null and b/app/data/fonts/Caveat-Bold.ttf differ diff --git a/app/data/fonts/PermanentMarker-Regular.ttf b/app/data/fonts/PermanentMarker-Regular.ttf new file mode 100644 index 000000000..6541e9d87 Binary files /dev/null and b/app/data/fonts/PermanentMarker-Regular.ttf differ diff --git a/app/data/i18n/Brazilian Portuguese.json b/app/data/i18n/Brazilian Portuguese.json index 88736d008..aecf28f2f 100644 --- a/app/data/i18n/Brazilian Portuguese.json +++ b/app/data/i18n/Brazilian Portuguese.json @@ -108,7 +108,7 @@ "salas", "salas" ], - "font": [ + "typeface": [ "fonte", "fontes", "fontes" @@ -982,7 +982,6 @@ "strokeColor": "Cor do traço:", "strokeWeight": "Espessura da linha:", "testText": "Um texto de teste 0123 +", - "fontFamily": "Família da Fonte:", "fontSize": "Tamanho da fonte:" }, "textureView": { diff --git a/app/data/i18n/Chinese Simplified.json b/app/data/i18n/Chinese Simplified.json index db7d7c54a..21a7ea2c5 100644 --- a/app/data/i18n/Chinese Simplified.json +++ b/app/data/i18n/Chinese Simplified.json @@ -99,7 +99,7 @@ "房间", "房间" ], - "font": [ + "typeface": [ "字体", "字体", "字体" @@ -972,7 +972,6 @@ "strokeColor": "描边颜色:", "strokeWeight": "线宽:", "testText": "测试文本 0123 +", - "fontFamily": "字体家族", "fontSize": "字体大小:" }, "textureView": { diff --git a/app/data/i18n/Comments.json b/app/data/i18n/Comments.json index aeb2a44a2..a85a821f8 100644 --- a/app/data/i18n/Comments.json +++ b/app/data/i18n/Comments.json @@ -99,7 +99,7 @@ "", "" ], - "font": [ + "typeface": [ "", "", "" @@ -161,7 +161,9 @@ "bottomRight": "", "fill": "", "Scale": "" - } + }, + "download": "", + "createStyleFromIt": "" }, "colorPicker": { "current": "", @@ -237,7 +239,35 @@ "boosty": "Boosty is a service, similar to Patreon.", "sponsoredBy": "", "supportedBy": "", - "nothingToShowFiller": "" + "nothingToShowFiller": "", + "welcomeHeaders": [ + "Here and below you may replace any unknown in your language phrases with funny quotes you would instead prefer.\nTumblr sexyman is a term for any slender and mischievous cartoon character that Tumblr users massively like for some reason.", + "A reference to the Matrix film.", + "Just a greeting.", + "Just a greeting.", + "A reference to Freddy Fazbear from FNAF: Security breach.", + "A reference to the starting scene of The Elder Scrolls: Skyrim.", + "A StarWars reference.", + "A greetings gesture from StarTrek, aka \"vulkan\" gesture. You should probably leave this field as is.", + "A general fantasy-like greeting.", + "A cliche anime greeting.", + "idk what this one is", + "A reference to the edgy elf Kerillian from Warhammer: Vermintide games that calls all the mayflies lumberfoots.", + "A reference to Rimworld game and its announcements about enemy raids.", + "A reference to League of Legends and its announcer's line when the game starts.", + "A reference to Portal 2, especially the triple laser test chamber." + ], + "newUserHeader": "", + "ctDistributions": { + "released": "", + "nightly": "", + "dev": "" + }, + "gamesFromCommunity": "", + "submitYourOwn": "", + "learningResources": "", + "authorBy": "\"$1\" gets replaced with the author's name.", + "telegram": "" }, "modules": { "author": "", @@ -691,7 +721,11 @@ "HCBlack": "", "RosePine": "", "RosePineMoon": "", - "RosePineDawn": "" + "RosePineDawn": "", + "GoldenEye": "", + "AlmaSakura": "", + "Synthwave": "", + "OneDarkPro": "" }, "codeFontDefault": "", "codeFontOldSchool": "", @@ -708,7 +742,16 @@ "language": "", "translateToYourLanguage": "", "prideMode": "", - "altTemplateLayout": "" + "altTemplateLayout": "", + "changeDebuggerLayout": "", + "debuggerLayout": "", + "debuggerLayouts": { + "split": "", + "multiwindow": "", + "automatic": "" + }, + "autoapplyOnLaunch": "", + "scrollableCatnipLibrary": "" }, "project": { "save": "", @@ -787,7 +830,8 @@ "unwrapFolder": "", "confirmDeleteFolder": "", "confirmUnwrapFolder": "", - "exportBehavior": "" + "exportBehavior": "", + "exportTandem": "" }, "soundRecorder": { "recorderHeading": "", @@ -972,8 +1016,9 @@ "strokeColor": "", "strokeWeight": "", "testText": "It is recommended that you include both a string in your language and in English, as it will help with picking fonts that have multilingual support.", - "fontFamily": "", - "fontSize": "" + "fontSize": "", + "fallbackFontFamily": "", + "notSupportedForBitmap": "" }, "textureView": { "center": "", @@ -1041,7 +1086,10 @@ }, "customCharsetHint": "", "fontWeight": "", - "typefaceName": "" + "typefaceName": "", + "addFont": "", + "pixelPerfect": "", + "pixelPerfectTooltip": "" }, "licensePanel": { "ctjsLicense": "", @@ -1102,7 +1150,8 @@ "Button": "", "RepeatingTexture": "", "SpritedCounter": "", - "TextBox": "" + "TextBox": "", + "BitmapText": "" }, "nineSliceTop": "", "nineSliceRight": "", @@ -1114,7 +1163,9 @@ "scrollSpeedX": "", "scrollSpeedY": "", "isUi": "To use u.time or u.timeUi", - "defaultCount": "A label for a field that sets how many sprites are shown when no value has been set through code." + "defaultCount": "A label for a field that sets how many sprites are shown when no value has been set through code.", + "useBitmapText": "", + "errorBitmapNotConfigured": "" }, "assetInput": { "changeAsset": "", @@ -1178,7 +1229,9 @@ "OnAppFocus": "", "OnAppBlur": "", "OnTextChange": "", - "OnTextInput": "" + "OnTextInput": "", + "OnBehaviorAdded": "", + "OnBehaviorRemoved": "" }, "coreParameterizedNames": { "OnActionPress": "", @@ -1218,12 +1271,16 @@ "OnAppFocus": "", "OnAppBlur": "", "OnTextChange": "", - "OnTextInput": "" + "OnTextInput": "", + "OnBehaviorAdded": "", + "OnBehaviorRemoved": "" }, "jumpToProblem": "", "staticEventWarning": "", "restrictedEventWarning": "", - "baseClassWarning": "" + "baseClassWarning": "", + "typedefs": "", + "typedefsHint": "" }, "assetConfirm": { "confirmHeading": "", @@ -1252,7 +1309,10 @@ "emptySound": "", "emptyEmitter": "", "windowsFileLock": "", - "noTemplateTexture": "" + "noTemplateTexture": "", + "blockArgumentMissing": "", + "blockDeclarationMissing": "", + "eventMissing": "" }, "stacktrace": "", "jumpToProblem": "", @@ -1271,7 +1331,10 @@ "jsAndTs": "", "jsTsDescription": "", "pickJsTs": "", - "acceptAndSpecifyDirectory": "" + "acceptAndSpecifyDirectory": "", + "catnip": "", + "catnipDescription": "", + "pickCatnip": "" }, "newAssetPrompt": { "heading": "", @@ -1280,7 +1343,9 @@ "scriptView": { "runAutomatically": "", "language": "", - "convertToJavaScript": "" + "convertToJavaScript": "", + "confirmSwitchToCatnip": "", + "confirmSwitchFromCatnip": "" }, "soundView": { "variants": "", @@ -1300,5 +1365,426 @@ "falloff": "", "refDistance": "", "positionalAudioHint": "" + }, + "catnip": { + "trashZoneHint": "", + "properties": "", + "propertiesHint": "", + "variables": "", + "variablesHint": "", + "createNewProperty": "", + "createNewVariable": "", + "newPropertyPrompt": "", + "newVariablePrompt": "", + "errorBlock": "", + "errorBlockDeleteHint": "", + "asyncHint": "", + "optionsAdvanced": "", + "addCustomOption": "", + "changeBlockTo": "$1 will be replaced with the name of a block in context menus", + "placeholders": { + "putBlocksHere": "", + "doNothing": "" + }, + "coreLibs": { + "appearance": "", + "arrays": "", + "backgrounds": "", + "behaviors": "", + "camera": "", + "console": "", + "emitter tandems": "", + "logic": "", + "math": "", + "misc": "", + "movement": "", + "objects": "", + "rooms": "", + "settings": "", + "sounds": "", + "strings": "", + "styles": "", + "templates": "", + "utilities": "", + "actions": "", + "timers": "" + }, + "blockNames": { + "kill copy": "", + "move copy": "", + "set speed": "", + "set gravity": "", + "set gravityDir": "", + "set hspeed": "", + "set vspeed": "", + "set direction": "", + "get speed": "", + "get gravity": "", + "get gravityDir": "", + "get hspeed": "", + "get vspeed": "", + "get direction": "", + "y of copy": "", + "x of copy": "", + "set property variable": "", + "increment": "", + "decrement": "", + "increase": "", + "decrease": "", + "this write": "", + "current room write": "", + "write property to object": "", + "this read": "", + "room read": "", + "object read": "", + "object delete": "", + "new array": "", + "new object": "", + "new empty object": "", + "convert to string": "", + "convert to number": "", + "convert to boolean": "", + "note": "", + "plainJs": "", + "color": "", + "variable": "", + "property": "", + "behavior property": "", + "if else branch": "", + "while loop cycle": "", + "repeat": "", + "for each": "", + "break loop": "", + "NOT logic operator": "", + "AND logic operator": "", + "OR logic operator": "", + "AND AND logic operator": "", + "OR OR logic operator": "", + "is": "", + "is not": "", + "set texture": "", + "set scale": "", + "set scale xy": "", + "set angle": "", + "set skew": "", + "skew x": "", + "skew y": "", + "set alpha": "", + "scale x": "", + "scale y": "", + "get angle": "", + "get alpha": "", + "set tint": "", + "get tint": "", + "play animation": "", + "stop animation": "", + "goto frame play": "", + "goto frame stop": "", + "goto frame": "", + "get animation speed": "", + "set animation speed": "", + "this": "As a JavaScript keyword. If translation is complicated, you can use \"I\" or \"me\" instead of \"this\".", + "concatenate strings": "", + "templates Templates copy into room": "", + "templates Templates copy": "", + "templates Templates each": "", + "templates Templates with copy": "", + "templates Templates with template": "", + "templates templates exists": "", + "rooms Rooms add bg": "", + "rooms Rooms clear": "", + "rooms Rooms remove": "", + "rooms Rooms switch": "", + "rooms Rooms restart": "", + "rooms Rooms append": "", + "rooms Rooms prepend": "", + "rooms Rooms merge": "", + "rooms rooms current": "", + "rooms rooms list": "", + "rooms rooms starting": "", + "behaviors Behaviors add": "", + "behaviors Behaviors remove": "", + "behaviors behaviors has": "", + "sounds Sounds play": "", + "sounds Sounds play at": "", + "sounds Sounds stop": "", + "sounds Sounds pause": "", + "sounds Sounds resume": "", + "sounds Sounds global volume": "", + "sounds Sounds fade": "", + "sounds Sounds add filter": "", + "sounds Sounds add distortion": "", + "sounds Sounds add equalizer": "", + "sounds Sounds add mono filter": "", + "sounds Sounds add reverb": "", + "sounds Sounds add stereo filter": "", + "sounds Sounds add panner filter": "", + "sounds Sounds add telephone": "", + "sounds Sounds remove filter": "", + "sounds Sounds speed all": "", + "sounds sounds load": "", + "sounds sounds exists": "", + "sounds sounds playing": "", + "sounds sounds toggle mute all": "", + "sounds sounds toggle pause all": "", + "styles styles get": "", + "backgrounds Backgrounds add": "", + "backgrounds backgrounds list": "", + "emitter tandems Emitters fire": "", + "emitter tandems Emitters append": "", + "emitter tandems Emitters follow": "", + "utilities U reshape nine patch": "", + "utilities u time": "", + "utilities u time ui": "", + "utilities u get environment": "", + "utilities u get os": "", + "utilities u ldx": "", + "utilities u ldy": "", + "utilities u pdn": "", + "utilities u pdc": "", + "utilities u deg to rad": "", + "utilities u rad to deg": "", + "utilities u rotate": "", + "utilities u rotate rad": "", + "utilities u delta dir": "", + "utilities u clamp": "", + "utilities u lerp": "", + "utilities u unlerp": "", + "utilities u map": "", + "utilities u get rect shape": "", + "utilities u prect": "", + "utilities u pcircle": "", + "utilities u ui to css coord": "", + "utilities u game to css coord": "", + "utilities u ui to css scalar": "", + "utilities u game to css scalar": "", + "utilities u game to ui coord": "", + "utilities u ui to game coord": "", + "utilities u numbered string": "", + "utilities u get string number": "", + "settings settings high density": "", + "settings settings target fps": "", + "settings settings view mode": "", + "settings settings fullscreen": "", + "settings settings pixelart": "", + "settings settings prevent default": "", + "set x": "", + "set y": "", + "get x": "Probably doesn't need translation at all.", + "get y": "Probably doesn't need translation at all.", + "follow this": "", + "follow": "", + "set zoom": "", + "get zoom": "", + "set targetX": "", + "set targetY": "", + "set shiftX": "", + "set shiftY": "", + "set drift": "", + "set rotation": "", + "set followX": "", + "set followY": "", + "set borderX": "", + "set borderY": "", + "set shake": "", + "set shakeDecay": "", + "set shakeFrequency": "", + "set shakeX": "", + "set shakeY": "", + "set shakeMax": "", + "set minX": "", + "set maxX": "", + "set minY": "", + "set maxY": "", + "get targetX": "", + "get targetY": "", + "get computedX": "", + "get computedY": "", + "get shiftX": "", + "get shiftY": "", + "get drift": "", + "get left": "", + "get right": "", + "get top": "", + "get bottom": "", + "get rotation": "", + "get followX": "", + "get followY": "", + "get borderX": "", + "get borderY": "", + "get shake": "", + "get shakeDecay": "", + "get shakeFrequency": "", + "get shakeX": "", + "get shakeY": "", + "get shakeMax": "", + "get minX": "", + "get maxX": "", + "get minY": "", + "get maxY": "", + "console log": "", + "console warn": "", + "console error": "", + "set depth": "", + "get depth": "", + "script options": "", + "run script": "", + "get width": "", + "get height": "", + "set width": "", + "set height": "", + "const string": "", + "if branch": "", + "concatenate strings triple": "", + "emitter tandems Emitters stop": "", + "emitter tandems Emitters pause": "", + "emitter tandems Emitters resume": "", + "emitter tandems Emitters clear": "", + "utilities U wait": "", + "utilities U wait ui": "", + "hasSubstring": "", + "substringPosition": "", + "stringLength": "", + "replace substring": "", + "replace all substrings": "", + "trim whitespace": "", + "regex passes": "", + "replace by regex": "", + "replace all by regex": "", + "split by a substring": "", + "split": "", + "slice a string": "", + "to uppercase": "", + "to lowercase": "", + "array unshift": "", + "array push": "", + "add element at position": "", + "array pop": "", + "array shift": "", + "remove element from array": "", + "remove at position": "", + "filter array": "", + "map array": "", + "set text": "", + "set disabled": "", + "get text": "", + "get disabled": "", + "define function": "", + "return": "", + "execute function": "", + "get function option": "", + "set timer 1": "", + "set timer 2": "", + "set timer 3": "", + "set timer 4": "", + "set timer 5": "", + "set timer 6": "", + "get timer 1": "", + "get timer 2": "", + "get timer 3": "", + "get timer 4": "", + "get timer 5": "", + "get timer 6": "", + "set game speed": "", + "get game speed": "", + "deserialize object": "", + "serialize object": "", + "save to storage": "", + "delete from storage": "", + "load from storage": "", + "is key in storage": "", + "owning room": "" + }, + "blockDisplayNames": { + "write": "", + "if else branch": "", + "while loop cycle": "", + "repeat": "", + "for each": "", + "NOT logic operator": "", + "set": "", + "x of": "As in a sentence \"get X of a copy\"", + "y of": "As in sentence \"get Y of a copy\"", + "options": "", + "lengthOf": "", + "split": "", + "join": "", + "add element": "", + "remove element": "", + "set timer 1 to": "", + "set timer 2 to": "", + "set timer 3 to": "", + "set timer 4 to": "", + "set timer 5 to": "", + "set timer 6 to": "", + "timer": "", + "read": "", + "set game speed to": "", + "game speed": "" + }, + "blockLabels": { + "value": "", + "property": "", + "changeBy": "", + "is not": "", + "is": "", + "else": "", + "timesCount": "", + "toWrite": "A preposition used when referring to something we write to", + "fromRead": "A preposition used when referring to something we read from", + "atPosition": "A preposition used when referring to something placed at position", + "forDuring": "A preposition used when referring to something happening for a specific duration", + "toDestination": "A preposition used when referring to a place, to a destination", + "store index in": "", + "store in": "", + "of array": "", + "of current room": "", + "to current room": "", + "AND": "", + "OR": "", + "then": "", + "catch": "", + "and play animation": "", + "and stop animation": "", + "scale": "", + "position": "", + "inInside": "", + "contains": "", + "replace": "", + "replaceAll": "", + "replaceByRegex": "", + "replaceAllByRegex": "", + "fromDestination": "", + "fromSource": "", + "store result in": "", + "and": "", + "at position": "", + "with results in": "", + "store new array in": "", + "and elements": "", + "secondsUnits": "" + }, + "blockOptions": { + "soundVolume": "", + "loop": "As in sound looping", + "isRoomUi": "", + "speed": "", + "start at": "", + "soundSingleInstance": "" + }, + "goToActions": "", + "copyDocHtml": "", + "copySelection": "", + "duplicateBlock": "", + "requiredField": "", + "unnamedGroup": "", + "blockDocumentation": { + "serialize object": "", + "constant string": "" + } + }, + "regionalLinks": { + "discord": "", + "telegram": "" } -} +} \ No newline at end of file diff --git a/app/data/i18n/Debug.json b/app/data/i18n/Debug.json index c29c4ede8..b925ac60a 100644 --- a/app/data/i18n/Debug.json +++ b/app/data/i18n/Debug.json @@ -99,10 +99,10 @@ "common.assetTypes.room.1", "common.assetTypes.room.2" ], - "font": [ - "common.assetTypes.font.0", - "common.assetTypes.font.1", - "common.assetTypes.font.2" + "typeface": [ + "common.assetTypes.typeface.0", + "common.assetTypes.typeface.1", + "common.assetTypes.typeface.2" ], "style": [ "common.assetTypes.style.0", @@ -161,7 +161,9 @@ "bottomRight": "common.alignModes.bottomRight", "fill": "common.alignModes.fill", "Scale": "common.alignModes.Scale" - } + }, + "download": "common.download", + "createStyleFromIt": "common.createStyleFromIt" }, "colorPicker": { "current": "colorPicker.current", @@ -237,7 +239,35 @@ "boosty": "intro.boosty", "sponsoredBy": "intro.sponsoredBy", "supportedBy": "intro.supportedBy", - "nothingToShowFiller": "intro.nothingToShowFiller" + "nothingToShowFiller": "intro.nothingToShowFiller", + "welcomeHeaders": [ + "intro.welcomeHeaders.0", + "intro.welcomeHeaders.1", + "intro.welcomeHeaders.2", + "intro.welcomeHeaders.3", + "intro.welcomeHeaders.4", + "intro.welcomeHeaders.5", + "intro.welcomeHeaders.6", + "intro.welcomeHeaders.7", + "intro.welcomeHeaders.8", + "intro.welcomeHeaders.9", + "intro.welcomeHeaders.10", + "intro.welcomeHeaders.11", + "intro.welcomeHeaders.12", + "intro.welcomeHeaders.13", + "intro.welcomeHeaders.14" + ], + "newUserHeader": "intro.newUserHeader", + "ctDistributions": { + "released": "intro.ctDistributions.released", + "nightly": "intro.ctDistributions.nightly", + "dev": "intro.ctDistributions.dev" + }, + "gamesFromCommunity": "intro.gamesFromCommunity", + "submitYourOwn": "intro.submitYourOwn", + "learningResources": "intro.learningResources", + "authorBy": "intro.authorBy", + "telegram": "intro.telegram" }, "modules": { "author": "modules.author", @@ -691,7 +721,11 @@ "HCBlack": "mainMenu.settings.themes.HCBlack", "RosePine": "mainMenu.settings.themes.RosePine", "RosePineMoon": "mainMenu.settings.themes.RosePineMoon", - "RosePineDawn": "mainMenu.settings.themes.RosePineDawn" + "RosePineDawn": "mainMenu.settings.themes.RosePineDawn", + "GoldenEye": "mainMenu.settings.themes.GoldenEye", + "AlmaSakura": "mainMenu.settings.themes.AlmaSakura", + "Synthwave": "mainMenu.settings.themes.Synthwave", + "OneDarkPro": "mainMenu.settings.themes.OneDarkPro" }, "codeFontDefault": "mainMenu.settings.codeFontDefault", "codeFontOldSchool": "mainMenu.settings.codeFontOldSchool", @@ -708,7 +742,16 @@ "language": "mainMenu.settings.language", "translateToYourLanguage": "mainMenu.settings.translateToYourLanguage", "prideMode": "mainMenu.settings.prideMode", - "altTemplateLayout": "mainMenu.settings.altTemplateLayout" + "altTemplateLayout": "mainMenu.settings.altTemplateLayout", + "changeDebuggerLayout": "mainMenu.settings.changeDebuggerLayout", + "debuggerLayout": "mainMenu.settings.debuggerLayout", + "debuggerLayouts": { + "split": "mainMenu.settings.debuggerLayouts.split", + "multiwindow": "mainMenu.settings.debuggerLayouts.multiwindow", + "automatic": "mainMenu.settings.debuggerLayouts.automatic" + }, + "autoapplyOnLaunch": "mainMenu.settings.autoapplyOnLaunch", + "scrollableCatnipLibrary": "mainMenu.settings.scrollableCatnipLibrary" }, "project": { "save": "mainMenu.project.save", @@ -787,7 +830,8 @@ "unwrapFolder": "assetViewer.unwrapFolder", "confirmDeleteFolder": "assetViewer.confirmDeleteFolder", "confirmUnwrapFolder": "assetViewer.confirmUnwrapFolder", - "exportBehavior": "assetViewer.exportBehavior" + "exportBehavior": "assetViewer.exportBehavior", + "exportTandem": "assetViewer.exportTandem" }, "soundRecorder": { "recorderHeading": "soundRecorder.recorderHeading", @@ -972,8 +1016,9 @@ "strokeColor": "styleView.strokeColor", "strokeWeight": "styleView.strokeWeight", "testText": "styleView.testText", - "fontFamily": "styleView.fontFamily", - "fontSize": "styleView.fontSize" + "fontSize": "styleView.fontSize", + "fallbackFontFamily": "styleView.fallbackFontFamily", + "notSupportedForBitmap": "styleView.notSupportedForBitmap" }, "textureView": { "center": "textureView.center", @@ -1041,7 +1086,10 @@ }, "customCharsetHint": "fontView.customCharsetHint", "fontWeight": "fontView.fontWeight", - "typefaceName": "fontView.typefaceName" + "typefaceName": "fontView.typefaceName", + "addFont": "fontView.addFont", + "pixelPerfect": "fontView.pixelPerfect", + "pixelPerfectTooltip": "fontView.pixelPerfectTooltip" }, "licensePanel": { "ctjsLicense": "licensePanel.ctjsLicense", @@ -1102,7 +1150,8 @@ "Button": "templateView.baseClass.Button", "RepeatingTexture": "templateView.baseClass.RepeatingTexture", "SpritedCounter": "templateView.baseClass.SpritedCounter", - "TextBox": "templateView.baseClass.TextBox" + "TextBox": "templateView.baseClass.TextBox", + "BitmapText": "templateView.baseClass.BitmapText" }, "nineSliceTop": "templateView.nineSliceTop", "nineSliceRight": "templateView.nineSliceRight", @@ -1114,7 +1163,9 @@ "scrollSpeedX": "templateView.scrollSpeedX", "scrollSpeedY": "templateView.scrollSpeedY", "isUi": "templateView.isUi", - "defaultCount": "templateView.defaultCount" + "defaultCount": "templateView.defaultCount", + "useBitmapText": "templateView.useBitmapText", + "errorBitmapNotConfigured": "templateView.errorBitmapNotConfigured" }, "assetInput": { "changeAsset": "assetInput.changeAsset", @@ -1178,7 +1229,9 @@ "OnAppFocus": "scriptables.coreEvents.OnAppFocus", "OnAppBlur": "scriptables.coreEvents.OnAppBlur", "OnTextChange": "scriptables.coreEvents.OnTextChange", - "OnTextInput": "scriptables.coreEvents.OnTextInput" + "OnTextInput": "scriptables.coreEvents.OnTextInput", + "OnBehaviorAdded": "scriptables.coreEvents.OnBehaviorAdded", + "OnBehaviorRemoved": "scriptables.coreEvents.OnBehaviorRemoved" }, "coreParameterizedNames": { "OnActionPress": "scriptables.coreParameterizedNames.OnActionPress", @@ -1218,12 +1271,16 @@ "OnAppFocus": "scriptables.coreEventsDescriptions.OnAppFocus", "OnAppBlur": "scriptables.coreEventsDescriptions.OnAppBlur", "OnTextChange": "scriptables.coreEventsDescriptions.OnTextChange", - "OnTextInput": "scriptables.coreEventsDescriptions.OnTextInput" + "OnTextInput": "scriptables.coreEventsDescriptions.OnTextInput", + "OnBehaviorAdded": "scriptables.coreEventsDescriptions.OnBehaviorAdded", + "OnBehaviorRemoved": "scriptables.coreEventsDescriptions.OnBehaviorRemoved" }, "jumpToProblem": "scriptables.jumpToProblem", "staticEventWarning": "scriptables.staticEventWarning", "restrictedEventWarning": "scriptables.restrictedEventWarning", - "baseClassWarning": "scriptables.baseClassWarning" + "baseClassWarning": "scriptables.baseClassWarning", + "typedefs": "scriptables.typedefs", + "typedefsHint": "scriptables.typedefsHint" }, "assetConfirm": { "confirmHeading": "assetConfirm.confirmHeading", @@ -1252,7 +1309,10 @@ "emptySound": "exporterError.clueSolutions.emptySound", "emptyEmitter": "exporterError.clueSolutions.emptyEmitter", "windowsFileLock": "exporterError.clueSolutions.windowsFileLock", - "noTemplateTexture": "exporterError.clueSolutions.noTemplateTexture" + "noTemplateTexture": "exporterError.clueSolutions.noTemplateTexture", + "blockArgumentMissing": "exporterError.clueSolutions.blockArgumentMissing", + "blockDeclarationMissing": "exporterError.clueSolutions.blockDeclarationMissing", + "eventMissing": "exporterError.clueSolutions.eventMissing" }, "stacktrace": "exporterError.stacktrace", "jumpToProblem": "exporterError.jumpToProblem", @@ -1271,7 +1331,10 @@ "jsAndTs": "languageSelector.jsAndTs", "jsTsDescription": "languageSelector.jsTsDescription", "pickJsTs": "languageSelector.pickJsTs", - "acceptAndSpecifyDirectory": "languageSelector.acceptAndSpecifyDirectory" + "acceptAndSpecifyDirectory": "languageSelector.acceptAndSpecifyDirectory", + "catnip": "languageSelector.catnip", + "catnipDescription": "languageSelector.catnipDescription", + "pickCatnip": "languageSelector.pickCatnip" }, "newAssetPrompt": { "heading": "newAssetPrompt.heading", @@ -1280,7 +1343,9 @@ "scriptView": { "runAutomatically": "scriptView.runAutomatically", "language": "scriptView.language", - "convertToJavaScript": "scriptView.convertToJavaScript" + "convertToJavaScript": "scriptView.convertToJavaScript", + "confirmSwitchToCatnip": "scriptView.confirmSwitchToCatnip", + "confirmSwitchFromCatnip": "scriptView.confirmSwitchFromCatnip" }, "soundView": { "variants": "soundView.variants", @@ -1300,5 +1365,426 @@ "falloff": "soundView.falloff", "refDistance": "soundView.refDistance", "positionalAudioHint": "soundView.positionalAudioHint" + }, + "catnip": { + "trashZoneHint": "catnip.trashZoneHint", + "properties": "catnip.properties", + "propertiesHint": "catnip.propertiesHint", + "variables": "catnip.variables", + "variablesHint": "catnip.variablesHint", + "createNewProperty": "catnip.createNewProperty", + "createNewVariable": "catnip.createNewVariable", + "newPropertyPrompt": "catnip.newPropertyPrompt", + "newVariablePrompt": "catnip.newVariablePrompt", + "errorBlock": "catnip.errorBlock", + "errorBlockDeleteHint": "catnip.errorBlockDeleteHint", + "asyncHint": "catnip.asyncHint", + "optionsAdvanced": "catnip.optionsAdvanced", + "addCustomOption": "catnip.addCustomOption", + "changeBlockTo": "catnip.changeBlockTo", + "placeholders": { + "putBlocksHere": "catnip.placeholders.putBlocksHere", + "doNothing": "catnip.placeholders.doNothing" + }, + "coreLibs": { + "appearance": "catnip.coreLibs.appearance", + "arrays": "catnip.coreLibs.arrays", + "backgrounds": "catnip.coreLibs.backgrounds", + "behaviors": "catnip.coreLibs.behaviors", + "camera": "catnip.coreLibs.camera", + "console": "catnip.coreLibs.console", + "emitter tandems": "catnip.coreLibs.emitter tandems", + "logic": "catnip.coreLibs.logic", + "math": "catnip.coreLibs.math", + "misc": "catnip.coreLibs.misc", + "movement": "catnip.coreLibs.movement", + "objects": "catnip.coreLibs.objects", + "rooms": "catnip.coreLibs.rooms", + "settings": "catnip.coreLibs.settings", + "sounds": "catnip.coreLibs.sounds", + "strings": "catnip.coreLibs.strings", + "styles": "catnip.coreLibs.styles", + "templates": "catnip.coreLibs.templates", + "utilities": "catnip.coreLibs.utilities", + "actions": "catnip.coreLibs.actions", + "timers": "catnip.coreLibs.timers" + }, + "blockNames": { + "kill copy": "catnip.blockNames.kill copy", + "move copy": "catnip.blockNames.move copy", + "set speed": "catnip.blockNames.set speed", + "set gravity": "catnip.blockNames.set gravity", + "set gravityDir": "catnip.blockNames.set gravityDir", + "set hspeed": "catnip.blockNames.set hspeed", + "set vspeed": "catnip.blockNames.set vspeed", + "set direction": "catnip.blockNames.set direction", + "get speed": "catnip.blockNames.get speed", + "get gravity": "catnip.blockNames.get gravity", + "get gravityDir": "catnip.blockNames.get gravityDir", + "get hspeed": "catnip.blockNames.get hspeed", + "get vspeed": "catnip.blockNames.get vspeed", + "get direction": "catnip.blockNames.get direction", + "y of copy": "catnip.blockNames.y of copy", + "x of copy": "catnip.blockNames.x of copy", + "set property variable": "catnip.blockNames.set property variable", + "increment": "catnip.blockNames.increment", + "decrement": "catnip.blockNames.decrement", + "increase": "catnip.blockNames.increase", + "decrease": "catnip.blockNames.decrease", + "this write": "catnip.blockNames.this write", + "current room write": "catnip.blockNames.current room write", + "write property to object": "catnip.blockNames.write property to object", + "this read": "catnip.blockNames.this read", + "room read": "catnip.blockNames.room read", + "object read": "catnip.blockNames.object read", + "object delete": "catnip.blockNames.object delete", + "new array": "catnip.blockNames.new array", + "new object": "catnip.blockNames.new object", + "new empty object": "catnip.blockNames.new empty object", + "convert to string": "catnip.blockNames.convert to string", + "convert to number": "catnip.blockNames.convert to number", + "convert to boolean": "catnip.blockNames.convert to boolean", + "note": "catnip.blockNames.note", + "plainJs": "catnip.blockNames.plainJs", + "color": "catnip.blockNames.color", + "variable": "catnip.blockNames.variable", + "property": "catnip.blockNames.property", + "behavior property": "catnip.blockNames.behavior property", + "if else branch": "catnip.blockNames.if else branch", + "while loop cycle": "catnip.blockNames.while loop cycle", + "repeat": "catnip.blockNames.repeat", + "for each": "catnip.blockNames.for each", + "break loop": "catnip.blockNames.break loop", + "NOT logic operator": "catnip.blockNames.NOT logic operator", + "AND logic operator": "catnip.blockNames.AND logic operator", + "OR logic operator": "catnip.blockNames.OR logic operator", + "AND AND logic operator": "catnip.blockNames.AND AND logic operator", + "OR OR logic operator": "catnip.blockNames.OR OR logic operator", + "is": "catnip.blockNames.is", + "is not": "catnip.blockNames.is not", + "set texture": "catnip.blockNames.set texture", + "set scale": "catnip.blockNames.set scale", + "set scale xy": "catnip.blockNames.set scale xy", + "set angle": "catnip.blockNames.set angle", + "set skew": "catnip.blockNames.set skew", + "skew x": "catnip.blockNames.skew x", + "skew y": "catnip.blockNames.skew y", + "set alpha": "catnip.blockNames.set alpha", + "scale x": "catnip.blockNames.scale x", + "scale y": "catnip.blockNames.scale y", + "get angle": "catnip.blockNames.get angle", + "get alpha": "catnip.blockNames.get alpha", + "set tint": "catnip.blockNames.set tint", + "get tint": "catnip.blockNames.get tint", + "play animation": "catnip.blockNames.play animation", + "stop animation": "catnip.blockNames.stop animation", + "goto frame play": "catnip.blockNames.goto frame play", + "goto frame stop": "catnip.blockNames.goto frame stop", + "goto frame": "catnip.blockNames.goto frame", + "get animation speed": "catnip.blockNames.get animation speed", + "set animation speed": "catnip.blockNames.set animation speed", + "this": "catnip.blockNames.this", + "concatenate strings": "catnip.blockNames.concatenate strings", + "templates Templates copy into room": "catnip.blockNames.templates Templates copy into room", + "templates Templates copy": "catnip.blockNames.templates Templates copy", + "templates Templates each": "catnip.blockNames.templates Templates each", + "templates Templates with copy": "catnip.blockNames.templates Templates with copy", + "templates Templates with template": "catnip.blockNames.templates Templates with template", + "templates templates exists": "catnip.blockNames.templates templates exists", + "rooms Rooms add bg": "catnip.blockNames.rooms Rooms add bg", + "rooms Rooms clear": "catnip.blockNames.rooms Rooms clear", + "rooms Rooms remove": "catnip.blockNames.rooms Rooms remove", + "rooms Rooms switch": "catnip.blockNames.rooms Rooms switch", + "rooms Rooms restart": "catnip.blockNames.rooms Rooms restart", + "rooms Rooms append": "catnip.blockNames.rooms Rooms append", + "rooms Rooms prepend": "catnip.blockNames.rooms Rooms prepend", + "rooms Rooms merge": "catnip.blockNames.rooms Rooms merge", + "rooms rooms current": "catnip.blockNames.rooms rooms current", + "rooms rooms list": "catnip.blockNames.rooms rooms list", + "rooms rooms starting": "catnip.blockNames.rooms rooms starting", + "behaviors Behaviors add": "catnip.blockNames.behaviors Behaviors add", + "behaviors Behaviors remove": "catnip.blockNames.behaviors Behaviors remove", + "behaviors behaviors has": "catnip.blockNames.behaviors behaviors has", + "sounds Sounds play": "catnip.blockNames.sounds Sounds play", + "sounds Sounds play at": "catnip.blockNames.sounds Sounds play at", + "sounds Sounds stop": "catnip.blockNames.sounds Sounds stop", + "sounds Sounds pause": "catnip.blockNames.sounds Sounds pause", + "sounds Sounds resume": "catnip.blockNames.sounds Sounds resume", + "sounds Sounds global volume": "catnip.blockNames.sounds Sounds global volume", + "sounds Sounds fade": "catnip.blockNames.sounds Sounds fade", + "sounds Sounds add filter": "catnip.blockNames.sounds Sounds add filter", + "sounds Sounds add distortion": "catnip.blockNames.sounds Sounds add distortion", + "sounds Sounds add equalizer": "catnip.blockNames.sounds Sounds add equalizer", + "sounds Sounds add mono filter": "catnip.blockNames.sounds Sounds add mono filter", + "sounds Sounds add reverb": "catnip.blockNames.sounds Sounds add reverb", + "sounds Sounds add stereo filter": "catnip.blockNames.sounds Sounds add stereo filter", + "sounds Sounds add panner filter": "catnip.blockNames.sounds Sounds add panner filter", + "sounds Sounds add telephone": "catnip.blockNames.sounds Sounds add telephone", + "sounds Sounds remove filter": "catnip.blockNames.sounds Sounds remove filter", + "sounds Sounds speed all": "catnip.blockNames.sounds Sounds speed all", + "sounds sounds load": "catnip.blockNames.sounds sounds load", + "sounds sounds exists": "catnip.blockNames.sounds sounds exists", + "sounds sounds playing": "catnip.blockNames.sounds sounds playing", + "sounds sounds toggle mute all": "catnip.blockNames.sounds sounds toggle mute all", + "sounds sounds toggle pause all": "catnip.blockNames.sounds sounds toggle pause all", + "styles styles get": "catnip.blockNames.styles styles get", + "backgrounds Backgrounds add": "catnip.blockNames.backgrounds Backgrounds add", + "backgrounds backgrounds list": "catnip.blockNames.backgrounds backgrounds list", + "emitter tandems Emitters fire": "catnip.blockNames.emitter tandems Emitters fire", + "emitter tandems Emitters append": "catnip.blockNames.emitter tandems Emitters append", + "emitter tandems Emitters follow": "catnip.blockNames.emitter tandems Emitters follow", + "utilities U reshape nine patch": "catnip.blockNames.utilities U reshape nine patch", + "utilities u time": "catnip.blockNames.utilities u time", + "utilities u time ui": "catnip.blockNames.utilities u time ui", + "utilities u get environment": "catnip.blockNames.utilities u get environment", + "utilities u get os": "catnip.blockNames.utilities u get os", + "utilities u ldx": "catnip.blockNames.utilities u ldx", + "utilities u ldy": "catnip.blockNames.utilities u ldy", + "utilities u pdn": "catnip.blockNames.utilities u pdn", + "utilities u pdc": "catnip.blockNames.utilities u pdc", + "utilities u deg to rad": "catnip.blockNames.utilities u deg to rad", + "utilities u rad to deg": "catnip.blockNames.utilities u rad to deg", + "utilities u rotate": "catnip.blockNames.utilities u rotate", + "utilities u rotate rad": "catnip.blockNames.utilities u rotate rad", + "utilities u delta dir": "catnip.blockNames.utilities u delta dir", + "utilities u clamp": "catnip.blockNames.utilities u clamp", + "utilities u lerp": "catnip.blockNames.utilities u lerp", + "utilities u unlerp": "catnip.blockNames.utilities u unlerp", + "utilities u map": "catnip.blockNames.utilities u map", + "utilities u get rect shape": "catnip.blockNames.utilities u get rect shape", + "utilities u prect": "catnip.blockNames.utilities u prect", + "utilities u pcircle": "catnip.blockNames.utilities u pcircle", + "utilities u ui to css coord": "catnip.blockNames.utilities u ui to css coord", + "utilities u game to css coord": "catnip.blockNames.utilities u game to css coord", + "utilities u ui to css scalar": "catnip.blockNames.utilities u ui to css scalar", + "utilities u game to css scalar": "catnip.blockNames.utilities u game to css scalar", + "utilities u game to ui coord": "catnip.blockNames.utilities u game to ui coord", + "utilities u ui to game coord": "catnip.blockNames.utilities u ui to game coord", + "utilities u numbered string": "catnip.blockNames.utilities u numbered string", + "utilities u get string number": "catnip.blockNames.utilities u get string number", + "settings settings high density": "catnip.blockNames.settings settings high density", + "settings settings target fps": "catnip.blockNames.settings settings target fps", + "settings settings view mode": "catnip.blockNames.settings settings view mode", + "settings settings fullscreen": "catnip.blockNames.settings settings fullscreen", + "settings settings pixelart": "catnip.blockNames.settings settings pixelart", + "settings settings prevent default": "catnip.blockNames.settings settings prevent default", + "set x": "catnip.blockNames.set x", + "set y": "catnip.blockNames.set y", + "get x": "catnip.blockNames.get x", + "get y": "catnip.blockNames.get y", + "follow this": "catnip.blockNames.follow this", + "follow": "catnip.blockNames.follow", + "set zoom": "catnip.blockNames.set zoom", + "get zoom": "catnip.blockNames.get zoom", + "set targetX": "catnip.blockNames.set targetX", + "set targetY": "catnip.blockNames.set targetY", + "set shiftX": "catnip.blockNames.set shiftX", + "set shiftY": "catnip.blockNames.set shiftY", + "set drift": "catnip.blockNames.set drift", + "set rotation": "catnip.blockNames.set rotation", + "set followX": "catnip.blockNames.set followX", + "set followY": "catnip.blockNames.set followY", + "set borderX": "catnip.blockNames.set borderX", + "set borderY": "catnip.blockNames.set borderY", + "set shake": "catnip.blockNames.set shake", + "set shakeDecay": "catnip.blockNames.set shakeDecay", + "set shakeFrequency": "catnip.blockNames.set shakeFrequency", + "set shakeX": "catnip.blockNames.set shakeX", + "set shakeY": "catnip.blockNames.set shakeY", + "set shakeMax": "catnip.blockNames.set shakeMax", + "set minX": "catnip.blockNames.set minX", + "set maxX": "catnip.blockNames.set maxX", + "set minY": "catnip.blockNames.set minY", + "set maxY": "catnip.blockNames.set maxY", + "get targetX": "catnip.blockNames.get targetX", + "get targetY": "catnip.blockNames.get targetY", + "get computedX": "catnip.blockNames.get computedX", + "get computedY": "catnip.blockNames.get computedY", + "get shiftX": "catnip.blockNames.get shiftX", + "get shiftY": "catnip.blockNames.get shiftY", + "get drift": "catnip.blockNames.get drift", + "get left": "catnip.blockNames.get left", + "get right": "catnip.blockNames.get right", + "get top": "catnip.blockNames.get top", + "get bottom": "catnip.blockNames.get bottom", + "get rotation": "catnip.blockNames.get rotation", + "get followX": "catnip.blockNames.get followX", + "get followY": "catnip.blockNames.get followY", + "get borderX": "catnip.blockNames.get borderX", + "get borderY": "catnip.blockNames.get borderY", + "get shake": "catnip.blockNames.get shake", + "get shakeDecay": "catnip.blockNames.get shakeDecay", + "get shakeFrequency": "catnip.blockNames.get shakeFrequency", + "get shakeX": "catnip.blockNames.get shakeX", + "get shakeY": "catnip.blockNames.get shakeY", + "get shakeMax": "catnip.blockNames.get shakeMax", + "get minX": "catnip.blockNames.get minX", + "get maxX": "catnip.blockNames.get maxX", + "get minY": "catnip.blockNames.get minY", + "get maxY": "catnip.blockNames.get maxY", + "console log": "catnip.blockNames.console log", + "console warn": "catnip.blockNames.console warn", + "console error": "catnip.blockNames.console error", + "set depth": "catnip.blockNames.set depth", + "get depth": "catnip.blockNames.get depth", + "script options": "catnip.blockNames.script options", + "run script": "catnip.blockNames.run script", + "get width": "catnip.blockNames.get width", + "get height": "catnip.blockNames.get height", + "set width": "catnip.blockNames.set width", + "set height": "catnip.blockNames.set height", + "const string": "catnip.blockNames.const string", + "if branch": "catnip.blockNames.if branch", + "concatenate strings triple": "catnip.blockNames.concatenate strings triple", + "emitter tandems Emitters stop": "catnip.blockNames.emitter tandems Emitters stop", + "emitter tandems Emitters pause": "catnip.blockNames.emitter tandems Emitters pause", + "emitter tandems Emitters resume": "catnip.blockNames.emitter tandems Emitters resume", + "emitter tandems Emitters clear": "catnip.blockNames.emitter tandems Emitters clear", + "utilities U wait": "catnip.blockNames.utilities U wait", + "utilities U wait ui": "catnip.blockNames.utilities U wait ui", + "hasSubstring": "catnip.blockNames.hasSubstring", + "substringPosition": "catnip.blockNames.substringPosition", + "stringLength": "catnip.blockNames.stringLength", + "replace substring": "catnip.blockNames.replace substring", + "replace all substrings": "catnip.blockNames.replace all substrings", + "trim whitespace": "catnip.blockNames.trim whitespace", + "regex passes": "catnip.blockNames.regex passes", + "replace by regex": "catnip.blockNames.replace by regex", + "replace all by regex": "catnip.blockNames.replace all by regex", + "split by a substring": "catnip.blockNames.split by a substring", + "split": "catnip.blockNames.split", + "slice a string": "catnip.blockNames.slice a string", + "to uppercase": "catnip.blockNames.to uppercase", + "to lowercase": "catnip.blockNames.to lowercase", + "array unshift": "catnip.blockNames.array unshift", + "array push": "catnip.blockNames.array push", + "add element at position": "catnip.blockNames.add element at position", + "array pop": "catnip.blockNames.array pop", + "array shift": "catnip.blockNames.array shift", + "remove element from array": "catnip.blockNames.remove element from array", + "remove at position": "catnip.blockNames.remove at position", + "filter array": "catnip.blockNames.filter array", + "map array": "catnip.blockNames.map array", + "set text": "catnip.blockNames.set text", + "set disabled": "catnip.blockNames.set disabled", + "get text": "catnip.blockNames.get text", + "get disabled": "catnip.blockNames.get disabled", + "define function": "catnip.blockNames.define function", + "return": "catnip.blockNames.return", + "execute function": "catnip.blockNames.execute function", + "get function option": "catnip.blockNames.get function option", + "set timer 1": "catnip.blockNames.set timer 1", + "set timer 2": "catnip.blockNames.set timer 2", + "set timer 3": "catnip.blockNames.set timer 3", + "set timer 4": "catnip.blockNames.set timer 4", + "set timer 5": "catnip.blockNames.set timer 5", + "set timer 6": "catnip.blockNames.set timer 6", + "get timer 1": "catnip.blockNames.get timer 1", + "get timer 2": "catnip.blockNames.get timer 2", + "get timer 3": "catnip.blockNames.get timer 3", + "get timer 4": "catnip.blockNames.get timer 4", + "get timer 5": "catnip.blockNames.get timer 5", + "get timer 6": "catnip.blockNames.get timer 6", + "set game speed": "catnip.blockNames.set game speed", + "get game speed": "catnip.blockNames.get game speed", + "deserialize object": "catnip.blockNames.deserialize object", + "serialize object": "catnip.blockNames.serialize object", + "save to storage": "catnip.blockNames.save to storage", + "delete from storage": "catnip.blockNames.delete from storage", + "load from storage": "catnip.blockNames.load from storage", + "is key in storage": "catnip.blockNames.is key in storage", + "owning room": "catnip.blockNames.owning room" + }, + "blockDisplayNames": { + "write": "catnip.blockDisplayNames.write", + "if else branch": "catnip.blockDisplayNames.if else branch", + "while loop cycle": "catnip.blockDisplayNames.while loop cycle", + "repeat": "catnip.blockDisplayNames.repeat", + "for each": "catnip.blockDisplayNames.for each", + "NOT logic operator": "catnip.blockDisplayNames.NOT logic operator", + "set": "catnip.blockDisplayNames.set", + "x of": "catnip.blockDisplayNames.x of", + "y of": "catnip.blockDisplayNames.y of", + "options": "catnip.blockDisplayNames.options", + "lengthOf": "catnip.blockDisplayNames.lengthOf", + "split": "catnip.blockDisplayNames.split", + "join": "catnip.blockDisplayNames.join", + "add element": "catnip.blockDisplayNames.add element", + "remove element": "catnip.blockDisplayNames.remove element", + "set timer 1 to": "catnip.blockDisplayNames.set timer 1 to", + "set timer 2 to": "catnip.blockDisplayNames.set timer 2 to", + "set timer 3 to": "catnip.blockDisplayNames.set timer 3 to", + "set timer 4 to": "catnip.blockDisplayNames.set timer 4 to", + "set timer 5 to": "catnip.blockDisplayNames.set timer 5 to", + "set timer 6 to": "catnip.blockDisplayNames.set timer 6 to", + "timer": "catnip.blockDisplayNames.timer", + "read": "catnip.blockDisplayNames.read", + "set game speed to": "catnip.blockDisplayNames.set game speed to", + "game speed": "catnip.blockDisplayNames.game speed" + }, + "blockLabels": { + "value": "catnip.blockLabels.value", + "property": "catnip.blockLabels.property", + "changeBy": "catnip.blockLabels.changeBy", + "is not": "catnip.blockLabels.is not", + "is": "catnip.blockLabels.is", + "else": "catnip.blockLabels.else", + "timesCount": "catnip.blockLabels.timesCount", + "toWrite": "catnip.blockLabels.toWrite", + "fromRead": "catnip.blockLabels.fromRead", + "atPosition": "catnip.blockLabels.atPosition", + "forDuring": "catnip.blockLabels.forDuring", + "toDestination": "catnip.blockLabels.toDestination", + "store index in": "catnip.blockLabels.store index in", + "store in": "catnip.blockLabels.store in", + "of array": "catnip.blockLabels.of array", + "of current room": "catnip.blockLabels.of current room", + "to current room": "catnip.blockLabels.to current room", + "AND": "catnip.blockLabels.AND", + "OR": "catnip.blockLabels.OR", + "then": "catnip.blockLabels.then", + "catch": "catnip.blockLabels.catch", + "and play animation": "catnip.blockLabels.and play animation", + "and stop animation": "catnip.blockLabels.and stop animation", + "scale": "catnip.blockLabels.scale", + "position": "catnip.blockLabels.position", + "inInside": "catnip.blockLabels.inInside", + "contains": "catnip.blockLabels.contains", + "replace": "catnip.blockLabels.replace", + "replaceAll": "catnip.blockLabels.replaceAll", + "replaceByRegex": "catnip.blockLabels.replaceByRegex", + "replaceAllByRegex": "catnip.blockLabels.replaceAllByRegex", + "fromDestination": "catnip.blockLabels.fromDestination", + "fromSource": "catnip.blockLabels.fromSource", + "store result in": "catnip.blockLabels.store result in", + "and": "catnip.blockLabels.and", + "at position": "catnip.blockLabels.at position", + "with results in": "catnip.blockLabels.with results in", + "store new array in": "catnip.blockLabels.store new array in", + "and elements": "catnip.blockLabels.and elements", + "secondsUnits": "catnip.blockLabels.secondsUnits" + }, + "blockOptions": { + "soundVolume": "catnip.blockOptions.soundVolume", + "loop": "catnip.blockOptions.loop", + "isRoomUi": "catnip.blockOptions.isRoomUi", + "speed": "catnip.blockOptions.speed", + "start at": "catnip.blockOptions.start at", + "soundSingleInstance": "catnip.blockOptions.soundSingleInstance" + }, + "goToActions": "catnip.goToActions", + "copyDocHtml": "catnip.copyDocHtml", + "copySelection": "catnip.copySelection", + "duplicateBlock": "catnip.duplicateBlock", + "requiredField": "catnip.requiredField", + "unnamedGroup": "catnip.unnamedGroup", + "blockDocumentation": { + "serialize object": "catnip.blockDocumentation.serialize object", + "constant string": "catnip.blockDocumentation.constant string" + } + }, + "regionalLinks": { + "discord": "regionalLinks.discord", + "telegram": "regionalLinks.telegram" } -} +} \ No newline at end of file diff --git a/app/data/i18n/Dutch.json b/app/data/i18n/Dutch.json index 37f52d696..37d8fe29e 100644 --- a/app/data/i18n/Dutch.json +++ b/app/data/i18n/Dutch.json @@ -99,7 +99,7 @@ "kamers", "kamers" ], - "font": [ + "typeface": [ "lettertype", "lettertypes", "lettertypes" @@ -965,7 +965,6 @@ "strokeColor": "Lijnkleur:", "strokeWeight": "Lijn breedte:", "testText": "Test tekst 0123 +", - "fontFamily": "Lettertypefamilie:", "fontSize": "Lettertype grootte:" }, "textureView": { diff --git a/app/data/i18n/English.json b/app/data/i18n/English.json index 9d0b7b4ef..ebd57d347 100644 --- a/app/data/i18n/English.json +++ b/app/data/i18n/English.json @@ -4,6 +4,10 @@ "native": "English", "eng": "English" }, + "regionalLinks": { + "discord": "https://comigo.games/discord", + "telegram": "https://t.me/ctjsen" + }, "common": { "add": "Add", "addBehavior": "Add a Behavior", @@ -27,6 +31,7 @@ "docsLong": "Documentation", "donate": "Donate", "done": "Done!", + "download": "Download", "duplicate": "Duplicate", "edit": "Edit", "exit": "Exit", @@ -95,6 +100,7 @@ "tileLayer": "tile layer", "ctSite": "ct.js homepage", "openAssetGallery": "Gallery", + "createStyleFromIt": "Create a style from it", "alignModes": { "left": "Left", "right": "Right", @@ -136,10 +142,10 @@ "rooms", "rooms" ], - "font": [ - "font", - "fonts", - "fonts" + "typeface": [ + "typeface", + "typefaces", + "typefaces" ], "script": [ "script", @@ -201,6 +207,431 @@ "visitAuthorsTwitter": "Visit author's Twitter page", "tipAuthor": "Tip the author for their hard work :D" }, + "catnip": { + "trashZoneHint": "Drop blocks here to quickly delete them", + "properties": "Properties", + "propertiesHint": "Properties are stored in the copy or room and can be accessed later, including from other copies.", + "variables": "Variables", + "variablesHint": "Variables are temporary and exist only for this event's run. They're good for storing results of quick calculations.", + "globalVariables": "Global variables", + "globalVariablesHint": "Global variables are accessible from anywhere in your project. They're not saved between runs; for that, use \"Save to storage\" and \"Load from storage\" blocks.", + "createNewProperty": "New property", + "createNewVariable": "New variable", + "createNewGlobalVariable": "New global variable", + "newPropertyPrompt": "Input the name for the new property:", + "newVariablePrompt": "Input the name for the new variable. The name must not contain whitespace or any special letters, and must start with a letter.", + "newGlobalVariablePrompt": "Input the name for the new global variable. The name must not contain whitespace or any special letters, and must start with a letter.", + "invalidVarNameError": "Invalid variable name. The name must not contain whitespace or any special letters, and must start with a letter.", + "renamePropertyPrompt": "Input the new name for this property:", + "renameVariablePrompt": "Input the new name for this variable:", + "renamingAcrossProject": "Replacing variable name in other assets…", + "errorBlock": "Missing block from library", + "errorBlockDeleteHint": "Right-click to delete it.", + "asyncHint": "This block runs asynchronously, meaning that it will execute later and won't block the rest of the script. Use block areas inside this one to run commands on its completion, but do note that things can change while this block runs: for example, the copy that runs this block may be deleted (depending on your gameplay logic) and thus will become unusable when this block finishes.", + "optionsAdvanced": "Advanced", + "addCustomOption": "Add a custom property", + "changeBlockTo": "Change to \"$1\"", + "goToActions": "Open Actions settings", + "copyDocHtml": "Copy as HTML for docs", + "copySelection": "Copy selected blocks", + "duplicateBlock": "Duplicate this block", + "requiredField": "This field is required and is missing a value.", + "unnamedGroup": "Unnamed group", + "placeholders": { + "putBlocksHere": "Put your blocks here", + "doNothing": "Do nothing" + }, + "coreLibs": { + "appearance": "Appearance", + "arrays": "Arrays", + "backgrounds": "Backgrounds", + "behaviors": "Behaviors", + "camera": "Camera", + "console": "Console", + "emitter tandems": "Emitters", + "logic": "Logic", + "math": "Math", + "misc": "Miscellaneous", + "movement": "Movement", + "objects": "Objects", + "rooms": "Rooms", + "settings": "Settings", + "sounds": "Sounds", + "strings": "Strings", + "templates": "Templates", + "utilities": "Utilities", + "actions": "Actions", + "timers": "Timers" + }, + "blockNames": { + "kill copy": "Destroy this copy", + "move copy": "Move this copy", + "set speed": "Set speed to", + "set gravity": "Set gravity to", + "set gravityDir": "Set gravity direction to", + "set hspeed": "Set horizontal speed to", + "set vspeed": "Set vertical speed to", + "set direction": "Set direction to", + "get speed": "speed", + "get gravity": "gravity", + "get gravityDir": "gravity direction", + "get hspeed": "horizontal speed", + "get vspeed": "vertical speed", + "get direction": "direction", + "y of copy": "y of a copy", + "x of copy": "x of a copy", + "get width": "width", + "get height": "height", + "set width": "Set width to", + "set height": "Set height to", + "set property variable": "Set property/variable", + "increment": "Increment", + "decrement": "Decrement", + "increase": "Increase", + "decrease": "Decrease", + "this write": "Write", + "current room write": "Write to the current room", + "write property to object": "Write to the object", + "this read": "read", + "room read": "current room's property", + "object read": "object's property", + "object delete": "Delete property in an object", + "new array": "new array", + "new object": "Create a new object", + "new empty object": "new empy object", + "convert to string": "to string", + "const string": "String (a constant value)", + "convert to number": "to number", + "convert to boolean": "to boolean", + "note": "Note", + "plainJs": "Execute JavaScript", + "color": "color", + "variable": "Variable", + "property": "Property", + "behavior property": "Behavior's property", + "content type entries": "Content type entries", + "if else branch": "If-else branch", + "if branch": "If branch", + "while loop cycle": "While loop", + "repeat": "Repeat N times", + "for each": "For each element of array", + "break loop": "Stop this loop", + "NOT logic operator": "NOT logic operator", + "AND logic operator": "AND logic operator", + "OR logic operator": "OR logic operator", + "AND AND logic operator": "double AND logic operator", + "OR OR logic operator": "double OR logic operator", + "is": "Is (equal to)", + "is not": "Is not (not equal to)", + "set texture": "Set texture to", + "set scale": "Set scale to", + "set scale xy": "Set scale to", + "set angle": "Set texture rotation to", + "set skew": "Set skew to", + "skew x": "skew by x", + "skew y": "skew by y", + "set alpha": "Set opacity to", + "scale x": "scale by x", + "scale y": "scale by y", + "get angle": "texture rotation", + "get alpha": "opacity", + "set tint": "Set tint to", + "get tint": "tint", + "play animation": "Play animation", + "stop animation": "Stop animation", + "goto frame play": "Go to a frame and play the animation", + "goto frame stop": "Go to a frame and stop the animation", + "goto frame": "Go to a frame", + "get animation speed": "animation speed", + "set animation speed": "Set animation speed to", + "this": "this", + "concatenate strings": "Concatenate strings", + "concatenate strings triple": "Concatenate strings (triple)", + "templates Templates copy into room": "Copy a template into room", + "templates Templates copy": "Copy a template", + "templates Templates each": "For each copy", + "templates Templates with copy": "With copy", + "templates Templates with template": "With all copies of a template", + "templates templates exists": "template's copies exist", + "rooms Rooms add bg": "Add background", + "rooms Rooms clear": "Clear the current room", + "rooms Rooms remove": "Remove a room", + "rooms Rooms switch": "Switch to", + "rooms Rooms restart": "Restart the current room", + "rooms Rooms append": "Append a room", + "rooms Rooms prepend": "Prepend a room", + "rooms Rooms merge": "Merge into current room", + "rooms rooms current": "current room", + "rooms rooms list": "rooms list", + "rooms rooms starting": "starting room", + "behaviors Behaviors add": "Add a behavior to", + "behaviors Behaviors remove": "Remove a behavior from", + "behaviors behaviors has": "has behavior", + "sounds Sounds play": "Play a sound", + "sounds Sounds play at": "Play a 3D sound", + "sounds Sounds stop": "Stop sound", + "sounds Sounds pause": "Pause sound", + "sounds Sounds resume": "Resume sound", + "sounds Sounds global volume": "Set global volume", + "sounds Sounds fade": "Fade a sound", + "sounds Sounds add filter": "Add a filter to a sound", + "sounds Sounds add distortion": "Add a distortion filter", + "sounds Sounds add equalizer": "Add an equalizer filter", + "sounds Sounds add mono filter": "Add a mono filter", + "sounds Sounds add reverb": "Add a reverb filter", + "sounds Sounds add stereo filter": "Add a stereo filter", + "sounds Sounds add panner filter": "Add a 3D panner filter", + "sounds Sounds add telephone": "Add a telephone filter", + "sounds Sounds remove filter": "Remove a filter from a sound", + "sounds Sounds speed all": "Set global sound speed", + "sounds sounds load": "Load a sound", + "sounds sounds exists": "sound exists", + "sounds sounds playing": "is sound playing", + "sounds sounds toggle mute all": "all sounds muted", + "sounds sounds toggle pause all": "all sounds paused", + "styles styles get": "get a style", + "backgrounds Backgrounds add": "Add a background", + "backgrounds backgrounds list": "list of backgrounds", + "emitter tandems Emitters fire": "Fire an emitter at location", + "emitter tandems Emitters append": "Append an emitter", + "emitter tandems Emitters follow": "Create an emitter and follow", + "emitter tandems Emitters stop": "Stop and destroy the emitter", + "emitter tandems Emitters pause": "Pause the emitter", + "emitter tandems Emitters resume": "Resume the emitter", + "emitter tandems Emitters clear": "Clear the emitter's particles", + "utilities U reshape nine patch": "Reshape a nine-slice panel", + "utilities u time": "time", + "utilities u time ui": "ui time", + "utilities u get environment": "environment", + "utilities u get os": "current os", + "utilities u ldx": "x length of a vector", + "utilities u ldy": "y length of a vector", + "utilities u pdn": "2-point direction", + "utilities u pdc": "2-point distance", + "utilities u deg to rad": "degrees to radians", + "utilities u rad to deg": "radians to degrees", + "utilities u rotate": "rotate a vector", + "utilities u rotate rad": "rotate a vector in radians", + "utilities u delta dir": "direction difference", + "utilities u clamp": "clamp", + "utilities u lerp": "interpolate", + "utilities u unlerp": "un-interpolate", + "utilities u map": "remap a value", + "utilities u get rect shape": "get rectangular shape", + "utilities u prect": "is point in rectangle", + "utilities u pcircle": "is point in circle", + "utilities u ui to css coord": "convert ui coord to css pixels", + "utilities u game to css coord": "convert game coord to css pixels", + "utilities u ui to css scalar": "convert scalar from ui to css length", + "utilities u game to css scalar": "convert game length to css scalar", + "utilities u game to ui coord": "convert game coord to ui pixels", + "utilities u ui to game coord": "convert ui coord to game pixels", + "utilities U wait": "Delay, in milliseconds", + "utilities U wait ui": "UI delay, in milliseconds", + "utilities u numbered string": "numbered string", + "utilities u get string number": "get string number", + "settings settings high density": "hight dpi", + "settings settings target fps": "target fps", + "settings settings view mode": "view mode", + "settings settings fullscreen": "fullscreen", + "settings settings pixelart": "pixelart mode", + "settings settings prevent default": "prevent browser events", + "set x": "Set x to", + "set y": "Set y to", + "get x": "x", + "get y": "y", + "follow this": "Follow this copy", + "follow": "Follow", + "set zoom": "Set zoom to", + "get zoom": "zoom", + "set targetX": "Set camera's target x to", + "set targetY": "Set camera's target y to", + "set shiftX": "Set camera's horizontal shift", + "set shiftY": "Set camera's vertical shift", + "set drift": "Set camera's drift", + "set rotation": "Set rotation", + "set followX": "Enable following by x", + "set followY": "Enable following by y", + "set borderX": "Set horizontal borders for following to", + "set borderY": "Set vertical borders for following to", + "set shake": "Set screen shake power to", + "set shakeDecay": "Set screen shake decay speed to", + "set shakeFrequency": "Set screen shake frequency to", + "set shakeX": "Set horizontal shake multiplier to", + "set shakeY": "Set vertical shake multiplier to", + "set shakeMax": "Set maximum shake power to", + "set minX": "Set left boundary to", + "set maxX": "Set right boundary to", + "set minY": "Set top boundary to", + "set maxY": "Set right boundary to", + "get targetX": "target x", + "get targetY": "target y", + "get computedX": "current x", + "get computedY": "current y", + "get shiftX": "horizontal shift", + "get shiftY": "vertical shift", + "get drift": "drift power", + "get left": "left side", + "get right": "right side", + "get top": "top side", + "get bottom": "bottom side", + "get rotation": "rotation", + "get followX": "follow horizontally", + "get followY": "follow vertically", + "get borderX": "follow horizontal borders", + "get borderY": "follow vertical borders", + "get shake": "screen shake power", + "get shakeDecay": "screen shake decay speed", + "get shakeFrequency": "screen shake frequency", + "get shakeX": "horizontal shake multiplier", + "get shakeY": "vertical shake multiplier", + "get shakeMax": "maximum shake power", + "get minX": "left boundary", + "get maxX": "right boundary", + "get minY": "top boundary", + "get maxY": "bottom boundary", + "console log": "Log to console", + "console warn": "Send a warning to the console", + "console error": "Send an error to the console", + "set depth": "Set depth to", + "get depth": "depth", + "script options": "Script options", + "run script": "Run a script", + "hasSubstring": "has substring", + "substringPosition": "substring position", + "stringLength": "string length", + "replace substring": "replace substring", + "replace all substrings": "replace all substrings", + "trim whitespace": "trim whitespace", + "regex passes": "regex passes", + "replace by regex": "replace by regex", + "replace all by regex": "replace all substrings by regex", + "split by a substring": "split by a substring", + "split": "split a string into an array", + "slice a string": "slice a string", + "to uppercase": "to uppercase", + "to lowercase": "to lowercase", + "array unshift": "Add an element at start", + "array push": "Add an element at end", + "add element at position": "Add an element at position", + "array pop": "Remove the last array element", + "array shift": "Remove the first array element", + "remove element from array": "Remove the element from array", + "remove at position": "Remove an element at position", + "filter array": "Filter array", + "map array": "Map elements of array", + "set text": "Set text", + "set disabled": "Set disabled state", + "get text": "get text", + "get disabled": "get disabled", + "define function": "Define a function", + "return": "Return the result", + "execute function": "Run a function", + "get function option": "get an option", + "set timer 1": "Set 1st timer", + "set timer 2": "Set 2nd timer", + "set timer 3": "Set 3rd timer", + "set timer 4": "Set 4th timer", + "set timer 5": "Set 5th timer", + "set timer 6": "Set 6th timer", + "get timer 1": "Get 1st timer's value", + "get timer 2": "Get 2nd timer's value", + "get timer 3": "Get 3rd timer's value", + "get timer 4": "Get 4th timer's value", + "get timer 5": "Get 5th timer's value", + "get timer 6": "Get 6th timer's value", + "set game speed": "Set game speed", + "get game speed": "Get game speed", + "deserialize object": "Deserialize object", + "serialize object": "serialize object", + "save to storage": "Save to storage in key", + "delete from storage": "Delete from storage the key", + "load from storage": "load from storage from key", + "is key in storage": "is key in storage", + "owning room": "copy's owning room" + }, + "blockDisplayNames": { + "write": "Write", + "if else branch": "If", + "while loop cycle": "While", + "repeat": "Repeat", + "for each": "For each", + "NOT logic operator": "not", + "set": "Set", + "x of": "x of", + "y of": "y of", + "options": "options", + "lengthOf": "length of", + "split": "split", + "join": "join", + "add element": "Add an element", + "remove element": "Remove element", + "set timer 1 to": "Set 1st timer to", + "set timer 2 to": "Set 2nd timer to", + "set timer 3 to": "Set 3rd timer to", + "set timer 4 to": "Set 4th timer to", + "set timer 5 to": "Set 5th timer to", + "set timer 6 to": "Set 6th timer to", + "timer": "timer", + "read": "read", + "set game speed to": "Set game speed to", + "game speed": "game speed" + }, + "blockLabels": { + "value": "value", + "property": "property", + "changeBy": "by", + "is not": "is not", + "is": "is", + "else": "Else", + "timesCount": "times", + "toWrite": "to", + "fromRead": "from", + "atPosition": "at", + "inInside": "in", + "contains": "contains", + "forDuring": "for", + "replace": "replace", + "replaceAll": "replace all", + "replaceByRegex": "replace by regex", + "replaceAllByRegex": "replace all by regex", + "fromDestination": "from", + "fromSource": "from", + "toDestination": "to", + "store index in": "store index in", + "store in": "store in", + "store result in": "store the result in", + "of array": "of array", + "of current room": "of the current room", + "to current room": "to the current room", + "AND": "and", + "OR": "or", + "and": "and", + "then": "Then", + "catch": "On error", + "and play animation": "and play the animation", + "and stop animation": "and stop the animation", + "scale": "scale", + "position": "position", + "at position": "at position", + "with results in": "with results stored in", + "store new array in": "store new array in", + "and elements": "and elements", + "secondsUnits": "second(s)" + }, + "blockOptions": { + "soundVolume": "Volume", + "loop": "Loop", + "isRoomUi": "Is this room a UI layer?", + "speed": "Speed", + "start at": "Start at", + "soundSingleInstance": "Stop other sound instances" + }, + "blockDocumentation": { + "serialize object": "This block serializes an object into a string that can be later safely saved or transferred. This method does not support dates, functions, and structures that form cyclic references. Objects serialized with this block should be deserialized with the \"Deserialize object\" block.", + "constant string": "You can use this block to force creating a string: for example, when you want to write a number in a string or convert \\n to a linebreak when putting this value into wildcard slots." + } + }, "colorPicker": { "current": "New", "globalPalette": "Global Palette", @@ -274,10 +705,13 @@ "clueSolutions": { "syntax": "This is a syntax error in your code. Go to the asset and fix it — the code editor will highlight the problematic place.", "eventConfiguration": "One of the events is misconfigured, having empty fields. Go to the asset and edit its event's parameters.", + "eventMissing": "There is an event in your asset that uses a missing module. Check if you have installed all the required modules, and, if you have recently disabled catmods, try turning them on again.", "emptySound": "One of your sounds does not have any sound files attached. Import a sound file to it or remove this empty sound.", "emptyEmitter": "One of your particle systems is missing a texture in its emitter. You will need to either set a texture to it or remove the emitter.", "windowsFileLock": "This is a Windows-specific problem with a locked file. Make sure you've closed all external browsers that launched the game, then try exporting again. If it doesn't help, restart ct.js.", - "noTemplateTexture": "One of your templates is missing a texture. You need to set a texture to it." + "noTemplateTexture": "One of your templates is missing a texture. You need to set a texture to it.", + "blockArgumentMissing": "An argument in a catnip code is not set or was referring to a now removed asset. Go to the asset and set a value to the block mentioned above.", + "blockDeclarationMissing": "A block in your catnip code uses a missing catmod. If you have recently disabled catmods, try turning them back on, or remove the problematic blocks." }, "stacktrace": "Call stack", "jumpToProblem": "Jump to the problem", @@ -299,6 +733,24 @@ }, "intro": { "loading": "Please wait: kittens are gathering speed of light!", + "newUserHeader": "Welcome to ct.js!", + "welcomeHeaders": [ + "Welcome back, Tumblr sexyman!", + "Welcome back, Neo!", + "Isn't it our epic coder? Welcome back!", + "Nice to see you again!", + "Welcome back, Superstar!", + "You're finally awake. Welcome back!", + "General Kenobi!", + "🖖", + "Greetings, traveller!", + "Ohayo, sempai uwu", + "Hallo :D hallo :D hallo :D", + "Nice to see you, lumberfoot.", + "✉️ Raid: Hackerman pirates", + "Welcome to Summoner's Rift!", + "Welcome to test chamber 20" + ], "newProject": { "header": "Create new", "projectName": "Name:", @@ -309,6 +761,15 @@ "nameError": "Wrong project name", "languageError": "You must specify a programming language" }, + "ctDistributions": { + "released": "Release branch", + "nightly": "Nightly build 🌚", + "dev": "Running from sources 🤓" + }, + "gamesFromCommunity": "Games from the Community", + "submitYourOwn": "Submit Your Own", + "learningResources": "Learning Resources", + "authorBy": "by $1", "recovery": { "message": "

Recovery

ct.js has found a recovery file. Possibly, your project was not saved correctly or ct.js was shut down in case of some emergency. Here is when these files were lastly modified:

Your chosen file: {0} {1}
Recovery file: {2} {3}

What file should ct.js open?

", "loadTarget": "Target File", @@ -330,6 +791,7 @@ "templatesInfo": "You can kickstart your game development by using one of these templates. They contain placeholder graphics only but have working mechanics. Selecting a project will open a save directory selector for your new project.", "unableToWriteToFolders": "Ct.js could not find an appropriate place for projects! Make sure you store ct.js app inside a folder you have access to write to.", "twitter": "Twitter channel", + "telegram": "Telegram group chat", "discord": "Discord community", "github": "Ct.js at Github", "itch": "Ct.js' store page on itch.io", @@ -351,13 +813,16 @@ }, "languageSelector": { "chooseLanguageHeader": "Choose your coding language", - "chooseLanguageExplanation": "This is the language you will write events with to describe your gameplay logic. Previously, all the projects used JavaScript+TypeScript. Note that you can only convert CoffeeScript projects to JavaScript, but not the other way around, so choose carefully!", + "chooseLanguageExplanation": "This is the language you will write events with to describe your gameplay logic. Previously, all the projects used JavaScript+TypeScript. Note that you can only convert CoffeeScript or Catnip projects to JavaScript, but not the other way around, so choose carefully!", "coffeeScriptDescription": "A good language for beginners with a simple syntax. Pick this language if you don't have prior experience with programming with code, or if you love Python.", "pickCoffeeScript": "I choose CoffeeScript!", "jsAndTs": "JavaScript (and TypeScript)", "jsTsDescription": "The language of the web. Its syntax is more complex but it has in-editor error highlighting and code suggestions. Choose it if you worked with JS, C# or Java code before.", "pickJsTs": "I choose JavaScript!", - "acceptAndSpecifyDirectory": "Accept and pick project folder" + "acceptAndSpecifyDirectory": "Accept and pick project folder", + "catnip": "Catnip", + "catnipDescription": "A visual scripting language made for ct.js. You can put blocks with drag-and-drop and with keyboard. A good choice if you have little to zero experience with coding.", + "pickCatnip": "I choose Catnip!" }, "settings": { "actions": { @@ -486,10 +951,15 @@ "deleteScript": "Delete the script", "moveDown": "Move down", "moveUp": "Move up", - "newScriptComment": "Use scripts to define frequent functions and import small libraries" + "newScriptComment": "Use scripts to define frequent functions and import small libraries", + "scriptsHint": "Scripts created here will be injected in the root of your game and thus will always run at the start of the game. Only JavaScript and TypeScript are supported. Variables and types defined here will be available everywhere in your project." }, "export": { "heading": "Export settings", + "errorReporting": "Error reporting", + "showErrors": "Display errors in the game window (strongly recommended)", + "showErrorsHint": "Ct.js will show uncaught errors in a custom window from which players can copy error messages and navigate the report link you specify in the next field. This will help your players report such errors without using devtools.", + "errorsLink": "Link to report errors: (Github issues, contact form, forum, etc.)", "functionWrap": "Wrap all the code in a function. (Makes debugging harder, but isolates the game's code from outer context. Do not enable while developing the game.)", "codeModifier": "Code transformations", "obfuscateWarning": "This option will make your code run 15-80% slower, but will make your code extremely hard to revert back to the original.", @@ -783,7 +1253,11 @@ "HCBlack": "High-contrast Black", "RosePine": "Rosé Pine", "RosePineMoon": "Rosé Pine Moon", - "RosePineDawn": "Rosé Pine Dawn" + "RosePineDawn": "Rosé Pine Dawn", + "GoldenEye": "Golden Eye", + "AlmaSakura": "Alma Sakura", + "Synthwave": "Synthwave '84", + "OneDarkPro": "One Dark Pro" }, "prideMode": "Pride mode", "language": "Language", @@ -796,7 +1270,16 @@ "codeFont": "Font for code", "codeLigatures": "Ligatures", "codeDense": "Dense layout", + "changeDebuggerLayout": "Change debugger's layout", + "debuggerLayout": "Debugger's layout", + "debuggerLayouts": { + "split": "split layout", + "multiwindow": "multiple windows", + "automatic": "automatic" + }, + "autoapplyOnLaunch": "Apply assets on game launch", "altTemplateLayout": "Alternative layout for template editor", + "scrollableCatnipLibrary": "Scrollable block library for Catnip", "disableSounds": "Disable UI sounds", "changeDataFolder": "Set data folder location", "forceProductionForDebug": "Force production tasks for debug exports" @@ -840,6 +1323,7 @@ "runWithoutApplying": "Launch anyway", "applyAndRun": "Apply and run", "cantAddEditor": "Cannot add another editor. Please close some tabs with room, style, or tandem editors.", + "loadingPreviouslyOpened": "Loading previously opened assets…", "tour": { "header": "Ct.js overview", "aboutTour": "Welcome to ct.js! This little tour will show you the main controls in this editor, so you know how to configure ct.js and create new assets.", @@ -1044,8 +1528,9 @@ "strokeColor": "Stroke color:", "strokeWeight": "Line weight:", "testText": "Test text 0123 +", - "fontFamily": "Font family:", - "fontSize": "Font size:" + "fallbackFontFamily": "Fallback font family:", + "fontSize": "Font size:", + "notSupportedForBitmap": "Note that these settings are not supported for bitmap fonts" }, "textureView": { "slicing": "Slicing", @@ -1097,7 +1582,9 @@ "scriptView": { "runAutomatically": "Execute at game start", "language": "Language:", - "convertToJavaScript": "Convert to JavaScript" + "convertToJavaScript": "Convert to JavaScript", + "confirmSwitchToCatnip": "Switching to Catnip will remove all the code in this script. Are you sure you want to continue?", + "confirmSwitchFromCatnip": "Switching from Catnip will remove all the code in this script. If you want to preserve the code, convert the script to JavaScript first. Are you sure you want to continue and clear the code?" }, "soundView": { "variants": "Variants", @@ -1126,6 +1613,7 @@ "bitmapFontLineHeight": "Line height:", "resultingBitmapFontName": "Resource name", "charset": "Charset:", + "addFont": "Add a font…", "charsets": { "punctuation": "Digits and punctuation (you usually do need this)", "basicLatin": "Basic Latin", @@ -1137,7 +1625,9 @@ }, "customCharsetHint": "Type all the letters you want to include, both in upper and lower case.", "fontWeight": "Font weight:", - "typefaceName": "Typeface name:" + "typefaceName": "Typeface name:", + "pixelPerfect": "Pixel-perfect precision", + "pixelPerfectTooltip": "This should be turned on for pixelart fonts. Enabling this will improve drawing precision of 1-pixel-wide lines, but will reduce the max texture size for each font's characters to be 4k by 4k. (Which is still a lot for pixel fonts.) Besides that, remember that room and style editors will use a different method of drawing fonts anyways and pixel fonts will appear blurry in them — this is normal." }, "licensePanel": { "ctjsLicense": "Ct.js License (MIT)", @@ -1167,6 +1657,8 @@ "staticEventWarning": "This event makes this behavior static. You will not be able to add or remove it dynamically in-game with the Behaviors API, but otherwise it will be perfectly usable.", "restrictedEventWarning": "This event will work only on templates with the following base classes: $1. This event won't work when applied to templates of other base classes.", "baseClassWarning": "This event doesn't work with the current base class.", + "typedefs": "Additional type definitions:", + "typedefsHint": "You can describe additional properties in this asset so they are definitely typed. Example:\n\nname: string;\nhp: number;\nmana: number;\ninventory: any[];\n\nThis is completely optional.", "coreEventsCategories": { "lifecycle": "Lifecycle", "actions": "Actions", @@ -1184,6 +1676,8 @@ "OnDraw": "Frame end", "OnDestroy": "Destruction", "OnRoomEnd": "Room end", + "OnBehaviorAdded": "Behavior added", + "OnBehaviorRemoved": "Behavior removed", "OnPointerClick": "Click", "OnPointerSecondaryClick": "Secondary click", "OnPointerEnter": "Pointer enter", @@ -1232,6 +1726,8 @@ "OnStep": "Happens at the beginning of every frame.", "OnDraw": "Happens at the end of every frame. Good for animation updates.", "OnDestroy": "Happens between \"frame start\" and \"frame end\" when this copy gets destroyed.", + "OnBehaviorAdded": "This gets called when a behavior is dynamically added to this copy. This event won't work with static behaviors; for those, use the Creation event instead.", + "OnBehaviorRemoved": "This gets called when you remove this behavior from a copy dynamically. This event won't work with static behaviors; for those, use the Descruction event instead.", "OnRoomEnd": "Triggers when you switch to another room, or when this room is removed after it was added as a layer.", "OnActionPress": "Happens when an action's input becomes active — by pressing, clicking, flicking a joystick, etc.", "OnActionRelease": "Happens when an action's input becomes inactive — by releasing buttons, resting joysticks, etc.", @@ -1265,6 +1761,8 @@ "animationFPS": "Animation FPS:", "playAnimationOnStart": "Play animation on start", "loopAnimation": "Loop animation", + "useBitmapText": "Use bitmap fonts", + "errorBitmapNotConfigured": "The style you selected is not linked to a typeface that uses a bitmap font. Go to the style, link it to a typeface, and make sure that this typeface is configured to export a bitmap, and apply the changes.", "blendModes": { "normal": "Normal", "add": "Add (burn)", @@ -1283,6 +1781,7 @@ "baseClass": { "AnimatedSprite": "Animated sprite", "Text": "Text", + "BitmapText": "Bitmap text", "NineSlicePlane": "Panel", "Container": "Container", "Button": "Button", diff --git a/app/data/i18n/French.json b/app/data/i18n/French.json index 5519ceb51..e713bea4c 100644 --- a/app/data/i18n/French.json +++ b/app/data/i18n/French.json @@ -126,7 +126,7 @@ "salles", "salles" ], - "font": [ + "typeface": [ "police", "polices", "polices" @@ -795,7 +795,6 @@ "strokeColor": "Couleur de bordure :", "strokeWeight": "Épaisseur du contour :", "testText": "Texte de test 0123 + éùïêçÉÙÏÊÇ", - "fontFamily": "Famille de police :", "fontSize": "Taille de la police :" }, "textureView": { diff --git a/app/data/i18n/German.json b/app/data/i18n/German.json index baeaa441b..4d8184403 100644 --- a/app/data/i18n/German.json +++ b/app/data/i18n/German.json @@ -99,7 +99,7 @@ "", "" ], - "font": [ + "typeface": [ "", "", "" @@ -795,7 +795,6 @@ "strokeColor": "Konturfarbe:", "strokeWeight": "Konturstärke:", "testText": "Test Text 0123 +", - "fontFamily": "Schriftfamilie:", "fontSize": "Schriftgröße:" }, "textureView": { diff --git a/app/data/i18n/Japanese.json b/app/data/i18n/Japanese.json index 03e6c32fb..efe364323 100644 --- a/app/data/i18n/Japanese.json +++ b/app/data/i18n/Japanese.json @@ -103,7 +103,7 @@ "ルーム", "ルーム" ], - "font": [ + "typeface": [ "フォント", "フォント", "フォント" @@ -844,7 +844,6 @@ "strokeColor": "ストロークの色:", "strokeWeight": "線の横幅:", "testText": "テストテキスト Test text 0123 +", - "fontFamily": "フォントファミリー:", "fontSize": "フォントサイズ:" }, "textureView": { diff --git a/app/data/i18n/Polish.json b/app/data/i18n/Polish.json index ba913b1d2..803bb9b8b 100644 --- a/app/data/i18n/Polish.json +++ b/app/data/i18n/Polish.json @@ -99,7 +99,7 @@ "", "" ], - "font": [ + "typeface": [ "", "", "" @@ -795,7 +795,6 @@ "strokeColor": "Kolor przekreślenia:", "strokeWeight": "Grubość linii:", "testText": "Testowy tekst 0123 +", - "fontFamily": "Rodzina czcionek:", "fontSize": "Rozmiar czcionki:" }, "textureView": { diff --git a/app/data/i18n/Romanian.json b/app/data/i18n/Romanian.json index c3c59b669..3254c5ba7 100644 --- a/app/data/i18n/Romanian.json +++ b/app/data/i18n/Romanian.json @@ -99,7 +99,7 @@ "", "" ], - "font": [ + "typeface": [ "", "", "" @@ -795,7 +795,6 @@ "strokeColor": "Culoarea conturului:", "strokeWeight": "Greutatea liniei:", "testText": "Test text 0123 +", - "fontFamily": "Familia font-ului:", "fontSize": "Mărimea font-ului:" }, "textureView": { diff --git a/app/data/i18n/Russian.json b/app/data/i18n/Russian.json index 0e2f60cbb..728d50948 100644 --- a/app/data/i18n/Russian.json +++ b/app/data/i18n/Russian.json @@ -4,6 +4,10 @@ "native": "Русский", "eng": "Russian" }, + "regionalLinks": { + "discord": "https://comigo.games/rudiscord", + "telegram": "https://t.me/ctjsru" + }, "common": { "add": "Добавить", "apply": "Применить", @@ -99,10 +103,10 @@ "комнаты", "комнат" ], - "font": [ - "шрифт", - "шрифта", - "шрифтов" + "typeface": [ + "семейство шрифтов", + "семейства шрифтов", + "семейств шрифтов" ], "style": [ "стиль", @@ -161,7 +165,425 @@ "fill": "Заполнить", "Scale": "Менять размер" }, - "experimentalFeature": "Это экспериментальная функция." + "experimentalFeature": "Это экспериментальная функция.", + "download": "Скачать", + "createStyleFromIt": "Создать стиль с этим ассетом" + }, + "catnip": { + "trashZoneHint": "Перетащи сюда блоки, чтобы быстро удалить их", + "properties": "Свойства", + "propertiesHint": "Свойства хранятся в копии или комнате и могут быть прочитаны позже, в том числе и из других копий.", + "variables": "Переменные", + "variablesHint": "Переменные — временные ячейки данных, существующие только пока работает событие. Они хорошо подходят для хранения быстрых вычислений.", + "createNewProperty": "Новое свойство", + "createNewVariable": "Новая переменная", + "newPropertyPrompt": "Введи название для нового свойства:", + "newVariablePrompt": "Введи название для новой переменной:", + "errorBlock": "Блок отсутствует в библиотеке", + "errorBlockDeleteHint": "Нажми правой кнопкой мыши, чтобы удалить его.", + "placeholders": { + "putBlocksHere": "Положи блоки сюда", + "doNothing": "Ничего не делать" + }, + "coreLibs": { + "templates": "Шаблоны", + "logic": "Логика", + "misc": "Разное", + "math": "Математика", + "sounds": "Звуки", + "movement": "Движение", + "appearance": "Appearance", + "rooms": "Комнаты", + "behaviors": "Поведения", + "backgrounds": "Фоны", + "emitter tandems": "Эмиттеры", + "utilities": "Утилиты", + "settings": "Настройки", + "arrays": "Массивы", + "camera": "Камера", + "console": "Консоль", + "objects": "Объекты", + "strings": "Строки", + "actions": "Действия", + "timers": "Таймеры" + }, + "blockNames": { + "kill copy": "Удалить эту копию", + "set speed": "Назначить скорость", + "set gravity": "Назначить силу гравитации", + "set gravityDir": "Назначить направление гравитации", + "set hspeed": "Назначить горизонтальную скорость", + "set vspeed": "Назначить вертикальную скорость", + "set direction": "Назначить направление движения", + "get speed": "скорость", + "get gravity": "сила гравитации", + "get gravityDir": "направление гравитации", + "get hspeed": "горизонтальная скорость", + "get vspeed": "вертикальная скорость", + "get direction": "направление движения", + "increment": "Увеличить на 1", + "decrement": "Уменьшить на 1", + "this write": "Записать себе", + "current room write": "Записать в текущую комнату", + "write property to object": "Записать в объект", + "this read": "своё свойство", + "room read": "свойство текущей комнаты", + "object read": "свойство объекта", + "convert to string": "в строку", + "convert to number": "в число", + "convert to boolean": "в булево", + "note": "Заметка", + "plainJs": "Выполнить JavaScript", + "variable": "Переменная", + "property": "Свойство", + "behavior property": "Свойство поведения", + "if else branch": "Если … то", + "while loop cycle": "Цикл \"Пока\"", + "repeat": "Повторить N раз", + "for each": "Цикл для каждого элемента массива", + "break loop": "Остановить цикл", + "NOT logic operator": "Логическое НЕ", + "AND logic operator": "Логическое И", + "OR logic operator": "Логическое ИЛИ", + "is": "Является (равен)", + "is not": "Не является (не равен)", + "set texture": "Сменить текстуру на", + "set scale": "Установить размер", + "set scale xy": "Установить размер", + "set angle": "Повернуть текстуру", + "set alpha": "Установить прозрачность", + "scale x": "размер по x", + "scale y": "размер по y", + "get angle": "поворот текстуры", + "get alpha": "прозрачность", + "move copy": "Передвинуть эту копию", + "y of copy": "y копии", + "x of copy": "x копии", + "set property variable": "Задать значение свойства/переменной", + "increase": "Увеличить", + "decrease": "Уменьшить", + "object delete": "Удалить свойство в объекте", + "new array": "новый массив", + "new object": "Создать новый объект", + "new empty object": "новый пустой объект", + "color": "цвет", + "AND AND logic operator": "двойное логическое И", + "OR OR logic operator": "двойное логическое ИЛИ", + "set skew": "Задать наклон", + "skew x": "наклон по x", + "skew y": "наклон по y", + "set tint": "Задать оттенок", + "get tint": "оттенок", + "play animation": "Воспроизвести анимацию", + "stop animation": "Остановить анимацию", + "goto frame play": "Перейти к кадру и воспроизвести", + "goto frame stop": "Перейти к кадру и остановить", + "goto frame": "Перейти к кадру", + "get animation speed": "скорость анимации", + "set animation speed": "Задать скорость анимации", + "this": "я", + "concatenate strings": "Соединить строки", + "templates Templates copy into room": "Скопировать шаблон в комнату", + "templates Templates copy": "Скопировать шаблон", + "templates Templates each": "Для каждой копии", + "templates Templates with copy": "С копией", + "templates Templates with template": "Со всеми копиями шаблона", + "templates templates exists": "копии шаблона существуют", + "rooms Rooms add bg": "Добавить фон", + "rooms Rooms clear": "Очистить текущую комнату", + "rooms Rooms remove": "Удалить комнату", + "rooms Rooms switch": "Переключиться на", + "rooms Rooms restart": "Перезапустить текущую комнату", + "rooms Rooms append": "Добавить комнату поверх", + "rooms Rooms prepend": "Добавить комнату сзади", + "rooms Rooms merge": "Внедрить комнату", + "rooms rooms current": "текущая комната", + "rooms rooms list": "список комнат", + "rooms rooms starting": "стартовая комната", + "behaviors Behaviors add": "Добавить поведение", + "behaviors Behaviors remove": "Удалить поведение у", + "behaviors behaviors has": "есть поведение", + "sounds Sounds play": "Играть звук", + "sounds Sounds play at": "Играть 3D звук", + "sounds Sounds stop": "Остановить звук", + "sounds Sounds pause": "Приостановить звук", + "sounds Sounds resume": "Возобновить звук", + "sounds Sounds global volume": "Задать громкость игры", + "sounds Sounds fade": "Сделать затухание", + "sounds Sounds add filter": "Добавить звуку фильтр", + "sounds Sounds add distortion": "Добавить фильтр искажения", + "sounds Sounds add equalizer": "Добавить фильтр-эквалайзер", + "sounds Sounds add mono filter": "Добавить моно-фильтр", + "sounds Sounds add reverb": "Добавить фильтр ревербации", + "sounds Sounds add stereo filter": "Добавить стерео-фильтр", + "sounds Sounds add panner filter": "Добавить фильтр 3D-звука", + "sounds Sounds add telephone": "Добавить фильтр \"телефон\"", + "sounds Sounds remove filter": "Удалить фильтр у звука", + "sounds Sounds speed all": "Задать скорость всех звуков", + "sounds sounds load": "Загрузить звук", + "sounds sounds exists": "звук существует", + "sounds sounds playing": "звук играет", + "sounds sounds toggle mute all": "все звуки заглушены", + "sounds sounds toggle pause all": "все звуки приостановлены", + "styles styles get": "получить стиль", + "backgrounds Backgrounds add": "Добавить фон", + "backgrounds backgrounds list": "список фонов", + "emitter tandems Emitters fire": "Запустить эффект в позиции", + "emitter tandems Emitters append": "Прикрепить эффект", + "emitter tandems Emitters follow": "Создать эффект и следовать", + "utilities U reshape nine patch": "Обновить форму столкновений у панели", + "utilities u time": "время", + "utilities u time ui": "время интерфейса", + "utilities u get environment": "окружение", + "utilities u get os": "текущая ос", + "utilities u ldx": "длина вектора по x", + "utilities u ldy": "длина вектора по y", + "utilities u pdn": "направление меж точек", + "utilities u pdc": "расстояние меж точек", + "utilities u deg to rad": "градусы в радианы", + "utilities u rad to deg": "радианы в градусы", + "utilities u rotate": "повернуть вектор", + "utilities u rotate rad": "повернуть вектор в радианах", + "utilities u delta dir": "разница меж углами", + "utilities u clamp": "ограничить", + "utilities u lerp": "интерполировать", + "utilities u unlerp": "разынтерполировать", + "utilities u map": "привести к диапазону", + "utilities u get rect shape": "прямоугольная форма столкновений", + "utilities u prect": "точка в прямоугольнике?", + "utilities u pcircle": "точка в круге?", + "utilities u ui to css coord": "координаты интерфейса в css", + "utilities u game to css coord": "координаты игры в css", + "utilities u ui to css scalar": "скаляр интерфейса в css", + "utilities u game to css scalar": "скаляр игры в css", + "utilities u game to ui coord": "координаты игры в интерфейсные", + "utilities u ui to game coord": "координаты интерфейса в игровые", + "utilities U wait": "Задержка, в мс", + "utilities U wait ui": "Задержка в интерфейсном времени, в мс", + "utilities u numbered string": "строка с числом", + "utilities u get string number": "число строки", + "settings settings high density": "высокое разрешение", + "settings settings target fps": "целевой fps", + "settings settings view mode": "режим отображения", + "settings settings fullscreen": "полноэкранный", + "settings settings pixelart": "пиксельарт", + "settings settings prevent default": "запретить события браузера", + "set x": "Задать x", + "set y": "Задать y", + "get x": "x", + "get y": "y", + "follow this": "Следовать за этой копией", + "follow": "Следовать", + "set zoom": "Задать зум камеры", + "get zoom": "зум", + "set targetX": "Задать целевое x", + "set targetY": "Задать целевое y", + "set shiftX": "Задать сдвиг по горизонтали", + "set shiftY": "Задать сдвиг по вертикали", + "set drift": "Задать силу дрифта", + "set rotation": "Задать поворот", + "set followX": "Включить следование по x", + "set followY": "Включить следование по y", + "set borderX": "Задать горизонтальные рамки для следования", + "set borderY": "Задать вертикальные рамки для следования", + "set shake": "Задать силу тряски экрана", + "set shakeDecay": "Задать скорость затухания тряски экрана", + "set shakeFrequency": "Задать частоту тряски экрана", + "set shakeX": "Задать силу горизонтальной тряски", + "set shakeY": "Задать силу вертикальной тряски", + "set shakeMax": "Задать максимально возможную силу тряски", + "set minX": "Задать левую границу камеры", + "set maxX": "Задать правую границу камеры", + "set minY": "Задать верхнюю границу камеры", + "set maxY": "Задать правую границу камеры", + "get targetX": "целевой x", + "get targetY": "целевой y", + "get computedX": "текущий x", + "get computedY": "текущий y", + "get shiftX": "горизонтальный сдвиг", + "get shiftY": "вертикальный сдвиг", + "get drift": "сила дрифта", + "get left": "левая сторона", + "get right": "правая сторона", + "get top": "верхняя сторона", + "get bottom": "нижняя сторона", + "get rotation": "поворот", + "get followX": "следовать по горизонтали", + "get followY": "следовать по вертикали", + "get borderX": "горизонтальные рамки", + "get borderY": "вертикальные рамки", + "get shake": "сила тряски", + "get shakeDecay": "скорость угасания тряски", + "get shakeFrequency": "частота тряски", + "get shakeX": "сила тряски по горизонтали", + "get shakeY": "сила тряски по вертикали", + "get shakeMax": "макс. сила тряски", + "get minX": "левая граница", + "get maxX": "правая граница", + "get minY": "верхняя граница", + "get maxY": "нижняя граница", + "console log": "Записать в консоль", + "console warn": "Отправить предупреждение в консоль", + "console error": "Отправить ошибку в консоль", + "set depth": "Задать глубину", + "get depth": "глубина", + "script options": "Настройки скрипта", + "run script": "Запустить скрипт", + "hasSubstring": "содержит строку", + "substringPosition": "расположение строки", + "stringLength": "длина строки", + "replace substring": "заменить строку", + "replace all substrings": "заменить все строки", + "trim whitespace": "обрезать пробелы", + "regex passes": "regex проходит", + "replace by regex": "заменить по regex", + "replace all by regex": "заменить всё по regex", + "split by a substring": "разделить по строке", + "split": "разделить в массив", + "slice a string": "обрезать строку", + "to uppercase": "большими буквами", + "to lowercase": "малыми буквами", + "array unshift": "Добавить элемент в начало", + "array push": "Добавить элемент в конец", + "add element at position": "Вставить элемент в позиции", + "array pop": "Удалить последний элемент массива", + "array shift": "Удалить первый элемент массива", + "remove element from array": "Удалить элемент из массива", + "remove at position": "Удалить элемент в определённой позиции", + "filter array": "Отфильтровать массив", + "map array": "Преобразовать элементы массива", + "set text": "Задать текст", + "set disabled": "Задать выключенное состояние", + "get text": "получить текст", + "get disabled": "выключен ли", + "set timer 1": "Завести 1-й таймер", + "set timer 2": "Завести 2-й таймер", + "set timer 3": "Завести 3-й таймер", + "set timer 4": "Завести 4-й таймер", + "set timer 5": "Завести 5-й таймер", + "set timer 6": "Завести 6-й таймер", + "get timer 1": "Получить значение 1-го таймера", + "get timer 2": "Получить значение 2-го таймера", + "get timer 3": "Получить значение 3-го таймера", + "get timer 4": "Получить значение 4-го таймера", + "get timer 5": "Получить значение 5-го таймера", + "get timer 6": "Получить значение 6-го таймера", + "get width": "ширина", + "get height": "высота", + "set width": "Поменять ширину на", + "set height": "Поменять высоту на", + "const string": "Строка (константа)", + "if branch": "Условие Если", + "concatenate strings triple": "Объединить три строки", + "emitter tandems Emitters stop": "Остановить и удалить эмиттер", + "emitter tandems Emitters pause": "Приостановить эмиттер", + "emitter tandems Emitters resume": "Возобновить эмиттер", + "emitter tandems Emitters clear": "Очистить все частицы эмиттера", + "define function": "Объявить функцию", + "return": "Вернуть результат", + "execute function": "Выполнить функцию", + "get function option": "считать опцию", + "set game speed": "Поменять скорость игры", + "get game speed": "Считать скорость игры", + "deserialize object": "Десериализировать объект", + "serialize object": "сериализировать объект", + "save to storage": "Сохранить под ключом", + "delete from storage": "Удалить ключ", + "load from storage": "загрузить из ключа", + "is key in storage": "ключ в хранилище?", + "owning room": "комната-родитель копии" + }, + "blockDisplayNames": { + "if else branch": "Если", + "while loop cycle": "Пока", + "repeat": "Повторить", + "for each": "Для каждого", + "NOT logic operator": "не", + "write": "Записать", + "set": "Задать", + "x of": "x", + "y of": "y", + "options": "настройки", + "lengthOf": "длина", + "split": "разделить", + "join": "объединить", + "add element": "Добавить элемент", + "remove element": "Удалить элемент", + "set timer 1 to": "Завести 1-й таймер на", + "set timer 2 to": "Завести 2-й таймер на", + "set timer 3 to": "Завести 3-й таймер на", + "set timer 4 to": "Завести 4-й таймер на", + "set timer 5 to": "Завести 5-й таймер на", + "set timer 6 to": "Завести 6-й таймер на", + "timer": "таймер", + "read": "считать", + "set game speed to": "Поменять скорость игры на", + "game speed": "скорость игры" + }, + "blockLabels": { + "value": "значение", + "property": "свойство", + "changeBy": "на", + "is not": "не равен", + "is": "равен", + "else": "Иначе", + "timesCount": "раз", + "store index in": "хранить индекс в", + "store in": "сохранить в", + "of array": "массива", + "AND": "и", + "OR": "или", + "toWrite": "в", + "fromRead": "у", + "atPosition": "у", + "forDuring": "в течение", + "toDestination": "к", + "of current room": "текущей комнаты", + "to current room": "текущей комнате", + "then": "Затем", + "catch": "При ошибке", + "and play animation": "и играть анимацию", + "and stop animation": "и остановить анимацию", + "scale": "размер", + "position": "положение", + "inInside": "в", + "contains": "содержит", + "replace": "заменить", + "replaceAll": "заменить всё", + "replaceByRegex": "заменить по regex", + "replaceAllByRegex": "заменить всё по regex", + "fromDestination": "от", + "fromSource": "из", + "and": "и", + "at position": "в позиции", + "with results in": "и сохранить результат в", + "store new array in": "сохранить новый массив в", + "and elements": "и элементы", + "secondsUnits": "сек.", + "store result in": "сохранить результат в" + }, + "asyncHint": "Этот блок выполняется асинхронно, т.е. он выполнится позднее и не будет блокировать выполнение скрипта. Используй зоны для блоков ниже чтобы выполнить команды при завершении работы этого блока, но обрати внимание, что к этому времени обстоятельства могут поменяться: например, копия, которая выполнила этот блок, может быть уже удалена к завершению (в зависимости от твоей игровой логики).", + "optionsAdvanced": "Расширенные настройки", + "addCustomOption": "Добавить свойство", + "changeBlockTo": "Поменять на \"$1\"", + "blockOptions": { + "soundVolume": "Громкость", + "loop": "Играть циклично", + "isRoomUi": "Это комната для интерфейса?", + "speed": "Скорость", + "start at": "Начать с", + "soundSingleInstance": "Остановить другие звуки этого ассета" + }, + "goToActions": "Перейти в настройки Действий", + "copyDocHtml": "Скопировать HTML для документации", + "copySelection": "Скопировать выбранные блоки", + "duplicateBlock": "Дублировать этот блок", + "requiredField": "Это поле обязательно для заполнения.", + "unnamedGroup": "Безымянная группа", + "blockDocumentation": { + "serialize object": "Этот блок сериализирует объект в строку, которую позднее можно безопасно сохранить или передать. Этот метод не поддерживает объект Date, функции, и структуры с цикличными ссылками. Объекты, сериализированные этим блоком, должны десериализироваться блоком \"Десериализировать объекта\"", + "constant string": "Этот блок можно использовать, чтобы явно создать строку: например, когда нужно написать числа в строке или конвертировать \\n в перенос строки при записи переменной в слот-джокер." + } }, "colorPicker": { "old": "Старый", @@ -205,7 +627,10 @@ "emptySound": "В одном из звуковых ассетов не было прикреплено никаких звуковых файлов. Зайди в него и добавь звук, или удали ассет.", "emptyEmitter": "В одной из систем частиц есть эмиттер без текстуры. Тебе нужно либо поставить текстуру, либо удалить этот эмиттер.", "windowsFileLock": "Это проблема Windows с блокировкой файлов. Закрой все внешние браузеры, что запускали эту игру, и попробуй ещё. Если это не поможет, перезапусти ct.js.", - "noTemplateTexture": "В одном из твоих шаблонов не указана текстура. Тебе нужно указать текстуру для него." + "noTemplateTexture": "В одном из твоих шаблонов не указана текстура. Тебе нужно указать текстуру для него.", + "blockArgumentMissing": "В скрипте на Котомяте не был указан аргумент, либо он ссылается на удалённый ассет. Перейди в ассет и укажи новое значение в блоке, упомянутом выше.", + "blockDeclarationMissing": "В твоём коде на Котомяте есть блок, для которого отсутствует котомод. Если недавно были отключены котомоды, попробуй включить их обратно, или же удали проблемные блоки.", + "eventMissing": "Одно из событий твоего ассета использует отсутсвующий котомод. Проверь, установлены ли все требуемые котомоды и, если недавно какие-то из них были отключены тобой, попробуй включить их обратно." }, "stacktrace": "Стек вызова", "jumpToProblem": "Перейти к проблеме", @@ -246,13 +671,41 @@ "github": "Котэ на Гитхабе", "itch": "Страница ct.js на itch.io", "vkontakte": "Паблик Вконтакте", + "telegram": "Чат в телеге", "patreon": "Поддержи кота на Патреоне!", "sponsoredBy": "Спонсируется $1!", "supportedBy": "Спасибо за поддержку $1!", "templates": "Шаблоны", "templatesInfo": "Начни разработку игры с одним из этих шаблонов. В них графика-заглушка, но прекрасно работающие механики. При выборе шаблона откроется выбор папки для твоего нового проекта.", "boosty": "Поддержи ct.js на Boosty!", - "nothingToShowFiller": "Тут пока нечего показывать! Попробуй Примеры или создай свой собственный проект." + "nothingToShowFiller": "Тут пока нечего показывать! Попробуй Примеры или создай свой собственный проект.", + "newUserHeader": "Добро пожаловать в ct.js!", + "welcomeHeaders": [ + "С возвращением, Tumblr sexyman!", + "С возвращением, Нео!", + "Это же наш крутой программист! С возвращением!", + "Рад тебя видеть снова!", + "С возвращением, Суперстар!", + "Ты наконец проснулся. С возвращением!", + "Генерал Кеноби!", + "🖖", + "Здравствуй, путник!", + "Охаё, семпай uwu", + "Халло :D Халло :D Халло :D", + "Рада тебя видеть, увалень.", + "✉️ Рейд: Хакермен пираты", + "Добро пожаловать в Ущелье Призывателей!", + "Добро пожаловать в 20-ю тестовую камеру." + ], + "ctDistributions": { + "released": "Релизная версия", + "nightly": "Ночная сборка 🌚", + "dev": "Запускаемся с сорсов 🤓" + }, + "gamesFromCommunity": "Игры от сообщества", + "submitYourOwn": "Отправить своё", + "learningResources": "Обучающие материалы", + "authorBy": "от $1" }, "onboarding": { "hoorayHeader": "Ух-ты! Мы сделали новый проект!", @@ -706,7 +1159,11 @@ "HCBlack": "Высококонтрастная чёрная", "RosePine": "Rosé Pine", "RosePineMoon": "Rosé Pine Лунная", - "RosePineDawn": "Rosé Pine Рассветная" + "RosePineDawn": "Rosé Pine Рассветная", + "GoldenEye": "Золотой Глаз", + "AlmaSakura": "Альма Сакура", + "Synthwave": "Синтвейв '84", + "OneDarkPro": "One Dark Pro" }, "prideMode": "Цветная навигация", "codeFontDefault": "По умолчанию (Iosevka Light)", @@ -723,7 +1180,16 @@ "disableSounds": "Отключить звуки интерфейса", "changeDataFolder": "Изменить папку данных ct.js", "forceProductionForDebug": " Включить релизные функции для дебаг-экспортов", - "altTemplateLayout": "Альт. вёрстка редактора шаблонов" + "altTemplateLayout": "Альт. вёрстка редактора шаблонов", + "changeDebuggerLayout": "Поменять вёрстку дебаггера", + "debuggerLayout": "Вёрстка дебаггера", + "debuggerLayouts": { + "split": "разделённая", + "multiwindow": "несколько окон", + "automatic": "автоматическая" + }, + "scrollableCatnipLibrary": "Прокручиваемая библиотека блоков Котомяты", + "autoapplyOnLaunch": "Применять все изменения перед запуском" }, "project": { "save": "Сохранить проект", @@ -988,8 +1454,9 @@ "strokeColor": "Цвет обводки", "strokeWeight": "Толщина обводки:", "testText": "Тест Test 0123 +", - "fontFamily": "Семейство шрифтов:", - "fontSize": "Размер шрифта:" + "fallbackFontFamily": "Резервное семейство шрифтов:", + "fontSize": "Размер шрифта:", + "notSupportedForBitmap": "Эти настройки не поддерживаются битмап-шрифтами" }, "textureView": { "center": "Ось вращения", @@ -1057,7 +1524,10 @@ }, "customCharsetHint": "Впишите все буквы, которые нужно добавить в шрифт — как в верхнем, так и в нижнем регистре.", "fontWeight": "Жирность:", - "typefaceName": "Название семейства:" + "typefaceName": "Название семейства:", + "addFont": "Добавить шрифт…", + "pixelPerfect": "Пиксельарт-точность", + "pixelPerfectTooltip": "Должно быть включено для пиксельных шрифтов. Включение этой опции улучшит отрисовку линий толщиной в один пиксель, но уменьшит максимальный размер холста шрифта до 4k на 4k (но для пиксельных шрифтов этого предостаточно). Помимо этого, помни, что в редакторах комнат и стилей все надписи рисуются другим методом, и пиксельные шрифты в них будут мыльными — это норма." }, "licensePanel": { "ctjsLicense": "Лицензия Ct.js (MIT)", @@ -1109,7 +1579,8 @@ "Button": "Кнопка", "RepeatingTexture": "Повторяющаяся текстура", "SpritedCounter": "Спрайтовый счётчик", - "TextBox": "Поле ввода" + "TextBox": "Поле ввода", + "BitmapText": "Битмап-текст" }, "nineSliceTop": "Верхний срез, в пикселях", "nineSliceRight": "Правый срез, в пикселях", @@ -1130,7 +1601,9 @@ "scrollSpeedX": "Скорость прокрутки по X:", "scrollSpeedY": "Скорость прокрутки по Y:", "isUi": "Использовать UI время", - "defaultCount": "Кол-во спрайтов по умолчанию:" + "defaultCount": "Кол-во спрайтов по умолчанию:", + "useBitmapText": "Использовать битмап-шрифты", + "errorBitmapNotConfigured": "Выбранный стиль не привязан к семейству шрифтов с битмап-шрифтом. Открой этот стиль, привяжи его к семейству шрифтов, и убедись, что выбранное семейство шрифтов настроено для экспорта битмап-шрифтов. После этого примени изменения." }, "assetInput": { "changeAsset": "Нажмите, чтобы заменить ассет", @@ -1194,7 +1667,9 @@ "OnAppFocus": "Приложение активно", "OnAppBlur": "Приложение в фоне", "OnTextChange": "Когда сменился текст", - "OnTextInput": "Когда вводят текст" + "OnTextInput": "Когда вводят текст", + "OnBehaviorAdded": "Поведение добавлено", + "OnBehaviorRemoved": "Поведение удалено" }, "coreParameterizedNames": { "OnActionPress": "При нажатии %%action%%", @@ -1234,12 +1709,16 @@ "OnAppFocus": "Срабатывает, когда пользователь возвращается к твоему приложению.", "OnAppBlur": "Срабатывает, когда пользователь переключается с твоей игры на что-то другое — переходя по вкладкам, переключаясь между окнами, или сворачивая игру.", "OnTextChange": "Срабатывает, когда пользователь заканчивает редактирование нажатием вне поля или кнопкой Enter.", - "OnTextInput": "Срабатывает каждый раз, когда пользователь меняет текст в этом поле." + "OnTextInput": "Срабатывает каждый раз, когда пользователь меняет текст в этом поле.", + "OnBehaviorAdded": "Вызывается каждый раз, когда поведение динамически добавляется копии. Это событие не работает для статичных поведений; для них используй событие Создания.", + "OnBehaviorRemoved": "Вызывается каждый раз, когда поведение динамически удаляется из копии. Это событие не работает для статичных поведений; для них используй событие Уничтожения." }, "jumpToProblem": "Перейти к проблеме", "staticEventWarning": "Это событие делает это поведение статичным. Ты не сможешь добавлять его в игре динамически через API поведений, но в остальном оно прекрасно работает.", "restrictedEventWarning": "Это событие будет работать только с шаблонами следующих базовых классов: $1. Оно не будет работать, если будет применено к другим базовым классам.", - "baseClassWarning": "Это событие не работает с текущим базовым классом." + "baseClassWarning": "Это событие не работает с текущим базовым классом.", + "typedefs": "Дополнительные типы свойств:", + "typedefsHint": "Здесь можно описать типы свойств этого ассета, чтобы они были однозначно типизированы в коде. Например:\n\n\n\nname: string;\nhp: number;\nmana: number;\ninventory: any[];\n Это необязательная настройка." }, "languageSelector": { "chooseLanguageHeader": "Выбери язык программирования", @@ -1249,7 +1728,10 @@ "jsAndTs": "JavaScript (и TypeScript)", "jsTsDescription": "Язык интернета. Синтаксис более сложный, но редактор кода будет подсвечивать ошибки и подсказывать названия функций. Выбери его, если у тебя есть навыки работы с JS, C# или Java.", "pickJsTs": "JavaScript, я выбираю тебя!", - "acceptAndSpecifyDirectory": "Принять и выбрать папку проекта" + "acceptAndSpecifyDirectory": "Принять и выбрать папку проекта", + "catnip": "Котомята (Catnip)", + "catnipDescription": "Язык визуального программирования, созданный специально для ct.js. Блоки размещаются мышью и с клавиатуры. Хороший выбор для новичков.", + "pickCatnip": "Котомята, я выбираю тебя!" }, "assetConfirm": { "confirmHeading": "Выберите действие", @@ -1300,6 +1782,8 @@ "scriptView": { "runAutomatically": "Запустить при старте игры", "language": "Язык:", - "convertToJavaScript": "Конвертировать в JavaScript" + "convertToJavaScript": "Конвертировать в JavaScript", + "confirmSwitchToCatnip": "Переключение на Котомяту удалит весь код в этом скрипте. Ты точно хочешь продолжить?", + "confirmSwitchFromCatnip": "Переключение с котомяты удалит весь код в этом скрипте. Если ты хочешь сохранить код, сконвертируй его в JavaScript. Ты точно хочешь продолжить и очистить код?" } } diff --git a/app/data/i18n/Spanish.json b/app/data/i18n/Spanish.json index f2ebc17fb..04ae4bbb0 100644 --- a/app/data/i18n/Spanish.json +++ b/app/data/i18n/Spanish.json @@ -99,7 +99,7 @@ "", "" ], - "font": [ + "typeface": [ "", "", "" @@ -795,7 +795,6 @@ "strokeColor": "Color del trazo:", "strokeWeight": "Grosor de línea:", "testText": "Texto de prueba 0123 +", - "fontFamily": "Familia de Fuente:", "fontSize": "Tamaño de fuente:" }, "textureView": { diff --git a/app/data/i18n/Turkish.json b/app/data/i18n/Turkish.json index 5f0922467..d8b7a591d 100644 --- a/app/data/i18n/Turkish.json +++ b/app/data/i18n/Turkish.json @@ -93,7 +93,7 @@ "odalar", "odalar" ], - "font": [ + "typeface": [ "font", "fontlar", "fontlar" @@ -965,7 +965,6 @@ "strokeColor": "Hat rengi:", "strokeWeight": "Çizgi ağırlığı:", "testText": "Deneme yazısı 0123 +", - "fontFamily": "Font ailesi:", "fontSize": "Font boyutu:" }, "textureView": { diff --git a/app/data/i18n/Ukranian.json b/app/data/i18n/Ukranian.json index 723f59672..e28a8ab90 100644 --- a/app/data/i18n/Ukranian.json +++ b/app/data/i18n/Ukranian.json @@ -99,7 +99,7 @@ "кімнати", "кімнат" ], - "font": [ + "typeface": [ "шрифт", "шрифту", "шрифтів" @@ -795,7 +795,6 @@ "strokeColor": "Колір обведення", "strokeWeight": "Товщина обведення:", "testText": "Тест Test 0123+", - "fontFamily": "Родина шрифтів:", "fontSize": "Розмір шрифту:" }, "textureView": { diff --git a/app/data/img/bg.png b/app/data/img/bg.png deleted file mode 100644 index 9b33d6782..000000000 Binary files a/app/data/img/bg.png and /dev/null differ diff --git a/app/data/img/ctjsLogo.svg b/app/data/img/ctjsLogo.svg new file mode 100644 index 000000000..c09d379bf --- /dev/null +++ b/app/data/img/ctjsLogo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/package-lock.json b/app/package-lock.json index b1fb24965..425ca9226 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,220 +1,272 @@ { "name": "ctjs", - "version": "4.0.2", + "version": "5.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ctjs", - "version": "4.0.2", + "version": "5.0.0", "license": "MIT", "dependencies": { - "@capacitor/cli": "^5.5.0", - "@capacitor/core": "^5.5.0", - "@neutralinojs/neu": "^10.1.0", - "@pixi/particle-emitter": "5.0.8", - "@pixi/sound": "^5.2.2", - "@trapezedev/project": "^7.0.10", - "archiver": "^3.1.1", - "coffeescript": "^2.7.0", - "csswring": "7.0.0", - "dragonbones-tools": "^0.1.2", - "electron-packager": "^16.0.0", - "execa": "^5.1.1", - "extract-zip": "^2.0.1", - "fs-extra": "^10.1.0", - "fuse.js": "^3.6.1", - "highlight.js": "^10.4.1", - "html-minifier": "^3.5.21", - "html2pug": "^4.0.0", - "is-expression": "^4.0.0", - "javascript-obfuscator": "^4.0.2", - "js-yaml": "^3.14.0", - "markdown-it": "12.3.2", - "maxrects-packer": "^2.7.3", - "microm": "^0.2.4", - "monaco-editor": "^0.34.0", - "monaco-themes": "^0.4.2", - "nanoid": "^3.1.31", - "on-change": "^4.0.2", - "opentype.js": "^1.3.3", - "pixi-ease": "^3.0.7", - "pixi.js": "7.3.2", - "pixi.js-legacy": "7.3.2", + "@neutralinojs/neu": "^11.0.1", "png2icons": "^2.0.1", - "resedit-cli": "^2.0.0", - "serve-handler": "^6.1.5", - "sucrase": "^3.25.0", - "terser": "^5.14.2", - "ttf2woff": "^2.0.2" + "resedit-cli": "^2.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@capacitor/cli": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.5.1.tgz", - "integrity": "sha512-/oGd2IIc+k1H/fc7tUzP7vqMtZi0gNcJ4/4wUE2kzAnETxxxHXMM/2V62KfjCby/OOAzJbtI7n5OPlnWE9un1A==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "@ionic/cli-framework-output": "^2.2.5", - "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-subprocess": "^2.1.11", - "@ionic/utils-terminal": "^2.3.3", - "commander": "^9.3.0", - "debug": "^4.3.4", - "env-paths": "^2.2.0", - "kleur": "^4.1.4", - "native-run": "^1.7.3", - "open": "^8.4.0", - "plist": "^3.0.5", - "prompts": "^2.4.2", - "rimraf": "^4.4.1", - "semver": "^7.3.7", - "tar": "^6.1.11", - "tslib": "^2.4.0", - "xml2js": "^0.5.0" + "color-convert": "^1.9.0" }, - "bin": { - "cap": "bin/capacitor", - "capacitor": "bin/capacitor" + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=4" } }, - "node_modules/@capacitor/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "balanced-match": "^1.0.0" + "color-name": "1.1.3" } }, - "node_modules/@capacitor/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=4" } }, - "node_modules/@capacitor/cli/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/@capacitor/cli/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "node_modules/@neutralinojs/neu": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@neutralinojs/neu/-/neu-11.0.1.tgz", + "integrity": "sha512-GIQW8KUi3X3Bb90ozFBRq5ZjsN6ktY+AK+w8y8tErHw2nkn/NGt4Nuu+nssutnJawR87EgCmZ7FXoa3wx2UCqg==", "dependencies": { - "brace-expansion": "^2.0.1" + "archiver": "^4.0.2", + "asar": "^3.0.3", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "commander": "^7.2.0", + "configstore": "^5.0.1", + "decompress": "^4.2.1", + "edit-json-file": "^1.6.2", + "figlet": "^1.5.0", + "follow-redirects": "^1.13.1", + "fs-extra": "^9.0.1", + "recursive-readdir": "^2.2.2", + "spawn-command": "^0.0.2-1", + "tcp-port-used": "^1.0.2", + "uuid": "^8.3.2", + "websocket": "^1.0.34" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "bin": { + "neu": "bin/neu.js" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "patreon", + "url": "https://www.patreon.com/shalithasuranga" } }, - "node_modules/@capacitor/cli/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "optional": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "optional": true + }, + "node_modules/@types/node": { + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, - "node_modules/@capacitor/cli/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@capacitor/core": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.5.1.tgz", - "integrity": "sha512-VG6Iv8Q7ZAbvjodxpvjcSe0jfxUwZXnvjbi93ehuJ6eYP8U926qLSXyrT/DToZq+F6v/HyGyVgn3mrE/9jW2Tg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { - "tslib": "^2.1.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "node_modules/archiver": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-4.0.2.tgz", + "integrity": "sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.6", + "readable-stream": "^3.6.0", + "tar-stream": "^2.1.2", + "zip-stream": "^3.0.1" + }, "engines": { - "node": ">= 12" + "node": ">= 8" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/@electron/asar": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.2.tgz", - "integrity": "sha512-32fMU68x8a6zvxtC1IC/BhPDKTh8rQjdmwEplj3CDpnkcwBzZVN9v/8cK0LJqQ0FOQQVZW8BWZ1S6UU53TYR4w==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/asar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", + "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", + "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", "dependencies": { "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", @@ -231,7 +283,7 @@ "@types/glob": "^7.1.1" } }, - "node_modules/@electron/asar/node_modules/commander": { + "node_modules/asar/node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", @@ -239,8077 +291,1353 @@ "node": ">= 6" } }, - "node_modules/@electron/get": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.1.tgz", - "integrity": "sha512-8nmTGC/3/6IaEfeTcQwtJdjLA/L3sb0XQJUv9x3ZfM0pfmKvkSdelbT4pgF3dpCQOvSmJ97kYAvFltikVjfepA==", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1" - } + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, - "node_modules/@electron/get/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">= 4.0.0" } }, - "node_modules/@electron/get/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/@electron/get/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/@electron/get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@electron/get/node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@electron/get/node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=8" } }, - "node_modules/@electron/get/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/@electron/get/node_modules/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", - "dependencies": { - "json-buffer": "3.0.1" + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/@electron/get/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/@electron/get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, - "node_modules/@electron/get/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/@electron/get/node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" }, - "node_modules/@electron/get/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "node-gyp-build": "^4.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=6.14.2" } }, - "node_modules/@electron/universal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz", - "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==", - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { - "node": ">=8.6" + "node": ">=6" } }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { - "universalify": "^2.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { - "node": ">= 10.0.0" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "engines": { - "node": ">=6.9.0" - } + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==" }, - "node_modules/@ionic/cli-framework-output": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.7.tgz", - "integrity": "sha512-/BXeclqu3y+bsBF7VFRS9xtNbrXf2JYCj/LeJoyLpWA9PeXNfvFrn91W2lwS2HVDjEDWKl4Ye6edJDdtn76EnA==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "@ionic/utils-terminal": "2.3.4", - "debug": "^4.0.0", - "tslib": "^2.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=12" } }, - "node_modules/@ionic/utils-array": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", - "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16.0.0" + "node": ">=7.0.0" } }, - "node_modules/@ionic/utils-fs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", - "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@ionic/utils-fs/node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dependencies": { - "@types/node": "*" + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" } }, - "node_modules/@ionic/utils-fs/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/compress-commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-3.0.0.tgz", + "integrity": "sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.7" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@ionic/utils-fs/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/@ionic/utils-fs/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } + "node_modules/compress-commons/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/@ionic/utils-object": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", - "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/@ionic/utils-process": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", - "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dependencies": { - "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.4", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=8" } }, - "node_modules/@ionic/utils-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", - "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@ionic/utils-subprocess": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.14.tgz", - "integrity": "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==", + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.11", - "@ionic/utils-stream": "3.1.6", - "@ionic/utils-terminal": "2.3.4", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" + "buffer": "^5.1.0" } }, - "node_modules/@ionic/utils-terminal": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", - "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dependencies": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 6.9.0" } }, - "node_modules/@javascript-obfuscator/escodegen": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", - "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dependencies": { - "@javascript-obfuscator/estraverse": "^5.3.0", - "esprima": "^4.0.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=0.12" } }, - "node_modules/@javascript-obfuscator/estraverse": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", - "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "node_modules/decompress-tar/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "node_modules/decompress-tar/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "node_modules/decompress-tar/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "safe-buffer": "~5.1.0" } }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dependencies": { - "cross-spawn": "^7.0.1" + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">= 0.8.0" } }, - "node_modules/@neutralinojs/neu": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@neutralinojs/neu/-/neu-10.1.0.tgz", - "integrity": "sha512-QUaoFsS18tpU5CfWUUSQjmNiIll5uKseuGYHKcqOR+E6eSX3+nwuMNgyHVKHtNwlVuD+iSBjcVCWatoPNSxBYA==", + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dependencies": { - "archiver": "^4.0.2", - "asar": "^3.0.3", - "chalk": "^4.1.0", - "chokidar": "^3.5.1", - "commander": "^7.2.0", - "configstore": "^5.0.1", - "decompress": "^4.2.1", - "edit-json-file": "^1.6.2", - "figlet": "^1.5.0", - "follow-redirects": "^1.13.1", - "fs-extra": "^9.0.1", - "recursive-readdir": "^2.2.2", - "spawn-command": "^0.0.2-1", - "tcp-port-used": "^1.0.2", - "uuid": "^8.3.2", - "websocket": "^1.0.34" - }, - "bin": { - "neu": "bin/neu.js" + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/shalithasuranga" + "engines": { + "node": ">=4" } }, - "node_modules/@neutralinojs/neu/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, - "node_modules/@neutralinojs/neu/node_modules/archiver": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-4.0.2.tgz", - "integrity": "sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ==", + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.1.6", - "readable-stream": "^3.6.0", - "tar-stream": "^2.1.2", - "zip-stream": "^3.0.1" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@neutralinojs/neu/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/@neutralinojs/neu/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, - "node_modules/@neutralinojs/neu/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dependencies": { - "color-name": "~1.1.4" + "pify": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/@neutralinojs/neu/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@neutralinojs/neu/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/@neutralinojs/neu/node_modules/compress-commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-3.0.0.tgz", - "integrity": "sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^2.3.7" + "is-obj": "^2.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@neutralinojs/neu/node_modules/compress-commons/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/edit-json-file": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/edit-json-file/-/edit-json-file-1.8.0.tgz", + "integrity": "sha512-IBOpbe2aQufNl5oZ4jsr2AmNVUy5bO7jS5hk0cCyWhOLdH59Xv41B3XQObE/JB89Ae5qDY9hVsq13/hgGhFBZg==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "find-value": "^1.0.12", + "iterate-object": "^1.3.4", + "r-json": "^1.2.10", + "set-value": "^4.1.0", + "w-json": "^1.3.10" } }, - "node_modules/@neutralinojs/neu/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" + "once": "^1.4.0" } }, - "node_modules/@neutralinojs/neu/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/@neutralinojs/neu/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, "dependencies": { - "universalify": "^2.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=0.10" } }, - "node_modules/@neutralinojs/neu/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/@neutralinojs/neu/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", "dependencies": { - "has-flag": "^4.0.0" + "d": "^1.0.2", + "ext": "^1.7.0" }, "engines": { - "node": ">=8" + "node": ">=0.12" } }, - "node_modules/@neutralinojs/neu/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { - "node": ">= 10.0.0" + "node": ">=6" } }, - "node_modules/@neutralinojs/neu/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@neutralinojs/neu/node_modules/zip-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-3.0.1.tgz", - "integrity": "sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ==", + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^3.0.0", - "readable-stream": "^3.6.0" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" }, "engines": { - "node": ">= 8" + "node": ">=0.10" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" + "d": "1", + "es5-ext": "~0.10.14" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "pend": "~1.2.0" } }, - "node_modules/@pixi/assets": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.2.2.tgz", - "integrity": "sha512-YtudMqxyPx1yZ3oczP1OIMQJlb0/psymZGU7PMyea0wSYol14imMOdNa0sNFz/at6a6kM1w/vQdlz+8AqML1vw==", - "peer": true, - "dependencies": { - "@types/css-font-loading-module": "^0.0.7" + "node_modules/figlet": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", + "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", + "bin": { + "figlet": "bin/index.js" }, - "peerDependencies": { - "@pixi/core": "7.2.2", - "@pixi/utils": "7.2.2" + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/@pixi/color": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.2.2.tgz", - "integrity": "sha512-rg3zrwnkCtfX73sbIDuXyBlQWdRlREs4UlvC6gJ0EGHbGtwAK0Zz041fDW8isYYLcjd3LopVlNrjrFGE+v+adQ==", - "peer": true, - "dependencies": { - "colord": "^2.9.3" + "node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "engines": { + "node": ">=4" } }, - "node_modules/@pixi/colord": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", - "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==" - }, - "node_modules/@pixi/constants": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.2.2.tgz", - "integrity": "sha512-hHdXfhRNOCEg/5LbR4izY9feEyxtjNKs6l4Np87iiglvK5oj2hjiLz3c1VHWooNy8VQmndcLC11Tl0krxuQjiw==", - "peer": true - }, - "node_modules/@pixi/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.2.2.tgz", - "integrity": "sha512-grDYsthKpb9OPlAPrzutogodciky6x8eWz+0ER+I5KBzK/1w1fBYnYiQZCH0MByNJMABE75cynWv9inMJu0rEQ==", - "peer": true, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { - "@pixi/color": "7.2.2", - "@pixi/constants": "7.2.2", - "@pixi/extensions": "7.2.2", - "@pixi/math": "7.2.2", - "@pixi/runner": "7.2.2", - "@pixi/settings": "7.2.2", - "@pixi/ticker": "7.2.2", - "@pixi/utils": "7.2.2", - "@types/offscreencanvas": "^2019.6.4" + "to-regex-range": "^5.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" + "engines": { + "node": ">=8" } }, - "node_modules/@pixi/display": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.2.2.tgz", - "integrity": "sha512-zUkFhwnqsKatwB1I3ZAD1on1RCvuTLZ1MV1JQd97pMBAJBC9UvDuKIJ6Zcr377YXKFnIFGFFxat9LyVTUxTWvQ==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.2.2" - } + "node_modules/find-value": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/find-value/-/find-value-1.0.12.tgz", + "integrity": "sha512-OCpo8LTk8eZ2sdDCwbU2Lc3ivYsdM6yod6jP2jHcNEFcjPhkgH0+POzTIol7xx1LZgtbI5rkO5jqxsG5MWtPjQ==" }, - "node_modules/@pixi/extensions": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.2.2.tgz", - "integrity": "sha512-b54qLl/GQK6VKgTiaeCg8tyujykfBhLn6PGGoY0fyWXEOYXRPyZ/oZDadz0bhLURwPzfnHbblINkK8L6JJpCSQ==", - "peer": true + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "node_modules/@pixi/math": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.2.2.tgz", - "integrity": "sha512-h4Qb2BOhiGoWQnG7RdS0nK5P9k33950S158GqLAXf+jN19fENPJibfh05ckdUwkVtYnd+PuBqcriH/vrRPICfQ==", - "peer": true + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "node_modules/@pixi/particle-emitter": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@pixi/particle-emitter/-/particle-emitter-5.0.8.tgz", - "integrity": "sha512-OzuZ4+esQo+zJ0u3htuNHHMAE8Ixmr3nz3tEfrTGZHje1vnGyie3ANQj9F0V4OM47oi9jd70njVCmeb7bTkS9A==", - "peerDependencies": { - "@pixi/constants": ">=6.0.4 <8.0.0", - "@pixi/core": ">=6.0.4 <8.0.0", - "@pixi/display": ">=6.0.4 <8.0.0", - "@pixi/math": ">=6.0.4 <8.0.0", - "@pixi/sprite": ">=6.0.4 <8.0.0", - "@pixi/ticker": ">=6.0.4 <8.0.0" - } - }, - "node_modules/@pixi/runner": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.2.2.tgz", - "integrity": "sha512-rXbMGtk1aS8OSR/yMzdHxdWQIaEKAIV6k37L8Zt/wAD1lmTDqvDTjm8BSxPLQMkNGNFL+3YoBgTev1e7aNgWxw==", - "peer": true - }, - "node_modules/@pixi/settings": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.2.2.tgz", - "integrity": "sha512-IqkiEZ3c/XAU1iPCuUy+MkzfzI3Hw7xHL24C+QrwbaJtJTodoKyfuKsk/H7T7Sz2f0gop1lfqwC3jGRiYzS/2g==", - "peer": true, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { - "@pixi/constants": "7.2.2", - "@types/css-font-loading-module": "^0.0.7", - "ismobilejs": "^1.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@pixi/sound": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@pixi/sound/-/sound-5.2.2.tgz", - "integrity": "sha512-WjUDD24nQaAA2+aHbvDbgB/9l/kni3aNlZSmunU99KBGrQ9NfGS/VvAUxA88b7eOLXNvskzW2cvEnGMbltRiFA==", - "peerDependencies": { - "@pixi/assets": "^7.0.0", - "@pixi/core": "^7.0.0" - } + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/@pixi/sprite": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.2.2.tgz", - "integrity": "sha512-GFt7Vyy41rVqQJOtstTD5mC+Dgyc6duySWrsRvCTSD6Q7nvJC+y7Zpgl6If9wbq2wx8CRGk9KlLeBI16rra69Q==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.2.2", - "@pixi/display": "7.2.2" + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@pixi/ticker": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.2.2.tgz", - "integrity": "sha512-fNW1WWnDfyc7pk+AUokUeurK19gG3bIX/NQGB+Y7KiP84EwKZbLwMXQWIhc3aRZt7lzEA8yFXQ0+Oqi5IIGFUQ==", - "peer": true, - "dependencies": { - "@pixi/extensions": "7.2.2", - "@pixi/settings": "7.2.2", - "@pixi/utils": "7.2.2" + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/@pixi/utils": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.2.2.tgz", - "integrity": "sha512-+EMCAA+lDe8AmLzrwAhCNybevuOcGyFHSo1NtRpd7Z1ocrG0atzq4gjKxUX8VoqJ89rWFZdhZpdGPMh0xRELaQ==", - "peer": true, + "node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", "dependencies": { - "@pixi/color": "7.2.2", - "@pixi/constants": "7.2.2", - "@pixi/settings": "7.2.2", - "@types/earcut": "^2.1.0", - "earcut": "^2.2.4", - "eventemitter3": "^4.0.0", - "url": "^0.11.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "defer-to-connect": "^1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@trapezedev/gradle-parse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", - "integrity": "sha512-k822Is3jGroqOTKF0gAFm80LmhFJWBAyZvNtyuXq6uQUzDDe2fj/gHwixP6VFzlpaWKLP7IuR609Xv8gwJCXyg==" - }, - "node_modules/@trapezedev/project": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@trapezedev/project/-/project-7.0.10.tgz", - "integrity": "sha512-UjwsStjhHq/+D1bWREmFDoyKql+qFIgJX93zQLg7R6CyWZUdtlGP2hU3l7tsVRtjJBVXpVu5mj8tdwJJoABO3A==", - "dependencies": { - "@ionic/utils-fs": "^3.1.5", - "@ionic/utils-subprocess": "^2.1.8", - "@prettier/plugin-xml": "^2.2.0", - "@trapezedev/gradle-parse": "7.0.10", - "@xmldom/xmldom": "^0.7.5", - "conventional-changelog": "^3.1.4", - "cross-fetch": "^3.1.5", - "cross-spawn": "^7.0.3", - "diff": "^5.1.0", - "env-paths": "^3.0.0", - "gradle-to-js": "^2.0.0", - "ini": "^2.0.0", - "kleur": "^4.1.5", - "lodash": "^4.17.21", - "mergexml": "^1.2.3", - "npm-watch": "^0.9.0", - "plist": "^3.0.4", - "prettier": "^2.7.1", - "prompts": "^2.4.2", - "replace": "^1.1.0", - "tempy": "^1.0.1", - "tmp": "^0.2.1", - "ts-node": "^10.2.1", - "xcode": "^3.0.1", - "xml-js": "^1.6.11", - "xpath": "^0.0.32", - "yargs": "^17.2.1" - } - }, - "node_modules/@trapezedev/project/node_modules/@prettier/plugin-xml": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", - "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "@xml-tools/parser": "^1.0.11", - "prettier": ">=2.4.0" - } - }, - "node_modules/@trapezedev/project/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 6" } }, - "node_modules/@trapezedev/project/node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/@trapezedev/project/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/css-font-loading-module": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", - "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==" - }, - "node_modules/@types/earcut": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.1.tgz", - "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==" - }, - "node_modules/@types/fs-extra": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-4.0.12.tgz", - "integrity": "sha512-alTHKMXq1kGPB9sddbbjJ4OJ9UJ/xiXaaoDzbLhontmlnZLwlJpvIUE8lI7YtcO45gcI9Cwt8hPfmU1rgmVHSQ==", - "dependencies": { - "@types/node": "*" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "optional": true, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" } }, - "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" - }, - "node_modules/@types/node": { - "version": "12.12.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.28.tgz", - "integrity": "sha512-g73GJYJDXgf0jqg+P9S8h2acWbDXNkoCX8DLtJVu7Fkn788pzQ/oJsrdJz/2JejRf/SjfZaAhsw+3nd1D5EWGg==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==" + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { - "@types/node": "*" + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==" - }, - "node_modules/@types/validator": { - "version": "13.7.12", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz", - "integrity": "sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==" - }, - "node_modules/@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "optional": true, - "dependencies": { - "@types/node": "*" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@xml-tools/parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", - "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", - "dependencies": { - "chevrotain": "7.1.1" + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.9.tgz", - "integrity": "sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==" }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.4.0" + "node": ">=0.12.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=" - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ansi-align": { + "node_modules/is-primitive": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", "dependencies": { - "color-convert": "^1.9.0" + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" }, "engines": { - "node": ">=4" + "node": ">=v0.10.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "node_modules/iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^2.6.3", - "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" + "universalify": "^2.0.0" }, - "engines": { - "node": ">= 6" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "readable-stream": "^2.0.5" }, "engines": { - "node": ">= 6" + "node": ">= 0.6.3" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" - } - }, - "node_modules/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "dependencies": { - "array-filter": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "optional": true - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chance": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.9.tgz", - "integrity": "sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==" - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "engines": { - "node": "*" - } - }, - "node_modules/chevrotain": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", - "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", - "dependencies": { - "regexp-to-ast": "0.5.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==" - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/class-validator": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", - "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", - "dependencies": { - "@types/validator": "^13.7.10", - "libphonenumber-js": "^1.10.14", - "validator": "^13.7.0" - } - }, - "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/coffeescript": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz", - "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==", - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "peer": true - }, - "node_modules/commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", - "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^2.3.6" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "optional": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc32-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", - "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", - "dependencies": { - "crc": "^3.4.4", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn-windows-exe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", - "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "is-wsl": "^2.2.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/csswring": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/csswring/-/csswring-7.0.0.tgz", - "integrity": "sha512-yl9lWqdhVn4gD0Vf00BMKKFuLq19hpz87VTDBRYFa+xWjRdfa/+bddCsWN7mbwfXWFoL5RwDOJmKakkC/VaH7w==", - "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", - "dependencies": { - "minimist": "^1.2.0", - "onecolor": "^3.0.5", - "postcss": "^7.0.0" - }, - "bin": { - "csswring": "bin/csswring.js" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tar/node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/decompress-tar/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-tar/node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-targz/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", - "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip/node_modules/get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", - "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress/node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "optional": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dragonbones-tools": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dragonbones-tools/-/dragonbones-tools-0.1.2.tgz", - "integrity": "sha512-4OPCse4ZjBLyBX7IcQsYpJcHBimlOmfhR5OFJAKbKC4h2Lp677JwNDvU1paAuNz+0N3mEBiSFTm5PUZWsiRpgw==", - "dependencies": { - "@types/fs-extra": "^4.0.0", - "commander": "^2.11.0", - "fs-extra": "^4.0.1" - }, - "bin": { - "2db": "out/convertFrom.js", - "db-test-demos": "out/test/testDemos.js", - "db2": "out/convertTo.js" - } - }, - "node_modules/dragonbones-tools/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "node_modules/edit-json-file": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/edit-json-file/-/edit-json-file-1.7.0.tgz", - "integrity": "sha512-eIkLJ9i4ija7b2TbaLHy3scyjWFLzwM2Wa6kHbV4ppVLcCqn7FzqnO1vmCG3dLrkd+teWE3mvACfv166mO0VZg==", - "dependencies": { - "find-value": "^1.0.12", - "iterate-object": "^1.3.4", - "r-json": "^1.2.10", - "set-value": "^4.1.0", - "w-json": "^1.3.10" - } - }, - "node_modules/electron-notarize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.1.tgz", - "integrity": "sha512-u/ECWhIrhkSQpZM4cJzVZ5TsmkaqrRo5LDC/KMbGF0sPkm53Ng59+M0zp8QVaql0obfJy9vlVT+4iOkAi2UDlA==", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-notarize/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-osx-sign": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", - "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", - "deprecated": "Please use @electron/osx-sign moving forward. Be aware the API is slightly different", - "dependencies": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/electron-packager": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-16.0.0.tgz", - "integrity": "sha512-7Ey4UUaHg3FYhA7ktsAvCWP8srp9+iPljGdeJBsNaZBakU6HWhvRC+Pc7LWXGCgAVIN5BQsUwR3xrCbFno91VA==", - "dependencies": { - "@electron/get": "^2.0.0", - "@electron/universal": "^1.2.1", - "asar": "^3.1.0", - "cross-spawn-windows-exe": "^1.2.0", - "debug": "^4.0.1", - "electron-notarize": "^1.1.1", - "electron-osx-sign": "^0.5.0", - "extract-zip": "^2.0.0", - "filenamify": "^4.1.0", - "fs-extra": "^10.1.0", - "galactus": "^0.2.1", - "get-package-info": "^1.0.0", - "junk": "^3.1.0", - "parse-author": "^2.0.0", - "plist": "^3.0.0", - "rcedit": "^3.0.1", - "resolve": "^1.1.6", - "semver": "^7.1.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "electron-packager": "bin/electron-packager.js" - }, - "engines": { - "node": ">= 14.17.5" - }, - "funding": { - "url": "https://github.com/electron/electron-packager?sponsor=1" - } - }, - "node_modules/electron-packager/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", - "dependencies": { - "sax": "1.1.4" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "optional": true - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-plist": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.2.tgz", - "integrity": "sha1-pFr/NFGWAG1AbKbNzQX2kFHvNbg=" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figlet": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", - "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", - "bin": { - "figlet": "bin/index.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.1.0.tgz", - "integrity": "sha512-KQV/uJDI9VQgN7sHH1Zbk6+42cD6mnQ2HONzkXUfPJ+K2FC8GZ1dpewbbHw0Sz8Tf5k3EVdHVayM4DoAwWlmtg==", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-value": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/find-value/-/find-value-1.0.12.tgz", - "integrity": "sha512-OCpo8LTk8eZ2sdDCwbU2Lc3ivYsdM6yod6jP2jHcNEFcjPhkgH0+POzTIol7xx1LZgtbI5rkO5jqxsG5MWtPjQ==" - }, - "node_modules/flora-colossus": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", - "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^7.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/flora-colossus/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dependencies": { - "universalify": "^1.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fs-extra/node_modules/jsonfile/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/galactus": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", - "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", - "dependencies": { - "debug": "^3.1.0", - "flora-colossus": "^1.0.0", - "fs-extra": "^4.0.0" - } - }, - "node_modules/galactus/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/galactus/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", - "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", - "dependencies": { - "bluebird": "^3.1.1", - "debug": "^2.2.0", - "lodash.get": "^4.0.0", - "read-pkg-up": "^2.0.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/get-package-info/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/get-package-info/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-remote-origin-url/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "optional": true, - "dependencies": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "optional": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "node_modules/gradle-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.0.tgz", - "integrity": "sha512-eoYJiSoreHG0cS5aUmv7ISJhajuULlqdqG3QKVti6x1EFkBXE8rGH6ipGKWEesXpCkfNgzBrhzo5ztIH1JWZMw==", - "dependencies": { - "lodash.merge": "4.6.2" - }, - "bin": { - "gradle-to-js": "cli.js" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/highlight.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz", - "integrity": "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg==", - "engines": { - "node": "*" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/html2pug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html2pug/-/html2pug-4.0.0.tgz", - "integrity": "sha512-CeOvSspLyo6F/hKflOF1W1XjgvQ1FJkl6hM9SjUFBDe9o2+HG7V+F2HtRGDwxvJvn/bH7M0namSWpsBVj5vzLQ==", - "dependencies": { - "get-stdin": "^6.0.0", - "has-flag": "^4.0.0", - "html-minifier": "^4.0.0", - "parse5": "^5.1.0" - }, - "bin": { - "html2pug": "src/cli.js" - } - }, - "node_modules/html2pug/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/html2pug/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/html2pug/node_modules/html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "dependencies": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html2pug/node_modules/uglify-js": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", - "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inversify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", - "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==" - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/is-expression/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-nan": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.0.tgz", - "integrity": "sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==" - }, - "node_modules/is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-primitive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", - "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", - "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", - "dependencies": { - "available-typed-arrays": "^1.0.0", - "es-abstract": "^1.17.4", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/is2": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", - "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", - "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" - }, - "engines": { - "node": ">=v0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dependencies": { - "buffer-alloc": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/ismobilejs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", - "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/iterate-object": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", - "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" - }, - "node_modules/javascript-obfuscator": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.0.2.tgz", - "integrity": "sha512-MRBQREvjEwqEGdwNGG7yp0te5uZBFzrPZdxEs4rDYkPpHhhOQu+E0IhSXP7bO9dIUWXZU0Kkdohsuws525aVGQ==", - "hasInstallScript": true, - "dependencies": { - "@javascript-obfuscator/escodegen": "2.3.0", - "@javascript-obfuscator/estraverse": "5.4.0", - "acorn": "8.8.2", - "assert": "2.0.0", - "chalk": "4.1.2", - "chance": "1.1.9", - "class-validator": "0.14.0", - "commander": "10.0.0", - "eslint-scope": "7.1.1", - "eslint-visitor-keys": "3.3.0", - "fast-deep-equal": "3.1.3", - "inversify": "6.0.1", - "js-string-escape": "1.0.1", - "md5": "2.3.0", - "mkdirp": "2.1.3", - "multimatch": "5.0.0", - "opencollective-postinstall": "2.0.3", - "process": "0.11.10", - "reflect-metadata": "0.1.13", - "source-map-support": "0.5.21", - "string-template": "1.0.0", - "stringz": "2.1.0", - "tslib": "2.5.0" - }, - "bin": { - "javascript-obfuscator": "bin/javascript-obfuscator" - }, - "engines": { - "node": "^12.22.0 || ^14.0.0 || ^16.0.0 || ^17.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/javascript-obfuscator" - } - }, - "node_modules/javascript-obfuscator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/javascript-obfuscator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/javascript-obfuscator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/javascript-obfuscator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/javascript-obfuscator/node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/javascript-obfuscator/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/javascript-obfuscator/node_modules/mkdirp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", - "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/javascript-obfuscator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.10.20", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.20.tgz", - "integrity": "sha512-kQovlKNdLcVzerbTPmJ+Fx4R+7/pYXmPDIllHjg7IxL4X6MsMG7jaT5opfYrBok0uqkByVif//JUR8e11l/V7w==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/maxrects-packer": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/maxrects-packer/-/maxrects-packer-2.7.3.tgz", - "integrity": "sha512-bG6qXujJ1QgttZVIH4WDanhoJtvbud/xP/XPyf6A69C9RdA61BM4TomFALCq2nrTa+tARRIBB4LuIFsnUQU2wA==" - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mergexml": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.3.tgz", - "integrity": "sha512-sNc9qswtLUoGmN0MB3dY+MCIJqCGEZZrtYp0Z5Iwsk6ELc/V96SFIuv5Y6O6tYAsFtdpJcPFV0FgOSHSciJLbA==", - "dependencies": { - "@xmldom/xmldom": "^0.7.0", - "formidable": "^1.2.1", - "xpath": "0.0.27" - } - }, - "node_modules/mergexml/node_modules/xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/microbuffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", - "integrity": "sha1-izgy7UDIfVH0e7I0kTppinVtGdI=" - }, - "node_modules/microm": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/microm/-/microm-0.2.4.tgz", - "integrity": "sha1-CMYfufyBAJByc/tTHlme/320UBE=", - "dependencies": { - "extend": "3.0.0", - "rsvp": "^3.1.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/monaco-editor": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.0.tgz", - "integrity": "sha512-VF+S5zG8wxfinLKLrWcl4WUizMx+LeJrG4PM/M78OhcwocpV0jiyhX/pG6Q9jIOhrb/ckYi6nHnaR5OojlOZCQ==" - }, - "node_modules/monaco-themes": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/monaco-themes/-/monaco-themes-0.4.2.tgz", - "integrity": "sha512-T3kp6SC5MPJvwYGXZENCd0UOIKVgUVV5SjsiXLBhgEZBnScY+6gEbwNRK1oYmfwbf+dGVqF1bSLN5YcrFu3HmA==", - "dependencies": { - "fast-plist": "^0.1.2" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.1.31", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz", - "integrity": "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/native-run": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.4.tgz", - "integrity": "sha512-yDEwTp66vmXpqFiSQzz4sVQgyq5U58gGRovglY4GHh12ITyWa6mh6Lbpm2gViVOVD1JYFtYnwcgr7GTFBinXNA==", - "dependencies": { - "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-terminal": "^2.3.3", - "bplist-parser": "^0.3.2", - "debug": "^4.3.4", - "elementtree": "^0.1.7", - "ini": "^3.0.1", - "plist": "^3.0.6", - "split2": "^4.1.0", - "through2": "^4.0.2", - "tslib": "^2.4.0", - "yauzl": "^2.10.0" - }, - "bin": { - "native-run": "bin/native-run" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/native-run/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/native-run/node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/native-run/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", - "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "hasInstallScript": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "optional": true, - "dependencies": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-watch": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.9.0.tgz", - "integrity": "sha512-C5Rgh5+jvY33K1EH8Qjr1hfpH9Nhasc90QJ0W+JyKg2ogE0LOCZI4xirC8QmywW7XinyBpynwxlrN6aPfjc3Hw==", - "dependencies": { - "nodemon": "^2.0.7", - "through2": "^4.0.2" - }, - "bin": { - "npm-watch": "cli.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", - "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-change": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.2.tgz", - "integrity": "sha512-cMtCyuJmTx/bg2HCpHo3ZLeF7FZnBOapLqZHr2AlLeJ5Ul0Zu2mUJJz051Fdwu/Et2YW04ZD+TtU+gVy0ACNCA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/on-change?sponsor=1" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onecolor": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.0.5.tgz", - "integrity": "sha1-Nu/zIgE3nv3xGA+0ReUajiQl+fY=", - "engines": { - "node": ">=0.4.8" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "bin": { - "opencollective-postinstall": "index.js" - } - }, - "node_modules/opentype.js": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.3.tgz", - "integrity": "sha512-/qIY/+WnKGlPIIPhbeNjynfD2PO15G9lA/xqlX2bDH+4lc3Xz5GCQ68mqxj3DdUv6AJqCeaPvuAoH8mVL0zcuA==", - "dependencies": { - "string.prototype.codepointat": "^0.2.1", - "tiny-inflate": "^1.0.3" - }, - "bin": { - "ot": "bin/ot" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", - "dependencies": { - "author-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-type/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pe-library": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.0.tgz", - "integrity": "sha512-yZ+4d3YHKUjO0BX03oXFfHRKLdYKDO2HmCt1RcApPxme/P5ASPbbKnuQkzFrmT482wi2kfO+sPgqasrz5QeU1w==", - "engines": { - "node": ">=14", - "npm": ">=7" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "node_modules/penner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/penner/-/penner-0.1.3.tgz", - "integrity": "sha512-UzkaC2L6d9J1VzJAFH0TQwuKE/rerpTZkgW6aPLVeu/LdjWn6rnuY9lXcVN1AE9tZVfHrsJ2gZOBsRjpQECNHA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pixi-ease": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/pixi-ease/-/pixi-ease-3.0.7.tgz", - "integrity": "sha512-ew1IzAi2layygHrk8+tk6XTuue3WM6Po5LsA46v+9BtQNMa2sX0PMLzQ4nq1UpTbLg4Dwqep9RTzDRsFhCYJJw==", - "dependencies": { - "eventemitter3": "^4.0.0", - "penner": "^0.1.3" - }, - "peerDependencies": { - "pixi.js": ">=4.6.0" - } - }, - "node_modules/pixi.js": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.3.2.tgz", - "integrity": "sha512-GJickUrT3UcBInGT1CU6cv2oktCdocE5QM74CD3t+weiJPPWIzleNlp7zrBR5QIDdU6bEO8CUgUXH2Y9QvlCMw==", - "dependencies": { - "@pixi/accessibility": "7.3.2", - "@pixi/app": "7.3.2", - "@pixi/assets": "7.3.2", - "@pixi/compressed-textures": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/events": "7.3.2", - "@pixi/extensions": "7.3.2", - "@pixi/extract": "7.3.2", - "@pixi/filter-alpha": "7.3.2", - "@pixi/filter-blur": "7.3.2", - "@pixi/filter-color-matrix": "7.3.2", - "@pixi/filter-displacement": "7.3.2", - "@pixi/filter-fxaa": "7.3.2", - "@pixi/filter-noise": "7.3.2", - "@pixi/graphics": "7.3.2", - "@pixi/mesh": "7.3.2", - "@pixi/mesh-extras": "7.3.2", - "@pixi/mixin-cache-as-bitmap": "7.3.2", - "@pixi/mixin-get-child-by-name": "7.3.2", - "@pixi/mixin-get-global-position": "7.3.2", - "@pixi/particle-container": "7.3.2", - "@pixi/prepare": "7.3.2", - "@pixi/sprite": "7.3.2", - "@pixi/sprite-animated": "7.3.2", - "@pixi/sprite-tiling": "7.3.2", - "@pixi/spritesheet": "7.3.2", - "@pixi/text": "7.3.2", - "@pixi/text-bitmap": "7.3.2", - "@pixi/text-html": "7.3.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/pixi.js-legacy": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/pixi.js-legacy/-/pixi.js-legacy-7.3.2.tgz", - "integrity": "sha512-10nZf8jG0z7GJmg0cy53wWYzVDVCbMOMKTyhKm+NrWX8XmbIbsodYWAg1IdabnVbWKKg+zLX1dL+Wn6TakEeqw==", - "dependencies": { - "@pixi/canvas-display": "7.3.2", - "@pixi/canvas-extract": "7.3.2", - "@pixi/canvas-graphics": "7.3.2", - "@pixi/canvas-mesh": "7.3.2", - "@pixi/canvas-particle-container": "7.3.2", - "@pixi/canvas-prepare": "7.3.2", - "@pixi/canvas-renderer": "7.3.2", - "@pixi/canvas-sprite": "7.3.2", - "@pixi/canvas-sprite-tiling": "7.3.2", - "@pixi/canvas-text": "7.3.2", - "pixi.js": "7.3.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-display": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-display/-/canvas-display-7.3.2.tgz", - "integrity": "sha512-VqeZ/6kwhzwaDWbdFD532HD9eDYu7h7ny8JfFDxGpdgzfhTVed/4mpYfSD6OmLxGcnnNhAUEc2QfS+hgamTKZg==", - "peerDependencies": { - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-extract": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-extract/-/canvas-extract-7.3.2.tgz", - "integrity": "sha512-d96oQQlNNfeEV4cmN3MJV4vcn0xBVN8WVvTahQTtGqX+0FphLoe5G/4y/l5V3tyOy5OaRZ4l2mXw6RS9wfBcFA==", - "peerDependencies": { - "@pixi/canvas-renderer": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/extract": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-graphics": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-graphics/-/canvas-graphics-7.3.2.tgz", - "integrity": "sha512-r/nPcriocJXqbiieWHpXWGL+5KcQPZGFDkJR28bGDKX6XBv0h7hhY1zX15bKa9zhbGK+MXrahSMYr6I+bLCAow==", - "peerDependencies": { - "@pixi/canvas-display": "7.3.2", - "@pixi/canvas-renderer": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/graphics": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-mesh": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-mesh/-/canvas-mesh-7.3.2.tgz", - "integrity": "sha512-z97rrQS/rZ0bC+laB5Id7LCFl9WBU7UPb6tJflFL6iIBQrtAFmfvfjLfXWEXJk/1AcbN6W61AD6I2EEbBEG2Rw==", - "peerDependencies": { - "@pixi/canvas-display": "7.3.2", - "@pixi/canvas-renderer": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/mesh": "7.3.2", - "@pixi/mesh-extras": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-particle-container": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-particle-container/-/canvas-particle-container-7.3.2.tgz", - "integrity": "sha512-qk7gw8ILrRvl8N6+CkGzrsNp1fBOUmPRxJlb3tfAn9dNOITwKCszysZHoMFNZy1rIpbe6oPgHNZ3/okSSHsw1A==", - "peerDependencies": { - "@pixi/particle-container": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-prepare": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-prepare/-/canvas-prepare-7.3.2.tgz", - "integrity": "sha512-btUzzPv1/tKI/QIzbdA8wMk0W7QXdb5dYntX64UIqh1lU2QAzHlOJmCQ1QzJGKKiuSnxZLPCXo7UGogNENf/5A==", - "peerDependencies": { - "@pixi/canvas-renderer": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/prepare": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-renderer": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-renderer/-/canvas-renderer-7.3.2.tgz", - "integrity": "sha512-LnZefvP8OhAagHQP3NvE03JYiJJkLucHd9Wdx7n7rcR8l2GYWqEPPtxgC7z+ZmWWFXTGXZJwGGRVj/RUPJWKdQ==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-sprite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-sprite/-/canvas-sprite-7.3.2.tgz", - "integrity": "sha512-MwBt9zJHMQONK//cApnMIGl5PO+iHDh8BfqoETUocEPKWLTS0CWeP0Sj05n+014wpqIQfpmpzkBLGiw3C1m2Dw==", - "peerDependencies": { - "@pixi/canvas-display": "7.3.2", - "@pixi/canvas-renderer": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-sprite-tiling": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-sprite-tiling/-/canvas-sprite-tiling-7.3.2.tgz", - "integrity": "sha512-8d1uugMYBkTQ4tfGu4bcuM2E6o7RQmPdX2BwyD1gYcS1lUHx888tV2Fe8hBL4yiEcIY7dzsfoGWvvhRSKTh5oQ==", - "peerDependencies": { - "@pixi/canvas-renderer": "7.3.2", - "@pixi/canvas-sprite": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/sprite-tiling": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/canvas-text": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/canvas-text/-/canvas-text-7.3.2.tgz", - "integrity": "sha512-DI4nu2efdjZq9XciewwkdiMzp7jPhFy/Dhz233nXT5B3KeR/2IOetUIHvam9n12aPmrLhhdVR+NYD8omIm8UXg==", - "peerDependencies": { - "@pixi/canvas-sprite": "7.3.2", - "@pixi/sprite": "7.3.2", - "@pixi/text": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/color": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.3.2.tgz", - "integrity": "sha512-jur5PvdOtUBEUTjmPudW5qdQq6yYGlVGsi3HyhasJw14bN+GKJwiCKgIsyrsiNL5HBUXmje4ICwQohf6BqKqxA==", - "peer": true, - "dependencies": { - "@pixi/colord": "^2.9.6" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/constants": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.3.2.tgz", - "integrity": "sha512-Q8W3ncsFxmfgC5EtokpG92qJZabd+Dl+pbQAdHwiPY3v+8UNq77u4VN2qtl1Z04864hCcg7AStIYEDrzqTLF6Q==", - "peer": true - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/core": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.3.2.tgz", - "integrity": "sha512-Pta3ee8MtJ3yKxGXzglBWgwbEOKMB6Eth+FpLTjL0rgxiqTB550YX6jsNEQQAzcGjCBlO3rC/IF57UZ2go/X6w==", - "peer": true, - "dependencies": { - "@pixi/color": "7.3.2", - "@pixi/constants": "7.3.2", - "@pixi/extensions": "7.3.2", - "@pixi/math": "7.3.2", - "@pixi/runner": "7.3.2", - "@pixi/settings": "7.3.2", - "@pixi/ticker": "7.3.2", - "@pixi/utils": "7.3.2", - "@types/offscreencanvas": "^2019.6.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/display": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.3.2.tgz", - "integrity": "sha512-cY5AnZ3TWt5GYGx4e5AQ2/2U9kP+RorBg/O30amJ+8e9bFk9rS8cjh/DDq/hc4lql96BkXAInTl40eHnAML5lQ==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/extensions": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.3.2.tgz", - "integrity": "sha512-Qw84ADfvmVu4Mwj+zTik/IEEK9lWS5n4trbrpQCcEZ+Mb8oRAXWvKz199mi1s7+LaZXDqeCY1yr2PHQaFf1KBA==", - "peer": true - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/extract": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.3.2.tgz", - "integrity": "sha512-KsoflvQZV/XD8A8xbtRnmI4reYekbI4MOi7ilwQe5tMz6O1mO7IzrSukxkSMD02f6SpbAqbi7a1EayTjvY0ECQ==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/graphics": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.3.2.tgz", - "integrity": "sha512-PhU6j1yub4tH/s+/gqByzgZ3mLv1mfb6iGXbquycg3+WypcxHZn0opFtI/axsazaQ9SEaWxw1m3i40WG5ANH5g==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/math": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.3.2.tgz", - "integrity": "sha512-dutoZ0IVJ5ME7UtYNo2szu4D7qsgtJB7e3ylujBVu7BOP2e710BVtFwFSFV768N14h9H5roGnuzVoDiJac2u+w==", - "peer": true - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/mesh": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.3.2.tgz", - "integrity": "sha512-LFkt7ELYXQLgbgHpjl68j6JD5ejUwma8zoPn2gqSBbY+6pK/phjvV1Wkh76muF46VvNulgXF0+qLIDdCsfrDaA==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/mesh-extras": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.3.2.tgz", - "integrity": "sha512-s/tg9TsTZZxLEdCDKWnBChDGkc041HCTP7ykJv4fEROzb9B0lskULYyvv+/YNNKa2Ugb9WnkMknpOdOXCpjyyg==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/mesh": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/particle-container": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.3.2.tgz", - "integrity": "sha512-JYc4j4z97KmxyLp+1Lg0SNi8hy6RxcBBNQGk+CSLNXeDWxx3hykT5gj/ORX1eXyzHh1ZCG1XzeVS9Yr8QhlFHA==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/prepare": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.3.2.tgz", - "integrity": "sha512-aLPAXSYLUhMwxzJtn9m0TSZe+dQlZCt09QNBqYbSi8LZId54QMDyvfBb4zBOJZrD2xAZgYL5RIJuKHwZtFX6lQ==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/graphics": "7.3.2", - "@pixi/text": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/runner": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.3.2.tgz", - "integrity": "sha512-maKotoKJCQiQGBJwfM+iYdQKjrPN/Tn9+72F4WIf706zp/5vKoxW688Rsktg5BX4Mcn7ZkZvcJYTxj2Mv87lFA==", - "peer": true - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/settings": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.3.2.tgz", - "integrity": "sha512-vtxzuARDTbFe0fRYSqB53B+mPpX7v+QjjnCUmVMVvZiWr3QcngMWVml6c6dQDln7IakWoKZRrNG4FpggvDgLVg==", - "peer": true, - "dependencies": { - "@pixi/constants": "7.3.2", - "@types/css-font-loading-module": "^0.0.7", - "ismobilejs": "^1.1.0" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/sprite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.3.2.tgz", - "integrity": "sha512-IpWTKXExJNXVcY7ITopJ+JW48DahdbCo/81D2IYzBImq3jyiJM2Km5EoJgvAM5ZQ3Ev3KPPIBzYLD+HoPWcxdw==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/sprite-tiling": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.3.2.tgz", - "integrity": "sha512-tWVVb/rMIx5AczfUrVxa0dZaIufP5C0IOL7IGfFUDQqDu5JSAUC0mwLe4F12jAXBVsqYhCGYx5bIHbPiI5vcSQ==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/text": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.3.2.tgz", - "integrity": "sha512-LdtNj+K5tPB/0UcDcO52M/C7xhwFTGFhtdF42fPhRuJawM23M3zm1Y8PapXv+mury+IxCHT1w30YlAi0qTVpKQ==", - "peer": true, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/ticker": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.3.2.tgz", - "integrity": "sha512-5kIPhBeXwDJohCzKzJJ6T7f1oAGbHAgeiwOjlTO+9lNXUX8ZPj0407V3syuF+64kFqJzIBCznBRpI+fmT4c9SA==", - "peer": true, - "dependencies": { - "@pixi/extensions": "7.3.2", - "@pixi/settings": "7.3.2", - "@pixi/utils": "7.3.2" - } - }, - "node_modules/pixi.js-legacy/node_modules/@pixi/utils": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.3.2.tgz", - "integrity": "sha512-KhNvj9YcY7Zi2dTKZgDpx8C6OxKKR541vwtG6JgdBZZYDeMBOIghN2Vi5zn4diW5BhDfHBmdSJ1wZXEtE2MDwg==", - "peer": true, - "dependencies": { - "@pixi/color": "7.3.2", - "@pixi/constants": "7.3.2", - "@pixi/settings": "7.3.2", - "@types/earcut": "^2.1.0", - "earcut": "^2.2.4", - "eventemitter3": "^4.0.0", - "url": "^0.11.0" - } - }, - "node_modules/pixi.js/node_modules/@pixi/accessibility": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.3.2.tgz", - "integrity": "sha512-MdkU22HTauRvq9cMeWZIQGaDDa86sr+m12rKNdLV+FaDQgP/AhP+qCVpK7IKeJa9BrWGXaYMw/vueij7HkyDSA==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/events": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/app": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.3.2.tgz", - "integrity": "sha512-3YRFSMvAxDebAz3/JJv+2jzbPkT8cHC0IHmmLRN8krDL1pZV+YjMLgMwN/Oeyv5TSbwNqnrF5su5whNkRaxeZQ==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/assets": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.3.2.tgz", - "integrity": "sha512-yteq6ptAxA09EcwU9D9hl7qr5yWIqy+c2PsXkTDkc76vTAwIamLY3KxLq2aR5y1U4L4O6aHFJd26uNhHcuTPmw==", - "dependencies": { - "@types/css-font-loading-module": "^0.0.7" - }, - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/utils": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/color": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.3.2.tgz", - "integrity": "sha512-jur5PvdOtUBEUTjmPudW5qdQq6yYGlVGsi3HyhasJw14bN+GKJwiCKgIsyrsiNL5HBUXmje4ICwQohf6BqKqxA==", - "dependencies": { - "@pixi/colord": "^2.9.6" - } - }, - "node_modules/pixi.js/node_modules/@pixi/compressed-textures": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.3.2.tgz", - "integrity": "sha512-J3ENMHDPQO6CJRei55gqI0WmiZJIK6SgsW5AEkShT0aAe5miEBSomv70pXw/58ru+4/Hx8cXjamsGt4aQB2D0Q==", - "peerDependencies": { - "@pixi/assets": "7.3.2", - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/constants": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.3.2.tgz", - "integrity": "sha512-Q8W3ncsFxmfgC5EtokpG92qJZabd+Dl+pbQAdHwiPY3v+8UNq77u4VN2qtl1Z04864hCcg7AStIYEDrzqTLF6Q==" - }, - "node_modules/pixi.js/node_modules/@pixi/core": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.3.2.tgz", - "integrity": "sha512-Pta3ee8MtJ3yKxGXzglBWgwbEOKMB6Eth+FpLTjL0rgxiqTB550YX6jsNEQQAzcGjCBlO3rC/IF57UZ2go/X6w==", - "dependencies": { - "@pixi/color": "7.3.2", - "@pixi/constants": "7.3.2", - "@pixi/extensions": "7.3.2", - "@pixi/math": "7.3.2", - "@pixi/runner": "7.3.2", - "@pixi/settings": "7.3.2", - "@pixi/ticker": "7.3.2", - "@pixi/utils": "7.3.2", - "@types/offscreencanvas": "^2019.6.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/pixi.js/node_modules/@pixi/display": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.3.2.tgz", - "integrity": "sha512-cY5AnZ3TWt5GYGx4e5AQ2/2U9kP+RorBg/O30amJ+8e9bFk9rS8cjh/DDq/hc4lql96BkXAInTl40eHnAML5lQ==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/events": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.3.2.tgz", - "integrity": "sha512-Moca9epu8jk1wIQCdVYjhz2pD9Ol21m50wvWUKvpgt9yM/AjkCLSDt8HO/PmTpavDrkhx5pVVWeDDA6FyUNaGA==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/extensions": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.3.2.tgz", - "integrity": "sha512-Qw84ADfvmVu4Mwj+zTik/IEEK9lWS5n4trbrpQCcEZ+Mb8oRAXWvKz199mi1s7+LaZXDqeCY1yr2PHQaFf1KBA==" - }, - "node_modules/pixi.js/node_modules/@pixi/extract": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.3.2.tgz", - "integrity": "sha512-KsoflvQZV/XD8A8xbtRnmI4reYekbI4MOi7ilwQe5tMz6O1mO7IzrSukxkSMD02f6SpbAqbi7a1EayTjvY0ECQ==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/filter-alpha": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.3.2.tgz", - "integrity": "sha512-nZMdn310wH5ZK1slwv3X4qT8eLoAGO7SgYGCy5IsMtpCtNObzE9XA4tAfhXrjihyzPS9KvszgAbnv1Qpfh0/uw==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/filter-blur": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.3.2.tgz", - "integrity": "sha512-unu3zhwHMhN+iAe7Td2rK40i2UJ2GOhzWK+6jcU3ZkMOsFCT5kgBoMRTejeQVcvCs6GoYK8imbkE7mXt05Vj6A==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/filter-color-matrix": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.3.2.tgz", - "integrity": "sha512-rbyjes/9SMoV9jjPiK0sLMkmLfN8D17GoTJIfq/KLv1x9646W5fL2QSKkN04UkZ+020ndWvIOxK1S97tvRyCfg==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/filter-displacement": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.3.2.tgz", - "integrity": "sha512-ZHl7Sfb8JYd9Z6j96OHCC0NhMKhhXJRE5AbkSDohjEMVCK1BV5rDGAHV8WVt/2MJ/j83CXUpydzyMhdM4lMchg==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/filter-fxaa": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.3.2.tgz", - "integrity": "sha512-9brtlxDnQTZk2XiFBKdBK9e+8CX9LdxxcL7LRpjEyiHuAPvTlQgu9B85LrJ4GzWKqJJKaIIZBzhIoiCLUnfeXg==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/filter-noise": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.3.2.tgz", - "integrity": "sha512-F8GQQ20n7tCjThX6GCXckiXz2YffOCxicTJ0oat9aVDZh+sVsAxYX0aKSdHh0hhv18F0yuc6tPsSL5DYb63xFg==", - "peerDependencies": { - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/graphics": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.3.2.tgz", - "integrity": "sha512-PhU6j1yub4tH/s+/gqByzgZ3mLv1mfb6iGXbquycg3+WypcxHZn0opFtI/axsazaQ9SEaWxw1m3i40WG5ANH5g==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/math": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.3.2.tgz", - "integrity": "sha512-dutoZ0IVJ5ME7UtYNo2szu4D7qsgtJB7e3ylujBVu7BOP2e710BVtFwFSFV768N14h9H5roGnuzVoDiJac2u+w==" - }, - "node_modules/pixi.js/node_modules/@pixi/mesh": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.3.2.tgz", - "integrity": "sha512-LFkt7ELYXQLgbgHpjl68j6JD5ejUwma8zoPn2gqSBbY+6pK/phjvV1Wkh76muF46VvNulgXF0+qLIDdCsfrDaA==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/mesh-extras": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.3.2.tgz", - "integrity": "sha512-s/tg9TsTZZxLEdCDKWnBChDGkc041HCTP7ykJv4fEROzb9B0lskULYyvv+/YNNKa2Ugb9WnkMknpOdOXCpjyyg==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/mesh": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/mixin-cache-as-bitmap": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.3.2.tgz", - "integrity": "sha512-bZRlyUN5+9kCUjn67V0IFtYIrbmx9Vs4sMOmXyrX3Q4B4gPLE46IzZz3v0IVaTjp32udlQztfJalIaWbuqgb3A==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/mixin-get-child-by-name": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.3.2.tgz", - "integrity": "sha512-mbUi3WxXrkViH7qOgjk4fu2BN36NwNb7u+Fy1J5dS8Bntj57ZVKmEV9PbUy0zYjXE8rVmeAvSu/2kbn5n9UutQ==", - "peerDependencies": { - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/mixin-get-global-position": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.3.2.tgz", - "integrity": "sha512-1nhWbBgmw6rK7yQJxzeI9yjKYYEkM5i3pee8qVu4YWo3b1xWVQA7osQG7aGM/4qywDkXaA1ZvciA5hfg6f4Q5Q==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/particle-container": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.3.2.tgz", - "integrity": "sha512-JYc4j4z97KmxyLp+1Lg0SNi8hy6RxcBBNQGk+CSLNXeDWxx3hykT5gj/ORX1eXyzHh1ZCG1XzeVS9Yr8QhlFHA==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/prepare": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.3.2.tgz", - "integrity": "sha512-aLPAXSYLUhMwxzJtn9m0TSZe+dQlZCt09QNBqYbSi8LZId54QMDyvfBb4zBOJZrD2xAZgYL5RIJuKHwZtFX6lQ==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/graphics": "7.3.2", - "@pixi/text": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/runner": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.3.2.tgz", - "integrity": "sha512-maKotoKJCQiQGBJwfM+iYdQKjrPN/Tn9+72F4WIf706zp/5vKoxW688Rsktg5BX4Mcn7ZkZvcJYTxj2Mv87lFA==" - }, - "node_modules/pixi.js/node_modules/@pixi/settings": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.3.2.tgz", - "integrity": "sha512-vtxzuARDTbFe0fRYSqB53B+mPpX7v+QjjnCUmVMVvZiWr3QcngMWVml6c6dQDln7IakWoKZRrNG4FpggvDgLVg==", - "dependencies": { - "@pixi/constants": "7.3.2", - "@types/css-font-loading-module": "^0.0.7", - "ismobilejs": "^1.1.0" - } - }, - "node_modules/pixi.js/node_modules/@pixi/sprite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.3.2.tgz", - "integrity": "sha512-IpWTKXExJNXVcY7ITopJ+JW48DahdbCo/81D2IYzBImq3jyiJM2Km5EoJgvAM5ZQ3Ev3KPPIBzYLD+HoPWcxdw==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/sprite-animated": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.3.2.tgz", - "integrity": "sha512-j9pyUe4cefxE9wecNfbWQyL5fBQKvCGYaOA0DE1X46ukBHrIuhA8u3jg2X3N3r4IcbVvxpWFYDrDsWXWeiBmSw==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/sprite-tiling": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.3.2.tgz", - "integrity": "sha512-tWVVb/rMIx5AczfUrVxa0dZaIufP5C0IOL7IGfFUDQqDu5JSAUC0mwLe4F12jAXBVsqYhCGYx5bIHbPiI5vcSQ==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/spritesheet": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.3.2.tgz", - "integrity": "sha512-UkwqrPYDqrEdK5ub9qn/9VBvt5caA8ffV5iYR6ssCvrpaQovBKmS+b5pr/BYf8xNTExDpR3OmPIo8iDEYWWLuw==", - "peerDependencies": { - "@pixi/assets": "7.3.2", - "@pixi/core": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/text": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.3.2.tgz", - "integrity": "sha512-LdtNj+K5tPB/0UcDcO52M/C7xhwFTGFhtdF42fPhRuJawM23M3zm1Y8PapXv+mury+IxCHT1w30YlAi0qTVpKQ==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/sprite": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/text-bitmap": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.3.2.tgz", - "integrity": "sha512-p8KLgtZSPowWU/Zj+GVtfsUT8uGYo4TtKKYbLoWuxkRA5Pc1+4C9/rV/EOSFfoZIdW5C+iFg5VxRgBllUQf+aA==", - "peerDependencies": { - "@pixi/assets": "7.3.2", - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/mesh": "7.3.2", - "@pixi/text": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/text-html": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/text-html/-/text-html-7.3.2.tgz", - "integrity": "sha512-IYhBWEPOvqUtlHkS5/c1Hseuricj5jrrGd21ivcvHmcnK/x2m+CRGvvzeBp1mqoYBnDbQVrD2wSXSe4Dv9tEJA==", - "peerDependencies": { - "@pixi/core": "7.3.2", - "@pixi/display": "7.3.2", - "@pixi/sprite": "7.3.2", - "@pixi/text": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/ticker": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.3.2.tgz", - "integrity": "sha512-5kIPhBeXwDJohCzKzJJ6T7f1oAGbHAgeiwOjlTO+9lNXUX8ZPj0407V3syuF+64kFqJzIBCznBRpI+fmT4c9SA==", - "dependencies": { - "@pixi/extensions": "7.3.2", - "@pixi/settings": "7.3.2", - "@pixi/utils": "7.3.2" - } - }, - "node_modules/pixi.js/node_modules/@pixi/utils": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.3.2.tgz", - "integrity": "sha512-KhNvj9YcY7Zi2dTKZgDpx8C6OxKKR541vwtG6JgdBZZYDeMBOIghN2Vi5zn4diW5BhDfHBmdSJ1wZXEtE2MDwg==", - "dependencies": { - "@pixi/color": "7.3.2", - "@pixi/constants": "7.3.2", - "@pixi/settings": "7.3.2", - "@types/earcut": "^2.1.0", - "earcut": "^2.2.4", - "eventemitter3": "^4.0.0", - "url": "^0.11.0" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/plist/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/png2icons": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/png2icons/-/png2icons-2.0.1.tgz", - "integrity": "sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA==", - "bin": { - "png2icons": "png2icons-cli.js" - } - }, - "node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "optional": true - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "engines": { - "node": ">=8" - } - }, - "node_modules/r-json": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.2.10.tgz", - "integrity": "sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==" - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rcedit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz", - "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==", - "dependencies": { - "cross-spawn-windows-exe": "^1.1.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/replace": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", - "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", - "dependencies": { - "chalk": "2.4.2", - "minimatch": "3.0.5", - "yargs": "^15.3.1" - }, - "bin": { - "replace": "bin/replace.js", - "search": "bin/search.js" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/replace/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/replace/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/replace/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/replace/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/replace/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/replace/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/replace/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/replace/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/replace/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/replace/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/replace/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/replace/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/replace/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/replace/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/resedit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.0.tgz", - "integrity": "sha512-vrrJCabKxAW4MT1QivtAAb0poGp8KT2qhnSzfN9tFIxb2rQu1hRHNn1VgGSZR7nmxGaW5Yz0YeW1bjgvRfNoKA==", - "dependencies": { - "pe-library": "^1.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=7" - } + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, - "node_modules/resedit-cli": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resedit-cli/-/resedit-cli-2.0.0.tgz", - "integrity": "sha512-LLFFXZHs2r+EqhcUyBXq5j28baBjfvI84Is3+X1+v+pIhtWFU+qoOhDzN4os2c9TBEB7KktG6bS3B9i/rpRGtQ==", - "dependencies": { - "cosmiconfig": "^8.1.0", - "loglevel": "^1.8.1", - "node-forge": "^1.3.1", - "pe-library": "^1.0.0", - "resedit": "^2.0.0", - "yargs": "^17.7.1" - }, - "bin": { - "resedit": "dist/cli.js" - }, - "engines": { - "node": ">=14", - "npm": ">=7" - } + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" - } + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node": ">= 0.6.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "optional": true, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" + "semver": "^6.0.0" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/roarr/node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "optional": true - }, - "node_modules/rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "engines": { - "node": "0.12.* || 4.* || 6.* || >= 7.*" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==" - }, - "node_modules/seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dependencies": { - "commander": "^2.8.1" + "node": ">=8" }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "optional": true + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "engines": { - "node": ">=8" + "node": ">= 6.13.0" } }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", "bin": { - "semver": "bin/semver.js" + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "wrappy": "1" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", - "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", - "funding": [ - "https://github.com/sponsors/jonschlinkert", - "https://paypal.me/jonathanschlinkert", - "https://jonschlinkert.dev/sponsor" - ], + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dependencies": { - "is-plain-object": "^2.0.4", - "is-primitive": "^3.0.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">=11.0" + "node": ">=6" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { - "shebang-regex": "^3.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" - }, - "node_modules/simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "dependencies": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" + "node": ">=0.10.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, + "node_modules/pe-library": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", + "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==", "engines": { - "node": ">=10" + "node": ">=14", + "npm": ">=7" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/jet2jet" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">=8" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "node_modules/png2icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/png2icons/-/png2icons-2.0.1.tgz", + "integrity": "sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA==", + "bin": { + "png2icons": "png2icons-cli.js" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/r-json": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.3.0.tgz", + "integrity": "sha512-xesd+RHCpymPCYd9DvDvUr1w1IieSChkqYF1EpuAYrvCfLXji9NP36DvyYZJZZB5soVDvZ0WUtBoZaU1g5Yt9A==", "dependencies": { - "readable-stream": "^3.0.0" + "w-json": "1.3.10" } }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8319,259 +1647,200 @@ "node": ">= 6" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.codepointat": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", - "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.10.0" } }, - "node_modules/string.prototype.trimend/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trimstart/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "node_modules/resedit": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.2.tgz", + "integrity": "sha512-UKTnq602iVe+W5SyRAQx/WdWMnlDiONfXBLFg/ur4QE4EQQ8eP7Jgm5mNXdK12kKawk1vvXPja2iXKqZiGDW6Q==", "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "pe-library": "^1.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14", + "npm": ">=7" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringz": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", - "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", - "dependencies": { - "char-regex": "^1.0.2" + "type": "github", + "url": "https://github.com/sponsors/jet2jet" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/resedit-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resedit-cli/-/resedit-cli-2.0.0.tgz", + "integrity": "sha512-LLFFXZHs2r+EqhcUyBXq5j28baBjfvI84Is3+X1+v+pIhtWFU+qoOhDzN4os2c9TBEB7KktG6bS3B9i/rpRGtQ==", "dependencies": { - "ansi-regex": "^5.0.1" + "cosmiconfig": "^8.1.0", + "loglevel": "^1.8.1", + "node-forge": "^1.3.1", + "pe-library": "^1.0.0", + "resedit": "^2.0.0", + "yargs": "^17.7.1" + }, + "bin": { + "resedit": "dist/cli.js" }, "engines": { - "node": ">=8" + "node": ">=14", + "npm": ">=7" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { "node": ">=4" } }, - "node_modules/strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dependencies": { - "is-natural-number": "^4.0.1" + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/set-value": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", + "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", + "funding": [ + "https://github.com/sponsors/jonschlinkert", + "https://paypal.me/jonathanschlinkert", + "https://jonschlinkert.dev/sponsor" + ], "dependencies": { - "min-indent": "^1.0.0" + "is-plain-object": "^2.0.4", + "is-primitive": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=11.0" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/sucrase": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.25.0.tgz", - "integrity": "sha512-WxTtwEYXSmZArPGStGBicyRsg5TBEFhT5b7N+tF+zauImP0Acy+CoUK0/byJ8JNPK/5lbpWIVuFagI4+0l85QQ==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "debug": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 8.0" + "node": ">=8" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "is-natural-number": "^4.0.1" } }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, "node_modules/tar-stream": { @@ -8589,19 +1858,6 @@ "node": ">=6" } }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tcp-port-used": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", @@ -8611,163 +1867,16 @@ "is2": "^2.0.6" } }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8779,195 +1888,19 @@ "node": ">=8.0" } }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/ttf2woff": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-2.0.2.tgz", - "integrity": "sha512-X68badwBjAy/+itU49scLjXUL094up+rHuYk+YAOTTBYSUMOmLZ7VyhZJuqQESj1gnyLAC2/5V8Euv+mExmyPA==", - "dependencies": { - "argparse": "^1.0.6", - "microbuffer": "^1.0.0", - "pako": "^1.0.0" - }, - "bin": { - "ttf2woff": "ttf2woff.js" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "optional": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dependencies": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -8977,10 +1910,11 @@ "through": "^2.3.8" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "optional": true }, "node_modules/unique-string": { "version": "2.0.0", @@ -8994,142 +1928,13 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dependencies": { - "prepend-http": "^2.0.0" - }, + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=4" + "node": ">= 10.0.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -9142,59 +1947,24 @@ "node": ">=6.14.2" } }, - "node_modules/util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/w-json": { "version": "1.3.10", "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, "node_modules/websocket": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", @@ -9224,101 +1994,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/which-typed-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", - "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "es-abstract": "^1.17.5", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9335,40 +2010,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -9381,18 +2026,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/xcode": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", - "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", - "dependencies": { - "simple-plist": "^1.1.0", - "uuid": "^7.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -9401,58 +2034,6 @@ "node": ">=8" } }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xml-js/node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xpath": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", - "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9477,11 +2058,6 @@ "node": ">=0.10.32" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -9500,31 +2076,6 @@ } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", @@ -9535,44 +2086,23 @@ "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/zip-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz", - "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-3.0.1.tgz", + "integrity": "sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ==", "dependencies": { "archiver-utils": "^2.1.0", - "compress-commons": "^2.1.1", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "compress-commons": "^3.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 6" + "node": ">= 8" } } } diff --git a/app/package.json b/app/package.json index 719d1d932..26b34f2ac 100644 --- a/app/package.json +++ b/app/package.json @@ -2,7 +2,7 @@ "main": "index.html", "name": "ctjs", "description": "ct.js — a free 2D game engine", - "version": "4.0.2", + "version": "5.0.0", "homepage": "https://ctjs.rocks/", "author": { "name": "Cosmo Myzrail Gorynych", @@ -50,45 +50,10 @@ "webkit": { "plugin": false }, - "chromium-args": "--mixed-context --enable-features=nw2 --load-extensions --force-color-profile=srgb --disable-features=ColorCorrectRendering", + "chromium-args": "--enable-features=nw2 --load-extensions --force-color-profile=srgb --disable-features=ColorCorrectRendering", "dependencies": { - "@capacitor/cli": "^5.5.0", - "@capacitor/core": "^5.5.0", - "@neutralinojs/neu": "^10.1.0", - "@pixi/particle-emitter": "5.0.8", - "@pixi/sound": "^5.2.2", - "@trapezedev/project": "^7.0.10", - "archiver": "^3.1.1", - "coffeescript": "^2.7.0", - "csswring": "7.0.0", - "dragonbones-tools": "^0.1.2", - "electron-packager": "^16.0.0", - "execa": "^5.1.1", - "extract-zip": "^2.0.1", - "fs-extra": "^10.1.0", - "fuse.js": "^3.6.1", - "highlight.js": "^10.4.1", - "html-minifier": "^3.5.21", - "html2pug": "^4.0.0", - "is-expression": "^4.0.0", - "javascript-obfuscator": "^4.0.2", - "js-yaml": "^3.14.0", - "markdown-it": "12.3.2", - "maxrects-packer": "^2.7.3", - "microm": "^0.2.4", - "monaco-editor": "^0.34.0", - "monaco-themes": "^0.4.2", - "nanoid": "^3.1.31", - "on-change": "^4.0.2", - "opentype.js": "^1.3.3", - "pixi-ease": "^3.0.7", - "pixi.js": "7.3.2", - "pixi.js-legacy": "7.3.2", + "@neutralinojs/neu": "^11.0.1", "png2icons": "^2.0.1", - "resedit-cli": "^2.0.0", - "serve-handler": "^6.1.5", - "sucrase": "^3.25.0", - "terser": "^5.14.2", - "ttf2woff": "^2.0.2" + "resedit-cli": "^2.0.0" } } diff --git a/app/projects/.gitkeep b/app/projects/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/branding/catnipLogo.blend b/branding/catnipLogo.blend new file mode 100644 index 000000000..950b7034c Binary files /dev/null and b/branding/catnipLogo.blend differ diff --git a/builtinModules.json b/builtinModules.json new file mode 100644 index 000000000..a3c5a27b4 --- /dev/null +++ b/builtinModules.json @@ -0,0 +1,55 @@ +[ + "assert", + "assert/strict", + "async_hooks", + "buffer", + "child_process", + "cluster", + "console", + "constants", + "crypto", + "dgram", + "diagnostics_channel", + "dns", + "dns/promises", + "domain", + "events", + "fs", + "fs/promises", + "http", + "http2", + "https", + "inspector", + "inspector/promises", + "module", + "net", + "os", + "path", + "path/posix", + "path/win32", + "perf_hooks", + "process", + "punycode", + "querystring", + "readline", + "readline/promises", + "repl", + "stream", + "stream/consumers", + "stream/promises", + "stream/web", + "string_decoder", + "timers", + "timers/promises", + "tls", + "trace_events", + "tty", + "url", + "util", + "util/types", + "v8", + "vm", + "wasi", + "worker_threads", + "zlib" +] diff --git a/bundledAssets b/bundledAssets index 286066bb4..9aedca8ad 160000 --- a/bundledAssets +++ b/bundledAssets @@ -1 +1 @@ -Subproject commit 286066bb43260496852a3ce6ad61d9cc5c9f0f8d +Subproject commit 9aedca8ad8903e2df4e99f4b7b40a5c7df6c3d9e diff --git a/devSetup.gulpfile.js b/devSetup.gulpfile.js index 23c1f7f3d..5beba9d03 100644 --- a/devSetup.gulpfile.js +++ b/devSetup.gulpfile.js @@ -25,7 +25,8 @@ const cleanup = () => { const npmInstall = path => done => { console.log(`Running 'npm install' for ${path}…`); spawnise.spawn((/^win/).test(process.platform) ? 'npm.cmd' : 'npm', ['install'], { - cwd: path || './' + cwd: path || './', + shell: true }) .then(done) .catch(err => { @@ -38,7 +39,8 @@ const bakeDocs = async () => { const npm = (/^win/).test(process.platform) ? 'npm.cmd' : 'npm'; await fs.remove('./app/data/docs/'); await spawnise.spawn(npm, ['run', 'build'], { - cwd: './docs' + cwd: './docs', + shell: true }); await fs.copy('./docs/docs/.vuepress/dist', './app/data/docs/'); }; diff --git a/docs b/docs index 977188ba1..296e50170 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 977188ba163fc2793b06243d76620178b292eae3 +Subproject commit 296e50170da1a5ebe5ae053fc71192938653064e diff --git a/gulpfile.mjs b/gulpfile.mjs index 2bb336ed3..d9e94db36 100644 --- a/gulpfile.mjs +++ b/gulpfile.mjs @@ -6,6 +6,7 @@ import versions from './versions.js'; /* eslint no-console: 0 */ import path from 'path'; import gulp from 'gulp'; +import log from 'gulplog'; import concat from 'gulp-concat'; import sourcemaps from 'gulp-sourcemaps'; import minimist from 'minimist'; @@ -18,7 +19,7 @@ import sprite from 'gulp-svgstore'; import zip from 'gulp-zip'; import stylelint from 'stylelint'; -import eslint from 'gulp-eslint'; +import eslint from 'gulp-eslint-new'; import streamQueue from 'streamqueue'; import replaceExt from 'gulp-ext-replace'; @@ -29,8 +30,7 @@ import spawnise from './node_requires/spawnise/index.js'; import execute from './node_requires/execute.js'; import i18n from './node_requires/i18n/index.js'; -import nwBuilderArm from './node_modules/nw-builder-arm/lib/index.cjs'; -import nwBuilder from './node_modules/nw-builder/lib/index.cjs'; +import nwBuilder from 'nw-builder'; import resedit from 'resedit-cli'; import {$} from 'execa'; @@ -54,13 +54,32 @@ import {$} from 'execa'; * * Also note that you may need to clear the `ct-js/cache` folder. */ -const nwVersion = versions.nwjs, - nwArmVersion = versions.nwjsArm, - platforms = ['linux32', 'linux64', 'osx64', 'osxarm', 'win32', 'win64'], - nwFiles = ['./app/**', '!./app/export/**', '!./app/projects/**', '!./app/exportDesktop/**', '!./app/cache/**', '!./app/.vscode/**', '!./app/JamGames/**']; +const nwVersion = versions.nwjs; +/** + * Array of tuples with platform — arch — itch.io channel name in each element. + * Note how win32 platform is written as just 'win' (that's how nw.js binaries are released). + */ +let platforms = [ + ['linux', 'ia32', 'linux32'], + ['linux', 'x64', 'linux64'], + ['osx', 'x64', 'osx64'], + // ['osx', 'arm64', 'osxarm'], + ['win', 'ia32', 'win32'], + ['win', 'x64', 'win64'] +]; +if (process.platform === 'win32') { + platforms = platforms.filter(p => p[0] !== 'osx'); + log.warn('⚠️ Building packages for MacOS is not supported on Windows. This platform will be skipped.'); +} +const nwBuilderOptions = { + version: nwVersion, + flavor: 'sdk', + srcDir: './app/', + glob: false +}; const argv = minimist(process.argv.slice(2)); -const npm = (/^win/).test(process.platform) ? 'npm.cmd' : 'npm'; +const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; const pack = fs.readJsonSync('./app/package.json'); @@ -133,8 +152,8 @@ const compilePug = () => pretty: false })) .on('error', err => { - notifier.notify(makeErrorObj('Pug failure', err)); console.error('[pug error]', err); + notifier.notify(makeErrorObj('Pug failure', err)); }) .pipe(sourcemaps.write()) .pipe(gulp.dest('./app/')); @@ -147,30 +166,26 @@ const compileRiot = () => gulp.src('./src/riotTags/**/*.tag') .pipe(riot(riotSettings)) .pipe(concat('riotTags.js')) - .pipe(gulp.dest('./app/data/')); - -const compileRiotPartial = path => { - console.log(`Updating tag at ${path}…`); - return gulp.src(path) - .pipe(riot(riotSettings)) - .pipe(gulp.dest('./app/data/hotLoadTags/')); -}; + .pipe(gulp.dest('./temp/')); const concatScripts = () => streamQueue( { objectMode: true }, - gulp.src('./src/js/3rdparty/riot.min.js'), - gulp.src(['./src/js/**', '!./src/js/3rdparty/riot.min.js']) + // PIXI.js is used as window.PIXI + gulp.src('./src/js/exposeGlobalNodeModules.js'), + gulp.src('./temp/riotTags.js'), + gulp.src(['./src/js/**', '!./src/js/exposeGlobalNodeModules.js']) ) .pipe(sourcemaps.init({ largeFile: true })) .pipe(concat('bundle.js')) .pipe(sourcemaps.write()) - .pipe(gulp.dest('./app/data/')) + .pipe(gulp.dest('./temp/')) .on('error', err => { + console.error('[scripts error]', err); notifier.notify({ title: 'Scripts error', message: err.toString(), @@ -178,32 +193,69 @@ const concatScripts = () => sound: true, wait: true }); - console.error('[scripts error]', err); }) .on('change', fileChangeNotifier); -const copyRequires = () => - gulp.src([ - './src/node_requires/**/*', - '!./src/node_requires/**/*.ts' - ]) - .pipe(sourcemaps.init()) - // ¯\_(ツ)_/¯ - .pipe(sourcemaps.mapSources((sourcePath) => '../../src/' + sourcePath)) - .pipe(sourcemaps.write()) - .pipe(gulp.dest('./app/data/node_requires')); -const tsProject = gulpTs.createProject('tsconfig.json'); +const workerEntryPoints = [ + 'vs/language/json/json.worker.js', + 'vs/language/css/css.worker.js', + 'vs/language/html/html.worker.js', + 'vs/language/typescript/ts.worker.js', + 'vs/editor/editor.worker.js' +]; +/** + * Bundles language workers and the editor's worker for monaco-editor. + * It is needed to be packaged this way to actually work with worker threads. + * The workers are then linked in src/js/3rdParty/mountMonaco.js + * @see https://github.com/microsoft/monaco-editor/blob/b400f83fe3ac6a1780b7eed419dc4d83dbf32919/samples/browser-esm-esbuild/build.js + */ +const bundleMonacoWorkers = () => esbuild({ + entryPoints: workerEntryPoints.map((entry) => `node_modules/monaco-editor/esm/${entry}`), + bundle: true, + format: 'iife', + outbase: 'node_modules/monaco-editor/esm/', + outdir: './app/data/monaco-workers/' +}); -const processRequiresTS = () => - gulp.src('./src/node_requires/**/*.ts') - .pipe(sourcemaps.init()) - .pipe(tsProject()) - .pipe(sourcemaps.write()) - .pipe(gulp.dest('./app/data/node_requires')); -const processRequires = gulp.series(copyRequires, processRequiresTS); +const builtinModules = JSON.parse(fs.readFileSync('./builtinModules.json')); +builtinModules.push(...builtinModules.map(m => `node:${m}`)); +/** + * Bundles all the JS scripts into a single bundle.js file. + * This file is then loaded with a regular diff --git a/src/ct.release/index.pixi.ts b/src/ct.release/index.pixi.ts index a7a0abdc0..bb3c41133 100644 --- a/src/ct.release/index.pixi.ts +++ b/src/ct.release/index.pixi.ts @@ -1,6 +1,6 @@ -import * as pixi from 'node_modules/pixi.js'; -import * as particles from 'node_modules/@pixi/particle-emitter'; -import {sound as pixiSound, filters as pixiSoundFilters} from 'node_modules/@pixi/sound'; +import * as pixi from 'pixi.js'; +import * as particles from '@pixi/particle-emitter'; +import {sound as pixiSound, filters as pixiSoundFilters} from '@pixi/sound'; /* eslint-disable @typescript-eslint/no-explicit-any */ export const PIXI = pixi; diff --git a/src/ct.release/index.ts b/src/ct.release/index.ts index c6fb7c196..3ce4570dd 100644 --- a/src/ct.release/index.ts +++ b/src/ct.release/index.ts @@ -1,6 +1,6 @@ /// -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; /*! Made with ct.js http://ctjs.rocks/ */ @@ -21,12 +21,13 @@ import tilemapsM, {Tilemap} from './tilemaps'; import timerM from './timer'; import {scriptsLib as scriptsM} from './scripts'; import uM from './u'; +import {mount as mountErrorListener} from './errors'; import type {ExportedMeta, viewMode} from '../node_requires/exporter/_exporterContracts'; // eslint-disable-next-line no-console console.log( - '%c 😺 %c ct.js game editor %c v/*!@ctversion@*/ %c https://ctjs.rocks/ ', + '%c 😺 %c ct.js game engine %c v/*!@ctversion@*/ %c https://ctjs.rocks/ ', 'background: #446adb; color: #fff; padding: 0.5em 0;', 'background: #5144db; color: #fff; padding: 0.5em 0;', 'background: #446adb; color: #fff; padding: 0.5em 0;', @@ -61,6 +62,11 @@ if ('NL_OS' in window) { */ export const deadPool: pixiMod.DisplayObject[] = []; export const copyTypeSymbol = Symbol('I am a ct.js copy'); +/** + * A set of copies that must be destroyed + * in addition to being removed from stack when a main room changes. + */ +export const forceDestroy = new Set(); setInterval(function cleanDeadPool() { deadPool.length = 0; }, 1000 * 60); @@ -165,7 +171,7 @@ export let pixiApp: pixiMod.Application; console.error(e); // eslint-disable-next-line no-console console.warn('[ct.js] Something bad has just happened. This is usually due to hardware problems. I\'ll try to fix them now, but if the game still doesn\'t run, try including a legacy renderer in the project\'s settings.'); - PIXI.settings.SPRITE_MAX_TEXTURES = Math.min(PIXI.settings.SPRITE_MAX_TEXTURES, 16); + PIXI.settings.SPRITE_MAX_TEXTURES = Math.min(PIXI.settings.SPRITE_MAX_TEXTURES || 16, 16); pixiApp = new PIXI.Application(pixiAppSettings); } // eslint-disable-next-line prefer-destructuring @@ -175,7 +181,7 @@ export let pixiApp: pixiMod.Application; } settings.targetFps = [/*!@maxfps@*/][0] || 60; // eslint-disable-next-line prefer-destructuring - document.getElementById('ct').appendChild(pixiApp.view as HTMLCanvasElement); + (document.getElementById('ct') as HTMLDivElement).appendChild(pixiApp.view as HTMLCanvasElement); } let loading: Promise; @@ -186,9 +192,11 @@ let loading: Promise; templatesM.onDestroy.apply(copy); (copy as BasicCopy).onDestroy.apply(copy); } - for (const child of copy.children) { - if (templatesM.isCopy(child)) { - killRecursive(child as (BasicCopy & pixiMod.DisplayObject)); // bruh + if (copy.children) { + for (const child of copy.children) { + if (templatesM.isCopy(child)) { + killRecursive(child as (BasicCopy & pixiMod.DisplayObject)); // bruh + } } } const stackIndex = stack.indexOf(copy); @@ -196,12 +204,17 @@ let loading: Promise; stack.splice(stackIndex, 1); } if (templatesM.isCopy(copy) && (copy as BasicCopy).template) { - const templatelistIndex = templatesM - .list[(copy as BasicCopy & pixiMod.DisplayObject).template] - .indexOf((copy as BasicCopy & pixiMod.DisplayObject)); - if (templatelistIndex !== -1) { - templatesM.list[(copy as BasicCopy & pixiMod.DisplayObject).template] - .splice(templatelistIndex, 1); + if ((copy as BasicCopy).template) { + const {template} = (copy as BasicCopy); + if (template) { + const templatelistIndex = templatesM + .list[template] + .indexOf((copy as BasicCopy)); + if (templatelistIndex !== -1) { + templatesM.list[template] + .splice(templatelistIndex, 1); + } + } } } deadPool.push(copy); @@ -288,6 +301,9 @@ let loading: Promise; // eslint-disable-next-line @typescript-eslint/no-explicit-any (window as any).PIXI = PIXI; +mountErrorListener(); + +/*!@globalVars@*/ { const actions = actionsM; diff --git a/src/ct.release/res.ts b/src/ct.release/res.ts index 1a1254c5a..2cbbbc941 100644 --- a/src/ct.release/res.ts +++ b/src/ct.release/res.ts @@ -1,12 +1,12 @@ import {required, default as uLib} from './u'; import type {TextureShape, ExportedTiledTexture, ExportedFolder, ExportedAsset} from '../node_requires/exporter/_exporterContracts'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import type {sound as pixiSound, Sound} from 'node_modules/@pixi/sound'; +import type {sound as pixiSound, Sound, Options as SoundOptions} from 'node_modules/@pixi/sound'; import {pixiSoundPrefix, exportedSounds, soundMap, pixiSoundInstances} from './sounds.js'; type AssetType = 'template' | 'room' | 'sound' | 'style' | 'texture' | 'tandem' | 'font' | 'behavior' | 'script'; -import * as pixiMod from 'node_modules/pixi.js'; +import * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod & { sound: typeof pixiSound }; @@ -118,8 +118,8 @@ const resLib = { const ctTexture = [texture] as CtjsAnimation; ctTexture.shape = texture.shape = textureOptions.shape || ({} as TextureShape); texture.defaultAnchor = ctTexture.defaultAnchor = new PIXI.Point( - textureOptions.anchor.x || 0, - textureOptions.anchor.x || 0 + textureOptions.anchor ? textureOptions.anchor.x : 0, + textureOptions.anchor ? textureOptions.anchor.y : 0 ); const hitArea = uLib.getHitArea(texture.shape); if (hitArea) { @@ -139,7 +139,7 @@ const resLib = { const sheet = await PIXI.Assets.load(url); for (const animation in sheet.animations) { const tex = sheet.animations[animation]; - const animData = sheet.data.animations; + const animData = sheet.data.animations as pixiMod.utils.Dict; for (let i = 0, l = animData[animation].length; i < l; i++) { const a = animData[animation], f = a[i]; @@ -202,20 +202,21 @@ const resLib = { preload = true ): Promise { return new Promise((resolve, reject) => { - const asset = PIXI.sound.add(name, { + const opts: SoundOptions = { url: path, - preload, - loaded: preload ? - (err) => { - if (err) { - reject(err); - } else { - resLib.pixiSounds[name] = asset; - resolve(name); - } - } : - void 0 - }); + preload + }; + if (preload) { + opts.loaded = (err) => { + if (err) { + reject(err); + } else { + resLib.pixiSounds[name] = asset; + resolve(name); + } + }; + } + const asset = PIXI.sound.add(name, opts); if (!preload) { resolve(name); } @@ -281,6 +282,7 @@ const resLib = { * Gets a pixi.js texture from a ct.js' texture name, * so that it can be used in pixi.js objects. * @param name The name of the ct.js texture, or -1 for an empty texture + * @catnipAsset name:texture * @param [frame] The frame to extract * @returns {PIXI.Texture|PIXI.Texture[]} If `frame` was specified, * returns a single PIXI.Texture. Otherwise, returns an array @@ -317,6 +319,7 @@ const resLib = { /** * Returns the collision shape of the given texture. * @param name The name of the ct.js texture, or -1 for an empty collision shape + * @catnipAsset name:texture */ getTextureShape(name: string | -1): TextureShape { if (name === -1) { @@ -331,6 +334,7 @@ const resLib = { }, /** * Gets direct children of a folder + * @catnipIcon folder */ getChildren(path?: string): ExportedAsset[] { return getEntriesByPath(normalizeAssetPath(path || '')) @@ -338,6 +342,7 @@ const resLib = { }, /** * Gets direct children of a folder, filtered by asset type + * @catnipIcon folder */ getOfType(type: AssetType | 'folder', path?: string): (ExportedAsset | ExportedFolder)[] { return getEntriesByPath(normalizeAssetPath(path || '')) @@ -345,10 +350,11 @@ const resLib = { }, /** * Gets all the assets inside of a folder, including in subfolders. + * @catnipIcon folder */ getAll(path?: string): ExportedAsset[] { const folderEntries = getEntriesByPath(normalizeAssetPath(path || '')), - entries = []; + entries: ExportedAsset[] = []; const walker = (currentList: (ExportedFolder | ExportedAsset)[]) => { for (const entry of currentList) { if (entry.type === 'folder') { @@ -363,10 +369,11 @@ const resLib = { }, /** * Get all the assets inside of a folder, including in subfolders, filtered by type. + * @catnipIcon folder */ getAllOfType(type: AssetType | 'folder', path?: string): (ExportedAsset | ExportedFolder)[] { const folderEntries = getEntriesByPath(normalizeAssetPath(path || '')), - entries = []; + entries: (ExportedAsset | ExportedFolder)[] = []; const walker = (currentList: (ExportedFolder | ExportedAsset)[]) => { for (const entry of currentList) { if (entry.type === 'folder') { diff --git a/src/ct.release/rooms.ts b/src/ct.release/rooms.ts index 87ad94c78..567cdbfb6 100644 --- a/src/ct.release/rooms.ts +++ b/src/ct.release/rooms.ts @@ -3,12 +3,12 @@ import backgrounds, {Background} from './backgrounds'; import templatesLib, {BasicCopy} from './templates'; import {Tilemap} from './tilemaps'; import mainCamera from './camera'; -import {copyTypeSymbol, deadPool, pixiApp, stack} from '.'; +import {copyTypeSymbol, deadPool, pixiApp, stack, forceDestroy} from '.'; import {ExportedRoom} from './../node_requires/exporter/_exporterContracts'; import {updateViewport} from 'fittoscreen'; import {runBehaviors} from './behaviors'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; type RoomMergeResult = { @@ -33,7 +33,7 @@ export class Room extends PIXI.Container { * for more info on UI layers. */ isUi: boolean; - alignElements: BasicCopy[] = []; + alignElements: (BasicCopy | (pixiMod.Sprite & {align: ExportedRoom['objects'][0]['align']}))[] = []; kill = false; tileLayers: Tilemap[] = []; backgrounds: Background[] = []; @@ -96,69 +96,137 @@ export class Room extends PIXI.Container { newHeight: number ): void { for (const copy of this.alignElements) { - if (!copy.align) { - continue; - } - // get the old reference frame - const {padding, frame} = copy.align; - const xref = oldWidth * frame.x1 / 100 + padding.left, - yref = oldHeight * frame.y1 / 100 + padding.top; - const wref = oldWidth * (frame.x2 - frame.x1) / 100 - padding.left - padding.right, - href = oldHeight * (frame.y2 - frame.y1) / 100 - padding.top - padding.bottom; - // get the new reference frame - const xnew = newWidth * frame.x1 / 100 + padding.left, - ynew = newHeight * frame.y1 / 100 + padding.top; - const wnew = newWidth * (frame.x2 - frame.x1) / 100 - padding.left - padding.right, - hnew = newHeight * (frame.y2 - frame.y1) / 100 - padding.top - padding.bottom; - if (oldWidth !== newWidth) { - switch (copy.align.alignX) { - case 'start': - copy.x += xnew - xref; - break; - case 'both': - copy.x += xnew - xref; - copy.width += wnew - wref; - break; - case 'end': - copy.x += wnew - wref + xnew - xref; - break; - case 'center': - copy.x += (wnew - wref) / 2 + xnew - xref; - break; - case 'scale': { - const k = wnew / wref || 1; - copy.width *= k; - copy.x = (copy.x - xref) * k + xnew; - } break; - default: - } + Room.realignElement(copy, oldWidth, oldHeight, newWidth, newHeight); + } + } + static realignElement( + copy: BasicCopy | (pixiMod.Sprite & {align: ExportedRoom['objects'][0]['align']}), + oldWidth: number, + oldHeight: number, + newWidth: number, + newHeight: number + ): void { + if (!copy.align) { + return; + } + // get the old reference frame + const {padding, frame} = copy.align; + const xref = oldWidth * frame.x1 / 100 + padding.left, + yref = oldHeight * frame.y1 / 100 + padding.top; + const wref = oldWidth * (frame.x2 - frame.x1) / 100 - padding.left - padding.right, + href = oldHeight * (frame.y2 - frame.y1) / 100 - padding.top - padding.bottom; + // get the new reference frame + const xnew = newWidth * frame.x1 / 100 + padding.left, + ynew = newHeight * frame.y1 / 100 + padding.top; + const wnew = newWidth * (frame.x2 - frame.x1) / 100 - padding.left - padding.right, + hnew = newHeight * (frame.y2 - frame.y1) / 100 - padding.top - padding.bottom; + if (oldWidth !== newWidth) { + switch (copy.align.alignX) { + case 'start': + copy.x += xnew - xref; + break; + case 'both': + copy.x += xnew - xref; + copy.width += wnew - wref; + break; + case 'end': + copy.x += wnew - wref + xnew - xref; + break; + case 'center': + copy.x += (wnew - wref) / 2 + xnew - xref; + break; + case 'scale': { + const k = wnew / wref || 1; + copy.width *= k; + copy.x = (copy.x - xref) * k + xnew; + } break; + default: } - - if (oldHeight !== newHeight) { - switch (copy.align.alignY) { - case 'start': - copy.y += ynew - yref; - break; - case 'both': - copy.y += ynew - yref; - copy.height += hnew - href; - break; - case 'end': - copy.y += hnew - href + ynew - yref; - break; - case 'center': - copy.y += (hnew - href) / 2 + ynew - yref; - break; - case 'scale': { - const k = hnew / href || 1; - copy.height *= k; - copy.y = (copy.y - yref) * k + ynew; - } break; - default: - } + } + if (oldHeight !== newHeight) { + switch (copy.align.alignY) { + case 'start': + copy.y += ynew - yref; + break; + case 'both': + copy.y += ynew - yref; + copy.height += hnew - href; + break; + case 'end': + copy.y += hnew - href + ynew - yref; + break; + case 'center': + copy.y += (hnew - href) / 2 + ynew - yref; + break; + case 'scale': { + const k = hnew / href || 1; + copy.height *= k; + copy.y = (copy.y - yref) * k + ynew; + } break; + default: } } } + /** + * Adds a new copy to the list of elements that should be aligned when window size changes, + * with the specified alignment settings. + * The copy must be positioned relative to the current camera dimensions beforehand. + * @param copy The copy to add + * @param align The alignment settings + */ + makeCopyAligned(copy: BasicCopy | pixiMod.Sprite, align: { + alignX: 'start' | 'center' | 'end' | 'scale' | 'both', + alignY: 'start' | 'center' | 'end' | 'scale' | 'both', + frame?: { + x1: number, + y1: number, + x2: number, + y2: number + }, + padding?: { + left: number, + top: number, + right: number, + bottom: number + } + }): void { + const alignObj = Object.assign({}, align); + if (!align.frame) { + alignObj.frame = { + x1: 0, + y1: 0, + x2: 100, + y2: 100 + }; + } + if (!align.padding) { + alignObj.padding = { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; + } + (copy as (pixiMod.Sprite & {align: ExportedRoom['objects'][0]['align']})).align = alignObj as ExportedRoom['objects'][0]['align']; + this.alignElements.push(copy as (pixiMod.Sprite & {align: ExportedRoom['objects'][0]['align']})); + } + /** + * Adds a new copy to the list of elements that should be aligned when window size changes, + * with the specified alignment settings. + * The copy must be positioned relative to the room's template beforehand. + * @param copy The copy to add + * @param align The alignment settings + */ + makeCopyAlignedRef(copy: BasicCopy | pixiMod.Sprite, align: Parameters[1]): void { + this.makeCopyAligned(copy, align); + Room.realignElement( + copy as BasicCopy | (pixiMod.Sprite & {align: ExportedRoom['objects'][0]['align']}), + this.template.width, + this.template.height, + mainCamera.width, + mainCamera.height + ); + } // eslint-disable-next-line max-lines-per-function constructor(template: ExportedRoom, isRoot: boolean) { @@ -192,7 +260,7 @@ export class Room extends PIXI.Container { // so we don't use ct.backgrounds.add const bg = new Background( template.bgs[i].texture, - null, + 0, template.bgs[i].depth, template.bgs[i].exts ); @@ -264,30 +332,40 @@ export class Room extends PIXI.Container { } Room.roomId = 0; -let nextRoom: string; +let nextRoom: string | undefined; const roomsLib = { /** * All the existing room templates that can be used in the game. * It is usually prefilled by ct.IDE. + * @catnipIgnore */ templates: {} as Record, + /** + * @catnipIgnore + */ Room, /** The current top-level room in the game. */ - current: null as Room, + current: null as (Room | null), /** * An object that contains arrays of currently present rooms. * These include the current room (`rooms.current`), as well as any rooms * appended or prepended through `rooms.append` and `rooms.prepend`. + * @catnipList room */ list: {} as Record, /** * Creates and adds a background to the current room, at the given depth. * @param {string} texture The name of the texture to use + * @catnipAsset texture:texture * @param {number} depth The depth of the new background * @returns {Background} The created background + * @catnipSaveReturn */ addBg(texture: string, depth: number): Background { - const bg = new Background(texture, null, depth); + if (!roomsLib.current) { + throw new Error('[rooms.addBg] You cannot add a background before a room is created'); + } + const bg = new Background(texture, 0, depth); roomsLib.current.addChild(bg); return bg; }, @@ -348,6 +426,7 @@ const roomsLib = { /** * Switches to the given room. Note that this transition happens at the end * of the frame, so the name of a new room may be overridden. + * @catnipAsset roomName:room */ 'switch'(roomName: string): void { if (roomsLib.templates[roomName]) { @@ -357,12 +436,19 @@ const roomsLib = { console.error('[rooms] The room "' + roomName + '" does not exist!'); } }, + /** + * Whether a room switch is scheduled. + * @catnipIgnore + */ switching: false, /** * Restarts the current room. * @returns {void} */ restart(): void { + if (!roomsLib.current) { + throw new Error('[rooms.restart] Cannot restart a room before it is created'); + } roomsLib.switch(roomsLib.current.name); }, /** @@ -370,17 +456,18 @@ const roomsLib = { * from existing ones. * This room is added to `ct.stage` after all the other rooms. * @param {string} roomName The name of the room to be appended - * @param {object} [exts] Any additional parameters applied to the new room. + * @param {object} [params] Any additional parameters applied to the new room. * Useful for passing settings and data to new widgets and prefabs. * @returns {Room} A newly created room + * @catnipIgnore Defined in catnip/stdLib/rooms.ts */ - append(roomName: string, exts?: Record): Room { + append(roomName: string, params?: Record): Room { if (!(roomName in roomsLib.templates)) { throw new Error(`[rooms.append] append failed: the room ${roomName} does not exist!`); } const room = new Room(roomsLib.templates[roomName], false); - if (exts) { - Object.assign(room, exts); + if (params) { + Object.assign(room, params); } pixiApp.stage.addChild(room); room.onCreate.apply(room); @@ -393,17 +480,18 @@ const roomsLib = { * from existing ones. * This room is added to `ct.stage` before all the other rooms. * @param {string} roomName The name of the room to be prepended - * @param {object} [exts] Any additional parameters applied to the new room. + * @param {object} [params] Any additional parameters applied to the new room. * Useful for passing settings and data to new widgets and prefabs. * @returns {Room} A newly created room + * @catnipIgnore Defined in catnip/stdLib/rooms.ts */ - prepend(roomName: string, exts?: Record): Room { + prepend(roomName: string, params?: Record): Room { if (!(roomName in roomsLib.templates)) { throw new Error(`[rooms] prepend failed: the room ${roomName} does not exist!`); } const room = new Room(roomsLib.templates[roomName], false); - if (exts) { - Object.assign(room, exts); + if (params) { + Object.assign(room, params); } pixiApp.stage.addChildAt(room, 0); room.onCreate.apply(room); @@ -415,11 +503,16 @@ const roomsLib = { * Merges a given room into the current one. Skips room's OnCreate event. * * @param roomName The name of the room that needs to be merged + * @catnipAsset roomName:room * @returns Arrays of created copies, backgrounds, tile layers, * added to the current room (`rooms.current`). Note: it does not get updated, * so beware of memory leaks if you keep a reference to this array for a long time! + * @catnipSaveReturn */ merge(roomName: string): RoomMergeResult | false { + if (!roomsLib.current) { + throw new Error('[rooms.merge] Cannot merge in a room before the main one is created'); + } if (!(roomName in roomsLib.templates)) { console.error(`[rooms] merge failed: the room ${roomName} does not exist!`); return false; @@ -432,7 +525,7 @@ const roomsLib = { const template = roomsLib.templates[roomName]; const target = roomsLib.current; for (const t of template.bgs) { - const bg = new Background(t.texture, null, t.depth, t.exts); + const bg = new Background(t.texture, 0, t.depth, t.exts); target.backgrounds.push(bg); target.addChild(bg); generated.backgrounds.push(bg); @@ -458,6 +551,9 @@ const roomsLib = { } return generated; }, + /** + * @catnipIgnore + */ forceSwitch(roomName?: string): void { if (nextRoom) { roomName = nextRoom; @@ -466,11 +562,15 @@ const roomsLib = { roomsLib.rootRoomOnLeave.apply(roomsLib.current); roomsLib.current.onLeave(); roomsLib.onLeave.apply(roomsLib.current); - roomsLib.current = void 0; + roomsLib.current = null; } roomsLib.clear(); + for (const copy of forceDestroy) { + copy.destroy(); + } + forceDestroy.clear(); deadPool.length = 0; - var template = roomsLib.templates[roomName]; + var template = roomsLib.templates[roomName as string]; mainCamera.reset( template.width / 2, template.height / 2, @@ -489,27 +589,39 @@ const roomsLib = { roomsLib.rootRoomOnCreate.apply(roomsLib.current); roomsLib.current.onCreate(); roomsLib.onCreate.apply(roomsLib.current); - roomsLib.list[roomName].push(roomsLib.current); + roomsLib.list[roomName as string].push(roomsLib.current); /*!%switch%*/ mainCamera.manageStage(); roomsLib.switching = false; nextRoom = void 0; }, + /** + * @catnipIgnore + */ onCreate(this: Room): void { /*!%roomoncreate%*/ if (this.behaviors.length) { runBehaviors(this, 'rooms', 'thisOnCreate'); } }, + /** + * @catnipIgnore + */ onLeave(this: Room): void { /*!%roomonleave%*/ if (this.behaviors.length) { runBehaviors(this, 'rooms', 'thisOnDestroy'); } }, + /** + * @catnipIgnore + */ beforeStep(this: Room): void { /*!%beforeroomstep%*/ }, + /** + * @catnipIgnore + */ afterStep(this: Room): void { /*!%afterroomstep%*/ if (this.behaviors.length) { @@ -519,9 +631,15 @@ const roomsLib = { c.tick(); } }, + /** + * @catnipIgnore + */ beforeDraw(this: Room): void { /*!%beforeroomdraw%*/ }, + /** + * @catnipIgnore + */ afterDraw(this: Room): void { /*!%afterroomdraw%*/ if (this.behaviors.length) { @@ -531,15 +649,27 @@ const roomsLib = { fn(); } }, + /** + * @catnipIgnore + */ rootRoomOnCreate(this: Room): void { /*!@rootRoomOnCreate@*/ }, + /** + * @catnipIgnore + */ rootRoomOnStep(this: Room): void { /*!@rootRoomOnStep@*/ }, + /** + * @catnipIgnore + */ rootRoomOnDraw(this: Room): void { /*!@rootRoomOnDraw@*/ }, + /** + * @catnipIgnore + */ rootRoomOnLeave(this: Room): void { /*!@rootRoomOnLeave@*/ }, diff --git a/src/ct.release/sounds.ts b/src/ct.release/sounds.ts index 38bbb12e8..7e28143cd 100644 --- a/src/ct.release/sounds.ts +++ b/src/ct.release/sounds.ts @@ -14,7 +14,7 @@ import type {webaudio} from 'node_modules/@pixi/sound/lib'; import type {ExportedSound} from '../node_requires/exporter/_exporterContracts'; import type {Camera} from 'camera'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod & { sound: typeof pixiSound & { filters: typeof pixiSoundFilters; @@ -24,7 +24,7 @@ declare var camera: Camera; /* eslint-disable no-underscore-dangle */ class PannerFilter extends PIXI.sound.filters.Filter { - private _panner: PannerNode; + private _panner: PannerNode | null; constructor(refDistance: number, rolloffFactor: number) { const {audioContext} = PIXI.sound.context; const panner = audioContext.createPanner(); @@ -40,8 +40,8 @@ class PannerFilter extends PIXI.sound.filters.Filter { if (tracked.kill) { return; } - this._panner.positionX.value = tracked.x / camera.referenceLength; - this._panner.positionY.value = tracked.y / camera.referenceLength; + this._panner!.positionX.value = tracked.x / camera.referenceLength; + this._panner!.positionY.value = tracked.y / camera.referenceLength; } destroy() { super.destroy(); @@ -50,11 +50,20 @@ class PannerFilter extends PIXI.sound.filters.Filter { } /* eslint-enable no-underscore-dangle */ +/** + * @catnipIgnore + */ export const pannedSounds = new Map<{x: number, y: number}, PannerFilter>(); // ⚠️ DO NOT put into res.ts, see the start of the file. +/** + * @catnipIgnore + */ export const exportedSounds = [/*!@sounds@*/][0] as ExportedSound[] ?? []; -/** All the sound data objects exported from ct.IDE, mapped by their asset name. */ +/** + * All the sound data objects exported from ct.IDE, mapped by their asset name. + * @catnipIgnore + */ export const soundMap = {} as Record; for (const exportedSound of exportedSounds) { soundMap[exportedSound.name] = exportedSound; @@ -62,6 +71,7 @@ for (const exportedSound of exportedSounds) { /** * A map of Sound instances of both exported sounds' variants * and user-loaded ones with res.loadSound. + * @catnipIgnore */ export const pixiSoundInstances = {} as Record; @@ -79,7 +89,10 @@ for (const fxName of fxNames) { fxNamesToClasses[fxName] = PIXI.sound.filters[fxName]; } -/** A prefix for PIXI.Loader to distinguish between sounds and other asset types like textures. */ +/** + * A prefix for PIXI.Loader to distinguish between sounds and other asset types like textures. + * @catnipIgnore + */ export const pixiSoundPrefix = 'pixiSound-'; const randomRange = (min: number, max: number): number => Math.random() * (max - min) + min; @@ -102,7 +115,7 @@ const withSound = (name: string, fn: (sound: Sound, assetName: string) => T): const assetName = `${pixiSoundPrefix}${variant.uid}`; lastVal = fn(pixiSoundInstances[assetName], assetName); } - return lastVal; + return lastVal!; } throw new Error(`[sounds] Sound "${name}" was not found. Is it a typo?`); }; @@ -110,8 +123,7 @@ const withSound = (name: string, fn: (sound: Sound, assetName: string) => T): /** * Plays a variant of a sound by applying randomized filters (if applicable) * as exported from ct.IDE. - * - * @param {string} name Sound's name + * @catnipIgnore */ export const playVariant = ( sound: ExportedSound, @@ -157,6 +169,9 @@ export const playVariant = ( return pixiSoundInst; }; +/** + * @catnipIgnore + */ export const playWithoutEffects = ( sound: ExportedSound, variant: ExportedSound['variants'][0], @@ -167,6 +182,9 @@ export const playWithoutEffects = ( return pixiSoundInst; }; +/** + * @catnipIgnore + */ export const playRandomVariant = ( sound: ExportedSound, options?: PlayOptions @@ -184,7 +202,7 @@ export const soundsLib = { * @returns {Promise} A promise that resolves into the name of the loaded sound asset. */ async load(name: string): Promise { - const promises = []; + const promises: Promise[] = []; withSound(name, (soundRes, resName) => { const s = PIXI.sound.play(resName, { muted: true @@ -206,6 +224,7 @@ export const soundsLib = { * Plays a sound. * * @param {string} name Sound's name + * @catnipAsset name:sound * @param {PlayOptions} [options] Options used for sound playback. * @param {Function} options.complete When completed. * @param {number} options.end End time in seconds. @@ -218,6 +237,7 @@ export const soundsLib = { * @param {number} options.start Start time offset in seconds. * @param {number} options.volume Override default volume. * @returns Either a sound instance, or a promise that resolves into a sound instance. + * @catnipIgnore It is defined in stdLib/sounds.ts. */ play(name: string, options?: PlayOptions): Promise | IMediaInstance { if (name in soundMap) { @@ -231,6 +251,10 @@ export const soundsLib = { } throw new Error(`[sounds.play] Sound "${name}" was not found. Is it a typo?`); }, + /** + * Plays a sound in 3D space. + * @catnipIgnore It is defined in stdLib/sounds.ts. + */ playAt( name: string, position: {x: number, y: number}, @@ -262,6 +286,7 @@ export const soundsLib = { * Stops a sound if a name is specified, otherwise stops all sound. * * @param {string|IMediaInstance} [name] Sound's name, or the sound instance. + * @catnipAsset name:sound * * @returns {void} */ @@ -281,6 +306,7 @@ export const soundsLib = { * Pauses a sound if a name is specified, otherwise pauses all sound. * * @param {string} [name] Sound's name + * @catnipAsset name:sound * * @returns {void} */ @@ -296,6 +322,7 @@ export const soundsLib = { * Resumes a sound if a name is specified, otherwise resumes all sound. * * @param {string} [name] Sound's name + * @catnipAsset name:sound * * @returns {void} */ @@ -313,6 +340,7 @@ export const soundsLib = { * for existance of sound's metadata in your game. * * @param {string} name Sound's name + * @catnipAsset name:sound * * @returns {boolean} */ @@ -325,6 +353,7 @@ export const soundsLib = { * otherwise if any sound is currently playing. * * @param {string} [name] Sound's name + * @catnipAsset name:sound * * @returns {boolean} `true` if the sound is playing, `false` otherwise. */ @@ -350,10 +379,12 @@ export const soundsLib = { * Get or set the volume for a sound. * * @param {string|IMediaInstance} name Sound's name or instance + * @catnipAsset name:sound * @param {number} [volume] The new volume where 1 is 100%. * If empty, will return the existing volume. * * @returns {number} The current volume of the sound. + * @catnipIgnore */ volume(name: string | IMediaInstance, volume?: number): number { if (volume !== void 0) { @@ -374,7 +405,6 @@ export const soundsLib = { /** * Set the global volume for all sounds. * @param {number} value The new volume where 1 is 100%. - * */ globalVolume(value: number): void { PIXI.sound.volumeAll = value; @@ -384,19 +414,17 @@ export const soundsLib = { * Fades a sound to a given volume. Can affect either a specific instance or the whole group. * * @param [name] Sound's name or instance to affect. If null, all sounds are faded. + * @catnipAsset name:sound * @param [newVolume] The new volume where 1 is 100%. Default is 0. * @param [duration] The duration of transition, in milliseconds. Default is 1000. */ fade(name?: string | IMediaInstance | SoundLibrary, newVolume = 0, duration = 1000): void { const start = { time: performance.now(), - value: null + value: name ? + soundsLib.volume(name as string | IMediaInstance) : + PIXI.sound.context.volume }; - if (name) { - start.value = soundsLib.volume(name as string | IMediaInstance); - } else { - start.value = PIXI.sound.context.volume; - } const updateVolume = (currentTime: number) => { const elapsed = currentTime - start.time; const progress = Math.min(elapsed / duration, 1); @@ -420,6 +448,8 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound + * @catnipSaveReturn */ addFilter( sound: false | string | Sound | webaudio.WebAudioInstance, @@ -447,7 +477,9 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound * @param {number} amount The amount of distortion to set from 0 to 1. Default is 0. + * @catnipSaveReturn */ addDistortion( sound: false | string | Sound | webaudio.WebAudioInstance, @@ -464,6 +496,7 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound * @param {number} f32 Default gain for 32 Hz. Default is 0. * @param {number} f64 Default gain for 64 Hz. Default is 0. * @param {number} f125 Default gain for 125 Hz. Default is 0. @@ -474,8 +507,12 @@ export const soundsLib = { * @param {number} f4k Default gain for 4000 Hz. Default is 0. * @param {number} f8k Default gain for 8000 Hz. Default is 0. * @param {number} f16k Default gain for 16000 Hz. Default is 0. + * @catnipSaveReturn */ + /** + * @catnipAsset sound:sound + */ // eslint-disable-next-line max-params addEqualizer( sound: false | string | Sound | webaudio.WebAudioInstance, @@ -502,6 +539,8 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound + * @catnipSaveReturn */ addMonoFilter(sound: false | string | Sound | webaudio.WebAudioInstance): pixiSoundFilters.MonoFilter { @@ -516,9 +555,11 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound * @param {number} seconds Seconds for reverb. Default is 3. * @param {number} decay The decay length. Default is 2. * @param {boolean} reverse Reverse reverb. Default is false. + * @catnipSaveReturn */ addReverb( sound: false | string | Sound | webaudio.WebAudioInstance, @@ -537,7 +578,9 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound * @param {number} pan The amount of panning: -1 is left, 1 is right. Default is 0 (centered). + * @catnipSaveReturn */ addStereoFilter( sound: false | string | Sound | webaudio.WebAudioInstance, @@ -553,7 +596,9 @@ export const soundsLib = { * This filter can only be applied to sound instances. * * @param sound The sound to apply effect to. + * @catnipAsset sound:sound * @param position Any object with x and y properties — for example, copies. + * @catnipSaveReturn */ addPannerFilter( sound: webaudio.WebAudioInstance, @@ -576,6 +621,8 @@ export const soundsLib = { * @param sound If set to false, applies the filter globally. * If set to a string, applies the filter to the specified sound asset. * If set to a media instance or PIXI.Sound instance, applies the filter to it. + * @catnipAsset sound:sound + * @catnipSaveReturn */ addTelephone(sound: false | string | Sound | webaudio.WebAudioInstance): pixiSoundFilters.TelephoneFilter { @@ -590,6 +637,7 @@ export const soundsLib = { * @param {string} [name] The sound to affect. Can be a name of the sound asset * or the specific sound instance you get from running `sounds.play`. * If set to false, it affects all sounds. + * @catnipAsset name:sound * @param {string} [filter] The name of the filter. If omitted, all the filters are removed. * * @returns {void} @@ -644,10 +692,12 @@ export const soundsLib = { * Set the speed (playback rate) of a sound. * * @param {string|IMediaInstance} name Sound's name or instance + * @catnipAsset name:sound * @param {number} [value] The new speed, where 1 is 100%. * If empty, will return the existing speed value. * * @returns {number} The current speed of the sound. + * @catnipIgnore */ speed(name: string | IMediaInstance, value?: number): number { // TODO: make an overload if (value) { diff --git a/src/ct.release/styles.ts b/src/ct.release/styles.ts index 63a74492f..f71b2520e 100644 --- a/src/ct.release/styles.ts +++ b/src/ct.release/styles.ts @@ -1,10 +1,14 @@ import {ExportedStyle} from './../node_requires/exporter/_exporterContracts'; const stylesLib = { + /** + * @catnipIgnore + */ types: {} as Record, /** * Creates a new style with a given name. * Technically, it just writes `data` to `styles.types` + * @catnipIgnore */ new(name: string, styleTemplate: ExportedStyle): ExportedStyle { stylesLib.types[name] = styleTemplate; @@ -13,6 +17,7 @@ const stylesLib = { /** * Returns a style of a given name. The actual behavior strongly depends on `copy` parameter. * @param name The name of the style to load + * @catnipAsset name:style * @param [copy] If not set, returns the source style object. * Editing it will affect all new style calls. * When set to `true`, will create a new object, which you can safely modify diff --git a/src/ct.release/templateBaseClasses/PixiAnimatedSprite.ts b/src/ct.release/templateBaseClasses/PixiAnimatedSprite.ts index cac25c237..a02c37a7f 100644 --- a/src/ct.release/templateBaseClasses/PixiAnimatedSprite.ts +++ b/src/ct.release/templateBaseClasses/PixiAnimatedSprite.ts @@ -1,7 +1,7 @@ -import res from '../res'; +import res, {CtjsAnimation} from '../res'; import {ExportedTemplate} from '../../node_requires/exporter/_exporterContracts'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; export default class PixiAnimateSprite extends PIXI.AnimatedSprite { @@ -9,7 +9,7 @@ export default class PixiAnimateSprite extends PIXI.AnimatedSprite { if (t?.baseClass !== 'AnimatedSprite') { throw new Error('Don\'t call PixiButton class directly! Use templates.copy to create an instance instead.'); } - const textures = res.getTexture(t.texture); + const textures: CtjsAnimation | pixiMod.Texture[] = res.getTexture(t.texture!); super(textures); this.anchor.x = t.anchorX ?? textures[0].defaultAnchor.x ?? 0; this.anchor.y = t.anchorY ?? textures[0].defaultAnchor.y ?? 0; diff --git a/src/ct.release/templateBaseClasses/PixiBitmapText.ts b/src/ct.release/templateBaseClasses/PixiBitmapText.ts new file mode 100644 index 000000000..b9f366978 --- /dev/null +++ b/src/ct.release/templateBaseClasses/PixiBitmapText.ts @@ -0,0 +1,53 @@ +import {ExportedStyle, ExportedTemplate} from '../../node_requires/exporter/_exporterContracts'; +import uLib from '../u'; +import {CopyText} from '.'; + +import type * as pixiMod from 'pixi.js'; +import stylesLib from '../styles'; +declare var PIXI: typeof pixiMod; + +// PIXI.BitmapText accepts ITextStyle but ofc doesn't support outlines and shadows. +// With that, PixiBitmapText class accepts exported ct.js styles, +// and IDE warns about shadows and outlines. +export default class PixiBitmapText extends PIXI.BitmapText { + constructor(t: ExportedTemplate, exts: Record) { + if (t?.baseClass !== 'BitmapText') { + throw new Error('Don\'t call PixiBitmapText class directly! Use templates.copy to create an instance instead.'); + } + let style: ExportedStyle; + if (t.textStyle && t.textStyle !== -1) { + style = stylesLib.get(t.textStyle, true); + } else { + style = {} as ExportedStyle; + } + if (exts.customWordWrap) { + style.wordWrap = true; + style.wordWrapWidth = Number(exts.customWordWrap); + } + if (exts.customSize) { + style.fontSize = Number(exts.customSize); + } + super( + (exts.customText as string) || t.defaultText || '', + { + ...style, + fontName: style.fontFamily.split(',')[0].trim(), + tint: new PIXI.Color(style.fill as string) + } + ); + this.tint = new PIXI.Color(style.fill as string); + if (exts.customAnchor) { + const anchor = exts.customAnchor as { + x?: number, + y?: number + }; + (this as CopyText).anchor.set(anchor?.x ?? 0, anchor?.y ?? 0); + } + (this as CopyText).shape = uLib.getRectShape(this); + (this as CopyText).scale.set( + (exts.scaleX as number) ?? 1, + (exts.scaleY as number) ?? 1 + ); + return this; + } +} diff --git a/src/ct.release/templateBaseClasses/PixiButton.ts b/src/ct.release/templateBaseClasses/PixiButton.ts index bdccfdf05..05e736443 100644 --- a/src/ct.release/templateBaseClasses/PixiButton.ts +++ b/src/ct.release/templateBaseClasses/PixiButton.ts @@ -4,12 +4,12 @@ import resLib from '../res'; import uLib from '../u'; import {CopyButton} from '../templateBaseClasses'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; export default class PixiButton extends PIXI.Container { panel: pixiMod.NineSlicePlane; - textLabel: pixiMod.Text; + textLabel: pixiMod.Text | pixiMod.BitmapText; normalTexture: pixiMod.Texture; hoverTexture: pixiMod.Texture; pressedTexture: pixiMod.Texture; @@ -76,7 +76,16 @@ export default class PixiButton extends PIXI.Container { if (exts.customSize) { style.fontSize = Number(exts.customSize); } - this.textLabel = new PIXI.Text((exts.customText as string) || t.defaultText || '', style); + if (t.useBitmapText) { + this.textLabel = new PIXI.BitmapText((exts.customText as string) || t.defaultText || '', { + ...style, + fontSize: Number(style.fontSize), + fontName: (style.fontFamily as string).split(',')[0].trim() + }); + this.textLabel.tint = new PIXI.Color(style.fill as string); + } else { + this.textLabel = new PIXI.Text((exts.customText as string) || t.defaultText || '', style); + } this.textLabel.anchor.set(0.5); this.addChild(this.panel, this.textLabel); @@ -93,7 +102,7 @@ export default class PixiButton extends PIXI.Container { this.on('pointerupoutside', this.blur); this.on('pointerupoutsidecapture', this.blur); - this.updateNineSliceShape = t.nineSliceSettings.autoUpdate; + this.updateNineSliceShape = t.nineSliceSettings!.autoUpdate; let baseWidth = this.panel.width, baseHeight = this.panel.height; if ('scaleX' in exts) { diff --git a/src/ct.release/templateBaseClasses/PixiContainer.ts b/src/ct.release/templateBaseClasses/PixiContainer.ts index 7309df551..65516c71e 100644 --- a/src/ct.release/templateBaseClasses/PixiContainer.ts +++ b/src/ct.release/templateBaseClasses/PixiContainer.ts @@ -1,4 +1,4 @@ -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; export default class PixiContainer extends PIXI.Container { diff --git a/src/ct.release/templateBaseClasses/PixiNineSlicePlane.ts b/src/ct.release/templateBaseClasses/PixiNineSlicePlane.ts index f6b1d9829..6bc839c73 100644 --- a/src/ct.release/templateBaseClasses/PixiNineSlicePlane.ts +++ b/src/ct.release/templateBaseClasses/PixiNineSlicePlane.ts @@ -3,7 +3,7 @@ import resLib from '../res'; import uLib from '../u'; import {CopyPanel} from '../templateBaseClasses'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; export default class PixiPanel extends PIXI.NineSlicePlane { @@ -25,7 +25,7 @@ export default class PixiPanel extends PIXI.NineSlicePlane { t.nineSliceSettings?.right ?? 16, t.nineSliceSettings?.bottom ?? 16 ); - this.updateNineSliceShape = t.nineSliceSettings.autoUpdate; + this.updateNineSliceShape = t.nineSliceSettings!.autoUpdate; const baseWidth = this.width, baseHeight = this.height; if ('scaleX' in exts) { diff --git a/src/ct.release/templateBaseClasses/PixiScrollingTexture.ts b/src/ct.release/templateBaseClasses/PixiScrollingTexture.ts index 4dbf7bf2a..40ec81caa 100644 --- a/src/ct.release/templateBaseClasses/PixiScrollingTexture.ts +++ b/src/ct.release/templateBaseClasses/PixiScrollingTexture.ts @@ -4,7 +4,7 @@ import uLib from '../u'; import roomsLib from '../rooms'; import {BasicCopy} from '../templates'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; export default class PixiScrollingTexture extends PIXI.TilingSprite { @@ -38,10 +38,10 @@ export default class PixiScrollingTexture extends PIXI.TilingSprite { this.height = this.#baseHeight * (exts.scaleY as number ?? 1); } this.on('added', () => { - roomsLib.current.tickerSet.add(this as typeof this & BasicCopy); + roomsLib.current!.tickerSet.add(this as typeof this & BasicCopy); }); this.on('removed', () => { - roomsLib.current.tickerSet.delete(this as typeof this & BasicCopy); + roomsLib.current!.tickerSet.delete(this as typeof this & BasicCopy); }); this.shape = { type: 'rect', diff --git a/src/ct.release/templateBaseClasses/PixiSpritedCounter.ts b/src/ct.release/templateBaseClasses/PixiSpritedCounter.ts index 548c6776f..4ee9f396e 100644 --- a/src/ct.release/templateBaseClasses/PixiSpritedCounter.ts +++ b/src/ct.release/templateBaseClasses/PixiSpritedCounter.ts @@ -1,7 +1,7 @@ import {ExportedTemplate} from '../../node_requires/exporter/_exporterContracts'; import resLib from '../res'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; export default class PixiSpritedCounter extends PIXI.TilingSprite { diff --git a/src/ct.release/templateBaseClasses/PixiText.ts b/src/ct.release/templateBaseClasses/PixiText.ts index 198238614..01f83ad1d 100644 --- a/src/ct.release/templateBaseClasses/PixiText.ts +++ b/src/ct.release/templateBaseClasses/PixiText.ts @@ -2,14 +2,14 @@ import {ExportedStyle, ExportedTemplate} from '../../node_requires/exporter/_exp import uLib from '../u'; import {CopyText} from '.'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; import stylesLib from '../styles'; declare var PIXI: typeof pixiMod; export default class PixiText extends PIXI.Text { constructor(t: ExportedTemplate, exts: Record) { if (t?.baseClass !== 'Text') { - throw new Error('Don\'t call PixiPanel class directly! Use templates.copy to create an instance instead.'); + throw new Error('Don\'t call PixiText class directly! Use templates.copy to create an instance instead.'); } let style: ExportedStyle; if (t.textStyle && t.textStyle !== -1) { diff --git a/src/ct.release/templateBaseClasses/PixiTextBox.ts b/src/ct.release/templateBaseClasses/PixiTextBox.ts index a1ef8c199..5e5f1fe31 100644 --- a/src/ct.release/templateBaseClasses/PixiTextBox.ts +++ b/src/ct.release/templateBaseClasses/PixiTextBox.ts @@ -5,9 +5,9 @@ import uLib from '../u'; import {BasicCopy} from 'templates'; import {CopyTextBox} from 'templateBaseClasses'; import {setFocusedElement} from '../templates'; -import {pixiApp, settings as settingsLib} from 'index'; +import {pixiApp, settings as settingsLib, forceDestroy} from 'index'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; const cssStyle = document.createElement('style'); @@ -15,7 +15,11 @@ document.head.appendChild(cssStyle); export default class PixiTextBox extends PIXI.Container { panel: pixiMod.NineSlicePlane; - textLabel: pixiMod.Text; + textLabel: pixiMod.Text | pixiMod.BitmapText; + style: Partial & { + fontName: string; + fontSize: number; + }; normalTexture: pixiMod.Texture; hoverTexture: pixiMod.Texture; pressedTexture: pixiMod.Texture; @@ -58,9 +62,9 @@ export default class PixiTextBox extends PIXI.Container { if (this.maxLength > 0) { this.#htmlInput.maxLength = this.maxLength; } else { - delete this.#htmlInput.maxLength; + this.#htmlInput.maxLength = 524288; } - this.#htmlInput.type = this.fieldType; + this.#htmlInput.type = this.fieldType || 'text'; this.#htmlInput.value = this.text; document.body.appendChild(this.#htmlInput); this.#htmlInput.focus(); @@ -124,9 +128,11 @@ export default class PixiTextBox extends PIXI.Container { coord = isUi ? uLib.uiToCssCoord : uLib.gameToCssCoord; const lt = coord(x1, y1), br = coord(x2, y2); - const textStyle = this.textLabel.style; + const textStyle = this.style; + // Mimic font style used in pixi.js Object.assign(this.#htmlInput.style, { - fontSize: scalar(parseFloat(textStyle.fontSize as string)) + 'px', + fontFamily: textStyle.fontFamily, + fontSize: scalar(textStyle.fontSize) + 'px', left: lt.x + 'px', top: lt.y + 'px', width: br.x - lt.x + 'px', @@ -140,7 +146,7 @@ export default class PixiTextBox extends PIXI.Container { } else { (this.#htmlInput.style as any).textStroke = this.#htmlInput.style.webkitTextStroke = 'unset'; } - if (textStyle.dropShadow) { + if ('dropShadow' in textStyle) { const angle = uLib.radToDeg(textStyle.dropShadowAngle ?? 0); let x = uLib.ldx(textStyle.dropShadowDistance ?? 0, angle), y = uLib.ldy(textStyle.dropShadowDistance ?? 0, angle); @@ -149,9 +155,6 @@ export default class PixiTextBox extends PIXI.Container { const css = `${x}px ${y}px ${scalar(textStyle.dropShadowBlur ?? 0)}px ${textStyle.dropShadowColor}`; this.#htmlInput.style.textShadow = `${css}, ${css}`; // Make it thicc to match Canvas2D look } - this.#htmlInput.style.fontStyle = textStyle.fontStyle ?? 'unset'; - this.#htmlInput.style.fontFamily = (textStyle.fontFamily as string) ?? 'unset'; - this.#htmlInput.style.fontWeight = textStyle.fontWeight ?? '400'; if (this.selectionColor) { cssStyle.innerHTML = ` ::selection { @@ -179,12 +182,13 @@ export default class PixiTextBox extends PIXI.Container { } } - // eslint-disable-next-line max-lines-per-function + // eslint-disable-next-line max-lines-per-function, complexity constructor(t: ExportedTemplate, exts: Record) { if (t?.baseClass !== 'TextBox') { throw new Error('Don\'t call PixiTextBox class directly! Use templates.copy to create an instance instead.'); } super(); + forceDestroy.add(this as BasicCopy); this.normalTexture = resLib.getTexture(t.texture, 0); this.hoverTexture = t.hoverTexture ? resLib.getTexture(t.hoverTexture, 0) : @@ -215,7 +219,17 @@ export default class PixiTextBox extends PIXI.Container { if (this.fieldType === 'password') { text = '•'.repeat(text.length); } - this.textLabel = new PIXI.Text(text, style); + this.style = { + ...style, + fontSize: Number(style.fontSize), + fontName: (style.fontFamily as string).split(',')[0].trim() + }; + if (t.useBitmapText) { + this.textLabel = new PIXI.BitmapText((exts.customText as string) || t.defaultText || '', this.style); + this.textLabel.tint = new PIXI.Color(style.fill as string); + } else { + this.textLabel = new PIXI.Text((exts.customText as string) || t.defaultText || '', this.style); + } this.textLabel.anchor.set(0.5); this.addChild(this.panel, this.textLabel); @@ -236,7 +250,7 @@ export default class PixiTextBox extends PIXI.Container { this.on('pointerupoutside', this.unhover); this.on('pointerupoutsidecapture', this.unhover); - this.updateNineSliceShape = t.nineSliceSettings.autoUpdate; + this.updateNineSliceShape = t.nineSliceSettings!.autoUpdate; let baseWidth = this.panel.width, baseHeight = this.panel.height; if ('scaleX' in exts) { @@ -262,11 +276,21 @@ export default class PixiTextBox extends PIXI.Container { this.#htmlInput.addEventListener('input', () => { this.oninput(this.#htmlInput.value); }); + this.#htmlInput.addEventListener('blur', () => { + this.#setFocused(false); + }); this.on('pointerup', () => { this.#setFocused(true); }); } + destroy(options?: boolean | pixiMod.IDestroyOptions | undefined): void { + forceDestroy.delete(this as BasicCopy); + if (this.#focused) { + this.#setFocused(false); + } + super.destroy(options); + } unsize(): void { const {x, y} = this.scale; diff --git a/src/ct.release/templateBaseClasses/index.ts b/src/ct.release/templateBaseClasses/index.ts index 326e530fb..f61bb2236 100644 --- a/src/ct.release/templateBaseClasses/index.ts +++ b/src/ct.release/templateBaseClasses/index.ts @@ -5,12 +5,13 @@ import PixiTextBox from './PixiTextBox'; // import PixiScrollBox from './PixiScrollBox'; import PixiPanel from './PixiNineSlicePlane'; import PixiText from './PixiText'; +import PixiBitmapText from './PixiBitmapText'; import PixiContainer from './PixiContainer'; import PixiAnimatedSprite from './PixiAnimatedSprite'; import {ICopy} from '../templates'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; import {BaseClass} from '../../node_requires/exporter/_exporterContracts'; // eslint-disable-next-line @typescript-eslint/ban-types @@ -24,6 +25,7 @@ export const baseClassToPixiClass: Record focusedElement; -export const blurFocusedElement = () => { +/** + * @catnipIgnore + */ +export const blurFocusedElement = (): void => { focusedElement.blur(); }; -export const setFocusedElement = (elt: IFocusableElement) => { +/** + * @catnipIgnore + */ +export const setFocusedElement = (elt: IFocusableElement): void => { if (focusedElement && focusedElement !== elt) { blurFocusedElement(); } @@ -150,6 +159,9 @@ export const setFocusedElement = (elt: IFocusableElement) => { export type BasicCopy = Record & pixiMod.DisplayObject & ICopy; /* eslint-enable @typescript-eslint/no-explicit-any */ +/** + * @catnipIgnore + */ export const CopyProto: Partial = { set tex(value: string) { if (this._tex === value) { @@ -254,15 +266,30 @@ export const CopyProto: Partial = { } }; type Mutable = {-readonly[P in keyof T]: T[P]}; + +const assignExtends = (target: BasicCopy, exts: Record) => { + // Some base classes, like BitmapText, can preset tint during construction, + // So we need to multiply it with the set tint to preserve the effect. + let {tint} = target; + if (exts.tint || exts.tint === 0) { + tint = (new PIXI.Color(target.tint)) + .multiply(exts.tint as number) + .toNumber(); + } + Object.assign(target, exts); + target.tint = tint; +}; + // eslint-disable-next-line complexity, max-lines-per-function /** * A factory function that when applied to a PIXI.DisplayObject instance, * augments it with ct.js Copy functionality. * @param {string} template The name of the template to copy * @param {PIXI.DisplayObject|Room} [container] A container to set as copy's parent - * before its OnCreate event. Defaults to ct.room. + * before its OnCreate event. Defaults to rooms.current. + * @catnipIgnore */ -// eslint-disable-next-line max-lines-per-function, max-params +// eslint-disable-next-line max-lines-per-function, max-params, complexity const Copy = function ( this: BasicCopy, x: number, @@ -278,7 +305,7 @@ const Copy = function ( // Early linking so that `this.parent` is available in OnCreate events this.parent = container; if (template.baseClass === 'AnimatedSprite' || template.baseClass === 'NineSlicePlane') { - this._tex = template.texture; + this._tex = template.texture || -1; } (this as Mutable).behaviors = [...template.behaviors]; if (template.visible === false) { // ignore nullish values @@ -319,7 +346,7 @@ const Copy = function ( this.zIndex = template.depth; Object.assign(this, template.extends); if (exts) { - Object.assign(this, exts); + assignExtends(this, exts); } if ('texture' in template && !this.shape) { this.shape = resLib.getTextureShape(template.texture || -1); @@ -336,7 +363,9 @@ const Copy = function ( templatesLib.templates[template.name].onCreate.apply(this); onCreateModifier.apply(this); } else if (exts) { - Object.assign(this, exts); + // Some base classes, like BitmapText, can preset tint during construction, + // So we need to multiply it with the set tint to preserve the effect. + assignExtends(this, exts); this.onBeforeCreateModifier.apply(this); onCreateModifier.apply(this); } @@ -359,18 +388,21 @@ const mix = ( ) => { const proto = CopyProto; const properties = Object.getOwnPropertyNames(proto); - for (const y in properties) { - if (properties[y] !== 'constructor') { + for (const i in properties) { + if (properties[i] !== 'constructor') { Object.defineProperty( target, - properties[y], - Object.getOwnPropertyDescriptor(proto, properties[y]) + properties[i], + Object.getOwnPropertyDescriptor(proto, properties[i])! ); } } Copy.apply(target, [x, y, template, parent, exts]); }; +/** + * @catnipIgnore +*/ // eslint-disable-next-line complexity, max-lines-per-function export const makeCopy = ( template: string, @@ -401,11 +433,21 @@ const onCreateModifier = function () { * mainly for finding particular copies and creating new ones. */ const templatesLib = { + /** + * @catnipIgnore + */ CopyProto, + /** + * @catnipIgnore + */ Background, + /** + * @catnipIgnore + */ Tilemap, /** * An object that contains arrays of copies of all templates. + * @catnipList template */ list: { BACKGROUND: [], @@ -416,60 +458,72 @@ const templatesLib = { } & Record, /** * A map of all the templates of templates exported from ct.IDE. + * @catnipIgnore */ templates: {} as Record, + /** + * Creates a new copy of a given template inside the current root room. + * A shorthand for `templates.copyIntoRoom(template, x, y, rooms.current, exts)` + * @param template The name of the template to use + * @catnipAsset template:template + * @param [x] The x coordinate of a new copy. Defaults to 0. + * @param [y] The y coordinate of a new copy. Defaults to 0. + * @param [params] An optional object which parameters will be applied + * to the copy prior to its OnCreate event. + * @returns The created copy. + * @catnipSaveReturn + * @catnipIgnore + */ + copy(template: string, x = 0, y = 0, params: Record = {}): BasicCopy { + if (!roomsLib.current) { + throw new Error('[emitters.fire] An attempt to create a copy before the main room is created.'); + } + return templatesLib.copyIntoRoom(template, x, y, roomsLib.current, params); + }, /** * Creates a new copy of a given template inside a specific room. * @param template The name of the template to use + * @catnipAsset template:template * @param [x] The x coordinate of a new copy. Defaults to 0. * @param [y] The y coordinate of a new copy. Defaults to 0. * @param [room] The room to which add the copy. * Defaults to the current room. - * @param [exts] An optional object which parameters will be applied + * @param [params] An optional object which parameters will be applied * to the copy prior to its OnCreate event. * @returns The created copy. + * @catnipSaveReturn + * @catnipIgnore */ // eslint-disable-next-line max-len - copyIntoRoom(template: string, x = 0, y = 0, room: Room, exts: Record = {}): BasicCopy { + copyIntoRoom(template: string, x = 0, y = 0, room: Room, params: Record = {}): BasicCopy { // An advanced constructor. Returns a Copy if (!room || !(room instanceof Room)) { throw new Error(`Attempt to spawn a copy of template ${template} inside an invalid room. Room's value provided: ${room}`); } - const obj = makeCopy(template, x, y, room, exts); + const obj = makeCopy(template, x, y, room, params); room.addChild(obj as pixiMod.DisplayObject); stack.push(obj); return obj; }, - /** - * Creates a new copy of a given template inside the current root room. - * A shorthand for `templates.copyIntoRoom(template, x, y, ct.room, exts)` - * @param template The name of the template to use - * @param [x] The x coordinate of a new copy. Defaults to 0. - * @param [y] The y coordinate of a new copy. Defaults to 0. - * @param [exts] An optional object which parameters will be applied - * to the copy prior to its OnCreate event. - * @returns The created copy. - */ - copy(template: string, x = 0, y = 0, exts: Record = {}): BasicCopy { - return templatesLib.copyIntoRoom(template, x, y, roomsLib.current, exts); - }, /** * Applies a function to each copy in the current room * @param {Function} func The function to apply + * @catnipIcon crosshair * @returns {void} */ - each(func: (this: BasicCopy) => void): void { + each(func: (this: BasicCopy, me: BasicCopy) => void): void { for (const copy of stack) { - if (!(copy instanceof Copy)) { + if (!copy[copyTypeSymbol]) { continue; // Skip backgrounds and tile layers } - func.apply(copy, this); + func.call(copy, copy); } }, /** * Applies a function to a given object (e.g. to a copy) * @param {Copy} obj The copy to perform function upon. * @param {Function} function The function to be applied. + * @catnipIcon crosshair */ withCopy(obj: T, func: (this: T) => void): void { func.apply(obj, this); @@ -477,7 +531,9 @@ const templatesLib = { /** * Applies a function to every copy of the given template name * @param {string} template The name of the template to perform function upon. + * @catnipAsset template:template * @param {Function} function The function to be applied. + * @catnipIcon crosshair */ withTemplate( template: string, @@ -491,6 +547,7 @@ const templatesLib = { * Checks whether there are any copies of this template's name. * Will throw an error if you pass an invalid template name. * @param {string} template The name of a template to check. + * @catnipAsset template:template * @returns {boolean} Returns `true` if at least one copy exists in a room; * `false` otherwise. */ @@ -505,6 +562,7 @@ const templatesLib = { * Checks whether a given object is a ct.js copy. * @param {any} obj The object which needs to be checked. * @returns {boolean} Returns `true` if the passed object is a copy; `false` otherwise. + * @catnipIgnore */ isCopy: ((obj: unknown): boolean => obj && obj[copyTypeSymbol]) as { (obj: BasicCopy): obj is BasicCopy; @@ -513,9 +571,10 @@ const templatesLib = { /** * Checks whether a given object exists in game's world. * Intended to be applied to copies, but may be used with other PIXI entities. + * @catnipIgnore */ valid: ((obj: unknown): boolean => { - if (typeof obj !== 'object') { + if (typeof obj !== 'object' || obj === null) { return false; } if (copyTypeSymbol in obj) { @@ -531,19 +590,30 @@ const templatesLib = { // eslint-disable-next-line @typescript-eslint/no-explicit-any (obj: unknown): false }, - + /** + * @catnipIgnore + */ beforeStep(this: BasicCopy): void { /*!%beforestep%*/ }, + /** + * @catnipIgnore + */ afterStep(this: BasicCopy): void { /*!%afterstep%*/ if (this.behaviors.length) { runBehaviors(this, 'templates', 'thisOnStep'); } }, + /** + * @catnipIgnore + */ beforeDraw(this: BasicCopy): void { /*!%beforedraw%*/ }, + /** + * @catnipIgnore + */ afterDraw(this: BasicCopy): void { if (this.behaviors.length) { runBehaviors(this, 'templates', 'thisOnDraw'); @@ -560,6 +630,9 @@ const templatesLib = { } /*!%afterdraw%*/ }, + /** + * @catnipIgnore + */ onDestroy(this: BasicCopy): void { /*!%ondestroy%*/ if (this.behaviors.length) { diff --git a/src/ct.release/tilemaps.ts b/src/ct.release/tilemaps.ts index 89721fec6..3f88ed0af 100644 --- a/src/ct.release/tilemaps.ts +++ b/src/ct.release/tilemaps.ts @@ -4,7 +4,7 @@ import templatesLib from './templates'; import {settings as settingsLib} from '.'; import roomsLib from 'rooms'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; import type {ExportedTilemap, ExportedTile, TextureShape} from './../node_requires/exporter/_exporterContracts'; @@ -216,10 +216,13 @@ export class Tilemap extends PIXI.Container { const tilemapsLib = { /** * Creates a new tilemap at a specified depth, and adds it to the main room (ct.room). - * @param {number} [depth] The depth of a newly created tilemap. Defaults to 0. + * @param [depth] The depth of a newly created tilemap. Defaults to 0. * @returns {Tilemap} The created tilemap. */ create(depth = 0): Tilemap { + if (!roomsLib.current) { + throw new Error('[emitters.fire] An attempt to create a tilemap before the main room is created.'); + } const tilemap = new Tilemap(); tilemap.zIndex = depth; roomsLib.current.addChild(tilemap); @@ -230,6 +233,7 @@ const tilemapsLib = { * calling `tilemap.addTile(textureName, x, y, frame). * @param tilemap The tilemap to modify. * @param textureName The name of the texture to use. + * @catnipAsset textureName:texture * @param x The horizontal location of the tile. * @param y The vertical location of the tile. * @param frame The frame to pick from the source texture. Defaults to 0. diff --git a/src/ct.release/timer.ts b/src/ct.release/timer.ts index f4f28bd44..9aa6894e9 100644 --- a/src/ct.release/timer.ts +++ b/src/ct.release/timer.ts @@ -33,8 +33,11 @@ export class CtTimer { * if `false`, it will use `ct.delta` for counting time. */ constructor(timeMs: number, name?: string, uiDelta = false) { - this[ctTimerRoomUid] = roomsLib.current.uid || null; - this.name = name && name.toString(); + if (!roomsLib.current) { + throw new Error('[CtTimer] Timers can only be created when a main room exists. If you need to run async tasks before ct.js game starts, use vanilla JS\' setTimeout method.'); + } + this[ctTimerRoomUid] = roomsLib.current.uid; + this.name = name || 'unnamed'; this.isUi = uiDelta; this[ctTimerTime] = 0; this[ctTimerTimeLeftOriginal] = timeMs / 1000; @@ -91,7 +94,9 @@ export class CtTimer { return; } this[ctTimerTime] += this.isUi ? uLib.timeUi : uLib.time; - if (roomsLib.current.uid !== this[ctTimerRoomUid] && this[ctTimerRoomUid] !== null) { + if (!roomsLib.current || + (roomsLib.current.uid !== this[ctTimerRoomUid] && + this[ctTimerRoomUid] !== null)) { this.reject({ info: 'Room has been switched', from: 'timer' diff --git a/src/ct.release/tsconfig.json b/src/ct.release/tsconfig.json index fd74db5e4..b3a8aca77 100644 --- a/src/ct.release/tsconfig.json +++ b/src/ct.release/tsconfig.json @@ -6,18 +6,21 @@ "esModuleInterop": true, "declaration": true, "emitDeclarationOnly": true, + "alwaysStrict": true, + "strictNullChecks": true, + "exactOptionalPropertyTypes": true, "noEmitOnError": false, "skipLibCheck": true, "baseUrl": ".", "rootDir": "../..", "typeRoots": [ - "../../app/node_modules/@types/", + "../../node_modules/@types/", "./desktopPack/game" ], "outFile": "ct.d.ts", "paths": { "node_modules/*": [ - "../../app/node_modules/*" + "../../node_modules/*" ] }, }, diff --git a/src/ct.release/u.ts b/src/ct.release/u.ts index 6a675dab7..12834a42c 100644 --- a/src/ct.release/u.ts +++ b/src/ct.release/u.ts @@ -6,12 +6,13 @@ import timerLib, {CtTimer} from './timer'; import {canvasCssPosition} from './fittoscreen'; import mainCamera from './camera'; -import type * as pixiMod from 'node_modules/pixi.js'; +import type * as pixiMod from 'pixi.js'; declare var PIXI: typeof pixiMod; /** * An utility function to throw errors by using them * as default values for mandatory arguments in public API. + * @catnipIgnore */ export const required = function required(paramName: string, method: string): never { let str = 'The parameter '; @@ -44,6 +45,7 @@ const uLib = { * ``` * * @deprecated Use `u.time` instead. + * @catnipIgnore */ delta: 1, /** @@ -56,6 +58,7 @@ const uLib = { * both with slow-mo effects and game pause. * * @deprecated Use `u.timeUi` instead. + * @catnipIgnore */ deltaUi: 1, /** @@ -94,16 +97,21 @@ const uLib = { * * If you plan on changing your game's target framerate, * you should use `u.timeUi` instead of `u.deltaUi`. + * + * @catnipIgnore */ timeUI: 1 / 60, // ⚠️ keep this "duplicate": it is an alias with different capitalization /** * Get the environment the game runs on. - * @returns {string} Either 'ct.ide', or 'nw', or 'electron', or 'browser'. + * @returns {string} Either 'ct.ide', or 'nw', or 'electron', or 'browser', or 'neutralino'. */ - getEnvironment(): string { + getEnvironment(): 'ct.ide' | 'nw' | 'electron' | 'browser' | 'neutralino' { if (window.name === 'ct.js debugger') { return 'ct.ide'; } + if ('NL_OS' in window) { + return 'neutralino'; + } try { // eslint-disable-next-line @typescript-eslint/no-explicit-any if (('nw' in window) && ('require' in ((window as any).nw as Record))) { @@ -292,7 +300,7 @@ const uLib = { /** * Returns a shape object based on the dimensions of the given sprite. */ - getRectShape(sprite: pixiMod.Sprite): TextureShape { + getRectShape(sprite: pixiMod.Sprite | pixiMod.BitmapText): TextureShape { return { type: 'rect', left: sprite.width * sprite.anchor.x, @@ -379,6 +387,9 @@ const uLib = { copy.hitArea = hitarea; } }, + /** + * @catnipIgnore + */ getHitArea(shape: TextureShape): pixiMod.Polygon | pixiMod.Circle | pixiMod.Rectangle | false { if (shape.type === 'circle') { return new PIXI.Circle(0, 0, shape.r); @@ -486,6 +497,7 @@ const uLib = { * This timer is run in gameplay time scale, meaning that it is affected by time stretching. * @param {number} time Time to wait, in milliseconds * @returns {CtTimer} The timer, which you can call `.then()` to + * @catnipPromise both */ wait(time: number): CtTimer { return timerLib.add(time); @@ -495,6 +507,7 @@ const uLib = { * This timer runs in UI time scale and is not sensitive to time stretching. * @param {number} time Time to wait, in milliseconds * @returns {CtTimer} The timer, which you can call `.then()` to + * @catnipPromise both */ waitUi(time: number): CtTimer { return timerLib.addUi(time); @@ -504,6 +517,7 @@ const uLib = { * on a function with a regular (err, result) => {...} callback. * @param {Function} f The function that needs to be promisified * @see https://javascript.info/promisify + * @catnipIgnore */ promisify(f: ( ...args: [...T3, () => (err: E, result: T2) => T1]) => void) { @@ -522,6 +536,9 @@ const uLib = { }); }; }, + /** + * @catnipIgnore + */ required, /** * Takes a prefix and a number to make a string in format Prefix_XX, @@ -549,6 +566,9 @@ Object.assign(uLib, {// make aliases pointCircle: uLib.pcircle }); +/** + * @catnipIgnore + */ export default uLib as typeof uLib & { getOs: typeof uLib.getOS, lengthDirX: typeof uLib.ldx, diff --git a/src/examples/2DPhysics.ict b/src/examples/2D Physics (JavaScript).ict similarity index 99% rename from src/examples/2DPhysics.ict rename to src/examples/2D Physics (JavaScript).ict index 03faf6444..b2786f75d 100644 --- a/src/examples/2DPhysics.ict +++ b/src/examples/2D Physics (JavaScript).ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0-next-5 +ctjsVersion: 5.0.0 notes: /* empty */ libs: matter: @@ -49,6 +49,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: -1 accent: '#446adb' @@ -115,6 +118,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: AlienTarget depth: 0 texture: 6c8a3edf-d5fe-4916-b63c-2201c099d28f @@ -157,6 +161,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: WoodenSquare depth: 0 texture: 41f7c3b3-abc8-4940-8919-9114a884d7f2 @@ -189,6 +194,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: WoodenPlank depth: 0 texture: 9afd54d7-1265-4ba0-b5de-5226b3c7e2fb @@ -222,6 +228,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: WoodenTriangle depth: 0 texture: 0f0e39f3-05bd-47e1-88d2-7dbf7bc3596b @@ -256,6 +263,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Slingshot depth: 0 texture: 37dfad62-8372-4804-8416-765039343b61 @@ -281,6 +289,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Alien_Dragging depth: 0 texture: 8a5f385a-d547-4d2d-9641-b1856738c62a @@ -340,6 +349,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: elementMetal013 depth: 0 texture: 56ab43ae-1b27-4b5e-9e49-fbbe74d42597 @@ -374,6 +384,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: elementMetal011 depth: 0 texture: c4d4030a-b640-44be-bded-26a5c030f542 @@ -406,6 +417,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: elementMetal000 depth: 0 texture: 3a4eba8d-8b33-478e-95e5-3833099c1a03 @@ -441,6 +453,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: Restart depth: 0 @@ -467,6 +480,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: GravityZone depth: 5 @@ -503,6 +517,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: AlienCounter depth: 0 @@ -541,6 +556,7 @@ assets: style: -1 textStyle: g3TB8dbChgMRjP defaultText: 0/0 + extendTypes: '' - name: Level_01 onstep: '' ondraw: '' @@ -1193,6 +1209,7 @@ assets: backgroundColor: '#CFF5FA' follow: -1 behaviors: [] + extendTypes: '' - type: room oncreate: '' onstep: '' @@ -1254,6 +1271,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - name: Level_02 onstep: '' ondraw: '' @@ -1936,6 +1954,7 @@ assets: backgroundColor: '#CFF5FA' follow: -1 behaviors: [] + extendTypes: '' - name: Level_Empty onstep: '' ondraw: '' @@ -2272,6 +2291,7 @@ assets: backgroundColor: '#CFF5FA' follow: -1 behaviors: [] + extendTypes: '' - name: Level_03 onstep: '' ondraw: '' @@ -2944,6 +2964,7 @@ assets: backgroundColor: '#CFF5FA' follow: -1 behaviors: [] + extendTypes: '' - name: Impact_Wooden uid: ccfe7f50-d4d3-4570-95e9-75d5d73bef0a lastmod: 1704096248591 @@ -3122,6 +3143,7 @@ assets: weight: 4 lastmod: 1657008646209 type: style + typeface: -1 - name: WoodenPlank untill: 0 grid: @@ -3880,3 +3902,5 @@ assets: readableName: Minimal impact to deal damage lastmod: 1704096254823 uid: d7r5Pw9Q4dMTBF + extendTypes: '' +globalVars: [] diff --git a/src/examples/2DPhysics/img/i03040255-0c4f-4605-aa7f-8a146a75675f.png b/src/examples/2D Physics (JavaScript)/img/i03040255-0c4f-4605-aa7f-8a146a75675f.png similarity index 100% rename from src/examples/2DPhysics/img/i03040255-0c4f-4605-aa7f-8a146a75675f.png rename to src/examples/2D Physics (JavaScript)/img/i03040255-0c4f-4605-aa7f-8a146a75675f.png diff --git a/src/examples/2DPhysics/img/i0f0e39f3-05bd-47e1-88d2-7dbf7bc3596b.png b/src/examples/2D Physics (JavaScript)/img/i0f0e39f3-05bd-47e1-88d2-7dbf7bc3596b.png similarity index 100% rename from src/examples/2DPhysics/img/i0f0e39f3-05bd-47e1-88d2-7dbf7bc3596b.png rename to src/examples/2D Physics (JavaScript)/img/i0f0e39f3-05bd-47e1-88d2-7dbf7bc3596b.png diff --git a/src/examples/2DPhysics/img/i375a4a5e-64e5-410f-aa6f-3bcfc9804519.png b/src/examples/2D Physics (JavaScript)/img/i375a4a5e-64e5-410f-aa6f-3bcfc9804519.png similarity index 100% rename from src/examples/2DPhysics/img/i375a4a5e-64e5-410f-aa6f-3bcfc9804519.png rename to src/examples/2D Physics (JavaScript)/img/i375a4a5e-64e5-410f-aa6f-3bcfc9804519.png diff --git a/src/examples/2DPhysics/img/i37dfad62-8372-4804-8416-765039343b61.png b/src/examples/2D Physics (JavaScript)/img/i37dfad62-8372-4804-8416-765039343b61.png similarity index 100% rename from src/examples/2DPhysics/img/i37dfad62-8372-4804-8416-765039343b61.png rename to src/examples/2D Physics (JavaScript)/img/i37dfad62-8372-4804-8416-765039343b61.png diff --git a/src/examples/2DPhysics/img/i3a4eba8d-8b33-478e-95e5-3833099c1a03.png b/src/examples/2D Physics (JavaScript)/img/i3a4eba8d-8b33-478e-95e5-3833099c1a03.png similarity index 100% rename from src/examples/2DPhysics/img/i3a4eba8d-8b33-478e-95e5-3833099c1a03.png rename to src/examples/2D Physics (JavaScript)/img/i3a4eba8d-8b33-478e-95e5-3833099c1a03.png diff --git a/src/examples/2DPhysics/img/i41f7c3b3-abc8-4940-8919-9114a884d7f2.png b/src/examples/2D Physics (JavaScript)/img/i41f7c3b3-abc8-4940-8919-9114a884d7f2.png similarity index 100% rename from src/examples/2DPhysics/img/i41f7c3b3-abc8-4940-8919-9114a884d7f2.png rename to src/examples/2D Physics (JavaScript)/img/i41f7c3b3-abc8-4940-8919-9114a884d7f2.png diff --git a/src/examples/2DPhysics/img/i56ab43ae-1b27-4b5e-9e49-fbbe74d42597.png b/src/examples/2D Physics (JavaScript)/img/i56ab43ae-1b27-4b5e-9e49-fbbe74d42597.png similarity index 100% rename from src/examples/2DPhysics/img/i56ab43ae-1b27-4b5e-9e49-fbbe74d42597.png rename to src/examples/2D Physics (JavaScript)/img/i56ab43ae-1b27-4b5e-9e49-fbbe74d42597.png diff --git a/src/examples/2DPhysics/img/i6c8a3edf-d5fe-4916-b63c-2201c099d28f.png b/src/examples/2D Physics (JavaScript)/img/i6c8a3edf-d5fe-4916-b63c-2201c099d28f.png similarity index 100% rename from src/examples/2DPhysics/img/i6c8a3edf-d5fe-4916-b63c-2201c099d28f.png rename to src/examples/2D Physics (JavaScript)/img/i6c8a3edf-d5fe-4916-b63c-2201c099d28f.png diff --git a/src/examples/2DPhysics/img/i8a5f385a-d547-4d2d-9641-b1856738c62a.png b/src/examples/2D Physics (JavaScript)/img/i8a5f385a-d547-4d2d-9641-b1856738c62a.png similarity index 100% rename from src/examples/2DPhysics/img/i8a5f385a-d547-4d2d-9641-b1856738c62a.png rename to src/examples/2D Physics (JavaScript)/img/i8a5f385a-d547-4d2d-9641-b1856738c62a.png diff --git a/src/examples/2DPhysics/img/i9afd54d7-1265-4ba0-b5de-5226b3c7e2fb.png b/src/examples/2D Physics (JavaScript)/img/i9afd54d7-1265-4ba0-b5de-5226b3c7e2fb.png similarity index 100% rename from src/examples/2DPhysics/img/i9afd54d7-1265-4ba0-b5de-5226b3c7e2fb.png rename to src/examples/2D Physics (JavaScript)/img/i9afd54d7-1265-4ba0-b5de-5226b3c7e2fb.png diff --git a/src/examples/2DPhysics/img/iWJ554pph1tft1W.png b/src/examples/2D Physics (JavaScript)/img/iWJ554pph1tft1W.png similarity index 100% rename from src/examples/2DPhysics/img/iWJ554pph1tft1W.png rename to src/examples/2D Physics (JavaScript)/img/iWJ554pph1tft1W.png diff --git a/src/examples/2DPhysics/img/iabdeba09-af47-4b39-a276-fa2e59b164aa.png b/src/examples/2D Physics (JavaScript)/img/iabdeba09-af47-4b39-a276-fa2e59b164aa.png similarity index 100% rename from src/examples/2DPhysics/img/iabdeba09-af47-4b39-a276-fa2e59b164aa.png rename to src/examples/2D Physics (JavaScript)/img/iabdeba09-af47-4b39-a276-fa2e59b164aa.png diff --git a/src/examples/2DPhysics/img/ic4d4030a-b640-44be-bded-26a5c030f542.png b/src/examples/2D Physics (JavaScript)/img/ic4d4030a-b640-44be-bded-26a5c030f542.png similarity index 100% rename from src/examples/2DPhysics/img/ic4d4030a-b640-44be-bded-26a5c030f542.png rename to src/examples/2D Physics (JavaScript)/img/ic4d4030a-b640-44be-bded-26a5c030f542.png diff --git a/src/examples/2DPhysics/img/if6a40cf4-e9c0-47ff-afa8-6cdc259ef17e.png b/src/examples/2D Physics (JavaScript)/img/if6a40cf4-e9c0-47ff-afa8-6cdc259ef17e.png similarity index 100% rename from src/examples/2DPhysics/img/if6a40cf4-e9c0-47ff-afa8-6cdc259ef17e.png rename to src/examples/2D Physics (JavaScript)/img/if6a40cf4-e9c0-47ff-afa8-6cdc259ef17e.png diff --git a/src/examples/2DPhysics/img/if878c588-3c26-486b-a20f-b23ffab4d579.png b/src/examples/2D Physics (JavaScript)/img/if878c588-3c26-486b-a20f-b23ffab4d579.png similarity index 100% rename from src/examples/2DPhysics/img/if878c588-3c26-486b-a20f-b23ffab4d579.png rename to src/examples/2D Physics (JavaScript)/img/if878c588-3c26-486b-a20f-b23ffab4d579.png diff --git a/src/examples/2DPhysics/img/ifc52b049-910a-4e96-adcf-378553c0818c.png b/src/examples/2D Physics (JavaScript)/img/ifc52b049-910a-4e96-adcf-378553c0818c.png similarity index 100% rename from src/examples/2DPhysics/img/ifc52b049-910a-4e96-adcf-378553c0818c.png rename to src/examples/2D Physics (JavaScript)/img/ifc52b049-910a-4e96-adcf-378553c0818c.png diff --git a/src/examples/2DPhysics/img/im4gCbzCRD2DmNc.png b/src/examples/2D Physics (JavaScript)/img/im4gCbzCRD2DmNc.png similarity index 100% rename from src/examples/2DPhysics/img/im4gCbzCRD2DmNc.png rename to src/examples/2D Physics (JavaScript)/img/im4gCbzCRD2DmNc.png diff --git a/src/examples/2DPhysics/img/iwHD1gw8Jfdzk2k.png b/src/examples/2D Physics (JavaScript)/img/iwHD1gw8Jfdzk2k.png similarity index 100% rename from src/examples/2DPhysics/img/iwHD1gw8Jfdzk2k.png rename to src/examples/2D Physics (JavaScript)/img/iwHD1gw8Jfdzk2k.png diff --git a/src/examples/2DPhysics/img/splash.png b/src/examples/2D Physics (JavaScript)/img/splash.png similarity index 100% rename from src/examples/2DPhysics/img/splash.png rename to src/examples/2D Physics (JavaScript)/img/splash.png diff --git a/src/examples/2DPhysics/snd/s3142b705-6de5-4f57-9b70-c9bc3fb4cdad_rg8czqgBM5dmzT.ogg b/src/examples/2D Physics (JavaScript)/snd/s3142b705-6de5-4f57-9b70-c9bc3fb4cdad_rg8czqgBM5dmzT.ogg similarity index 100% rename from src/examples/2DPhysics/snd/s3142b705-6de5-4f57-9b70-c9bc3fb4cdad_rg8czqgBM5dmzT.ogg rename to src/examples/2D Physics (JavaScript)/snd/s3142b705-6de5-4f57-9b70-c9bc3fb4cdad_rg8czqgBM5dmzT.ogg diff --git a/src/examples/2DPhysics/snd/scbca4dd5-7369-48d5-b3b7-e9b0055e2eda_9rQwm9MWqn95Kt.ogg b/src/examples/2D Physics (JavaScript)/snd/scbca4dd5-7369-48d5-b3b7-e9b0055e2eda_9rQwm9MWqn95Kt.ogg similarity index 100% rename from src/examples/2DPhysics/snd/scbca4dd5-7369-48d5-b3b7-e9b0055e2eda_9rQwm9MWqn95Kt.ogg rename to src/examples/2D Physics (JavaScript)/snd/scbca4dd5-7369-48d5-b3b7-e9b0055e2eda_9rQwm9MWqn95Kt.ogg diff --git a/src/examples/2DPhysics/snd/sccfe7f50-d4d3-4570-95e9-75d5d73bef0a_93fkPGNF7MhgPF.ogg b/src/examples/2D Physics (JavaScript)/snd/sccfe7f50-d4d3-4570-95e9-75d5d73bef0a_93fkPGNF7MhgPF.ogg similarity index 100% rename from src/examples/2DPhysics/snd/sccfe7f50-d4d3-4570-95e9-75d5d73bef0a_93fkPGNF7MhgPF.ogg rename to src/examples/2D Physics (JavaScript)/snd/sccfe7f50-d4d3-4570-95e9-75d5d73bef0a_93fkPGNF7MhgPF.ogg diff --git a/src/examples/catsteroids.ict b/src/examples/Catsteroids (JavaScript).ict similarity index 98% rename from src/examples/catsteroids.ict rename to src/examples/Catsteroids (JavaScript).ict index 7887d0b93..bf4ca2ad8 100644 --- a/src/examples/catsteroids.ict +++ b/src/examples/Catsteroids (JavaScript).ict @@ -45,6 +45,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: e1452137-8cfa-4eec-b54a-0f2660326b48 accent: '#446adb' @@ -109,7 +112,7 @@ scripts: }); }); }; -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 actions: - name: Shoot methods: @@ -228,6 +231,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: GameController depth: 0 uid: ca579f27-f97b-4ca2-98f6-c1c3e13acad5 @@ -302,6 +306,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: AbstractBonus depth: 3 uid: bc01cee1-1b8b-4418-aeb9-a7c5eac2cd51 @@ -392,6 +397,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: InGame width: 1920 height: 1080 @@ -538,6 +544,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: MainMenu onstep: '' ondraw: '' @@ -650,6 +657,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: RetryScreen onstep: '' ondraw: '' @@ -771,6 +779,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: BossTestingRoom onstep: '' onleave: '' @@ -989,6 +998,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: VictoryScreen onstep: '' ondraw: '' @@ -1127,6 +1137,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Music_MainMenu uid: c5397f40-b674-4bfe-a500-91f32466e49b lastmod: 1703596944847 @@ -1178,6 +1189,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Music_MainTheme uid: 8759a7a8-ffb1-4998-ad6f-ae7300b90d3c lastmod: 1703596214029 @@ -1229,6 +1243,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Music_BossTheme uid: 97158431-4c4f-4f9c-96b9-06da025fb98a lastmod: 1703596214030 @@ -1280,6 +1297,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Background_Blue untill: 0 grid: @@ -1868,6 +1888,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: PlayerShip_Blue untill: 0 grid: @@ -2060,6 +2081,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Laser_Bolt_Blue depth: 0 uid: 912af24f-1569-46a3-9194-fbf0384f3b0e @@ -2100,6 +2122,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Laser_Simple_Blue depth: -1 uid: 92e6ec14-1de0-483a-84b8-a8669ac65937 @@ -2140,6 +2163,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Laser_Simple_Blue untill: 0 grid: @@ -2942,6 +2966,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Enemy_Bomber depth: 3 uid: ebfeaaab-f16a-48fa-b97c-687945f99668 @@ -3012,6 +3037,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Enemy_Shooter depth: 2 uid: 500fd472-19aa-41a0-9504-123c37540702 @@ -3078,6 +3104,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Enemy_Wiggler depth: 2 uid: 9d0992a4-d0ef-4c5e-9d17-2e5167f26598 @@ -3145,6 +3172,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: EnemyBullet depth: -1 uid: 65a71d76-039a-4e20-8433-d20277dd2402 @@ -3186,6 +3214,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Laser_Cross_Red depth: 0 uid: 45f606db-1ce3-4b21-bc14-b84e35543509 @@ -3231,6 +3260,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: behavior name: EnemyShip behaviorType: template @@ -3304,6 +3334,7 @@ assets: required: true lastmod: 1703598039523 uid: 3jpbwqRFrpJb1K + extendTypes: '' - type: folder uid: kkmcqJcKBkFMTG colorClass: act @@ -3362,6 +3393,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Bonus uid: c55e02d8-e533-4126-b0d8-b5164416d0d5 lastmod: 1703596214027 @@ -3413,6 +3447,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Explosion_01 uid: 17ef15ea-b246-474e-9e50-a9211c3281d6 lastmod: 1703596214028 @@ -3464,6 +3501,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Explosion_02 uid: ba1c4845-8f8e-4326-a3c4-5c7d979d0a98 lastmod: 1703596214028 @@ -3515,6 +3555,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Explosion_03 uid: 8104f996-d422-4157-921f-76e2ffff3b49 lastmod: 1703596214028 @@ -3566,6 +3609,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Laser_Big uid: fe3a3bb6-74ac-4835-b9f3-6c03cf8fd0b0 lastmod: 1703596214027 @@ -3617,6 +3663,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Laser_Medium uid: 1abe65bd-fd7f-4101-803d-28fa73e21732 lastmod: 1703596905263 @@ -3668,6 +3717,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Laser_Small uid: 684d983f-9827-4ac8-9915-bd498154c5f4 lastmod: 1703596214026 @@ -3719,6 +3771,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: SlowmoEffect uid: db12b1db-1b93-45eb-84f4-a14c131c8ca0 lastmod: 1703596902215 @@ -3770,6 +3825,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - type: folder uid: LTGTtn2c9z77Ng colorClass: act @@ -5660,6 +5718,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Button_Shoot depth: 0 uid: b334b5ec-69b4-4c0d-bd50-709cf9bfa60d @@ -5701,6 +5760,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: ScoreText fill: type: '0' @@ -5725,6 +5785,7 @@ assets: blur: 10 lastmod: 1703600723557 type: style + typeface: -1 - name: Blue12 uid: dea27cc4-bf65-4501-b855-06cbfc835321 origname: s2 @@ -5746,6 +5807,7 @@ assets: x: -2 'y': 2 blur: 10 + typeface: -1 - name: OhNo depth: 0 uid: a6d37145-b35c-42d2-95c6-765069857ada @@ -5771,6 +5833,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Button_Shoot untill: 0 grid: @@ -6051,6 +6114,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Healthbar_Base_Player depth: 0 uid: 1011221c-4f7b-45e7-b45a-ce886851d32c @@ -6122,6 +6186,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: RetryButton depth: 0 uid: 73759c16-fba4-4134-b048-e53aa4d2f34b @@ -6150,6 +6215,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Logo depth: 0 uid: 319c6995-59f3-4267-a1de-cf58f77614d3 @@ -6189,6 +6255,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Victory depth: 0 uid: ffbec9fc-299c-4aea-a4f1-1c4b27859fb6 @@ -6232,6 +6299,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: StartButton depth: 0 uid: 972bb4d9-7cfc-4dbe-bc30-883562271057 @@ -6261,6 +6329,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Healthbar_Bar untill: 0 grid: @@ -6393,6 +6462,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - name: UI_Layer oncreate: '' onstep: '' @@ -6446,6 +6516,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - type: template baseClass: Text name: ScoreLabel @@ -6472,6 +6543,7 @@ assets: behaviors: [] textStyle: 7da08700-988f-456d-b753-89dd1f74e741 defaultText: 'Score: 0' + extendTypes: '' - type: template baseClass: Text name: SmallLabel @@ -6497,10 +6569,8 @@ assets: uid: 7KPpNjB8qk73TJ behaviors: [] textStyle: dea27cc4-bf65-4501-b855-06cbfc835321 - - type: font - typefaceName: PressStart2P - weight: '400' - italic: false + extendTypes: '' + - type: typeface origname: f8Q7GFCD51PWH6L.ttf lastmod: 1703600136362 bitmapFont: false @@ -6510,3 +6580,10 @@ assets: - allInFont customCharset: '' uid: 8Q7GFCD51PWH6L + fonts: + - weight: '400' + italic: false + uid: 8Q7GFCD51PWH6L + origname: f8Q7GFCD51PWH6L.ttf + name: PressStart2P +globalVars: [] diff --git a/src/examples/catsteroids/fonts/f8Q7GFCD51PWH6L.ttf b/src/examples/Catsteroids (JavaScript)/fonts/f8Q7GFCD51PWH6L.ttf similarity index 100% rename from src/examples/catsteroids/fonts/f8Q7GFCD51PWH6L.ttf rename to src/examples/Catsteroids (JavaScript)/fonts/f8Q7GFCD51PWH6L.ttf diff --git a/src/examples/catsteroids/img/i048b77d3-e7e3-4817-99ee-8b7c0a6da8bf.png b/src/examples/Catsteroids (JavaScript)/img/i048b77d3-e7e3-4817-99ee-8b7c0a6da8bf.png similarity index 100% rename from src/examples/catsteroids/img/i048b77d3-e7e3-4817-99ee-8b7c0a6da8bf.png rename to src/examples/Catsteroids (JavaScript)/img/i048b77d3-e7e3-4817-99ee-8b7c0a6da8bf.png diff --git a/src/examples/catsteroids/img/i071162b9-d836-4145-9515-586ce289ef14.png b/src/examples/Catsteroids (JavaScript)/img/i071162b9-d836-4145-9515-586ce289ef14.png similarity index 100% rename from src/examples/catsteroids/img/i071162b9-d836-4145-9515-586ce289ef14.png rename to src/examples/Catsteroids (JavaScript)/img/i071162b9-d836-4145-9515-586ce289ef14.png diff --git a/src/examples/catsteroids/img/i09da6761-b1dd-49bb-9560-69c639bc3167.png b/src/examples/Catsteroids (JavaScript)/img/i09da6761-b1dd-49bb-9560-69c639bc3167.png similarity index 100% rename from src/examples/catsteroids/img/i09da6761-b1dd-49bb-9560-69c639bc3167.png rename to src/examples/Catsteroids (JavaScript)/img/i09da6761-b1dd-49bb-9560-69c639bc3167.png diff --git a/src/examples/catsteroids/img/i0abe6432-3fe2-4155-a39c-f054bb898c6e.png b/src/examples/Catsteroids (JavaScript)/img/i0abe6432-3fe2-4155-a39c-f054bb898c6e.png similarity index 100% rename from src/examples/catsteroids/img/i0abe6432-3fe2-4155-a39c-f054bb898c6e.png rename to src/examples/Catsteroids (JavaScript)/img/i0abe6432-3fe2-4155-a39c-f054bb898c6e.png diff --git a/src/examples/catsteroids/img/i13433dd6-9fec-4244-8188-d6ec14a51974.png b/src/examples/Catsteroids (JavaScript)/img/i13433dd6-9fec-4244-8188-d6ec14a51974.png similarity index 100% rename from src/examples/catsteroids/img/i13433dd6-9fec-4244-8188-d6ec14a51974.png rename to src/examples/Catsteroids (JavaScript)/img/i13433dd6-9fec-4244-8188-d6ec14a51974.png diff --git a/src/examples/catsteroids/img/i16c209a9-25b2-41e4-b0d5-21cb22fd1421.png b/src/examples/Catsteroids (JavaScript)/img/i16c209a9-25b2-41e4-b0d5-21cb22fd1421.png similarity index 100% rename from src/examples/catsteroids/img/i16c209a9-25b2-41e4-b0d5-21cb22fd1421.png rename to src/examples/Catsteroids (JavaScript)/img/i16c209a9-25b2-41e4-b0d5-21cb22fd1421.png diff --git a/src/examples/catsteroids/img/i1a904383-2edd-4435-a37b-17148f44e0e0.png b/src/examples/Catsteroids (JavaScript)/img/i1a904383-2edd-4435-a37b-17148f44e0e0.png similarity index 100% rename from src/examples/catsteroids/img/i1a904383-2edd-4435-a37b-17148f44e0e0.png rename to src/examples/Catsteroids (JavaScript)/img/i1a904383-2edd-4435-a37b-17148f44e0e0.png diff --git a/src/examples/catsteroids/img/i25fb712b-0aca-4b18-8e10-7c545d4bca8d.png b/src/examples/Catsteroids (JavaScript)/img/i25fb712b-0aca-4b18-8e10-7c545d4bca8d.png similarity index 100% rename from src/examples/catsteroids/img/i25fb712b-0aca-4b18-8e10-7c545d4bca8d.png rename to src/examples/Catsteroids (JavaScript)/img/i25fb712b-0aca-4b18-8e10-7c545d4bca8d.png diff --git a/src/examples/catsteroids/img/i2a454e11-3441-4f57-bfb6-ce837acd7881.png b/src/examples/Catsteroids (JavaScript)/img/i2a454e11-3441-4f57-bfb6-ce837acd7881.png similarity index 100% rename from src/examples/catsteroids/img/i2a454e11-3441-4f57-bfb6-ce837acd7881.png rename to src/examples/Catsteroids (JavaScript)/img/i2a454e11-3441-4f57-bfb6-ce837acd7881.png diff --git a/src/examples/catsteroids/img/i2aa65cbc-101f-4bfd-b1e0-b5106ab0dc99.png b/src/examples/Catsteroids (JavaScript)/img/i2aa65cbc-101f-4bfd-b1e0-b5106ab0dc99.png similarity index 100% rename from src/examples/catsteroids/img/i2aa65cbc-101f-4bfd-b1e0-b5106ab0dc99.png rename to src/examples/Catsteroids (JavaScript)/img/i2aa65cbc-101f-4bfd-b1e0-b5106ab0dc99.png diff --git a/src/examples/catsteroids/img/i3935eebf-4e66-456f-9ca8-e2dc1d6a9383.png b/src/examples/Catsteroids (JavaScript)/img/i3935eebf-4e66-456f-9ca8-e2dc1d6a9383.png similarity index 100% rename from src/examples/catsteroids/img/i3935eebf-4e66-456f-9ca8-e2dc1d6a9383.png rename to src/examples/Catsteroids (JavaScript)/img/i3935eebf-4e66-456f-9ca8-e2dc1d6a9383.png diff --git a/src/examples/catsteroids/img/i3d256840-cbd1-4241-a8c2-4d5432e6b9ce.png b/src/examples/Catsteroids (JavaScript)/img/i3d256840-cbd1-4241-a8c2-4d5432e6b9ce.png similarity index 100% rename from src/examples/catsteroids/img/i3d256840-cbd1-4241-a8c2-4d5432e6b9ce.png rename to src/examples/Catsteroids (JavaScript)/img/i3d256840-cbd1-4241-a8c2-4d5432e6b9ce.png diff --git a/src/examples/catsteroids/img/i3d364ae5-40e9-4c13-b1c7-9e0415273865.png b/src/examples/Catsteroids (JavaScript)/img/i3d364ae5-40e9-4c13-b1c7-9e0415273865.png similarity index 100% rename from src/examples/catsteroids/img/i3d364ae5-40e9-4c13-b1c7-9e0415273865.png rename to src/examples/Catsteroids (JavaScript)/img/i3d364ae5-40e9-4c13-b1c7-9e0415273865.png diff --git a/src/examples/catsteroids/img/i43c9e15f-1c71-48a0-96fb-fb5ee2d24e59.png b/src/examples/Catsteroids (JavaScript)/img/i43c9e15f-1c71-48a0-96fb-fb5ee2d24e59.png similarity index 100% rename from src/examples/catsteroids/img/i43c9e15f-1c71-48a0-96fb-fb5ee2d24e59.png rename to src/examples/Catsteroids (JavaScript)/img/i43c9e15f-1c71-48a0-96fb-fb5ee2d24e59.png diff --git a/src/examples/catsteroids/img/i461716ca-52e1-4465-b7bf-d9fd964867a6.png b/src/examples/Catsteroids (JavaScript)/img/i461716ca-52e1-4465-b7bf-d9fd964867a6.png similarity index 100% rename from src/examples/catsteroids/img/i461716ca-52e1-4465-b7bf-d9fd964867a6.png rename to src/examples/Catsteroids (JavaScript)/img/i461716ca-52e1-4465-b7bf-d9fd964867a6.png diff --git a/src/examples/catsteroids/img/i4b86d5c4-ae3c-4edf-90d7-79a6778e9a29.png b/src/examples/Catsteroids (JavaScript)/img/i4b86d5c4-ae3c-4edf-90d7-79a6778e9a29.png similarity index 100% rename from src/examples/catsteroids/img/i4b86d5c4-ae3c-4edf-90d7-79a6778e9a29.png rename to src/examples/Catsteroids (JavaScript)/img/i4b86d5c4-ae3c-4edf-90d7-79a6778e9a29.png diff --git a/src/examples/catsteroids/img/i5180fa6f-778b-44ac-883f-0f55a294292f.png b/src/examples/Catsteroids (JavaScript)/img/i5180fa6f-778b-44ac-883f-0f55a294292f.png similarity index 100% rename from src/examples/catsteroids/img/i5180fa6f-778b-44ac-883f-0f55a294292f.png rename to src/examples/Catsteroids (JavaScript)/img/i5180fa6f-778b-44ac-883f-0f55a294292f.png diff --git a/src/examples/catsteroids/img/i6272c8f2-f8ff-4802-85ae-06daa7013296.png b/src/examples/Catsteroids (JavaScript)/img/i6272c8f2-f8ff-4802-85ae-06daa7013296.png similarity index 100% rename from src/examples/catsteroids/img/i6272c8f2-f8ff-4802-85ae-06daa7013296.png rename to src/examples/Catsteroids (JavaScript)/img/i6272c8f2-f8ff-4802-85ae-06daa7013296.png diff --git a/src/examples/catsteroids/img/i771c5c1f-ffdc-4b50-a1ce-aed472e44557.png b/src/examples/Catsteroids (JavaScript)/img/i771c5c1f-ffdc-4b50-a1ce-aed472e44557.png similarity index 100% rename from src/examples/catsteroids/img/i771c5c1f-ffdc-4b50-a1ce-aed472e44557.png rename to src/examples/Catsteroids (JavaScript)/img/i771c5c1f-ffdc-4b50-a1ce-aed472e44557.png diff --git a/src/examples/catsteroids/img/i7b0c966f-2635-4138-8628-2e634af72e2f.png b/src/examples/Catsteroids (JavaScript)/img/i7b0c966f-2635-4138-8628-2e634af72e2f.png similarity index 100% rename from src/examples/catsteroids/img/i7b0c966f-2635-4138-8628-2e634af72e2f.png rename to src/examples/Catsteroids (JavaScript)/img/i7b0c966f-2635-4138-8628-2e634af72e2f.png diff --git a/src/examples/catsteroids/img/i847c402c-dbd5-4971-ba6d-f2fca6d156bd.png b/src/examples/Catsteroids (JavaScript)/img/i847c402c-dbd5-4971-ba6d-f2fca6d156bd.png similarity index 100% rename from src/examples/catsteroids/img/i847c402c-dbd5-4971-ba6d-f2fca6d156bd.png rename to src/examples/Catsteroids (JavaScript)/img/i847c402c-dbd5-4971-ba6d-f2fca6d156bd.png diff --git a/src/examples/catsteroids/img/i850854a8-47dd-4041-9412-b4cca854dd90.png b/src/examples/Catsteroids (JavaScript)/img/i850854a8-47dd-4041-9412-b4cca854dd90.png similarity index 100% rename from src/examples/catsteroids/img/i850854a8-47dd-4041-9412-b4cca854dd90.png rename to src/examples/Catsteroids (JavaScript)/img/i850854a8-47dd-4041-9412-b4cca854dd90.png diff --git a/src/examples/catsteroids/img/i91f10290-e71c-4052-a64b-7aec34086e64.png b/src/examples/Catsteroids (JavaScript)/img/i91f10290-e71c-4052-a64b-7aec34086e64.png similarity index 100% rename from src/examples/catsteroids/img/i91f10290-e71c-4052-a64b-7aec34086e64.png rename to src/examples/Catsteroids (JavaScript)/img/i91f10290-e71c-4052-a64b-7aec34086e64.png diff --git a/src/examples/catsteroids/img/i968baf79-5ff3-443b-8834-fa3b55638500.png b/src/examples/Catsteroids (JavaScript)/img/i968baf79-5ff3-443b-8834-fa3b55638500.png similarity index 100% rename from src/examples/catsteroids/img/i968baf79-5ff3-443b-8834-fa3b55638500.png rename to src/examples/Catsteroids (JavaScript)/img/i968baf79-5ff3-443b-8834-fa3b55638500.png diff --git a/src/examples/catsteroids/img/ia27fae91-d007-4683-910b-020b4fb76d72.png b/src/examples/Catsteroids (JavaScript)/img/ia27fae91-d007-4683-910b-020b4fb76d72.png similarity index 100% rename from src/examples/catsteroids/img/ia27fae91-d007-4683-910b-020b4fb76d72.png rename to src/examples/Catsteroids (JavaScript)/img/ia27fae91-d007-4683-910b-020b4fb76d72.png diff --git a/src/examples/catsteroids/img/iafba4114-e7bc-4b35-8386-d9ca108ca777.png b/src/examples/Catsteroids (JavaScript)/img/iafba4114-e7bc-4b35-8386-d9ca108ca777.png similarity index 100% rename from src/examples/catsteroids/img/iafba4114-e7bc-4b35-8386-d9ca108ca777.png rename to src/examples/Catsteroids (JavaScript)/img/iafba4114-e7bc-4b35-8386-d9ca108ca777.png diff --git a/src/examples/catsteroids/img/ibbc6028c-d720-4f9f-be65-ced741e2ac9a.png b/src/examples/Catsteroids (JavaScript)/img/ibbc6028c-d720-4f9f-be65-ced741e2ac9a.png similarity index 100% rename from src/examples/catsteroids/img/ibbc6028c-d720-4f9f-be65-ced741e2ac9a.png rename to src/examples/Catsteroids (JavaScript)/img/ibbc6028c-d720-4f9f-be65-ced741e2ac9a.png diff --git a/src/examples/catsteroids/img/ic12edc06-ad3f-49f4-b9d4-3d33226e9ecc.png b/src/examples/Catsteroids (JavaScript)/img/ic12edc06-ad3f-49f4-b9d4-3d33226e9ecc.png similarity index 100% rename from src/examples/catsteroids/img/ic12edc06-ad3f-49f4-b9d4-3d33226e9ecc.png rename to src/examples/Catsteroids (JavaScript)/img/ic12edc06-ad3f-49f4-b9d4-3d33226e9ecc.png diff --git a/src/examples/catsteroids/img/ic7305cd4-3a22-4f4d-b42e-adbd8651ffe0.png b/src/examples/Catsteroids (JavaScript)/img/ic7305cd4-3a22-4f4d-b42e-adbd8651ffe0.png similarity index 100% rename from src/examples/catsteroids/img/ic7305cd4-3a22-4f4d-b42e-adbd8651ffe0.png rename to src/examples/Catsteroids (JavaScript)/img/ic7305cd4-3a22-4f4d-b42e-adbd8651ffe0.png diff --git a/src/examples/catsteroids/img/id4d167ee-e343-4af8-857b-691906585543.png b/src/examples/Catsteroids (JavaScript)/img/id4d167ee-e343-4af8-857b-691906585543.png similarity index 100% rename from src/examples/catsteroids/img/id4d167ee-e343-4af8-857b-691906585543.png rename to src/examples/Catsteroids (JavaScript)/img/id4d167ee-e343-4af8-857b-691906585543.png diff --git a/src/examples/catsteroids/img/id8204c3b-f004-4dc4-b7bb-2727c81b8855.png b/src/examples/Catsteroids (JavaScript)/img/id8204c3b-f004-4dc4-b7bb-2727c81b8855.png similarity index 100% rename from src/examples/catsteroids/img/id8204c3b-f004-4dc4-b7bb-2727c81b8855.png rename to src/examples/Catsteroids (JavaScript)/img/id8204c3b-f004-4dc4-b7bb-2727c81b8855.png diff --git a/src/examples/catsteroids/img/idc0d71ec-6da8-40e8-afe8-90c81f7f269a.png b/src/examples/Catsteroids (JavaScript)/img/idc0d71ec-6da8-40e8-afe8-90c81f7f269a.png similarity index 100% rename from src/examples/catsteroids/img/idc0d71ec-6da8-40e8-afe8-90c81f7f269a.png rename to src/examples/Catsteroids (JavaScript)/img/idc0d71ec-6da8-40e8-afe8-90c81f7f269a.png diff --git a/src/examples/catsteroids/img/ie1452137-8cfa-4eec-b54a-0f2660326b48.png b/src/examples/Catsteroids (JavaScript)/img/ie1452137-8cfa-4eec-b54a-0f2660326b48.png similarity index 100% rename from src/examples/catsteroids/img/ie1452137-8cfa-4eec-b54a-0f2660326b48.png rename to src/examples/Catsteroids (JavaScript)/img/ie1452137-8cfa-4eec-b54a-0f2660326b48.png diff --git a/src/examples/catsteroids/img/ie6148099-65e7-4d2b-acf1-3e6b3a8fc033.png b/src/examples/Catsteroids (JavaScript)/img/ie6148099-65e7-4d2b-acf1-3e6b3a8fc033.png similarity index 100% rename from src/examples/catsteroids/img/ie6148099-65e7-4d2b-acf1-3e6b3a8fc033.png rename to src/examples/Catsteroids (JavaScript)/img/ie6148099-65e7-4d2b-acf1-3e6b3a8fc033.png diff --git a/src/examples/catsteroids/img/ie81fc53e-4f0a-443d-a4fb-e5e11a4a98d2.png b/src/examples/Catsteroids (JavaScript)/img/ie81fc53e-4f0a-443d-a4fb-e5e11a4a98d2.png similarity index 100% rename from src/examples/catsteroids/img/ie81fc53e-4f0a-443d-a4fb-e5e11a4a98d2.png rename to src/examples/Catsteroids (JavaScript)/img/ie81fc53e-4f0a-443d-a4fb-e5e11a4a98d2.png diff --git a/src/examples/catsteroids/img/ie86811b4-8d80-4d2a-8003-b490165fa078.png b/src/examples/Catsteroids (JavaScript)/img/ie86811b4-8d80-4d2a-8003-b490165fa078.png similarity index 100% rename from src/examples/catsteroids/img/ie86811b4-8d80-4d2a-8003-b490165fa078.png rename to src/examples/Catsteroids (JavaScript)/img/ie86811b4-8d80-4d2a-8003-b490165fa078.png diff --git a/src/examples/catsteroids/img/if52c0c03-bee0-4984-a936-08aeb0dab1eb.png b/src/examples/Catsteroids (JavaScript)/img/if52c0c03-bee0-4984-a936-08aeb0dab1eb.png similarity index 100% rename from src/examples/catsteroids/img/if52c0c03-bee0-4984-a936-08aeb0dab1eb.png rename to src/examples/Catsteroids (JavaScript)/img/if52c0c03-bee0-4984-a936-08aeb0dab1eb.png diff --git a/src/examples/catsteroids/img/ifc3e2f9b-61af-4ae4-9375-dcfae65f6a34.png b/src/examples/Catsteroids (JavaScript)/img/ifc3e2f9b-61af-4ae4-9375-dcfae65f6a34.png similarity index 100% rename from src/examples/catsteroids/img/ifc3e2f9b-61af-4ae4-9375-dcfae65f6a34.png rename to src/examples/Catsteroids (JavaScript)/img/ifc3e2f9b-61af-4ae4-9375-dcfae65f6a34.png diff --git a/src/examples/catsteroids/img/splash.png b/src/examples/Catsteroids (JavaScript)/img/splash.png similarity index 100% rename from src/examples/catsteroids/img/splash.png rename to src/examples/Catsteroids (JavaScript)/img/splash.png diff --git a/src/examples/catsteroids/snd/s17ef15ea-b246-474e-9e50-a9211c3281d6_p6gD6nfzD3kPb9.wav b/src/examples/Catsteroids (JavaScript)/snd/s17ef15ea-b246-474e-9e50-a9211c3281d6_p6gD6nfzD3kPb9.wav similarity index 100% rename from src/examples/catsteroids/snd/s17ef15ea-b246-474e-9e50-a9211c3281d6_p6gD6nfzD3kPb9.wav rename to src/examples/Catsteroids (JavaScript)/snd/s17ef15ea-b246-474e-9e50-a9211c3281d6_p6gD6nfzD3kPb9.wav diff --git a/src/examples/catsteroids/snd/s1abe65bd-fd7f-4101-803d-28fa73e21732_TzgGTMQRpc769T.mp3 b/src/examples/Catsteroids (JavaScript)/snd/s1abe65bd-fd7f-4101-803d-28fa73e21732_TzgGTMQRpc769T.mp3 similarity index 100% rename from src/examples/catsteroids/snd/s1abe65bd-fd7f-4101-803d-28fa73e21732_TzgGTMQRpc769T.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/s1abe65bd-fd7f-4101-803d-28fa73e21732_TzgGTMQRpc769T.mp3 diff --git a/src/examples/catsteroids/snd/s684d983f-9827-4ac8-9915-bd498154c5f4_5Ng78dkfHLhnj4.mp3 b/src/examples/Catsteroids (JavaScript)/snd/s684d983f-9827-4ac8-9915-bd498154c5f4_5Ng78dkfHLhnj4.mp3 similarity index 100% rename from src/examples/catsteroids/snd/s684d983f-9827-4ac8-9915-bd498154c5f4_5Ng78dkfHLhnj4.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/s684d983f-9827-4ac8-9915-bd498154c5f4_5Ng78dkfHLhnj4.mp3 diff --git a/src/examples/catsteroids/snd/s8.mp3 b/src/examples/Catsteroids (JavaScript)/snd/s8.mp3 similarity index 100% rename from src/examples/catsteroids/snd/s8.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/s8.mp3 diff --git a/src/examples/catsteroids/snd/s8104f996-d422-4157-921f-76e2ffff3b49_KwjtpTGDzD9Djf.wav b/src/examples/Catsteroids (JavaScript)/snd/s8104f996-d422-4157-921f-76e2ffff3b49_KwjtpTGDzD9Djf.wav similarity index 100% rename from src/examples/catsteroids/snd/s8104f996-d422-4157-921f-76e2ffff3b49_KwjtpTGDzD9Djf.wav rename to src/examples/Catsteroids (JavaScript)/snd/s8104f996-d422-4157-921f-76e2ffff3b49_KwjtpTGDzD9Djf.wav diff --git a/src/examples/catsteroids/snd/s8759a7a8-ffb1-4998-ad6f-ae7300b90d3c_JGwc9h1wbgpkqC.mp3 b/src/examples/Catsteroids (JavaScript)/snd/s8759a7a8-ffb1-4998-ad6f-ae7300b90d3c_JGwc9h1wbgpkqC.mp3 similarity index 100% rename from src/examples/catsteroids/snd/s8759a7a8-ffb1-4998-ad6f-ae7300b90d3c_JGwc9h1wbgpkqC.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/s8759a7a8-ffb1-4998-ad6f-ae7300b90d3c_JGwc9h1wbgpkqC.mp3 diff --git a/src/examples/catsteroids/snd/s97158431-4c4f-4f9c-96b9-06da025fb98a_dkDM69zDqGNGHJ.mp3 b/src/examples/Catsteroids (JavaScript)/snd/s97158431-4c4f-4f9c-96b9-06da025fb98a_dkDM69zDqGNGHJ.mp3 similarity index 100% rename from src/examples/catsteroids/snd/s97158431-4c4f-4f9c-96b9-06da025fb98a_dkDM69zDqGNGHJ.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/s97158431-4c4f-4f9c-96b9-06da025fb98a_dkDM69zDqGNGHJ.mp3 diff --git a/src/examples/catsteroids/snd/sba1c4845-8f8e-4326-a3c4-5c7d979d0a98_KQbBKrW3N6br1R.wav b/src/examples/Catsteroids (JavaScript)/snd/sba1c4845-8f8e-4326-a3c4-5c7d979d0a98_KQbBKrW3N6br1R.wav similarity index 100% rename from src/examples/catsteroids/snd/sba1c4845-8f8e-4326-a3c4-5c7d979d0a98_KQbBKrW3N6br1R.wav rename to src/examples/Catsteroids (JavaScript)/snd/sba1c4845-8f8e-4326-a3c4-5c7d979d0a98_KQbBKrW3N6br1R.wav diff --git a/src/examples/catsteroids/snd/sc5397f40-b674-4bfe-a500-91f32466e49b_cJCdndhqHrm3Lz.mp3 b/src/examples/Catsteroids (JavaScript)/snd/sc5397f40-b674-4bfe-a500-91f32466e49b_cJCdndhqHrm3Lz.mp3 similarity index 100% rename from src/examples/catsteroids/snd/sc5397f40-b674-4bfe-a500-91f32466e49b_cJCdndhqHrm3Lz.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/sc5397f40-b674-4bfe-a500-91f32466e49b_cJCdndhqHrm3Lz.mp3 diff --git a/src/examples/catsteroids/snd/sc55e02d8-e533-4126-b0d8-b5164416d0d5_6bTnBPHBznPrRM.wav b/src/examples/Catsteroids (JavaScript)/snd/sc55e02d8-e533-4126-b0d8-b5164416d0d5_6bTnBPHBznPrRM.wav similarity index 100% rename from src/examples/catsteroids/snd/sc55e02d8-e533-4126-b0d8-b5164416d0d5_6bTnBPHBznPrRM.wav rename to src/examples/Catsteroids (JavaScript)/snd/sc55e02d8-e533-4126-b0d8-b5164416d0d5_6bTnBPHBznPrRM.wav diff --git a/src/examples/catsteroids/snd/sc8ee5675-8608-40fa-b04e-ad9ccc36c777_fqqD1h7GL6cfq5.mp3 b/src/examples/Catsteroids (JavaScript)/snd/sc8ee5675-8608-40fa-b04e-ad9ccc36c777_fqqD1h7GL6cfq5.mp3 similarity index 100% rename from src/examples/catsteroids/snd/sc8ee5675-8608-40fa-b04e-ad9ccc36c777_fqqD1h7GL6cfq5.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/sc8ee5675-8608-40fa-b04e-ad9ccc36c777_fqqD1h7GL6cfq5.mp3 diff --git a/src/examples/catsteroids/snd/sdb12b1db-1b93-45eb-84f4-a14c131c8ca0_DPJjCPj27qRwjR.mp3 b/src/examples/Catsteroids (JavaScript)/snd/sdb12b1db-1b93-45eb-84f4-a14c131c8ca0_DPJjCPj27qRwjR.mp3 similarity index 100% rename from src/examples/catsteroids/snd/sdb12b1db-1b93-45eb-84f4-a14c131c8ca0_DPJjCPj27qRwjR.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/sdb12b1db-1b93-45eb-84f4-a14c131c8ca0_DPJjCPj27qRwjR.mp3 diff --git a/src/examples/catsteroids/snd/sfe3a3bb6-74ac-4835-b9f3-6c03cf8fd0b0_7B34fgzg69WPQb.mp3 b/src/examples/Catsteroids (JavaScript)/snd/sfe3a3bb6-74ac-4835-b9f3-6c03cf8fd0b0_7B34fgzg69WPQb.mp3 similarity index 100% rename from src/examples/catsteroids/snd/sfe3a3bb6-74ac-4835-b9f3-6c03cf8fd0b0_7B34fgzg69WPQb.mp3 rename to src/examples/Catsteroids (JavaScript)/snd/sfe3a3bb6-74ac-4835-b9f3-6c03cf8fd0b0_7B34fgzg69WPQb.mp3 diff --git a/src/examples/GameDistribution.ict b/src/examples/GameDistribution.ict deleted file mode 100644 index b94d382aa..000000000 --- a/src/examples/GameDistribution.ict +++ /dev/null @@ -1,275 +0,0 @@ -ctjsVersion: 3.2.0 -notes: /* empty */ -libs: - place: - gridX: 1024 - gridY: 1024 - keyboard.polyfill: {} - sound.howler: {} - keyboard: {} - tween: {} - transition: {} - pointer: - preventdefault: false - startlocked: false - fittoscreen: - mode: scaleFit - gamedistribution: - undefined: '' - gameID: 45f47fe7bf964915afd6b7d87c7637fd - autoInit: true - gdsdkLocale: en - gdpr: false - debugMode: false -textures: - - lastmod: 1667511690381 - type: texture - name: ShowAds - untill: 0 - grid: - - 1 - - 1 - axis: - - 64 - - 16 - marginx: 0 - marginy: 0 - imgWidth: 128 - imgHeight: 32 - width: 128 - height: 32 - offx: 0 - offy: 0 - origname: ifLhp5CzQk9TrHp.png - shape: rect - left: 64 - right: 64 - top: 16 - bottom: 16 - uid: fLhp5CzQk9TrHp - padding: 1 - isBlank: false - group: ! '' - source: >- - C:\Users\ulise\Documents\GDevelop - projects\Gamedistribution-1.2.8-rewarded-latest-working\StartButton3.png -skeletons: [] -templates: - - type: template - name: ShowAds - depth: 0 - texture: fLhp5CzQk9TrHp - playAnimationOnStart: false - loopAnimation: true - animationFPS: 30 - visible: true - events: - - eventKey: OnDraw - code: |- - this.x = ct.camera.width/2; - this.y = ct.camera.height/2 + this.height; - arguments: {} - lib: core - - eventKey: OnPointerClick - code: |- - if (!ct.gamedistribution.adPlaying) { - ct.gamedistribution.showAd(); - } - arguments: {} - lib: core - extends: {} - lastmod: 1667734402988 - uid: h8mt85WFkKJ9wk - blendMode: normal -sounds: - - name: MainMusic - uid: hKcLMCHcwrgPDQ - isMusic: true - type: sound - lastmod: 1667578626642 - origname: shKcLMCHcwrgPDQ.mp3 -styles: - - name: Coins - uid: CnCTQm7fgCgtP6 - origname: sgCgtP6 - font: - family: sans-serif - size: 64 - weight: 400 - italic: false - fill: - type: '0' - color: '#FFD400' - lastmod: 1667641158420 - stroke: - color: '#FFFFFF' - weight: 8 - shadow: - color: '#000000' - x: 2 - 'y': 5 - blur: 5 -fonts: [] -rooms: - - type: room - oncreate: '' - onstep: '' - ondraw: '' - onleave: '' - gridX: 64 - gridY: 64 - diagonalGrid: false - simulate: true - width: 1280 - height: 720 - isUi: true - name: UI_Layer - backgroundColor: '#000000' - restrictCamera: true - backgrounds: [] - copies: - - x: 608 - 'y': 536 - opacity: 1 - tint: 16777215 - scale: - x: 3.5 - 'y': 2.5 - rotation: 0 - uid: h8mt85WFkKJ9wk - exts: {} - customProperties: {} - tiles: [] - extends: {} - lastmod: 1668100981512 - events: - - eventKey: OnRoomStart - code: >+ - ct.room.coins = 0; - - - this.coinsCounter = new PIXI.Text("Coins x:" + ct.room.coins, - ct.styles.get('Coins')); - - this.coinsCounter.x = ct.camera.width/2 - this.coinsCounter.width/2; - - this.coinsCounter.y = ct.camera.height/2 - this.coinsCounter.height; - - this.coinsCounter.anchor.y = 0.5; - - this.addChild(this.coinsCounter); - - - ct.sound.spawn("MainMusic", {loop: true}); - - arguments: {} - lib: core - - eventKey: OnDraw - code: |- - this.coinsCounter.text = "Coins x:" + ct.room.coins - this.coinsCounter.x = ct.camera.width/2 - this.coinsCounter.width/2; - this.coinsCounter.y = ct.camera.height/2 - this.coinsCounter.height; - arguments: {} - lib: core - - eventKey: pausegame - code: |- - if(ct.sound.playing('MainMusic')){ - console.log("Ad is playing so pause the game"); - ct.sound.pause("MainMusic"); - } - arguments: {} - lib: gamedistribution - - eventKey: resumegame - code: |- - if(!ct.sound.playing('MainMusic')){ - console.log("Resume music"); - ct.sound.resume("MainMusic"); - } - arguments: {} - lib: gamedistribution - - eventKey: adfinished - code: ct.room.coins += 1; - arguments: {} - lib: gamedistribution - uid: GbBCHk9k5L862K - follow: -1 - - type: room - oncreate: '' - onstep: '' - ondraw: '' - onleave: '' - gridX: 64 - gridY: 64 - diagonalGrid: false - simulate: true - width: 1280 - height: 720 - isUi: false - name: Room_Mb7r2Q - backgroundColor: '#8C0000' - restrictCamera: false - backgrounds: [] - copies: [] - tiles: [] - extends: {} - lastmod: 1668100936730 - events: - - eventKey: OnRoomStart - code: 'ct.rooms.append(''UI_Layer'', {isUi: true});' - arguments: {} - lib: core - uid: wK4KjJgBMb7r2Q - follow: -1 -actions: - - name: ShowAd - methods: - - code: pointer.Primary -emitterTandems: [] -scripts: [] -starting: 0 -contentTypes: [] -groups: - fonts: [] - textures: [] - styles: [] - rooms: [] - templates: [] - sounds: [] - emitterTandems: [] -settings: - authoring: - author: Ulises Freitas - site: 'https://www.ulisesfreitas.com' - title: Game Distribution Example - version: - - 1 - - 0 - - 0 - versionPostfix: '' - appId: com.ulisesfreitas.ctjsgamedistribution - rendering: - usePixiLegacy: true - maxFPS: 60 - pixelatedrender: false - highDensity: true - desktopMode: maximized - hideCursor: false - mobileScreenOrientation: unspecified - export: - windows: true - linux: true - mac: true - functionWrap: false - codeModifier: none - branding: - accent: '#DB4444' - invertPreloaderScheme: true - icon: -1 - splashScreen: -1 - forceSmoothIcons: false - forceSmoothSplashScreen: false - hideLoadingLogo: false - fps: 30 -palette: [] -startroom: wK4KjJgBMb7r2Q -language: typescript diff --git a/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png b/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png deleted file mode 100644 index 68b2d1df1..000000000 Binary files a/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png_prev.png b/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png_prev.png deleted file mode 100644 index 05fcf6f2e..000000000 Binary files a/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png_prev.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png_prev@2.png b/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png_prev@2.png deleted file mode 100644 index 8e8e9c7e3..000000000 Binary files a/src/examples/GameDistribution/img/ifLhp5CzQk9TrHp.png_prev@2.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/rGbBCHk9k5L862K.png b/src/examples/GameDistribution/img/rGbBCHk9k5L862K.png deleted file mode 100644 index 6a31badb5..000000000 Binary files a/src/examples/GameDistribution/img/rGbBCHk9k5L862K.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/rGbBCHk9k5L862K@r.png b/src/examples/GameDistribution/img/rGbBCHk9k5L862K@r.png deleted file mode 100644 index 02235fd29..000000000 Binary files a/src/examples/GameDistribution/img/rGbBCHk9k5L862K@r.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/rwK4KjJgBMb7r2Q.png b/src/examples/GameDistribution/img/rwK4KjJgBMb7r2Q.png deleted file mode 100644 index e872888ee..000000000 Binary files a/src/examples/GameDistribution/img/rwK4KjJgBMb7r2Q.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/rwK4KjJgBMb7r2Q@r.png b/src/examples/GameDistribution/img/rwK4KjJgBMb7r2Q@r.png deleted file mode 100644 index 03c211c7e..000000000 Binary files a/src/examples/GameDistribution/img/rwK4KjJgBMb7r2Q@r.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/sG9475g_prev.png b/src/examples/GameDistribution/img/sG9475g_prev.png deleted file mode 100644 index 86350600a..000000000 Binary files a/src/examples/GameDistribution/img/sG9475g_prev.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/sG9475g_prev@2.png b/src/examples/GameDistribution/img/sG9475g_prev@2.png deleted file mode 100644 index 86350600a..000000000 Binary files a/src/examples/GameDistribution/img/sG9475g_prev@2.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/sgCgtP6_prev.png b/src/examples/GameDistribution/img/sgCgtP6_prev.png deleted file mode 100644 index 774f2fe51..000000000 Binary files a/src/examples/GameDistribution/img/sgCgtP6_prev.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/sgCgtP6_prev@2.png b/src/examples/GameDistribution/img/sgCgtP6_prev@2.png deleted file mode 100644 index 774f2fe51..000000000 Binary files a/src/examples/GameDistribution/img/sgCgtP6_prev@2.png and /dev/null differ diff --git a/src/examples/GameDistribution/img/splash.png b/src/examples/GameDistribution/img/splash.png deleted file mode 100644 index 03c211c7e..000000000 Binary files a/src/examples/GameDistribution/img/splash.png and /dev/null differ diff --git a/src/examples/GameDistribution/snd/shKcLMCHcwrgPDQ.mp3 b/src/examples/GameDistribution/snd/shKcLMCHcwrgPDQ.mp3 deleted file mode 100644 index 2bb0890d0..000000000 Binary files a/src/examples/GameDistribution/snd/shKcLMCHcwrgPDQ.mp3 and /dev/null differ diff --git a/src/examples/catformer.ict b/src/examples/Greed platformer (JavaScript).ict similarity index 99% rename from src/examples/catformer.ict rename to src/examples/Greed platformer (JavaScript).ict index bfe90e48a..6ee1c5bfd 100644 --- a/src/examples/catformer.ict +++ b/src/examples/Greed platformer (JavaScript).ict @@ -54,6 +54,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: 1da28af4-53f1-4958-82b2-a696778f910f accent: '#446adb' @@ -115,7 +118,7 @@ scripts: depth: 1000 }); } -ctjsVersion: 4.0.0-next-5 +ctjsVersion: 5.0.0 actions: - name: Jump methods: @@ -187,6 +190,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Logs depth: 0 uid: 1026c1c8-90e4-4b93-bb6a-568f53918097 @@ -209,6 +213,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Grass depth: 0 uid: 5ff42cc3-0b4a-47e9-b6f1-06d3b3b91bb0 @@ -231,6 +236,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Spikes depth: 0 uid: 036a2de1-89b0-48e3-b26f-d608ce2079fd @@ -253,6 +259,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Player depth: 0 uid: 00664f77-21c6-4b06-b310-88640b1beaf9 @@ -412,6 +419,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Coin depth: 0 uid: 9402709c-5d0d-4198-9dce-877a5b7c77a2 @@ -441,6 +449,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Greed depth: 0 uid: 2d29a0d5-d88d-493d-bece-8d52ed476273 @@ -462,6 +471,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Slime depth: 0 uid: 1f91fd7d-2d6c-4542-aead-78b8010b835b @@ -514,6 +524,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Rich depth: 0 uid: b658efa2-360e-4a62-8640-3e3281156f4e @@ -535,6 +546,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: ToggleFullscreen depth: 100 uid: 8a4b8de4-7729-4936-bc7b-bc277a512975 @@ -564,6 +576,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: CoinWidget depth: 0 uid: 1f73eb4f-8795-4234-af61-2c44c3fba073 @@ -594,6 +607,7 @@ assets: style: -1 defaultText: 0 / 33 textStyle: 7879b9dc-6868-4c97-b71e-129d03c77ee1 + extendTypes: '' - name: ButtonLeft depth: 0 uid: 45a6ee81-34af-494e-914e-51ec9d414314 @@ -636,6 +650,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: ButtonRight depth: 0 uid: 03773b4b-e444-4a2d-9891-3ddf9575cc87 @@ -678,6 +693,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: ButtonJump depth: 0 uid: 86f037f0-9a1c-4306-9d67-00be01bbd793 @@ -720,6 +736,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: TryAgain depth: 0 uid: 64fac189-737e-4e56-a8fc-15eccae6bf2a @@ -745,6 +762,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: InGame ondraw: '' onleave: '' @@ -2651,6 +2669,7 @@ assets: isUi: ! '' follow: 00664f77-21c6-4b06-b310-88640b1beaf9 behaviors: [] + extendTypes: '' - name: DeadScreen onstep: '' ondraw: '' @@ -2826,6 +2845,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - name: RichScreen onstep: '' ondraw: '' @@ -2981,6 +3001,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - name: UI_Layer onstep: '' onleave: '' @@ -3158,6 +3179,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - name: BodyFall uid: 64f57367-eae3-40e1-8769-e11bd3c90f62 lastmod: 1703498508394 @@ -3502,6 +3524,7 @@ assets: weight: 2 lastmod: 1543637142188 type: style + typeface: -1 - name: OhNo uid: 0db56e97-cb4d-43bf-a067-7a7ab9f32099 origname: s2 @@ -3517,6 +3540,7 @@ assets: color: '#257073' lastmod: 1586656196733 type: style + typeface: -1 - name: OhNo_Small uid: ad511489-1f25-4d45-bbe8-7f33d08257e4 origname: s4 @@ -3532,6 +3556,7 @@ assets: color: '#257073' lastmod: 1543636696741 type: style + typeface: -1 - name: boxAlt untill: 0 grid: @@ -3986,6 +4011,7 @@ assets: uid: FgHj7141jbgtpJ behaviors: [] textStyle: 0db56e97-cb4d-43bf-a067-7a7ab9f32099 + extendTypes: '' - type: template baseClass: Text name: OhNoLabels_Small @@ -4007,3 +4033,5 @@ assets: uid: 1qFLTFGNMjh6Bh behaviors: [] textStyle: ad511489-1f25-4d45-bbe8-7f33d08257e4 + extendTypes: '' +globalVars: [] diff --git a/src/examples/catformer/img/i0298d848-efe7-48e5-8d68-9128ba8b4e02.png b/src/examples/Greed platformer (JavaScript)/img/i0298d848-efe7-48e5-8d68-9128ba8b4e02.png similarity index 100% rename from src/examples/catformer/img/i0298d848-efe7-48e5-8d68-9128ba8b4e02.png rename to src/examples/Greed platformer (JavaScript)/img/i0298d848-efe7-48e5-8d68-9128ba8b4e02.png diff --git a/src/examples/catformer/img/i1.png b/src/examples/Greed platformer (JavaScript)/img/i1.png similarity index 100% rename from src/examples/catformer/img/i1.png rename to src/examples/Greed platformer (JavaScript)/img/i1.png diff --git a/src/examples/catformer/img/i10.png b/src/examples/Greed platformer (JavaScript)/img/i10.png similarity index 100% rename from src/examples/catformer/img/i10.png rename to src/examples/Greed platformer (JavaScript)/img/i10.png diff --git a/src/examples/catformer/img/i11.png b/src/examples/Greed platformer (JavaScript)/img/i11.png similarity index 100% rename from src/examples/catformer/img/i11.png rename to src/examples/Greed platformer (JavaScript)/img/i11.png diff --git a/src/examples/catformer/img/i12.png b/src/examples/Greed platformer (JavaScript)/img/i12.png similarity index 100% rename from src/examples/catformer/img/i12.png rename to src/examples/Greed platformer (JavaScript)/img/i12.png diff --git a/src/examples/catformer/img/i15.png b/src/examples/Greed platformer (JavaScript)/img/i15.png similarity index 100% rename from src/examples/catformer/img/i15.png rename to src/examples/Greed platformer (JavaScript)/img/i15.png diff --git a/src/examples/catformer/img/i2.png b/src/examples/Greed platformer (JavaScript)/img/i2.png similarity index 100% rename from src/examples/catformer/img/i2.png rename to src/examples/Greed platformer (JavaScript)/img/i2.png diff --git a/src/examples/catformer/img/i3.png b/src/examples/Greed platformer (JavaScript)/img/i3.png similarity index 100% rename from src/examples/catformer/img/i3.png rename to src/examples/Greed platformer (JavaScript)/img/i3.png diff --git a/src/examples/catformer/img/i4.png b/src/examples/Greed platformer (JavaScript)/img/i4.png similarity index 100% rename from src/examples/catformer/img/i4.png rename to src/examples/Greed platformer (JavaScript)/img/i4.png diff --git a/src/examples/catformer/img/i5.png b/src/examples/Greed platformer (JavaScript)/img/i5.png similarity index 100% rename from src/examples/catformer/img/i5.png rename to src/examples/Greed platformer (JavaScript)/img/i5.png diff --git a/src/examples/catformer/img/i6.png b/src/examples/Greed platformer (JavaScript)/img/i6.png similarity index 100% rename from src/examples/catformer/img/i6.png rename to src/examples/Greed platformer (JavaScript)/img/i6.png diff --git a/src/examples/catformer/img/i8f3b23d8-3aed-429a-a66e-9572cad7919a.png b/src/examples/Greed platformer (JavaScript)/img/i8f3b23d8-3aed-429a-a66e-9572cad7919a.png similarity index 100% rename from src/examples/catformer/img/i8f3b23d8-3aed-429a-a66e-9572cad7919a.png rename to src/examples/Greed platformer (JavaScript)/img/i8f3b23d8-3aed-429a-a66e-9572cad7919a.png diff --git a/src/examples/catformer/img/i9.png b/src/examples/Greed platformer (JavaScript)/img/i9.png similarity index 100% rename from src/examples/catformer/img/i9.png rename to src/examples/Greed platformer (JavaScript)/img/i9.png diff --git a/src/examples/catformer/img/ib5121b5f-8109-45c0-9fa4-44f9f10ce88c.png b/src/examples/Greed platformer (JavaScript)/img/ib5121b5f-8109-45c0-9fa4-44f9f10ce88c.png similarity index 100% rename from src/examples/catformer/img/ib5121b5f-8109-45c0-9fa4-44f9f10ce88c.png rename to src/examples/Greed platformer (JavaScript)/img/ib5121b5f-8109-45c0-9fa4-44f9f10ce88c.png diff --git a/src/examples/catformer/img/ie706498a-bfef-4366-9481-687b01ff7bf1.png b/src/examples/Greed platformer (JavaScript)/img/ie706498a-bfef-4366-9481-687b01ff7bf1.png similarity index 100% rename from src/examples/catformer/img/ie706498a-bfef-4366-9481-687b01ff7bf1.png rename to src/examples/Greed platformer (JavaScript)/img/ie706498a-bfef-4366-9481-687b01ff7bf1.png diff --git a/src/examples/catformer/img/ifd9d7012-6826-4368-8fe5-0385b72bc902.png b/src/examples/Greed platformer (JavaScript)/img/ifd9d7012-6826-4368-8fe5-0385b72bc902.png similarity index 100% rename from src/examples/catformer/img/ifd9d7012-6826-4368-8fe5-0385b72bc902.png rename to src/examples/Greed platformer (JavaScript)/img/ifd9d7012-6826-4368-8fe5-0385b72bc902.png diff --git a/src/examples/catformer/img/splash.png b/src/examples/Greed platformer (JavaScript)/img/splash.png similarity index 100% rename from src/examples/catformer/img/splash.png rename to src/examples/Greed platformer (JavaScript)/img/splash.png diff --git a/src/examples/catformer/snd/s0f16063e-c954-4e7e-8b09-32b844511c9e_QNj791zkKm1F1F.wav b/src/examples/Greed platformer (JavaScript)/snd/s0f16063e-c954-4e7e-8b09-32b844511c9e_QNj791zkKm1F1F.wav similarity index 100% rename from src/examples/catformer/snd/s0f16063e-c954-4e7e-8b09-32b844511c9e_QNj791zkKm1F1F.wav rename to src/examples/Greed platformer (JavaScript)/snd/s0f16063e-c954-4e7e-8b09-32b844511c9e_QNj791zkKm1F1F.wav diff --git a/src/examples/catformer/snd/s1d5b2c13-0324-41be-bbd5-e69abfd5bd49_8FtK387LB9LMnw.wav b/src/examples/Greed platformer (JavaScript)/snd/s1d5b2c13-0324-41be-bbd5-e69abfd5bd49_8FtK387LB9LMnw.wav similarity index 100% rename from src/examples/catformer/snd/s1d5b2c13-0324-41be-bbd5-e69abfd5bd49_8FtK387LB9LMnw.wav rename to src/examples/Greed platformer (JavaScript)/snd/s1d5b2c13-0324-41be-bbd5-e69abfd5bd49_8FtK387LB9LMnw.wav diff --git a/src/examples/catformer/snd/s64f57367-eae3-40e1-8769-e11bd3c90f62_TpfL5QTz5hRPrw.wav b/src/examples/Greed platformer (JavaScript)/snd/s64f57367-eae3-40e1-8769-e11bd3c90f62_TpfL5QTz5hRPrw.wav similarity index 100% rename from src/examples/catformer/snd/s64f57367-eae3-40e1-8769-e11bd3c90f62_TpfL5QTz5hRPrw.wav rename to src/examples/Greed platformer (JavaScript)/snd/s64f57367-eae3-40e1-8769-e11bd3c90f62_TpfL5QTz5hRPrw.wav diff --git a/src/examples/catformer/snd/s7ed9f9ad-d9fc-436d-b97f-59aa81348543_K9McFC95PHLdCF.wav b/src/examples/Greed platformer (JavaScript)/snd/s7ed9f9ad-d9fc-436d-b97f-59aa81348543_K9McFC95PHLdCF.wav similarity index 100% rename from src/examples/catformer/snd/s7ed9f9ad-d9fc-436d-b97f-59aa81348543_K9McFC95PHLdCF.wav rename to src/examples/Greed platformer (JavaScript)/snd/s7ed9f9ad-d9fc-436d-b97f-59aa81348543_K9McFC95PHLdCF.wav diff --git a/src/examples/catformer/snd/sb614ec30-9837-466e-94a5-dda36bdf9daf_MKb13mJMMpWtpg.wav b/src/examples/Greed platformer (JavaScript)/snd/sb614ec30-9837-466e-94a5-dda36bdf9daf_MKb13mJMMpWtpg.wav similarity index 100% rename from src/examples/catformer/snd/sb614ec30-9837-466e-94a5-dda36bdf9daf_MKb13mJMMpWtpg.wav rename to src/examples/Greed platformer (JavaScript)/snd/sb614ec30-9837-466e-94a5-dda36bdf9daf_MKb13mJMMpWtpg.wav diff --git a/src/examples/catformer/snd/sd5d0b307-685d-4ecc-8ffe-e24a063d9f15_cgj48tH6tjrgCL.wav b/src/examples/Greed platformer (JavaScript)/snd/sd5d0b307-685d-4ecc-8ffe-e24a063d9f15_cgj48tH6tjrgCL.wav similarity index 100% rename from src/examples/catformer/snd/sd5d0b307-685d-4ecc-8ffe-e24a063d9f15_cgj48tH6tjrgCL.wav rename to src/examples/Greed platformer (JavaScript)/snd/sd5d0b307-685d-4ecc-8ffe-e24a063d9f15_cgj48tH6tjrgCL.wav diff --git a/src/examples/JettyCat (Catnip).ict b/src/examples/JettyCat (Catnip).ict new file mode 100644 index 000000000..a9e0c0701 --- /dev/null +++ b/src/examples/JettyCat (Catnip).ict @@ -0,0 +1,2900 @@ +ctjsVersion: 5.0.0 +backups: 3 +language: catnip +notes: /* empty */ +libs: + place: + gridX: 1024 + gridY: 1024 + pointer: {} + keyboard: {} + keyboard.polyfill: {} + pointer.polyfill: {} + random: {} + tween: {} + transition: {} +startroom: gFtD4f2P4HddCC +contentTypes: [] +actions: + - name: Poof + methods: + - code: pointer.Any +scripts: [] +assets: + - type: folder + uid: KfQ28ffn7hTPbR + colorClass: act + icon: help-circle + name: textures + lastmod: 1715906169398 + entries: + - lastmod: 1716071921458 + type: texture + name: Button_Pause + untill: 0 + grid: + - 1 + - 1 + axis: + - 98 + - 104 + marginx: 0 + marginy: 0 + imgWidth: 196 + imgHeight: 208 + width: 196 + height: 208 + offx: 0 + offy: 0 + origname: ic5KQMJ2D58jTLg.png + shape: rect + left: 98 + right: 98 + top: 104 + bottom: 104 + uid: c5KQMJ2D58jTLg + padding: 1 + isBlank: false + source: >- + /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Button_Pause.png + - lastmod: 1716038006047 + type: texture + name: Button_Play + untill: 0 + grid: + - 1 + - 1 + axis: + - 160 + - 166 + marginx: 0 + marginy: 0 + imgWidth: 320 + imgHeight: 332 + width: 320 + height: 332 + offx: 0 + offy: 0 + origname: iJ94kWM92b54ppn.png + shape: circle + left: 160 + right: 160 + top: 166 + bottom: 166 + uid: J94kWM92b54ppn + padding: 1 + isBlank: false + source: >- + /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Button_Play.png + r: 160 + - lastmod: 1716037963219 + type: texture + name: Jetty_Cat + untill: 0 + grid: + - 1 + - 1 + axis: + - 462 + - 174 + marginx: 0 + marginy: 0 + imgWidth: 925 + imgHeight: 349 + width: 925 + height: 349 + offx: 0 + offy: 0 + origname: iTzNDWhj1H3fk83.png + shape: rect + left: 462 + right: 463 + top: 174 + bottom: 175 + uid: TzNDWhj1H3fk83 + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Jetty Cat.png + - lastmod: 1715906174976 + type: texture + name: Pause + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 750 + imgHeight: 226 + width: 750 + height: 226 + offx: 0 + offy: 0 + origname: iktrdBzgwQpKczH.png + shape: rect + left: 0 + right: 750 + top: 0 + bottom: 226 + uid: ktrdBzgwQpKczH + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Pause.png + - lastmod: 1715906200570 + type: texture + name: BG_Ground + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 1080 + imgHeight: 191 + width: 1080 + height: 191 + offx: 0 + offy: 0 + origname: i8tCtzNjp7rJQMb.png + shape: rect + left: 0 + right: 1080 + top: 0 + bottom: 191 + uid: 8tCtzNjp7rJQMb + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/BG_Ground.png + tiled: true + - lastmod: 1715906202542 + type: texture + name: BG_Sky + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 1080 + imgHeight: 1920 + width: 1080 + height: 1920 + offx: 0 + offy: 0 + origname: i4nrC5qWrr9m2Jg.png + shape: rect + left: 0 + right: 1080 + top: 0 + bottom: 1920 + uid: 4nrC5qWrr9m2Jg + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/BG_Sky.png + tiled: true + - lastmod: 1715987151660 + type: texture + name: Tube_01 + untill: 0 + grid: + - 1 + - 1 + axis: + - 93 + - 280 + marginx: 0 + marginy: 0 + imgWidth: 225 + imgHeight: 289 + width: 225 + height: 289 + offx: 0 + offy: 0 + origname: i5j4GGLbMKjRJgT.png + shape: strip + left: 288 + right: 118 + top: 261 + bottom: 220 + uid: 5j4GGLbMKjRJgT + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Tube_01.png + stripPoints: + - x: -90 + 'y': -273 + - x: 92 + 'y': -274 + - x: 78 + 'y': 5 + - x: -72 + 'y': 4 + closedStrip: true + - lastmod: 1716399367037 + type: texture + name: PressHint + untill: 0 + grid: + - 1 + - 1 + axis: + - 128 + - 134 + marginx: 0 + marginy: 0 + imgWidth: 256 + imgHeight: 268 + width: 256 + height: 268 + offx: 0 + offy: 0 + origname: iC1wHGG9N4Htd2n.png + shape: rect + left: 128 + right: 128 + top: 134 + bottom: 134 + uid: C1wHGG9N4Htd2n + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/PressHint.png + - lastmod: 1715987157774 + type: texture + name: Tube_04 + untill: 0 + grid: + - 1 + - 1 + axis: + - 94 + - 1059 + marginx: 0 + marginy: 0 + imgWidth: 225 + imgHeight: 1067 + width: 225 + height: 1067 + offx: 0 + offy: 0 + origname: iGLrN9N95twbLk7.png + shape: strip + left: 94 + right: 131 + top: 1059 + bottom: 8 + uid: GLrN9N95twbLk7 + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Tube_04.png + stripPoints: + - x: -91 + 'y': -1057 + - x: 88 + 'y': -1052 + - x: 77 + 'y': 1 + - x: -82 + 'y': 3 + closedStrip: true + r: 112 + - lastmod: 1715906174978 + type: texture + name: OhNo + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 707 + imgHeight: 351 + width: 707 + height: 351 + offx: 0 + offy: 0 + origname: ig16LRPdTppLR96.png + shape: rect + left: 0 + right: 707 + top: 0 + bottom: 351 + uid: g16LRPdTppLR96 + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/OhNo.png + - lastmod: 1715987153553 + type: texture + name: Tube_02 + untill: 0 + grid: + - 1 + - 1 + axis: + - 91 + - 501 + marginx: 0 + marginy: 0 + imgWidth: 225 + imgHeight: 505 + width: 225 + height: 505 + offx: 0 + offy: 0 + origname: i5rK6RNPt2h3FL8.png + shape: strip + left: 93 + right: 132 + top: 280 + bottom: 225 + uid: 5rK6RNPt2h3FL8 + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Tube_02.png + stripPoints: + - x: -90 + 'y': -498 + - x: -72 + 'y': 0 + - x: 74 + 'y': 1 + - x: 90 + 'y': -498 + closedStrip: true + - lastmod: 1715987149187 + type: texture + name: PotatoCat + untill: 0 + grid: + - 1 + - 1 + axis: + - 288 + - 261 + marginx: 0 + marginy: 0 + imgWidth: 406 + imgHeight: 481 + width: 406 + height: 481 + offx: 0 + offy: 0 + origname: i63fH1ptfzhBTgw.png + shape: strip + left: 288 + right: 118 + top: 261 + bottom: 220 + uid: 63fH1ptfzhBTgw + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/PotatoCat.png + stripPoints: + - x: -29 + 'y': -206 + - x: 38 + 'y': -206 + - x: 88 + 'y': -166 + - x: 115 + 'y': -83 + - x: 109 + 'y': 98 + - x: 71 + 'y': 152 + - x: 23 + 'y': 176 + - x: -67 + 'y': 165 + - x: -118 + 'y': 125 + - x: -137 + 'y': 71 + - x: -176 + 'y': 55 + - x: -164 + 'y': -67 + - x: -115 + 'y': -116 + - x: -93 + 'y': -110 + - x: -65 + 'y': -171 + closedStrip: true + ignoreTiledUse: true + - lastmod: 1715906739386 + type: texture + name: Star + untill: 0 + grid: + - 1 + - 1 + axis: + - 95 + - 91 + marginx: 0 + marginy: 0 + imgWidth: 190 + imgHeight: 183 + width: 190 + height: 183 + offx: 0 + offy: 0 + origname: iL4z1NpnJm5kFtJ.png + shape: strip + left: 95 + right: 95 + top: 91 + bottom: 92 + uid: L4z1NpnJm5kFtJ + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Star.png + stripPoints: + - x: 0 + 'y': -92 + - x: 90 + 'y': -28 + - x: 56 + 'y': 74 + - x: -56 + 'y': 74 + - x: -90 + 'y': -28 + closedStrip: true + - lastmod: 1715987156136 + type: texture + name: Tube_03 + untill: 0 + grid: + - 1 + - 1 + axis: + - 93 + - 776 + marginx: 0 + marginy: 0 + imgWidth: 225 + imgHeight: 780 + width: 225 + height: 780 + offx: 0 + offy: 0 + origname: ibRGWDwL5Q4kfGC.png + shape: strip + left: 93 + right: 132 + top: 280 + bottom: 500 + uid: bRGWDwL5Q4kfGC + padding: 1 + isBlank: false + source: /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/Tube_03.png + stripPoints: + - x: -95 + 'y': -766 + - x: 90 + 'y': -771 + - x: 76 + 'y': -2 + - x: -74 + 'y': -2 + closedStrip: true + - lastmod: 1715906719549 + type: texture + name: PotatoCat_Stunned + untill: 0 + grid: + - 1 + - 1 + axis: + - 288 + - 261 + marginx: 0 + marginy: 0 + imgWidth: 406 + imgHeight: 481 + width: 406 + height: 481 + offx: 0 + offy: 0 + origname: iqC1D2jBC1L4Lfr.png + shape: strip + left: 288 + right: 118 + top: 261 + bottom: 220 + uid: qC1D2jBC1L4Lfr + padding: 1 + isBlank: false + source: >- + /home/deck/.config/itch/apps/ct/examples/JettyCat_assets/PotatoCat_Stunned.png + stripPoints: + - x: -29 + 'y': -206 + - x: 38 + 'y': -206 + - x: 88 + 'y': -166 + - x: 115 + 'y': -83 + - x: 109 + 'y': 98 + - x: 71 + 'y': 152 + - x: 23 + 'y': 176 + - x: -67 + 'y': 165 + - x: -118 + 'y': 125 + - x: -137 + 'y': 71 + - x: -176 + 'y': 55 + - x: -164 + 'y': -67 + - x: -115 + 'y': -116 + - x: -93 + 'y': -110 + - x: -65 + 'y': -171 + - lastmod: 1716416857753 + type: texture + name: Smoke + untill: 0 + grid: + - 1 + - 1 + axis: + - 25 + - 24 + marginx: 0 + marginy: 0 + imgWidth: 51 + imgHeight: 48 + width: 51 + height: 48 + offx: 0 + offy: 0 + origname: ibBKnhp6QMcBwNG.png + shape: rect + left: 25 + right: 26 + top: 24 + bottom: 24 + uid: bBKnhp6QMcBwNG + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Jumperpack/Smoke.png + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1080 + height: 1920 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: false + name: InGame + backgroundColor: '#000000' + follow: -1 + backgrounds: + - depth: -20 + texture: 4nrC5qWrr9m2Jg + shiftX: 0 + shiftY: 0 + parallaxX: 0.5 + parallaxY: 1 + movementX: 0 + movementY: 0 + scaleX: 1 + scaleY: 1 + repeat: repeat + - depth: -10 + texture: 8tCtzNjp7rJQMb + shiftX: 0 + shiftY: 1736 + parallaxX: 1 + parallaxY: 1 + movementX: 0 + movementY: 0 + scaleX: 1 + scaleY: 1 + repeat: repeat-x + copies: + - x: 320 + 'y': 832 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 7g4pW86L7K2GR4 + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716785581679 + events: + - eventKey: OnRoomStart + code: + - lib: core.timers + code: set timer1 + values: + time: 5 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: score + value: 0 + - lib: core + code: rooms.append + values: + return: + lib: core.hidden + code: property + values: + variableName: mainUi + name: kKhcJrbjp6NfGh + - lib: transition + code: transition.circleIn + values: + then: [] + duration: 500 + color: 4483803 + arguments: {} + lib: core + variables: [] + - eventKey: Timer1 + code: + - lib: core.misc + code: note + values: + note: Wind it again + - lib: core.timers + code: set timer1 + values: + time: 2 + - lib: core.misc + code: note + values: + note: >- + Create two tubes, one at the bottom of the camera and one at the + top + - lib: core + code: templates.copy + values: + return: + lib: core.hidden + code: variable + values: + variableName: tube1 + template: mJRKzt8C73FzMz + x: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get right + values: {} + b: 250 + 'y': + lib: core.math + code: '-' + values: + a: + lib: core.camera + code: get bottom + values: {} + b: 130 + - lib: core + code: templates.copy + values: + template: mJRKzt8C73FzMz + x: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get right + values: {} + b: 250 + 'y': + lib: core.math + code: '-' + values: + a: + lib: core.camera + code: get top + values: {} + b: 70 + return: + lib: core.hidden + code: variable + values: + variableName: tube2 + - lib: core.misc + code: note + values: + note: >- + Change second tube's texture depending on which texture is used + in the first tube + - lib: core.logic + code: if branch + values: + body1: + - lib: core.misc + code: note + values: + note: Shortest tube will result in the longest tube + - lib: core + code: templates.withCopy + values: + func: + - lib: core.appearance + code: set texture + values: + texture: GLrN9N95twbLk7 + obj: + lib: core.hidden + code: variable + values: + variableName: tube2 + condition: + lib: core.logic + code: is + values: + a: + lib: core.objects + code: object read + values: + property: tex + object: + lib: core.hidden + code: variable + values: + variableName: tube1 + b: Tube_01 + - lib: core.logic + code: if branch + values: + body1: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.appearance + code: set texture + values: + texture: bRGWDwL5Q4kfGC + obj: + lib: core.hidden + code: variable + values: + variableName: tube2 + condition: + lib: core.logic + code: is + values: + a: + lib: core.objects + code: object read + values: + property: tex + object: + lib: core.hidden + code: variable + values: + variableName: tube1 + b: Tube_02 + - lib: core.logic + code: if branch + values: + body1: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.appearance + code: set texture + values: + texture: 5rK6RNPt2h3FL8 + obj: + lib: core.hidden + code: variable + values: + variableName: tube2 + condition: + lib: core.logic + code: is + values: + a: + lib: core.objects + code: object read + values: + property: tex + object: + lib: core.hidden + code: variable + values: + variableName: tube1 + b: Tube_03 + - lib: core.logic + code: if branch + values: + body1: + - lib: core.misc + code: note + values: + note: Longest will result in the shortest one + - lib: core + code: templates.withCopy + values: + func: + - lib: core.appearance + code: set texture + values: + texture: 5j4GGLbMKjRJgT + obj: + lib: core.hidden + code: variable + values: + variableName: tube2 + condition: + lib: core.logic + code: is + values: + a: + lib: core.objects + code: object read + values: + property: tex + object: + lib: core.hidden + code: variable + values: + variableName: tube1 + b: Tube_04 + - lib: core.misc + code: note + values: + note: >- + Thus we will always get gaps of the same size, but with random + tubes. + - lib: core.misc + code: note + values: + note: 'Now, flip the upper (second) tube' + - lib: core + code: templates.withCopy + values: + func: + - lib: core.appearance + code: set scale xy + values: + x: 1 + 'y': -1 + obj: + lib: core.hidden + code: variable + values: + variableName: tube2 + - lib: core.misc + code: note + values: + note: >- + Create a star bonus with 30% chance somewhere in between top and + bottom edge, with 300px padding. + - lib: core.logic + code: if branch + values: + body1: + - lib: core + code: templates.copy + values: + template: zkGrWq8Wqg4DW5 + x: + lib: core.math + code: + + values: + b: + lib: core.math + code: + + values: + a: 250 + b: 500 + a: + lib: core.camera + code: get right + values: {} + 'y': + lib: random + code: random.range + values: + x1: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get top + values: {} + b: 300 + x2: + lib: core.math + code: '-' + values: + a: + lib: core.camera + code: get bottom + values: {} + b: 300 + body2: [] + condition: + lib: random + code: random.chance + values: + x: 30 + 'y': 100 + arguments: + name: TubeSpawn + isUi: false + lib: core + variables: + - tube1 + - tube2 + behaviors: [] + extendTypes: '' + uid: nCmH6LJNq3TNnF + properties: + - score + - mainUi + - type: template + baseClass: AnimatedSprite + name: PotatoCat + depth: 0 + texture: 63fH1ptfzhBTgw + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.misc + code: note + values: + note: >- + If the cat is below the ground minus its approximate height, the + cat flew off the upper boundary, remove the cat. + - lib: core.logic + code: if branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.logic + code: a OR b + values: + a: + lib: core.math + code: '>' + values: + b: + lib: core.math + code: '-' + values: + a: 1750 + b: 200 + a: + lib: core.movement + code: 'y' + values: {} + b: + lib: core.math + code: < + values: + b: 0 + a: + lib: core.movement + code: 'y' + values: {} + - lib: core.appearance + code: set angle + values: + degrees: + lib: core.math + code: '*' + values: + b: + lib: core.math + code: / + values: + a: + lib: core.movement + code: get vspeed + values: {} + b: 200 + a: -1 + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: 500 + - lib: core.movement + code: set direction + values: + degrees: 0 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: gravityAcceleration + value: 7000 + - lib: core.camera + code: follow this + values: {} + - lib: core.camera + code: set followY + values: + value: + lib: core.logic + code: 'false' + values: {} + - lib: core.camera + code: set shiftX + values: + value: 250 + - lib: core.appearance + code: set scale xy + values: + x: 0.65 + 'y': 0.65 + - lib: core + code: emitters.follow + values: + return: + lib: core.hidden + code: property + values: + variableName: jet + parent: + lib: core.propsVars + code: this + values: {} + name: Hg3Dk8BHCRLr3G + arguments: {} + lib: core + variables: [] + - eventKey: OnActionDown + code: + - lib: core.movement + code: set gravity + values: + gravity: + lib: core.hidden + code: property + values: + variableName: gravityAcceleration + - lib: core.movement + code: set vspeed + values: + speed: + lib: core.math + code: '-' + values: + b: + lib: core.math + code: '*' + values: + b: + lib: core.math + code: '*' + values: + a: 2 + b: + lib: core.hidden + code: property + values: + variableName: gravityAcceleration + a: + lib: core + code: u.time + values: {} + a: + lib: core.movement + code: get vspeed + values: {} + arguments: + action: Poof + lib: core + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.templates + code: kill + values: {} + arguments: + group: Obstacle + lib: place + variables: [] + - eventKey: OnDestroy + code: + - lib: core.misc + code: note + values: + note: Stop camera movement + - lib: core.camera + code: set followX + values: + value: + lib: core.logic + code: 'false' + values: {} + - lib: core.misc + code: note + values: + note: Create an animated dummy + - lib: core + code: templates.copy + values: + template: nM4gLBz9t7DG9C + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + return: + lib: core.hidden + code: variable + values: + variableName: dummy + - lib: core.misc + code: note + values: + note: Copy scale settings to the new copy + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: thisScaleX + value: + lib: core.appearance + code: get scale x + values: {} + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: thisScaleY + value: + lib: core.appearance + code: get scale y + values: {} + - lib: core + code: templates.withCopy + values: + func: + - lib: core.appearance + code: set scale xy + values: + x: + lib: core.hidden + code: variable + values: + variableName: thisScaleX + 'y': + lib: core.hidden + code: variable + values: + variableName: thisScaleY + obj: + lib: core.hidden + code: variable + values: + variableName: dummy + - lib: core.misc + code: note + values: + note: Remove the layer with score and a pause button + - lib: core + code: rooms.remove + values: + room: + lib: core.objects + code: room read + values: + property: mainUi + - lib: core.misc + code: note + values: + note: Wait for 1000 milliseconds (for one second) + - lib: core + code: u.waitUi + values: + then: + - lib: core.misc + code: note + values: + note: Add a layer with "Lose" UI + - lib: core + code: rooms.append + values: + name: 2zFttDhBttzf95 + isUi: + lib: core.logic + code: 'true' + values: {} + catch: [] + time: 1000 + arguments: {} + lib: core + variables: + - dummy + - thisScaleX + - thisScaleY + - eventKey: OnActionRelease + code: + - lib: core + code: emitters.pause + values: + emitter: + lib: core.hidden + code: property + values: + variableName: jet + arguments: + action: Poof + lib: core + variables: [] + - eventKey: OnActionDown + code: + - lib: core + code: emitters.resume + values: + emitter: + lib: core.hidden + code: property + values: + variableName: jet + arguments: + action: Poof + lib: core + variables: [] + extends: {} + lastmod: 1716785357207 + uid: 7g4pW86L7K2GR4 + behaviors: [] + extendTypes: '' + properties: + - gravityAcceleration + - jet + tilingSettings: + scrollSpeedX: 0 + scrollSpeedY: 0 + isUi: false + repeaterSettings: + defaultCount: 3 + - type: template + baseClass: AnimatedSprite + name: Tube + depth: 0 + texture: bRGWDwL5Q4kfGC + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.logic + code: if branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + b: + lib: core.math + code: '-' + values: + a: + lib: core.camera + code: get left + values: {} + b: 150 + a: + lib: core.movement + code: x + values: {} + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: textureArray + value: + lib: core.arrays + code: new array + values: {} + - lib: core.arrays + code: array push + values: + array: + lib: core.hidden + code: variable + values: + variableName: textureArray + elt: Tube_01 + - lib: core.arrays + code: array push + values: + array: + lib: core.hidden + code: variable + values: + variableName: textureArray + elt: Tube_02 + - lib: core.arrays + code: array push + values: + array: + lib: core.hidden + code: variable + values: + variableName: textureArray + elt: Tube_03 + - lib: core.arrays + code: array push + values: + array: + lib: core.hidden + code: variable + values: + variableName: textureArray + elt: Tube_04 + - lib: core.appearance + code: set texture + values: + texture: + lib: random + code: random.from + values: + a: + lib: core.hidden + code: variable + values: + variableName: textureArray + arguments: {} + lib: core + variables: + - textureArray + extends: + cgroup: Obstacle + lastmod: 1716785378799 + uid: mJRKzt8C73FzMz + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: PotatoCat_Stunned + depth: 0 + texture: qC1D2jBC1L4Lfr + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set gravity + values: + gravity: 2700 + - lib: core.misc + code: note + values: + note: Jump to the left + - lib: core.movement + code: set speed + values: + speed: 1500 + - lib: core.movement + code: set direction + values: + degrees: -135 + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716390118743 + uid: nM4gLBz9t7DG9C + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Star + depth: 0 + texture: L4z1NpnJm5kFtJ + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.logic + code: if branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + b: + lib: core.math + code: '-' + values: + a: + lib: core.camera + code: get left + values: {} + b: 150 + a: + lib: core.movement + code: x + values: {} + arguments: {} + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.templates + code: kill + values: {} + - lib: core + code: templates.withCopy + values: + func: + - lib: core.objects + code: this write + values: + property: score + value: + lib: core.math + code: + + values: + a: + lib: core.objects + code: this read + values: + property: score + b: 1 + obj: + lib: core + code: rooms.current + values: {} + arguments: + template: 7g4pW86L7K2GR4 + lib: place + variables: [] + - eventKey: OnDestroy + code: + - lib: core + code: emitters.fire + values: + name: rGgRKm62zfPJhn + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + arguments: {} + lib: core + variables: [] + - eventKey: OnCreate + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: wiggleTime + value: 0 + arguments: {} + lib: core + variables: [] + - eventKey: OnDraw + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: wiggleTime + value: + lib: core.math + code: + + values: + b: + lib: core.math + code: '*' + values: + a: + lib: core + code: u.time + values: {} + b: 12 + a: + lib: core.hidden + code: property + values: + variableName: wiggleTime + - lib: core.appearance + code: set angle + values: + degrees: + lib: core.math + code: '*' + values: + a: + lib: core.math + code: sin + values: + a: + lib: core.hidden + code: property + values: + variableName: wiggleTime + b: 5 + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716785408575 + uid: zkGrWq8Wqg4DW5 + behaviors: [] + extendTypes: '' + properties: + - wiggleTime + - type: style + name: Orange + uid: jrjFQjHg5fc1TT + font: + family: sans-serif + halign: left + italic: false + size: 80 + weight: '900' + wrap: false + wrapPosition: 640 + lineHeight: 0 + fill: + type: '1' + color: '#ffffff' + color1: '#E7A66F' + color2: '#D28753' + gradtype: '1' + lastmod: 1716037632626 + stroke: + color: '#914121' + weight: 10 + typeface: -1 + - type: template + baseClass: AnimatedSprite + name: StarCounter + depth: 0 + texture: L4z1NpnJm5kFtJ + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1716037839102 + uid: pRhGcT3KqfKfNR + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: Text + name: StarCounterLabel + depth: 0 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnDraw + code: + - lib: core.appearance + code: set text + values: + text: + lib: core.objects + code: room read + values: + property: score + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716037949272 + uid: jQ6RJk18NMDT8q + behaviors: [] + extendTypes: '' + properties: [] + defaultText: '0' + textStyle: jrjFQjHg5fc1TT + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1080 + height: 1920 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: true + name: UI_InGame + backgroundColor: '#000000' + follow: -1 + backgrounds: [] + copies: + - x: 128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: pRhGcT3KqfKfNR + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jQ6RJk18NMDT8q + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: fhC1LP88jBpL6H + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 960 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 1811LtJG2CzK9d + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716399592650 + events: [] + behaviors: [] + extendTypes: '' + uid: kKhcJrbjp6NfGh + properties: [] + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1080 + height: 1920 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: false + name: MainMenu + backgroundColor: '#000000' + follow: -1 + backgrounds: + - depth: -20 + texture: 4nrC5qWrr9m2Jg + shiftX: 0 + shiftY: 0 + parallaxX: 1 + parallaxY: 1 + movementX: -30 + movementY: 0 + scaleX: 1 + scaleY: 1 + repeat: repeat + - depth: -10 + texture: 8tCtzNjp7rJQMb + shiftX: 0 + shiftY: 1736 + parallaxX: 1 + parallaxY: 1 + movementX: 0 + movementY: 0 + scaleX: 1 + scaleY: 1 + repeat: repeat-x + copies: + - x: 540.84375 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: Kf7b2MM9hqPtTp + exts: {} + customProperties: {} + bindings: {} + - x: 529.125 + 'y': 1033.3125 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: BKq3GHMjnkNBnb + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716417103035 + events: [] + behaviors: [] + extendTypes: '' + uid: gFtD4f2P4HddCC + properties: + - score + - mainUi + - type: template + baseClass: AnimatedSprite + name: Jetty_Cat + depth: 0 + texture: TzNDWhj1H3fk83 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1716037995001 + uid: Kf7b2MM9hqPtTp + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Button_Play + depth: 0 + texture: J94kWM92b54ppn + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnPointerClick + code: + - lib: core.logic + code: if branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: pressed + value: + lib: core.logic + code: 'true' + values: {} + - lib: transition + code: transition.circleOut + values: + then: + - lib: core + code: rooms.switch + values: + roomName: nCmH6LJNq3TNnF + duration: 1000 + color: 4483803 + body2: [] + condition: + lib: core.logic + code: NOT a + values: + a: + lib: core.hidden + code: property + values: + variableName: pressed + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716785641853 + uid: BKq3GHMjnkNBnb + behaviors: [] + extendTypes: '' + properties: + - pressed + - type: template + baseClass: AnimatedSprite + name: Button_Pause + depth: 0 + texture: c5KQMJ2D58jTLg + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnPointerClick + code: + - lib: core.misc + code: note + values: + note: Check if we don't have any rooms called 'UI_Paused' + - lib: core.logic + code: if branch + values: + body1: + - lib: core.misc + code: note + values: + note: >- + Create a room UI_Paused, put it above the current one + (append it), and specify that it is a UI layer (isUi: + true) + - lib: core.misc + code: note + values: + note: 'Turns u.delta into 0, effectively stopping the game' + - lib: core + code: rooms.append + values: + name: c7jH6rDzQmkM9g + isUi: + lib: core.logic + code: 'true' + values: {} + - lib: core.settings + code: set ticker speed + values: + speed: 0 + body2: [] + condition: + lib: core.logic + code: is + values: + b: 0 + a: + lib: core.arrays + code: array length + values: + array: + lib: core + code: rooms.list + values: + list: c7jH6rDzQmkM9g + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716785516817 + uid: fhC1LP88jBpL6H + behaviors: [] + extendTypes: '' + properties: [] + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1080 + height: 1920 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: true + name: UI_Paused + backgroundColor: '#000000' + follow: -1 + backgrounds: [] + copies: + - x: 550.609375 + 'y': 971.265625 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: bcMHd44cL9cNgH + exts: {} + customProperties: {} + bindings: {} + - x: 170.515625 + 'y': 349.890625 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: Mj57Ch2qckMr4z + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716416888851 + events: + - eventKey: OnRoomStart + code: + - lib: core.appearance + code: set alpha + values: + value: 0 + - lib: tween + code: animate propVal + values: + then: [] + catch: [] + value: + lib: core.appearance + code: get alpha + values: {} + to: 1 + ms: 500 + isUi: + lib: core.logic + code: 'true' + values: {} + arguments: {} + lib: core + variables: [] + behaviors: [] + extendTypes: '' + uid: c7jH6rDzQmkM9g + properties: + - score + - mainUi + - type: template + baseClass: AnimatedSprite + name: Button_Continue + depth: 0 + texture: J94kWM92b54ppn + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnPointerClick + code: + - lib: core.logic + code: if branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: pressed + value: + lib: core.logic + code: 'true' + values: {} + - lib: tween + code: animate + values: + then: + - lib: tween + code: animate propVal + values: + then: [] + catch: [] + value: + lib: core.settings + code: get ticker speed + values: {} + to: 1 + ms: 1000 + isUi: + lib: core.logic + code: 'true' + values: {} + - lib: core + code: rooms.remove + values: + room: + lib: core + code: owning room + values: {} + catch: [] + property: alpha + target: + lib: core + code: owning room + values: {} + value: 0 + ms: 1000 + isUi: + lib: core.logic + code: 'true' + values: {} + body2: [] + condition: + lib: core.logic + code: NOT a + values: + a: + lib: core.hidden + code: property + values: + variableName: pressed + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716785874006 + uid: bcMHd44cL9cNgH + behaviors: [] + extendTypes: '' + properties: + - pressed + - type: template + baseClass: AnimatedSprite + name: Pause + depth: 0 + texture: ktrdBzgwQpKczH + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1716129272211 + uid: Mj57Ch2qckMr4z + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: OhNo + depth: 0 + texture: g16LRPdTppLR96 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1716326114743 + uid: 85QGLqpWDQMFbc + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: Text + name: EndGame_ScoreCounter + depth: 0 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: roomScore + value: + lib: core.objects + code: room read + values: + property: score + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: currentHighScore + value: + lib: core.propsVars + code: load localStorage + values: + key: JettyCat_HighScore + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: save localStorage + values: + key: JettyCat_HighScore + value: + lib: core.hidden + code: variable + values: + variableName: roomScore + body2: + - lib: core.logic + code: if branch + values: + body1: + - lib: core.propsVars + code: save localStorage + values: + key: JettyCat_HighScore + value: + lib: core.hidden + code: variable + values: + variableName: roomScore + body2: [] + condition: + lib: core.math + code: < + values: + a: + lib: core.utils + code: convert to number + values: + val: + lib: core.hidden + code: variable + values: + variableName: currentHighScore + b: + lib: core.hidden + code: variable + values: + variableName: roomScore + condition: + lib: core.logic + code: NOT a + values: + a: + lib: core.propsVars + code: is localStorage + values: + key: JettyCat_HighScore + - lib: core.appearance + code: set text + values: + text: + lib: core.strings + code: concat3 + values: + a: 'Your score: ' + c: + lib: core.strings + code: concat + values: + a: + lib: core.utils + code: const string + values: + val: '\nHighscore: ' + b: + lib: core.hidden + code: variable + values: + variableName: currentHighScore + b: + lib: core.hidden + code: variable + values: + variableName: roomScore + arguments: {} + lib: core + variables: + - roomScore + - currentHighScore + extends: {} + lastmod: 1716785547219 + uid: CFLJPtzKhQkNtc + behaviors: [] + extendTypes: '' + properties: [] + defaultText: '' + textStyle: jrjFQjHg5fc1TT + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1080 + height: 1920 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: true + name: UI_OhNo + backgroundColor: '#000000' + follow: -1 + backgrounds: [] + copies: + - x: 195.453125 + 'y': 140.765625 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 85QGLqpWDQMFbc + exts: {} + customProperties: {} + bindings: {} + - x: 554.515625 + 'y': 700.6875 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: CFLJPtzKhQkNtc + exts: {} + customProperties: {} + bindings: {} + customAnchor: + x: 0.5 + 'y': 0.5 + customText: '0' + - x: 550.609375 + 'y': 1131.109375 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: BKq3GHMjnkNBnb + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716785591697 + events: + - eventKey: OnRoomStart + code: + - lib: core.appearance + code: set alpha + values: + value: 0 + - lib: tween + code: animate propVal + values: + then: [] + catch: [] + value: + lib: core.appearance + code: get alpha + values: {} + to: 1 + ms: 500 + isUi: + lib: core.logic + code: 'true' + values: {} + arguments: {} + lib: core + variables: [] + behaviors: [] + extendTypes: '' + uid: 2zFttDhBttzf95 + properties: + - score + - mainUi + - name: StarBurst + uid: rGgRKm62zfPJhn + emitters: + - uid: H46rMQ7H4Gr6Hh + texture: L4z1NpnJm5kFtJ + openedTabs: + - texture + - spawning + - shape + - velocity + - rotation + textureBehavior: textureRandom + animatedSingleFramerate: 30 + settings: + delay: 0 + lifetime: + min: 0.5 + max: 0.5 + frequency: 1 + spawnChance: 1 + particlesPerWave: 10 + emitterLifetime: 2 + maxParticles: 1000 + maxSpeed: 0 + pos: + x: 0 + 'y': 0 + addAtBack: false + behaviors: + - type: alpha + config: + alpha: + list: + - value: 0 + time: 0 + - value: 1 + time: 0.5 + - value: 0 + time: 1 + - type: color + config: + color: + list: + - value: ffffff + time: 0 + - value: ffffff + time: 0.5 + - value: ffffff + time: 1 + - type: blendMode + config: + blendMode: normal + - type: scale + config: + scale: + list: + - value: 0.6799999999999999 + time: 0 + - value: 0.16999999999999998 + time: 1 + minMult: 1 + - type: moveAcceleration + config: + minStart: 200 + maxStart: 400 + accel: + x: 0 + 'y': 980 + rotate: false + maxSpeed: 3000 + - type: spawnShape + config: + type: torus + data: + innerRadius: 0 + radius: 64 + x: 0 + 'y': 0 + rotation: true + - type: rotation + config: + minStart: 0 + maxStart: 360 + minSpeed: 0 + maxSpeed: 0 + accel: 0 + showShapeVisualizer: false + lastmod: 1716416554574 + type: tandem + - name: Jet + uid: Hg3Dk8BHCRLr3G + emitters: + - uid: H46rMQ7H4Gr6Hh + texture: bBKnhp6QMcBwNG + openedTabs: + - texture + - spawning + - shape + textureBehavior: textureRandom + animatedSingleFramerate: 30 + settings: + delay: 0 + lifetime: + min: 0.5 + max: 0.5 + frequency: 0.03 + spawnChance: 1 + particlesPerWave: 1 + emitterLifetime: 0 + maxParticles: 1000 + maxSpeed: 0 + pos: + x: -144 + 'y': 64 + addAtBack: false + behaviors: + - type: alpha + config: + alpha: + list: + - value: 0 + time: 0 + - value: 1 + time: 0.5 + - value: 0 + time: 1 + - type: color + config: + color: + list: + - value: ffffff + time: 0 + - value: ffffff + time: 0.5 + - value: ffffff + time: 1 + - type: blendMode + config: + blendMode: normal + - type: scale + config: + scale: + list: + - value: 1 + time: 0 + - value: 0.3 + time: 1 + minMult: 0.47 + - type: moveSpeed + config: + speed: + list: + - value: 500 + time: 0 + - value: 100 + time: 1 + minMult: 1 + - type: spawnShape + config: + type: torus + data: + innerRadius: 0 + radius: 16 + x: 0 + 'y': 0 + rotation: true + - type: rotation + config: + minStart: 85 + maxStart: 100 + minSpeed: 0 + maxSpeed: 0 + accel: 0 + showShapeVisualizer: true + lastmod: 1716416962517 + type: tandem + previewTexture: 63fH1ptfzhBTgw + - type: template + baseClass: AnimatedSprite + name: PressHint + depth: 0 + texture: C1wHGG9N4Htd2n + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.propsVars + code: set + values: + value: + lib: core.math + code: + + values: + b: + lib: core.math + code: '*' + values: + b: 12 + a: + lib: core + code: u.time + values: {} + a: + lib: core.hidden + code: property + values: + variableName: pulsePhase + var: + lib: core.hidden + code: property + values: + variableName: pulsePhase + - lib: core.propsVars + code: set + values: + var: + lib: core.appearance + code: get scale x + values: {} + value: + lib: core.math + code: + + values: + b: + lib: core.math + code: '*' + values: + a: + lib: core.math + code: sin + values: + a: + lib: core.hidden + code: property + values: + variableName: pulsePhase + b: 0.1 + a: 1 + - lib: core.propsVars + code: set + values: + var: + lib: core.appearance + code: get scale y + values: {} + value: + lib: core.math + code: + + values: + b: + lib: core.math + code: '*' + values: + a: + lib: core.math + code: sin + values: + a: + lib: core.hidden + code: property + values: + variableName: pulsePhase + b: 0.1 + a: 1 + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: pulsePhase + value: 0 + arguments: {} + lib: core + variables: [] + - eventKey: OnActionPress + code: + - lib: core.templates + code: kill + values: {} + arguments: + action: Poof + lib: core + variables: [] + extends: {} + lastmod: 1716399552334 + uid: 1811LtJG2CzK9d + behaviors: [] + extendTypes: '' + properties: + - pulsePhase +settings: + authoring: + author: '' + site: '' + title: '' + version: + - 0 + - 0 + - 0 + versionPostfix: '' + appId: '' + rendering: + usePixiLegacy: true + transparent: false + maxFPS: 60 + pixelatedrender: false + highDensity: true + desktopMode: maximized + hideCursor: false + mobileScreenOrientation: unspecified + viewMode: scaleFit + export: + autocloseDesktop: true + windows: true + linux: true + mac: true + functionWrap: false + codeModifier: none + bundleAssetTree: false + bundleAssetTypes: + texture: true + template: true + room: true + behavior: false + font: false + sound: false + style: false + tandem: false + script: false + typefaces: ! '' + showErrors: true + errorsLink: '' + branding: + accent: '#446adb' + invertPreloaderScheme: true + icon: -1 + splashScreen: -1 + forceSmoothIcons: false + forceSmoothSplashScreen: false + hideLoadingLogo: false + alternativeLogo: false + customLoadingText: '' + fps: 30 +palette: [] +globalVars: [] diff --git a/src/examples/JettyCat/img/i5c680919-3827-4ea7-9e72-a8fc81ddfb45.png b/src/examples/JettyCat (Catnip)/img/i4nrC5qWrr9m2Jg.png similarity index 100% rename from src/examples/JettyCat/img/i5c680919-3827-4ea7-9e72-a8fc81ddfb45.png rename to src/examples/JettyCat (Catnip)/img/i4nrC5qWrr9m2Jg.png diff --git a/src/examples/JettyCat/img/i2034d885-1648-4872-b64a-e5367f1cb997.png b/src/examples/JettyCat (Catnip)/img/i5j4GGLbMKjRJgT.png similarity index 100% rename from src/examples/JettyCat/img/i2034d885-1648-4872-b64a-e5367f1cb997.png rename to src/examples/JettyCat (Catnip)/img/i5j4GGLbMKjRJgT.png diff --git a/src/examples/JettyCat/img/i2b5a51ae-c05b-4a94-b9bd-e088bf2e4b1a.png b/src/examples/JettyCat (Catnip)/img/i5rK6RNPt2h3FL8.png similarity index 100% rename from src/examples/JettyCat/img/i2b5a51ae-c05b-4a94-b9bd-e088bf2e4b1a.png rename to src/examples/JettyCat (Catnip)/img/i5rK6RNPt2h3FL8.png diff --git a/src/examples/JettyCat/img/ieb24c2bc-a36c-4118-b33e-a7348c00e5bb.png b/src/examples/JettyCat (Catnip)/img/i63fH1ptfzhBTgw.png similarity index 100% rename from src/examples/JettyCat/img/ieb24c2bc-a36c-4118-b33e-a7348c00e5bb.png rename to src/examples/JettyCat (Catnip)/img/i63fH1ptfzhBTgw.png diff --git a/src/examples/JettyCat/img/i53da7582-ae6c-4843-976e-c84d6d74a489.png b/src/examples/JettyCat (Catnip)/img/i8tCtzNjp7rJQMb.png similarity index 100% rename from src/examples/JettyCat/img/i53da7582-ae6c-4843-976e-c84d6d74a489.png rename to src/examples/JettyCat (Catnip)/img/i8tCtzNjp7rJQMb.png diff --git a/src/examples/JettyCat/img/idf915202-237f-498c-bec0-25116fc17008.png b/src/examples/JettyCat (Catnip)/img/iC1wHGG9N4Htd2n.png similarity index 100% rename from src/examples/JettyCat/img/idf915202-237f-498c-bec0-25116fc17008.png rename to src/examples/JettyCat (Catnip)/img/iC1wHGG9N4Htd2n.png diff --git a/src/examples/JettyCat/img/i2a5e9894-e02c-44d8-aa28-7decb485b8fd.png b/src/examples/JettyCat (Catnip)/img/iGLrN9N95twbLk7.png similarity index 100% rename from src/examples/JettyCat/img/i2a5e9894-e02c-44d8-aa28-7decb485b8fd.png rename to src/examples/JettyCat (Catnip)/img/iGLrN9N95twbLk7.png diff --git a/src/examples/JettyCat/img/i775ba15c-b1aa-4707-bc1e-d0811846a893.png b/src/examples/JettyCat (Catnip)/img/iJ94kWM92b54ppn.png similarity index 100% rename from src/examples/JettyCat/img/i775ba15c-b1aa-4707-bc1e-d0811846a893.png rename to src/examples/JettyCat (Catnip)/img/iJ94kWM92b54ppn.png diff --git a/src/examples/JettyCat (Catnip)/img/iL4z1NpnJm5kFtJ.png b/src/examples/JettyCat (Catnip)/img/iL4z1NpnJm5kFtJ.png new file mode 100644 index 000000000..efc938759 Binary files /dev/null and b/src/examples/JettyCat (Catnip)/img/iL4z1NpnJm5kFtJ.png differ diff --git a/src/examples/JettyCat/img/i2c8009c9-ccbc-459e-8562-3146d7210e12.png b/src/examples/JettyCat (Catnip)/img/iTzNDWhj1H3fk83.png similarity index 100% rename from src/examples/JettyCat/img/i2c8009c9-ccbc-459e-8562-3146d7210e12.png rename to src/examples/JettyCat (Catnip)/img/iTzNDWhj1H3fk83.png diff --git a/src/examples/JettyCat (Catnip)/img/ibBKnhp6QMcBwNG.png b/src/examples/JettyCat (Catnip)/img/ibBKnhp6QMcBwNG.png new file mode 100644 index 000000000..0c2a9b828 Binary files /dev/null and b/src/examples/JettyCat (Catnip)/img/ibBKnhp6QMcBwNG.png differ diff --git a/src/examples/JettyCat/img/ia565bf91-c494-4aaf-8acb-8991cc7e3eda.png b/src/examples/JettyCat (Catnip)/img/ibRGWDwL5Q4kfGC.png similarity index 100% rename from src/examples/JettyCat/img/ia565bf91-c494-4aaf-8acb-8991cc7e3eda.png rename to src/examples/JettyCat (Catnip)/img/ibRGWDwL5Q4kfGC.png diff --git a/src/examples/JettyCat/img/i343c1f60-adad-4233-bfcf-c13b8aade974.png b/src/examples/JettyCat (Catnip)/img/ic5KQMJ2D58jTLg.png similarity index 100% rename from src/examples/JettyCat/img/i343c1f60-adad-4233-bfcf-c13b8aade974.png rename to src/examples/JettyCat (Catnip)/img/ic5KQMJ2D58jTLg.png diff --git a/src/examples/JettyCat/img/iee0876e4-eece-42c2-aa93-a468dab47099.png b/src/examples/JettyCat (Catnip)/img/ig16LRPdTppLR96.png similarity index 100% rename from src/examples/JettyCat/img/iee0876e4-eece-42c2-aa93-a468dab47099.png rename to src/examples/JettyCat (Catnip)/img/ig16LRPdTppLR96.png diff --git a/src/examples/JettyCat/img/i8229085f-e4d3-406a-9e95-bf13a8fec3cb.png b/src/examples/JettyCat (Catnip)/img/iktrdBzgwQpKczH.png similarity index 100% rename from src/examples/JettyCat/img/i8229085f-e4d3-406a-9e95-bf13a8fec3cb.png rename to src/examples/JettyCat (Catnip)/img/iktrdBzgwQpKczH.png diff --git a/src/examples/JettyCat/img/ieb3dadb5-49cf-4ba1-b562-421ab360842e.png b/src/examples/JettyCat (Catnip)/img/iqC1D2jBC1L4Lfr.png similarity index 100% rename from src/examples/JettyCat/img/ieb3dadb5-49cf-4ba1-b562-421ab360842e.png rename to src/examples/JettyCat (Catnip)/img/iqC1D2jBC1L4Lfr.png diff --git a/src/examples/JettyCat (Catnip)/img/splash.png b/src/examples/JettyCat (Catnip)/img/splash.png new file mode 100644 index 000000000..11f35f1bd Binary files /dev/null and b/src/examples/JettyCat (Catnip)/img/splash.png differ diff --git a/src/examples/JettyCat.ict b/src/examples/JettyCat (JavaScript).ict similarity index 98% rename from src/examples/JettyCat.ict rename to src/examples/JettyCat (JavaScript).ict index b9e63f6a2..b34630d12 100644 --- a/src/examples/JettyCat.ict +++ b/src/examples/JettyCat (JavaScript).ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0 +ctjsVersion: 5.0.0 notes: /* empty */ libs: place: @@ -37,6 +37,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: eb24c2bc-a36c-4118-b33e-a7348c00e5bb accent: '#446adb' @@ -89,6 +92,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Button_Play depth: 0 uid: 25ac0f9b-57ff-461d-8eb7-a9ce800b9c71 @@ -123,6 +127,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: PotatoCat depth: 0 uid: 8f93611e-6e95-49c4-8e2b-4cc067be2924 @@ -233,6 +238,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Tube depth: 0 uid: 455b4c7c-2249-4b12-999e-27db667688b5 @@ -266,6 +272,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Star depth: 0 uid: b7362b5c-811d-438c-b164-f53213eaefa7 @@ -309,6 +316,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: StarCounter depth: 0 uid: d4c02f18-93d0-4ad4-8e5b-62fb9a0f0af9 @@ -343,6 +351,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Button_Pause depth: 0 uid: 6a532c9b-7e32-4070-b72b-86012306c7fb @@ -377,6 +386,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Paused_Heading depth: 0 uid: ee7454ca-ba35-4d79-9b78-83e763fd81f5 @@ -398,6 +408,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Button_Continue depth: 0 uid: 43938432-cf0b-416d-91e9-8bc9a1f8abcf @@ -445,6 +456,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: OhNo_Heading depth: 0 uid: 92049024-c0ef-41ae-8512-851ce20cad3a @@ -466,6 +478,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: PressHint depth: 50 uid: ba73f80b-0995-40b6-94d5-3e82712b5ecf @@ -502,6 +515,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: EndGame_Star_Counter depth: 0 uid: 8748598b-4494-433f-9f18-fbe985c2a583 @@ -540,6 +554,7 @@ assets: style: -1 defaultText: 'Your score: 100500' textStyle: 316e5f08-494c-4570-ba65-8cd45d8b946f + extendTypes: '' - type: template name: PotatoCat_Stunned depth: 0 @@ -574,6 +589,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: InGame ondraw: '' onleave: '' @@ -689,6 +705,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: MainMenu oncreate: '' onstep: '' @@ -759,6 +776,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: UI_InGame oncreate: '' onstep: '' @@ -818,6 +836,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: UI_Paused onstep: '' ondraw: '' @@ -880,6 +899,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: UI_OhNo onstep: '' ondraw: '' @@ -963,6 +983,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Orange uid: 316e5f08-494c-4570-ba65-8cd45d8b946f origname: s8cd45d8b946f @@ -983,6 +1004,7 @@ assets: weight: 10 lastmod: 1584330374714 type: style + typeface: -1 - name: BG_Ground untill: 0 grid: @@ -1751,3 +1773,4 @@ assets: uid: pt550aaadb2b36 lastmod: 1699521109972 type: tandem +globalVars: [] diff --git a/src/examples/JettyCat (JavaScript)/img/i2034d885-1648-4872-b64a-e5367f1cb997.png b/src/examples/JettyCat (JavaScript)/img/i2034d885-1648-4872-b64a-e5367f1cb997.png new file mode 100644 index 000000000..bed545883 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i2034d885-1648-4872-b64a-e5367f1cb997.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/i2a5e9894-e02c-44d8-aa28-7decb485b8fd.png b/src/examples/JettyCat (JavaScript)/img/i2a5e9894-e02c-44d8-aa28-7decb485b8fd.png new file mode 100644 index 000000000..67c59df90 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i2a5e9894-e02c-44d8-aa28-7decb485b8fd.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/i2b5a51ae-c05b-4a94-b9bd-e088bf2e4b1a.png b/src/examples/JettyCat (JavaScript)/img/i2b5a51ae-c05b-4a94-b9bd-e088bf2e4b1a.png new file mode 100644 index 000000000..28887d69a Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i2b5a51ae-c05b-4a94-b9bd-e088bf2e4b1a.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/i2c8009c9-ccbc-459e-8562-3146d7210e12.png b/src/examples/JettyCat (JavaScript)/img/i2c8009c9-ccbc-459e-8562-3146d7210e12.png new file mode 100644 index 000000000..9d7ec68bd Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i2c8009c9-ccbc-459e-8562-3146d7210e12.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/i343c1f60-adad-4233-bfcf-c13b8aade974.png b/src/examples/JettyCat (JavaScript)/img/i343c1f60-adad-4233-bfcf-c13b8aade974.png new file mode 100644 index 000000000..36f803b6c Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i343c1f60-adad-4233-bfcf-c13b8aade974.png differ diff --git a/src/examples/JettyCat/img/i4e0a0e06-81ea-4cd2-8f3d-569a8ad3e947.png b/src/examples/JettyCat (JavaScript)/img/i4e0a0e06-81ea-4cd2-8f3d-569a8ad3e947.png similarity index 100% rename from src/examples/JettyCat/img/i4e0a0e06-81ea-4cd2-8f3d-569a8ad3e947.png rename to src/examples/JettyCat (JavaScript)/img/i4e0a0e06-81ea-4cd2-8f3d-569a8ad3e947.png diff --git a/src/examples/JettyCat (JavaScript)/img/i53da7582-ae6c-4843-976e-c84d6d74a489.png b/src/examples/JettyCat (JavaScript)/img/i53da7582-ae6c-4843-976e-c84d6d74a489.png new file mode 100644 index 000000000..57a775123 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i53da7582-ae6c-4843-976e-c84d6d74a489.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/i5c680919-3827-4ea7-9e72-a8fc81ddfb45.png b/src/examples/JettyCat (JavaScript)/img/i5c680919-3827-4ea7-9e72-a8fc81ddfb45.png new file mode 100644 index 000000000..944fb3efe Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i5c680919-3827-4ea7-9e72-a8fc81ddfb45.png differ diff --git a/src/examples/JettyCat/img/i74cac7dc-7259-4729-8494-53ed00563c2b.png b/src/examples/JettyCat (JavaScript)/img/i74cac7dc-7259-4729-8494-53ed00563c2b.png similarity index 100% rename from src/examples/JettyCat/img/i74cac7dc-7259-4729-8494-53ed00563c2b.png rename to src/examples/JettyCat (JavaScript)/img/i74cac7dc-7259-4729-8494-53ed00563c2b.png diff --git a/src/examples/JettyCat (JavaScript)/img/i775ba15c-b1aa-4707-bc1e-d0811846a893.png b/src/examples/JettyCat (JavaScript)/img/i775ba15c-b1aa-4707-bc1e-d0811846a893.png new file mode 100644 index 000000000..9c6eeea51 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i775ba15c-b1aa-4707-bc1e-d0811846a893.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/i8229085f-e4d3-406a-9e95-bf13a8fec3cb.png b/src/examples/JettyCat (JavaScript)/img/i8229085f-e4d3-406a-9e95-bf13a8fec3cb.png new file mode 100644 index 000000000..2eedfda03 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/i8229085f-e4d3-406a-9e95-bf13a8fec3cb.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/ia565bf91-c494-4aaf-8acb-8991cc7e3eda.png b/src/examples/JettyCat (JavaScript)/img/ia565bf91-c494-4aaf-8acb-8991cc7e3eda.png new file mode 100644 index 000000000..771fa615e Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/ia565bf91-c494-4aaf-8acb-8991cc7e3eda.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/idf915202-237f-498c-bec0-25116fc17008.png b/src/examples/JettyCat (JavaScript)/img/idf915202-237f-498c-bec0-25116fc17008.png new file mode 100644 index 000000000..26f1a92c8 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/idf915202-237f-498c-bec0-25116fc17008.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/ieb24c2bc-a36c-4118-b33e-a7348c00e5bb.png b/src/examples/JettyCat (JavaScript)/img/ieb24c2bc-a36c-4118-b33e-a7348c00e5bb.png new file mode 100644 index 000000000..edcf23c2d Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/ieb24c2bc-a36c-4118-b33e-a7348c00e5bb.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/ieb3dadb5-49cf-4ba1-b562-421ab360842e.png b/src/examples/JettyCat (JavaScript)/img/ieb3dadb5-49cf-4ba1-b562-421ab360842e.png new file mode 100644 index 000000000..b1fe66df7 Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/ieb3dadb5-49cf-4ba1-b562-421ab360842e.png differ diff --git a/src/examples/JettyCat (JavaScript)/img/iee0876e4-eece-42c2-aa93-a468dab47099.png b/src/examples/JettyCat (JavaScript)/img/iee0876e4-eece-42c2-aa93-a468dab47099.png new file mode 100644 index 000000000..670b9b7ff Binary files /dev/null and b/src/examples/JettyCat (JavaScript)/img/iee0876e4-eece-42c2-aa93-a468dab47099.png differ diff --git a/src/examples/JettyCat/img/splash.png b/src/examples/JettyCat (JavaScript)/img/splash.png similarity index 100% rename from src/examples/JettyCat/img/splash.png rename to src/examples/JettyCat (JavaScript)/img/splash.png diff --git a/src/examples/LabRaid shooter (Catnip).ict b/src/examples/LabRaid shooter (Catnip).ict new file mode 100644 index 000000000..feba8a3c6 --- /dev/null +++ b/src/examples/LabRaid shooter (Catnip).ict @@ -0,0 +1,14249 @@ +ctjsVersion: 5.0.0 +notes: /* empty */ +libs: + keyboard: {} + keyboard.polyfill: {} + random: {} + tween: {} + transition: {} + place: + undefined: '' + gridX: 128 + gridY: 128 + debugMode: false + debugText: 8 + pointer: + preventdefault: false + startlocked: false + desktop: {} +actions: + - name: MoveX + methods: + - code: keyboard.KeyD + - code: keyboard.KeyA + multiplier: -1 + - code: keyboard.ArrowRight + - code: keyboard.ArrowLeft + multiplier: -1 + - name: MoveY + methods: + - code: keyboard.KeyW + multiplier: -1 + - code: keyboard.KeyS + - code: keyboard.ArrowUp + multiplier: -1 + - code: keyboard.ArrowDown + - name: Shoot + methods: + - code: keyboard.Space + - code: pointer.Any + - name: Interact + methods: + - code: keyboard.KeyE +scripts: [] +starting: 0 +settings: + authoring: + author: Cosmo Myzrail Gorynych + site: 'https://ctjs.rocks/' + title: Dungeon Crawler demo + version: + - 1 + - 0 + - 0 + versionPostfix: '' + appId: rocks.ctjs.labraid + rendering: + usePixiLegacy: true + maxFPS: 60 + pixelatedrender: true + highDensity: true + desktopMode: fullscreen + hideCursor: true + mobileScreenOrientation: unspecified + viewMode: scaleFit + export: + windows: true + linux: true + mac: true + functionWrap: true + codeModifier: none + bundleAssetTree: false + bundleAssetTypes: + texture: true + template: true + room: true + behavior: false + font: false + sound: false + style: false + tandem: false + typefaces: ! '' + autocloseDesktop: true + showErrors: true + errorsLink: '' + branding: + icon: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 + accent: '#446adb' + invertPreloaderScheme: true + splashScreen: dc7b9662-c746-403c-9f3e-67425fd480a3 + forceSmoothIcons: false + forceSmoothSplashScreen: false + fps: 30 +palette: + - '#000337' + - '#4FE77F' +startroom: eed8a427-1c70-425d-b633-7b6ea00c7b7c +contentTypes: [] +language: catnip +assets: + - name: Slime + depth: 0 + texture: 4733fb53-5e41-4cf8-b9a8-91ad700f2246 + extends: + cgroup: Solid + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + lastmod: 1716470536232 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: aggroRange + value: 120 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: aggroed + value: + lib: core.logic + code: 'false' + values: {} + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: cat + value: + lib: core.arrays + code: get + values: + obj: + lib: core + code: templates.list + values: + list: c40336ea-2846-45d5-97ba-d51852d3f6c5 + index: 0 + - lib: core.logic + code: if branch + values: + body1: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.movement + code: set speed + values: + speed: 90 + - lib: core.movement + code: set direction + values: + degrees: + lib: core + code: u.pdn + values: + x1: + lib: core.movement + code: x + values: {} + y1: + lib: core.movement + code: 'y' + values: {} + x2: + lib: core.movement + code: x of + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + y2: + lib: core.movement + code: y of + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + body2: + - lib: core.movement + code: set speed + values: + speed: 0 + condition: + lib: core.math + code: '>' + values: + a: + lib: core + code: u.pdc + values: + x1: + lib: core.movement + code: x + values: {} + y1: + lib: core.movement + code: 'y' + values: {} + x2: + lib: core.movement + code: x of + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + y2: + lib: core.movement + code: y of + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + b: 6 + body2: + - lib: core.logic + code: if branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: aggroed + value: + lib: core.logic + code: 'true' + values: {} + body2: [] + condition: + lib: core.math + code: <= + values: + b: + lib: core.hidden + code: property + values: + variableName: aggroRange + a: + lib: core + code: u.pdc + values: + x1: + lib: core.movement + code: x + values: {} + x2: + lib: core.movement + code: x of + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + y1: + lib: core.movement + code: 'y' + values: {} + y2: + lib: core.movement + code: y of + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + condition: + lib: core.hidden + code: property + values: + variableName: aggroed + body2: [] + condition: + lib: core.templates + code: is valid + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + - lib: place + code: move template smart + values: + cgroup: Solid + eventKey: OnStep + variables: + - cat + - lib: core + arguments: {} + code: + - lib: core + code: emitters.fire + values: + name: ptb58af8b29aed + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core + code: sounds.play + values: + name: fdd0ec77-ba8d-4999-adba-20ea72d6f5ad + eventKey: OnDestroy + variables: [] + - lib: core + arguments: {} + code: + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + eventKey: OnDraw + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.templates + code: kill + values: {} + arguments: + template: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + lib: place + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.templates + code: kill + values: {} + - lib: core.logic + code: if branch + values: + body1: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + body2: [] + condition: + lib: core.templates + code: is copy + values: + copy: + lib: core.hidden + code: event variable + values: + variableName: other + arguments: + group: Bullet + lib: place + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: + - aggroRange + - aggroed + - name: Shoot + uid: 97baf84a-32d3-450c-a52e-25a770565520 + lastmod: 1703052063333 + type: sound + preload: ! '' + variants: + - uid: Ddb6NGrPN3q2P8 + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/s97baf84a-32d3-450c-a52e-25a770565520.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: Toggle + uid: aeec04ae-d50c-4c47-bcd9-89d8f90f736a + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: hjzRWWbDHm13mm + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: SmallHit + uid: b7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: c75548M8CqkwQ6 + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: Hit + uid: 0559d8e7-3e27-4c25-9e38-164cd25dc4e7 + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: 1Ct4QLznRkB2tr + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: InGameTheme + uid: d470f423-a1ed-4189-b117-8ebf7b4eac62 + lastmod: 1703052063334 + type: sound + preload: true + variants: + - uid: wWNRrzgFwM2p2b + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62.ogg + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: SlimeExplosion + uid: fdd0ec77-ba8d-4999-adba-20ea72d6f5ad + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: DtgdP12dNcp3C8 + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: Particle_Blue + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i9b967bf5-9694-43b6-9812-0f974b2b73c9.png + source: /home/comigo/UNWORK/Tileset/Particle_Blue.png + shape: rect + left: 8 + right: 8 + top: 8 + bottom: 8 + uid: 9b967bf5-9694-43b6-9812-0f974b2b73c9 + padding: 1 + lastmod: 1597726451521 + type: texture + - name: Particle_Red + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: ifee922c6-864c-448f-a2df-937389a42005.png + source: /home/comigo/UNWORK/Tileset/Particle_Red.png + shape: rect + left: 8 + right: 8 + top: 8 + bottom: 8 + uid: fee922c6-864c-448f-a2df-937389a42005 + padding: 1 + lastmod: 1597726454098 + type: texture + - name: Slime + untill: 0 + grid: + - 2 + - 1 + axis: + - 8 + - 13 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png + source: /home/comigo/UNWORK/Tileset/Slime.png + shape: rect + left: 7 + right: 7 + top: 9 + bottom: 0 + uid: 4733fb53-5e41-4cf8-b9a8-91ad700f2246 + padding: 1 + lastmod: 1656663031400 + type: texture + - name: Particle_White + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png + shape: rect + left: 0 + right: 16 + top: 0 + bottom: 16 + uid: d9107804-cf88-4bd9-913c-c9ac1a4d5f05 + padding: 1 + source: /home/comigo/UNWORK/Tileset/Particle_White.png + type: texture + - name: RedSparks + emitters: + - uid: 4f1c4b6a-d8a7-428b-a7f2-c7ce01c0f162 + texture: fee922c6-864c-448f-a2df-937389a42005 + openedTabs: + - texture + - colors + - gravity + - spawning + - velocity + - direction + - scaling + textureBehavior: textureRandom + animatedSingleFramerate: 10 + settings: + frequency: 0.019 + lifetime: + min: 0.1 + max: 0.25 + spawnChance: 0.8 + emitterLifetime: 0.1 + maxParticles: 1001 + addAtBack: false + particlesPerWave: 1 + pos: + x: 0 + 'y': 0 + behaviors: + - type: alpha + config: + alpha: + list: + - value: 1 + time: 0 + - time: 0.4880952380952381 + value: 0.975 + - value: 1 + time: 1 + isStepped: false + - type: color + config: + color: + list: + - value: ffffff + time: 0 + - time: 0.4880952380952381 + value: FFFFFF + - value: ffffff + time: 1 + isStepped: false + - type: blendMode + config: + blendMode: normal + - type: scale + config: + scale: + list: + - value: 1 + time: 0 + - time: 0.5113937419755831 + value: 0.9700000350952176 + - value: 0.0499999809265122 + time: 1 + isStepped: false + minMult: ! '' + - type: moveAcceleration + config: + minStart: 150 + maxStart: 150 + accel: + x: 0 + 'y': 416 + rotate: false + maxSpeed: 0 + - type: spawnShape + config: + type: torus + data: + innerRadius: 0 + radius: 0 + x: 0 + 'y': 0 + rotation: false + - type: rotation + config: + minStart: 0 + maxStart: -180 + minSpeed: 0 + maxSpeed: 0 + accel: 0 + uid: pt1f52a07073af + lastmod: 1697615820182 + type: tandem + - name: BlueSparks + emitters: + - uid: 4f1c4b6a-d8a7-428b-a7f2-c7ce01c0f162 + texture: 9b967bf5-9694-43b6-9812-0f974b2b73c9 + openedTabs: + - texture + - colors + - gravity + - velocity + - direction + - scaling + - shape + textureBehavior: textureRandom + animatedSingleFramerate: 10 + settings: + frequency: 0.019 + lifetime: + min: 0.4 + max: 0.6 + spawnChance: 0.8 + emitterLifetime: 0.1 + maxParticles: 1001 + addAtBack: false + particlesPerWave: 1 + pos: + x: 0 + 'y': 0 + behaviors: + - type: alpha + config: + alpha: + list: + - value: 0.99 + time: 0 + - time: 0.46825396825396826 + value: 0.9849999999999999 + - value: 1 + time: 1 + isStepped: false + - type: color + config: + color: + list: + - value: ffffff + time: 0 + - time: 0.46825396825396826 + value: FFFFFF + - value: ffffff + time: 1 + isStepped: false + - type: blendMode + config: + blendMode: normal + - type: scale + config: + scale: + list: + - value: 1 + time: 0 + - time: 0.5113937419755831 + value: 0.9700000350952176 + - value: 0.0499999809265122 + time: 1 + isStepped: false + minMult: ! '' + - type: moveAcceleration + config: + minStart: 150 + maxStart: 150 + accel: + x: 0 + 'y': 980 + rotate: true + maxSpeed: 3000 + - type: spawnShape + config: + type: torus + data: + innerRadius: 0 + radius: 9 + x: 0 + 'y': 0 + rotation: false + - type: rotation + config: + minStart: -120 + maxStart: -60 + minSpeed: 0 + maxSpeed: 0 + accel: 0 + uid: eeee43af-201a-483c-8c2f-edde43ecfba6 + lastmod: 1697615820182 + type: tandem + - name: Slime_Dead + emitters: + - uid: 0e491f30-ae29-4653-8750-6cfc60976637 + texture: d9107804-cf88-4bd9-913c-c9ac1a4d5f05 + openedTabs: + - texture + - colors + - scaling + - velocity + - shape + textureBehavior: textureRandom + animatedSingleFramerate: 10 + settings: + frequency: 0.015 + lifetime: + min: 0.22 + max: 0.38 + spawnChance: 1 + emitterLifetime: 0.1 + maxParticles: 1000 + addAtBack: false + particlesPerWave: 2 + pos: + x: -4 + 'y': -8 + behaviors: + - type: alpha + config: + alpha: + list: + - value: 1 + time: 0 + - time: 0.6661227595367217 + value: 1 + - value: 0 + time: 1 + isStepped: false + - type: color + config: + color: + list: + - value: 4FE77F + time: 0 + - time: 0.6661227595367217 + value: 4FE77F + - value: 4FE77F + time: 1 + isStepped: false + - type: blendMode + config: + blendMode: normal + - type: scale + config: + scale: + list: + - value: 0.0599650728599917 + time: 0 + - time: 0.07533531209046257 + value: 0.6299996284346806 + - value: 0.38001411948213104 + time: 1 + isStepped: false + minMult: ! '' + - type: moveAcceleration + config: + minStart: 67.99573628796176 + maxStart: 199.98745967047574 + accel: + x: 0 + 'y': 864 + rotate: true + maxSpeed: 0 + - type: spawnShape + config: + type: rect + data: + x: 0 + 'y': 0 + width: 8 + height: 1 + w: 8 + h: 8 + - type: rotation + config: + minStart: -51 + maxStart: -137 + minSpeed: 0 + maxSpeed: 0 + accel: 0 + showShapeVisualizer: true + uid: ptb58af8b29aed + lastmod: 1697615820182 + type: tandem + previewTexture: 4733fb53-5e41-4cf8-b9a8-91ad700f2246 + - type: folder + uid: ngRwWfKFr85QF6 + colorClass: error + icon: circle + name: Core + lastmod: 1697615948063 + entries: + - type: folder + uid: zPr4DC3chkn7wn + colorClass: accent1 + icon: template + name: Cat character + lastmod: 1697615835396 + entries: + - name: Cat + depth: 5 + texture: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 + extends: + cgroup: '' + uid: c40336ea-2846-45d5-97ba-d51852d3f6c5 + lastmod: 1716470410134 + events: + - lib: core + arguments: {} + code: + - lib: core.camera + code: follow this + values: {} + - lib: core.camera + code: set shiftY + values: + value: -8 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: maxSpeed + value: 120 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: invincibleTimer + value: 0 + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.movement + code: set vspeed + values: + speed: + lib: core.math + code: '*' + values: + b: + lib: core.hidden + code: property + values: + variableName: maxSpeed + a: + lib: core.actions + code: action value + values: + action: MoveY + - lib: core.movement + code: set hspeed + values: + speed: + lib: core.math + code: '*' + values: + b: + lib: core.hidden + code: property + values: + variableName: maxSpeed + a: + lib: core.actions + code: action value + values: + action: MoveX + - lib: place + code: move template smart + values: + cgroup: Solid + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: trap + value: + lib: place + code: place.meet + values: + template: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + me: + lib: core.propsVars + code: this + values: {} + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: enemy + value: + lib: place + code: place.meet + values: + template: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + me: + lib: core.propsVars + code: this + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + x: + lib: core.movement + code: x + values: {} + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: damaged + value: + lib: core.logic + code: 'false' + values: {} + - lib: core.logic + code: if branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: damaged + value: + lib: core.logic + code: 'true' + values: {} + body2: [] + condition: + lib: core.logic + code: a AND b + values: + a: + lib: core.hidden + code: variable + values: + variableName: trap + b: + lib: core.objects + code: object read + values: + object: + lib: core.hidden + code: variable + values: + variableName: trap + property: active + - lib: core.logic + code: if branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: damaged + value: + lib: core.logic + code: 'true' + values: {} + body2: [] + condition: + lib: core.hidden + code: variable + values: + variableName: enemy + - lib: core.logic + code: if branch + values: + body1: + - lib: core + code: emitters.fire + values: + name: fa469921-6f9c-43c7-928a-a8f6693e58be + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core + code: sounds.play + values: + name: 1cc5a5e0-765c-4bba-a006-8b597802ace6 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: invincibleTimer + value: 1 + - lib: core.propsVars + code: decrement + values: + var: + lib: core.objects + code: room read + values: + property: lives + - lib: core.logic + code: if branch + values: + body1: + - lib: core.templates + code: kill + values: {} + - lib: core + code: templates.copy + values: + template: f11d4e26-8450-4187-8163-b70facceca7e + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + body2: [] + condition: + lib: core.math + code: <= + values: + a: + lib: core.objects + code: room read + values: + property: lives + b: 0 + body2: [] + condition: + lib: core.hidden + code: variable + values: + variableName: damaged + body2: + - lib: core.propsVars + code: decrease + values: + var: + lib: core.hidden + code: property + values: + variableName: invincibleTimer + val: + lib: core + code: u.time + values: {} + condition: + lib: core.math + code: <= + values: + b: 0 + a: + lib: core.hidden + code: property + values: + variableName: invincibleTimer + eventKey: OnStep + variables: + - trap + - enemy + - damaged + - lib: core + arguments: {} + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.appearance + code: set texture + values: + texture: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 + body2: + - lib: core.appearance + code: set texture + values: + texture: 8bef1226-7fb8-4bf5-8120-ac6e53d81ea5 + condition: + lib: core.math + code: < + values: + a: + lib: core.movement + code: x + values: {} + b: + lib: pointer + code: pointer.x + values: {} + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.appearance + code: set alpha + values: + value: 0.5 + body2: + - lib: core.appearance + code: set alpha + values: + value: 1 + condition: + lib: core.logic + code: a AND b + values: + a: + lib: core.math + code: '>' + values: + a: + lib: core.hidden + code: property + values: + variableName: invincibleTimer + b: 0 + b: + lib: core.math + code: '>' + values: + a: + lib: core.math + code: '%' + values: + a: + lib: core.hidden + code: property + values: + variableName: invincibleTimer + b: 1 + b: 0.5 + eventKey: OnDraw + variables: [] + - eventKey: OnActionPress + code: + - lib: core + code: templates.copy + values: + return: + lib: core.hidden + code: variable + values: + variableName: bullet + template: 57f03679-dc98-4ebc-87ef-a4ca7b275731 + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.math + code: '-' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 5 + customOptions: + direction: + lib: core + code: u.pdn + values: + x1: + lib: core.movement + code: x + values: {} + y1: + lib: core.movement + code: 'y' + values: {} + x2: + lib: pointer + code: pointer.x + values: {} + y2: + lib: pointer + code: pointer.y + values: {} + arguments: + action: Shoot + lib: core + variables: + - bullet + - eventKey: collisionTemplate + code: + - lib: core.objects + code: current room write + values: + property: checkpointX + value: + lib: core.objects + code: object read + values: + object: + lib: core.hidden + code: event variable + values: + variableName: other + property: x + - lib: core.objects + code: current room write + values: + property: checkpointY + value: + lib: core.objects + code: object read + values: + object: + lib: core.hidden + code: event variable + values: + variableName: other + property: 'y' + arguments: + template: 469b9eef-6117-43a5-87d3-7151da7eba06 + lib: place + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.templates + code: kill + values: {} + - lib: core + code: templates.copy + values: + template: c480ea86-1545-4048-8f2e-1ded726cfa92 + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.math + code: '-' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 8 + arguments: + template: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + lib: place + variables: [] + type: template + loopAnimation: true + playAnimationOnStart: true + animationFPS: 5 + visible: true + blendMode: normal + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: + - maxSpeed + - invincibleTimer + - name: Cat_Falling + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i96121d6f-6483-48f8-841b-b307befc7d42.png + shape: circle + left: 0 + right: 16 + top: 0 + bottom: 16 + uid: 96121d6f-6483-48f8-841b-b307befc7d42 + padding: 1 + source: /home/comigo/UNWORK/Tileset/CatFalling.png + r: 8 + lastmod: 1598573377064 + type: texture + - name: Cat_Left + untill: 0 + grid: + - 2 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png + source: /home/comigo/UNWORK/Tileset/Cat_Left.png + shape: rect + left: 7 + right: 7 + top: 13 + bottom: 0 + uid: 8bef1226-7fb8-4bf5-8120-ac6e53d81ea5 + padding: 1 + lastmod: 1656663036558 + type: texture + - name: Cat_Right + untill: 0 + grid: + - 2 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png + source: /home/comigo/UNWORK/Tileset/Cat_Right.png + shape: rect + left: 7 + right: 7 + top: 13 + bottom: 0 + uid: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 + padding: 1 + lastmod: 1597803968174 + type: texture + - name: Cat_Death + depth: 0 + texture: 8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1 + extends: {} + uid: f11d4e26-8450-4187-8163-b70facceca7e + lastmod: 1712231687374 + events: + - lib: core + arguments: {} + code: + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + eventKey: OnCreate + variables: [] + - eventKey: OnAnimationComplete + code: + - lib: core + code: rooms.switch + values: + roomName: + lib: core.objects + code: room read + values: + property: name + arguments: {} + lib: core + variables: [] + type: template + loopAnimation: false + playAnimationOnStart: true + visible: true + blendMode: normal + animationFPS: 1 + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: Cat_Death + untill: 0 + grid: + - 2 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png + shape: rect + left: 8 + right: 8 + top: 16 + bottom: 0 + uid: 8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1 + padding: 1 + source: /home/comigo/UNWORK/Tileset/Cat_Death.png + lastmod: 1712231289884 + type: texture + - name: Cat_Falling + depth: 0 + texture: 96121d6f-6483-48f8-841b-b307befc7d42 + extends: {} + uid: c480ea86-1545-4048-8f2e-1ded726cfa92 + lastmod: 1712231978118 + events: + - lib: core + arguments: {} + code: + - lib: core + code: sounds.play + values: + name: 8074a9ef-0215-4e02-a107-cb20d1fc5de9 + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: decrement + values: + var: + lib: core.objects + code: room read + values: + property: lives + - lib: core + code: templates.copy + values: + template: c40336ea-2846-45d5-97ba-d51852d3f6c5 + x: + lib: core.objects + code: room read + values: + property: checkpointX + 'y': + lib: core.objects + code: room read + values: + property: checkpointY + body2: + - lib: core + code: rooms.switch + values: + roomName: + lib: core.objects + code: room read + values: + property: name + condition: + lib: core.math + code: '>' + values: + a: + lib: core.objects + code: room read + values: + property: lives + b: 0 + eventKey: OnDestroy + variables: [] + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: decrease + values: + var: + lib: core.appearance + code: get angle + values: {} + val: + lib: core.math + code: '*' + values: + a: + lib: core + code: u.time + values: {} + b: 600 + - lib: core.propsVars + code: decrease + values: + var: + lib: core.appearance + code: get scale x + values: {} + val: + lib: core.math + code: / + values: + b: 1.5 + a: + lib: core + code: u.time + values: {} + - lib: core.appearance + code: set scale + values: + scale: + lib: core.math + code: '-' + values: + a: + lib: core.appearance + code: get scale x + values: {} + b: + lib: core + code: u.time + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + a: + lib: core.appearance + code: get scale x + values: {} + b: 0 + eventKey: OnDraw + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: CatDamage + uid: 1cc5a5e0-765c-4bba-a006-8b597802ace6 + lastmod: 1712231588035 + type: sound + preload: ! '' + variants: + - uid: D8LpLdtHq6qBQD + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: Cat_Damage + emitters: + - uid: 0e491f30-ae29-4653-8750-6cfc60976637 + texture: d9107804-cf88-4bd9-913c-c9ac1a4d5f05 + openedTabs: + - texture + - colors + - scaling + - velocity + - shape + textureBehavior: textureRandom + animatedSingleFramerate: 10 + settings: + frequency: 0.015 + lifetime: + min: 0.22 + max: 0.38 + spawnChance: 1 + emitterLifetime: 0.1 + maxParticles: 1000 + addAtBack: false + particlesPerWave: 1 + pos: + x: 0 + 'y': -8 + behaviors: + - type: alpha + config: + alpha: + list: + - value: 1 + time: 0 + - time: 0.6700910135049757 + value: 1 + - value: 0 + time: 1 + isStepped: false + - type: color + config: + color: + list: + - value: E74F4F + time: 0 + - time: 0.6700910135049757 + value: E74F4F + - value: E74F4F + time: 1 + isStepped: false + - type: blendMode + config: + blendMode: normal + - type: scale + config: + scale: + list: + - value: 0.0599650728599917 + time: 0 + - time: 0.07930356605871654 + value: 0.4299996284346806 + - value: 0.18001411948213103 + time: 1 + isStepped: false + minMult: ! '' + - type: moveAcceleration + config: + minStart: 129.9899677363806 + maxStart: 162.48745967047574 + accel: + x: 0 + 'y': 864 + rotate: true + maxSpeed: 0 + - type: spawnShape + config: + type: torus + data: + x: 0 + 'y': 0 + radius: 0 + innerRadius: 0 + rotation: true + - type: rotation + config: + minStart: -51 + maxStart: -137 + minSpeed: 0 + maxSpeed: 0 + accel: 0 + uid: fa469921-6f9c-43c7-928a-a8f6693e58be + lastmod: 1697615820182 + type: tandem + previewTexture: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 + - name: Fall + uid: 8074a9ef-0215-4e02-a107-cb20d1fc5de9 + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: H1P1QdpCz7f85g + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - name: Bullet + depth: 0 + texture: 29cd8366-37bd-4a4d-96a1-a2da4d674972 + extends: + cgroup: Bullet + uid: 57f03679-dc98-4ebc-87ef-a4ca7b275731 + lastmod: 1711619236602 + events: + - lib: core + arguments: {} + code: + - lib: core + code: sounds.play + values: + name: 97baf84a-32d3-450c-a52e-25a770565520 + - lib: core.movement + code: set speed + values: + speed: 240 + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.movement + code: move copy + values: {} + eventKey: OnStep + variables: [] + - lib: core + arguments: {} + code: + - lib: core + code: sounds.play + values: + name: b7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab + - lib: core + code: emitters.fire + values: + name: pt1f52a07073af + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + eventKey: OnDestroy + variables: [] + - lib: core + arguments: {} + code: + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + eventKey: OnDraw + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.templates + code: kill + values: {} + arguments: + group: Solid + lib: place + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: Bullet + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i29cd8366-37bd-4a4d-96a1-a2da4d674972.png + source: /home/comigo/UNWORK/Tileset/Bullet.png + shape: circle + left: 0 + right: 16 + top: 0 + bottom: 16 + uid: 29cd8366-37bd-4a4d-96a1-a2da4d674972 + padding: 1 + r: 3 + lastmod: 1597726178256 + type: texture + - type: folder + uid: Cj8kWwmBdPQG1W + colorClass: text + icon: room + name: Level stuff + lastmod: 1697616020438 + entries: + - name: Tileset + untill: 0 + grid: + - 8 + - 4 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 128 + imgHeight: 64 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i4f8a6124-427b-410b-a467-ac42afec3644.png + source: /home/comigo/UNWORK/Tileset/Tileset.png + shape: rect + left: 0 + right: 16 + top: 0 + bottom: 16 + uid: 4f8a6124-427b-410b-a467-ac42afec3644 + padding: 1 + lastmod: 1599528760547 + type: texture + - name: Door + untill: 0 + grid: + - 2 + - 2 + axis: + - 16 + - 32 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 32 + height: 32 + offx: 0 + offy: 0 + origname: i3a7c7928-a731-4940-9854-17936b3c9a46.png + source: /home/comigo/UNWORK/Tileset/Door.png + shape: rect + left: 16 + right: 16 + top: 27 + bottom: -6 + uid: 3a7c7928-a731-4940-9854-17936b3c9a46 + padding: 1 + lastmod: 1599528744595 + type: texture + - name: Door + depth: 1 + texture: 3a7c7928-a731-4940-9854-17936b3c9a46 + extends: + cgroup: Solid + uid: c701a029-af09-4fcf-9712-0fcdaa3581be + lastmod: 1711621936165 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: opened + value: + lib: core.logic + code: 'false' + values: {} + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: cat + value: + lib: core.arrays + code: get + values: + obj: + lib: core + code: templates.list + values: + list: c40336ea-2846-45d5-97ba-d51852d3f6c5 + index: 0 + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: opened + value: + lib: core.logic + code: 'true' + values: {} + - lib: core.objects + code: this write + values: + property: cgroup + value: Unsolid + - lib: core + code: sounds.play + values: + name: fbe42ee3-6fe6-43ac-a99c-09da748ddc46 + - lib: core.appearance + code: play animation + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + a: + lib: core + code: u.pdc + values: + x1: + lib: core.movement + code: x + values: {} + y1: + lib: core.movement + code: 'y' + values: {} + x2: + lib: core.objects + code: object read + values: + property: x + object: + lib: core.hidden + code: variable + values: + variableName: cat + y2: + lib: core.objects + code: object read + values: + property: 'y' + object: + lib: core.hidden + code: variable + values: + variableName: cat + b: 48 + body2: [] + condition: + lib: core.logic + code: a AND b + values: + a: + lib: core.logic + code: NOT a + values: + a: + lib: core.hidden + code: property + values: + variableName: opened + b: + lib: core.templates + code: is copy + values: + copy: + lib: core.hidden + code: variable + values: + variableName: cat + eventKey: OnStep + variables: + - cat + type: template + loopAnimation: false + visible: true + blendMode: normal + animationFPS: 15 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: + - opened + - name: Door_Base + untill: 0 + grid: + - 1 + - 1 + axis: + - 16 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 16 + width: 32 + height: 16 + offx: 0 + offy: 0 + origname: iae954867-1039-43f6-bf6d-d8684cb58612.png + shape: rect + left: 16 + right: 16 + top: 16 + bottom: 0 + uid: ae954867-1039-43f6-bf6d-d8684cb58612 + padding: 1 + source: /home/comigo/UNWORK/Tileset/Door_Base.png + lastmod: 1599528776390 + type: texture + - name: Elevator + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 32 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 32 + width: 16 + height: 32 + offx: 0 + offy: 0 + origname: i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png + source: /home/comigo/UNWORK/Tileset/Elevator.png + shape: rect + left: 8 + right: 8 + top: 16 + bottom: 0 + uid: 2637e46e-06b2-4ca0-b17d-4bbf6eca44b7 + padding: 1 + lastmod: 1598583384037 + type: texture + - name: Elevator + depth: 0 + texture: 2637e46e-06b2-4ca0-b17d-4bbf6eca44b7 + extends: {} + uid: 7fea051e-83e5-4e54-848b-ab3ca861e5cb + lastmod: 1711634966849 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: transitionStarted + value: + lib: core.logic + code: 'false' + values: {} + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + eventKey: OnCreate + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: transitionStarted + value: + lib: core.logic + code: 'true' + values: {} + - lib: transition + code: transition.slideOut + values: + then: + - lib: core + code: rooms.switch + values: + roomName: + lib: core.objects + code: room read + values: + property: nextLevel + duration: 750 + body2: [] + condition: + lib: core.logic + code: NOT a + values: + a: + lib: core.hidden + code: property + values: + variableName: transitionStarted + arguments: + template: c40336ea-2846-45d5-97ba-d51852d3f6c5 + lib: place + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: + - transitionStarted + - name: SpikeTrap + untill: 0 + grid: + - 2 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i6c23e805-94b6-4e3a-8606-682c36960233.png + source: /home/comigo/UNWORK/Tileset/SpikeTrap.png + shape: rect + left: 8 + right: 8 + top: 16 + bottom: 0 + uid: 6c23e805-94b6-4e3a-8606-682c36960233 + padding: 1 + lastmod: 1597726354223 + type: texture + - name: Trap + depth: -5000 + texture: 6c23e805-94b6-4e3a-8606-682c36960233 + extends: {} + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + lastmod: 1712231198211 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: spikeTimer + value: 0 + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: increase + values: + var: + lib: core.hidden + code: property + values: + variableName: spikeTimer + val: + lib: core + code: u.time + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: spikeTimer + value: 0 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: active + value: + lib: core.logic + code: NOT a + values: + a: + lib: core.hidden + code: property + values: + variableName: active + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.appearance + code: goto stop + values: + frame: 1 + body2: + - lib: core.appearance + code: goto stop + values: + frame: 0 + condition: + lib: core.hidden + code: property + values: + variableName: active + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.hidden + code: property + values: + variableName: spikeTimer + b: 3 + eventKey: OnStep + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: + - spikeTimer + - active + - name: Medkit + depth: 0 + texture: c61a44b6-1f4d-43c2-9356-7288658947a9 + extends: {} + uid: b336d91c-2876-4686-b8b4-901045a86ac7 + lastmod: 1711630855587 + events: + - lib: core + arguments: {} + code: + - lib: core + code: sounds.play + values: + name: d06c5cd6-41eb-42c0-9caa-3306e2558b19 + eventKey: OnDestroy + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: increment + values: + var: + lib: core.objects + code: room read + values: + property: lives + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + a: + lib: core.objects + code: room read + values: + property: lives + b: 3 + arguments: + template: c40336ea-2846-45d5-97ba-d51852d3f6c5 + lib: place + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: Medkit + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: ic61a44b6-1f4d-43c2-9356-7288658947a9.png + shape: rect + left: 0 + right: 16 + top: 0 + bottom: 16 + uid: c61a44b6-1f4d-43c2-9356-7288658947a9 + padding: 1 + source: /home/comigo/UNWORK/Tileset/Medkit.png + type: texture + - name: Checkpoint + depth: 0 + texture: a42e0dff-69c9-46c3-8996-745aaa769698 + extends: + cgroup: Checkpoint + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + lastmod: 1668342920220 + events: [] + type: template + loopAnimation: true + visible: false + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: Checkpoint + untill: 0 + grid: + - 1 + - 1 + axis: + - 16 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 32 + imgHeight: 32 + width: 32 + height: 32 + offx: 0 + offy: 0 + origname: ia42e0dff-69c9-46c3-8996-745aaa769698.png + shape: rect + left: 16 + right: 16 + top: 16 + bottom: 16 + uid: a42e0dff-69c9-46c3-8996-745aaa769698 + padding: 1 + lastmod: 1598572915462 + type: texture + - name: Door + uid: fbe42ee3-6fe6-43ac-a99c-09da748ddc46 + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: 7FPj1Ttm8n6PBG + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - type: folder + uid: r17c443PfF9fzt + colorClass: success + icon: unpackage + name: Decor + lastmod: 1697615886623 + entries: + - name: Crate + depth: 0 + texture: 31948760-8965-4768-ab1d-2b87d0b7fc3a + extends: + cgroup: Solid + uid: 4e473462-8009-438e-9f53-1032e3a335cf + lastmod: 1711619781845 + events: + - lib: core + arguments: {} + code: + - lib: core.appearance + code: set depth + values: + value: + lib: core.movement + code: 'y' + values: {} + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core + code: sounds.play + values: + name: 0559d8e7-3e27-4c25-9e38-164cd25dc4e7 + - lib: core + code: templates.copy + values: + template: 9fc1fec8-50bb-49e6-8fb4-c10ad589bf0b + 'y': + lib: core.movement + code: 'y' + values: {} + x: + lib: core.movement + code: x + values: {} + eventKey: OnDestroy + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.templates + code: kill + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + body2: [] + condition: + lib: core.templates + code: is copy + values: + copy: + lib: core.hidden + code: event variable + values: + variableName: other + arguments: + group: Bullet + lib: place + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: Crate + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i31948760-8965-4768-ab1d-2b87d0b7fc3a.png + source: /home/comigo/UNWORK/Tileset/Crate.png + shape: rect + left: 7 + right: 7 + top: 14 + bottom: -1 + uid: 31948760-8965-4768-ab1d-2b87d0b7fc3a + padding: 1 + lastmod: 1597799697782 + type: texture + - name: Crate_Debris + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: id25aebb8-d135-4b9c-b2b5-844298c35a62.png + source: /home/comigo/UNWORK/Tileset/Crate_Debris.png + shape: rect + left: 8 + right: 8 + top: 16 + bottom: 0 + uid: d25aebb8-d135-4b9c-b2b5-844298c35a62 + padding: 1 + lastmod: 1597799701862 + type: texture + - name: Crate_Debris + depth: -6500 + texture: d25aebb8-d135-4b9c-b2b5-844298c35a62 + extends: {} + uid: 9fc1fec8-50bb-49e6-8fb4-c10ad589bf0b + lastmod: 1668342957563 + events: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: HazardousTube_Debris + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png + source: /home/comigo/UNWORK/Tileset/HazardousTube_Debris.png + shape: rect + left: 8 + right: 8 + top: 8 + bottom: 8 + uid: 80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc + padding: 1 + lastmod: 1597811277810 + type: texture + - name: HazardousTube_Debris + depth: -6500 + texture: 80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc + extends: {} + uid: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + lastmod: 1668343128145 + events: + - lib: core + arguments: {} + code: [] + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: [] + eventKey: OnStep + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: HazardousTube + depth: 0 + texture: 1f0fbe96-38aa-4db4-a011-c0cf34b91d00 + extends: + cgroup: Solid + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + lastmod: 1711619904259 + events: + - lib: core + arguments: {} + code: + - lib: core + code: sounds.play + values: + name: 0559d8e7-3e27-4c25-9e38-164cd25dc4e7 + - lib: core + code: templates.copy + values: + template: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core + code: emitters.fire + values: + name: eeee43af-201a-483c-8c2f-edde43ecfba6 + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + eventKey: OnDestroy + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.templates + code: kill + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + body2: [] + condition: + lib: core.templates + code: is copy + values: + copy: + lib: core.hidden + code: event variable + values: + variableName: other + arguments: + group: Bullet + lib: place + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: HazardousTube + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 16 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png + source: /home/comigo/UNWORK/Tileset/HazardousTube.png + shape: rect + left: 6 + right: 5 + top: 16 + bottom: 0 + uid: 1f0fbe96-38aa-4db4-a011-c0cf34b91d00 + padding: 1 + lastmod: 1597811281802 + type: texture + - name: Gap + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: i14d3f53f-a868-4820-84cd-63234ab6e6b9.png + shape: rect + left: 0 + right: 16 + top: 0 + bottom: 13 + uid: 14d3f53f-a868-4820-84cd-63234ab6e6b9 + padding: 1 + lastmod: 1598577776397 + type: texture + - name: Gap + depth: 0 + texture: 14d3f53f-a868-4820-84cd-63234ab6e6b9 + extends: + cgroup: Gap + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + lastmod: 1671955011686 + events: [] + type: template + loopAnimation: false + visible: false + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: Powerup + uid: d06c5cd6-41eb-42c0-9caa-3306e2558b19 + lastmod: 1703052063334 + type: sound + preload: ! '' + variants: + - uid: 46NcTjjpkHtPLH + source: >- + C:\Users\Comigo\ct-js\src\examples\DungeonCrawler_coffee/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19.wav + distortion: + enabled: false + min: 0 + max: 1 + pitch: + enabled: false + min: 0 + max: 1 + reverb: + enabled: false + decayMin: 2 + decayMax: 2 + secondsMin: 2 + secondsMax: 3 + reverse: false + volume: + enabled: false + min: 0 + max: 1 + eq: + enabled: false + bands: + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + - min: -1 + max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 + - type: folder + uid: fCHHCjW6MGMTcN + colorClass: success + icon: monitor + name: UI + lastmod: 1697616102414 + entries: + - name: StartButton + depth: 0 + texture: a5745819-e057-4d67-a114-b64249a0f701 + extends: {} + uid: 38f86691-8fcc-44e4-a201-8479ca64935f + lastmod: 1711631427457 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: blinkTimer + value: 0 + eventKey: OnCreate + variables: [] + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: increase + values: + var: + lib: core.hidden + code: property + values: + variableName: blinkTimer + val: + lib: core + code: u.time + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.appearance + code: set alpha + values: + value: 0 + body2: + - lib: core.appearance + code: set alpha + values: + value: 1 + condition: + lib: core.math + code: '>' + values: + a: + lib: core.hidden + code: property + values: + variableName: blinkTimer + b: 0.5 + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: blinkTimer + value: 0 + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.hidden + code: property + values: + variableName: blinkTimer + b: 1 + eventKey: OnDraw + variables: [] + - eventKey: OnPointerClick + code: + - lib: transition + code: transition.slideOut + values: + then: + - lib: core + code: rooms.switch + values: + roomName: 326893eb-b9c2-4616-aaee-bb4641e0423e + duration: 750 + arguments: {} + lib: core + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: + - blinkTimer + - name: StartButton + untill: 0 + grid: + - 1 + - 1 + axis: + - 48 + - 13 + marginx: 0 + marginy: 0 + imgWidth: 96 + imgHeight: 27 + width: 96 + height: 27 + offx: 0 + offy: 0 + origname: ia5745819-e057-4d67-a114-b64249a0f701.png + shape: rect + left: 48 + right: 48 + top: 13 + bottom: 14 + uid: a5745819-e057-4d67-a114-b64249a0f701 + padding: 1 + source: /home/comigo/UNWORK/Tileset/StartButton.png + lastmod: 1598577786741 + type: texture + - name: ByComigo + untill: 0 + grid: + - 1 + - 1 + axis: + - 58 + - 2 + marginx: 0 + marginy: 0 + imgWidth: 117 + imgHeight: 5 + width: 117 + height: 5 + offx: 0 + offy: 0 + origname: i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png + shape: rect + left: 58 + right: 59 + top: 2 + bottom: 3 + uid: 9a1f5e9c-16a8-4900-8991-fab3f42fa1fd + padding: 1 + source: /home/comigo/UNWORK/Tileset/ByComigo.png + lastmod: 1716645003411 + type: texture + - name: Logo + untill: 0 + grid: + - 1 + - 1 + axis: + - 105 + - 32 + marginx: 0 + marginy: 0 + imgWidth: 211 + imgHeight: 65 + width: 211 + height: 65 + offx: 0 + offy: 0 + origname: idc7b9662-c746-403c-9f3e-67425fd480a3.png + shape: rect + left: 105 + right: 106 + top: 32 + bottom: 33 + uid: dc7b9662-c746-403c-9f3e-67425fd480a3 + padding: 1 + source: /home/comigo/UNWORK/Tileset/Logo.png + lastmod: 1598577798322 + type: texture + - name: Crosshair + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: ibdf46b11-ef42-4c45-af01-a0b918ee9587.png + source: /home/comigo/UNWORK/Tileset/Crosshair.png + shape: rect + left: 8 + right: 8 + top: 8 + bottom: 8 + uid: bdf46b11-ef42-4c45-af01-a0b918ee9587 + padding: 1 + lastmod: 1599528855312 + type: texture + - name: Crosshair + depth: 100000 + texture: bdf46b11-ef42-4c45-af01-a0b918ee9587 + extends: {} + uid: ff0f561c-a96c-4205-a083-01d2a60ebb67 + lastmod: 1712231108691 + events: + - lib: core + arguments: {} + code: + - lib: core.movement + code: set x + values: + pixels: + lib: pointer + code: pointer.xui + values: {} + - lib: core.movement + code: set y + values: + pixels: + lib: pointer + code: pointer.yui + values: {} + eventKey: OnDraw + variables: [] + type: template + loopAnimation: true + visible: true + blendMode: normal + animationFPS: 30 + playAnimationOnStart: false + behaviors: [] + baseClass: AnimatedSprite + nineSliceSettings: + left: 16 + top: 16 + right: 16 + bottom: 16 + style: -1 + extendTypes: '' + properties: [] + - name: UI_InGame + onstep: '' + onleave: '' + width: 240 + height: 160 + backgrounds: [] + copies: + - x: 96 + 'y': 88 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: ff0f561c-a96c-4205-a083-01d2a60ebb67 + exts: {} + customProperties: {} + bindings: {} + - x: 7 + 'y': 9 + opacity: 1 + tint: '#000000' + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: WJWkw8C45gQBMN + exts: {} + customProperties: {} + bindings: + count: rooms.current.lives + - x: 8 + 'y': 8 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: WJWkw8C45gQBMN + exts: {} + customProperties: {} + bindings: + count: rooms.current.lives + tiles: + - depth: -10 + tiles: [] + extends: {} + hidden: false + cache: true + uid: ee8b4583-614a-44d6-aacc-6569f49f6b80 + thumbnail: 6569f49f6b80 + extends: {} + gridX: 8 + gridY: 8 + backgroundColor: '#000337' + lastmod: 1716832028122 + events: + - lib: core + arguments: {} + code: + - lib: core.objects + code: current room write + values: + property: lives + value: 3 + - lib: transition + code: transition.slideIn + values: + then: [] + duration: 750 + eventKey: OnRoomStart + variables: [] + type: room + simulate: true + isUi: true + follow: -1 + behaviors: [] + extendTypes: '' + properties: [] + - name: Heart + untill: 0 + grid: + - 1 + - 1 + axis: + - 8 + - 8 + marginx: 0 + marginy: 0 + imgWidth: 16 + imgHeight: 16 + width: 16 + height: 16 + offx: 0 + offy: 0 + origname: ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png + source: /home/comigo/UNWORK/Tileset/Heart.png + shape: rect + left: 8 + right: 8 + top: 8 + bottom: 8 + uid: fe8cc3f9-d37b-402d-aa5a-18cf1a55d1ab + padding: 3 + lastmod: 1599528859794 + tiled: true + type: texture + - type: template + baseClass: SpritedCounter + name: HeartCounter + depth: 0 + texture: fe8cc3f9-d37b-402d-aa5a-18cf1a55d1ab + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: [] + arguments: {} + extends: {} + lastmod: 1712480494411 + uid: WJWkw8C45gQBMN + behaviors: [] + extendTypes: '' + properties: [] + tilingSettings: + scrollSpeedX: 0 + scrollSpeedY: 0 + isUi: false + repeaterSettings: + defaultCount: 3 + - name: TinyUnicode + type: typeface + fonts: + - weight: '400' + italic: false + uid: mG551jw6zW6mzt + origname: TinyUnicode + lastmod: 1716736392370 + bitmapFont: true + bitmapFontSize: 16 + bitmapFontLineHeight: 18 + charsets: + - basicLatin + - punctuation + customCharset: '' + uid: hHCNfDgh4gBdCr + bitmapPrecision: true + - type: style + name: BlueLabel + uid: LdqNC8mzNn3z4b + typeface: hHCNfDgh4gBdCr + font: + family: sans-serif + halign: left + italic: false + size: 16 + weight: '400' + wrap: false + wrapPosition: 640 + lineHeight: 18.08 + fill: + type: 0 + color: '#86C0E7' + color1: '#cccccc' + color2: '#ffffff' + gradtype: 1 + lastmod: 1716731164538 + - type: template + baseClass: BitmapText + name: BlueLabel + depth: 0 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1716725934487 + uid: qTPfqLqLnhK92f + behaviors: [] + extendTypes: '' + properties: [] + defaultText: '' + textStyle: LdqNC8mzNn3z4b + - type: folder + uid: QK6Nbn1wL7Hgrh + colorClass: accent1 + icon: polyline + name: Maps + lastmod: 1697616131293 + entries: + - name: Level_01 + onstep: '' + ondraw: '' + onleave: '' + width: 240 + height: 160 + backgrounds: [] + copies: + - x: 248 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 7fea051e-83e5-4e54-848b-ab3ca861e5cb + exts: {} + customProperties: {} + bindings: {} + - x: 152 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 160 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 168 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 280 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 280 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 96 + 'y': 88 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c40336ea-2846-45d5-97ba-d51852d3f6c5 + exts: {} + customProperties: {} + bindings: {} + - x: 96 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c701a029-af09-4fcf-9712-0fcdaa3581be + exts: {} + customProperties: {} + bindings: {} + tiles: + - depth: -6000 + tiles: + - x: 48 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 12 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 9 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 9 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 9 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 10 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + extends: + cgroup: Solid + hidden: false + cache: true + - depth: -7000 + tiles: + - x: 64 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 6 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 6 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 6 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 6 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 15 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 15 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: ae954867-1039-43f6-bf6d-d8684cb58612 + - x: 224 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + extends: + cgroup: Decor + hidden: false + cache: true + uid: 326893eb-b9c2-4616-aaee-bb4641e0423e + thumbnail: bb4641e0423e + extends: {} + gridX: 16 + gridY: 16 + backgroundColor: '#000337' + lastmod: 1712231786878 + restrictCamera: true + restrictMinX: -48 + restrictMaxX: 384 + restrictMinY: -16 + restrictMaxY: 320 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: lives + value: 3 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: nextLevel + value: Level_02 + - lib: core + code: sounds.play + values: + name: d470f423-a1ed-4189-b117-8ebf7b4eac62 + volume: 0.3 + loop: + lib: core.logic + code: 'true' + values: {} + - lib: core + code: rooms.append + values: + roomName: ee8b4583-614a-44d6-aacc-6569f49f6b80 + isUi: + lib: core.logic + code: 'true' + values: {} + name: ee8b4583-614a-44d6-aacc-6569f49f6b80 + eventKey: OnRoomStart + variables: [] + type: room + simulate: true + isUi: ! '' + follow: -1 + behaviors: [] + extendTypes: '' + properties: + - nextLevel + - lives + - name: Level_02 + onstep: '' + ondraw: '' + onleave: '' + width: 240 + height: 160 + backgrounds: [] + copies: + - x: 352 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c701a029-af09-4fcf-9712-0fcdaa3581be + exts: {} + customProperties: {} + bindings: {} + - x: 106 + 'y': 238 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 359 + 'y': 239 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 61 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 111 + 'y': 79 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c40336ea-2846-45d5-97ba-d51852d3f6c5 + exts: {} + customProperties: {} + bindings: {} + - x: 124 + 'y': 233 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 9fc1fec8-50bb-49e6-8fb4-c10ad589bf0b + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 220 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 9fc1fec8-50bb-49e6-8fb4-c10ad589bf0b + exts: {} + customProperties: {} + bindings: {} + - x: 255 + 'y': 232 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + exts: {} + customProperties: {} + bindings: {} + - x: 568 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 7fea051e-83e5-4e54-848b-ab3ca861e5cb + exts: {} + customProperties: {} + bindings: {} + - x: 458 + 'y': 41 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 451 + 'y': 47 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 459 + 'y': 51 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 279 + 'y': 41 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 387 + 'y': 58 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 323 + 'y': 90 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 373 + 'y': 99 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + exts: {} + customProperties: {} + bindings: {} + - x: 447 + 'y': 68 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + exts: {} + customProperties: {} + bindings: {} + - x: 317 + 'y': 55 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + exts: {} + customProperties: {} + bindings: {} + - x: 432 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 352 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 368 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 568 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 334 + 'y': 230 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 224 + 'y': 184 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 240 + 'y': 184 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 184 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 272 + 'y': 184 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 224 + 'y': 248 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 240 + 'y': 248 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 248 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 272 + 'y': 248 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 280 + 'y': 56 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 280 + 'y': 72 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 408 + 'y': 104 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 424 + 'y': 104 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 440 + 'y': 104 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 160 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + exts: {} + customProperties: {} + bindings: {} + - x: 352 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + exts: {} + customProperties: {} + bindings: {} + - x: 352 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: b336d91c-2876-4686-b8b4-901045a86ac7 + exts: {} + customProperties: {} + bindings: {} + tiles: + - depth: -6000 + tiles: + - x: 64 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 13 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 480 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 528 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 480 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 528 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': -16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': -32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': -32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': -32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': -32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': -16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 480 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 10 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 528 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 10 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 12 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 13 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': -16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 528 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 480 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 3 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 11 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 2 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 2 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 13 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 13 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 13 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + extends: + cgroup: Solid + hidden: false + cache: true + - depth: -7000 + tiles: + - x: 96 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 16 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 26 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 480 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 528 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 5 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 5 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 5 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 5 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 30 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 304 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 320 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 336 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 368 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 384 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 464 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 480 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 496 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 512 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 528 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 544 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 576 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 7 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 560 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 15 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 7 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 224 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 240 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 256 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 28 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 28 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 272 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 28 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 288 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 29 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 448 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 432 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 400 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 416 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 20 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 352 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: ae954867-1039-43f6-bf6d-d8684cb58612 + extends: + cgroup: Decor + hidden: false + cache: true + uid: 1cd7a8ef-febb-4174-ad90-42846504b06f + thumbnail: 42846504b06f + extends: {} + gridX: 8 + gridY: 8 + lastmod: 1712231777558 + backgroundColor: '#000337' + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + value: 3 + var: + lib: core.hidden + code: property + values: + variableName: lives + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: nextLevel + value: Level_03 + - lib: core + code: rooms.append + values: + roomName: ee8b4583-614a-44d6-aacc-6569f49f6b80 + isUi: + lib: core.logic + code: 'true' + values: {} + name: ee8b4583-614a-44d6-aacc-6569f49f6b80 + eventKey: OnRoomStart + variables: [] + type: room + simulate: true + isUi: ! '' + follow: -1 + behaviors: [] + restrictCamera: false + restrictMaxX: 288 + restrictMinX: -48 + restrictMinY: -32 + restrictMaxY: 168 + extendTypes: '' + properties: + - nextLevel + - lives + - name: Level_03 + onstep: '' + ondraw: '' + width: 240 + height: 160 + backgrounds: [] + copies: + - x: 112 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c40336ea-2846-45d5-97ba-d51852d3f6c5 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c701a029-af09-4fcf-9712-0fcdaa3581be + exts: {} + customProperties: {} + bindings: {} + - x: 104 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 248 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 264 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 104 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 280 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 296 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 312 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 104 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 152 + 'y': 328 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 168 + 'y': 328 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 184 + 'y': 328 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 200 + 'y': 328 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 216 + 'y': 328 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 336 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 344 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 232 + 'y': 344 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 360 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 232 + 'y': 360 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 181 + 'y': 362 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 3b6057ca-f175-4449-ac24-1c5630e0af7c + exts: {} + customProperties: {} + bindings: {} + - x: 205 + 'y': 376 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 152 + 'y': 376 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 376 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 232 + 'y': 376 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 216 + 'y': 392 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 168 + 'y': 392 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 184 + 'y': 392 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 200 + 'y': 392 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 392 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 392 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 393 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 9fc1fec8-50bb-49e6-8fb4-c10ad589bf0b + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 408 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 104 + 'y': 416 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 416 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 424 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 88 + 'y': 440 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 440 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 456 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 464 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 36c82b3e-f5c1-4fff-b24a-417fa9509c96 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 472 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 472 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 488 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 488 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 72 + 'y': 504 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 136 + 'y': 504 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 0bc3c56b-3bf9-4912-9e3f-c27654c1b910 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 528 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 469b9eef-6117-43a5-87d3-7151da7eba06 + exts: {} + customProperties: {} + bindings: {} + - x: 115 + 'y': 574 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 9fc1fec8-50bb-49e6-8fb4-c10ad589bf0b + exts: {} + customProperties: {} + bindings: {} + - x: 104 + 'y': 588 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 118 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 110 + 'y': 597 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 105 + 'y': 601 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 118 + 'y': 604 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 104 + 'y': 614 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 614 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 4e473462-8009-438e-9f53-1032e3a335cf + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: c701a029-af09-4fcf-9712-0fcdaa3581be + exts: {} + customProperties: {} + bindings: {} + - x: 113 + 'y': 636 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 58 + 'y': 643 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 122 + 'y': 648 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 90 + 'y': 659 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 5e40076f-8a61-4dfd-a517-a6c943ab9991 + exts: {} + customProperties: {} + bindings: {} + - x: 112 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 7fea051e-83e5-4e54-848b-ab3ca861e5cb + exts: {} + customProperties: {} + bindings: {} + - x: 74 + 'y': 680 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 154 + 'y': 682 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 173dfb94-5133-4bbc-9e7d-6ed8c9fef330 + exts: {} + customProperties: {} + bindings: {} + - x: 96 + 'y': 416 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: b336d91c-2876-4686-b8b4-901045a86ac7 + exts: {} + customProperties: {} + bindings: {} + tiles: + - depth: -6000 + tiles: + - x: 48 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 288 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 400 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 416 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 528 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 544 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 560 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 528 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 544 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 560 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 464 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 336 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 10 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 10 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 16 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 3 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 12 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 12 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 19 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 11 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 2 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 2 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 432 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 3 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 336 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 3 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 304 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 688 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 1 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 32 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 14 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 8 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + extends: + cgroup: Solid + hidden: false + cache: true + - depth: -7000 + tiles: + - x: 208 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 432 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 480 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 560 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 544 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 24 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 592 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 560 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 544 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 528 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 496 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 464 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 464 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 416 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 400 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 416 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 400 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 528 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 176 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 192 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 208 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 480 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 432 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 18 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 288 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 304 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 336 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 272 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 288 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 336 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 352 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 368 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 240 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 208 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 32 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 16 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 176 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 80 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 304 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 25 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 608 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 160 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 672 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 144 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 128 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 80 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 48 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 656 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 64 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 17 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 144 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 96 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 22 + rotation: 0 + texture: 4f8a6124-427b-410b-a467-ac42afec3644 + - x: 112 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: ae954867-1039-43f6-bf6d-d8684cb58612 + - x: 112 + 'y': 624 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: ae954867-1039-43f6-bf6d-d8684cb58612 + extends: + cgroup: Decor + hidden: false + cache: true + uid: ae6bb30c-9ad9-4390-b632-127493eb58cf + thumbnail: 127493eb58cf + extends: {} + gridX: 8 + gridY: 8 + backgroundColor: '#000337' + lastmod: 1712231802486 + events: + - lib: core + arguments: {} + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: nextLevel + value: MainMenu + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: lives + value: 3 + - lib: core + code: rooms.append + values: + roomName: ee8b4583-614a-44d6-aacc-6569f49f6b80 + isUi: + lib: core.logic + code: 'true' + values: {} + name: ee8b4583-614a-44d6-aacc-6569f49f6b80 + eventKey: OnRoomStart + variables: [] + - lib: core + arguments: {} + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core + code: sounds.stop + values: + name: d470f423-a1ed-4189-b117-8ebf7b4eac62 + - lib: core.console + code: log + values: + any: >- + This demo is a work in progress, stay tuned for more + levels :) + body2: [] + condition: + lib: core + code: templates.exists + values: + template: c40336ea-2846-45d5-97ba-d51852d3f6c5 + eventKey: OnRoomEnd + variables: [] + type: room + simulate: true + isUi: ! '' + follow: -1 + behaviors: [] + extendTypes: '' + properties: + - nextLevel + - lives + - name: MainMenu + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + width: 240 + height: 160 + backgrounds: [] + copies: + - x: 120 + 'y': 116 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 38f86691-8fcc-44e4-a201-8479ca64935f + exts: {} + customProperties: {} + bindings: {} + - x: 32 + 'y': 112 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: ff0f561c-a96c-4205-a083-01d2a60ebb67 + exts: {} + customProperties: {} + bindings: {} + - x: 120 + 'y': 152 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: qTPfqLqLnhK92f + exts: {} + customProperties: {} + bindings: {} + customAnchor: + x: 0.5 + 'y': 0.5 + customText: A CT.JS DEMO BY COMIGO GAMES + tiles: + - depth: -10 + tiles: + - x: 121 + 'y': 48 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + frame: 0 + rotation: 0 + texture: dc7b9662-c746-403c-9f3e-67425fd480a3 + extends: {} + hidden: false + cache: true + uid: eed8a427-1c70-425d-b633-7b6ea00c7b7c + thumbnail: 7b6ea00c7b7c + extends: {} + gridX: 8 + gridY: 8 + backgroundColor: '#000337' + lastmod: 1717104410863 + events: [] + type: room + simulate: true + isUi: ! '' + follow: -1 + behaviors: [] + extendTypes: '' + properties: [] +globalVars: [] diff --git a/src/examples/LabRaid shooter (Catnip)/fonts/fmG551jw6zW6mzt.ttf b/src/examples/LabRaid shooter (Catnip)/fonts/fmG551jw6zW6mzt.ttf new file mode 100644 index 000000000..cff17c428 Binary files /dev/null and b/src/examples/LabRaid shooter (Catnip)/fonts/fmG551jw6zW6mzt.ttf differ diff --git a/src/examples/DungeonCrawler_coffee/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png b/src/examples/LabRaid shooter (Catnip)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png rename to src/examples/LabRaid shooter (Catnip)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png diff --git a/src/examples/DungeonCrawler_coffee/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png b/src/examples/LabRaid shooter (Catnip)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png rename to src/examples/LabRaid shooter (Catnip)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png diff --git a/src/examples/DungeonCrawler_coffee/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png b/src/examples/LabRaid shooter (Catnip)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png rename to src/examples/LabRaid shooter (Catnip)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png diff --git a/src/examples/DungeonCrawler_coffee/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png b/src/examples/LabRaid shooter (Catnip)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png rename to src/examples/LabRaid shooter (Catnip)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png diff --git a/src/examples/DungeonCrawler_coffee/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png b/src/examples/LabRaid shooter (Catnip)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png rename to src/examples/LabRaid shooter (Catnip)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png diff --git a/src/examples/DungeonCrawler_coffee/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png b/src/examples/LabRaid shooter (Catnip)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png rename to src/examples/LabRaid shooter (Catnip)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png diff --git a/src/examples/DungeonCrawler_coffee/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png b/src/examples/LabRaid shooter (Catnip)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png rename to src/examples/LabRaid shooter (Catnip)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png diff --git a/src/examples/DungeonCrawler_coffee/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png b/src/examples/LabRaid shooter (Catnip)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png rename to src/examples/LabRaid shooter (Catnip)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png diff --git a/src/examples/DungeonCrawler_coffee/img/i4f8a6124-427b-410b-a467-ac42afec3644.png b/src/examples/LabRaid shooter (Catnip)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i4f8a6124-427b-410b-a467-ac42afec3644.png rename to src/examples/LabRaid shooter (Catnip)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png diff --git a/src/examples/DungeonCrawler_coffee/img/i6c23e805-94b6-4e3a-8606-682c36960233.png b/src/examples/LabRaid shooter (Catnip)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i6c23e805-94b6-4e3a-8606-682c36960233.png rename to src/examples/LabRaid shooter (Catnip)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png diff --git a/src/examples/DungeonCrawler_coffee/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png b/src/examples/LabRaid shooter (Catnip)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png rename to src/examples/LabRaid shooter (Catnip)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png diff --git a/src/examples/DungeonCrawler_coffee/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png b/src/examples/LabRaid shooter (Catnip)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png rename to src/examples/LabRaid shooter (Catnip)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png diff --git a/src/examples/DungeonCrawler_coffee/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png b/src/examples/LabRaid shooter (Catnip)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png rename to src/examples/LabRaid shooter (Catnip)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png diff --git a/src/examples/DungeonCrawler_coffee/img/i96121d6f-6483-48f8-841b-b307befc7d42.png b/src/examples/LabRaid shooter (Catnip)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i96121d6f-6483-48f8-841b-b307befc7d42.png rename to src/examples/LabRaid shooter (Catnip)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png diff --git a/src/examples/DungeonCrawler_coffee/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png b/src/examples/LabRaid shooter (Catnip)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png rename to src/examples/LabRaid shooter (Catnip)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png diff --git a/src/examples/DungeonCrawler_coffee/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png b/src/examples/LabRaid shooter (Catnip)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png rename to src/examples/LabRaid shooter (Catnip)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png diff --git a/src/examples/DungeonCrawler_coffee/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png b/src/examples/LabRaid shooter (Catnip)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png rename to src/examples/LabRaid shooter (Catnip)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png diff --git a/src/examples/DungeonCrawler_coffee/img/ia5745819-e057-4d67-a114-b64249a0f701.png b/src/examples/LabRaid shooter (Catnip)/img/ia5745819-e057-4d67-a114-b64249a0f701.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/ia5745819-e057-4d67-a114-b64249a0f701.png rename to src/examples/LabRaid shooter (Catnip)/img/ia5745819-e057-4d67-a114-b64249a0f701.png diff --git a/src/examples/DungeonCrawler_coffee/img/iae954867-1039-43f6-bf6d-d8684cb58612.png b/src/examples/LabRaid shooter (Catnip)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/iae954867-1039-43f6-bf6d-d8684cb58612.png rename to src/examples/LabRaid shooter (Catnip)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png diff --git a/src/examples/DungeonCrawler_coffee/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png b/src/examples/LabRaid shooter (Catnip)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png rename to src/examples/LabRaid shooter (Catnip)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png diff --git a/src/examples/DungeonCrawler_coffee/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png b/src/examples/LabRaid shooter (Catnip)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png rename to src/examples/LabRaid shooter (Catnip)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png diff --git a/src/examples/DungeonCrawler_coffee/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png b/src/examples/LabRaid shooter (Catnip)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png rename to src/examples/LabRaid shooter (Catnip)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png diff --git a/src/examples/DungeonCrawler_coffee/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png b/src/examples/LabRaid shooter (Catnip)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png rename to src/examples/LabRaid shooter (Catnip)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png diff --git a/src/examples/DungeonCrawler_coffee/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png b/src/examples/LabRaid shooter (Catnip)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png rename to src/examples/LabRaid shooter (Catnip)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png diff --git a/src/examples/DungeonCrawler_coffee/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png b/src/examples/LabRaid shooter (Catnip)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png rename to src/examples/LabRaid shooter (Catnip)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png diff --git a/src/examples/DungeonCrawler_coffee/img/ifee922c6-864c-448f-a2df-937389a42005.png b/src/examples/LabRaid shooter (Catnip)/img/ifee922c6-864c-448f-a2df-937389a42005.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/ifee922c6-864c-448f-a2df-937389a42005.png rename to src/examples/LabRaid shooter (Catnip)/img/ifee922c6-864c-448f-a2df-937389a42005.png diff --git a/src/examples/LabRaid shooter (Catnip)/img/splash.png b/src/examples/LabRaid shooter (Catnip)/img/splash.png new file mode 100644 index 000000000..0229e2ee1 Binary files /dev/null and b/src/examples/LabRaid shooter (Catnip)/img/splash.png differ diff --git a/src/examples/DungeonCrawler_coffee/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_1Ct4QLznRkB2tr.wav b/src/examples/LabRaid shooter (Catnip)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_1Ct4QLznRkB2tr.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_1Ct4QLznRkB2tr.wav rename to src/examples/LabRaid shooter (Catnip)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_1Ct4QLznRkB2tr.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_D8LpLdtHq6qBQD.wav b/src/examples/LabRaid shooter (Catnip)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_D8LpLdtHq6qBQD.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_D8LpLdtHq6qBQD.wav rename to src/examples/LabRaid shooter (Catnip)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_D8LpLdtHq6qBQD.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_H1P1QdpCz7f85g.wav b/src/examples/LabRaid shooter (Catnip)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_H1P1QdpCz7f85g.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_H1P1QdpCz7f85g.wav rename to src/examples/LabRaid shooter (Catnip)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_H1P1QdpCz7f85g.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/s97baf84a-32d3-450c-a52e-25a770565520_Ddb6NGrPN3q2P8.wav b/src/examples/LabRaid shooter (Catnip)/snd/s97baf84a-32d3-450c-a52e-25a770565520_Ddb6NGrPN3q2P8.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/s97baf84a-32d3-450c-a52e-25a770565520_Ddb6NGrPN3q2P8.wav rename to src/examples/LabRaid shooter (Catnip)/snd/s97baf84a-32d3-450c-a52e-25a770565520_Ddb6NGrPN3q2P8.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_hjzRWWbDHm13mm.wav b/src/examples/LabRaid shooter (Catnip)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_hjzRWWbDHm13mm.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_hjzRWWbDHm13mm.wav rename to src/examples/LabRaid shooter (Catnip)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_hjzRWWbDHm13mm.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_c75548M8CqkwQ6.wav b/src/examples/LabRaid shooter (Catnip)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_c75548M8CqkwQ6.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_c75548M8CqkwQ6.wav rename to src/examples/LabRaid shooter (Catnip)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_c75548M8CqkwQ6.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_46NcTjjpkHtPLH.wav b/src/examples/LabRaid shooter (Catnip)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_46NcTjjpkHtPLH.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_46NcTjjpkHtPLH.wav rename to src/examples/LabRaid shooter (Catnip)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_46NcTjjpkHtPLH.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_wWNRrzgFwM2p2b.ogg b/src/examples/LabRaid shooter (Catnip)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_wWNRrzgFwM2p2b.ogg similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_wWNRrzgFwM2p2b.ogg rename to src/examples/LabRaid shooter (Catnip)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_wWNRrzgFwM2p2b.ogg diff --git a/src/examples/DungeonCrawler_coffee/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_7FPj1Ttm8n6PBG.wav b/src/examples/LabRaid shooter (Catnip)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_7FPj1Ttm8n6PBG.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_7FPj1Ttm8n6PBG.wav rename to src/examples/LabRaid shooter (Catnip)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_7FPj1Ttm8n6PBG.wav diff --git a/src/examples/DungeonCrawler_coffee/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_DtgdP12dNcp3C8.wav b/src/examples/LabRaid shooter (Catnip)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_DtgdP12dNcp3C8.wav similarity index 100% rename from src/examples/DungeonCrawler_coffee/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_DtgdP12dNcp3C8.wav rename to src/examples/LabRaid shooter (Catnip)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_DtgdP12dNcp3C8.wav diff --git a/src/examples/DungeonCrawler_coffee.ict b/src/examples/LabRaid shooter (CoffeeScript).ict similarity index 99% rename from src/examples/DungeonCrawler_coffee.ict rename to src/examples/LabRaid shooter (CoffeeScript).ict index c21aa6747..ed199b1fd 100644 --- a/src/examples/DungeonCrawler_coffee.ict +++ b/src/examples/LabRaid shooter (CoffeeScript).ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 notes: /* empty */ libs: keyboard: {} @@ -67,7 +67,7 @@ settings: linux: true mac: true functionWrap: true - codeModifier: none + codeModifier: minify bundleAssetTree: false bundleAssetTypes: texture: true @@ -78,7 +78,10 @@ settings: sound: false style: false tandem: false + typefaces: ! '' autocloseDesktop: true + showErrors: true + errorsLink: '' branding: icon: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 accent: '#446adb' @@ -162,6 +165,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Shoot uid: 97baf84a-32d3-450c-a52e-25a770565520 lastmod: 1703052063333 @@ -213,6 +217,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Toggle uid: aeec04ae-d50c-4c47-bcd9-89d8f90f736a lastmod: 1703052063334 @@ -264,6 +271,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: SmallHit uid: b7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab lastmod: 1703052063334 @@ -315,6 +325,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Hit uid: 0559d8e7-3e27-4c25-9e38-164cd25dc4e7 lastmod: 1703052063334 @@ -366,6 +379,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: InGameTheme uid: d470f423-a1ed-4189-b117-8ebf7b4eac62 lastmod: 1703052063334 @@ -417,6 +433,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: SlimeExplosion uid: fdd0ec77-ba8d-4999-adba-20ea72d6f5ad lastmod: 1703052063334 @@ -468,6 +487,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Particle_Blue untill: 0 grid: @@ -967,6 +989,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Cat_Falling untill: 0 grid: @@ -1078,6 +1101,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Cat_Death untill: 0 grid: @@ -1153,6 +1177,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: CatDamage uid: 1cc5a5e0-765c-4bba-a006-8b597802ace6 lastmod: 1703052063334 @@ -1204,6 +1229,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Cat_Damage emitters: - uid: 0e491f30-ae29-4653-8750-6cfc60976637 @@ -1347,6 +1375,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Bullet depth: 0 texture: 29cd8366-37bd-4a4d-96a1-a2da4d674972 @@ -1394,6 +1425,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Bullet untill: 0 grid: @@ -1523,6 +1555,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Door_Base untill: 0 grid: @@ -1614,6 +1647,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: SpikeTrap untill: 0 grid: @@ -1679,6 +1713,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Medkit depth: 0 texture: c61a44b6-1f4d-43c2-9356-7288658947a9 @@ -1712,6 +1747,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Medkit untill: 0 grid: @@ -1760,6 +1796,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Checkpoint untill: 0 grid: @@ -1837,6 +1874,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - type: folder uid: r17c443PfF9fzt colorClass: success @@ -1884,6 +1924,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Crate untill: 0 grid: @@ -1959,6 +2000,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: HazardousTube_Debris untill: 0 grid: @@ -2015,6 +2057,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: HazardousTube depth: 0 texture: 1f0fbe96-38aa-4db4-a011-c0cf34b91d00 @@ -2052,6 +2095,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: HazardousTube untill: 0 grid: @@ -2127,6 +2171,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Powerup uid: d06c5cd6-41eb-42c0-9caa-3306e2558b19 lastmod: 1703052063334 @@ -2178,6 +2223,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - type: folder uid: fCHHCjW6MGMTcN colorClass: success @@ -2229,6 +2277,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: StartButton untill: 0 grid: @@ -2364,6 +2413,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: UI_InGame onstep: '' onleave: '' @@ -2417,6 +2467,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - name: Heart untill: 0 grid: @@ -4647,6 +4698,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - name: Level_02 onstep: '' ondraw: '' @@ -9139,6 +9191,7 @@ assets: restrictMinX: -48 restrictMinY: -32 restrictMaxY: 168 + extendTypes: '' - name: Level_03 onstep: '' ondraw: '' @@ -12584,6 +12637,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - name: MainMenu oncreate: '' onstep: '' @@ -12655,3 +12709,5 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' +globalVars: [] diff --git a/src/examples/DungeonCrawler_js/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png diff --git a/src/examples/DungeonCrawler_js/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png diff --git a/src/examples/DungeonCrawler_js/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png diff --git a/src/examples/DungeonCrawler_js/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png diff --git a/src/examples/DungeonCrawler_js/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png diff --git a/src/examples/DungeonCrawler_js/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png diff --git a/src/examples/DungeonCrawler_js/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png diff --git a/src/examples/DungeonCrawler_js/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png diff --git a/src/examples/DungeonCrawler_js/img/i4f8a6124-427b-410b-a467-ac42afec3644.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i4f8a6124-427b-410b-a467-ac42afec3644.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png diff --git a/src/examples/DungeonCrawler_js/img/i6c23e805-94b6-4e3a-8606-682c36960233.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i6c23e805-94b6-4e3a-8606-682c36960233.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png diff --git a/src/examples/DungeonCrawler_js/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png diff --git a/src/examples/DungeonCrawler_js/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png diff --git a/src/examples/DungeonCrawler_js/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png diff --git a/src/examples/DungeonCrawler_js/img/i96121d6f-6483-48f8-841b-b307befc7d42.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i96121d6f-6483-48f8-841b-b307befc7d42.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png diff --git a/src/examples/DungeonCrawler_js/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png diff --git a/src/examples/DungeonCrawler_js/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png b/src/examples/LabRaid shooter (CoffeeScript)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png diff --git a/src/examples/DungeonCrawler_js/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png b/src/examples/LabRaid shooter (CoffeeScript)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png diff --git a/src/examples/DungeonCrawler_js/img/ia5745819-e057-4d67-a114-b64249a0f701.png b/src/examples/LabRaid shooter (CoffeeScript)/img/ia5745819-e057-4d67-a114-b64249a0f701.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/ia5745819-e057-4d67-a114-b64249a0f701.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/ia5745819-e057-4d67-a114-b64249a0f701.png diff --git a/src/examples/DungeonCrawler_js/img/iae954867-1039-43f6-bf6d-d8684cb58612.png b/src/examples/LabRaid shooter (CoffeeScript)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/iae954867-1039-43f6-bf6d-d8684cb58612.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png diff --git a/src/examples/DungeonCrawler_js/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png b/src/examples/LabRaid shooter (CoffeeScript)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png diff --git a/src/examples/DungeonCrawler_js/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png b/src/examples/LabRaid shooter (CoffeeScript)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png diff --git a/src/examples/DungeonCrawler_js/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png b/src/examples/LabRaid shooter (CoffeeScript)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png diff --git a/src/examples/DungeonCrawler_js/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png b/src/examples/LabRaid shooter (CoffeeScript)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png diff --git a/src/examples/DungeonCrawler_js/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png b/src/examples/LabRaid shooter (CoffeeScript)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png diff --git a/src/examples/DungeonCrawler_js/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png b/src/examples/LabRaid shooter (CoffeeScript)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png diff --git a/src/examples/DungeonCrawler_js/img/ifee922c6-864c-448f-a2df-937389a42005.png b/src/examples/LabRaid shooter (CoffeeScript)/img/ifee922c6-864c-448f-a2df-937389a42005.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/ifee922c6-864c-448f-a2df-937389a42005.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/ifee922c6-864c-448f-a2df-937389a42005.png diff --git a/src/examples/DungeonCrawler_coffee/img/splash.png b/src/examples/LabRaid shooter (CoffeeScript)/img/splash.png similarity index 100% rename from src/examples/DungeonCrawler_coffee/img/splash.png rename to src/examples/LabRaid shooter (CoffeeScript)/img/splash.png diff --git a/src/examples/DungeonCrawler_js/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_wNBwz64f8DHbLd.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_1Ct4QLznRkB2tr.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_wNBwz64f8DHbLd.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_1Ct4QLznRkB2tr.wav diff --git a/src/examples/DungeonCrawler_js/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_2PPcw6P7K8P2FC.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_D8LpLdtHq6qBQD.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_2PPcw6P7K8P2FC.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_D8LpLdtHq6qBQD.wav diff --git a/src/examples/DungeonCrawler_js/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_1BTwnbLN25mDFq.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_H1P1QdpCz7f85g.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_1BTwnbLN25mDFq.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_H1P1QdpCz7f85g.wav diff --git a/src/examples/DungeonCrawler_js/snd/s97baf84a-32d3-450c-a52e-25a770565520_rfjh95b487q4wc.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/s97baf84a-32d3-450c-a52e-25a770565520_Ddb6NGrPN3q2P8.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/s97baf84a-32d3-450c-a52e-25a770565520_rfjh95b487q4wc.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/s97baf84a-32d3-450c-a52e-25a770565520_Ddb6NGrPN3q2P8.wav diff --git a/src/examples/DungeonCrawler_js/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_PH52pTQdzCdbLJ.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_hjzRWWbDHm13mm.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_PH52pTQdzCdbLJ.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_hjzRWWbDHm13mm.wav diff --git a/src/examples/DungeonCrawler_js/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_2mM8wR5Wr414td.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_c75548M8CqkwQ6.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_2mM8wR5Wr414td.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_c75548M8CqkwQ6.wav diff --git a/src/examples/DungeonCrawler_js/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_wgQWk9wBmnzNTR.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_46NcTjjpkHtPLH.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_wgQWk9wBmnzNTR.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_46NcTjjpkHtPLH.wav diff --git a/src/examples/DungeonCrawler_js/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_BR1NmzPmzQTDhp.ogg b/src/examples/LabRaid shooter (CoffeeScript)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_wWNRrzgFwM2p2b.ogg similarity index 100% rename from src/examples/DungeonCrawler_js/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_BR1NmzPmzQTDhp.ogg rename to src/examples/LabRaid shooter (CoffeeScript)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_wWNRrzgFwM2p2b.ogg diff --git a/src/examples/DungeonCrawler_js/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_whLQ4tc5cFz59j.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_7FPj1Ttm8n6PBG.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_whLQ4tc5cFz59j.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_7FPj1Ttm8n6PBG.wav diff --git a/src/examples/DungeonCrawler_js/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_CnfG6QJtdJ1QQ2.wav b/src/examples/LabRaid shooter (CoffeeScript)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_DtgdP12dNcp3C8.wav similarity index 100% rename from src/examples/DungeonCrawler_js/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_CnfG6QJtdJ1QQ2.wav rename to src/examples/LabRaid shooter (CoffeeScript)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_DtgdP12dNcp3C8.wav diff --git a/src/examples/DungeonCrawler_js.ict b/src/examples/LabRaid shooter (JavaScript).ict similarity index 99% rename from src/examples/DungeonCrawler_js.ict rename to src/examples/LabRaid shooter (JavaScript).ict index 11d1e445a..409a4515d 100644 --- a/src/examples/DungeonCrawler_js.ict +++ b/src/examples/LabRaid shooter (JavaScript).ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0-next-5 +ctjsVersion: 5.0.0 notes: /* empty */ libs: keyboard: {} @@ -77,6 +77,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: 4822a271-cc3c-4d88-b7a0-b2aa4cab0a96 accent: '#446adb' @@ -163,6 +166,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: MainMenu oncreate: '' onstep: '' @@ -234,6 +238,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - name: Toggle uid: aeec04ae-d50c-4c47-bcd9-89d8f90f736a lastmod: 1703055869943 @@ -1007,6 +1012,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Fall uid: 8074a9ef-0215-4e02-a107-cb20d1fc5de9 lastmod: 1703055869944 @@ -1274,6 +1280,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Cat_Death depth: 0 texture: 8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1 @@ -1303,6 +1310,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Bullet depth: 0 texture: 29cd8366-37bd-4a4d-96a1-a2da4d674972 @@ -1350,6 +1358,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Bullet untill: 0 grid: @@ -1590,6 +1599,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Elevator depth: 0 texture: 2637e46e-06b2-4ca0-b17d-4bbf6eca44b7 @@ -1629,6 +1639,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Checkpoint depth: 0 texture: a42e0dff-69c9-46c3-8996-745aaa769698 @@ -1659,6 +1670,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Checkpoint untill: 0 grid: @@ -1719,6 +1731,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Door untill: 0 grid: @@ -1812,6 +1825,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Elevator untill: 0 grid: @@ -1940,6 +1954,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Tileset untill: 0 grid: @@ -2120,6 +2135,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: HazardousTube_Debris depth: -6500 texture: 80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc @@ -2149,6 +2165,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Crate_Debris depth: -6500 texture: d25aebb8-d135-4b9c-b2b5-844298c35a62 @@ -2174,6 +2191,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Crate depth: 0 texture: 31948760-8965-4768-ab1d-2b87d0b7fc3a @@ -2215,6 +2233,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - lastmod: 1705122510044 type: texture name: Goop @@ -2262,6 +2281,7 @@ assets: scrollSpeedX: 4 scrollSpeedY: 0 isUi: false + extendTypes: '' - type: folder uid: pLcG9412BdGjg1 colorClass: warning @@ -4465,6 +4485,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - name: Level_02 onstep: '' ondraw: '' @@ -8978,6 +8999,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - name: Level_03 onstep: '' ondraw: '' @@ -12426,6 +12448,7 @@ assets: isUi: ! '' follow: -1 behaviors: [] + extendTypes: '' - type: folder uid: hc9q3R4CHbrpw3 colorClass: accent1 @@ -12569,6 +12592,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: ByComigo untill: 0 grid: @@ -12650,6 +12674,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Crosshair untill: 0 grid: @@ -12801,6 +12826,7 @@ assets: isUi: true follow: -1 behaviors: [] + extendTypes: '' - type: template baseClass: SpritedCounter name: HeartCounter @@ -12817,3 +12843,5 @@ assets: behaviors: [] repeaterSettings: defaultCount: 3 + extendTypes: '' +globalVars: [] diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png b/src/examples/LabRaid shooter (JavaScript)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png new file mode 100644 index 000000000..04be1dbc1 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i14d3f53f-a868-4820-84cd-63234ab6e6b9.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png b/src/examples/LabRaid shooter (JavaScript)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png new file mode 100644 index 000000000..f3a0faa10 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i1f0fbe96-38aa-4db4-a011-c0cf34b91d00.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png b/src/examples/LabRaid shooter (JavaScript)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png new file mode 100644 index 000000000..5a5c977d4 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i2637e46e-06b2-4ca0-b17d-4bbf6eca44b7.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png b/src/examples/LabRaid shooter (JavaScript)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png new file mode 100644 index 000000000..711f5cb29 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i29cd8366-37bd-4a4d-96a1-a2da4d674972.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png b/src/examples/LabRaid shooter (JavaScript)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png new file mode 100644 index 000000000..eea5b4d67 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i31948760-8965-4768-ab1d-2b87d0b7fc3a.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png b/src/examples/LabRaid shooter (JavaScript)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png new file mode 100644 index 000000000..9514d7559 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i3a7c7928-a731-4940-9854-17936b3c9a46.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png b/src/examples/LabRaid shooter (JavaScript)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png new file mode 100644 index 000000000..e9c8d1a81 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i4733fb53-5e41-4cf8-b9a8-91ad700f2246.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png b/src/examples/LabRaid shooter (JavaScript)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png new file mode 100644 index 000000000..bca61285e Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i4822a271-cc3c-4d88-b7a0-b2aa4cab0a96.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png b/src/examples/LabRaid shooter (JavaScript)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png new file mode 100644 index 000000000..b4279571e Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i4f8a6124-427b-410b-a467-ac42afec3644.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png b/src/examples/LabRaid shooter (JavaScript)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png new file mode 100644 index 000000000..8ed9e74bf Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i6c23e805-94b6-4e3a-8606-682c36960233.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png b/src/examples/LabRaid shooter (JavaScript)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png new file mode 100644 index 000000000..a4e07bff6 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i80bab2bc-c12d-4ce6-8d6f-033e0d5d3bdc.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png b/src/examples/LabRaid shooter (JavaScript)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png new file mode 100644 index 000000000..9658656d9 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i8a6a1aa5-60f6-4f9a-9c54-7e5e7641bda1.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png b/src/examples/LabRaid shooter (JavaScript)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png new file mode 100644 index 000000000..478ffdd38 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i8bef1226-7fb8-4bf5-8120-ac6e53d81ea5.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png b/src/examples/LabRaid shooter (JavaScript)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png new file mode 100644 index 000000000..2be3b66f7 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i96121d6f-6483-48f8-841b-b307befc7d42.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png b/src/examples/LabRaid shooter (JavaScript)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png new file mode 100644 index 000000000..236be909c Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i9a1f5e9c-16a8-4900-8991-fab3f42fa1fd.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png b/src/examples/LabRaid shooter (JavaScript)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png new file mode 100644 index 000000000..7fe5fef1d Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/i9b967bf5-9694-43b6-9812-0f974b2b73c9.png differ diff --git a/src/examples/DungeonCrawler_js/img/iFTgzDpQ8B22z51.png b/src/examples/LabRaid shooter (JavaScript)/img/iFTgzDpQ8B22z51.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/iFTgzDpQ8B22z51.png rename to src/examples/LabRaid shooter (JavaScript)/img/iFTgzDpQ8B22z51.png diff --git a/src/examples/LabRaid shooter (JavaScript)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png b/src/examples/LabRaid shooter (JavaScript)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png new file mode 100644 index 000000000..91abc3c96 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/ia42e0dff-69c9-46c3-8996-745aaa769698.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/ia5745819-e057-4d67-a114-b64249a0f701.png b/src/examples/LabRaid shooter (JavaScript)/img/ia5745819-e057-4d67-a114-b64249a0f701.png new file mode 100644 index 000000000..46c88fdcb Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/ia5745819-e057-4d67-a114-b64249a0f701.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png b/src/examples/LabRaid shooter (JavaScript)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png new file mode 100644 index 000000000..36ba0bf96 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/iae954867-1039-43f6-bf6d-d8684cb58612.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png b/src/examples/LabRaid shooter (JavaScript)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png new file mode 100644 index 000000000..acba44eff Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/ibdf46b11-ef42-4c45-af01-a0b918ee9587.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png b/src/examples/LabRaid shooter (JavaScript)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png new file mode 100644 index 000000000..8b1539772 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/ic61a44b6-1f4d-43c2-9356-7288658947a9.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png b/src/examples/LabRaid shooter (JavaScript)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png new file mode 100644 index 000000000..38d8550fe Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/id25aebb8-d135-4b9c-b2b5-844298c35a62.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png b/src/examples/LabRaid shooter (JavaScript)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png new file mode 100644 index 000000000..1603eea30 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/id9107804-cf88-4bd9-913c-c9ac1a4d5f05.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png b/src/examples/LabRaid shooter (JavaScript)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png new file mode 100644 index 000000000..23a7eacb3 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/idc7b9662-c746-403c-9f3e-67425fd480a3.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png b/src/examples/LabRaid shooter (JavaScript)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png new file mode 100644 index 000000000..ccfe94cf9 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/ife8cc3f9-d37b-402d-aa5a-18cf1a55d1ab.png differ diff --git a/src/examples/LabRaid shooter (JavaScript)/img/ifee922c6-864c-448f-a2df-937389a42005.png b/src/examples/LabRaid shooter (JavaScript)/img/ifee922c6-864c-448f-a2df-937389a42005.png new file mode 100644 index 000000000..ca55cfd57 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/img/ifee922c6-864c-448f-a2df-937389a42005.png differ diff --git a/src/examples/DungeonCrawler_js/img/splash.png b/src/examples/LabRaid shooter (JavaScript)/img/splash.png similarity index 100% rename from src/examples/DungeonCrawler_js/img/splash.png rename to src/examples/LabRaid shooter (JavaScript)/img/splash.png diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_wNBwz64f8DHbLd.wav b/src/examples/LabRaid shooter (JavaScript)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_wNBwz64f8DHbLd.wav new file mode 100644 index 000000000..24d6f82e4 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/s0559d8e7-3e27-4c25-9e38-164cd25dc4e7_wNBwz64f8DHbLd.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_2PPcw6P7K8P2FC.wav b/src/examples/LabRaid shooter (JavaScript)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_2PPcw6P7K8P2FC.wav new file mode 100644 index 000000000..eb4d89807 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/s1cc5a5e0-765c-4bba-a006-8b597802ace6_2PPcw6P7K8P2FC.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_1BTwnbLN25mDFq.wav b/src/examples/LabRaid shooter (JavaScript)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_1BTwnbLN25mDFq.wav new file mode 100644 index 000000000..e2a29b905 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/s8074a9ef-0215-4e02-a107-cb20d1fc5de9_1BTwnbLN25mDFq.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/s97baf84a-32d3-450c-a52e-25a770565520_rfjh95b487q4wc.wav b/src/examples/LabRaid shooter (JavaScript)/snd/s97baf84a-32d3-450c-a52e-25a770565520_rfjh95b487q4wc.wav new file mode 100644 index 000000000..6cf2ee53d Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/s97baf84a-32d3-450c-a52e-25a770565520_rfjh95b487q4wc.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_PH52pTQdzCdbLJ.wav b/src/examples/LabRaid shooter (JavaScript)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_PH52pTQdzCdbLJ.wav new file mode 100644 index 000000000..7e80e064a Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/saeec04ae-d50c-4c47-bcd9-89d8f90f736a_PH52pTQdzCdbLJ.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_2mM8wR5Wr414td.wav b/src/examples/LabRaid shooter (JavaScript)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_2mM8wR5Wr414td.wav new file mode 100644 index 000000000..13b9e3f4a Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/sb7ed2998-7a2b-4b0e-8766-ac1e0f7da9ab_2mM8wR5Wr414td.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_wgQWk9wBmnzNTR.wav b/src/examples/LabRaid shooter (JavaScript)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_wgQWk9wBmnzNTR.wav new file mode 100644 index 000000000..a66108421 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/sd06c5cd6-41eb-42c0-9caa-3306e2558b19_wgQWk9wBmnzNTR.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_BR1NmzPmzQTDhp.ogg b/src/examples/LabRaid shooter (JavaScript)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_BR1NmzPmzQTDhp.ogg new file mode 100644 index 000000000..9ea3ce76f Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/sd470f423-a1ed-4189-b117-8ebf7b4eac62_BR1NmzPmzQTDhp.ogg differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_whLQ4tc5cFz59j.wav b/src/examples/LabRaid shooter (JavaScript)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_whLQ4tc5cFz59j.wav new file mode 100644 index 000000000..faa955291 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/sfbe42ee3-6fe6-43ac-a99c-09da748ddc46_whLQ4tc5cFz59j.wav differ diff --git a/src/examples/LabRaid shooter (JavaScript)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_CnfG6QJtdJ1QQ2.wav b/src/examples/LabRaid shooter (JavaScript)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_CnfG6QJtdJ1QQ2.wav new file mode 100644 index 000000000..f7b2fa298 Binary files /dev/null and b/src/examples/LabRaid shooter (JavaScript)/snd/sfdd0ec77-ba8d-4999-adba-20ea72d6f5ad_CnfG6QJtdJ1QQ2.wav differ diff --git a/src/examples/memocats.ict b/src/examples/Memocats (JavaScript).ict similarity index 98% rename from src/examples/memocats.ict rename to src/examples/Memocats (JavaScript).ict index eef3c1e41..0befad7ca 100644 --- a/src/examples/memocats.ict +++ b/src/examples/Memocats (JavaScript).ict @@ -25,6 +25,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: -1 accent: '#446adb' @@ -48,7 +51,7 @@ settings: versionPostfix: '' fps: 30 startroom: 3827e721-5331-49b2-a37a-f868e15cae0d -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 scripts: [] actions: [] texturetick: 2 @@ -204,6 +207,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Room1 ondraw: '' onleave: '' @@ -402,6 +406,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Room2 ondraw: '' onleave: '' @@ -647,6 +652,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Room3 ondraw: '' onleave: '' @@ -936,6 +942,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Match uid: 96dbce18-a291-41b6-9707-ff2dc2bb5b77 lastmod: 1703583919798 @@ -987,6 +994,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Swoosh uid: 1385f5fc-28ce-4b52-b668-12e3c75ff3b8 lastmod: 1703583919798 @@ -1038,6 +1048,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Rollback uid: af72e78c-ff23-4016-8179-ca7b5f66d11e lastmod: 1703583919799 @@ -1089,6 +1102,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Paper uid: efe16fbe-0baf-40af-be62-5138085a2682 lastmod: 1703583919799 @@ -1140,6 +1156,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Victory uid: a1a8f820-66b3-4849-9a22-a81b31e32605 lastmod: 1703583919799 @@ -1191,6 +1210,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: NewLevel uid: 4adfa410-6689-4594-8c9e-d8cde988894d lastmod: 1703583919800 @@ -1242,6 +1264,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Memocats untill: 0 grid: @@ -1296,3 +1321,4 @@ assets: padding: 1 tiled: true type: texture +globalVars: [] diff --git a/src/examples/memocats/img/i2.png b/src/examples/Memocats (JavaScript)/img/i2.png similarity index 100% rename from src/examples/memocats/img/i2.png rename to src/examples/Memocats (JavaScript)/img/i2.png diff --git a/src/examples/memocats/img/i366c01b5-4ed5-4ca5-bf01-8731a04be2c4.png b/src/examples/Memocats (JavaScript)/img/i366c01b5-4ed5-4ca5-bf01-8731a04be2c4.png similarity index 100% rename from src/examples/memocats/img/i366c01b5-4ed5-4ca5-bf01-8731a04be2c4.png rename to src/examples/Memocats (JavaScript)/img/i366c01b5-4ed5-4ca5-bf01-8731a04be2c4.png diff --git a/src/examples/memocats/img/splash.png b/src/examples/Memocats (JavaScript)/img/splash.png similarity index 100% rename from src/examples/memocats/img/splash.png rename to src/examples/Memocats (JavaScript)/img/splash.png diff --git a/src/examples/memocats/snd/s1385f5fc-28ce-4b52-b668-12e3c75ff3b8_gtKFQkGJT88K26.wav b/src/examples/Memocats (JavaScript)/snd/s1385f5fc-28ce-4b52-b668-12e3c75ff3b8_gtKFQkGJT88K26.wav similarity index 100% rename from src/examples/memocats/snd/s1385f5fc-28ce-4b52-b668-12e3c75ff3b8_gtKFQkGJT88K26.wav rename to src/examples/Memocats (JavaScript)/snd/s1385f5fc-28ce-4b52-b668-12e3c75ff3b8_gtKFQkGJT88K26.wav diff --git a/src/examples/memocats/snd/s4adfa410-6689-4594-8c9e-d8cde988894d_c5r48jJb4MKLz5.wav b/src/examples/Memocats (JavaScript)/snd/s4adfa410-6689-4594-8c9e-d8cde988894d_c5r48jJb4MKLz5.wav similarity index 100% rename from src/examples/memocats/snd/s4adfa410-6689-4594-8c9e-d8cde988894d_c5r48jJb4MKLz5.wav rename to src/examples/Memocats (JavaScript)/snd/s4adfa410-6689-4594-8c9e-d8cde988894d_c5r48jJb4MKLz5.wav diff --git a/src/examples/memocats/snd/s96dbce18-a291-41b6-9707-ff2dc2bb5b77_gD9g7jGq1drQwb.wav b/src/examples/Memocats (JavaScript)/snd/s96dbce18-a291-41b6-9707-ff2dc2bb5b77_gD9g7jGq1drQwb.wav similarity index 100% rename from src/examples/memocats/snd/s96dbce18-a291-41b6-9707-ff2dc2bb5b77_gD9g7jGq1drQwb.wav rename to src/examples/Memocats (JavaScript)/snd/s96dbce18-a291-41b6-9707-ff2dc2bb5b77_gD9g7jGq1drQwb.wav diff --git a/src/examples/memocats/snd/sa1a8f820-66b3-4849-9a22-a81b31e32605_CbwTqjwc6drfT1.wav b/src/examples/Memocats (JavaScript)/snd/sa1a8f820-66b3-4849-9a22-a81b31e32605_CbwTqjwc6drfT1.wav similarity index 100% rename from src/examples/memocats/snd/sa1a8f820-66b3-4849-9a22-a81b31e32605_CbwTqjwc6drfT1.wav rename to src/examples/Memocats (JavaScript)/snd/sa1a8f820-66b3-4849-9a22-a81b31e32605_CbwTqjwc6drfT1.wav diff --git a/src/examples/memocats/snd/saf72e78c-ff23-4016-8179-ca7b5f66d11e_T6NwtGjg9ddL8W.wav b/src/examples/Memocats (JavaScript)/snd/saf72e78c-ff23-4016-8179-ca7b5f66d11e_T6NwtGjg9ddL8W.wav similarity index 100% rename from src/examples/memocats/snd/saf72e78c-ff23-4016-8179-ca7b5f66d11e_T6NwtGjg9ddL8W.wav rename to src/examples/Memocats (JavaScript)/snd/saf72e78c-ff23-4016-8179-ca7b5f66d11e_T6NwtGjg9ddL8W.wav diff --git a/src/examples/memocats/snd/sefe16fbe-0baf-40af-be62-5138085a2682_WWg1J1WCN3qtqw.wav b/src/examples/Memocats (JavaScript)/snd/sefe16fbe-0baf-40af-be62-5138085a2682_WWg1J1WCN3qtqw.wav similarity index 100% rename from src/examples/memocats/snd/sefe16fbe-0baf-40af-be62-5138085a2682_WWg1J1WCN3qtqw.wav rename to src/examples/Memocats (JavaScript)/snd/sefe16fbe-0baf-40af-be62-5138085a2682_WWg1J1WCN3qtqw.wav diff --git a/src/examples/MoveBlocks.ict b/src/examples/MoveBlocks (JavaScript).ict similarity index 99% rename from src/examples/MoveBlocks.ict rename to src/examples/MoveBlocks (JavaScript).ict index 654d65c3e..cf0ac0e61 100644 --- a/src/examples/MoveBlocks.ict +++ b/src/examples/MoveBlocks (JavaScript).ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 notes: |- /* Things to note here: @@ -60,6 +60,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: 25177c05-61f8-491f-be4f-c82bc90ed58c accent: '#446adb' @@ -117,6 +120,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Pipe_H2 depth: 0 texture: 5084d2e9-a66e-4e22-9828-ee936473cbfc @@ -142,6 +146,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Pipe_H3 depth: 0 texture: 614ef931-af6d-4da3-8147-6fb3c0457dac @@ -167,6 +172,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Pipe_H4 depth: 0 texture: fe8ec368-af9d-4351-917e-b0527c7470c4 @@ -192,6 +198,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Pipe_V2 depth: 0 texture: 84deaf6c-1e30-46ab-9770-ad7f20c54158 @@ -218,6 +225,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Pipe_V3 depth: 0 texture: 7e9843af-2842-414b-9063-14c08f547c6b @@ -244,6 +252,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Pipe_V4 depth: 0 texture: 2f19f39b-25bb-43cd-ab03-108bd9418695 @@ -270,6 +279,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: KeyTile depth: 0 texture: 25177c05-61f8-491f-be4f-c82bc90ed58c @@ -295,6 +305,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: PuzzleBlocks oncreate: '' onstep: '' @@ -2081,6 +2092,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: PuzzleBlocks_Simple oncreate: '' onstep: '' @@ -3768,6 +3780,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Wood_Start uid: 42e768ce-6c19-4c34-9f14-11e257ecff18 lastmod: 1703584454693 @@ -3819,6 +3832,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Wood_End uid: 55aa6dac-1071-4725-bdc8-b68d98ac72bf lastmod: 1703584454693 @@ -3870,6 +3886,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Success uid: 2e225de2-b896-4a53-a302-4d2b7ad26dee lastmod: 1703584454693 @@ -3921,6 +3940,9 @@ assets: max: 1 - min: -1 max: 1 + panning: + refDistance: 0.5 + rolloffFactor: 1 - name: Pipe_H2 untill: 0 grid: @@ -4290,3 +4312,5 @@ assets: readableName: Users can move this tile lastmod: 1703589268060 uid: PBq9qHtpB2z6N2 + extendTypes: '' +globalVars: [] diff --git a/src/examples/MoveBlocks/img/i028aa481-64ef-4b75-85b8-2f9c88eecf4b.png b/src/examples/MoveBlocks (JavaScript)/img/i028aa481-64ef-4b75-85b8-2f9c88eecf4b.png similarity index 100% rename from src/examples/MoveBlocks/img/i028aa481-64ef-4b75-85b8-2f9c88eecf4b.png rename to src/examples/MoveBlocks (JavaScript)/img/i028aa481-64ef-4b75-85b8-2f9c88eecf4b.png diff --git a/src/examples/MoveBlocks/img/i04dbb554-54cd-439a-8d17-4d06366151dc.png b/src/examples/MoveBlocks (JavaScript)/img/i04dbb554-54cd-439a-8d17-4d06366151dc.png similarity index 100% rename from src/examples/MoveBlocks/img/i04dbb554-54cd-439a-8d17-4d06366151dc.png rename to src/examples/MoveBlocks (JavaScript)/img/i04dbb554-54cd-439a-8d17-4d06366151dc.png diff --git a/src/examples/MoveBlocks/img/i25177c05-61f8-491f-be4f-c82bc90ed58c.png b/src/examples/MoveBlocks (JavaScript)/img/i25177c05-61f8-491f-be4f-c82bc90ed58c.png similarity index 100% rename from src/examples/MoveBlocks/img/i25177c05-61f8-491f-be4f-c82bc90ed58c.png rename to src/examples/MoveBlocks (JavaScript)/img/i25177c05-61f8-491f-be4f-c82bc90ed58c.png diff --git a/src/examples/MoveBlocks/img/i2f19f39b-25bb-43cd-ab03-108bd9418695.png b/src/examples/MoveBlocks (JavaScript)/img/i2f19f39b-25bb-43cd-ab03-108bd9418695.png similarity index 100% rename from src/examples/MoveBlocks/img/i2f19f39b-25bb-43cd-ab03-108bd9418695.png rename to src/examples/MoveBlocks (JavaScript)/img/i2f19f39b-25bb-43cd-ab03-108bd9418695.png diff --git a/src/examples/MoveBlocks/img/i5084d2e9-a66e-4e22-9828-ee936473cbfc.png b/src/examples/MoveBlocks (JavaScript)/img/i5084d2e9-a66e-4e22-9828-ee936473cbfc.png similarity index 100% rename from src/examples/MoveBlocks/img/i5084d2e9-a66e-4e22-9828-ee936473cbfc.png rename to src/examples/MoveBlocks (JavaScript)/img/i5084d2e9-a66e-4e22-9828-ee936473cbfc.png diff --git a/src/examples/MoveBlocks/img/i614ef931-af6d-4da3-8147-6fb3c0457dac.png b/src/examples/MoveBlocks (JavaScript)/img/i614ef931-af6d-4da3-8147-6fb3c0457dac.png similarity index 100% rename from src/examples/MoveBlocks/img/i614ef931-af6d-4da3-8147-6fb3c0457dac.png rename to src/examples/MoveBlocks (JavaScript)/img/i614ef931-af6d-4da3-8147-6fb3c0457dac.png diff --git a/src/examples/MoveBlocks/img/i7e9843af-2842-414b-9063-14c08f547c6b.png b/src/examples/MoveBlocks (JavaScript)/img/i7e9843af-2842-414b-9063-14c08f547c6b.png similarity index 100% rename from src/examples/MoveBlocks/img/i7e9843af-2842-414b-9063-14c08f547c6b.png rename to src/examples/MoveBlocks (JavaScript)/img/i7e9843af-2842-414b-9063-14c08f547c6b.png diff --git a/src/examples/MoveBlocks/img/i84deaf6c-1e30-46ab-9770-ad7f20c54158.png b/src/examples/MoveBlocks (JavaScript)/img/i84deaf6c-1e30-46ab-9770-ad7f20c54158.png similarity index 100% rename from src/examples/MoveBlocks/img/i84deaf6c-1e30-46ab-9770-ad7f20c54158.png rename to src/examples/MoveBlocks (JavaScript)/img/i84deaf6c-1e30-46ab-9770-ad7f20c54158.png diff --git a/src/examples/MoveBlocks/img/ife8ec368-af9d-4351-917e-b0527c7470c4.png b/src/examples/MoveBlocks (JavaScript)/img/ife8ec368-af9d-4351-917e-b0527c7470c4.png similarity index 100% rename from src/examples/MoveBlocks/img/ife8ec368-af9d-4351-917e-b0527c7470c4.png rename to src/examples/MoveBlocks (JavaScript)/img/ife8ec368-af9d-4351-917e-b0527c7470c4.png diff --git a/src/examples/MoveBlocks (JavaScript)/img/splash.png b/src/examples/MoveBlocks (JavaScript)/img/splash.png new file mode 100644 index 000000000..764810b30 Binary files /dev/null and b/src/examples/MoveBlocks (JavaScript)/img/splash.png differ diff --git a/src/examples/MoveBlocks/snd/s2e225de2-b896-4a53-a302-4d2b7ad26dee_zkKbbw6Q7GFzN8.ogg b/src/examples/MoveBlocks (JavaScript)/snd/s2e225de2-b896-4a53-a302-4d2b7ad26dee_zkKbbw6Q7GFzN8.ogg similarity index 100% rename from src/examples/MoveBlocks/snd/s2e225de2-b896-4a53-a302-4d2b7ad26dee_zkKbbw6Q7GFzN8.ogg rename to src/examples/MoveBlocks (JavaScript)/snd/s2e225de2-b896-4a53-a302-4d2b7ad26dee_zkKbbw6Q7GFzN8.ogg diff --git a/src/examples/MoveBlocks/snd/s42e768ce-6c19-4c34-9f14-11e257ecff18_dRnkmLm7jhhkdD.ogg b/src/examples/MoveBlocks (JavaScript)/snd/s42e768ce-6c19-4c34-9f14-11e257ecff18_dRnkmLm7jhhkdD.ogg similarity index 100% rename from src/examples/MoveBlocks/snd/s42e768ce-6c19-4c34-9f14-11e257ecff18_dRnkmLm7jhhkdD.ogg rename to src/examples/MoveBlocks (JavaScript)/snd/s42e768ce-6c19-4c34-9f14-11e257ecff18_dRnkmLm7jhhkdD.ogg diff --git a/src/examples/MoveBlocks/snd/s55aa6dac-1071-4725-bdc8-b68d98ac72bf_QR14RKchw98Rdq.ogg b/src/examples/MoveBlocks (JavaScript)/snd/s55aa6dac-1071-4725-bdc8-b68d98ac72bf_QR14RKchw98Rdq.ogg similarity index 100% rename from src/examples/MoveBlocks/snd/s55aa6dac-1071-4725-bdc8-b68d98ac72bf_QR14RKchw98Rdq.ogg rename to src/examples/MoveBlocks (JavaScript)/snd/s55aa6dac-1071-4725-bdc8-b68d98ac72bf_QR14RKchw98Rdq.ogg diff --git a/src/examples/MoveBlocks/img/splash.png b/src/examples/MoveBlocks/img/splash.png deleted file mode 100644 index 8069ccae6..000000000 Binary files a/src/examples/MoveBlocks/img/splash.png and /dev/null differ diff --git a/src/examples/Platformer Tutorial (Catnip).ict b/src/examples/Platformer Tutorial (Catnip).ict new file mode 100644 index 000000000..fbe27d037 --- /dev/null +++ b/src/examples/Platformer Tutorial (Catnip).ict @@ -0,0 +1,15017 @@ +ctjsVersion: 5.0.0 +backups: 3 +language: catnip +notes: /* empty */ +libs: + place: + gridX: 1024 + gridY: 1024 + pointer: {} + keyboard: {} + keyboard.polyfill: {} + pointer.polyfill: {} + gamepad: {} + vkeys: {} +startroom: CQkRWR6NLDJkJQ +contentTypes: [] +actions: + - name: MoveRight + methods: + - code: keyboard.KeyD + - code: keyboard.ArrowRight + - name: MoveLeft + methods: + - code: keyboard.KeyA + - code: keyboard.ArrowLeft + - name: Jump + methods: + - code: keyboard.Space + - code: keyboard.KeyW + - code: keyboard.ArrowUp +scripts: [] +assets: + - type: template + baseClass: AnimatedSprite + name: Robot + depth: 0 + texture: t2K2LcwCJzd3cm + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.misc + code: note + values: + note: Max horizontal speed + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: movespeed + value: 240 + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: >- + If the A key or left arrow on a keyboard is down, then + move to left + - lib: core.movement + code: set hspeed + values: + speed: + lib: core.math + code: '*' + values: + b: -1 + a: + lib: core.hidden + code: property + values: + variableName: movespeed + - lib: core.misc + code: note + values: + note: >- + Set the walking animation and transform the robot to the + left + - lib: core.logic + code: if branch + values: + body1: + - lib: core.appearance + code: set texture + values: + texture: bm2RB5B1jmfRmM + - lib: core.appearance + code: play animation + values: {} + body2: [] + condition: + lib: core.logic + code: is not + values: + a: + lib: core.appearance + code: get texture + values: {} + b: PlatformChar_Walk1 + - lib: core.appearance + code: set scale xy + values: + x: -1 + 'y': 1 + body2: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: >- + If the D key or right arrow on a keyboard is down, + then move to right + - lib: core.movement + code: set hspeed + values: + speed: + lib: core.hidden + code: property + values: + variableName: movespeed + - lib: core.misc + code: note + values: + note: >- + Set the walking animation and transform the robot to + the right + - lib: core.logic + code: if branch + values: + body1: + - lib: core.appearance + code: set texture + values: + texture: bm2RB5B1jmfRmM + - lib: core.appearance + code: play animation + values: {} + body2: [] + condition: + lib: core.logic + code: is not + values: + a: + lib: core.appearance + code: get texture + values: {} + b: PlatformChar_Walk1 + - lib: core.appearance + code: set scale xy + values: + x: 1 + 'y': 1 + body2: + - lib: core.misc + code: note + values: + note: Don't move horizontally if no input + - lib: core.movement + code: set hspeed + values: + speed: 0 + - lib: core.appearance + code: set texture + values: + texture: t2K2LcwCJzd3cm + condition: + lib: core.actions + code: action down + values: + action: MoveRight + condition: + lib: core.actions + code: action down + values: + action: MoveLeft + - lib: core.misc + code: note + values: + note: If there is ground underneath the Robot… + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: …and the W key or the spacebar is down… + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: …then jump! + - lib: core.movement + code: set vspeed + values: + speed: + lib: core.hidden + code: property + values: + variableName: jumpSpeed + body2: + - lib: core.misc + code: note + values: + note: >- + Reset our vspeed. We don't want to be buried + underground! + - lib: core.movement + code: set vspeed + values: + speed: 0 + condition: + lib: core.actions + code: action down + values: + action: Jump + body2: + - lib: core.misc + code: note + values: + note: 'If there is no ground, set jumping animation!' + - lib: core.appearance + code: set texture + values: + texture: ztf7H56K8BMgc1 + condition: + lib: place + code: place.occupied + values: + me: + lib: core.propsVars + code: this + values: {} + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.math + code: + + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 1 + cgroup: Solid + - lib: place + code: move template smart + values: + cgroup: Solid + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: jumpSpeed + value: -600 + - lib: core.movement + code: set gravity + values: + gravity: 1800 + - lib: core.movement + code: set hspeed + values: + speed: 0 + - lib: core.movement + code: set vspeed + values: + speed: 0 + - lib: core.camera + code: follow this + values: {} + - lib: core.camera + code: set borderX + values: + value: 450 + - lib: core.camera + code: set borderY + values: + value: 200 + - lib: core.objects + code: this write + values: + property: savedX + value: + lib: core.movement + code: x + values: {} + - lib: core.objects + code: this write + values: + property: savedY + value: + lib: core.movement + code: 'y' + values: {} + - lib: core.appearance + code: set animation speed + values: + speed: 0.2 + arguments: {} + lib: core + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.movement + code: set x + values: + pixels: + lib: core.objects + code: this read + values: + property: savedX + - lib: core.movement + code: set y + values: + pixels: + lib: core.objects + code: this read + values: + property: savedY + - lib: core.movement + code: set hspeed + values: + speed: 0 + - lib: core.movement + code: set vspeed + values: + speed: 0 + - lib: core.misc + code: note + values: + note: remove one life + - lib: core.objects + code: current room write + values: + property: lives + value: + lib: core.math + code: '-' + values: + b: 1 + a: + lib: core.objects + code: room read + values: + property: lives + - lib: core.logic + code: if branch + values: + body1: + - lib: core.misc + code: note + values: + note: 'Restart a room: switch to the room of its own name' + - lib: core + code: rooms.switch + values: + roomName: + lib: core.objects + code: room read + values: + property: name + body2: [] + condition: + lib: core.math + code: <= + values: + b: 0 + a: + lib: core.objects + code: room read + values: + property: lives + arguments: + group: Deadly + lib: place + variables: [] + extends: {} + lastmod: 1716785279458 + uid: qW85fQJkj11N5d + behaviors: [] + extendTypes: '' + properties: + - jumpSpeed + - movespeed + - type: folder + uid: R1PWq7f71zqBcr + colorClass: act + icon: help-circle + name: textures + lastmod: 1715782712403 + entries: + - lastmod: 1715782643373 + type: texture + name: PlatformChar_Idle + untill: 0 + grid: + - 1 + - 1 + axis: + - 43 + - 80 + marginx: 0 + marginy: 0 + imgWidth: 86 + imgHeight: 80 + width: 86 + height: 80 + offx: 0 + offy: 0 + origname: it2K2LcwCJzd3cm.png + shape: rect + left: 24 + right: 24 + top: 69 + bottom: 0 + uid: t2K2LcwCJzd3cm + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformChar_Idle.png + - lastmod: 1715782635611 + type: texture + name: PlatformChar_Jump + untill: 0 + grid: + - 1 + - 1 + axis: + - 43 + - 80 + marginx: 0 + marginy: 0 + imgWidth: 86 + imgHeight: 80 + width: 86 + height: 80 + offx: 0 + offy: 0 + origname: iztf7H56K8BMgc1.png + shape: rect + left: 24 + right: 24 + top: 69 + bottom: 0 + uid: ztf7H56K8BMgc1 + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformChar_Jump.png + - lastmod: 1715782537904 + type: texture + name: PlatformPack_Tile05 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: imj4QGh34gGFBWL.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: mj4QGh34gGFBWL + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile05.png + - lastmod: 1715782665028 + type: texture + name: PlatformPack_Item17 + untill: 0 + grid: + - 1 + - 1 + axis: + - 32 + - 32 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: ic2J6GJwfQp29k1.png + shape: circle + left: 32 + right: 32 + top: 32 + bottom: 32 + uid: c2J6GJwfQp29k1 + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Item17.png + r: 14 + - lastmod: 1715782542374 + type: texture + name: PlatformPack_Tile17 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: i22Dmcmw5TK5T2R.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: 22Dmcmw5TK5T2R + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile17.png + - lastmod: 1715782544509 + type: texture + name: PlatformPack_Tile21 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: iLJm1G1P26Lg8KM.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: LJm1G1P26Lg8KM + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile21.png + - lastmod: 1715782557841 + type: texture + name: PlatformPack_Tile48 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: iKRnn2227Njk987.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: KRnn2227Njk987 + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile48.png + - lastmod: 1716411304328 + type: texture + name: PlatformPack_Tile43 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: i9T7KPjpwQbtdcR.png + shape: rect + left: 0 + right: 64 + top: -30 + bottom: 64 + uid: 9T7KPjpwQbtdcR + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile43.png + - lastmod: 1715782550214 + type: texture + name: PlatformPack_Tile39 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: ibgPnG9rr72JBtH.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: bgPnG9rr72JBtH + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile39.png + - lastmod: 1715782541205 + type: texture + name: PlatformPack_Tile16 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: iWmt5gDQTGdk7Mj.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: Wmt5gDQTGdk7Mj + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile16.png + - lastmod: 1715782657224 + type: texture + name: PlatformPack_Item09 + untill: 0 + grid: + - 1 + - 1 + axis: + - 32 + - 32 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: iCGhQKzKpTGtD7K.png + shape: circle + left: 32 + right: 32 + top: 32 + bottom: 32 + uid: CGhQKzKpTGtD7K + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Item09.png + r: 15 + - lastmod: 1715782638348 + type: texture + name: PlatformChar_Walk1 + untill: 2 + grid: + - 2 + - 1 + axis: + - 43 + - 80 + marginx: 0 + marginy: 0 + imgWidth: 172 + imgHeight: 80 + width: 86 + height: 80 + offx: 0 + offy: 0 + origname: ibm2RB5B1jmfRmM.png + shape: rect + left: 24 + right: 24 + top: 69 + bottom: 0 + uid: bm2RB5B1jmfRmM + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformChar_Walk1_2x1@2.png + - lastmod: 1715782539809 + type: texture + name: PlatformPack_Tile13 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: iPTFNMgb6zrf3CM.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 64 + uid: PTFNMgb6zrf3CM + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile13.png + - lastmod: 1716411297238 + type: texture + name: PlatformPack_Tile31 + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 64 + imgHeight: 64 + width: 64 + height: 64 + offx: 0 + offy: 0 + origname: iC47nfCQ6FwBhk7.png + shape: rect + left: 0 + right: 64 + top: 0 + bottom: 41 + uid: C47nfCQ6FwBhk7 + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Simplified Platformer/PlatformPack_Tile31.png + - type: template + baseClass: AnimatedSprite + name: Rocks + depth: 0 + texture: Wmt5gDQTGdk7Mj + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: + cgroup: Solid + lastmod: 1715785402025 + uid: FKDnpCfW4fr1CN + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Rocks_Platform + depth: 0 + texture: PTFNMgb6zrf3CM + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: + cgroup: Solid + lastmod: 1715783065142 + uid: R7Q2Npb9h11nh8 + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Rocks_Top + depth: 0 + texture: C47nfCQ6FwBhk7 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: + cgroup: Solid + lastmod: 1715783062510 + uid: 8z7tL4n46cBB15 + behaviors: [] + extendTypes: '' + properties: [] + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1024 + height: 576 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: false + name: Level_01 + backgroundColor: '#D0F4F7' + follow: -1 + backgrounds: [] + copies: + - x: 0 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: qW85fQJkj11N5d + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 768 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: NKcWd2dG3PGn2r + exts: {} + customProperties: {} + bindings: {} + - x: 1503.019170919492 + 'y': 449.15606845007966 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DD9kCzd5Dp8zd5 + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716782999214 + events: + - eventKey: OnRoomStart + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: nextRoom + value: Level_02 + arguments: {} + lib: core + variables: [] + behaviors: + - HQGQpTGtMPzDJz + extendTypes: '' + uid: CQkRWR6NLDJkJQ + properties: + - nextRoom + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1024 + height: 576 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: false + name: Level_02 + backgroundColor: '#D0F4F7' + follow: -1 + backgrounds: [] + copies: + - x: 768 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: qW85fQJkj11N5d + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: NKcWd2dG3PGn2r + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 704 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 192.6328125 + 'y': 91.84375 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DD9kCzd5Dp8zd5 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -832 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -768 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: -671.1806404362729 + 'y': 288.5567836968942 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: -607.8993904362729 + 'y': 289.4005336968942 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: -640.3837654362729 + 'y': 255.65053369689417 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 127.42873456372706 + 'y': 92.3849086968942 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536.0693595637272 + 'y': 95.7599086968942 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716783004562 + events: + - eventKey: OnRoomStart + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: nextRoom + value: Level_03 + arguments: {} + lib: core + variables: [] + behaviors: + - HQGQpTGtMPzDJz + extendTypes: '' + uid: 3c4jMHHqdjwKNR + properties: [] + - type: template + baseClass: AnimatedSprite + name: Water + depth: 0 + texture: 22Dmcmw5TK5T2R + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: + cgroup: Deadly + lastmod: 1715787270244 + uid: M1MLbRQfmr3JTh + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Water_Top + depth: 0 + texture: mj4QGh34gGFBWL + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: + cgroup: Deadly + lastmod: 1715787273415 + uid: PQjWnN3hCHc5tW + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Spikes + depth: 0 + texture: 9T7KPjpwQbtdcR + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: + cgroup: Deadly + lastmod: 1715787268006 + uid: jzhqpnR6cLGMWL + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Checkpoint + depth: 0 + texture: LJm1G1P26Lg8KM + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: false + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.objects + code: object write + values: + object: + lib: core.hidden + code: event variable + values: + variableName: other + property: savedX + value: + lib: core.math + code: + + values: + a: + lib: core.movement + code: x + values: {} + b: 32 + - lib: core.objects + code: object write + values: + object: + lib: core.hidden + code: event variable + values: + variableName: other + property: savedY + value: + lib: core.math + code: + + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 32 + arguments: + template: qW85fQJkj11N5d + lib: place + variables: [] + extends: {} + lastmod: 1716411639229 + uid: kFHWwtDQMhCMGT + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Exit + depth: 0 + texture: KRnn2227Njk987 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.misc + code: note + values: + note: Is the next room defined? + - lib: core.logic + code: if branch + values: + body1: + - lib: core.misc + code: note + values: + note: Switch to the next room + - lib: core + code: rooms.switch + values: + roomName: + lib: core.objects + code: object read + values: + object: + lib: core + code: rooms.current + values: {} + property: nextRoom + body2: [] + condition: + lib: core.logic + code: convert to boolean + values: + val: + lib: core.objects + code: object read + values: + property: nextRoom + object: + lib: core + code: rooms.current + values: {} + arguments: + template: qW85fQJkj11N5d + lib: place + variables: [] + extends: {} + lastmod: 1716785130486 + uid: NKcWd2dG3PGn2r + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: GreenCrystal + depth: 0 + texture: CGhQKzKpTGtD7K + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: collisionTemplate + code: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.objects + code: this write + values: + property: crystals + value: + lib: core.math + code: + + values: + b: 1 + a: + lib: core.objects + code: this read + values: + property: crystals + obj: + lib: core + code: rooms.current + values: {} + - lib: core.templates + code: kill + values: {} + arguments: + template: qW85fQJkj11N5d + lib: place + variables: [] + extends: {} + lastmod: 1715799241905 + uid: DWtGz56z2Cpwm8 + behaviors: [] + extendTypes: '' + properties: [] + - type: behavior + name: inGameRoomStart + behaviorType: room + events: + - eventKey: OnRoomStart + code: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.objects + code: this write + values: + property: crystals + value: 0 + - lib: core.objects + code: this write + values: + property: lives + value: 3 + - lib: core.objects + code: this write + values: + property: crystalsTotal + value: + lib: core.arrays + code: array length + values: + array: + lib: core + code: templates.list + values: + list: DWtGz56z2Cpwm8 + obj: + lib: core + code: rooms.current + values: {} + - lib: core + code: rooms.append + values: + name: q898FkQpLCktnK + isUi: + lib: core.logic + code: 'true' + values: {} + arguments: {} + lib: core + variables: [] + specification: [] + extendTypes: '' + lastmod: 1715796624785 + uid: HQGQpTGtMPzDJz + properties: [] + - type: style + name: CrystalCounter + uid: Jf5WtDMzDr6WKr + font: + family: sans-serif + halign: left + italic: false + size: 24 + weight: '600' + wrap: false + wrapPosition: 640 + lineHeight: 0 + fill: + type: 0 + color: '#00A847' + color1: '#cccccc' + color2: '#ffffff' + gradtype: 1 + lastmod: 1715796835875 + stroke: + color: '#FFFFFF' + weight: 5 + typeface: -1 + - type: template + baseClass: AnimatedSprite + name: CrystalsWidget + depth: 0 + texture: CGhQKzKpTGtD7K + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1715798632706 + uid: mkJdgLTRdjJ7CQ + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: Text + name: CrystalsWidgetText + depth: 0 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnDraw + code: + - lib: core.appearance + code: set text + values: + text: + lib: core.strings + code: concat3 + values: + b: ' / ' + a: + lib: core.objects + code: room read + values: + property: crystals + c: + lib: core.objects + code: room read + values: + property: crystalsTotal + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716410579453 + uid: kGPkfn3Qbzrhfh + behaviors: [] + extendTypes: '' + properties: [] + defaultText: '' + textStyle: Jf5WtDMzDr6WKr + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1024 + height: 576 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: true + name: LayerUI + backgroundColor: '#000000' + follow: -1 + backgrounds: [] + copies: + - x: 64 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: mkJdgLTRdjJ7CQ + exts: {} + customProperties: {} + bindings: {} + - x: 104.9375 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kGPkfn3Qbzrhfh + exts: {} + customProperties: {} + bindings: {} + customAnchor: + x: 0 + 'y': 0.5 + customText: '0' + - x: 960 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: ngkR2jjDtNc51f + exts: {} + customProperties: {} + bindings: {} + - x: 925.36645508 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: rDm7dbjgF1mzgq + exts: {} + customProperties: {} + bindings: {} + customAnchor: + x: 1 + 'y': 0.5 + customText: '0' + tiles: [] + extends: {} + lastmod: 1716411671341 + events: [] + behaviors: [] + extendTypes: '' + uid: q898FkQpLCktnK + properties: [] + - type: template + baseClass: AnimatedSprite + name: Heart + depth: 0 + texture: c2J6GJwfQp29k1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: collisionTemplate + code: + - lib: core.logic + code: if branch + values: + body1: + - lib: core.objects + code: current room write + values: + property: lives + value: + lib: core.math + code: + + values: + a: + lib: core.objects + code: room read + values: + property: lives + b: 1 + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + b: 3 + a: + lib: core.objects + code: room read + values: + property: lives + arguments: + template: qW85fQJkj11N5d + lib: place + variables: [] + extends: {} + lastmod: 1716785164527 + uid: DD9kCzd5Dp8zd5 + behaviors: [] + extendTypes: '' + properties: [] + - type: style + name: HeartCounter + uid: MHg8JpTmcCcgm5 + font: + family: sans-serif + halign: left + italic: false + size: 24 + weight: '600' + wrap: false + wrapPosition: 640 + lineHeight: 0 + fill: + type: 0 + color: '#E85017' + color1: '#cccccc' + color2: '#ffffff' + gradtype: 1 + lastmod: 1715799557987 + stroke: + color: '#FFFFFF' + weight: 5 + typeface: -1 + - type: template + baseClass: AnimatedSprite + name: HeartsWidget + depth: 0 + texture: c2J6GJwfQp29k1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + extends: {} + lastmod: 1715799590277 + uid: ngkR2jjDtNc51f + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: Text + name: HeartsWidgetText + depth: 0 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnDraw + code: + - lib: core.appearance + code: set text + values: + text: + lib: core.objects + code: room read + values: + property: lives + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1715799669228 + uid: rDm7dbjgF1mzgq + behaviors: [] + extendTypes: '' + properties: [] + defaultText: '' + textStyle: MHg8JpTmcCcgm5 + - type: template + baseClass: AnimatedSprite + name: Platform + depth: 0 + texture: bgPnG9rr72JBtH + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: robot + value: + lib: place + code: place.meet + values: + template: qW85fQJkj11N5d + me: + lib: core.propsVars + code: this + values: {} + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.objects + code: this write + values: + property: cgroup + value: undefined + body2: + - lib: core.objects + code: this write + values: + property: cgroup + value: Solid + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: variable + values: + variableName: robot + value: + lib: place + code: place.meet + values: + template: qW85fQJkj11N5d + me: + lib: core.propsVars + code: this + values: {} + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.math + code: '-' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 1 + - lib: core.logic + code: if branch + values: + body1: + - lib: core.objects + code: object write + values: + object: + lib: core.hidden + code: variable + values: + variableName: robot + property: x + value: + lib: core.math + code: + + values: + b: + lib: core.math + code: '*' + values: + b: + lib: core + code: u.time + values: {} + a: + lib: core.movement + code: get hspeed + values: {} + a: + lib: core.objects + code: object read + values: + property: x + object: + lib: core.hidden + code: variable + values: + variableName: robot + body2: [] + condition: + lib: core.hidden + code: variable + values: + variableName: robot + condition: + lib: core.hidden + code: variable + values: + variableName: robot + - lib: core.logic + code: if branch + values: + body1: + - lib: core.misc + code: note + values: + note: Flip direction + - lib: core.movement + code: set direction + values: + degrees: + lib: core.math + code: + + values: + a: + lib: core.movement + code: get direction + values: {} + b: 180 + body2: [] + condition: + lib: place + code: place.occupied + values: + me: + lib: core.propsVars + code: this + values: {} + x: + lib: core.math + code: + + values: + b: + lib: core.math + code: '*' + values: + a: + lib: core.movement + code: get hspeed + values: {} + b: + lib: core + code: u.time + values: {} + a: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + cgroup: Solid + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: + - robot + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: 120 + arguments: {} + lib: core + variables: [] + extends: + cgroup: Solid + lastmod: 1716783656195 + uid: pJ1CTGLh4JmrGL + behaviors: [] + extendTypes: '' + properties: [] + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 32 + gridY: 32 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1024 + height: 576 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: false + name: Level_03 + backgroundColor: '#D0F4F7' + follow: -1 + backgrounds: [] + copies: + - x: 0 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: qW85fQJkj11N5d + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1792 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1856 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1792 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1856 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1792 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1856 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1984 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2048 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2112 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2176 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2240 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2304 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1856 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1984 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2048 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2112 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2176 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2240 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2304 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1792 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1856 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1984 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2048 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2112 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2176 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2240 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2304 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2368 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2432 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2496 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1856 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1792 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1984 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2048 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2112 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2176 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2240 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2304 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2368 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2432 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1984 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2048 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2112 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2176 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2240 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2304 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2368 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2432 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 576 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2496 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -512 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -448 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -320 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -640 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -576 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -704 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -384 + 'y': 512 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -192 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -128 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: -256 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1664 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1728 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 1920 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 2048 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 2112 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: 8z7tL4n46cBB15 + exts: {} + customProperties: {} + bindings: {} + - x: 2496 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': -320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2368 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2432 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2368 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2560 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2624 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2688 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2496 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2496 + 'y': 448 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2432 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 2752 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2752 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2752 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2752 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2752 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 2752 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: R7Q2Npb9h11nh8 + exts: {} + customProperties: {} + bindings: {} + - x: 2528 + 'y': 160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1952 + 'y': -160 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1696 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 1440 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 1632 + 'y': -224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DD9kCzd5Dp8zd5 + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 0 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 1536 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 1600 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': -96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1408 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': -96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 1472 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 544 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 608 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 672 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 736 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 800 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 864 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 928 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 992 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1024 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1056 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1120 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1152 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1184 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1248 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1280 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1312 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1344 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: jzhqpnR6cLGMWL + exts: {} + customProperties: {} + bindings: {} + - x: 1216 + 'y': -320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 1440 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 1184 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 960 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 896 + 'y': 128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 416 + 'y': 192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 384 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: M1MLbRQfmr3JTh + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 512 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 576 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 640 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 704 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 768 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 832 + 'y': 320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: PQjWnN3hCHc5tW + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': -256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 448 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 384 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 320 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 256 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': -64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 192 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 128 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': -128 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: 0 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -64 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: FKDnpCfW4fr1CN + exts: {} + customProperties: {} + bindings: {} + - x: -224 + 'y': -320 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: kFHWwtDQMhCMGT + exts: {} + customProperties: {} + bindings: {} + - x: 480 + 'y': -224 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DD9kCzd5Dp8zd5 + exts: {} + customProperties: {} + bindings: {} + - x: 1312 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: pJ1CTGLh4JmrGL + exts: {} + customProperties: {} + bindings: {} + - x: 544 + 'y': -192 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: pJ1CTGLh4JmrGL + exts: {} + customProperties: {} + bindings: {} + - x: 800 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: pJ1CTGLh4JmrGL + exts: {} + customProperties: {} + bindings: {} + - x: 96 + 'y': 256 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: pJ1CTGLh4JmrGL + exts: {} + customProperties: {} + bindings: {} + - x: -32 + 'y': 96 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DWtGz56z2Cpwm8 + exts: {} + customProperties: {} + bindings: {} + - x: 992 + 'y': 288 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: DD9kCzd5Dp8zd5 + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716783011671 + events: [] + behaviors: + - HQGQpTGtMPzDJz + extendTypes: '' + uid: 91pnHmJh9P5fQ7 + properties: [] +settings: + authoring: + author: '' + site: '' + title: '' + version: + - 0 + - 0 + - 0 + versionPostfix: '' + appId: '' + rendering: + usePixiLegacy: true + transparent: false + maxFPS: 60 + pixelatedrender: false + highDensity: true + desktopMode: maximized + hideCursor: false + mobileScreenOrientation: unspecified + viewMode: scaleFit + export: + autocloseDesktop: true + windows: true + linux: true + mac: true + functionWrap: false + codeModifier: none + bundleAssetTree: false + bundleAssetTypes: + texture: true + template: true + room: true + behavior: false + font: false + sound: false + style: false + tandem: false + script: false + typefaces: ! '' + showErrors: true + errorsLink: '' + branding: + accent: '#446adb' + invertPreloaderScheme: true + icon: -1 + splashScreen: -1 + forceSmoothIcons: false + forceSmoothSplashScreen: false + hideLoadingLogo: false + alternativeLogo: false + customLoadingText: '' + fps: 30 +palette: [] +globalVars: [] diff --git a/src/examples/Platformer Tutorial (Catnip)/img/i22Dmcmw5TK5T2R.png b/src/examples/Platformer Tutorial (Catnip)/img/i22Dmcmw5TK5T2R.png new file mode 100644 index 000000000..4ac0b2bad Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/i22Dmcmw5TK5T2R.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/i9T7KPjpwQbtdcR.png b/src/examples/Platformer Tutorial (Catnip)/img/i9T7KPjpwQbtdcR.png new file mode 100644 index 000000000..4be3f1156 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/i9T7KPjpwQbtdcR.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iC47nfCQ6FwBhk7.png b/src/examples/Platformer Tutorial (Catnip)/img/iC47nfCQ6FwBhk7.png new file mode 100644 index 000000000..0a13802aa Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iC47nfCQ6FwBhk7.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iCGhQKzKpTGtD7K.png b/src/examples/Platformer Tutorial (Catnip)/img/iCGhQKzKpTGtD7K.png new file mode 100644 index 000000000..7dee411c4 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iCGhQKzKpTGtD7K.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iKRnn2227Njk987.png b/src/examples/Platformer Tutorial (Catnip)/img/iKRnn2227Njk987.png new file mode 100644 index 000000000..44c48f3af Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iKRnn2227Njk987.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iLJm1G1P26Lg8KM.png b/src/examples/Platformer Tutorial (Catnip)/img/iLJm1G1P26Lg8KM.png new file mode 100644 index 000000000..94c0983f4 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iLJm1G1P26Lg8KM.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iPTFNMgb6zrf3CM.png b/src/examples/Platformer Tutorial (Catnip)/img/iPTFNMgb6zrf3CM.png new file mode 100644 index 000000000..19b42ec88 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iPTFNMgb6zrf3CM.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iWmt5gDQTGdk7Mj.png b/src/examples/Platformer Tutorial (Catnip)/img/iWmt5gDQTGdk7Mj.png new file mode 100644 index 000000000..3544fa40e Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iWmt5gDQTGdk7Mj.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/ibgPnG9rr72JBtH.png b/src/examples/Platformer Tutorial (Catnip)/img/ibgPnG9rr72JBtH.png new file mode 100644 index 000000000..f3a67cadd Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/ibgPnG9rr72JBtH.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/ibm2RB5B1jmfRmM.png b/src/examples/Platformer Tutorial (Catnip)/img/ibm2RB5B1jmfRmM.png new file mode 100644 index 000000000..d3e60f974 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/ibm2RB5B1jmfRmM.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/ic2J6GJwfQp29k1.png b/src/examples/Platformer Tutorial (Catnip)/img/ic2J6GJwfQp29k1.png new file mode 100644 index 000000000..187e07058 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/ic2J6GJwfQp29k1.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/imj4QGh34gGFBWL.png b/src/examples/Platformer Tutorial (Catnip)/img/imj4QGh34gGFBWL.png new file mode 100644 index 000000000..e2ccf7cca Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/imj4QGh34gGFBWL.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/it2K2LcwCJzd3cm.png b/src/examples/Platformer Tutorial (Catnip)/img/it2K2LcwCJzd3cm.png new file mode 100644 index 000000000..52596a53d Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/it2K2LcwCJzd3cm.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/iztf7H56K8BMgc1.png b/src/examples/Platformer Tutorial (Catnip)/img/iztf7H56K8BMgc1.png new file mode 100644 index 000000000..246aa061f Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/iztf7H56K8BMgc1.png differ diff --git a/src/examples/Platformer Tutorial (Catnip)/img/splash.png b/src/examples/Platformer Tutorial (Catnip)/img/splash.png new file mode 100644 index 000000000..6af15ce13 Binary files /dev/null and b/src/examples/Platformer Tutorial (Catnip)/img/splash.png differ diff --git a/src/examples/Platformer_tutorial.ict b/src/examples/Platformer Tutorial (JavaScript).ict similarity index 99% rename from src/examples/Platformer_tutorial.ict rename to src/examples/Platformer Tutorial (JavaScript).ict index d1f3fbff9..6a19eb37a 100644 --- a/src/examples/Platformer_tutorial.ict +++ b/src/examples/Platformer Tutorial (JavaScript).ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 notes: /* empty */ libs: place: @@ -26,6 +26,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' icon: f39895d1-731d-4487-9d01-18841158729c branding: icon: fa8a3c12-0e43-47b0-a27e-e9d9814f8bf5 @@ -102,6 +105,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Rocks_Top depth: 0 uid: f1f632f7-ecd9-4724-8a7a-c5136d48520e @@ -124,6 +128,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Rocks_Platform depth: 0 uid: bf44c3c8-a683-43cd-8925-c5b7e771e152 @@ -146,6 +151,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Spikes depth: 0 uid: cfa730fa-a010-44af-8e02-d5ad0c86f224 @@ -168,6 +174,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Water depth: 0 uid: c1aaae5f-3e4c-4e41-8e24-4c2dfe4d43b6 @@ -190,6 +197,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Water_Top depth: 0 uid: 807691ae-10c5-4cf6-ba0f-6f53d83367ff @@ -212,6 +220,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Checkpoint depth: 0 uid: 53848ac8-d852-45c1-a0e2-c38e76094e4b @@ -240,6 +249,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Exit depth: 0 uid: 0fd7f61f-2f06-47e2-b9e3-2782fcd02415 @@ -271,6 +281,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: GreenCrystal depth: 0 uid: 54f82143-5c80-4566-8bc9-8c240c1d97a1 @@ -303,6 +314,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Heart depth: 0 uid: 3fe668cd-30ee-49ba-8a45-e772bf8832a9 @@ -339,6 +351,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Platform depth: 0 uid: 1ae52dda-689d-4780-97ce-c87886fb581a @@ -389,6 +402,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Platform untill: 0 grid: @@ -3986,6 +4000,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Level_02 onstep: '' ondraw: '' @@ -8791,6 +8806,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: Level_03 onstep: '' ondraw: '' @@ -13979,6 +13995,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: TestLevel oncreate: '' onstep: '' @@ -14324,6 +14341,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - type: folder uid: Rkrrcp1cfd9NgF colorClass: warning @@ -14429,6 +14447,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Robot_Idle untill: 0 grid: @@ -14554,6 +14573,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: CrystalsWidget depth: 0 uid: d582eca9-7676-4764-8aa6-9b10895a9b73 @@ -14594,6 +14614,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: HeartCounter uid: 1d518beb-a3ad-419b-a1b3-1195aa80b3bc origname: s1195aa80b3bc @@ -14612,6 +14633,7 @@ assets: color: '#FFFFFF' weight: 5 type: style + typeface: -1 - name: CrystalCounter uid: e5ba4a93-6e61-4c61-b485-1ceaedd3eb21 origname: s1ceaedd3eb21 @@ -14633,6 +14655,7 @@ assets: color: '#FFFFFF' weight: 5 type: style + typeface: -1 - name: LayerUI oncreate: '' onstep: '' @@ -14681,3 +14704,5 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' +globalVars: [] diff --git a/src/examples/Platformer_tutorial/img/i05db3522-55d5-4358-bf09-5e9a6126ed95.png b/src/examples/Platformer Tutorial (JavaScript)/img/i05db3522-55d5-4358-bf09-5e9a6126ed95.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i05db3522-55d5-4358-bf09-5e9a6126ed95.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i05db3522-55d5-4358-bf09-5e9a6126ed95.png diff --git a/src/examples/Platformer_tutorial/img/i334d338b-4fe4-4168-901e-2315494d37d4.png b/src/examples/Platformer Tutorial (JavaScript)/img/i334d338b-4fe4-4168-901e-2315494d37d4.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i334d338b-4fe4-4168-901e-2315494d37d4.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i334d338b-4fe4-4168-901e-2315494d37d4.png diff --git a/src/examples/Platformer_tutorial/img/i3f19a8ef-4dba-4550-b516-0bcaca131ba6.png b/src/examples/Platformer Tutorial (JavaScript)/img/i3f19a8ef-4dba-4550-b516-0bcaca131ba6.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i3f19a8ef-4dba-4550-b516-0bcaca131ba6.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i3f19a8ef-4dba-4550-b516-0bcaca131ba6.png diff --git a/src/examples/Platformer_tutorial/img/i5749074a-4d92-4aa7-bbde-afb57f1ec4a0.png b/src/examples/Platformer Tutorial (JavaScript)/img/i5749074a-4d92-4aa7-bbde-afb57f1ec4a0.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i5749074a-4d92-4aa7-bbde-afb57f1ec4a0.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i5749074a-4d92-4aa7-bbde-afb57f1ec4a0.png diff --git a/src/examples/Platformer_tutorial/img/i60688c59-ff1e-4550-8525-0fc28c4a3d77.png b/src/examples/Platformer Tutorial (JavaScript)/img/i60688c59-ff1e-4550-8525-0fc28c4a3d77.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i60688c59-ff1e-4550-8525-0fc28c4a3d77.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i60688c59-ff1e-4550-8525-0fc28c4a3d77.png diff --git a/src/examples/Platformer_tutorial/img/i699ff925-9b32-403f-a292-68ea10034788.png b/src/examples/Platformer Tutorial (JavaScript)/img/i699ff925-9b32-403f-a292-68ea10034788.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i699ff925-9b32-403f-a292-68ea10034788.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i699ff925-9b32-403f-a292-68ea10034788.png diff --git a/src/examples/Platformer_tutorial/img/i6deb1d77-24d2-48d6-82ec-045dcbd9eea5.png b/src/examples/Platformer Tutorial (JavaScript)/img/i6deb1d77-24d2-48d6-82ec-045dcbd9eea5.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i6deb1d77-24d2-48d6-82ec-045dcbd9eea5.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i6deb1d77-24d2-48d6-82ec-045dcbd9eea5.png diff --git a/src/examples/Platformer_tutorial/img/i92d2ca65-d3a1-45c9-bbd5-5674c6596f98.png b/src/examples/Platformer Tutorial (JavaScript)/img/i92d2ca65-d3a1-45c9-bbd5-5674c6596f98.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i92d2ca65-d3a1-45c9-bbd5-5674c6596f98.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i92d2ca65-d3a1-45c9-bbd5-5674c6596f98.png diff --git a/src/examples/Platformer_tutorial/img/i9a6d05c0-477d-47f6-85fe-6c0c8d813df3.png b/src/examples/Platformer Tutorial (JavaScript)/img/i9a6d05c0-477d-47f6-85fe-6c0c8d813df3.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i9a6d05c0-477d-47f6-85fe-6c0c8d813df3.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i9a6d05c0-477d-47f6-85fe-6c0c8d813df3.png diff --git a/src/examples/Platformer_tutorial/img/i9fdb39bb-1685-4ca2-b750-ccb15ca765d2.png b/src/examples/Platformer Tutorial (JavaScript)/img/i9fdb39bb-1685-4ca2-b750-ccb15ca765d2.png similarity index 100% rename from src/examples/Platformer_tutorial/img/i9fdb39bb-1685-4ca2-b750-ccb15ca765d2.png rename to src/examples/Platformer Tutorial (JavaScript)/img/i9fdb39bb-1685-4ca2-b750-ccb15ca765d2.png diff --git a/src/examples/Platformer_tutorial/img/iNaN.png b/src/examples/Platformer Tutorial (JavaScript)/img/iNaN.png similarity index 100% rename from src/examples/Platformer_tutorial/img/iNaN.png rename to src/examples/Platformer Tutorial (JavaScript)/img/iNaN.png diff --git a/src/examples/Platformer_tutorial/img/ie086f16a-24fd-4f73-b44a-e3e22766ca62.png b/src/examples/Platformer Tutorial (JavaScript)/img/ie086f16a-24fd-4f73-b44a-e3e22766ca62.png similarity index 100% rename from src/examples/Platformer_tutorial/img/ie086f16a-24fd-4f73-b44a-e3e22766ca62.png rename to src/examples/Platformer Tutorial (JavaScript)/img/ie086f16a-24fd-4f73-b44a-e3e22766ca62.png diff --git a/src/examples/Platformer_tutorial/img/ie15a4451-c77c-4347-a99f-436731aff19d.png b/src/examples/Platformer Tutorial (JavaScript)/img/ie15a4451-c77c-4347-a99f-436731aff19d.png similarity index 100% rename from src/examples/Platformer_tutorial/img/ie15a4451-c77c-4347-a99f-436731aff19d.png rename to src/examples/Platformer Tutorial (JavaScript)/img/ie15a4451-c77c-4347-a99f-436731aff19d.png diff --git a/src/examples/Platformer_tutorial/img/if39895d1-731d-4487-9d01-18841158729c.png b/src/examples/Platformer Tutorial (JavaScript)/img/if39895d1-731d-4487-9d01-18841158729c.png similarity index 100% rename from src/examples/Platformer_tutorial/img/if39895d1-731d-4487-9d01-18841158729c.png rename to src/examples/Platformer Tutorial (JavaScript)/img/if39895d1-731d-4487-9d01-18841158729c.png diff --git a/src/examples/Platformer_tutorial/img/ifa8a3c12-0e43-47b0-a27e-e9d9814f8bf5.png b/src/examples/Platformer Tutorial (JavaScript)/img/ifa8a3c12-0e43-47b0-a27e-e9d9814f8bf5.png similarity index 100% rename from src/examples/Platformer_tutorial/img/ifa8a3c12-0e43-47b0-a27e-e9d9814f8bf5.png rename to src/examples/Platformer Tutorial (JavaScript)/img/ifa8a3c12-0e43-47b0-a27e-e9d9814f8bf5.png diff --git a/src/examples/Platformer_tutorial/img/splash.png b/src/examples/Platformer Tutorial (JavaScript)/img/splash.png similarity index 100% rename from src/examples/Platformer_tutorial/img/splash.png rename to src/examples/Platformer Tutorial (JavaScript)/img/splash.png diff --git a/src/examples/Space Shooter (Catnip).ict b/src/examples/Space Shooter (Catnip).ict new file mode 100644 index 000000000..c116eff3e --- /dev/null +++ b/src/examples/Space Shooter (Catnip).ict @@ -0,0 +1,1553 @@ +ctjsVersion: 5.0.0 +backups: 3 +language: catnip +notes: /* empty */ +libs: + place: + gridX: 1024 + gridY: 1024 + pointer: {} + keyboard: {} + keyboard.polyfill: {} + pointer.polyfill: {} + random: {} +startroom: -1 +contentTypes: [] +actions: + - name: Shoot + methods: + - code: keyboard.Space + - code: pointer.Primary + - name: MoveY + methods: + - code: keyboard.ArrowUp + multiplier: -1 + - code: keyboard.ArrowDown + - code: keyboard.KeyW + multiplier: -1 + - code: keyboard.KeyS + - name: MoveX + methods: + - code: keyboard.KeyA + multiplier: -1 + - code: keyboard.KeyD + - code: keyboard.ArrowLeft + multiplier: -1 + - code: keyboard.ArrowRight +scripts: [] +assets: + - type: folder + uid: mKW6jjnM363LjT + colorClass: act + icon: help-circle + name: textures + lastmod: 1715355350726 + entries: + - lastmod: 1715355243985 + type: texture + name: Laser_Red_09 + untill: 0 + grid: + - 1 + - 1 + axis: + - 24 + - 23 + marginx: 0 + marginy: 0 + imgWidth: 48 + imgHeight: 46 + width: 48 + height: 46 + offx: 0 + offy: 0 + origname: ij8HTKDw1269mzD.png + shape: circle + left: 24 + right: 24 + top: 23 + bottom: 23 + uid: j8HTKDw1269mzD + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/Laser_Red_09.png + r: 23 + - lastmod: 1715355274778 + type: texture + name: Meteor_Grey_Big_01 + untill: 0 + grid: + - 1 + - 1 + axis: + - 50 + - 42 + marginx: 0 + marginy: 0 + imgWidth: 101 + imgHeight: 84 + width: 101 + height: 84 + offx: 0 + offy: 0 + origname: ibjf59Bp488gPtK.png + shape: strip + left: 50 + right: 51 + top: 42 + bottom: 42 + uid: bjf59Bp488gPtK + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/Meteor_Grey_Big_01.png + stripPoints: + - x: 23.666666666666668 + 'y': -40.666666666666664 + - x: 50.666666666666664 + 'y': -1 + - x: 34.666666666666664 + 'y': 32 + - x: 11.666666666666668 + 'y': 28.666666666666668 + - x: -20.666666666666664 + 'y': 40.333333333333336 + - x: -49.666666666666664 + 'y': 9.333333333333332 + - x: -32.83333333333333 + 'y': -40.66666666666667 + closedStrip: true + - lastmod: 1715355116875 + type: texture + name: BG_Blue + untill: 0 + grid: + - 1 + - 1 + axis: + - 0 + - 0 + marginx: 0 + marginy: 0 + imgWidth: 256 + imgHeight: 256 + width: 256 + height: 256 + offx: 0 + offy: 0 + origname: i1FRDjqLTW1Q86p.png + shape: rect + left: 0 + right: 256 + top: 0 + bottom: 256 + uid: 1FRDjqLTW1Q86p + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/BG_Blue.png + tiled: true + - lastmod: 1715355347360 + type: texture + name: Enemy_Red_03 + untill: 0 + grid: + - 1 + - 1 + axis: + - 51 + - 42 + marginx: 0 + marginy: 0 + imgWidth: 103 + imgHeight: 84 + width: 103 + height: 84 + offx: 0 + offy: 0 + origname: iM2Wd7pLkb5D5HM.png + shape: strip + left: 51 + right: 52 + top: 42 + bottom: 42 + uid: M2Wd7pLkb5D5HM + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/Enemy_Red_03.png + stripPoints: + - x: 25.166666666666668 + 'y': -35 + - x: 51.5 + 'y': -2.833333333333334 + - x: 37.5 + 'y': 42 + - x: 28.666666666666664 + 'y': 39.333333333333336 + - x: 30.33333333333333 + 'y': 28.666666666666664 + - x: 12.16666666666666 + 'y': 22 + - x: 9 + 'y': 32.833333333333336 + - x: -9.5 + 'y': 32.333333333333336 + - x: -12.333333333333332 + 'y': 21.999999999999996 + - x: -31.000000000000004 + 'y': 27.5 + - x: -27.833333333333332 + 'y': 39.33333333333333 + - x: -37 + 'y': 41.333333333333336 + - x: -51.333333333333336 + 'y': -2.166666666666668 + - x: -25.166666666666668 + 'y': -36 + - x: -7.83333333333333 + 'y': -41 + - x: 7.833333333333336 + 'y': -41.33333333333333 + closedStrip: true + - lastmod: 1715355232434 + type: texture + name: PlayerShip_02_Blue + untill: 0 + grid: + - 1 + - 1 + axis: + - 56 + - 37 + marginx: 0 + marginy: 0 + imgWidth: 112 + imgHeight: 75 + width: 112 + height: 75 + offx: 0 + offy: 0 + origname: ikHjCgt3W5MT1D4.png + shape: strip + left: 56 + right: 56 + top: 37 + bottom: 38 + uid: kHjCgt3W5MT1D4 + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/PlayerShip_02_Blue.png + stripPoints: + - x: 3.25 + 'y': -36.25 + - x: 9.25 + 'y': -17.25 + - x: 53.75 + 'y': 5.75 + - x: 38.25 + 'y': 34.75 + - x: 16.5 + 'y': 29.25 + - x: 10.25 + 'y': 37.5 + - x: -11.75 + 'y': 37 + - x: -17.5 + 'y': 30 + - x: -37 + 'y': 34.5 + - x: -56 + 'y': 5.75 + - x: -11.25 + 'y': -16.75 + - x: -4 + 'y': -36.75 + closedStrip: true + - lastmod: 1715355254295 + type: texture + name: Laser_Blue_01 + untill: 0 + grid: + - 1 + - 1 + axis: + - 4 + - 27 + marginx: 0 + marginy: 0 + imgWidth: 9 + imgHeight: 54 + width: 9 + height: 54 + offx: 0 + offy: 0 + origname: iRBkbR8Ggjpdmhc.png + shape: rect + left: 4 + right: 5 + top: 27 + bottom: 27 + uid: RBkbR8Ggjpdmhc + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/Laser_Blue_01.png + r: 4 + - lastmod: 1715355293758 + type: texture + name: Meteor_Grey_Med_01 + untill: 0 + grid: + - 1 + - 1 + axis: + - 21 + - 21 + marginx: 0 + marginy: 0 + imgWidth: 43 + imgHeight: 43 + width: 43 + height: 43 + offx: 0 + offy: 0 + origname: iBMRCzJQq5Q7K9w.png + shape: strip + left: 21 + right: 22 + top: 21 + bottom: 22 + uid: BMRCzJQq5Q7K9w + padding: 1 + isBlank: false + source: >- + /home/deck/Documents/ct-js-develop/bundledAssets/textures/Kenney's + Space Shooter/Meteor_Grey_Med_01.png + stripPoints: + - x: -9.083333333333334 + 'y': -19.666666666666668 + - x: 17.25 + 'y': -18 + - x: 21.416666666666664 + 'y': 7.166666666666666 + - x: 0.5833333333333339 + 'y': 20.916666666666668 + - x: -14.25 + 'y': 15.666666666666668 + - x: -19.916666666666664 + 'y': -3.3333333333333326 + closedStrip: true + - type: template + baseClass: AnimatedSprite + name: PlayerShip + depth: 0 + texture: kHjCgt3W5MT1D4 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.misc + code: note + values: + note: |- + Move the ship + See Project > Actions and input methods panel + and "Actions" in the docs. + Move by X axis + - lib: core.propsVars + code: increase + values: + var: + lib: core.movement + code: x + values: {} + val: + lib: core.math + code: '*' + values: + b: + lib: core.math + code: '*' + values: + a: + lib: core + code: u.time + values: {} + b: + lib: core.actions + code: action value + values: + action: MoveX + a: 480 + - lib: core.propsVars + code: increase + values: + var: + lib: core.movement + code: 'y' + values: {} + val: + lib: core.math + code: '*' + values: + b: + lib: core.math + code: '*' + values: + a: + lib: core + code: u.time + values: {} + b: + lib: core.actions + code: action value + values: + action: MoveY + a: 480 + - lib: core.misc + code: note + values: + note: |- + Check whether the ship fell off the viewport + Has the ship crossed the left border? + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: Go back to the left border + - lib: core.movement + code: set x + values: + pixels: 0 + body2: [] + condition: + lib: core.math + code: < + values: + b: 0 + a: + lib: core.movement + code: x + values: {} + - lib: core.misc + code: note + values: + note: Has the ship crossed the right border? + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: Go back to the right border + - lib: core.movement + code: set x + values: + pixels: + lib: core.camera + code: get width + values: {} + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.movement + code: x + values: {} + b: + lib: core.camera + code: get width + values: {} + - lib: core.movement + code: move copy + values: {} + - lib: core.misc + code: note + values: + note: Has the ship crossed the center? + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: Go back to the center + - lib: core.movement + code: set y + values: + pixels: 384 + body2: [] + condition: + lib: core.math + code: < + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 384 + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.misc + code: note + values: + note: Stay above the bottom border + - lib: core.movement + code: set y + values: + pixels: 704 + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: 704 + arguments: {} + variables: [] + - eventKey: OnActionPress + code: + - lib: core + code: templates.copy + values: + template: MFp6TFtj6jq2tc + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + arguments: + action: Shoot + lib: core + variables: [] + - eventKey: collisionCGroup + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + body2: [] + condition: + lib: core.templates + code: is copy + values: + copy: + lib: core.hidden + code: event variable + values: + variableName: other + - lib: core.objects + code: current room write + values: + property: lives + value: + lib: core.math + code: '-' + values: + a: + lib: core.objects + code: room read + values: + property: lives + b: 1 + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + - lib: core + code: u.wait + values: + then: + - lib: core + code: rooms.switch + values: + roomName: cRf5pHnhwjWbw4 + catch: [] + time: 1000 + body2: [] + condition: + lib: core.math + code: <= + values: + a: + lib: core.objects + code: room read + values: + property: lives + b: 0 + arguments: + group: Hostile + lib: place + variables: [] + extends: {} + lastmod: 1716408913122 + uid: Bt1FtTL9j1KBN4 + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: EnemyShip + depth: 0 + texture: M2Wd7pLkb5D5HM + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get height + values: {} + b: 80 + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: 180 + - lib: core.movement + code: set direction + values: + degrees: 45 + - lib: core.timers + code: set timer1 + values: + time: 1 + - lib: core.timers + code: set timer2 + values: + time: 1 + arguments: {} + lib: core + variables: [] + - eventKey: collisionTemplate + code: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + - lib: core.templates + code: kill + values: {} + - lib: core.objects + code: current room write + values: + property: score + value: + lib: core.math + code: + + values: + a: + lib: core.objects + code: room read + values: + property: score + b: 100 + arguments: + template: MFp6TFtj6jq2tc + lib: place + variables: [] + - eventKey: Timer1 + code: + - lib: core.timers + code: set timer1 + values: + time: 3 + - lib: core + code: templates.copy + values: + template: BTp7pffCcm9h6t + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.math + code: + + values: + b: 32 + a: + lib: core.movement + code: 'y' + values: {} + arguments: + name: Shoot + isUi: false + lib: core + variables: [] + - eventKey: Timer2 + code: + - lib: core.timers + code: set timer2 + values: + time: 1 + - lib: core.propsVars + code: set + values: + var: + lib: core.movement + code: get hspeed + values: {} + value: + lib: core.math + code: '*' + values: + b: -1 + a: + lib: core.movement + code: get hspeed + values: {} + arguments: + name: Zigzag + isUi: false + lib: core + variables: [] + extends: + cgroup: Hostile + lastmod: 1716410107667 + uid: 2nJ6HjpcQ25k9F + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Asteroid_Big + depth: 0 + texture: bjf59Bp488gPtK + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get height + values: {} + b: 80 + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: + lib: random + code: random.range + values: + x1: 60 + x2: 180 + - lib: core.movement + code: set direction + values: + degrees: + lib: random + code: random.range + values: + x1: + lib: core.math + code: '-' + values: + a: 90 + b: 30 + x2: + lib: core.math + code: + + values: + a: 90 + b: 30 + arguments: {} + lib: core + variables: [] + - eventKey: collisionTemplate + code: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + - lib: core.templates + code: kill + values: {} + - lib: core + code: templates.copy + values: + template: J5kJHT7Fgn3FmW + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core + code: templates.copy + values: + template: J5kJHT7Fgn3FmW + x: + lib: core.movement + code: x + values: {} + 'y': + lib: core.movement + code: 'y' + values: {} + - lib: core.objects + code: current room write + values: + property: score + value: + lib: core.math + code: + + values: + a: + lib: core.objects + code: room read + values: + property: score + b: 25 + arguments: + template: MFp6TFtj6jq2tc + lib: place + variables: [] + extends: + cgroup: Hostile + lastmod: 1716411517391 + uid: T9w1fgPqMDMQRp + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Asteroid_Medium + depth: 0 + texture: BMRCzJQq5Q7K9w + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: '>' + values: + a: + lib: core.movement + code: 'y' + values: {} + b: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get height + values: {} + b: 80 + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: + lib: random + code: random.range + values: + x1: 60 + x2: 180 + - lib: core.movement + code: set direction + values: + degrees: + lib: random + code: random.range + values: + x1: + lib: core.math + code: '-' + values: + a: 90 + b: 30 + x2: + lib: core.math + code: + + values: + a: 90 + b: 30 + arguments: {} + lib: core + variables: [] + - eventKey: collisionTemplate + code: + - lib: core + code: templates.withCopy + values: + func: + - lib: core.templates + code: kill + values: {} + obj: + lib: core.hidden + code: event variable + values: + variableName: other + - lib: core.templates + code: kill + values: {} + - lib: core.objects + code: current room write + values: + property: score + value: + lib: core.math + code: + + values: + a: + lib: core.objects + code: room read + values: + property: score + b: 10 + arguments: + template: MFp6TFtj6jq2tc + lib: place + variables: [] + extends: + cgroup: Hostile + lastmod: 1716411512282 + uid: J5kJHT7Fgn3FmW + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Laser_Red + depth: 0 + texture: j8HTKDw1269mzD + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: '>' + values: + b: + lib: core.math + code: + + values: + a: + lib: core.camera + code: get height + values: {} + b: 40 + a: + lib: core.movement + code: 'y' + values: {} + - lib: core.movement + code: move copy + values: {} + - lib: core.appearance + code: set angle + values: + degrees: + lib: core.math + code: '-' + values: + b: + lib: core.math + code: '*' + values: + a: 240 + b: + lib: core + code: u.time + values: {} + a: + lib: core.appearance + code: get angle + values: {} + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: 480 + - lib: core.movement + code: set direction + values: + degrees: 90 + - lib: core.appearance + code: set angle + values: + degrees: + lib: random + code: random.deg + values: {} + arguments: {} + lib: core + variables: [] + extends: + cgroup: Hostile + lastmod: 1715778444706 + uid: BTp7pffCcm9h6t + behaviors: [] + extendTypes: '' + properties: [] + - type: template + baseClass: AnimatedSprite + name: Laser_Blue + depth: 0 + texture: RBkbR8Ggjpdmhc + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.logic + code: if else branch + values: + body1: + - lib: core.templates + code: kill + values: {} + body2: [] + condition: + lib: core.math + code: < + values: + b: -40 + a: + lib: core.movement + code: 'y' + values: {} + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnCreate + code: + - lib: core.movement + code: set speed + values: + speed: 1080 + - lib: core.movement + code: set direction + values: + degrees: 270 + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1715362358647 + uid: MFp6TFtj6jq2tc + behaviors: [] + extendTypes: '' + properties: [] + - type: room + oncreate: '' + onstep: '' + ondraw: '' + onleave: '' + gridX: 64 + gridY: 64 + diagonalGrid: false + disableGrid: false + simulate: true + width: 1280 + height: 720 + restrictCamera: false + restrictMaxX: 1280 + restrictMinX: 1280 + restrictMaxY: 720 + restrictMinY: 720 + isUi: false + name: Main + backgroundColor: '#000000' + follow: -1 + backgrounds: + - depth: -5 + texture: 1FRDjqLTW1Q86p + shiftX: 0 + shiftY: 0 + parallaxX: 1 + parallaxY: 1 + movementX: 0 + movementY: 0 + scaleX: 1 + scaleY: 1 + repeat: repeat + copies: + - x: 640 + 'y': 640 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: Bt1FtTL9j1KBN4 + exts: {} + customProperties: {} + bindings: {} + - x: 64 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: K35tpJRRqkGcqK + exts: {} + customProperties: {} + bindings: {} + - x: 1088 + 'y': 64 + opacity: 1 + tint: 16777215 + scale: + x: 1 + 'y': 1 + rotation: 0 + uid: bTpR77pNkDzB11 + exts: {} + customProperties: {} + bindings: {} + tiles: [] + extends: {} + lastmod: 1716411550018 + events: + - eventKey: OnRoomStart + code: + - lib: core.timers + code: set timer1 + values: + time: 0.3 + - lib: core.timers + code: set timer2 + values: + time: 3 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: score + value: 0 + - lib: core.propsVars + code: set + values: + var: + lib: core.hidden + code: property + values: + variableName: lives + value: 3 + arguments: {} + lib: core + variables: [] + - eventKey: Timer1 + code: + - lib: core.timers + code: set timer1 + values: + time: + lib: random + code: random.range + values: + x1: 0.3 + x2: 3 + - lib: core.logic + code: if else branch + values: + body1: + - lib: core + code: templates.copy + values: + template: T9w1fgPqMDMQRp + 'y': -100 + x: + lib: random + code: random + values: + x: + lib: core.camera + code: get width + values: {} + body2: + - lib: core + code: templates.copy + values: + template: J5kJHT7Fgn3FmW + 'y': -100 + x: + lib: random + code: random + values: + x: + lib: core.camera + code: get width + values: {} + condition: + lib: random + code: random.chance + values: + x: 1 + 'y': 2 + arguments: + name: Timer 1 + isUi: false + lib: core + variables: [] + - eventKey: Timer2 + code: + - lib: core.timers + code: set timer2 + values: + time: + lib: random + code: random.range + values: + x1: 3 + x2: 6 + - lib: core + code: templates.copy + values: + template: 2nJ6HjpcQ25k9F + x: + lib: random + code: random + values: + x: + lib: core.camera + code: get width + values: {} + 'y': -100 + arguments: + name: Timer 2 + isUi: false + lib: core + variables: [] + behaviors: [] + extendTypes: '' + uid: cRf5pHnhwjWbw4 + properties: + - score + - lives + - type: template + baseClass: Text + name: ScoreText + depth: 1000 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnDraw + code: + - lib: core.objects + code: this write + values: + property: text + value: + lib: core.strings + code: concat + values: + a: 'Score: ' + b: + lib: core.objects + code: room read + values: + property: score + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716410173217 + uid: K35tpJRRqkGcqK + behaviors: [] + extendTypes: '' + properties: [] + defaultText: 'Score: 0' + textStyle: 1fKJbcWpzc58jm + - type: style + name: ScoreText + uid: 1fKJbcWpzc58jm + font: + family: sans-serif + halign: left + italic: false + size: 32 + weight: '800' + wrap: false + wrapPosition: 640 + lineHeight: 0 + fill: + type: 0 + color: '#54BEFF' + color1: '#cccccc' + color2: '#ffffff' + gradtype: 1 + lastmod: 1715778008171 + typeface: -1 + - type: template + baseClass: Text + name: LivesText + depth: 1000 + texture: -1 + playAnimationOnStart: false + loopAnimation: true + animationFPS: 30 + visible: true + events: + - eventKey: OnStep + lib: core + code: + - lib: core.movement + code: move copy + values: {} + arguments: {} + variables: [] + - eventKey: OnDraw + code: + - lib: core.objects + code: this write + values: + property: text + value: + lib: core.strings + code: concat + values: + a: 'Lives: ' + b: + lib: core.objects + code: room read + values: + property: lives + arguments: {} + lib: core + variables: [] + extends: {} + lastmod: 1716410293754 + uid: bTpR77pNkDzB11 + behaviors: [] + extendTypes: '' + properties: [] + defaultText: 'Lives: 0' + textStyle: 1fKJbcWpzc58jm +settings: + authoring: + author: '' + site: '' + title: '' + version: + - 0 + - 0 + - 0 + versionPostfix: '' + appId: '' + rendering: + usePixiLegacy: true + transparent: false + maxFPS: 60 + pixelatedrender: false + highDensity: true + desktopMode: maximized + hideCursor: false + mobileScreenOrientation: unspecified + viewMode: scaleFit + export: + autocloseDesktop: true + windows: true + linux: true + mac: true + functionWrap: false + codeModifier: none + bundleAssetTree: false + bundleAssetTypes: + texture: true + template: true + room: true + behavior: false + font: false + sound: false + style: false + tandem: false + script: false + typefaces: ! '' + showErrors: true + errorsLink: '' + branding: + accent: '#446adb' + invertPreloaderScheme: true + icon: -1 + splashScreen: -1 + forceSmoothIcons: false + forceSmoothSplashScreen: false + hideLoadingLogo: false + alternativeLogo: false + customLoadingText: '' + fps: 30 +palette: [] +globalVars: [] diff --git a/src/examples/Space Shooter (Catnip)/img/i1FRDjqLTW1Q86p.png b/src/examples/Space Shooter (Catnip)/img/i1FRDjqLTW1Q86p.png new file mode 100644 index 000000000..0889d1144 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/i1FRDjqLTW1Q86p.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/iBMRCzJQq5Q7K9w.png b/src/examples/Space Shooter (Catnip)/img/iBMRCzJQq5Q7K9w.png new file mode 100644 index 000000000..decc30091 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/iBMRCzJQq5Q7K9w.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/iM2Wd7pLkb5D5HM.png b/src/examples/Space Shooter (Catnip)/img/iM2Wd7pLkb5D5HM.png new file mode 100644 index 000000000..2aabc43c6 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/iM2Wd7pLkb5D5HM.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/iRBkbR8Ggjpdmhc.png b/src/examples/Space Shooter (Catnip)/img/iRBkbR8Ggjpdmhc.png new file mode 100644 index 000000000..62e1fe9eb Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/iRBkbR8Ggjpdmhc.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/ibjf59Bp488gPtK.png b/src/examples/Space Shooter (Catnip)/img/ibjf59Bp488gPtK.png new file mode 100644 index 000000000..823e0b553 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/ibjf59Bp488gPtK.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/ij8HTKDw1269mzD.png b/src/examples/Space Shooter (Catnip)/img/ij8HTKDw1269mzD.png new file mode 100644 index 000000000..c8f0b34b0 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/ij8HTKDw1269mzD.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/ikHjCgt3W5MT1D4.png b/src/examples/Space Shooter (Catnip)/img/ikHjCgt3W5MT1D4.png new file mode 100644 index 000000000..fb9ff3b98 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/ikHjCgt3W5MT1D4.png differ diff --git a/src/examples/Space Shooter (Catnip)/img/splash.png b/src/examples/Space Shooter (Catnip)/img/splash.png new file mode 100644 index 000000000..9497e9593 Binary files /dev/null and b/src/examples/Space Shooter (Catnip)/img/splash.png differ diff --git a/src/examples/SpaceShooter_tutorial.ict b/src/examples/Space Shooter (JavaScript).ict similarity index 98% rename from src/examples/SpaceShooter_tutorial.ict rename to src/examples/Space Shooter (JavaScript).ict index 9b148dd3f..a78bdb8c8 100644 --- a/src/examples/SpaceShooter_tutorial.ict +++ b/src/examples/Space Shooter (JavaScript).ict @@ -31,6 +31,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: -1 accent: '#446adb' @@ -56,7 +59,7 @@ settings: palette: - 'rgba(0,0,0,0.61)' startroom: 8eced6ed-b52a-4344-8266-3fa909005671 -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 scripts: [] actions: - name: Shoot @@ -163,6 +166,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Laser_Red depth: 0 uid: ebe33c0f-6f27-4123-ac8a-3029404dbc7a @@ -204,6 +208,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Laser_Blue depth: 0 uid: cd732ad2-d2ae-4745-b6d8-07a57a9d3a2e @@ -240,6 +245,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: EnemyShip depth: 0 uid: 5d3e8a47-30e6-45b1-8b36-d445fdcb8e14 @@ -295,6 +301,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Asteroid_Medium depth: 0 uid: f829b135-ac68-4193-9980-d367e90448a1 @@ -340,6 +347,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Asteroid_Big depth: 0 uid: 41fbc5fe-0f41-4151-b7bf-26acefce80ae @@ -387,6 +395,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Main onleave: '' width: 800 @@ -494,6 +503,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - name: ScoreText uid: 4f2f6d4b-a339-4e30-98f3-80db10aafc4f origname: s1 @@ -517,6 +527,7 @@ assets: x: -2 'y': 2 blur: 3 + typeface: -1 - name: LivesText uid: b1e32885-9439-412d-9220-7d18fae8bf91 origname: s3 @@ -540,6 +551,7 @@ assets: color: '#FFFFFF' weight: 4 type: style + typeface: -1 - name: PlayerShip untill: 0 grid: @@ -814,6 +826,7 @@ assets: behaviors: [] textStyle: b1e32885-9439-412d-9220-7d18fae8bf91 defaultText: 'Lives: 3' + extendTypes: '' - type: template baseClass: Text name: ScoreText @@ -840,3 +853,5 @@ assets: behaviors: [] textStyle: 4f2f6d4b-a339-4e30-98f3-80db10aafc4f defaultText: 'Score: 60063' + extendTypes: '' +globalVars: [] diff --git a/src/examples/SpaceShooter_tutorial/img/i1.png b/src/examples/Space Shooter (JavaScript)/img/i1.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i1.png rename to src/examples/Space Shooter (JavaScript)/img/i1.png diff --git a/src/examples/SpaceShooter_tutorial/img/i2.png b/src/examples/Space Shooter (JavaScript)/img/i2.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i2.png rename to src/examples/Space Shooter (JavaScript)/img/i2.png diff --git a/src/examples/SpaceShooter_tutorial/img/i3.png b/src/examples/Space Shooter (JavaScript)/img/i3.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i3.png rename to src/examples/Space Shooter (JavaScript)/img/i3.png diff --git a/src/examples/SpaceShooter_tutorial/img/i4.png b/src/examples/Space Shooter (JavaScript)/img/i4.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i4.png rename to src/examples/Space Shooter (JavaScript)/img/i4.png diff --git a/src/examples/SpaceShooter_tutorial/img/i5.png b/src/examples/Space Shooter (JavaScript)/img/i5.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i5.png rename to src/examples/Space Shooter (JavaScript)/img/i5.png diff --git a/src/examples/SpaceShooter_tutorial/img/i6.png b/src/examples/Space Shooter (JavaScript)/img/i6.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i6.png rename to src/examples/Space Shooter (JavaScript)/img/i6.png diff --git a/src/examples/SpaceShooter_tutorial/img/i7.png b/src/examples/Space Shooter (JavaScript)/img/i7.png similarity index 100% rename from src/examples/SpaceShooter_tutorial/img/i7.png rename to src/examples/Space Shooter (JavaScript)/img/i7.png diff --git a/src/examples/Space Shooter (JavaScript)/img/splash.png b/src/examples/Space Shooter (JavaScript)/img/splash.png new file mode 100644 index 000000000..d36477a45 Binary files /dev/null and b/src/examples/Space Shooter (JavaScript)/img/splash.png differ diff --git a/src/examples/SpaceShooter_tutorial/img/splash.png b/src/examples/SpaceShooter_tutorial/img/splash.png deleted file mode 100644 index cb8b1e3ef..000000000 Binary files a/src/examples/SpaceShooter_tutorial/img/splash.png and /dev/null differ diff --git a/src/examples/yarn.ict b/src/examples/yarn.ict deleted file mode 100644 index fdf9c4c31..000000000 --- a/src/examples/yarn.ict +++ /dev/null @@ -1,786 +0,0 @@ -ctjsVersion: 3.2.0 -notes: >- - There is a number of interesting places to start learning the demo: - - - — rooms' OnCreate events - - — Settings > Scripts > storyEngine - - — OptionButton and NextButton templates, as they advance the story by player's - interactions. -libs: - place: - gridX: 512 - gridY: 512 - fittoscreen: - mode: scaleFit - sound.howler: {} - akatemplate: - csscss: |- - body { - background: #fff; - } - yarn: - skipEmpty: true - magic: true - tween: {} - pointer: - preventdefault: false - startlocked: false -textures: - - name: CatThoughtful - untill: 0 - grid: - - 1 - - 1 - axis: - - 396 - - 462 - marginx: 0 - marginy: 0 - imgWidth: 793 - imgHeight: 924 - width: 793 - height: 924 - offx: 0 - offy: 0 - origname: i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png - source: /home/comigo/Рабочий стол/CatThoughtful.png - shape: rect - left: 396 - right: 397 - top: 462 - bottom: 462 - uid: 5aabca45-bbbd-4792-b3a9-ba79bd4a66fd - lastmod: 1569837312550 - padding: 1 - - name: CatNormal - untill: 0 - grid: - - 1 - - 1 - axis: - - 396 - - 462 - marginx: 0 - marginy: 0 - imgWidth: 793 - imgHeight: 924 - width: 793 - height: 924 - offx: 0 - offy: 0 - origname: iec75835b-2afd-4f96-9373-804b4f80a84d.png - source: /home/comigo/Рабочий стол/CatNormal.png - shape: rect - left: 396 - right: 397 - top: 462 - bottom: 462 - uid: ec75835b-2afd-4f96-9373-804b4f80a84d - lastmod: 1569837308602 - padding: 1 - - name: CatHappy - untill: 0 - grid: - - 1 - - 1 - axis: - - 396 - - 462 - marginx: 0 - marginy: 0 - imgWidth: 793 - imgHeight: 924 - width: 793 - height: 924 - offx: 0 - offy: 0 - origname: i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png - source: /home/comigo/Рабочий стол/CatHappy.png - shape: rect - left: 396 - right: 397 - top: 462 - bottom: 462 - uid: 4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835 - lastmod: 1569837304762 - padding: 1 - - name: Button - untill: 0 - grid: - - 1 - - 1 - axis: - - 512 - - 50 - marginx: 0 - marginy: 0 - imgWidth: 1024 - imgHeight: 100 - width: 1024 - height: 100 - offx: 0 - offy: 0 - origname: ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png - source: /home/comigo/Рабочий стол/Button.png - shape: rect - left: 512 - right: 512 - top: 50 - bottom: 50 - uid: e0cbccef-93ee-4c8a-ab19-4fcef639963c - lastmod: 1569837505628 - padding: 1 - - name: TheGirl - untill: 0 - grid: - - 1 - - 1 - axis: - - 173 - - 800 - marginx: 0 - marginy: 0 - imgWidth: 346 - imgHeight: 800 - width: 346 - height: 800 - offx: 0 - offy: 0 - origname: ibc65f552-4e0c-407e-aee0-9dedd834b727.png - source: 'C:\Users\Master\Desktop\TheGirl.png' - shape: rect - left: 173 - right: 173 - top: 800 - bottom: 0 - uid: bc65f552-4e0c-407e-aee0-9dedd834b727 - lastmod: 1588660086800 - padding: 1 -skeletons: [] -templates: - - name: TheCat - depth: 0 - uid: 9e7aec96-1ad3-4679-a248-01180284e78e - texture: ec75835b-2afd-4f96-9373-804b4f80a84d - extends: {} - lastmod: 1661094209998 - events: [] - type: template - loopAnimation: true - visible: true - blendMode: normal - animationFPS: 30 - playAnimationOnStart: false - - name: OptionButton - depth: 0 - uid: cf5c44b2-f55a-4e18-a941-f7cdf5aecd0f - texture: e0cbccef-93ee-4c8a-ab19-4fcef639963c - extends: {} - lastmod: 1661094187046 - events: - - lib: core - arguments: {} - code: |- - this.text = new PIXI.Text(this.option, { - fill: 0x446ADB, - fontWeight: 600, - fontSize: 32, - wordWrap: true, - wordWrapWidth: 900, - align: 'center' - }); - this.text.anchor.x = this.text.anchor.y = 0.5; - this.addChild(this.text); - - this.scale.x = this.scale.y = 0; - ct.tween.add({ - obj: this.scale, - fields: { - x: 1, - y: 1 - }, - duration: 350, - curve: ct.tween.easeOutQuad - }); - - eventKey: OnCreate - - eventKey: OnPointerClick - code: ct.room.story.say(this.option); - arguments: {} - lib: core - type: template - loopAnimation: true - visible: true - blendMode: normal - animationFPS: 30 - playAnimationOnStart: false - - name: NextButton - depth: 0 - uid: 4340a6a4-65fa-4bcf-b950-38716097f29e - texture: e0cbccef-93ee-4c8a-ab19-4fcef639963c - extends: {} - lastmod: 1661094168112 - events: - - lib: core - arguments: {} - code: |- - this.text = new PIXI.Text(this.option, { - fill: 0x446ADB, - fontWeight: 600, - fontSize: 32, - wordWrap: true, - wordWrapWidth: 900, - align: 'center' - }); - this.text.anchor.x = this.text.anchor.y = 0.5; - this.addChild(this.text); - - this.scale.x = this.scale.y = 0; - ct.tween.add({ - obj: this.scale, - fields: { - x: 1, - y: 1 - }, - duration: 350, - curve: ct.tween.easeOutQuad - }); - - eventKey: OnCreate - - eventKey: OnPointerClick - code: |- - ct.room.story.next(); - this.kill = true; - arguments: {} - lib: core - type: template - loopAnimation: true - visible: true - blendMode: normal - animationFPS: 30 - playAnimationOnStart: false - - name: Blurb - depth: 0 - uid: 04a0aea0-f448-4920-97ad-f98906ac0d7c - texture: -1 - extends: {} - lastmod: 1661094216534 - events: - - lib: core - arguments: {} - code: |- - this.text = new PIXI.Text(this.blurb, { - fill: this.blurbColor || 0x446ADB, - fontSize: 32, - wordWrap: true, - wordWrapWidth: this.blurbWidth || 1024 - }); - this.addChild(this.text); - this.alpha = 0; - this.y += 50; - - ct.tween.add({ - obj: this, - fields: { - y: this.y - 50, - alpha: 1 - }, - duration: 500, - curve: ct.tween.easeOutQuad - }) - .then(() => { - ct.room.story.next(); - }); - eventKey: OnCreate - type: template - loopAnimation: true - visible: true - blendMode: normal - animationFPS: 30 - playAnimationOnStart: false - - name: RestartButton - depth: 0 - uid: 9a5d6ecd-82b4-4b26-827b-08904fbaf962 - texture: e0cbccef-93ee-4c8a-ab19-4fcef639963c - extends: {} - lastmod: 1661094207455 - events: - - lib: core - arguments: {} - code: |- - this.text = new PIXI.Text('Restart', { - fill: 0x446ADB, - fontWeight: 600, - fontSize: 32, - wordWrap: true, - wordWrapWidth: 900, - align: 'center' - }); - this.text.anchor.x = this.text.anchor.y = 0.5; - this.addChild(this.text); - - this.scale.x = this.scale.y = 0; - ct.tween.add({ - obj: this.scale, - fields: { - x: 1, - y: 1 - }, - duration: 350, - curve: ct.tween.easeOutQuad - }); - - eventKey: OnCreate - - eventKey: OnPointerClick - code: |- - ct.rooms.switch(ct.room.name); - this.kill = true; - arguments: {} - lib: core - type: template - loopAnimation: true - visible: true - blendMode: normal - animationFPS: 30 - playAnimationOnStart: false - - name: TheGirl - depth: 0 - uid: 3c91a07b-0497-4623-a244-071a4e1951d8 - texture: bc65f552-4e0c-407e-aee0-9dedd834b727 - extends: {} - lastmod: 1661094213542 - events: - - lib: core - arguments: {} - code: |- - ct.tween.add({ - obj: this, - fields: { - x: ct.camera.width * 0.15 - }, - duration: 500, - curve: ct.tween.easeOutQuad - }); - - this.scale.x = this.scale.y = 1.2; - eventKey: OnCreate - type: template - loopAnimation: true - visible: true - blendMode: normal - animationFPS: 30 - playAnimationOnStart: false -sounds: - - name: Hehe - uid: 0bd4a1eb-b5f1-4047-a8dd-56feca282803 - origname: s0bd4a1eb-b5f1-4047-a8dd-56feca282803.mp3 - lastmod: 1570005238168 -styles: [] -rooms: - - name: Main - onstep: '' - ondraw: '' - onleave: '' - width: 1920 - height: 1080 - backgrounds: [] - copies: - - x: 1536 - 'y': 576 - opacity: 1 - tint: 16777215 - scale: - x: 1 - 'y': 1 - rotation: 0 - uid: 9e7aec96-1ad3-4679-a248-01180284e78e - exts: {} - customProperties: {} - tiles: - - depth: -10 - tiles: [] - extends: {} - hidden: false - uid: d21d2804-d690-4c65-9657-7a1486b7f1d9 - thumbnail: 7a1486b7f1d9 - gridX: 64 - gridY: 64 - lastmod: 1661072102178 - extends: {} - backgroundColor: '#FFFFFF' - events: - - lib: core - arguments: {} - code: |- - var latestBlurb; // we will need it to accurately position text lines - - ct.yarn.openFromFile('theStory.json?q=' + Math.random()) - .then(story => { - this.story = story; - storyEngine(story); // see it in the Settings tab -> Scripts - }); - - - this.nodeTitle = new PIXI.Text('Loading the awesomeness…', { - fill: 0x446ADB, - fontSize: 24, - wordWrap: true, - wordWrapWidth: 1024 - }); - this.nodeTitle.x = 100; - this.nodeTitle.y = 50; - this.addChild(this.nodeTitle); - eventKey: OnRoomStart - type: room - simulate: true - isUi: false - follow: -1 - - name: Micro - onstep: '' - ondraw: '' - onleave: '' - width: 1920 - height: 1080 - backgrounds: [] - copies: - - x: 1536 - 'y': 448 - opacity: 1 - tint: 16777215 - scale: - x: 1 - 'y': 1 - rotation: 0 - uid: 9e7aec96-1ad3-4679-a248-01180284e78e - exts: {} - customProperties: {} - tiles: - - depth: -10 - tiles: [] - extends: {} - hidden: false - uid: cb9565fc-6666-4f0c-bc6c-b49f813ea9ce - thumbnail: b49f813ea9ce - gridX: 64 - gridY: 64 - lastmod: 1661072103899 - extends: {} - backgroundColor: '#FFFFFF' - events: - - lib: core - arguments: {} - code: |- - var latestBlurb; // we will need it to accurately position text lines - - ct.yarn.openFromFile('micro.json?q=' + Math.random()) - .then(story => { - this.story = story; - storyEngine(story); // see it in the Settings tab -> Scripts - }); - - - this.nodeTitle = new PIXI.Text('Loading the awesomeness…', { - fill: 0x446ADB, - fontSize: 24, - wordWrap: true, - wordWrapWidth: 1024 - }); - this.nodeTitle.x = 100; - this.nodeTitle.y = 50; - this.addChild(this.nodeTitle); - eventKey: OnRoomStart - type: room - simulate: true - isUi: false - follow: -1 - - name: Stop - onstep: '' - ondraw: '' - onleave: '' - width: 1920 - height: 1080 - backgrounds: [] - copies: - - x: 1536 - 'y': 448 - opacity: 1 - tint: 16777215 - scale: - x: 1 - 'y': 1 - rotation: 0 - uid: 9e7aec96-1ad3-4679-a248-01180284e78e - exts: {} - customProperties: {} - tiles: - - depth: -10 - tiles: [] - extends: {} - hidden: false - uid: 95f73a99-6402-4848-81a7-d96488130d15 - thumbnail: d96488130d15 - gridX: 64 - gridY: 64 - lastmod: 1661072105674 - extends: {} - backgroundColor: '#FFFFFF' - events: - - lib: core - arguments: {} - code: |- - var latestBlurb; // we will need it to accurately position text lines - - ct.yarn.openFromFile('stop.json?q=' + Math.random()) - .then(story => { - this.story = story; - storyEngine(story); // see it in the Settings tab -> Scripts - }); - - - this.nodeTitle = new PIXI.Text('Loading the awesomeness…', { - fill: 0x446ADB, - fontSize: 24, - wordWrap: true, - wordWrapWidth: 1024 - }); - this.nodeTitle.x = 100; - this.nodeTitle.y = 50; - this.addChild(this.nodeTitle); - eventKey: OnRoomStart - type: room - simulate: true - isUi: false - follow: -1 - - name: Wait - onstep: '' - ondraw: '' - onleave: '' - width: 1920 - height: 1080 - backgrounds: [] - copies: - - x: 1536 - 'y': 448 - opacity: 1 - tint: 16777215 - scale: - x: 1 - 'y': 1 - rotation: 0 - uid: 9e7aec96-1ad3-4679-a248-01180284e78e - exts: {} - customProperties: {} - tiles: - - depth: -10 - tiles: [] - extends: {} - hidden: false - uid: 48b25b49-58b8-44ee-b4c5-cc6b9ea24c38 - thumbnail: cc6b9ea24c38 - gridX: 64 - gridY: 64 - lastmod: 1661072107514 - extends: {} - backgroundColor: '#FFFFFF' - events: - - lib: core - arguments: {} - code: |- - var latestBlurb; // we will need it to accurately position text lines - - ct.yarn.openFromFile('wait.json?q=' + Math.random()) - .then(story => { - this.story = story; - storyEngine(story); // see it in the Settings tab -> Scripts - }); - - - this.nodeTitle = new PIXI.Text('Loading the awesomeness…', { - fill: 0x446ADB, - fontSize: 24, - wordWrap: true, - wordWrapWidth: 1024 - }); - this.nodeTitle.x = 100; - this.nodeTitle.y = 50; - this.addChild(this.nodeTitle); - eventKey: OnRoomStart - type: room - simulate: true - isUi: false - follow: -1 -actions: - - name: Press - methods: - - code: pointer.Primary - - code: pointer.Any - - name: AltPress - methods: - - code: pointer.Secondary - - code: pointer.Double - - name: Scale - methods: - - code: pointer.DeltaPinch - - code: pointer.Wheel -starting: 0 -settings: - export: - linux: true - windows: true - mac: true - functionWrap: false - codeModifier: none - branding: - icon: -1 - accent: '#446adb' - invertPreloaderScheme: true - rendering: - maxFPS: 60 - pixelatedrender: false - highDensity: true - usePixiLegacy: true - desktopMode: maximized - mobileScreenOrientation: unspecified - authoring: - title: ! '' - author: ! '' - site: ! '' - version: - - 0 - - 0 - - 0 - versionPostfix: '' - fps: 30 -scripts: - - name: storyEngine - code: |- - var storyEngine = function (story) { - var latestBlurb; // used to position lines nicely, see below at story.on('options') - var spacing = true; - - story.on('newnode', () => { - // Clear the previous buttons and blurbs - for (const button of ct.templates.list['NextButton']) { - button.kill = true; - } - for (const button of ct.templates.list['OptionButton']) { - button.kill = true; - } - for (const blurb of ct.templates.list['Blurb']) { - blurb.kill = true; - } - // Update the node's title - ct.room.nodeTitle.text = story.title; - }); - - story.on('text', text => { - // Yarn does not support single dialogue options, but we will fake - // them to add a better feeling of authority - if (story.character === 'Player') { - // Clear the previous buttons - for (const button of ct.templates.list['NextButton']) { - button.kill = true; - } - ct.templates.copy('NextButton', ct.camera.width / 2, ct.camera.height - 60, { - option: story.body // it will appear in button's OnCreate event as this.option - }); - } else { - let blurbY = 150; // the default blurb location - // Get the latest blurb's bottom line, if any - if (latestBlurb && !latestBlurb.kill) { - blurbY = latestBlurb.y + latestBlurb.text.height + (spacing? 32 : 0); - } - if (story.character === 'Girl') { - latestBlurb = ct.templates.copy('Blurb', 500, blurbY, { - blurb: story.body, // it will appear in Blurb's OnCreate event as this.blurb - blurbColor: 0xDB449A, - blurbWidth: 800 - }); - } else { - // Assume it is the cat's line - latestBlurb = ct.templates.copy('Blurb', 100, blurbY, { - blurb: story.body // it will appear in Blurb's OnCreate event as this.blurb - }); - } - } - }); - - story.on('options', options => { - let buttonY = ct.camera.height - 60; - for (const option of options) { - ct.templates.copy('OptionButton', ct.camera.width / 2, buttonY, { - option: option // it will appear in button's OnCreate event as this.option - }); - buttonY -= 120; - } - }); - - story.on('command', command => { - const cat = ct.templates.list['TheCat'][0]; - if (command === 'cat happy') { - cat.tex = 'CatHappy'; - } else if (command === 'cat thoughtful') { - cat.tex = 'CatThoughtful'; - } else if (command === 'cat normal') { - cat.tex = 'CatNormal'; - } else if (command === 'disable spacing') { - spacing = false; - } else if (command === 'enable spacing') { - spacing = true; - } else if (command === 'a girl walks in') { - // Create it offscreen. The copy has an animation in its - // OnCreate code and will roll in - ct.templates.copy('TheGirl', -200, ct.camera.height); - } else if (command === 'a girl walks out') { - const theGirl = ct.templates.list['TheGirl'][0]; - ct.tween.add({ - obj: theGirl, - fields: { - x: -200 - }, - duration: 500 - }).then(() => { - theGirl.kill = true; - }); - } else { - console.warn(`Unknown command "${command}"`); - } - story.next(); - }); - - // The story has enden - story.on('drained', () => { - // Clear the previous buttons and blurbs - for (const button of ct.templates.list['NextButton']) { - button.kill = true; - } - for (const button of ct.templates.list['OptionButton']) { - button.kill = true; - } - for (const blurb of ct.templates.list['Blurb']) { - blurb.kill = true; - } - ct.templates.copy('RestartButton', ct.camera.width / 2, ct.camera.height - 60); - }); - - story.start(); - } - - name: Background color - code: ct.pixiApp.renderer.backgroundColor = 0xffffff; -fonts: [] -startroom: d21d2804-d690-4c65-9657-7a1486b7f1d9 -emitterTandems: [] -palette: [] -contentTypes: [] -groups: - fonts: [] - textures: [] - styles: [] - rooms: [] - sounds: [] - emitterTandems: [] - templates: [] -language: typescript diff --git a/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png b/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png deleted file mode 100644 index 8b1d9e887..000000000 Binary files a/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png and /dev/null differ diff --git a/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png_prev.png b/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png_prev.png deleted file mode 100644 index bdd9d4420..000000000 Binary files a/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png_prev.png and /dev/null differ diff --git a/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png_prev@2.png b/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png_prev@2.png deleted file mode 100644 index 9c3526bf0..000000000 Binary files a/src/examples/yarn/img/i4a04ffe6-c92a-428e-9fe4-5e8d2ce9c835.png_prev@2.png and /dev/null differ diff --git a/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png b/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png deleted file mode 100644 index 99c7bde08..000000000 Binary files a/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png and /dev/null differ diff --git a/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png_prev.png b/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png_prev.png deleted file mode 100644 index 1a7ba354b..000000000 Binary files a/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png_prev.png and /dev/null differ diff --git a/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png_prev@2.png b/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png_prev@2.png deleted file mode 100644 index 745025738..000000000 Binary files a/src/examples/yarn/img/i5aabca45-bbbd-4792-b3a9-ba79bd4a66fd.png_prev@2.png and /dev/null differ diff --git a/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png b/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png deleted file mode 100644 index 03576b17d..000000000 Binary files a/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png and /dev/null differ diff --git a/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png_prev.png b/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png_prev.png deleted file mode 100644 index e8c2dfee7..000000000 Binary files a/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png_prev.png and /dev/null differ diff --git a/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png_prev@2.png b/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png_prev@2.png deleted file mode 100644 index 2932c3f2f..000000000 Binary files a/src/examples/yarn/img/ibc65f552-4e0c-407e-aee0-9dedd834b727.png_prev@2.png and /dev/null differ diff --git a/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png b/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png deleted file mode 100644 index b39dd0d5c..000000000 Binary files a/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png and /dev/null differ diff --git a/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png_prev.png b/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png_prev.png deleted file mode 100644 index e2a018aae..000000000 Binary files a/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png_prev.png and /dev/null differ diff --git a/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png_prev@2.png b/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png_prev@2.png deleted file mode 100644 index 299c2dad7..000000000 Binary files a/src/examples/yarn/img/ie0cbccef-93ee-4c8a-ab19-4fcef639963c.png_prev@2.png and /dev/null differ diff --git a/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png b/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png deleted file mode 100644 index 2e87417aa..000000000 Binary files a/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png and /dev/null differ diff --git a/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png_prev.png b/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png_prev.png deleted file mode 100644 index 7aaace2fb..000000000 Binary files a/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png_prev.png and /dev/null differ diff --git a/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png_prev@2.png b/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png_prev@2.png deleted file mode 100644 index 8742f5a55..000000000 Binary files a/src/examples/yarn/img/iec75835b-2afd-4f96-9373-804b4f80a84d.png_prev@2.png and /dev/null differ diff --git a/src/examples/yarn/img/r48b25b49-58b8-44ee-b4c5-cc6b9ea24c38.png b/src/examples/yarn/img/r48b25b49-58b8-44ee-b4c5-cc6b9ea24c38.png deleted file mode 100644 index 22fddb13a..000000000 Binary files a/src/examples/yarn/img/r48b25b49-58b8-44ee-b4c5-cc6b9ea24c38.png and /dev/null differ diff --git a/src/examples/yarn/img/r48b25b49-58b8-44ee-b4c5-cc6b9ea24c38@r.png b/src/examples/yarn/img/r48b25b49-58b8-44ee-b4c5-cc6b9ea24c38@r.png deleted file mode 100644 index 2a522e48b..000000000 Binary files a/src/examples/yarn/img/r48b25b49-58b8-44ee-b4c5-cc6b9ea24c38@r.png and /dev/null differ diff --git a/src/examples/yarn/img/r95f73a99-6402-4848-81a7-d96488130d15.png b/src/examples/yarn/img/r95f73a99-6402-4848-81a7-d96488130d15.png deleted file mode 100644 index 22fddb13a..000000000 Binary files a/src/examples/yarn/img/r95f73a99-6402-4848-81a7-d96488130d15.png and /dev/null differ diff --git a/src/examples/yarn/img/r95f73a99-6402-4848-81a7-d96488130d15@r.png b/src/examples/yarn/img/r95f73a99-6402-4848-81a7-d96488130d15@r.png deleted file mode 100644 index 2a522e48b..000000000 Binary files a/src/examples/yarn/img/r95f73a99-6402-4848-81a7-d96488130d15@r.png and /dev/null differ diff --git a/src/examples/yarn/img/rcb9565fc-6666-4f0c-bc6c-b49f813ea9ce.png b/src/examples/yarn/img/rcb9565fc-6666-4f0c-bc6c-b49f813ea9ce.png deleted file mode 100644 index 22fddb13a..000000000 Binary files a/src/examples/yarn/img/rcb9565fc-6666-4f0c-bc6c-b49f813ea9ce.png and /dev/null differ diff --git a/src/examples/yarn/img/rcb9565fc-6666-4f0c-bc6c-b49f813ea9ce@r.png b/src/examples/yarn/img/rcb9565fc-6666-4f0c-bc6c-b49f813ea9ce@r.png deleted file mode 100644 index 2a522e48b..000000000 Binary files a/src/examples/yarn/img/rcb9565fc-6666-4f0c-bc6c-b49f813ea9ce@r.png and /dev/null differ diff --git a/src/examples/yarn/img/rd21d2804-d690-4c65-9657-7a1486b7f1d9.png b/src/examples/yarn/img/rd21d2804-d690-4c65-9657-7a1486b7f1d9.png deleted file mode 100644 index 000fd9259..000000000 Binary files a/src/examples/yarn/img/rd21d2804-d690-4c65-9657-7a1486b7f1d9.png and /dev/null differ diff --git a/src/examples/yarn/img/rd21d2804-d690-4c65-9657-7a1486b7f1d9@r.png b/src/examples/yarn/img/rd21d2804-d690-4c65-9657-7a1486b7f1d9@r.png deleted file mode 100644 index 576c558b0..000000000 Binary files a/src/examples/yarn/img/rd21d2804-d690-4c65-9657-7a1486b7f1d9@r.png and /dev/null differ diff --git a/src/examples/yarn/img/splash.png b/src/examples/yarn/img/splash.png deleted file mode 100644 index 2a522e48b..000000000 Binary files a/src/examples/yarn/img/splash.png and /dev/null differ diff --git a/src/examples/yarn/include/micro.json b/src/examples/yarn/include/micro.json deleted file mode 100644 index 0644b6557..000000000 --- a/src/examples/yarn/include/micro.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "title": "Start", - "tags": "", - "body": "The beginning\nAnd the end", - "position": { - "x": 815, - "y": 180 - }, - "colorID": 0 - } -] \ No newline at end of file diff --git a/src/examples/yarn/include/stop.json b/src/examples/yarn/include/stop.json deleted file mode 100644 index 29c774911..000000000 --- a/src/examples/yarn/include/stop.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "title": "Start", - "tags": "", - "body": "A line 1/3\nA line 2/3\n<>\nA line 3/3", - "position": { - "x": 2780, - "y": 1798 - }, - "colorID": 0 - } -] \ No newline at end of file diff --git a/src/examples/yarn/include/theStory.json b/src/examples/yarn/include/theStory.json deleted file mode 100644 index 25bba6079..000000000 --- a/src/examples/yarn/include/theStory.json +++ /dev/null @@ -1,272 +0,0 @@ -[ - { - "title": "CommandsExample", - "tags": "", - "body": "<< cat normal >>\n\nI use them to change my texture and play sounds!\n\n<< cat happy >>\n<< sound(\"Hehe\")>> \n\nPlayer: Whoa! *O* Anything else??\n\n[[ExtraFunctions]]", - "position": { - "x": 4371, - "y": 2306 - }, - "colorID": 1 - }, - { - "title": "Conditionals", - "tags": "", - "body": "Make your stories data-driven!\n\nYarn has math variables, functions, comparisons and complex conditionals. For the full guide, see https://bit.ly/2p8LI6n\n\n[[Wonderful!|FAQ]]\n[[I want to see it in action.|SeeConditionals]]", - "position": { - "x": 4117, - "y": 4490 - }, - "colorID": 0 - }, - { - "title": "ExportProject", - "tags": "", - "body": "<< cat normal >> \n\nCat: Yarn is available at yarnspinnertool.github.io/YarnEditor/\nCat: Design your dialogue, then open the File menu → Save as JSON.\nPlayer: Done.\n\n[[ImportingToCt]]", - "position": { - "x": 4695, - "y": 879 - }, - "colorID": 0 - }, - { - "title": "Extending", - "tags": "", - "body": "<< cat happy >>\nThat's up to you! You have the power of ct.js, the flexibility of JavaScript and the exploitability of this module.\nYou can split your stories into scenes, load them into ct.js, and then create a room for each one, with nifty backgrounds and decorations. Much like in visual novels! *U*\nYou can use ct.room.story.raw instead of e.g. ct.room.story.text to get the source of a node and get extra variables that you put in the body of your node.\n\nIf you struggle, though, check out the source of this edutational demo!\n\nPlayer: Thanks!\n\n[[FAQ]]", - "position": { - "x": 3576, - "y": 4484 - }, - "colorID": 0 - }, - { - "title": "ExtraFunctions", - "tags": "", - "body": "<< cat normal >>\nYes, there are some extra variables that may help you:\n\nct.room.story.nodes is a map of all the nodes in your story. E.g. ct.room.story.nodes['ExtraFunctions'] will return the current node.\nct.room.story.raw is an object with the unprocessed body and other meta information exported by Yarn.\nct.room.story.startingNode is the name of, well, the starting node.\n\nPlayer: How do I combine it into a working game or dialogue system?\n\n[[TyingTogether]]", - "position": { - "x": 4650, - "y": 2441 - }, - "colorID": 0 - }, - { - "title": "FAQ", - "tags": "", - "body": "<>\n <>\n See? I don't have the default line now.\n <> \n<>\n <>\n Ask me anything. Well, anything that was hardcoded by Comigo.\n<>\n\n[[I'm done|Fin]]\n[[Projects…|FAQProjects]]\n[[Writing stories…|FAQStories]]\n[[More than text…|FAQMore]]", - "position": { - "x": 4689, - "y": 3666 - }, - "colorID": 6 - }, - { - "title": "FormatStory", - "tags": "", - "body": "<< cat normal >>\n\nct.yarn is based on bondage.js and has all its perks and issues. Generally, you can write however you want, but single dialogue options are not supported. There is a workaround, though, as you could already guess! ;) See the demo's source! \n\nPlayer: Oh, ok!\n\n[[FAQ]]", - "position": { - "x": 5359, - "y": 3910 - }, - "colorID": 0 - }, - { - "title": "GettingScene", - "tags": "tag1 tag2", - "body": "<< cat thoughtful >> \n\nThe details of the current node can be read by these variables:\n\nstory.character is the name of the current character. E.g. if you write \"John: Hey there!\" in Yarn, story.character will be \"John\". Names cannot contain spaces! \nstory.body is what I'm saying right now :)\nstory.text is character's name and body combined, in case it comes in handy.\nstory.title is the name of a node. You can view it in the top-left corner there.\nstory.command is the code of the current command, if any.\nstory.tags is an array of strings with tags written at Yarn Editor. Use them however you want!\n\n<>\n\n[[How do you use tags, though?|CommandsExample]]\n[[Are there any special variables?|ExtraFunctions]]", - "position": { - "x": 4659, - "y": 2087 - }, - "colorID": 0 - }, - { - "title": "ImportingToCt", - "tags": "", - "body": "<< cat normal >> \n\nOpen the downloaded JSON file and copy its contents. Now open ct.js. Click the \"Settings\" tab, and create a new script. Write the beginning of a line:\nvar myStory = \nand then paste the JSON file. That's enough, you can save the script and move on.\n\n[[Wait, where do I get this JSON file, again?|ExportProject]]\n[[Got it.|OpeningStory]]", - "position": { - "x": 4692, - "y": 1164 - }, - "colorID": 0 - }, - { - "title": "LoadingFile", - "tags": "", - "body": "<< cat thoughtful >>\n\nYou can use this code to load a story from an external file:\n\nct.yarn.openFromFile('myStory.json')\n.then(story => {\n ct.room.story = story;\n});\n\nJSON files are better placed into your projects folder → 'include' subdirectory.\n\nPlayer: Thanks!\n\n[[FAQ]]", - "position": { - "x": 4956, - "y": 4509 - }, - "colorID": 0 - }, - { - "title": "MultipleFiles", - "tags": "", - "body": "<< cat happy >>\n\nThat's actually easy. Export each one to JSON, create one Script in ct's Settings tab, and give them different variable names. E.g.\nvar detectiveMystery = {/*yarn json goes here*/};\n/*in the other Script*/\nvar bossMonologue = {/* another yarn json */};\n/* and in the other */\nvar iLoveChocolate = {/* here ct bursts into tears and eats all the chocolate */};\n\nAnd so on.\n\nYou can also use files in the `include` folder.\n\n[[Thanks!|FAQ]]\n[[Aaaand how do I use these files?|LoadingFile]]", - "position": { - "x": 5288, - "y": 4380 - }, - "colorID": 0 - }, - { - "title": "NavigatingStory", - "tags": "", - "body": "<< cat happy>>\n\nCat: I will use just \"story\" instead of ct.room.story from now, ok?\n\nPlayer: Of course!\n\n<< cat thoughtful >> \n\nWe should use story in our function calls:\nstory.start() will put us in the beginning of it.\nstory.next() will advance the story. It will pull new speech lines, new options, and load commands, but one thing at a time.\nstory.back() will switch to the previous story node. It works just once, though, like in ye olde MS Paint.\nstory.options is an array of strings with currently available dialogue options, if there are any.\nstory.say(string) will navigate the story further. The string must match with entries from ct.room.story.options.\n\n<< cat normal >> \n\n[[But what about the speech of NPCs and stuff?|GettingScene]]\n[[Can I jump to a specific position in story, by code?|StoryJump]]", - "position": { - "x": 4686, - "y": 1761 - }, - "colorID": 0 - }, - { - "title": "OpeningStory", - "tags": "", - "body": "The JSON file is still a raw product, though. In order to use your story, you should first load it in your game's code. For example, we can write the following to a room's OnCreate code:\nct.room.story = ct.yarn.openStory(myStory);\nBy default, ct.yarn will look for the 'Start' node. If you want to provide another default title, use ct.yarn.openStory(myStory, 'Specific title');\nct.yarn will read your JSON and structure it in a more useful format. You can now use other methods of ct.yarn to navigate your story, search for its nodes and get dialogue options.\n\nPlayer: Mhm…\n\n[[NavigatingStory]]", - "position": { - "x": 4695, - "y": 1455 - }, - "colorID": 0 - }, - { - "title": "SeeConditionals", - "tags": "", - "body": "Then go to FAQ page ;)\n\n<< set $seeConditional = true>> \n\nPlayer: Eh, ok…\n\n[[FAQ]]", - "position": { - "x": 4116, - "y": 4777 - }, - "colorID": 1 - }, - { - "title": "Sources", - "tags": "", - "body": "They are bundled with each fresh ct.js version. Check the ct.js folder > examples > yarn.ict.\n\nPlayer: Thanks!\n\n[[FAQ]]", - "position": { - "x": 3846, - "y": 4491 - }, - "colorID": 0 - }, - { - "title": "Start", - "tags": "", - "body": "<> \nCat: Hello, fellow game developer! You are playing the demo of using Yarn Editor for creating interactive dialogues in ct.js!\nCat: Due to the lack of writing skills of Comigo, it will be a purely educational experience, with no cute girls.\nPlayer: Such wow. I'm in.\n[[WhatIsYarn]]", - "position": { - "x": 4695, - "y": 312 - }, - "colorID": 4 - }, - { - "title": "StoryJump", - "tags": "", - "body": "<< cat happy >> \nYes! All nodes in Yarn are named, and you can use them to instantly jump to a specific node, out of your story's flow.\nThe function is ct.room.story.jump('SomeNode');\n<< cat thoughtful >> \nJust think about its debugging capabilities 👀\nIf you haven't specifically named all your story nodes in Yarn Editor, they all are probably just Node1, Node2, Node3… nothing fancy, really.\n\n<>\n\nPlayer: Ok, I got ya\n\n[[GettingScene]]", - "position": { - "x": 4361, - "y": 1967 - }, - "colorID": 1 - }, - { - "title": "WhatIsYarn", - "tags": "", - "body": "<> \nCat: Yarn Editor is an open-source tool for writing game dialogues.\n<> \nCat: Its license is MIT, much like ct.js, and it means that you can use Yarn Editor in any of your projects, be they commercial or not. For free.\nPlayer: Cool! So, how to use Yarn projects in ct.js?\n[[ExportProject]]", - "position": { - "x": 4699, - "y": 587 - }, - "colorID": 0 - }, - { - "title": "TyingTogether", - "tags": "", - "body": "There are two main ways:\n— by reading and utilizing variables like story.text or story.options,\n— or by listening story's events.\n\nPlayer: Let's see them.\n\n[[ByVariables]]", - "position": { - "x": 4654, - "y": 2711 - }, - "colorID": 0 - }, - { - "title": "ByVariables", - "tags": "", - "body": "<>\nIn the first case, you should check story.command, story.text and story.options.\n\nPlayer: Let's see an example.\n\n<>\n\nvar story = ct.room.story;\n<>\nif (ct.actions.Next.pressed) {\n if (story.text) { /* advance by buttons only when someone is talking */\n story.next();\n if (story.text) {\n /* create new blurbs */\n } else if (story.options) {\n /* create dialogue options */\n } else if (story.command) {\n /* custom logic goes here */\n }\n }\n}\n<>\n\nPlayer: Good, and by events?\n\n[[ByEvents]]", - "position": { - "x": 4650, - "y": 2983 - }, - "colorID": 0 - }, - { - "title": "ByEvents", - "tags": "", - "body": "<>\nIt is a bit simpler as you always execute the needed code:\n<>\n\nstory.on('text', text => {\n<>\n /* Someone said something, let's create a blurb for `text` variable */\n});\nstory.on('options', options => {\n /* we are now presented with dialogue options! We need to create reply buttons… */\n});\nstory.on('command', command => {\n /* custom actions may appear here */\n});\n<>\n\nPlayer: Now I feel immense power in my hands! But I still have questions…\n\n[[FAQ]]", - "position": { - "x": 4673, - "y": 3280 - }, - "colorID": 0 - }, - { - "title": "FAQProjects", - "tags": "", - "body": "Yes?\n\n[[How do I use multiple Yarn projects?|MultipleFiles]]\n[[Scripts are not that handy, especially when updating the story. Other options??|LoadingFile]]", - "position": { - "x": 4959, - "y": 4191 - }, - "colorID": 2 - }, - { - "title": "FAQStories", - "tags": "", - "body": "Yes?\n\n\n[[Any special formatting in the Yarn Editor?|FormatStory]]\n[[Can there be several characters at once?|MultipleCharacters]]", - "position": { - "x": 5428, - "y": 3522 - }, - "colorID": 2 - }, - { - "title": "FAQMore", - "tags": "", - "body": "Yes?\n\n[[This demo is cool! Where are its sources?|Sources]]\n[[What about conditionals and variables?|Conditionals]]\n[[How do I make transitions, effects and stuff?|Extending]]", - "position": { - "x": 3899, - "y": 3989 - }, - "colorID": 2 - }, - { - "title": "Fin", - "tags": "", - "body": "<>\n\nOk. Go make some great games now!\n\n<>", - "position": { - "x": 4678, - "y": 5327 - }, - "colorID": 0 - }, - { - "title": "MultipleCharacters", - "tags": "", - "body": "<>\n<>\n<> \n<>\n<> \n\n<>\nGirl: Kon'nichiwa!\n<>\nGirl: ct no Yarn mojūru wa hijō ni jūnandeari, fukusū no moji no enjin o kijutsu suru no wa hijō ni kantandesu.\n<>\nGirl: Kokode wa, komando o shiyō shite hyōji oyobi shūryō shi,-iro wa hensū story. Kyarakutā o shiyō shite settei shimasu.\n<>\n\nPlayer: ❤️_❤️\n\n<> \n\n<< wait(2000) >> \n\n[[DirtyLies]]\n", - "position": { - "x": 5424, - "y": 3135 - }, - "colorID": 3 - }, - { - "title": "DirtyLies", - "tags": "", - "body": "<> \n\nWell, ok, I lied about cute girls.\n\nPlayer: ❤️_❤️\n\n[[FAQ]]", - "position": { - "x": 5138, - "y": 3129 - }, - "colorID": 3 - } -] \ No newline at end of file diff --git a/src/examples/yarn/include/wait.json b/src/examples/yarn/include/wait.json deleted file mode 100644 index f9751f78a..000000000 --- a/src/examples/yarn/include/wait.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "title": "Start", - "tags": "", - "body": "First line…\nPause…\n<>\nSecond line…", - "position": { - "x": 477, - "y": 2188 - }, - "colorID": 0 - } -] \ No newline at end of file diff --git a/src/examples/yarn/snd/s0bd4a1eb-b5f1-4047-a8dd-56feca282803.mp3 b/src/examples/yarn/snd/s0bd4a1eb-b5f1-4047-a8dd-56feca282803.mp3 deleted file mode 100644 index 5488154b3..000000000 Binary files a/src/examples/yarn/snd/s0bd4a1eb-b5f1-4047-a8dd-56feca282803.mp3 and /dev/null differ diff --git a/src/icons/alert-octagon.svg b/src/icons/alert-octagon.svg new file mode 100644 index 000000000..de9b03f21 --- /dev/null +++ b/src/icons/alert-octagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/anchor.svg b/src/icons/anchor.svg new file mode 100644 index 000000000..e01627a3d --- /dev/null +++ b/src/icons/anchor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/archive.svg b/src/icons/archive.svg new file mode 100644 index 000000000..428882c87 --- /dev/null +++ b/src/icons/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/bitmap-font.svg b/src/icons/bitmap-font.svg new file mode 100644 index 000000000..23ecae0cf --- /dev/null +++ b/src/icons/bitmap-font.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/icons/catnip.svg b/src/icons/catnip.svg new file mode 100644 index 000000000..4a79bf20a --- /dev/null +++ b/src/icons/catnip.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/icons/divide-circle.svg b/src/icons/divide-circle.svg new file mode 100644 index 000000000..03a50b747 --- /dev/null +++ b/src/icons/divide-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/function.svg b/src/icons/function.svg new file mode 100644 index 000000000..8098f9b5d --- /dev/null +++ b/src/icons/function.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/mail.svg b/src/icons/mail.svg new file mode 100644 index 000000000..2af169e83 --- /dev/null +++ b/src/icons/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/minus-circle.svg b/src/icons/minus-circle.svg new file mode 100644 index 000000000..80c0de1e1 --- /dev/null +++ b/src/icons/minus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/thumbs-down.svg b/src/icons/thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/src/icons/thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/thumbs-up.svg b/src/icons/thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/src/icons/thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/x-circle.svg b/src/icons/x-circle.svg new file mode 100644 index 000000000..94aad5e56 --- /dev/null +++ b/src/icons/x-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/x-octagon.svg b/src/icons/x-octagon.svg new file mode 100644 index 000000000..85431985d --- /dev/null +++ b/src/icons/x-octagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/js/3rdparty/QRCode.js b/src/js/3rdparty/QRCode.js deleted file mode 100644 index 993e88f39..000000000 --- a/src/js/3rdparty/QRCode.js +++ /dev/null @@ -1 +0,0 @@ -var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/src/js/3rdparty/alertify.js b/src/js/3rdparty/alertify.js index d2d0d0222..d648227e6 100644 --- a/src/js/3rdparty/alertify.js +++ b/src/js/3rdparty/alertify.js @@ -395,7 +395,7 @@ _alertify.injectCSS(); - const {soundbox} = require('./data/node_requires/3rdparty/soundbox'); + const {soundbox} = require('src/node_requires/3rdparty/soundbox'); return { _$$alertify: _alertify, parent(elem) { diff --git a/src/js/3rdparty/color.js b/src/js/3rdparty/color.js index b7ee0c3b4..85ed8b36a 100644 --- a/src/js/3rdparty/color.js +++ b/src/js/3rdparty/color.js @@ -994,11 +994,5 @@ c = Color(str); return length > 0; }; net.brehaut.Color = Color; - global.brehautColor = Color; + window.brehautColor = Color; }).call(net.brehaut); - -/* Export to CommonJS - */ -if (typeof module !== 'undefined') { - module.exports = net.brehaut.Color; -} diff --git a/src/js/3rdparty/debounce.js b/src/js/3rdparty/debounce.js index 1fdbd3dc2..de7e8b2eb 100644 --- a/src/js/3rdparty/debounce.js +++ b/src/js/3rdparty/debounce.js @@ -3,7 +3,6 @@ var slice = function (arr, i) { return Array.prototype.slice.call(arr, i); }; - /* Returns a new function that will delay execution of the original function for the specified number @@ -29,4 +28,4 @@ }; } window.debounce = cumulativeDelayed; -})(this); +})(window); diff --git a/src/js/3rdparty/long-press-event.js b/src/js/3rdparty/long-press-event.js index af4951cf7..0d17dee53 100644 --- a/src/js/3rdparty/long-press-event.js +++ b/src/js/3rdparty/long-press-event.js @@ -96,4 +96,4 @@ clearTimeout(timer); }); -}(this, document)); +}(window, document)); diff --git a/src/js/3rdparty/mountMonaco.js b/src/js/3rdparty/mountMonaco.js new file mode 100644 index 000000000..9deb92818 --- /dev/null +++ b/src/js/3rdparty/mountMonaco.js @@ -0,0 +1,85 @@ +// @see https://github.com/microsoft/monaco-editor-samples/blob/master/nwjs-amd-v2/index.html +const monaco = require('monaco-editor'); +window.monaco = monaco; +self.MonacoEnvironment = { + getWorkerUrl: function (moduleId, label) { + if (label === 'json') { + return './data/monaco-workers/vs/language/json/json.worker.js'; + } + if (label === 'css' || label === 'scss' || label === 'less') { + return './data/monaco-workers/vs/language/css/css.worker.js'; + } + if (label === 'html' || label === 'handlebars' || label === 'razor') { + return './data/monaco-workers/vs/language/html/html.worker.js'; + } + if (label === 'typescript' || label === 'javascript') { + return './data/monaco-workers/vs/language/typescript/ts.worker.js'; + } + return './data/monaco-workers/vs/editor/editor.worker.js'; + } +}; +// workaround monaco-css not understanding the environment +self.module = void 0; +// workaround monaco-typescript not understanding the environment +self.process.browser = true; + +const monacoConfig = { + hovers: false, + codeActions: true, + completionItems: true, + definitions: true, + diagnostics: true, + documentHighlights: true, + // eslint-disable-next-line id-length + documentRangeFormattingEdits: true, + documentSymbols: true, + inlayHints: true, + onTypeFormattingEdits: true, + references: true, + rename: true, + signatureHelp: true +}; +// Need to set defaults before any editor is created +monaco.languages.typescript.typescriptDefaults.setModeConfiguration(monacoConfig); +monaco.languages.typescript.javascriptDefaults.setModeConfiguration(monacoConfig); + +// Extended typescript tokenizer +const typescriptTokenizer = require('src/node_requires/typescriptTokenizer.js').language; +// Extended coffeescript tokenizer & suggestions provider +const coffeescriptTokenizer = require('src/node_requires/coffeescriptTokenizer.js').language; +const {CompletionsProvider: CoffeeCompletionsProvider} = require('src/node_requires/coffeescriptSuggestionProvider'); +const {HoverProvider: TsHoverProvider} = require('src/node_requires/catniplessTsHoverProvider.js'); + +themeManager.loadBuiltInThemes(); +// To rollback to a default theme if the set one is inaccessible ⤵ +themeManager.loadTheme(); + +// I have no guilt of this solution +// @see https://github.com/microsoft/monaco-editor/issues/884 +monaco.editor.create(document.createElement('textarea'), { + language: 'typescript', + value: '(:' +}); +monaco.editor.create(document.createElement('textarea'), { + language: 'coffeescript', + value: ':)' +}); +setTimeout(() => { + + monaco.languages.setMonarchTokensProvider('typescript', typescriptTokenizer); + monaco.languages.setMonarchTokensProvider('coffeescript', coffeescriptTokenizer); + monaco.languages.typescript.getTypeScriptWorker() + .then((client) => { + const coffeescriptSuggestions = new CoffeeCompletionsProvider(client); + monaco.languages.registerCompletionItemProvider('coffeescript', coffeescriptSuggestions); + + const hoverProvider = new TsHoverProvider(client); + monaco.languages.registerHoverProvider('typescript', hoverProvider); + monaco.languages.registerHoverProvider('javascript', hoverProvider); + + window.signals.trigger('monacoBooted'); + }); +}, 1000); + +window.signals = window.signals || riot.observable({}); +window.orders = window.orders || riot.observable({}); diff --git a/src/js/3rdparty/riot.min.js b/src/js/3rdparty/riot.min.js deleted file mode 100644 index e207a353b..000000000 --- a/src/js/3rdparty/riot.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Riot v3.6.1, @license MIT */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.riot=t.riot||{})}(this,function(t){"use strict";function e(t){return Zt.test(t)}function n(t){return typeof t===$t}function r(t){return t&&typeof t===Rt}function i(t){return typeof t===Pt}function o(t){return typeof t===It}function a(t){return i(t)||null===t||""===t}function s(t){return Array.isArray(t)||t instanceof Array}function u(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return i(t[e])||n&&n.writable}function l(t){return Kt.test(t)}function c(t,e){return Array.prototype.slice.call((e||document).querySelectorAll(t))}function f(t,e){return(e||document).querySelector(t)}function p(){return document.createDocumentFragment()}function h(){return document.createTextNode("")}function d(t){return!!t.ownerSVGElement}function g(t){return"svg"===t?document.createElementNS(Ut,t):document.createElement(t)}function m(t,e){if(i(t.innerHTML)){var n=(new DOMParser).parseFromString(e,"application/xml"),r=t.ownerDocument.importNode(n.documentElement,!0);t.appendChild(r)}else t.innerHTML=e}function v(t,e){t.style.display=e?"":"none",t.hidden=!e}function y(t,e){t.removeAttribute(e)}function x(t){return Object.keys(t).reduce(function(e,n){return e+" "+n+": "+t[n]+";"},"")}function b(t,e){return t.getAttribute(e)}function _(t,e,n){var r=Vt.exec(e);r&&r[1]?t.setAttributeNS(Ht,r[1],n):t.setAttribute(e,n)}function w(t,e,n){t.insertBefore(e,n.parentNode&&n)}function O(t,e){if(t)for(var n;n=qt.exec(t);)e(n[1].toLowerCase(),n[2]||n[3]||n[4])}function N(t,e,n){if(t){var r,i=e(t,n);if(!1===i)return;for(t=t.firstChild;t;)r=t.nextSibling,N(t,e,i),t=r}}function j(t,e){for(var n=t?t.length:0,r=0;rr;)n--,U.apply(e[n],[e,n])}function U(t,e){t.splice(e,1),this.unmount(),dt(this.parent,this,this.__.tagName,!0)}function V(t){var e=this;j(Object.keys(this.tags),function(n){st.apply(e.tags[n],[n,t])})}function B(t,e,n){n?yt.apply(this,[t,e]):w(t,this.root,e.root)}function z(t,e,n){n?vt.apply(this,[t,e]):w(t,this.root,e.root)}function F(t,e){e?vt.call(this,t):t.appendChild(this.root)}function D(t,e,n){y(t,At);var r,i=typeof b(t,Lt)!==It||y(t,Lt),a=ft(t),u=Ot[a],l=t.parentNode,c=h(),f=ot(t),d=b(t,Tt),g=[],m=[],v=!Ot[a],x="VIRTUAL"===t.tagName;return n=ie.loopKeys(n),n.isLoop=!0,d&&y(t,Tt),l.insertBefore(c,t),l.removeChild(t),n.update=function(){n.value=ie(n.val,e);var l=p(),h=n.value,y=!s(h)&&!o(h),b=c.parentNode;b&&(y?h=(r=h||!1)?Object.keys(h).map(function(t){return $(n,h[t],t)}):[]:r=!1,d&&(h=h.filter(function(t,r){return n.key&&!y?!!ie(d,$(n,t,r,e)):!!ie(d,L(Object.create(e),t))})),j(h,function(o,s){var c=i&&typeof o===Rt&&!r,p=m.indexOf(o),d=-1===p,y=!d&&c?p:s,_=g[y],w=s>=m.length,O=c&&d||!c&&!_;o=!r&&n.key?$(n,o,s):o,O?((_=new it(u,{parent:e,isLoop:!0,isAnonymous:v,tagName:a,root:t.cloneNode(v),item:o,index:s},t.innerHTML)).mount(),w?F.apply(_,[l||b,x]):z.apply(_,[b,g[s],x]),w||m.splice(s,0,o),g.splice(s,0,_),f&&ht(e.tags,a,_,!0)):y!==s&&c&&(C(h,m[y])&&(B.apply(_,[b,g[s],x]),g.splice(s,0,g.splice(y,1)[0]),m.splice(s,0,m.splice(y,1)[0])),n.pos&&(_[n.pos]=s),!f&&_.tags&&V.call(_,s)),_.__.item=o,_.__.index=s,_.__.parent=e,O||_.update(o)}),H(h,g),m=h.slice(),b.insertBefore(l,c))},n.unmount=function(){j(g,function(t){t.unmount()})},n}function K(t,e,n){var r=this;N(t,function(e,i){var o,a,s,u=e.nodeType,l=i.parent;if(!n&&e===t)return{parent:l};if(3===u&&"STYLE"!==e.parentNode.tagName&&ie.hasExpr(e.nodeValue)&&l.children.push({dom:e,expr:e.nodeValue}),1!==u)return i;var c="VIRTUAL"===e.tagName;if(o=b(e,At))return c&&_(e,"loopVirtual",!0),l.children.push(D(e,r,o)),!1;if(o=b(e,Tt))return l.children.push(Object.create(ue).init(e,r,o)),!1;if((a=b(e,Et))&&ie.hasExpr(a))return l.children.push({isRtag:!0,expr:a,dom:e,attrs:[].slice.call(e.attributes)}),!1;if(s=ot(e),c&&(b(e,"virtualized")&&e.parentElement.removeChild(e),s||b(e,"virtualized")||b(e,"loopVirtual")||(s={tmpl:e.outerHTML})),s&&(e!==t||n)){if(!c||b(e,Et)){var f={root:e,parent:r,hasImpl:!0};return l.children.push(ut(s,f,e.innerHTML,r)),!1}_(e,"virtualized",!0);var p=new it({tmpl:e.outerHTML},{root:e,parent:r},e.innerHTML);l.children.push(p)}return q.apply(r,[e,e.attributes,function(t,e){e&&l.children.push(e)}]),{parent:l}},{parent:{children:e}})}function q(t,n,r){var i=this;j(n,function(n){if(!n)return!1;var o,a=n.name,s=e(a);C(Ct,a)?o=Object.create(le).init(t,i,a,n.value):ie.hasExpr(n.value)&&(o={dom:t,expr:n.value,attr:a,bool:s}),r(n,o)})}function W(t,e,n){var r="o"===n[0],i=r?"select>":"table>";if(t.innerHTML="<"+i+e.trim()+"=0&&/\s/.test(t[e]););return e}var e="[{(,;:?=|&!^~>%*/",n=["case","default","do","else","in","instanceof","prefix","return","typeof","void","yield"],r=n.reduce(function(t,e){return t+e.slice(-1)},""),i=/^\/(?=[^*>/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/,o=/[$\w]/;return function(a,s){var u=/.*/g,l=u.lastIndex=s++,c=u.exec(a)[0].match(i);if(c){var f=l+c[0].length,p=a[l=t(a,l)];if(l<0||~e.indexOf(p))return f;if("."===p)"."===a[l-1]&&(s=f);else if("+"===p||"-"===p)(a[--l]!==p||(l=t(a,l))<0||!o.test(a[l]))&&(s=f);else if(~r.indexOf(p)){for(var h=l+1;--l>=0&&o.test(a[l]););~n.indexOf(a.slice(l+1,h))&&(s=f)}}return s}}(),re=function(t){function e(t){return t}function n(t,e){return e||(e=x),new RegExp(t.source.replace(/{/g,e[2]).replace(/}/g,e[3]),t.global?u:"")}function r(t){if(t===m)return v;var e=t.split(" ");if(2!==e.length||p.test(t))throw new Error('Unsupported brackets "'+t+'"');return e=e.concat(t.replace(h,"\\").split(" ")),e[4]=n(e[1].length>1?/{[\S\s]*?}/:v[4],e),e[5]=n(t.length>3?/\\({|})/g:v[5],e),e[6]=n(v[6],e),e[7]=RegExp("\\\\("+e[3]+")|([[({])|("+e[3]+")|"+d,u),e[8]=t,e}function i(t){return t instanceof RegExp?a(t):x[t]}function o(t){(t||(t=m))!==x[8]&&(x=r(t),a=t===m?e:n,x[9]=a(v[9])),y=t}var a,s,u="g",l=/\/\*[^*]*\*+(?:[^*\/][^*]*\*+)*\//g,c=/"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,f=c.source+"|"+/(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source+"|"+/\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,p=RegExp("[\\x00-\\x1F<>a-zA-Z0-9'\",;\\\\]"),h=/(?=[[\]()*+?.^$|])/g,d=c.source+"|"+/(\/)(?![*\/])/.source,g={"(":RegExp("([()])|"+d,u),"[":RegExp("([[\\]])|"+d,u),"{":RegExp("([{}])|"+d,u)},m="{ }",v=["{","}","{","}",/{[^}]*}/,/\\([{}])/g,/\\({)|{/g,RegExp("\\\\(})|([[({])|(})|"+d,u),m,/^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,/(^|[^\\]){=[\S\s]*?}/],y=void 0,x=[];return i.split=function(t,e,n){function r(t){d&&(t=d+t,d=""),e||a?f.push(t&&t.replace(n[5],"$1")):f.push(t)}function i(n,r,i){return i&&(r=ne(t,n)),e&&r>n+2&&(l="⁗"+h.length+"~",h.push(t.slice(n,r)),d+=t.slice(s,n)+l,s=r),r}n||(n=x);var o,a,s,u,l,c,f=[],p=n[6],h=[],d="";for(a=s=p.lastIndex=0;o=p.exec(t);){if(c=p.lastIndex,u=o.index,a){if(o[2]){var m=o[2],v=g[m],y=1;for(v.lastIndex=c;o=v.exec(t);)if(o[1]){if(o[1]===m)++y;else if(!--y)break}else v.lastIndex=i(o.index,v.lastIndex,o[2]);p.lastIndex=y?t.length:v.lastIndex;continue}if(!o[3]){p.lastIndex=i(u,c,o[4]);continue}}o[1]||(r(t.slice(s,u)),s=p.lastIndex,(p=n[6+(a^=1)]).lastIndex=s)}return t&&s %s",e.riotData.tagName||"Unknown tag",this.tmpl),console.log(this.data))}function n(t){var e=r(t);return"try{return "!==e.slice(0,11)&&(e="return "+e),new Function("E",e+";")}function r(t){var e,n=re.split(t.replace(s,'"'),1),r=n.qblocks;if(n.length>2||n[0]){var o,a,l=[];for(o=a=0;o1?"["+i.join(",")+'].join(" ").trim()':i[0]:o(t,e)}return t}function o(t,e,n){var r;return t=t.replace(p,function(t,e,n,i,o){return n&&(i=r?0:i+t.length,"this"!==n&&"global"!==n&&"window"!==n?(t=e+'("'+n+f+n,i&&(r="."===(o=o[i])||"("===o||"["===o)):i&&(r=!h.test(o.slice(i)))),t}),r&&(t="try{return "+t+"}catch(e){E(e,this)}"),n?t=(r?"function(){"+t+"}.call(this)":"("+t+")")+'?"'+n+'":""':e&&(t="function(v){"+(r?t.replace("return ","v="):"v=("+t+")")+';return v||v===0?v:""}.call(this)'),t}var a={};t.hasExpr=re.hasExpr,t.loopKeys=re.loopKeys,t.clearCache=function(){a={}},t.errorHandler=null;var s=/\u2057/g,u=/\u2057(\d+)~/g,l=/^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/,c={"(":/[()]/g,"[":/[[\]]/g,"{":/[{}]/g},f='"in this?this:'+("object"!=typeof window?"global":"window")+").",p=/[,{][\$\w]+(?=:)|(^ *|[^$\w\.{])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g,h=/^(?=(\.[$\w]+))\1(?:[^.[(]|$)/;return t.version=re.version="v3.0.8",t}(),oe=function(t){t=t||{};var e={},n=Array.prototype.slice;return Object.defineProperties(t,{on:{value:function(n,r){return"function"==typeof r&&(e[n]=e[n]||[]).push(r),t},enumerable:!1,writable:!1,configurable:!1},off:{value:function(n,r){if("*"!=n||r)if(r)for(var i,o=e[n],a=0;i=o&&o[a];++a)i==r&&o.splice(a--,1);else delete e[n];else e={};return t},enumerable:!1,writable:!1,configurable:!1},one:{value:function(e,n){function r(){t.off(e,r),n.apply(t,arguments)}return t.on(e,r)},enumerable:!1,writable:!1,configurable:!1},trigger:{value:function(r){var i,o,a,s=arguments,u=arguments.length-1,l=new Array(u);for(a=0;a|>([\S\s]*?)<\/yield\s*>|>)/gi,pe=/]*)['"]\s*>([\S\s]*?)<\/yield\s*>/gi,he=/|>([\S\s]*?)<\/yield\s*>)/gi,de={tr:"tbody",th:"tr",td:"tr",col:"colgroup"},ge=Gt&&Gt<10?zt:Ft,me="div",ve="svg",ye={},xe=ye[Nt]={},be=0,_e=Object.freeze({Tag:Q,tag:J,tag2:X,mount:Y,mixin:tt,update:et,unregister:nt,version:"v3.6.1"}),we=0,Oe=Object.freeze({getTag:ot,inheritFrom:at,moveChildTag:st,initChildTag:ut,getImmediateCustomParentTag:lt,unmountAll:ct,getTagName:ft,cleanUpData:pt,arrayishAdd:ht,arrayishRemove:dt,mountTo:gt,makeReplaceVirtual:mt,makeVirtual:vt,moveVirtual:yt,selectTags:xt}),Ne=se,je={tmpl:ie,brackets:re,styleManager:ee,vdom:wt,styleNode:ee.styleNode,dom:Jt,check:Qt,misc:ae,tags:Oe},Ce=Q,Ee=J,Te=X,Ae=Y,Le=tt,ke=et,Me=nt,Se=oe,Ie=L({},_e,{observable:oe,settings:Ne,util:je});t.settings=Ne,t.util=je,t.Tag=Ce,t.tag=Ee,t.tag2=Te,t.mount=Ae,t.mixin=Le,t.update=ke,t.unregister=Me,t.version="v3.6.1",t.observable=Se,t.default=Ie,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/src/js/addMigrationMethod.js b/src/js/addMigrationMethod.js index 134239a42..c2c9d479b 100644 --- a/src/js/addMigrationMethod.js +++ b/src/js/addMigrationMethod.js @@ -1,11 +1,11 @@ -(function addMigrationMethod(window) { +(function addMigrationMethod() { window.migrationProcess = window.migrationProcess || []; window.applyMigrationCode = function applyMigrationCode(version) { const process = window.migrationProcess.find(process => process.version === version); if (!process) { throw new Error(`Cannot find migration code for version ${version}`); } - process.process(global.currentProject) + process.process(window.currentProject) .then(() => window.alertify.success(`Applied migration code for version ${version}`, 'success', 3000)); }; -})(this); +})(); diff --git a/src/js/codeEditorProjectAwareCompletions.js b/src/js/codeEditorProjectAwareCompletions.js index d91185f45..0f973e894 100644 --- a/src/js/codeEditorProjectAwareCompletions.js +++ b/src/js/codeEditorProjectAwareCompletions.js @@ -10,7 +10,7 @@ }; const createTemplateProposals = function createTemplateProposals(range) { - const {getOfType} = require('./data/node_requires/resources'); + const {getOfType} = require('src/node_requires/resources'); // filtering is done by the Monaco editor return getOfType('template').map(template => ({ label: template.name, @@ -22,7 +22,7 @@ }; const createRoomProposals = function createRoomProposals(range) { - const {getOfType} = require('./data/node_requires/resources'); + const {getOfType} = require('src/node_requires/resources'); return getOfType('room').map(room => ({ label: room.name, kind: monaco.languages.CompletionItemKind.Value, @@ -33,7 +33,7 @@ }; const createSoundProposals = function createSoundProposals(range) { - const {getOfType} = require('./data/node_requires/resources'); + const {getOfType} = require('src/node_requires/resources'); return getOfType('sound').map(sound => ({ label: sound.name, kind: monaco.languages.CompletionItemKind.Value, @@ -44,7 +44,7 @@ }; const createActionProposals = function createActionProposals(range) { - return global.currentProject.actions.map(action => ({ + return window.currentProject.actions.map(action => ({ label: action.name, kind: monaco.languages.CompletionItemKind.Property, insertText: action.name, @@ -53,7 +53,7 @@ }; const createPSProposals = function createPSProposals(range) { - const {getOfType} = require('./data/node_requires/resources'); + const {getOfType} = require('src/node_requires/resources'); return getOfType('tandem').map(et => ({ label: et.name, kind: monaco.languages.CompletionItemKind.Value, @@ -64,7 +64,7 @@ }; const createScriptProposals = function createScriptProposals(range) { - const {getOfType} = require('./data/node_requires/resources'); + const {getOfType} = require('src/node_requires/resources'); return getOfType('script').map(et => ({ label: et.name, kind: monaco.languages.CompletionItemKind.Value, diff --git a/src/js/exitConfirmer.js b/src/js/exitConfirmer.js index 8296655ee..55868bb15 100644 --- a/src/js/exitConfirmer.js +++ b/src/js/exitConfirmer.js @@ -1,11 +1,11 @@ (function exitConfirmer() { const win = nw.Window.get(); - const glob = require('./data/node_requires/glob'); + const glob = require('src/node_requires/glob'); win.on('close', function exitConfirmListener() { if (!glob.modified) { win.close(true); } else { - const {getLanguageJSON} = require('./data/node_requires/i18n'); + const {getLanguageJSON} = require('src/node_requires/i18n'); window.alertify.confirm(getLanguageJSON().common.reallyExitConfirm) .then(e => { if (e.buttonClicked === 'ok') { diff --git a/src/js/exposeGlobalNodeModules.js b/src/js/exposeGlobalNodeModules.js new file mode 100644 index 000000000..2ea296650 --- /dev/null +++ b/src/js/exposeGlobalNodeModules.js @@ -0,0 +1,7 @@ +window.riot = require('riot'); +window.PIXI = require('pixi.js'); +window.PIXI.sound = require('@pixi/sound').sound; +window.PIXI.sound.filters = require('@pixi/sound').filters; +window.PIXI.particles = require('@pixi/particle-emitter'); +window.hotkeys = require('src/node_requires/hotkeys')(document); +window.themeManager = require('src/node_requires/themes'); diff --git a/src/js/gulpWatch.js b/src/js/gulpWatch.js index adf2902a1..69d868591 100644 --- a/src/js/gulpWatch.js +++ b/src/js/gulpWatch.js @@ -17,7 +17,7 @@ } } }; - gulp.watch(['./index.html', './data/bundle.js', './data/js/**.js', './data/node_requires/**/*.js'], reload); + gulp.watch(['./index.html', './data/bundle.js'], reload); const themeWatcher = gulp.watch(['./data/theme*.css']); themeWatcher.on('change', src => { diff --git a/src/js/projectMigrationScripts/0.3.0.js b/src/js/projectMigrationScripts/0.3.0.js index 066aeb992..772aba43f 100644 --- a/src/js/projectMigrationScripts/0.3.0.js +++ b/src/js/projectMigrationScripts/0.3.0.js @@ -6,7 +6,7 @@ window.migrationProcess = window.migrationProcess || []; window.migrationProcess.push({ version: '0.3.0', process: project => new Promise((resolve) => { - const generateGUID = require('./data/node_requires/generateGUID'); + const generateGUID = require('src/node_requires/generateGUID'); /* replace numerical IDs with RFC4122 version 4 UIDs */ let startingRoom; const graphmap = {}, diff --git a/src/js/projectMigrationScripts/4.0.0-next-3.js b/src/js/projectMigrationScripts/4.0.0-next-3.js index 0006a9319..0f995d150 100644 --- a/src/js/projectMigrationScripts/4.0.0-next-3.js +++ b/src/js/projectMigrationScripts/4.0.0-next-3.js @@ -36,12 +36,12 @@ window.migrationProcess.push({ if (toPatchSounds.length > 0) { const path = require('path'); const fs = require('fs-extra'); - const {createAsset, addSoundFile} = require('./data/node_requires/resources/sounds'); + const {createAsset, addSoundFile} = require('src/node_requires/resources/sounds'); for (const sound of toPatchSounds) { if (!sound.origname) { continue; } - const oldFile = global.projdir + '/snd/s' + sound.uid + path.extname(sound.origname); + const oldFile = window.projdir + '/snd/s' + sound.uid + path.extname(sound.origname); const preload = sound.isMusic; for (const oldKey of ['origname', 'ogg', 'mp3', 'wav', 'poolSize', 'isMusic']) { delete sound[oldKey]; diff --git a/src/js/projectMigrationScripts/4.1.0.js b/src/js/projectMigrationScripts/4.1.0.js new file mode 100644 index 000000000..8a694b296 --- /dev/null +++ b/src/js/projectMigrationScripts/4.1.0.js @@ -0,0 +1,20 @@ +window.migrationProcess = window.migrationProcess || []; + +window.migrationProcess.push({ + version: '4.1.0', + process: project => new Promise(resolve => { + const walker = collection => { + for (const item of collection) { + if (['template', 'behavior', 'room'].includes(item.type)) { + item.extendTypes = item.extendTypes ?? ''; + } else if (item.type === 'script') { + item.variables = item.variables ?? []; + } else if (item.type === 'folder') { + walker(item.entries); + } + } + }; + walker(project.assets); + resolve(); + }) +}); diff --git a/src/js/projectMigrationScripts/5.0.0.js b/src/js/projectMigrationScripts/5.0.0.js new file mode 100644 index 000000000..186b9f694 --- /dev/null +++ b/src/js/projectMigrationScripts/5.0.0.js @@ -0,0 +1,45 @@ +window.migrationProcess = window.migrationProcess || []; + +window.migrationProcess.push({ + version: '5.0.0', + process: project => new Promise(resolve => { + // Catnip received global variables + project.globalVars ??= []; + // New fields for error reporting in exported games + const exportSettings = project.settings.export; + exportSettings.showErrors ??= true; + exportSettings.errorsLink ??= ''; + const bundleSettings = exportSettings.bundleAssetTypes; + if (!('typefaces' in bundleSettings)) { + bundleSettings.typefaces = bundleSettings.fonts; + delete bundleSettings.fonts; + } + const walker = collection => { + for (const item of collection) { + // Fonts were reworked into typefaces + if (item.type === 'font') { + item.type = 'typeface'; + item.fonts = [{ + weight: item.weight, + italic: item.italic, + uid: item.uid, + origname: item.origname + }]; + item.name = item.typefaceName; + delete item.typefaceName; + delete item.weight; + delete item.italic; + } else if (item.type === 'style') { + // Styles can now directly link to typefaces. Fill with an empty ref. + if (!item.typeface) { + item.typeface = -1; + } + } else if (item.type === 'folder') { + walker(item.entries); + } + } + }; + walker(project.assets); + resolve(); + }) +}); diff --git a/src/js/riotHotReload.js b/src/js/riotHotReload.js deleted file mode 100644 index 9961ec8db..000000000 --- a/src/js/riotHotReload.js +++ /dev/null @@ -1,58 +0,0 @@ -/* eslint-disable no-loop-func */ -/* eslint-disable func-names */ -// A version of https://github.com/riot/hot-reload/tree/v3 -// adapted for browser-ish usage -// Copyright (c) 2016 Riot (Gianluca Guarini) MIT - -/* eslint-disable no-underscore-dangle */ -(function addRiotHotReload() { - const nonState = 'isMounted opts'.split(' '); - - const reload = function reload(name) { - riot.util.styleManager.inject(); - - var elems = document.querySelectorAll(`${name}, [data-is=${name}]`); - const tags = []; - - for (let i = 0; i < elems.length; i++) { - var el = elems[i], - oldTag = el._tag, - v; - reload.trigger('before-unmount', oldTag); - oldTag.unmount(true); // detach the old tag - - // reset the innerHTML and attributes to how they were before mount - el.innerHTML = oldTag.__.innerHTML; - (oldTag.__.instAttrs || []).forEach(function (attr) { - el.setAttribute(attr.name, attr.value); - }); - - // copy options for creating the new tag - var newOpts = {}; - for (const key in oldTag.opts) { - newOpts[key] = oldTag.opts[key]; - } - newOpts.parent = oldTag.parent; - - // create the new tag - reload.trigger('before-mount', newOpts, oldTag); - const [newTag] = riot.mount(el, newOpts); - - // copy state from the old to new tag - for (const key in oldTag) { - v = oldTag[key]; - if (nonState.indexOf(key) !== -1) { - continue; - } - newTag[key] = v; - } - newTag.update(); - tags.push(newTag); - reload.trigger('after-mount', newTag, oldTag); - } - return tags; - }; - - riot.observable(reload); - riot.reload = reload; -})(); diff --git a/src/js/utils/codeEditorHelpers.js b/src/js/utils/codeEditorHelpers.js index bbf744336..f5dea1b74 100644 --- a/src/js/utils/codeEditorHelpers.js +++ b/src/js/utils/codeEditorHelpers.js @@ -1,7 +1,8 @@ +/* eslint-disable id-blacklist */ /* eslint-disable no-bitwise */ /* eslint-disable no-underscore-dangle */ (function codeEditorHelpers() { - const {extend} = require('./data/node_requires/objectUtils'); + const {extend} = require('src/node_requires/objectUtils'); const fs = require('fs-extra'); const path = require('path'); @@ -11,14 +12,21 @@ monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true); monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ noLib: true, - allowNonTsExtensions: true + allowNonTsExtensions: true, + target: 'ES2020', + downlevelIteration: true, + alwaysStrict: true }); monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true); monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ noLib: true, - allowNonTsExtensions: true + allowNonTsExtensions: true, + target: 'ES2020', + downlevelIteration: true, + alwaysStrict: true }); + // Disable the built-in hover provider const ts = monaco.languages.typescript; const globalsPromise = fs.readFile(path.join(__dirname, './data/typedefs/global.d.ts'), { encoding: 'utf-8' @@ -35,7 +43,7 @@ globalsPromise ]); const exposer = ` - declare module 'node_modules/pixi.js' { + declare module 'pixi.js' { export * from 'bundles/pixi.js/src/index'; }`; const publiciser = ` @@ -98,7 +106,7 @@ * @returns {void} */ var extendHotkeys = (editor) => { - const zoomInCombo = monaco.KeyMod.CtrlCmd | monaco.KeyCode.US_EQUAL; + const zoomInCombo = monaco.KeyMod.CtrlCmd | monaco.KeyCode.Equal; editor.addCommand(zoomInCombo, function monacoZoomIn() { var num = Number(localStorage.fontSize); if (num < 48) { @@ -108,7 +116,7 @@ } return false; }); - const zoomOutCombo = monaco.KeyMod.CtrlCmd | monaco.KeyCode.US_MINUS; + const zoomOutCombo = monaco.KeyMod.CtrlCmd | monaco.KeyCode.Minus; editor.addCommand(zoomOutCombo, function monacoZoomOut() { var num = Number(localStorage.fontSize); if (num > 6) { @@ -118,6 +126,31 @@ } return false; }); + + // Make certain hotkeys bubble up to ct.IDE instead of being consumed by monaco-editor. + editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => { + const event = new KeyboardEvent('keydown', { + key: 'S', + code: 'KeyS', + ctrlKey: true + }); + document.body.dispatchEvent(event); + }); + editor.addCommand(monaco.KeyCode.F5, () => { + const event = new KeyboardEvent('keydown', { + key: 'F5', + code: 'F5' + }); + document.body.dispatchEvent(event); + }); + editor.addCommand(monaco.KeyCode.F5 | monaco.KeyMod.Alt, () => { + const event = new KeyboardEvent('keydown', { + key: 'F5', + code: 'F5', + altKey: true + }); + document.body.dispatchEvent(event); + }); }; const isRangeSelection = function (s) { @@ -269,6 +302,7 @@ const model = editor.getModel(); const lastLine = model.getLineCount(); + editor.setHiddenAreas([]); editor.setHiddenAreas([{ startLineNumber: 1, endLineNumber: 1 @@ -278,10 +312,12 @@ }]); }; + // When any of the code editor settings are changed, + // find all monaco instances and update their display settings window.signals.on('codeFontUpdated', () => { - const editorWrappers = document.querySelectorAll('.aCodeEditor'); - for (const editorWrap of editorWrappers) { - editorWrap.codeEditor.updateOptions({ + const editors = document.querySelectorAll('.monaco-editor'); + for (const editor of editors) { + editor.parentElement.codeEditor.updateOptions({ fontLigatures: localStorage.codeLigatures !== 'off', lineHeight: (localStorage.codeDense === 'off' ? 1.75 : 1.5) * Number(localStorage.fontSize), fontSize: Number(localStorage.fontSize) @@ -380,6 +416,7 @@ } const model = codeEditor.getModel(); const lastLine = model.getLineCount(); + codeEditor.setHiddenAreas([]); codeEditor.setHiddenAreas([{ startLineNumber: 1, endLineNumber: 1 @@ -402,4 +439,4 @@ return codeEditor; }; -})(this); +})(); diff --git a/src/node_requires/IExtensionField.d.ts b/src/node_requires/IExtensionField.d.ts index 7b53da3b2..97113d80c 100644 --- a/src/node_requires/IExtensionField.d.ts +++ b/src/node_requires/IExtensionField.d.ts @@ -60,7 +60,7 @@ declare interface IExtensionField { arrayLength?: number, /** For type === 'group', the grouped items. */ items?: IExtensionField[], - /** For type === 'table' */ + /** For type === 'table' */ fields?: IExtensionField[], /** * Whether to collect values and suggest them later diff --git a/src/node_requires/IRiotTag.d.ts b/src/node_requires/IRiotTag.d.ts index b10a8ba8a..9c6aac6cf 100644 --- a/src/node_requires/IRiotTag.d.ts +++ b/src/node_requires/IRiotTag.d.ts @@ -8,6 +8,7 @@ declare interface IRiotTag> { opts: OptsTypes; refs: Record; root: HTMLElement; + parent: IRiotTag; // Fields ct.js actively uses in its tags @@ -18,6 +19,8 @@ declare interface IRiotTag> { // eslint-disable-next-line @typescript-eslint/no-explicit-any vocMeta?: Record>; // eslint-disable-next-line @typescript-eslint/no-explicit-any + vocFull?: Record>; + // eslint-disable-next-line @typescript-eslint/no-explicit-any localizeField?: (obj: Record, field: string) => string; // `wire` mixin diff --git a/src/node_requires/catnip/blockUtils.ts b/src/node_requires/catnip/blockUtils.ts new file mode 100644 index 000000000..973a88a03 --- /dev/null +++ b/src/node_requires/catnip/blockUtils.ts @@ -0,0 +1,306 @@ +/* eslint-disable max-depth */ +/* eslint-disable complexity */ +/* eslint-disable max-lines-per-function */ +import {usableDeclaration} from './declarationExtractor'; + +const specials = /[_.]/g; +const camels = /(\w)([A-Z])/g; +export const niceBlockName = (name: string, lowercase?: boolean): string => { + name = name.replace(specials, ' ') + .replace(camels, val => `${val[0]} ${val[1].toLocaleLowerCase()}`); + if (!lowercase) { + return name.charAt(0).toLocaleUpperCase() + name.slice(1); + } + return name; +}; + +const sortHelper = { + command: -1, + computed: 1 +}; + +const supportedTypes = ['string', 'number', 'boolean', 'wildcard', 'function']; + +const getPieces = (piecesAssets: Record, useful: usableDeclaration): (IBlockPieceArgument | IBlockPieceBlocks)[] => + (useful.kind === 'function' ? useful.args : []).map(arg => { + if (arg.type === 'BLOCKS') { + return { + type: 'blocks', + key: arg.name + }; + } + return { + type: 'argument' as const, + key: arg.name, + typeHint: supportedTypes.includes(arg.type) ? arg.type : 'wildcard', + assets: piecesAssets[arg.name], + required: arg.required + }; + }); + +const stringifyArg = (values: Record) => (arg: { + type: blockArgumentType | 'BLOCKS'; + name: string; +}) => { + if (arg.type === 'BLOCKS') { + return `function () {\n ${values[arg.name]}\n}`; + } + return values[arg.name]; +}; + +export const convertFromDtsToBlocks = (usefuls: usableDeclaration[], lib: 'core' | string, icon?: string): +(IBlockCommandDeclaration | IBlockComputedDeclaration)[] => { + const knownCodes = new Set(); + const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = []; + // eslint-disable-next-line no-labels + onusefulLoop: for (const useful of usefuls) { + if (knownCodes.has(useful.name)) { + continue; // Skip duplicates (these usually happen due to several methods' overloads) + } else { + knownCodes.add(useful.name); + } + let documentation = useful.description, + name = niceBlockName(useful.name), + displayName: string | undefined; + const piecesAssets: Record = {}; + const piecesDefaults: Record = {}; + const extraNames: Record = {}; + let returnSave = false, + promise: false | 'both' | 'catch' | 'then' = false, + promiseSave: blockArgumentType | false = false, + listType: resourceType | false = false; + if (useful.jsDoc) { + for (const jsDoc of useful.jsDoc) { + if (!jsDoc.tags) { + continue; + } + documentation += '\n'; + // Parse supported tags in JSDoc + for (const node of jsDoc.tags) { + if (node.tagName.escapedText === 'param') { + documentation += `\n**${(node as any).name.escapedText}** ${node.comment}`; + } else if (node.tagName.escapedText === 'returns' || node.tagName.escapedText === 'return') { + documentation += `\n\n**Returns** ${node.comment}`; + } else if (node.tagName.escapedText === 'catnipIgnore') { + // Hides this block from Catnip + // eslint-disable-next-line no-labels + continue onusefulLoop; + } else if (node.tagName.escapedText === 'catnipLabel' && node.comment) { + // Defines a custom display name for this block + displayName = node.comment?.toString(); + } else if (node.tagName.escapedText === 'catnipName' && node.comment) { + // Defines a custom name for this block + name = node.comment.toString(); + } else if (String(node.tagName.escapedText).startsWith('catnipName_') && node.comment) { + // Localized names for this block + const key = String(node.tagName.escapedText).replace('catnipName_', 'name_'); + extraNames[key] = node.comment.toString().trim(); + } else if (String(node.tagName.escapedText).startsWith('catnipLabel_') && node.comment) { + // Localized display names for this block + const key = String(node.tagName.escapedText).replace('catnipLabel_', 'displayName_'); + extraNames[key] = node.comment.toString().trim(); + } else if (node.tagName.escapedText === 'catnipIcon' && node.comment) { + // Sets a different icon to this block + icon = node.comment.toString(); + } else if (node.tagName.escapedText === 'catnipAsset' && node.comment) { + // Replaces this param with an asset picker of the specified type. + // The format is `@catnipAsset :` + // Can only specify one key-format pair, but the tag itself can be repeated. + let [key, assetType] = node.comment.toString().split(':'); + key = key.trim(); + assetType = assetType.trim(); + piecesAssets[key] = assetType as resourceType | 'action'; + } else if (node.tagName.escapedText === 'catnipDefault' && node.comment) { + // Defines a default value for the specified param. + let [key, value] = node.comment.toString().split(':'); + key = key.trim(); + value = value.trim(); + if (isFinite(Number(value))) { + piecesDefaults[key] = Number(value); + } else if (value === 'true') { + piecesDefaults[key] = true; + } else if (value === 'false') { + piecesDefaults[key] = false; + } else { + piecesDefaults[key] = value; + } + } else if (node.tagName.escapedText === 'catnipList' && node.comment) { + // Replaces this param with an asset picker. + // Used for dictionaries of arrays like `templates.list`. + listType = node.comment.toString().trim() as resourceType; + icon = 'grid'; + } else if (node.tagName.escapedText === 'catnipSaveReturn') { + // Adds a slot to the right side of the block so the user can save + // the return value of the block. + returnSave = true; + } else if (node.tagName.escapedText === 'catnipPromise') { + // Adds slots for blocks to add promise handlers + // to the block's return value. + // The keyword after `@catnipPromise` can be `then`, `catch`, or `both`. + // It defines which handlers will appear, and it defaults to `both`. + const raw = node.comment?.toString().trim(); + if (raw === 'catch') { + promise = 'catch'; + } else if (raw === 'then') { + promise = 'then'; + } else { + promise = 'both'; + } + } else if (node.tagName.escapedText === 'catnipPromiseSave' && node.comment) { + // Adds a slot to the right side of the block so the user can use + // the resolved value of a promise. + promiseSave = node.comment.toString().trim() as blockArgumentType || 'wildcard'; + } + } + } + } + let isCommand = useful.kind === 'function' && (!useful.returnType || useful.returnType === 'void'); + if (returnSave || promise) { + isCommand = true; + } + if (!displayName) { + displayName = name; + } + const draft = { + code: useful.name, + lib, + type: isCommand ? 'command' : 'computed', + typeHint: useful.returnType, + name: isCommand ? name.slice(0, 1).toUpperCase() + name.slice(1) : name.toLowerCase(), + displayName: displayName && (isCommand ? + displayName.slice(0, 1).toUpperCase() + displayName.slice(1) : + displayName.toLowerCase()), + ...extraNames, + documentation, + pieces: getPieces(piecesAssets, useful) + } as Omit & Partial>; + if (icon) { + draft.icon = icon; + } + if (listType) { + draft.pieces.push({ + type: 'argument', + key: 'list', + typeHint: 'wildcard', + assets: listType + }); + } + if (returnSave || promiseSave) { + draft.pieces.push({ + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: promiseSave || 'wildcard' + }); + if (promiseSave) { + draft.pieces.push({ + type: 'asyncMarker' + }); + } + } else if (promise) { + draft.pieces.push({ + type: 'filler' + }, { + type: 'asyncMarker' + }); + } + if (promise) { + if (promise === 'then' || promise === 'both') { + draft.pieces.push({ + type: 'break' + }, { + type: 'icon', + icon: 'redo' + }, { + type: 'label', + name: 'then', + i18nKey: 'then' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'then' + }); + } + if (promise === 'catch' || promise === 'both') { + draft.pieces.push({ + type: 'break' + }, { + type: 'icon', + icon: 'alert-octagon' + }, { + type: 'label', + name: 'catch', + i18nKey: 'catch' + }, { + type: 'blocks', + placeholder: 'doNothing', + key: 'catch' + }); + } + } + if (useful.kind === 'prop') { + if (listType) { + draft.jsTemplate = vals => `${useful.name}[${vals.list}]`; + } else { + draft.jsTemplate = () => useful.name; + } + } else { + const {name, args} = useful; + if (returnSave) { + draft.jsTemplate = values => { + if (values.return && values.return !== 'undefined') { + return `${values.return} = ${name}(${args.map(stringifyArg(values)).join(', ')});`; + } + return `${name}(${args.map(stringifyArg(values)).join(', ')});`; + }; + } else if (promise) { + if (promise === 'catch') { + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')}) + .catch(() => { + ${values.catch} + });`; + } else if (promise === 'then') { + if (promiseSave) { + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')}) + .then(val => { + ${values.return} = val; + ${values.then} + });`; + } else { + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')}) + .then(() => { + ${values.then} + });`; + } + } else if (promiseSave) { // promise === 'both' + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')}) + .then(val => { + ${values.return} = val; + ${values.then} + }).catch(() => { + ${values.catch} + });`; + } else { + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')}) + .then(() => { + ${values.then} + }).catch(() => { + ${values.catch} + });`; + } + } else if (isCommand) { + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')});`; + } else { + draft.jsTemplate = values => `${name}(${args.map(stringifyArg(values)).join(', ')})`; + } + } + blocks.push(draft as IBlockComputedDeclaration | IBlockCommandDeclaration); + } + blocks.sort((a, b) => sortHelper[a.type] - sortHelper[b.type]); + return blocks; +}; diff --git a/src/node_requires/catnip/blocks.d.ts b/src/node_requires/catnip/blocks.d.ts new file mode 100644 index 000000000..fcde2f13d --- /dev/null +++ b/src/node_requires/catnip/blocks.d.ts @@ -0,0 +1,180 @@ +declare type blockArgumentType = 'boolean' | 'number' | 'string' | 'color' | 'wildcard' | 'void'; + +declare interface IBlockPieceLabel { + type: 'label'; + name: string; + i18nKey?: string; +} +declare interface IBlockPieceIcon { + type: 'icon'; + icon: string; +} +declare interface IBlockPieceCode { + type: 'code'; + key: string; +} +declare interface IBlockPieceArgument { + type: 'argument'; + key: string; + typeHint: blockArgumentType; + defaultConstant?: string; + required?: boolean; + assets?: resourceType | 'action'; +} +declare interface IBlockPieceTextbox { + type: 'textbox'; + key: string; + default?: string; +} +declare interface IBlockPieceBlocks { + type: 'blocks'; + placeholder?: 'doNothing' | 'putBlocksHere'; + key: string; +} +declare interface IBlockPieceBreak { + type: 'break' +} + +declare interface IBlockPropOrVariable { + type: 'propVar'; +} +declare interface IBlockFiller { + type: 'filler' +} +declare interface IBlockAsyncMarker { + type: 'asyncMarker' +} +declare interface IBlockOptions { + type: 'options'; + allowCustom?: boolean; + options: { + key: string, + name: string, + i18nKey: string, + typeHint: blockArgumentType, + assets?: resourceType | 'action', + defaultConstant?: string, + required?: boolean + }[]; +} + +declare type blockPiece = IBlockPieceLabel | IBlockPieceIcon | IBlockPieceCode | + IBlockPieceArgument | IBlockPieceTextbox | IBlockPieceBlocks | + IBlockPropOrVariable | IBlockFiller | IBlockAsyncMarker | + IBlockPieceBreak | IBlockOptions; + +// eslint-disable-next-line no-use-before-define +type argumentValues = Record; + +declare interface IBlockDeclaration { + /** The name of the parent library. Used for serialization. */ + lib: string; + /** If set, the block will additionally appear in a category with this name */ + category?: string; + /** A unique string corresponding to this block so it can be serialized and deserialized */ + code: string; + /** Elements of the block, including input fields and decorations */ + pieces: blockPiece[]; + /** Icon shown at the beginning of the block */ + icon: string; + /** Searchable command name. Also used as a label if i18nKey is not used or invalid. */ + name: string; + /** Cached block name used for fuzzy search */ + bakedName?: string; + /** + * A string that is shown instead of the searchable name in a block. + * This name is not used for fuzzy search. + */ + displayName?: string; + /** + * A key in the translation file inside the catnip namespace to use + * for the main label and search. Supports dot notation. + */ + i18nKey?: string; + /** + * A key in the translation file inside the catnip namespace to use for the main label. + * Supports dot notation. + */ + displayI18nKey?: string; + + /** A markdown-formatted documentation shown in a tooltip when hovering over the block. */ + documentation?: string; + /** + * A key in the translation file inside the catnip namespace to use for the tooltip. + * Supports dot notation. + */ + documentationI18nKey?: string; + + hideLabel?: boolean; + hideIcon?: boolean; + /** + * The function that is used by blocks compiler to render the JS code of this block. + * `args` are the values of this block's input fields. + * `safeId` can be used as a unique for this block instance integer + * and create unique variable names. + */ + jsTemplate: ( + args: Record, + safeId: number, + customOptions: Record + ) => string; + /** A CSS class to assign to this block in HTML */ + customClass?: string; + /** + * Mutators appear in context menus and replace the target block when selected, + * preserving values. + */ + mutators?: { + lib: string, + code: string + }[]; +} +/** + * A block for an executable method that may have additional arguments + * and cannot be nested inside other simiar commands. + */ +declare interface IBlockCommandDeclaration extends IBlockDeclaration { + type: 'command'; + isGroup?: boolean; +} +/** A block for a variable, property, or an inline command that returns a value. */ +declare interface IBlockComputedDeclaration extends IBlockDeclaration { + type: 'computed'; + /** + * The return type of the computed blocks. A block can be put + * only in the slot of the same type unless the block or the target slot are wildcards. + */ + typeHint: blockArgumentType; + /** + * This mutator gets applied when a user clicks on the block. + * It is important for such blocks to switch to each other and be present in the context menu, + * in `mutators` array. + */ + onClickMutator?: { + lib: string; + code: string; + } +} + +declare type blockDeclaration = IBlockCommandDeclaration | IBlockComputedDeclaration; + +declare interface IBlock { + values: argumentValues; + customOptions?: Record; + groupClosed?: boolean; + groupName?: string; + lib: string; + code: string; +} + +type BlockScript = IBlock[]; + +declare type blockRegistry = Record; +declare type blockMenu = { + name: string; + i18nKey?: string; + items: blockDeclaration[]; + opened: boolean; + icon?: string; + hidden?: boolean; +} diff --git a/src/node_requires/catnip/compiler.ts b/src/node_requires/catnip/compiler.ts new file mode 100644 index 000000000..c78d0f4e2 --- /dev/null +++ b/src/node_requires/catnip/compiler.ts @@ -0,0 +1,146 @@ +/* eslint-disable complexity */ +/* eslint-disable max-depth */ +import {getDeclaration} from '.'; +import {ExporterError} from '../exporter/ExporterError'; +import {getById} from '../resources'; + +// Unwraps manually input \n, \t, \r values into whitespace. +const unescapeRegex = /\\\\([ntr])/g; +const unescapeWhitespace = (input: string) => input.replace(unescapeRegex, '\\$1'); + +const jsConstants = ['true', 'false', 'null', 'undefined', 'Infinity', '-Infinity', 'NaN']; +const stringifyConstWildcard = (value: string): string => { + if (isFinite(Number(value))) { + return String(Number(value)); + } else if (jsConstants.includes(value)) { + return value; + } + return JSON.stringify(value); +}; + +/** + * Gets the value of the given piece (an option or an attribute piece) + * and writes its value into valuesOut. + * + * failureMeta must be prefilled so the compiler can show the event + * in which a compilation error occurred. + */ +const writeArgumentlike = ( + piece: IBlockPieceArgument | IBlockOptions['options'][0], + valuesIn: argumentValues, + valuesOut: Record, + declaration: blockDeclaration, + failureMeta: { + eventKey: string, + resourceId: assetRef, + resourceName: string, + resourceType: resourceType + } +) => { + const valueIn = valuesIn[piece.key]; + if (typeof valueIn === 'object') { + // eslint-disable-next-line no-use-before-define + valuesOut[piece.key] = compile([valueIn as IBlock], failureMeta); + } else if (piece.assets && piece.assets !== 'action') { + try { + valuesOut[piece.key] = `'${getById(piece.assets, valueIn as string).name}'`; + } catch (oO) { + if (piece.required) { + throw new ExporterError(`Required asset in field ${piece.key} of block "${declaration.name}" not found: ${valueIn}`, { + clue: 'blockArgumentMissing', + eventKey: failureMeta.eventKey, + resourceId: failureMeta.resourceId, + resourceName: failureMeta.resourceName, + resourceType: failureMeta.resourceType + }); + } else { + valuesOut[piece.key] = piece.defaultConstant ?? '-1'; + } + } + } else if (typeof valueIn === 'string') { + if (piece.typeHint === 'wildcard') { + valuesOut[piece.key] = stringifyConstWildcard(valueIn); + } else if (piece.typeHint === 'color') { + valuesOut[piece.key] = `0x${valueIn.slice(1)}`; + } else { + valuesOut[piece.key] = unescapeWhitespace(JSON.stringify(valueIn)); + } + } else if (valueIn === void 0 && piece.defaultConstant) { + if (typeof piece.defaultConstant === 'number' || + typeof piece.defaultConstant !== 'string' || + piece.defaultConstant === 'this') { + valuesOut[piece.key] = String(piece.defaultConstant); + } else { + valuesOut[piece.key] = `'${piece.defaultConstant}'`; + } + } else { + // null, undefined and boolean values + valuesOut[piece.key] = String(valueIn); + } +}; + +let safeId = -1; +export const resetSafeId = () => { + safeId = -1; +}; +export const compile = (blocks: BlockScript, failureMeta: { + eventKey: string, + resourceId: assetRef, + resourceName: string, + resourceType: resourceType +}): string => { + let result = ''; + for (const block of blocks) { + let declaration; + try { + declaration = getDeclaration(block.lib, block.code); + } catch (err) { + throw new ExporterError(`Missing declaration for block "${block.code}" from library "${block.lib}"`, { + clue: 'blockDeclarationMissing', + eventKey: failureMeta.eventKey, + resourceId: failureMeta.resourceId, + resourceName: failureMeta.resourceName, + resourceType: failureMeta.resourceType + }); + } + if (!declaration) { + continue; + } + const values: Record = {}; + for (const piece of declaration.pieces) { + if (piece.type === 'argument') { + writeArgumentlike(piece, block.values, values, declaration, failureMeta); + } else if (piece.type === 'code' || piece.type === 'textbox') { + values[piece.key] = String(block.values[piece.key] ?? ''); + } else if (piece.type === 'options') { + for (const option of piece.options) { + writeArgumentlike(option, block.values, values, declaration, failureMeta); + } + } else if (piece.type === 'blocks') { + const associatedVal = block.values[piece.key]; + values[piece.key] = compile(associatedVal as IBlock[] ?? [], failureMeta); + if (values[piece.key] === 'undefined') { + values[piece.key] = ''; + } + } else if (piece.type === 'propVar') { + values.variableName = block.values.variableName as string; + } + } + safeId++; + const customOptions: Record = {}; + if (block.customOptions) { + for (const [key, value] of Object.entries(block.customOptions)) { + if (typeof value === 'string') { + customOptions[key] = stringifyConstWildcard(value); + } else { + customOptions[key] = compile([value], failureMeta); + } + } + } + result += declaration.jsTemplate(values, safeId, customOptions); + if (blocks.length > 1) { + result += '\n'; + } + } + return result; +}; diff --git a/src/node_requires/catnip/declarationExtractor.ts b/src/node_requires/catnip/declarationExtractor.ts new file mode 100644 index 000000000..72c91eca9 --- /dev/null +++ b/src/node_requires/catnip/declarationExtractor.ts @@ -0,0 +1,217 @@ +// This file exports a parseFile method that takes a .d.ts file and returns +// an array of usable methods and properties Catnip can use. + +/* eslint-disable no-use-before-define */ +import ts from 'typescript'; +import fs from 'fs-extra'; +import path from 'path'; + +const paramConstTypeMap: Partial> = { + [ts.SyntaxKind.AnyKeyword]: 'wildcard', + [ts.SyntaxKind.Unknown]: 'wildcard', + [ts.SyntaxKind.ObjectKeyword]: 'wildcard', + [ts.SyntaxKind.ThisType]: 'wildcard', + [ts.SyntaxKind.UnionType]: 'wildcard', + [ts.SyntaxKind.IntersectionType]: 'wildcard', + [ts.SyntaxKind.ParenthesizedType]: 'wildcard', + [ts.SyntaxKind.TypeLiteral]: 'wildcard', + [ts.SyntaxKind.TypeReference]: 'wildcard', + [ts.SyntaxKind.BooleanKeyword]: 'boolean', + [ts.SyntaxKind.FalseKeyword]: 'boolean', + [ts.SyntaxKind.TrueKeyword]: 'boolean', + [ts.SyntaxKind.NumberKeyword]: 'number', + [ts.SyntaxKind.StringKeyword]: 'string', + [ts.SyntaxKind.VoidKeyword]: 'void', + [ts.SyntaxKind.FunctionType]: 'BLOCKS' +}; + +const usefulMap = { + [ts.SyntaxKind.FunctionDeclaration]: 'function' as const, + [ts.SyntaxKind.MethodSignature]: 'function' as const, + [ts.SyntaxKind.PropertySignature]: 'prop' as const +}; + +type usableArgument = { + type: blockArgumentType | 'BLOCKS', + name: string, + required: boolean +}; +export type usableDeclaration = { + name: string; + returnType?: blockArgumentType; + description?: string; + jsDoc?: ts.JSDoc[]; + node: ts.Node; +} & ({ + kind: 'function'; + args: usableArgument[]; +} | { + kind: 'prop' +}); + +const simplifyJsDoc = (jsDoc: ts.JSDoc[] | void): string | void => { + if (!jsDoc) { + return void 0; + } + return jsDoc.map(doc => (Array.isArray(doc.comment) ? + (doc.comment as ts.NodeArray) + .map(comment => comment) + .join('\n') : + doc.comment as string)) + .join('\n\n'); +}; + +/** + * Returns an object for further use by Catnip that describes the given + * argument of a method. + */ +const paramToUsefulArg = (param: ts.ParameterDeclaration): usableArgument => { + let tsType = (param.type as any)?.typeName?.escapedText ?? 'any'; + if (param.type && + (ts.isToken(param.type) || + param?.type?.kind === ts.SyntaxKind.FunctionType)) { + tsType = paramConstTypeMap[param.type.kind as keyof typeof paramConstTypeMap] ?? 'any'; + } + if (tsType === 'any') { + // eslint-disable-next-line max-len + // console.warn('[catnip\'s declaration extractor] Unknown type', param.type?.kind, param.type, 'in', name); + tsType = 'wildcard'; + } + return { + name: (param.name as any).escapedText, + type: tsType, + required: !param.questionToken && !param.initializer + }; +}; + +/** + * Traverses the AST of a TypeScript file and extracts useful declarations + * of methods and properties. + */ +// eslint-disable-next-line max-lines-per-function, complexity +const visit = ( + node: ts.Node, + topLevelPath: string, + onUseful: ((useful: usableDeclaration) => void) +) => { + switch (node.kind) { + // Traverse nodes inside modules and namespaces + case ts.SyntaxKind.ModuleDeclaration: { + const moduleName = (node as ts.ModuleDeclaration).name.text; + ts.forEachChild(node, child => visit(child, `${topLevelPath}.${moduleName}`, onUseful)); + } break; + case ts.SyntaxKind.ModuleBlock: + ts.forEachChild(node, child => visit(child, `${topLevelPath}`, onUseful)); + break; + // `var` statements + case ts.SyntaxKind.FirstStatement: { + const first = node as ts.VariableStatement; + if (first.declarationList && first.declarationList.declarations.length) { + for (const declaration of first.declarationList.declarations) { + const {name} = declaration; + let usefulName: string; + // Some variables can be top-level constants, use their name as is + if (topLevelPath === 'root') { + usefulName = (name as any).escapedText; + } else { + // Remove the `root.` ⤵️ + usefulName = `${topLevelPath.slice(5)}.${(name as any).escapedText}`; + } + onUseful({ + name: usefulName, + kind: 'prop', + returnType: declaration?.type?.kind ? + ((paramConstTypeMap[declaration?.type?.kind] as blockArgumentType) ?? 'wildcard') : + 'wildcard', + description: (first as any).jsDoc?.[0].comment, + jsDoc: (first as any).jsDoc, + node + }); + if ((declaration?.type as any)?.members) { + // eslint-disable-next-line max-depth + for (const member of (declaration.type as any).members) { + visit(member, `${topLevelPath}.${(name as any).escapedText}`, onUseful); + } + } + } + } + } break; + // Any method + // ⚠️ Triple case here + case ts.SyntaxKind.PropertySignature: + case ts.SyntaxKind.MethodSignature: + case ts.SyntaxKind.FunctionDeclaration: { + const {name, type, jsDoc} = (node as ( + ts.PropertySignature | + ts.FunctionDeclaration + ) & {jsDoc: ts.JSDoc[]}); + let args: { + type: blockArgumentType | 'BLOCKS'; + name: string; + required: boolean; + }[] = []; + if (node.kind === ts.SyntaxKind.FunctionDeclaration || + node.kind === ts.SyntaxKind.MethodSignature + ) { + args = (node as ts.FunctionDeclaration | ts.MethodSignature) + .parameters.map(paramToUsefulArg); + } + // Some methods can be top-level functions, use their name as is + let usefulName: string; + if (topLevelPath === 'root') { + usefulName = (name as any).escapedText; + } else { + // Remove the `root.` ⤵️ + usefulName = `${topLevelPath.slice(5)}.${(name as any).escapedText}`; + } + const useful: Partial = { + name: usefulName, + kind: usefulMap[node.kind], + jsDoc, + node + }; + useful.returnType = type ? + ((paramConstTypeMap[type.kind] as blockArgumentType) ?? 'wildcard') : + 'wildcard'; + if (useful.kind === 'function') { + useful.args = args; + } + const description = simplifyJsDoc(jsDoc); + if (description) { + useful.description = description; + } + onUseful(useful as usableDeclaration); + } break; + default: + // console.debug('skipping', node.kind, ts.SyntaxKind[node.kind], node); + void 0; + } +}; + +export const parseFile = async (filename: string): Promise => { + const txt = await fs.readFile(filename, 'utf-8'); + const program = ts.createProgram([filename], {}, { + readFile: () => txt, + // eslint-disable-next-line id-length + useCaseSensitiveFileNames: () => true, + fileExists: () => true, + getDefaultLibFileName: () => 'browser', + getCurrentDirectory: () => path.dirname(filename), + getCanonicalFileName: () => path.basename(filename), + getSourceFile: (src: string) => ts.createSourceFile( + path.basename(src), + txt, + ts.ScriptTarget.ES2020 + ), + writeFile: () => { + void 'noop'; + }, + getNewLine: () => 'LF' + }); + // const checker = program.getTypeChecker(); + const [sourceFile] = program.getSourceFiles(); + const results: usableDeclaration[] = []; + ts.forEachChild(sourceFile, node => visit(node, 'root', useful => results.push(useful))); + return results; +}; + diff --git a/src/node_requires/catnip/index.ts b/src/node_requires/catnip/index.ts new file mode 100644 index 000000000..bb5607368 --- /dev/null +++ b/src/node_requires/catnip/index.ts @@ -0,0 +1,706 @@ +import fs from 'fs-extra'; +import {join} from 'path'; + +import {getModulePathByName, loadModuleByName} from '../resources/modules'; +import {convertFromDtsToBlocks} from './blockUtils'; +import {parseFile} from './declarationExtractor'; +import {getByPath} from '../i18n'; + +import propsVarsBlocks from './stdLib/propsVars'; +import logicBlocks from './stdLib/logic'; +import movementBlocks from './stdLib/movement'; +import appearanceBlocks from './stdLib/appearance'; +import actionsBlocks from './stdLib/actions'; +import cameraBlocks from './stdLib/camera'; +import mathBlocks from './stdLib/math'; +import timerBlocks from './stdLib/timers'; +import objectsBlocks from './stdLib/objects'; +import miscBlocks from './stdLib/misc'; +import consoleBlocks from './stdLib/console'; +import stringsBlocks from './stdLib/strings'; +import arraysBlocks from './stdLib/arrays'; +import hiddenBlocks from './stdLib/hiddenBlocks'; +import {loadBlocks} from './stdLib/ctjsApi'; + +const builtinBlockLibrary: blockMenu[] = [{ + name: 'Properties and variables', + items: propsVarsBlocks, + i18nKey: 'propsVars', + opened: true, + icon: 'archive', + hidden: true +}, { + name: 'Movement', + items: movementBlocks, + i18nKey: 'movement', + opened: true, + icon: 'move' +}, { + name: 'Appearance', + items: appearanceBlocks, + i18nKey: 'appearance', + opened: true, + icon: 'droplet' +}, { + name: 'Actions', + items: actionsBlocks, + i18nKey: 'actions', + opened: true, + icon: 'airplay' +}, { + name: 'Camera', + items: cameraBlocks, + i18nKey: 'camera', + opened: true, + icon: 'camera' +}, { + name: 'Logic', + items: logicBlocks, + i18nKey: 'logic', + opened: true, + icon: 'help-circle' +}, { + name: 'Math', + items: mathBlocks, + i18nKey: 'math', + opened: true, + icon: 'sort-numerically' +}, { + name: 'Timers', + items: timerBlocks, + i18nKey: 'timers', + opened: true, + icon: 'clock' +}, { + name: 'Strings', + items: stringsBlocks, + i18nKey: 'strings', + opened: true, + icon: 'string' +}, { + name: 'Objects', + items: objectsBlocks, + i18nKey: 'objects', + opened: true, + icon: 'code-alt' +}, { + name: 'Arrays', + items: arraysBlocks, + i18nKey: 'arrays', + opened: true, + icon: 'grid' +}, { + name: 'Miscellaneous', + items: miscBlocks, + i18nKey: 'misc', + opened: true +}, { + name: 'Console', + icon: 'terminal', + items: consoleBlocks, + i18nKey: 'console', + opened: true +}]; +let ctjsApiMenus: blockMenu[]; +loadBlocks().then(menus => { + ctjsApiMenus = menus; + builtinBlockLibrary.splice(4, 0, ...menus); +}); + +/** A utility function for dumping all the i18n keys of built-in blocks */ +export const getCtjsI18nKeys = (): void => { + const nameKeys: string[] = [], + displayNameKeys: string[] = []; + for (const menu of ctjsApiMenus) { + for (const item of menu.items) { + if (item.i18nKey) { + nameKeys.push(item.i18nKey); + } + if (item.displayI18nKey) { + displayNameKeys.push(item.displayI18nKey); + } + } + } + // eslint-disable-next-line no-console + console.log(nameKeys.join('\n')); + // eslint-disable-next-line no-console + console.log(displayNameKeys.join('\n')); +}; + +/** An array of categories of blocks to be used in UI */ +export const blocksLibrary: blockMenu[] = []; +/** A flat map of all the currently known blocks' declarations */ +export const blocksRegistry: Map = new Map(); + +// Fuzzy search +import {default as Fuse, IFuseOptions, FuseIndex} from 'fuse.js'; +import {getByTypes} from '../resources'; +const fuseOptions: IFuseOptions = { + keys: [{ + name: 'bakedName', + weight: 1 + }, { + name: 'name', + weight: 0.7 + }, { + name: 'lib', + weight: 0.3 + }], + findAllMatches: true, + threshold: 0.3 +}; +let fuseIndex: FuseIndex, + fuseCollection: blockDeclaration[]; +const recreateFuseIndex = () => { + fuseCollection = [...blocksRegistry.values()]; + fuseCollection.forEach(block => { + block.bakedName = block.i18nKey ? + (getByPath('catnip.blockNames.' + block.i18nKey) as string ?? block.name) : + block.name; + }); + fuseIndex = Fuse.createIndex(fuseOptions.keys!, fuseCollection); +}; +export const searchBlocks = (query: string): blockDeclaration[] => { + const fuse = new Fuse(fuseCollection, fuseOptions, fuseIndex); + return fuse + .search(query) + .map(result => result.item) + .filter(block => block.lib !== 'core.hidden'); +}; + +const addBlockToRegistry = (block: blockDeclaration): void => { + blocksRegistry.set(`${block.lib}@@${block.code}`, block); +}; +const removeBlockFromRegistry = (block: blockDeclaration): void => { + blocksRegistry.delete(`${block.lib}@@${block.code}`); +}; +export const getDeclaration = (lib: string, code: string): blockDeclaration => { + if (!blocksRegistry.has(`${lib}@@${code}`)) { + throw new Error(`[catnip] Could not find block declaration for ${lib}@@${code}. Do you have ${lib} catmod enabled?`); + } + return blocksRegistry.get(`${lib}@@${code}`)!; +}; + +const loadBuiltinBlocks = (): void => { + blocksLibrary.push(...builtinBlockLibrary); + for (const category of builtinBlockLibrary) { + category.items.forEach(addBlockToRegistry); + } + hiddenBlocks.forEach(addBlockToRegistry); +}; + + +const isFunction = (value: unknown) => (value ? + (Object.prototype.toString.call(value) === '[object Function]' || + typeof value === 'function' || + value instanceof Function + ) : + false); + +const validateBlocks = ( + blocks: (blockDeclaration | Record)[], + blocksPath: string +) => { + for (const block of blocks) { + if (typeof block !== 'object') { + throw new Error(`[catnip] ${blocksPath} has a value ${block} that is not an object.`); + } + const keys = Object.keys(block) as (keyof blockDeclaration)[]; + for (const required of (['name', 'type', 'code'] as (keyof blockDeclaration)[])) { + if (!keys.includes(required as keyof blockDeclaration)) { + throw new Error(`[catnip] ${blocksPath} has a block ${block.name} that does not have a required parameter ${required}.`); + } + if (typeof block[required] !== 'string') { + throw new Error(`[catnip] ${blocksPath} in block ${block.name} the parameter ${required} is not a string.`); + } + } + if (!('jsTemplate' in block)) { + throw new Error(`[catnip] ${blocksPath} has a block ${block.name} that does not have a required parameter jsTemplate.`); + } + if (!isFunction(block.jsTemplate)) { + throw new Error(`[catnip] ${blocksPath} in block ${block.name} the parameter jsTemplate is not a function.`); + } + if (!('pieces' in block)) { + throw new Error(`[catnip] ${blocksPath} has a block ${block.name} that does not have a required parameter pieces.`); + } + if (!Array.isArray(block.pieces)) { + throw new Error(`[catnip] ${blocksPath} in block ${block.name} the parameter pieces that is not an array.`); + } + } +}; + + +/** + * Used for cleanup during disabling catmods; maps module names to their category of blocks. + */ +const loadedCategories: Map = new Map(); +export const loadModdedBlocks = async (modName: string, noIndex?: boolean) => { + const meta = await loadModuleByName(modName); + const dtsPath = join(getModulePathByName(modName), 'types.d.ts'); + const blocksPath = join(getModulePathByName(modName), 'blocks.js'); + const category: blockMenu = { + name: modName, + items: [], + opened: false, + i18nKey: modName, + icon: meta.main.icon || 'grid-random' + }; + try { + await fs.access(blocksPath, fs.constants.R_OK); + const blocks = require(blocksPath); + if (!Array.isArray(blocks)) { + throw new Error(`[catnip] ${blocksPath} is not a module that returns an array.`); + } + category.items.push(...blocks); + validateBlocks(blocks, blocksPath); + for (const block of blocks) { + if (!('lib' in block)) { + block.lib = modName; + } + } + } catch (err) { + if (err.code !== 'ENOENT') { + console.error(err); + } + } + try { + await fs.access(dtsPath, fs.constants.R_OK); + const usefuls = await parseFile(dtsPath); + const blocks = convertFromDtsToBlocks(usefuls, modName); + category.items.push(...blocks); + } catch (oO) { + void oO; + } + if (category.items.length) { + category.items.forEach(block => { + if (block.category) { + const host = blocksLibrary.find(cat => cat.name === block.category); + if (host) { + host.items.push(block); + } + } + if (!block.icon) { + block.icon = meta.main.icon || 'grid-random'; + } + }); + category.items.forEach(addBlockToRegistry); + loadedCategories.set(modName, category); + blocksLibrary.push(category); + } else { + // eslint-disable-next-line no-console + console.debug(`[catnip] Skipping the catmod ${modName} as it doesn't have valid blocks to add.`); + } + if (!noIndex) { + recreateFuseIndex(); + } +}; + +export const unloadModdedBlocks = (modName: string) => { + if (!loadedCategories.has(modName)) { + return; + } + const cat = loadedCategories.get(modName)!; + blocksLibrary.splice(blocksLibrary.indexOf(cat), 1); + cat.items.forEach(removeBlockFromRegistry); + cat.items.forEach(block => { + if (block.category) { + const host = blocksLibrary.find(cat => cat.name === block.category); + if (host && host.items.includes(block)) { + host.items.splice(host.items.indexOf(block), 1); + } + } + }); + loadedCategories.delete(modName); + recreateFuseIndex(); +}; +/** + * Resets the list of modded blocks and loads all the blocks from the enabled modules. + */ +export const loadAllBlocks = async (project: IProject) => { + blocksLibrary.length = 0; + for (const [name] of loadedCategories) { + unloadModdedBlocks(name); + } + loadedCategories.clear(); + blocksRegistry.clear(); + loadBuiltinBlocks(); + await Promise.all(Object.keys(project.libs).map(lib => loadModdedBlocks(lib, true))); + recreateFuseIndex(); +}; + +/** A helper function that calls onblock on every block in the given script. */ +export const walkOverScript = (script: IBlock[], onblock: (block: IBlock) => void) => { + for (const block of script) { + onblock(block); + if (block.customOptions?.length) { + for (const option of Object.values(block.customOptions)) { + if (typeof option === 'object') { + onblock(option); + } + } + } + for (const value of Object.values(block.values)) { + if (typeof value === 'object') { + if (Array.isArray(value)) { + walkOverScript(value, onblock); + } else { + onblock(value); + } + } + } + } +}; + +/** Renames a given property or a variable in a script. */ +export const renamePropVar = (script: IBlock[], eventData: { + type: 'property' | 'variable' | 'global variable', + from: string, // old name of the property/variable + to: string // new name of the prop/var +}) => { + walkOverScript(script, block => { + if (block.lib === 'core.hidden' && block.code === eventData.type) { + if (block.values.variableName === eventData.from) { + block.values.variableName = eventData.to; + } + } + }); +}; + +// Listen to global variable renames and patch all relevant assets. +window.orders.on('catnipGlobalVarRename', (eventData: { + type: 'global variable', + from: string, // old name of the property/variable + to: string // new name of the prop/var +}) => { + const assets = getByTypes(); + for (const group of [assets.room, assets.template, assets.behavior]) { + for (const asset of group) { + for (const event of asset.events) { + renamePropVar(event.code as BlockScript, { + type: 'global variable', + from: eventData.from, + to: eventData.to + }); + } + } + } + for (const script of assets.script) { + if (script.language !== 'catnip') { + continue; + } + renamePropVar(script.code as BlockScript, { + type: 'global variable', + from: eventData.from, + to: eventData.to + }); + } +}); + +// Shared variables for blocks' drag and drop operations. +let transmittedBlocks: IBlock[] = []; +let transmissionSource: (IBlock | 'MARKER')[] | Record = []; +let transmissionSourceKey: string | undefined; +let cloningMode = false; +let transmissionType: blockDeclaration['type']; +export const getTransmissionType = () => transmissionType; +export const getTransmissionReturnVal = () => { + const declaration = getDeclaration( + transmittedBlocks[0].lib, + transmittedBlocks[0].code + ) as IBlockComputedDeclaration; + return declaration.typeHint; +}; +/** A block after which a (+) indicator will be placed */ +let suggestedTarget: IBlock | IBlock[] | undefined; +export const getSuggestedTarget = () => suggestedTarget; +export const setSuggestedTarget = (target?: IBlock | IBlock[] | undefined) => + (suggestedTarget = target); + +export const startBlocksTransmit = ( + blocks: IBlock[], + source: typeof transmissionSource, + key?: string, + cloning?: boolean +) => { + transmittedBlocks = blocks; + transmissionType = getDeclaration(blocks[0].lib, blocks[0].code).type; + transmissionSource = source; + transmissionSourceKey = key; + cloningMode = Boolean(cloning); +}; +export const endBlocksTransmit = ( + destination: typeof transmissionSource, + index: number | string +) => { + if (!cloningMode) { + // Remove from the old object + if (Array.isArray(transmissionSource)) { + for (const block of transmittedBlocks) { + // Remove the source blocks but put a marker in place of it + // to maintain positions while reordering blocks inside the same container. + transmissionSource.splice(transmissionSource.indexOf(block), 1, 'MARKER'); + } + } else if (transmissionSourceKey) { + delete transmissionSource[transmissionSourceKey]; + } + } else { + transmittedBlocks = structuredClone(transmittedBlocks); + } + if (Array.isArray(destination)) { + destination.splice(index as number, 0, ...transmittedBlocks); + } else { + [destination[index]] = transmittedBlocks; + } + if (!cloningMode && Array.isArray(transmissionSource)) { + while (transmissionSource.includes('MARKER')) { + transmissionSource.splice(transmissionSource.indexOf('MARKER'), 1); + } + } + suggestedTarget = void 0; + window.signals.trigger('blockTransmissionEnd'); +}; +export const blockFromDeclaration = (declaration: blockDeclaration): IBlock => { + const block: IBlock = { + lib: declaration.lib, + code: declaration.code, + values: {} + }; + for (const piece of declaration.pieces) { + if (piece.type === 'blocks') { + block.values[piece.key] = [] as IBlock[]; + } + } + return block; +}; +export const insertBlock = ( + dest: BlockScript, + pos: number, + declaration: blockDeclaration +): void => { + dest.splice(pos + 1, 0, blockFromDeclaration(declaration)); +}; + +const migrateValues = (from: IBlock, to: IBlock) => { + to.values = from.values; + if (from.customOptions) { + to.customOptions = from.customOptions; + } +}; +/** + * Intended to be used for mutators in blocks' context menus; this function replaces one block + * to another in a given block list or block's values. + * Values of the old block are transferred onto the new block, and the old block is removed. + */ +export const mutate = ( + dest: BlockScript | IBlock, + key: number | string, + mutator: { + lib: string, + code: string + }, + customOptions?: boolean +): void => { + const newBlock = blockFromDeclaration(getDeclaration(mutator.lib, mutator.code)); + if (Array.isArray(dest)) { + const pos = key as number; + migrateValues(dest[pos], newBlock); + dest.splice(pos, 1, newBlock); + } else if (customOptions && dest.customOptions) { + const prevBlock = dest.customOptions[key] as IBlock; + migrateValues(prevBlock, newBlock); + dest.customOptions[key] = newBlock; + } else { + const prevBlock = dest.values[key] as IBlock; + migrateValues(prevBlock, newBlock); + dest.values[key] = newBlock; + } +}; +export const emptyTexture = document.createElement('canvas'); +emptyTexture.width = emptyTexture.height = 1; + +export const getMenuMutators = ( + block: IBlock, + callback: (affixedData: {mutator: blockDeclaration}) => void +): IMenuItem[] | false => { + const declaration = getDeclaration(block.lib, block.code); + if (!declaration.mutators || !declaration.mutators.length) { + return false; + } + return declaration.mutators.map(m => { + const mDeclaration = getDeclaration(m.lib, m.code); + return { + label: getByPath('catnip.changeBlockTo').replace('$1', mDeclaration.bakedName), + icon: mDeclaration.icon, + click: callback, + affixedData: { + mutator: mDeclaration + } + }; + }); +}; + +/** Removes blocks that are children of other blocks. */ +const getTopBlocks = (blocks: IBlock[]): IBlock[] => { + const out = [...blocks]; + if (out.length > 1) { + const toRemove: IBlock[] = []; + const traverseValues = (block: IBlock) => { + for (const value of Object.values(block.values)) { + if (Array.isArray(value)) { // This is a block script + for (const child of value) { + if (out.includes(child)) { + toRemove.push(child); + } else { + traverseValues(child); + } + } + } + } + }; + blocks.forEach(traverseValues); + for (const block of toRemove) { + blocks.splice(blocks.indexOf(block), 1); + } + } + return out; +}; + +let clipboard: IBlock[] | null = null; +export const copy = (blocks: IBlock[]) => { + clipboard = structuredClone(getTopBlocks(blocks)); +}; +export const canPaste = (target: blockArgumentType | 'script'): boolean => { + if (clipboard === null) { + return false; + } + const declaration = getDeclaration(clipboard[0].lib, clipboard[0].code); + if (target === 'script' && declaration.type === 'command') { + return true; + } + if (target !== 'script' && declaration.type === 'computed' && + (target === declaration.typeHint || declaration.typeHint === 'wildcard' || target === 'wildcard')) { + return true; + } + return false; +}; +export const paste = ( + target: IBlock | BlockScript, + index: number | string, + customOptions?: boolean +): void => { + if (Array.isArray(target)) { + if (!canPaste('script')) { + throw new Error('[catnip] Attempt to paste into a script with an invalid clipboard.'); + } + target.splice(index as number, 0, ...structuredClone(clipboard!)); + } + const block = target as IBlock; + if (customOptions) { + // eslint-disable-next-line prefer-destructuring + block.customOptions![index as string] = structuredClone(clipboard![0]); + } else { + // eslint-disable-next-line prefer-destructuring + block.values[index as string] = structuredClone(clipboard![0]); + } +}; + +/* + Code for implementing multiple selection and mass operattions. + Multiple selection supports only command blocks. +*/ +const multipleSelection = new Map(); +/** + * Redraws all the selected blocks' parents. + * If oldBlocks is provided, only those blocks' parents will be redrawn; + * otherwise it defaults to the current selection. + */ +export const redrawSelectedBlocks = ( + toUpdate = [...multipleSelection.keys()], + map = multipleSelection +): void => { + // Redraw as little as possible + const blocks = getTopBlocks(toUpdate); + const alreadyUpdated = new Set(); + for (const block of blocks) { + const riotTag = map.get(block)!; + if (!alreadyUpdated.has(riotTag)) { + if (riotTag.parent) { + riotTag.parent.update(); + alreadyUpdated.add(riotTag); + } + } + } +}; +export const addToSelection = (block: IBlock, riotTag: IRiotTag) => { + multipleSelection.set(block, riotTag); + riotTag.parent.update(); +}; +export const setSelection = (block: IBlock, riotTag: IRiotTag): void => { + const previouslySelected = [...multipleSelection.keys()], + previousMap = new Map(multipleSelection); + multipleSelection.clear(); + multipleSelection.set(block, riotTag); + redrawSelectedBlocks(previouslySelected, previousMap); +}; +export const isSelected = (block: IBlock): boolean => multipleSelection.has(block); +export const isAnythingSelected = (): boolean => multipleSelection.size > 0; +export const removeFromSelection = (block: IBlock): void => { + const previouslySelected = [...multipleSelection.keys()], + previousMap = new Map(multipleSelection); + multipleSelection.delete(block); + redrawSelectedBlocks(previouslySelected, previousMap); +}; +export const toggleSelection = (block: IBlock, riotTag: IRiotTag): void => { + if (isSelected(block)) { + removeFromSelection(block); + } else { + addToSelection(block, riotTag); + } +}; +export const clearSelection = (): void => { + const previouslySelected = [...multipleSelection.keys()], + previousMap = new Map(multipleSelection); + multipleSelection.clear(); + redrawSelectedBlocks(previouslySelected, previousMap); +}; +export const getSelectionHTML = (): void => { + const html = []; + const dummy = document.createElement('catnip-block'); + for (const [, riotTag] of multipleSelection) { + html.push(riotTag.html); + dummy.innerHTML = riotTag.root.innerHTML; + // cleanup unneeded tags or attributes + dummy.querySelectorAll('catnip-insert-mark, context-menu').forEach(t => t.remove()); + for (const attr of ['showplaceholder', 'placeholder', 'title', 'ref', 'draggable']) { + dummy.querySelectorAll(`[${attr}]`).forEach(t => t.removeAttribute(attr)); + } + dummy.querySelectorAll('input, textarea').forEach(t => t.setAttribute('readonly', 'readonly')); + dummy.querySelectorAll('img').forEach(t => { + const img = document.createElement('img'); + img.src = '/assets/icons/image.svg'; + img.className = 'feather'; + t.parentNode!.insertBefore(img, t); + t.remove(); + }); + dummy.querySelectorAll('svg').forEach(t => { + const img = document.createElement('img'); + const name = t.children[0].getAttribute('xlink:href')!.slice(1); + img.src = `/assets/icons/${name}.svg`; + img.className = 'feather'; + t.parentNode!.insertBefore(img, t); + t.remove(); + }); + dummy.className = riotTag.root.className; + html.push(dummy.outerHTML); + } + navigator.clipboard.writeText(html.join('\n')); +}; +export const removeSelectedBlocks = (): void => { + const blocks = getTopBlocks([...multipleSelection.keys()]); + for (const block of blocks) { + const riotTag = multipleSelection.get(block)!; + const parentsBlocks = riotTag.parent.opts.blocks as IBlock[]; + (parentsBlocks).splice(parentsBlocks.indexOf(block), 1); + } + clearSelection(); +}; diff --git a/src/node_requires/catnip/stdLib/_utils.ts b/src/node_requires/catnip/stdLib/_utils.ts new file mode 100644 index 000000000..e028c3216 --- /dev/null +++ b/src/node_requires/catnip/stdLib/_utils.ts @@ -0,0 +1,41 @@ +export const optionsToStringObj = (options: Record): string => + '{\n' + Object.entries(options) + .map(([key, value]) => `${key}: ${value}`) + .join(',\n') + + '\n}'; + +export const getOptions = ( + values: Record, + keys: string[], + customOptions?: Record +): Record | false => { + const options: Record = {}; + let hasOptions = false; + for (const key of keys) { + if (values[key] !== 'undefined') { + options[key] = values[key]; + hasOptions = true; + } + } + if (customOptions) { + for (const key of Object.keys(customOptions)) { + if (customOptions[key] !== 'undefined') { + options[key] = customOptions[key]; + hasOptions = true; + } + } + } + return hasOptions && options; +}; + +export const makeMutators = ( + blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[], + codes: string[] +) => blocks + .filter(b => codes.includes(b.code)) + .forEach(b => { + b.mutators = codes.filter(c => c !== b.code).map(c => ({ + lib: b.lib, + code: c + })); + }); diff --git a/src/node_requires/catnip/stdLib/actions.ts b/src/node_requires/catnip/stdLib/actions.ts new file mode 100644 index 000000000..27f123677 --- /dev/null +++ b/src/node_requires/catnip/stdLib/actions.ts @@ -0,0 +1,63 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'action value', + type: 'computed', + code: 'action value', + icon: 'airplay', + lib: 'core.actions', + i18nKey: 'action value', + typeHint: 'number', + pieces: [{ + type: 'argument', + assets: 'action', + typeHint: 'string', + key: 'action' + }], + jsTemplate: (values) => `actions[${values.action}].value` +}, { + name: 'is action pressed', + type: 'computed', + code: 'action pressed', + icon: 'airplay', + lib: 'core.actions', + i18nKey: 'is action pressed', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + assets: 'action', + typeHint: 'string', + key: 'action' + }], + jsTemplate: (values) => `actions[${values.action}].pressed` +}, { + name: 'is action down', + type: 'computed', + code: 'action down', + icon: 'airplay', + lib: 'core.actions', + i18nKey: 'is action down', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + assets: 'action', + typeHint: 'string', + key: 'action' + }], + jsTemplate: (values) => `actions[${values.action}].down` +}, { + name: 'is action released', + type: 'computed', + code: 'action released', + icon: 'airplay', + lib: 'core.actions', + i18nKey: 'is action released', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + assets: 'action', + typeHint: 'string', + key: 'action' + }], + jsTemplate: (values) => `actions[${values.action}].released` +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/appearance.ts b/src/node_requires/catnip/stdLib/appearance.ts new file mode 100644 index 000000000..d3b97026f --- /dev/null +++ b/src/node_requires/catnip/stdLib/appearance.ts @@ -0,0 +1,404 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'Set texture', + type: 'command', + code: 'set texture', + icon: 'droplet', + jsTemplate: (vals) => `this.tex = ${vals.texture};`, + lib: 'core.appearance', + i18nKey: 'set texture', + pieces: [{ + type: 'argument', + key: 'texture', + typeHint: 'string', + assets: 'texture', + required: true + }] +}, { + name: 'Set scale', + type: 'command', + code: 'set scale', + icon: 'droplet', + jsTemplate: (vals) => `this.scale.x = this.scale.y = ${vals.scale};`, + lib: 'core.appearance', + i18nKey: 'set scale', + pieces: [{ + type: 'argument', + key: 'scale', + typeHint: 'number', + required: true + }] +}, { + name: 'Set scale', + type: 'command', + code: 'set scale xy', + icon: 'droplet', + jsTemplate: (vals) => `this.scale.set(${vals.x}, ${vals.y});`, + lib: 'core.appearance', + i18nKey: 'set scale xy', + pieces: [{ + type: 'argument', + key: 'x', + typeHint: 'number', + required: true + }, { + type: 'argument', + key: 'y', + typeHint: 'number', + required: true + }] +}, { + name: 'Set width', + type: 'command', + code: 'set width', + icon: 'droplet', + jsTemplate: (vals) => `this.width = ${vals.width};`, + lib: 'core.appearance', + i18nKey: 'set width', + pieces: [{ + type: 'argument', + key: 'width', + typeHint: 'number', + required: true + }] +}, { + name: 'Set height', + type: 'command', + code: 'set height', + icon: 'droplet', + jsTemplate: (vals) => `this.height = ${vals.height};`, + lib: 'core.appearance', + i18nKey: 'set height', + pieces: [{ + type: 'argument', + key: 'height', + typeHint: 'number', + required: true + }] +}, { + name: 'Set skew', + type: 'command', + code: 'set skew', + icon: 'droplet', + jsTemplate: (vals) => `this.skew.set(${vals.x}, ${vals.y});`, + lib: 'core.appearance', + i18nKey: 'set skew', + pieces: [{ + type: 'argument', + key: 'x', + typeHint: 'number', + required: true + }, { + type: 'argument', + key: 'y', + typeHint: 'number', + required: true + }] +}, { + name: 'Set texture angle', + type: 'command', + code: 'set angle', + icon: 'droplet', + jsTemplate: (vals) => `this.angle = ${vals.degrees};`, + lib: 'core.appearance', + i18nKey: 'set angle', + pieces: [{ + type: 'argument', + key: 'degrees', + typeHint: 'number', + required: true + }] +}, { + name: 'Set opacity', + type: 'command', + code: 'set alpha', + icon: 'droplet', + jsTemplate: (vals) => `this.alpha = ${vals.value};`, + lib: 'core.appearance', + i18nKey: 'set alpha', + pieces: [{ + type: 'argument', + key: 'value', + typeHint: 'number', + required: true + }] +}, { + name: 'Set depth', + type: 'command', + code: 'set depth', + icon: 'droplet', + jsTemplate: (vals) => `this.zIndex = ${vals.value};`, + lib: 'core.appearance', + i18nKey: 'set depth', + pieces: [{ + type: 'argument', + key: 'value', + typeHint: 'number', + required: true + }] +}, { + name: 'Set tint', + type: 'command', + code: 'set tint', + icon: 'droplet', + jsTemplate: (vals) => `this.tint = ${vals.value};`, + lib: 'core.appearance', + i18nKey: 'set tint', + pieces: [{ + type: 'argument', + key: 'value', + typeHint: 'color', + required: true + }] +}, { + name: 'Play animation', + type: 'command', + code: 'play animation', + icon: 'template', + jsTemplate: () => 'this.play();', + lib: 'core.appearance', + i18nKey: 'play animation', + pieces: [] +}, { + name: 'Stop animation', + type: 'command', + code: 'stop animation', + icon: 'template', + jsTemplate: () => 'this.stop();', + lib: 'core.appearance', + i18nKey: 'stop animation', + pieces: [] +}, { + name: 'Go to frame and play', + displayName: 'Go to frame', + type: 'command', + code: 'goto play', + icon: 'template', + jsTemplate: (values) => `this.gotoAndPlay(${values.frame});`, + lib: 'core.appearance', + i18nKey: 'goto frame play', + displayI18nKey: 'goto frame', + pieces: [{ + type: 'argument', + key: 'frame', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'and play', + i18nKey: 'and play animation' + }] +}, { + name: 'Go to frame and stop', + displayName: 'Go to frame', + type: 'command', + code: 'goto stop', + icon: 'template', + jsTemplate: (values) => `this.gotoAndStop(${values.frame});`, + lib: 'core.appearance', + i18nKey: 'goto frame stop', + displayI18nKey: 'goto frame', + pieces: [{ + type: 'argument', + key: 'frame', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'and stop', + i18nKey: 'and stop animation' + }] +}, { + name: 'Set animation speed', + type: 'command', + code: 'set animation speed', + icon: 'template', + jsTemplate: (values) => `this.animationSpeed = ${values.speed};`, + lib: 'core.appearance', + i18nKey: 'set animation speed', + pieces: [{ + type: 'argument', + key: 'speed', + typeHint: 'number', + required: true + }] +}, { + name: 'set text', + code: 'set text', + type: 'command', + icon: 'font', + lib: 'core.appearance', + i18nKey: 'set text', + pieces: [{ + type: 'argument', + key: 'text', + typeHint: 'string', + required: true + }], + jsTemplate: (values) => `this.text = ${values.text};` +}, { + name: 'set disabled', + code: 'set disabled', + type: 'command', + icon: 'button', + lib: 'core.appearance', + i18nKey: 'set disabled', + pieces: [{ + type: 'argument', + key: 'disabled', + typeHint: 'boolean', + required: true + }], + jsTemplate: (values) => `this.disabled = ${values.disabled};` +}, { + name: 'get texture', + type: 'computed', + code: 'get texture', + icon: 'droplet', + jsTemplate: () => 'this.tex', + lib: 'core.appearance', + i18nKey: 'texture', + pieces: [], + typeHint: 'string' +}, { + name: 'get scale by x', + type: 'computed', + code: 'get scale x', + icon: 'droplet', + jsTemplate: () => 'this.scale.x', + lib: 'core.appearance', + i18nKey: 'scale x', + pieces: [], + typeHint: 'number' +}, { + name: 'get scale by y', + type: 'computed', + code: 'get scale y', + icon: 'droplet', + jsTemplate: () => 'this.scale.y', + lib: 'core.appearance', + i18nKey: 'scale y', + pieces: [], + typeHint: 'number' +}, { + name: 'get width', + type: 'computed', + code: 'get width', + icon: 'droplet', + jsTemplate: () => 'this.width', + lib: 'core.appearance', + i18nKey: 'get width', + pieces: [], + typeHint: 'number' +}, { + name: 'get height', + type: 'computed', + code: 'get height', + icon: 'droplet', + jsTemplate: () => 'this.height', + lib: 'core.appearance', + i18nKey: 'get height', + pieces: [], + typeHint: 'number' +}, { + name: 'get skew by x', + type: 'computed', + code: 'get skew x', + icon: 'droplet', + jsTemplate: () => 'this.skew.x', + lib: 'core.appearance', + i18nKey: 'skew x', + pieces: [], + typeHint: 'number' +}, { + name: 'get skew by y', + type: 'computed', + code: 'get skew y', + icon: 'droplet', + jsTemplate: () => 'this.skew.y', + lib: 'core.appearance', + i18nKey: 'skew y', + pieces: [], + typeHint: 'number' +}, { + name: 'get texture angle', + type: 'computed', + code: 'get angle', + icon: 'droplet', + jsTemplate: () => 'this.angle', + lib: 'core.appearance', + i18nKey: 'get angle', + pieces: [], + typeHint: 'number' +}, { + name: 'get opacity', + type: 'computed', + code: 'get alpha', + icon: 'droplet', + jsTemplate: () => 'this.alpha', + lib: 'core.appearance', + i18nKey: 'get alpha', + pieces: [], + typeHint: 'number' +}, { + name: 'get depth', + type: 'computed', + code: 'get depth', + icon: 'droplet', + jsTemplate: () => 'this.zIndex', + lib: 'core.appearance', + i18nKey: 'get depth', + pieces: [], + typeHint: 'number' +}, { + name: 'tint', + type: 'computed', + code: 'get tint', + icon: 'droplet', + jsTemplate: () => 'this.tint', + lib: 'core.appearance', + i18nKey: 'get tint', + pieces: [], + typeHint: 'color' +}, { + name: 'get animation speed', + type: 'computed', + code: 'get animation speed', + icon: 'droplet', + jsTemplate: () => 'this.animationSpeed', + lib: 'core.appearance', + i18nKey: 'get animation speed', + pieces: [], + typeHint: 'number' +}, { + name: 'get current frame', + type: 'computed', + code: 'get current frame', + icon: 'droplet', + jsTemplate: () => 'this.currentFrame', + lib: 'core.appearance', + i18nKey: 'get current frame', + pieces: [], + typeHint: 'number' +}, { + name: 'get text', + type: 'computed', + code: 'get text', + icon: 'font', + lib: 'core.appearance', + i18nKey: 'get text', + pieces: [], + typeHint: 'string', + jsTemplate: () => 'this.text' +}, { + name: 'get disabled', + type: 'computed', + code: 'get disabled', + icon: 'button', + lib: 'core.appearance', + i18nKey: 'get disabled', + pieces: [], + typeHint: 'string', + jsTemplate: () => 'this.disabled' +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/arrays.ts b/src/node_requires/catnip/stdLib/arrays.ts new file mode 100644 index 000000000..f5b36b823 --- /dev/null +++ b/src/node_requires/catnip/stdLib/arrays.ts @@ -0,0 +1,311 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + code: 'array unshift', + name: 'add an element at start', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'array unshift', + pieces: [{ + type: 'argument', + key: 'elt', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'to', + i18nKey: 'toWrite' + }, { + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (vals) => `${vals.array}.unshift(${vals.elt})` +}, { + code: 'array push', + name: 'add an element at end', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'array push', + pieces: [{ + type: 'argument', + key: 'elt', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'to', + i18nKey: 'toWrite' + }, { + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (vals) => `${vals.array}.push(${vals.elt})` +}, { + code: 'add element at position', + name: 'add an element at position', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'add element at position', + displayName: 'add an element', + displayI18nKey: 'add element', + pieces: [{ + type: 'argument', + key: 'elt', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'to', + i18nKey: 'toDestination' + }, { + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'at position', + i18nKey: 'at position' + }, { + type: 'argument', + key: 'position', + typeHint: 'number', + required: true + }], + jsTemplate: (vals) => `${vals.array}.splice(${vals.position}, 0, ${vals.elt})` +}, { + code: 'array pop', + name: 'remove last element', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'array pop', + pieces: [{ + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (vals) => `${vals.array}.pop()` +}, { + code: 'array shift', + name: 'remove first element', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'array shift', + pieces: [{ + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (vals) => `${vals.array}.shift()` +}, { + code: 'remove element', + name: 'remove element from array', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'remove element from array', + displayName: 'remove element', + displayI18nKey: 'remove element', + pieces: [{ + type: 'argument', + key: 'elt', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'from', + i18nKey: 'fromSource' + }, { + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (vals) => `${vals.array}.splice(${vals.array}.indexOf(${vals.elt}), 1)` +}, { + code: 'remove at position', + name: 'remove element at position', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'remove at position', + pieces: [{ + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'at', + i18nKey: 'atPosition' + }, { + type: 'argument', + key: 'position', + typeHint: 'number', + required: true + }], + jsTemplate: (vals) => `${vals.array}.splice(${vals.position}, 1)` +}, { + code: 'filter array', + name: 'filter array', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'filter array', + pieces: [{ + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'with results in', + i18nKey: 'with results in' + }, { + type: 'argument', + key: 'result', + typeHint: 'boolean', + required: true + }, { + type: 'label', + name: 'and elements', + i18nKey: 'and elements' + }, { + type: 'argument', + key: 'elt', + typeHint: 'wildcard', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store new array in', + i18nKey: 'store new array in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard', + required: true + }, { + type: 'blocks', + key: 'loop' + }], + jsTemplate: (vals) => `${vals.return} = ${vals.array}.filter(elt => { + ${vals.elt} = elt; + ${vals.loop} + return ${vals.result}; + });` +}, { + code: 'map array', + name: 'map array', + type: 'command', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'map array', + pieces: [{ + type: 'argument', + key: 'array', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'with results in', + i18nKey: 'with results in' + }, { + type: 'argument', + key: 'result', + typeHint: 'boolean', + required: true + }, { + type: 'label', + name: 'and elements', + i18nKey: 'and elements' + }, { + type: 'argument', + key: 'elt', + typeHint: 'wildcard', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store new array in', + i18nKey: 'store new array in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard', + required: true + }, { + type: 'blocks', + key: 'loop' + }], + jsTemplate: (vals) => `${vals.return} = ${vals.array}.map(elt => { + ${vals.elt} = elt; + ${vals.loop} + return ${vals.result}; + });` +}, { + code: 'array length', + name: 'array length', + type: 'computed', + i18nKey: 'array length', + displayName: 'length of', + displayI18nKey: 'lengthOf', + icon: 'grid', + lib: 'core.arrays', + typeHint: 'number', + pieces: [{ + key: 'array', + type: 'argument', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (values) => `${values.array}.length` +}, { + name: 'get array element', + i18nKey: 'array get', + type: 'computed', + code: 'get', + icon: 'grid', + lib: 'core.arrays', + pieces: [{ + type: 'argument', + key: 'obj', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'at', + i18nKey: 'atPosition' + }, { + type: 'argument', + key: 'index', + typeHint: 'number', + required: true + }], + jsTemplate: (values) => `${values.obj}[${values.index}]`, + typeHint: 'wildcard' +}, { + name: 'new array', + type: 'computed', + code: 'new array', + icon: 'grid', + lib: 'core.arrays', + i18nKey: 'new array', + pieces: [], + typeHint: 'wildcard', + jsTemplate: () => 'new Array()', + customClass: 'constant' +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/camera.ts b/src/node_requires/catnip/stdLib/camera.ts new file mode 100644 index 000000000..eebbc607f --- /dev/null +++ b/src/node_requires/catnip/stdLib/camera.ts @@ -0,0 +1,111 @@ +import {makeMutators} from './_utils'; + +const makeSetter = (field: string): IBlockCommandDeclaration => ({ + name: `Set ${field}`, + type: 'command', + code: `set ${field}`, + icon: 'camera', + lib: 'core.camera', + i18nKey: `set ${field}`, + pieces: [{ + type: 'argument', + key: 'value', + typeHint: ['followX', 'followY'].includes(field) ? 'boolean' : 'number', + required: true + }], + jsTemplate: (values) => `camera.${field} = ${values.value};` +}); +const makeGetter = (field: string): IBlockComputedDeclaration => ({ + name: `get ${field}`, + type: 'computed', + code: `get ${field}`, + icon: 'camera', + lib: 'core.camera', + i18nKey: `get ${field}`, + pieces: [], + jsTemplate: () => `camera.${field}`, + typeHint: ['followX', 'followY'].includes(field) ? 'boolean' : 'number' +}); + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'Follow this copy', + type: 'command', + code: 'follow this', + icon: 'camera', + lib: 'core.camera', + i18nKey: 'follow this', + pieces: [], + jsTemplate: () => 'camera.follow = this;' +}, { + name: 'Follow', + type: 'command', + code: 'follow', + icon: 'camera', + lib: 'core.camera', + i18nKey: 'follow', + pieces: [{ + type: 'argument', + key: 'target', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (values) => `camera.follow = ${values.target};` +}, { + name: 'Set zoom', + type: 'command', + code: 'set zoom', + icon: 'camera', + lib: 'core.camera', + i18nKey: 'set zoom', + pieces: [{ + type: 'argument', + key: 'zoom', + typeHint: 'number', + required: true + }], + jsTemplate: (values) => `camera.scale.set(1 / ${values.zoom}, 1 / ${values.zoom});` +}, { + name: 'followed copy', + type: 'computed', + code: 'followed', + icon: 'camera', + lib: 'core.camera', + i18nKey: 'followed copy', + pieces: [], + jsTemplate: () => 'camera.follow', + typeHint: 'wildcard' +}, { + name: 'zoom', + type: 'computed', + code: 'get zoom', + icon: 'camera', + lib: 'core.camera', + i18nKey: 'get zoom', + pieces: [], + jsTemplate: () => '(1 / camera.scale.x)', + typeHint: 'number' +}]; + +for (const field of ['x', 'y', 'targetX', 'targetY', 'shiftX', 'shiftY', 'drift', 'rotation', 'followX', 'followY', 'borderX', 'borderY', 'shake', 'shakeDecay', 'shakeFrequency', 'shakeX', 'shakeY', 'shakeMax', 'minX', 'maxX', 'minY', 'maxY']) { + blocks.push(makeSetter(field)); +} +for (const field of ['x', 'y', 'targetX', 'targetY', 'computedX', 'computedY', 'width', 'height', 'shiftX', 'shiftY', 'drift', 'left', 'right', 'top', 'bottom', 'rotation', 'followX', 'followY', 'borderX', 'borderY', 'shake', 'shakeDecay', 'shakeFrequency', 'shakeX', 'shakeY', 'shakeMax', 'minX', 'maxX', 'minY', 'maxY']) { + blocks.push(makeGetter(field)); +} + +makeMutators(blocks, ['set x', 'set y', 'set targetX', 'set targetY']); +makeMutators(blocks, ['get x', 'get y', 'get targetX', 'get targetY', 'get computedX', 'get computedY']); +makeMutators(blocks, ['set shiftX', 'set shiftY']); +makeMutators(blocks, ['get shiftX', 'get shiftY']); +makeMutators(blocks, ['set minX', 'set maxX', 'set minY', 'set maxY']); +makeMutators(blocks, ['get minX', 'get maxX', 'get minY', 'get maxY']); +makeMutators(blocks, ['get left', 'get right', 'get top', 'get bottom']); +makeMutators(blocks, ['set followX', 'set followY']); +makeMutators(blocks, ['get followX', 'get followY']); +makeMutators(blocks, ['set borderX', 'set borderY']); +makeMutators(blocks, ['get borderX', 'get borderY']); +makeMutators(blocks, ['set shakeX', 'set shakeY']); +makeMutators(blocks, ['get shakeX', 'get shakeY']); +makeMutators(blocks, ['get width', 'get height']); + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/console.ts b/src/node_requires/catnip/stdLib/console.ts new file mode 100644 index 000000000..44ef68392 --- /dev/null +++ b/src/node_requires/catnip/stdLib/console.ts @@ -0,0 +1,20 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = []; + +for (const method of ['log', 'warn', 'error']) { + blocks.push({ + name: `Console ${method}`, + type: 'command', + code: method, + icon: 'terminal', + jsTemplate: (values) => `console.${method}(${values.any})`, + lib: 'core.console', + i18nKey: `console ${method}`, + pieces: [{ + type: 'argument', + key: 'any', + typeHint: 'wildcard' + }] + }); +} + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/ctjsApi.ts b/src/node_requires/catnip/stdLib/ctjsApi.ts new file mode 100644 index 000000000..7d7e1d589 --- /dev/null +++ b/src/node_requires/catnip/stdLib/ctjsApi.ts @@ -0,0 +1,79 @@ +import {parseFile} from '../declarationExtractor'; +import {convertFromDtsToBlocks} from '../blockUtils'; + +const filterPatchMenu = ( + menus: blockMenu[], + blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[], + filterPrefix: string, + icon: string, + name: string +): blockMenu => { + const filtered = blocks.filter(block => block.code.startsWith(filterPrefix)); + filtered.forEach(b => { + b.icon = icon; + b.name = b.name.replace(/^index\./, 'replaceValue'); + b.i18nKey = `${name.toLowerCase()} ${b.name}`; + if (b.displayName) { + b.displayI18nKey = `${name.toLowerCase()} ${b.name}`; + } + }); + const menu: blockMenu = { + name, + items: filtered, + opened: false, + i18nKey: name.toLowerCase(), + icon + }; + menus.push(menu); + return menu; +}; + +const sortHelper = { + command: -1, + computed: 1 +}; + +import templatesBlocks from './templates'; +import soundsBlocks from './sounds'; +import roomsBlocks from './rooms'; +import miscBlocks from './misc'; +import settingsBlocks from './settings'; + +export const loadBlocks = async (): Promise => { + let parsed = await parseFile('./data/typedefs/ct.d.ts'); + parsed = parsed.filter(d => !/pixi/i.test(d.name)); + for (const useful of parsed) { + useful.name = useful.name.replace(/^src\/ct.release\/(index\.)?/, ''); + useful.name = useful.name.replace(/([a-zA-Z]+).\1Lib/, '$1'); + } + const allBlocks = convertFromDtsToBlocks(parsed, 'core'); + + const menus: blockMenu[] = []; + + const templates = filterPatchMenu(menus, allBlocks, 'templates.', 'template', 'Templates'); + templates.items.unshift(...templatesBlocks); + templates.items.sort((a, b) => sortHelper[a.type] - sortHelper[b.type]); + + const rooms = filterPatchMenu(menus, allBlocks, 'rooms.', 'room', 'Rooms'); + rooms.items.push(...roomsBlocks); + rooms.items.sort((a, b) => sortHelper[a.type] - sortHelper[b.type]); + + filterPatchMenu(menus, allBlocks, 'behaviors.', 'behavior', 'Behaviors'); + const sounds = filterPatchMenu(menus, allBlocks, 'sounds.', 'music', 'Sounds'); + sounds.items.unshift(...soundsBlocks); + + const styles = filterPatchMenu(menus, allBlocks, 'styles.', 'droplet', 'Styles'); + miscBlocks.push(...styles.items); + menus.splice(menus.indexOf(styles), 1); + + filterPatchMenu(menus, allBlocks, 'backgrounds.', 'image', 'Backgrounds'); + + filterPatchMenu(menus, allBlocks, 'emitters.', 'sparkles', 'Emitter tandems'); + + filterPatchMenu(menus, allBlocks, 'u.', 'tool', 'Utilities'); + + const settings = filterPatchMenu(menus, allBlocks, 'settings.', 'settings', 'Settings'); + settings.items.unshift(...settingsBlocks); + + return menus; +}; diff --git a/src/node_requires/catnip/stdLib/hiddenBlocks.ts b/src/node_requires/catnip/stdLib/hiddenBlocks.ts new file mode 100644 index 000000000..8a1267d41 --- /dev/null +++ b/src/node_requires/catnip/stdLib/hiddenBlocks.ts @@ -0,0 +1,97 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'Variable', + hideLabel: true, + type: 'computed', + typeHint: 'wildcard', + code: 'variable', + icon: 'clock', + jsTemplate: (values) => values.variableName, + lib: 'core.hidden', + i18nKey: 'variable', + pieces: [{ + type: 'propVar' + }], + customClass: 'userdefined' +}, { + name: 'Property', + hideLabel: true, + type: 'computed', + typeHint: 'wildcard', + code: 'property', + icon: 'archive', + jsTemplate: (values) => `this['${values.variableName}']`, + lib: 'core.hidden', + i18nKey: 'property', + pieces: [{ + type: 'propVar' + }], + customClass: 'userdefined' +}, { + name: 'Global variable', + hideLabel: true, + type: 'computed', + typeHint: 'wildcard', + code: 'global variable', + icon: 'circle', + jsTemplate: (values) => values.variableName, + lib: 'core.hidden', + i18nKey: 'property', + pieces: [{ + type: 'propVar' + }], + customClass: 'userdefined' +}, { + name: 'Behavior property', + hideLabel: true, + type: 'computed', + typeHint: 'wildcard', + code: 'behavior property', + icon: 'behavior', + jsTemplate: (values) => `this['${values.variableName}']`, + lib: 'core.hidden', + i18nKey: 'behavior property', + pieces: [{ + type: 'propVar' + }], + customClass: 'userdefined' +}, { + name: 'Event variable', + hideLabel: true, + type: 'computed', + typeHint: 'wildcard', + code: 'event variable', + icon: 'bell', + jsTemplate: (values) => values.variableName, + lib: 'core.hidden', + i18nKey: 'event variable', + pieces: [{ + type: 'propVar' + }], + customClass: 'userdefined' +}, { + name: 'Script options', + code: 'script options', + lib: 'core.hidden', + i18nKey: 'script options', + displayI18nKey: 'options', + type: 'computed', + typeHint: 'wildcard', + icon: 'code-alt', + jsTemplate: () => 'options', + pieces: [] +}, { + name: 'Content type entries', + hideLabel: true, + type: 'computed', + typeHint: 'wildcard', + lib: 'core.hidden', + code: 'content type', + i18nKey: 'content type entries', + icon: 'table-sidebar', + pieces: [{ + type: 'propVar' + }], + jsTemplate: (values) => `content['${values.variableName}']` +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/logic.ts b/src/node_requires/catnip/stdLib/logic.ts new file mode 100644 index 000000000..e80b410d8 --- /dev/null +++ b/src/node_requires/catnip/stdLib/logic.ts @@ -0,0 +1,398 @@ +import {makeMutators} from './_utils'; + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'If branch', + displayName: 'If', + type: 'command', + code: 'if branch', + icon: 'help-circle', + jsTemplate: (args) => + `if (${args.condition}) {\n ${args.body1}\n}`, + lib: 'core.logic', + i18nKey: 'if branch', + displayI18nKey: 'if else branch', + pieces: [{ + type: 'argument', + key: 'condition', + typeHint: 'boolean' + }, { + placeholder: 'doNothing', + type: 'blocks', + key: 'body1' + }], + mutators: [{ + code: 'if else branch', + lib: 'core.logic' + }] +}, { + name: 'If else branch', + displayName: 'If', + type: 'command', + code: 'if else branch', + icon: 'help-circle', + jsTemplate: (args) => + `if (${args.condition}) {\n ${args.body1}\n} else {\n ${args.body2}\n}`, + lib: 'core.logic', + i18nKey: 'if else branch', + displayI18nKey: 'if else branch', + pieces: [{ + type: 'argument', + key: 'condition', + typeHint: 'boolean' + }, { + placeholder: 'doNothing', + type: 'blocks', + key: 'body1' + }, { + type: 'icon', + icon: 'alert-circle' + }, { + type: 'label', + name: 'else', + i18nKey: 'else' + }, { + placeholder: 'doNothing', + type: 'blocks', + key: 'body2' + }], + mutators: [{ + code: 'if branch', + lib: 'core.logic' + }] +}, { + name: 'While loop cycle', + displayName: 'While', + type: 'command', + code: 'while loop cycle', + icon: 'rotate-cw', + jsTemplate: (args) => `while (${args.condition}) {\n ${args.body}\n}`, + lib: 'core.logic', + i18nKey: 'while loop cycle', + displayI18nKey: 'while loop cycle', + pieces: [{ + type: 'argument', + key: 'condition', + typeHint: 'boolean' + }, { + type: 'blocks', + key: 'body' + }] +}, { + name: 'Repeat N times', + displayName: 'Repeat', + type: 'command', + code: 'repeat', + icon: 'rotate-cw', + jsTemplate: (args, safeId) => { + if (args.variableName) { + return `for (${args.variableName} = 0; ${args.variableName} < ${args.N}; ${args.variableName}++) {\n ${args.body}\n}`; + } + return `for (i${safeId} = 0; i${safeId} < ${args.N}; i${safeId}++) {\n ${args.body}\n}`; + }, + lib: 'core.logic', + i18nKey: 'repeat', + displayI18nKey: 'repeat', + pieces: [{ + type: 'argument', + key: 'N', + typeHint: 'number' + }, { + type: 'label', + name: 'times', + i18nKey: 'timesCount' + }, { + type: 'filler' + }, { + type: 'label', + name: 'store index in', + i18nKey: 'store index in' + }, { + type: 'argument', + key: 'variableName', + typeHint: 'wildcard' + }, { + type: 'blocks', + key: 'body' + }] +}, { + name: 'For each element of array', + displayName: 'For each', + type: 'command', + code: 'for each', + icon: 'rotate-cw', + jsTemplate: (args) => `for (${args.variableName} of ${args.array}) {\n ${args.body}\n}`, + lib: 'core.logic', + i18nKey: 'for each', + displayI18nKey: 'for each', + pieces: [{ + type: 'argument', + key: 'variableName', + typeHint: 'wildcard' + }, { + type: 'label', + name: 'of array', + i18nKey: 'of array' + }, { + type: 'argument', + key: 'array', + typeHint: 'wildcard' + }, { + type: 'blocks', + key: 'body' + }] +}, { + name: 'break loop', + type: 'command', + code: 'break loop', + icon: 'log-out', + jsTemplate: () => 'break;\n', + lib: 'core.logic', + i18nKey: 'break loop', + pieces: [] +}, { + name: 'AND logic operator', + type: 'computed', + code: 'a AND b', + icon: 'bool', + lib: 'core.logic', + i18nKey: 'AND logic operator', + hideLabel: true, + hideIcon: true, + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'boolean' + }, { + type: 'label', + name: 'and', + i18nKey: 'AND' + }, { + type: 'argument', + key: 'b', + typeHint: 'boolean' + }], + jsTemplate: (args) => `(${args.a} && ${args.b})` +}, { + name: 'AND AND logic operator', + type: 'computed', + code: 'a AND b AND c', + icon: 'bool', + lib: 'core.logic', + i18nKey: 'AND AND logic operator', + hideLabel: true, + hideIcon: true, + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'boolean' + }, { + type: 'label', + name: 'and', + i18nKey: 'AND' + }, { + type: 'argument', + key: 'b', + typeHint: 'boolean' + }, { + type: 'label', + name: 'and', + i18nKey: 'AND' + }, { + type: 'argument', + key: 'c', + typeHint: 'boolean' + }], + jsTemplate: (args) => `(${args.a} && ${args.b} && ${args.c})` +}, { + name: 'OR logic operator', + type: 'computed', + code: 'a OR b', + icon: 'bool', + lib: 'core.logic', + i18nKey: 'OR logic operator', + hideLabel: true, + hideIcon: true, + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'boolean' + }, { + type: 'label', + name: 'or', + i18nKey: 'OR' + }, { + type: 'argument', + key: 'b', + typeHint: 'boolean' + }], + jsTemplate: (args) => `(${args.a} || ${args.b})` +}, { + name: 'OR OR logic operator', + type: 'computed', + code: 'a OR b OR c', + icon: 'bool', + lib: 'core.logic', + i18nKey: 'OR OR logic operator', + hideLabel: true, + hideIcon: true, + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'boolean' + }, { + type: 'label', + name: 'or', + i18nKey: 'OR' + }, { + type: 'argument', + key: 'b', + typeHint: 'boolean' + }, { + type: 'label', + name: 'or', + i18nKey: 'OR' + }, { + type: 'argument', + key: 'c', + typeHint: 'boolean' + }], + jsTemplate: (args) => `(${args.a} || ${args.b} || ${args.c})` +}, { + name: 'NOT logic operator', + displayName: 'not', + type: 'computed', + code: 'NOT a', + icon: 'bool', + hideIcon: true, + lib: 'core.logic', + i18nKey: 'NOT logic operator', + displayI18nKey: 'NOT logic operator', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'boolean' + }], + jsTemplate: (args) => `!${args.a}` +}, { + name: 'is', + code: 'is', + icon: 'help-circle', + type: 'computed', + typeHint: 'boolean', + hideIcon: true, + hideLabel: true, + i18nKey: 'is', + jsTemplate: (vals) => `(${vals.a} === ${vals.b})`, + lib: 'core.logic', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'is', + i18nKey: 'is' + }, { + type: 'argument', + key: 'b', + typeHint: 'wildcard', + required: true + }], + mutators: [{ + lib: 'core.logic', + code: 'is not' + }] +}, { + name: 'is not', + code: 'is not', + icon: 'help-circle', + type: 'computed', + typeHint: 'boolean', + hideIcon: true, + hideLabel: true, + i18nKey: 'is not', + jsTemplate: (vals) => `(${vals.a} !== ${vals.b})`, + lib: 'core.logic', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'is not', + i18nKey: 'is not' + }, { + type: 'argument', + key: 'b', + typeHint: 'wildcard', + required: true + }], + mutators: [{ + lib: 'core.logic', + code: 'is' + }] +}, { + name: 'convert to boolean', + i18nKey: 'convert to boolean', + type: 'computed', + code: 'convert to boolean', + icon: 'bool', + jsTemplate: (values) => `Boolean(${values.val})`, + lib: 'core.logic', + pieces: [{ + type: 'argument', + key: 'val', + typeHint: 'wildcard', + required: true + }], + typeHint: 'boolean' +}, { + name: 'true', + i18nKey: 'true', + type: 'computed', + code: 'true', + icon: 'bool', + jsTemplate: () => 'true', + lib: 'core.logic', + pieces: [], + typeHint: 'boolean', + customClass: 'constant', + onClickMutator: { + lib: 'core.logic', + code: 'false' + }, + mutators: [{ + lib: 'core.logic', + code: 'false' + }] +}, { + name: 'false', + i18nKey: 'false', + type: 'computed', + code: 'false', + icon: 'bool', + jsTemplate: () => 'false', + lib: 'core.logic', + pieces: [], + typeHint: 'boolean', + customClass: 'constant', + onClickMutator: { + lib: 'core.logic', + code: 'true' + }, + mutators: [{ + lib: 'core.logic', + code: 'true' + }] +}]; + +makeMutators(blocks, ['a AND b', 'a AND b AND c', 'a OR b', 'a OR b OR c']); + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/math.ts b/src/node_requires/catnip/stdLib/math.ts new file mode 100644 index 000000000..8a48ce572 --- /dev/null +++ b/src/node_requires/catnip/stdLib/math.ts @@ -0,0 +1,108 @@ +const niceOperators: Record = { + '*': '×', + '/': ':', + '<=': '≤', + '>=': '≥' +}; + +const numberOperators = ['+', '-', '*', '/', '%'], + boolOperators = ['<', '<=', '>', '>='], + mathUnaryOperators = ['abs', 'sign', 'floor', 'ceil', 'round', 'sqrt', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan'], + mathBinaryOperators = ['atan2', 'pow', 'log', 'min', 'max']; + +const makeOperator = (operator: string, type: blockArgumentType): IBlockComputedDeclaration => ({ + name: operator, + code: operator, + displayName: niceOperators[operator] || operator, + icon: type === 'boolean' ? 'help-circle' : 'hash', + type: 'computed', + typeHint: type, + hideIcon: true, + hideLabel: true, + jsTemplate: (vals) => `(${vals.a} ${operator} ${vals.b})`, + lib: 'core.math', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'number', + required: true + }, { + type: 'label', + name: niceOperators[operator] || operator + }, { + type: 'argument', + key: 'b', + typeHint: 'number', + required: true + }], + mutators: (type === 'boolean' ? boolOperators : numberOperators).filter(op => op !== operator).map((op) => ({ + lib: 'core.math', + code: op + })) +}); +const makeMathUnary = (operator: string): IBlockComputedDeclaration => ({ + name: operator, + displayName: niceOperators[operator] || operator, + code: operator, + icon: 'sort-numerically', + type: 'computed', + typeHint: 'number', + hideIcon: true, + i18nKey: operator, + jsTemplate: (vals) => `Math.${operator}(${vals.a})`, + lib: 'core.math', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'number', + required: true + }] +}); +const makeMathBinary = (operator: string): IBlockComputedDeclaration => ({ + name: operator, + displayName: niceOperators[operator] || operator, + code: operator, + icon: 'sort-numerically', + type: 'computed', + typeHint: 'number', + hideIcon: true, + i18nKey: operator, + jsTemplate: (vals) => `Math.${operator}(${vals.a}, ${vals.b})`, + lib: 'core.math', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'number', + required: true + }, { + type: 'argument', + key: 'b', + typeHint: 'number', + required: true + }] +}); + +const blocks: (IBlockComputedDeclaration | IBlockCommandDeclaration)[] = [ + ...numberOperators.map((operator) => makeOperator(operator, 'number')), + ...boolOperators.map((operator) => makeOperator(operator, 'boolean')), + ...mathUnaryOperators.map((operator) => makeMathUnary(operator)), + ...mathBinaryOperators.map((operator) => makeMathBinary(operator)), + { + name: 'convert to number', + i18nKey: 'convert to number', + type: 'computed', + code: 'convert to number', + icon: 'sort-numerically', + jsTemplate: (values) => `Number(${values.val})`, + lib: 'core.utils', + pieces: [{ + type: 'argument', + key: 'val', + typeHint: 'wildcard', + required: true + }], + typeHint: 'number' + } +]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/misc.ts b/src/node_requires/catnip/stdLib/misc.ts new file mode 100644 index 000000000..82c208c4f --- /dev/null +++ b/src/node_requires/catnip/stdLib/misc.ts @@ -0,0 +1,171 @@ +import {getOptions, optionsToStringObj} from './_utils'; + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'Block group', + type: 'command', + code: 'group', + icon: 'folder', + lib: 'core.misc', + hideIcon: true, + hideLabel: true, + i18nKey: 'Group', + isGroup: true, + customClass: 'group', + pieces: [{ + type: 'blocks', + key: 'blocks', + placeholder: 'putBlocksHere' + }], + jsTemplate: (values) => values.blocks +}, { + name: 'Note', + type: 'command', + code: 'note', + icon: 'message-circle', + lib: 'core.misc', + i18nKey: 'note', + pieces: [{ + type: 'textbox', + key: 'note' + }], + jsTemplate: (values) => `/* ${values.note} */`, + customClass: 'note' +}, { + type: 'command', + name: 'run script', + code: 'run script', + icon: 'code-alt', + lib: 'core.script', + i18nKey: 'run script', + pieces: [{ + type: 'argument', + typeHint: 'string', + assets: 'script', + key: 'name', + required: true + }, { + type: 'options', + allowCustom: true, + options: [] + }], + jsTemplate: (values, id, custom) => { + const options = getOptions({}, [], custom); + return `scripts[${values.name}](${options ? optionsToStringObj(options) : ''});`; + } +}, { + name: 'Execute js javascript code', + displayName: 'Execute JavaScript', + type: 'command', + code: 'js', + icon: 'code-alt', + lib: 'core.misc', + i18nKey: 'plainJs', + pieces: [{ + type: 'code', + key: 'code' + }], + jsTemplate: (values) => String(values.code) +}, { + code: 'define function', + type: 'command', + name: 'Define a function', + i18nKey: 'define function', + icon: 'function', + lib: 'core.misc', + pieces: [{ + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'store', + typeHint: 'wildcard', + required: true + }, { + type: 'blocks', + key: 'code' + }], + jsTemplate: values => `${values.store} = (options) => {\n ${values.code}\n};` +}, { + code: 'return', + type: 'command', + name: 'Return a value', + i18nKey: 'return', + icon: 'function', + lib: 'core.misc', + pieces: [{ + type: 'argument', + key: 'return', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (values) => `return ${values.return};` +}, { + code: 'execute function', + type: 'command', + name: 'Run a function', + i18nKey: 'execute function', + icon: 'function', + lib: 'core.misc', + pieces: [{ + type: 'argument', + key: 'func', + typeHint: 'wildcard', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store return value in', + i18nKey: 'store result in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard', + required: true + }, { + type: 'options', + allowCustom: true, + options: [] + }], + jsTemplate: (values, id, custom) => { + const options = getOptions({}, [], custom); + if (values.return) { + return `${values.return} = ${values.func}(${options ? optionsToStringObj(options) : ''});`; + } + return `${values.func}(${options ? optionsToStringObj(options) : ''});`; + } +}, { + code: 'get function option', + lib: 'core.misc', + type: 'computed', + name: 'get function\'s option', + i18nKey: 'get function option', + pieces: [{ + type: 'argument', + key: 'key', + typeHint: 'string', + required: true + }], + typeHint: 'wildcard', + icon: 'function', + jsTemplate: (values) => `options[${values.key}]` +}, { + name: 'color', + type: 'computed', + typeHint: 'color', + code: 'color', + icon: 'droplet', + lib: 'core.misc', + i18nKey: 'color', + pieces: [{ + type: 'argument', + typeHint: 'color', + key: 'color' + }], + jsTemplate: (values) => values.color +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/movement.ts b/src/node_requires/catnip/stdLib/movement.ts new file mode 100644 index 000000000..7cea5268a --- /dev/null +++ b/src/node_requires/catnip/stdLib/movement.ts @@ -0,0 +1,276 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'Move copy', + type: 'command', + code: 'move copy', + icon: 'move', + jsTemplate: () => 'this.move();', + lib: 'core.movement', + i18nKey: 'move copy', + pieces: [] +}, { + name: 'Change speed', + type: 'command', + code: 'set speed', + icon: 'move', + jsTemplate: (vals) => `this.speed = ${vals.speed};`, + lib: 'core.movement', + i18nKey: 'set speed', + pieces: [{ + type: 'argument', + key: 'speed', + typeHint: 'number', + required: true + }] +}, { + name: 'Change gravity', + type: 'command', + code: 'set gravity', + icon: 'move', + jsTemplate: (vals) => `this.gravity = ${vals.gravity};`, + lib: 'core.movement', + i18nKey: 'set gravity', + pieces: [{ + type: 'argument', + key: 'gravity', + typeHint: 'number', + required: true + }] +}, { + name: 'Change gravity direction', + type: 'command', + code: 'set gravityDir', + icon: 'move', + jsTemplate: (vals) => `this.gravityDir = ${vals.degreees};`, + lib: 'core.movement', + i18nKey: 'set gravityDir', + pieces: [{ + type: 'argument', + key: 'degreees', + typeHint: 'number', + required: true + }] +}, { + name: 'Change horizontal speed', + type: 'command', + code: 'set hspeed', + icon: 'move', + jsTemplate: (vals) => `this.hspeed = ${vals.speed};`, + lib: 'core.movement', + i18nKey: 'set hspeed', + pieces: [{ + type: 'argument', + key: 'speed', + typeHint: 'number', + required: true + }], + mutators: [{ + lib: 'core.movement', + code: 'set vspeed' + }] +}, { + name: 'Change vertical speed', + type: 'command', + code: 'set vspeed', + icon: 'move', + jsTemplate: (vals) => `this.vspeed = ${vals.speed};`, + lib: 'core.movement', + i18nKey: 'set vspeed', + pieces: [{ + type: 'argument', + key: 'speed', + typeHint: 'number', + required: true + }], + mutators: [{ + lib: 'core.movement', + code: 'set hspeed' + }] +}, { + name: 'Change direction', + type: 'command', + code: 'set direction', + icon: 'move', + jsTemplate: (vals) => `this.direction = ${vals.degrees};`, + lib: 'core.movement', + i18nKey: 'set direction', + pieces: [{ + type: 'argument', + key: 'degrees', + typeHint: 'number', + required: true + }] +}, { + name: 'Change x', + type: 'command', + code: 'set x', + icon: 'move', + jsTemplate: (vals) => `this.x = ${vals.pixels};`, + lib: 'core.movement', + i18nKey: 'set x', + pieces: [{ + type: 'argument', + key: 'pixels', + typeHint: 'number', + required: true + }], + mutators: [{ + lib: 'core.movement', + code: 'set y' + }] +}, { + name: 'Change y', + type: 'command', + code: 'set y', + icon: 'move', + jsTemplate: (vals) => `this.y = ${vals.pixels};`, + lib: 'core.movement', + i18nKey: 'set y', + pieces: [{ + type: 'argument', + key: 'pixels', + typeHint: 'number', + required: true + }], + mutators: [{ + lib: 'core.movement', + code: 'set x' + }] +}, { + name: 'get speed', + type: 'computed', + code: 'get speed', + icon: 'move', + jsTemplate: () => 'this.speed', + lib: 'core.movement', + i18nKey: 'get speed', + pieces: [], + typeHint: 'number' +}, { + name: 'get gravity', + type: 'computed', + code: 'get gravity', + icon: 'move', + jsTemplate: () => 'this.gravity', + lib: 'core.movement', + i18nKey: 'get gravity', + pieces: [], + typeHint: 'number' +}, { + name: 'get gravity direction', + type: 'computed', + code: 'get gravityDir', + icon: 'move', + jsTemplate: () => 'this.gravityDir', + lib: 'core.movement', + i18nKey: 'get gravityDir', + pieces: [], + typeHint: 'number' +}, { + name: 'get horizontal speed', + type: 'computed', + code: 'get hspeed', + icon: 'move', + jsTemplate: () => 'this.hspeed', + lib: 'core.movement', + i18nKey: 'get hspeed', + pieces: [], + typeHint: 'number', + mutators: [{ + lib: 'core.movement', + code: 'get vspeed' + }] +}, { + name: 'get vertical speed', + type: 'computed', + code: 'get vspeed', + icon: 'move', + jsTemplate: () => 'this.vspeed', + lib: 'core.movement', + i18nKey: 'get vspeed', + pieces: [], + typeHint: 'number', + mutators: [{ + lib: 'core.movement', + code: 'get hspeed' + }] +}, { + name: 'get direction', + type: 'computed', + code: 'get direction', + icon: 'move', + jsTemplate: () => 'this.direction', + lib: 'core.movement', + i18nKey: 'get direction', + pieces: [], + typeHint: 'number' +}, { + name: 'x', + type: 'computed', + code: 'x', + icon: 'move', + jsTemplate: () => 'this.x', + lib: 'core.movement', + pieces: [], + typeHint: 'number', + mutators: [{ + lib: 'core.movement', + code: 'y' + }] +}, { + name: 'y', + type: 'computed', + code: 'y', + icon: 'move', + jsTemplate: () => 'this.y', + lib: 'core.movement', + pieces: [], + typeHint: 'number', + mutators: [{ + lib: 'core.movement', + code: 'x' + }] +}, { + name: 'x of copy', + i18nKey: 'x of copy', + displayName: 'x of', + displayI18nKey: 'x of', + type: 'computed', + code: 'x of', + icon: 'move', + jsTemplate: (values) => `${values.copy}.x`, + lib: 'core.movement', + pieces: [{ + type: 'argument', + key: 'copy', + typeHint: 'wildcard', + required: true + }], + typeHint: 'number', + mutators: [{ + lib: 'core.movement', + code: 'y of' + }] +}, { + name: 'y of copy', + i18nKey: 'y of copy', + displayName: 'y of', + displayI18nKey: 'y of', + type: 'computed', + code: 'y of', + icon: 'move', + jsTemplate: (values) => `${values.copy}.y`, + lib: 'core.movement', + pieces: [{ + type: 'argument', + key: 'copy', + typeHint: 'wildcard', + required: true + }], + typeHint: 'number', + mutators: [{ + lib: 'core.movement', + code: 'x of' + }] +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/objects.ts b/src/node_requires/catnip/stdLib/objects.ts new file mode 100644 index 000000000..f90fc8e0e --- /dev/null +++ b/src/node_requires/catnip/stdLib/objects.ts @@ -0,0 +1,251 @@ +import {optionsToStringObj, getOptions} from './_utils'; + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'new object', + type: 'command', + lib: 'core.objects', + code: 'new object', + icon: 'code-alt', + i18nKey: 'new object', + pieces: [{ + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, { + type: 'options', + options: [], + allowCustom: true + }], + jsTemplate: (vals, id, custom) => { + const options = getOptions({}, [], custom) || {}; + return `${vals.return} = ${optionsToStringObj(options)};`; + } +}, { + name: 'Write property to self', + type: 'command', + code: 'this write', + icon: 'code-alt', + jsTemplate: (vals) => `this[${vals.property}] = ${vals.value};`, + lib: 'core.objects', + i18nKey: 'this write', + pieces: [{ + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'value', + i18nKey: 'value' + }, { + type: 'argument', + key: 'value', + typeHint: 'wildcard', + required: true + }] +}, { + name: 'Write property to current room', + displayName: 'Write', + type: 'command', + code: 'current room write', + icon: 'code-alt', + jsTemplate: (vals) => `rooms.current[${vals.property}] = ${vals.value};`, + lib: 'core.objects', + i18nKey: 'current room write', + displayI18nKey: 'write', + pieces: [{ + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'value', + i18nKey: 'value' + }, { + type: 'argument', + key: 'value', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'to current room', + i18nKey: 'to current room' + }] +}, { + name: 'Write property to object', + type: 'command', + code: 'object write', + icon: 'code-alt', + jsTemplate: (vals) => `${vals.object}[${vals.property}] = ${vals.value};`, + lib: 'core.objects', + i18nKey: 'write property to object', + displayName: 'Write', + displayI18nKey: 'write', + pieces: [{ + type: 'argument', + key: 'object', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'property', + i18nKey: 'property' + }, { + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'value', + i18nKey: 'value' + }, { + type: 'argument', + key: 'value', + typeHint: 'wildcard', + required: true + }] +}, { + name: 'read property from self', + i18nKey: 'this read', + displayI18nKey: 'read', + displayName: 'read', + type: 'computed', + lib: 'core.objects', + code: 'this read', + icon: 'code-alt', + pieces: [{ + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `this[${vals.property}]`, + typeHint: 'wildcard' +}, { + name: 'read property from room', + type: 'computed', + lib: 'core.objects', + code: 'room read', + icon: 'code-alt', + i18nKey: 'room read', + displayName: 'read', + displayI18nKey: 'read', + pieces: [{ + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'of current room', + i18nKey: 'of current room' + }], + jsTemplate: (vals) => `rooms.current[${vals.property}]`, + typeHint: 'wildcard' +}, { + name: 'read property from object', + type: 'computed', + lib: 'core.objects', + code: 'object read', + icon: 'code-alt', + i18nKey: 'object read', + displayI18nKey: 'read', + displayName: 'read', + pieces: [{ + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'from', + i18nKey: 'fromRead' + }, { + type: 'argument', + key: 'object', + typeHint: 'wildcard', + required: true + }], + jsTemplate: (vals) => `${vals.object}[${vals.property}]`, + typeHint: 'wildcard' +}, { + name: 'delete property in object', + type: 'command', + lib: 'core.objects', + code: 'object delete', + icon: 'code-alt', + i18nKey: 'object delete', + pieces: [{ + type: 'argument', + key: 'object', + typeHint: 'wildcard', + required: true + }, { + type: 'argument', + key: 'property', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `delete ${vals.object}[${vals.property}];` +}, { + name: 'deserialize object', + type: 'command', + code: 'json parse', + icon: 'code-alt', + lib: 'core.objects', + i18nKey: 'deserialize object', + pieces: [{ + type: 'argument', + key: 'object', + typeHint: 'string', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }], + jsTemplate: (vals) => `${vals.return} = JSON.parse(${vals.object});` +}, { + name: 'serialize object', + typeHint: 'string', + type: 'computed', + code: 'json stringify', + icon: 'code-alt', + lib: 'core.objects', + i18nKey: 'serialize object', + pieces: [{ + type: 'argument', + key: 'object', + typeHint: 'wildcard', + required: true + }], + documentationI18nKey: 'serialize object', + jsTemplate: (vals) => `JSON.stringify(${vals.object})` +}, { + name: 'new empty object', + type: 'computed', + code: 'new empty object', + icon: 'code-alt', + customClass: 'constant', + jsTemplate: () => '{}', + lib: 'core.objects', + i18nKey: 'new empty object', + pieces: [], + typeHint: 'wildcard' +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/propsVars.ts b/src/node_requires/catnip/stdLib/propsVars.ts new file mode 100644 index 000000000..46fd02710 --- /dev/null +++ b/src/node_requires/catnip/stdLib/propsVars.ts @@ -0,0 +1,193 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'this', + type: 'computed', + code: 'this', + icon: 'crosshair', + jsTemplate: () => 'this', + lib: 'core.propsVars', + typeHint: 'wildcard', + pieces: [], + i18nKey: 'this', + customClass: 'constant' +}, { + name: 'Set property variable value', + type: 'command', + code: 'set', + icon: 'code-alt', + jsTemplate: (vals) => `${vals.var} = ${vals.value};`, + lib: 'core.propsVars', + i18nKey: 'set property variable', + displayName: 'Set', + displayI18nKey: 'set', + pieces: [{ + type: 'argument', + key: 'var', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'value', + i18nKey: 'value' + }, { + type: 'argument', + key: 'value', + typeHint: 'wildcard', + required: true + }] +}, { + name: 'Increase property variable', + type: 'command', + code: 'increase', + icon: 'plus-circle', + jsTemplate: (vals) => `${vals.var} += ${vals.val};`, + lib: 'core.propsVars', + i18nKey: 'increase', + pieces: [{ + type: 'argument', + key: 'var', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'by', + i18nKey: 'changeBy' + }, { + type: 'argument', + key: 'val', + typeHint: 'number', + required: true + }] +}, { + name: 'Decrease property variable', + type: 'command', + code: 'decrease', + icon: 'minus-circle', + jsTemplate: (vals) => `${vals.var} -= ${vals.val};`, + lib: 'core.propsVars', + i18nKey: 'decrease', + pieces: [{ + type: 'argument', + key: 'var', + typeHint: 'wildcard', + required: true + }, { + type: 'label', + name: 'by', + i18nKey: 'changeBy' + }, { + type: 'argument', + key: 'val', + typeHint: 'number', + required: true + }] +}, { + name: 'Increment property variable', + type: 'command', + code: 'increment', + icon: 'plus-circle', + jsTemplate: (vals) => `${vals.var}++;`, + lib: 'core.propsVars', + i18nKey: 'increment', + pieces: [{ + type: 'argument', + key: 'var', + typeHint: 'wildcard', + required: true + }] +}, { + name: 'Decrement property variable', + type: 'command', + code: 'decrement', + icon: 'minus-circle', + jsTemplate: (vals) => `${vals.var}--;`, + lib: 'core.propsVars', + i18nKey: 'decrement', + pieces: [{ + type: 'argument', + key: 'var', + typeHint: 'wildcard', + required: true + }] +}]; + +const getMutatorsBut = (exclude: string) => blocks + .filter(b => b.code !== exclude && b.code !== 'this') + .map(b => ({ + lib: b.lib, + code: b.code + })); + +for (const block of blocks) { + block.mutators = getMutatorsBut(block.code); +} + +blocks.push({ + name: 'Save to storage', + type: 'command', + code: 'save localStorage', + icon: 'save', + jsTemplate: (vals) => `localStorage.setItem(${vals.key}, ${vals.value});`, + lib: 'core.propsVars', + i18nKey: 'save to storage', + pieces: [{ + type: 'argument', + key: 'key', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'value', + i18nKey: 'value' + }, { + type: 'argument', + key: 'value', + typeHint: 'string', + required: true + }] +}, { + name: 'Delete from storage', + type: 'command', + code: 'delete localStorage', + icon: 'save', + jsTemplate: (vals) => `localStorage.removeItem(${vals.key});`, + lib: 'core.propsVars', + i18nKey: 'delete from storage', + pieces: [{ + type: 'argument', + key: 'key', + typeHint: 'string', + required: true + }] +}, { + name: 'load from storage', + type: 'computed', + typeHint: 'string', + code: 'load localStorage', + icon: 'save', + jsTemplate: (vals) => `localStorage.getItem(${vals.key})`, + lib: 'core.propsVars', + i18nKey: 'load from storage', + pieces: [{ + type: 'argument', + key: 'key', + typeHint: 'string', + required: true + }] +}, { + name: 'is key in storage', + type: 'computed', + typeHint: 'boolean', + code: 'is localStorage', + icon: 'save', + jsTemplate: (vals) => `(${vals.key} in localStorage)`, + lib: 'core.propsVars', + i18nKey: 'is key in storage', + pieces: [{ + type: 'argument', + key: 'key', + typeHint: 'string', + required: true + }] +}); + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/rooms.ts b/src/node_requires/catnip/stdLib/rooms.ts new file mode 100644 index 000000000..1b4c691ec --- /dev/null +++ b/src/node_requires/catnip/stdLib/rooms.ts @@ -0,0 +1,108 @@ +import {optionsToStringObj, getOptions} from './_utils'; + +const roomOptions: IBlockOptions = { + type: 'options', + allowCustom: true, + options: [{ + key: 'isUi', + name: 'isUi', + i18nKey: 'isRoomUi', + typeHint: 'boolean' + }] +}; + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + code: 'rooms.append', + lib: 'core', + type: 'command', + name: 'Rooms append', + i18nKey: 'rooms Rooms append', + icon: 'room', + pieces: [ + { + type: 'argument', + key: 'name', + typeHint: 'string', + assets: 'room', + required: true + }, + { + type: 'filler' + }, + { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, + { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, + roomOptions + ], + jsTemplate: (values, id, custom) => { + const options = getOptions(values, ['isUi'], custom); + if (values.return && values.return !== 'undefined') { + return `${values.return} = rooms.append(${values.name}${options ? ', ' + optionsToStringObj(options) : ''});`; + } + return `rooms.append(${values.name}${options ? ', ' + optionsToStringObj(options) : ''});`; + }, + mutators: [{ + lib: 'core', + code: 'rooms.prepend' + }] +}, { + code: 'rooms.prepend', + lib: 'core', + type: 'command', + name: 'Rooms prepend', + i18nKey: 'rooms Rooms prepend', + icon: 'room', + pieces: [ + { + type: 'argument', + key: 'name', + typeHint: 'string', + assets: 'room', + required: true + }, + { + type: 'filler' + }, + { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, + { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, + roomOptions + ], + jsTemplate: (values, id, custom) => { + const options = getOptions(values, ['isUi'], custom); + if (values.return && values.return !== 'undefined') { + return `${values.return} = rooms.prepend(${values.name}${options ? ', ' + optionsToStringObj(options) : ''});`; + } + return `rooms.prepend(${values.name}${options ? ', ' + optionsToStringObj(options) : ''});`; + }, + mutators: [{ + lib: 'core', + code: 'rooms.append' + }] +}, { + name: 'copy\'s owning room', + type: 'computed', + code: 'owning room', + icon: 'room', + lib: 'core', + i18nKey: 'owning room', + typeHint: 'wildcard', + pieces: [], + jsTemplate: () => 'this.getRoom()' +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/settings.ts b/src/node_requires/catnip/stdLib/settings.ts new file mode 100644 index 000000000..5602ca0d4 --- /dev/null +++ b/src/node_requires/catnip/stdLib/settings.ts @@ -0,0 +1,31 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + type: 'command', + code: 'set ticker speed', + lib: 'core.settings', + name: 'Set game speed', + i18nKey: 'set game speed', + displayName: 'Set game speed to', + displayI18nKey: 'set game speed to', + icon: 'settings', + pieces: [{ + type: 'argument', + key: 'speed', + typeHint: 'number', + required: true + }], + jsTemplate: (values) => `pixiApp.ticker.speed = ${values.speed};` +}, { + type: 'computed', + typeHint: 'number', + code: 'get ticker speed', + lib: 'core.settings', + name: 'Get game speed', + i18nKey: 'get game speed', + displayName: 'game speed', + displayI18nKey: 'game speed', + icon: 'settings', + jsTemplate: () => 'pixiApp.ticker.speed', + pieces: [] +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/sounds.ts b/src/node_requires/catnip/stdLib/sounds.ts new file mode 100644 index 000000000..e0ba8123b --- /dev/null +++ b/src/node_requires/catnip/stdLib/sounds.ts @@ -0,0 +1,106 @@ +import {optionsToStringObj, getOptions} from './_utils'; + +const soundOptions: IBlockOptions = { + type: 'options', + options: [{ + key: 'volume', + name: 'volume', + i18nKey: 'soundVolume', + typeHint: 'number' + }, { + key: 'speed', + name: 'Speed', + i18nKey: 'speed', + typeHint: 'number' + }, { + key: 'start', + name: 'Start at', + i18nKey: 'start at', + typeHint: 'number' + }, { + key: 'loop', + name: 'Loop', + i18nKey: 'loop', + typeHint: 'boolean' + }, { + key: 'singleInstance', + name: 'Stop other instances', + i18nKey: 'soundSingleInstance', + typeHint: 'boolean' + }] +}; + +const getTemplate = (method: 'play' | 'playAt') => (values: Record): string => { + let prefix = ''; + if (values.return && values.return !== 'undefined') { + prefix = `${values.return} = `; + } + const options = getOptions(values, ['volume', 'speed', 'start', 'loop', 'singleInstance']); + if (options) { + return prefix + `sounds.${method}(${values.name}${method === 'playAt' ? ', ' + values.position : ''}, ${optionsToStringObj(options)});`; + } + return prefix + `sounds.${method}(${values.name}${method === 'playAt' ? ', ' + values.position : ''});`; +}; + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + code: 'sounds.play', + lib: 'core', + type: 'command', + name: 'Sounds play', + i18nKey: 'sounds Sounds play', + icon: 'music', + pieces: [{ + type: 'argument', + key: 'name', + typeHint: 'string', + assets: 'sound', + required: true + }, { + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, soundOptions], + jsTemplate: getTemplate('play') +}, { + code: 'sounds.playAt', + lib: 'core', + type: 'command', + name: 'Sounds play 3D', + i18nKey: 'sounds Sounds play at', + icon: 'music', + pieces: [{ + type: 'argument', + key: 'name', + typeHint: 'string', + assets: 'sound', + required: true + }, { + type: 'label', + name: 'at', + i18nKey: 'atPosition' + }, { + type: 'argument', + key: 'position', + typeHint: 'wildcard', + defaultConstant: 'this' + }, { + type: 'filler' + }, { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, soundOptions], + jsTemplate: getTemplate('playAt') +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/strings.ts b/src/node_requires/catnip/stdLib/strings.ts new file mode 100644 index 000000000..5d28ed352 --- /dev/null +++ b/src/node_requires/catnip/stdLib/strings.ts @@ -0,0 +1,451 @@ +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + name: 'Concatenate strings', + i18nKey: 'concatenate strings', + displayName: 'join', + displayI18nKey: 'join', + code: 'concat', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'string', + hideLabel: true, + jsTemplate: (vals) => `(${vals.a} + ${vals.b})`, + lib: 'core.strings', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'string', + required: true + }, { + type: 'label', + name: '+' + }, { + type: 'argument', + key: 'b', + typeHint: 'string', + required: true + }], + mutators: [{ + code: 'concat3', + lib: 'core.strings' + }] +}, { + name: 'Concatenate strings (triple)', + i18nKey: 'concatenate strings triple', + displayName: 'join', + displayI18nKey: 'join', + code: 'concat3', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'string', + hideLabel: true, + jsTemplate: (vals) => `(${vals.a} + ${vals.b} + ${vals.c})`, + lib: 'core.strings', + pieces: [{ + type: 'argument', + key: 'a', + typeHint: 'string', + required: true + }, { + type: 'label', + name: '+' + }, { + type: 'argument', + key: 'b', + typeHint: 'string', + required: true + }, { + type: 'label', + name: '+' + }, { + type: 'argument', + key: 'c', + typeHint: 'string', + required: true + }], + mutators: [{ + code: 'concat', + lib: 'core.strings' + }] +}, { + name: 'has a substring', + hideLabel: true, + i18nKey: 'hasSubstring', + code: 'hasSubstring', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'contains', + i18nKey: 'contains' + }, { + type: 'argument', + key: 'substring', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `${vals.string}.includes(${vals.substring})` +}, { + name: 'substring position', + i18nKey: 'substringPosition', + code: 'substringPosition', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'number', + pieces: [{ + type: 'argument', + key: 'substring', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'in', + i18nKey: 'inInside' + }, { + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `${vals.string}.indexOf(${vals.substring})` +}, { + name: 'string length', + i18nKey: 'stringLength', + displayName: 'length of', + displayI18nKey: 'lengthOf', + code: 'stringLength', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'number', + pieces: [{ + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `${vals.string}.length` +}, { + name: 'replace substring', + i18nKey: 'replace substring', + hideLabel: true, + code: 'replaceSubstring', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'string', + pieces: [{ + type: 'label', + name: 'inInside', + i18nKey: 'inInside' + }, { + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'replace', + i18nKey: 'replace' + }, { + type: 'argument', + key: 'substring', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'with', + i18nKey: 'with' + }, { + type: 'argument', + key: 'newString', + typeHint: 'string' + }], + jsTemplate: (vals) => `${vals.string}.replace(${vals.substring}, ${vals.newString})` +}, { + name: 'replace all substrings', + i18nKey: 'replace all substrings', + hideLabel: true, + code: 'replaceAllSubstrings', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'string', + pieces: [{ + type: 'label', + name: 'inInside', + i18nKey: 'inInside' + }, { + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'replace all', + i18nKey: 'replaceAll' + }, { + type: 'argument', + key: 'substring', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'with', + i18nKey: 'with' + }, { + type: 'argument', + key: 'newString', + typeHint: 'string' + }], + jsTemplate: (vals) => `${vals.string}.replaceAll(${vals.substring}, ${vals.newString})` +}, { + name: 'regex passes', + i18nKey: 'regex passes', + code: 'regexTest', + lib: 'core.strings', + icon: 'code-alt', + type: 'computed', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + key: 'regex', + typeHint: 'string', + required: true + }, { + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `new RegExp(${vals.regex}).test(${vals.string})` +}, { + name: 'replace by regex', + i18nKey: 'replace by regex', + hideLabel: true, + code: 'replaceSubstringRegex', + lib: 'core.strings', + icon: 'code-alt', + type: 'computed', + typeHint: 'string', + pieces: [{ + type: 'label', + name: 'inInside', + i18nKey: 'inInside' + }, { + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'replace by regex', + i18nKey: 'replaceByRegex' + }, { + type: 'argument', + key: 'regex', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'with', + i18nKey: 'with' + }, { + type: 'argument', + key: 'newString', + typeHint: 'string' + }], + jsTemplate: (vals) => `${vals.string}.replace(new RegExp(${vals.regex}), ${vals.newString})` +}, { + name: 'replace all substrings by regex', + i18nKey: 'replace all substrings by regex', + hideLabel: true, + code: 'replaceAllSubstringsRegex', + lib: 'core.strings', + icon: 'code-alt', + type: 'computed', + typeHint: 'string', + pieces: [{ + type: 'label', + name: 'inInside', + i18nKey: 'inInside' + }, { + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'replace all by regex', + i18nKey: 'replace all by regex' + }, { + type: 'argument', + key: 'regex', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'with', + i18nKey: 'with' + }, { + type: 'argument', + key: 'newString', + typeHint: 'string' + }], + jsTemplate: (vals) => `${vals.string}.replaceAll(new RegExp(${vals.regex}, 'g'), ${vals.newString})` +}, { + name: 'split by a substring', + i18nKey: 'split by a substring', + displayName: 'split', + displayI18nKey: 'split', + code: 'splitBySubstring', + lib: 'core.strings', + icon: 'grid', + type: 'computed', + typeHint: 'wildcard', + pieces: [{ + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'by', + i18nKey: 'by' + }, { + type: 'argument', + key: 'substring', + typeHint: 'string' + }], + jsTemplate: (vals) => `${vals.string}.split(${vals.substring})` +}, { + name: 'slice a string', + i18nKey: 'slice a string', + code: 'slice', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'string', + pieces: [{ + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }, { + type: 'label', + name: 'from', + i18nKey: 'fromDestination' + }, { + type: 'argument', + key: 'from', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'to', + i18nKey: 'toDestination' + }, { + type: 'argument', + key: 'to', + typeHint: 'number', + required: true + }], + jsTemplate: (vals) => `${vals.string}.slice(${vals.from}, ${vals.to})` +}, { + name: 'trim whitespace', + i18nKey: 'trim whitespace', + code: 'trimWhitespace', + lib: 'core.strings', + icon: 'string', + hideIcon: true, + type: 'computed', + typeHint: 'string', + pieces: [{ + type: 'argument', + key: 'string', + typeHint: 'string', + required: true + }], + jsTemplate: (vals) => `${vals.string}.trim()` +}, { + name: 'to uppercase', + i18nKey: 'to uppercase', + type: 'computed', + typeHint: 'string', + code: 'to uppercase', + icon: 'string', + hideIcon: true, + lib: 'core.strings', + pieces: [{ + type: 'argument', + key: 'val', + typeHint: 'string', + required: true + }], + jsTemplate: (values) => `${values.val}.toUpperCase()` +}, { + name: 'to lowercase', + i18nKey: 'to lowercase', + type: 'computed', + typeHint: 'string', + code: 'to lowercase', + icon: 'string', + hideIcon: true, + lib: 'core.strings', + pieces: [{ + type: 'argument', + key: 'val', + typeHint: 'string', + required: true + }], + jsTemplate: (values) => `${values.val}.toLowerCase()` +}, { + name: 'convert to string', + i18nKey: 'convert to string', + type: 'computed', + code: 'convert to string', + icon: 'string', + jsTemplate: (values) => `String(${values.val})`, + lib: 'core.utils', + pieces: [{ + type: 'argument', + key: 'val', + typeHint: 'wildcard', + required: true + }], + typeHint: 'string' +}, { + name: 'constant string', + i18nKey: 'const string', + type: 'computed', + code: 'const string', + icon: 'string', + jsTemplate: (values) => values.val, + lib: 'core.utils', + hideLabel: true, + documentationI18nKey: 'constant string', + pieces: [{ + type: 'argument', + key: 'val', + typeHint: 'string', + required: true + }], + typeHint: 'string' +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/templates.ts b/src/node_requires/catnip/stdLib/templates.ts new file mode 100644 index 000000000..7baf1fe17 --- /dev/null +++ b/src/node_requires/catnip/stdLib/templates.ts @@ -0,0 +1,162 @@ +import {getOptions, optionsToStringObj} from './_utils'; + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = [{ + code: 'templates.copy', + lib: 'core', + type: 'command', + name: 'Templates copy', + icon: 'template', + i18nKey: 'templates Templates copy', + documentation: 'Creates a new copy of a given template inside the current root room.\nA shorthand for `templates.copyIntoRoom(template, x, y, ct.room, exts)`\n\n**template** The name of the template to use\n**x** The x coordinate of a new copy. Defaults to 0.\n**y** The y coordinate of a new copy. Defaults to 0.\n**params** An optional object which parameters will be applied\nto the copy prior to its OnCreate event.\n\n**Returns** The created copy.', + pieces: [ + { + type: 'argument', + key: 'template', + typeHint: 'string', + assets: 'template', + required: true + }, + { + type: 'argument', + key: 'x', + typeHint: 'number' + }, + { + type: 'argument', + key: 'y', + typeHint: 'number' + }, + { + type: 'filler' + }, + { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, + { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, + { + type: 'options', + options: [], + allowCustom: true + } + ], + jsTemplate: (values, id, custom) => { + const options = getOptions({}, [], custom); + if (values.return && values.return !== 'undefined') { + return `${values.return} = templates.copy(${values.template}, ${values.x}, ${values.y}${options ? ', ' + optionsToStringObj(options) : ''});`; + } + return `templates.copy(${values.template}, ${values.x}, ${values.y}${options ? ', ' + optionsToStringObj(options) : ''});`; + }, + mutators: [{ + lib: 'core', + code: 'templates.copyIntoRoom' + }] +}, { + code: 'templates.copyIntoRoom', + lib: 'core', + type: 'command', + name: 'Templates copy into room', + icon: 'template', + i18nKey: 'templates Templates copy into room', + documentation: 'Creates a new copy of a given template inside a specific room.\n\n**template** The name of the template to use\n**x** The x coordinate of a new copy. Defaults to 0.\n**y** The y coordinate of a new copy. Defaults to 0.\n**room** The room to which add the copy.\nDefaults to the current room.\n**params** An optional object which parameters will be applied\nto the copy prior to its OnCreate event.\n\n**Returns** The created copy.', + pieces: [ + { + type: 'argument', + key: 'template', + typeHint: 'string', + assets: 'template', + required: true + }, + { + type: 'argument', + key: 'x', + typeHint: 'number' + }, + { + type: 'argument', + key: 'y', + typeHint: 'number' + }, + { + type: 'argument', + key: 'room', + typeHint: 'wildcard', + required: true + }, + { + type: 'filler' + }, + { + type: 'label', + name: 'store in', + i18nKey: 'store in' + }, + { + type: 'argument', + key: 'return', + typeHint: 'wildcard' + }, + { + type: 'options', + options: [], + allowCustom: true + } + ], + jsTemplate: (values, id, custom) => { + const options = getOptions({}, [], custom); + if (values.return && values.return !== 'undefined') { + return `${values.return} = templates.copyIntoRoom(${values.template}, ${values.x}, ${values.y}, ${values.room}${options ? ', ' + optionsToStringObj(options) : ''});`; + } + return `templates.copyIntoRoom(${values.template}, ${values.x}, ${values.y}, ${values.room}${options ? ', ' + optionsToStringObj(options) : ''});`; + }, + mutators: [{ + lib: 'core', + code: 'templates.copy' + }] +}, { + name: 'Kill copy', + type: 'command', + code: 'kill', + icon: 'template', + i18nKey: 'kill copy', + jsTemplate: () => 'this.kill = true;', + lib: 'core.templates', + pieces: [] +}, { + name: 'is copy', + type: 'computed', + code: 'is copy', + icon: 'template', + lib: 'core.templates', + i18nKey: 'is copy', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + typeHint: 'wildcard', + key: 'copy', + required: true + }], + jsTemplate: (values) => `templates.isCopy(${values.copy})` +}, { + name: 'is valid', + type: 'computed', + code: 'is valid', + icon: 'template', + lib: 'core.templates', + i18nKey: 'is valid', + typeHint: 'boolean', + pieces: [{ + type: 'argument', + typeHint: 'wildcard', + key: 'copy', + required: true + }], + jsTemplate: (values) => `templates.valid(${values.copy})` +}]; + +export default blocks; diff --git a/src/node_requires/catnip/stdLib/timers.ts b/src/node_requires/catnip/stdLib/timers.ts new file mode 100644 index 000000000..a854623c4 --- /dev/null +++ b/src/node_requires/catnip/stdLib/timers.ts @@ -0,0 +1,47 @@ +const makeTimerSetter = (index: number): IBlockCommandDeclaration => ({ + code: `set timer${index}`, + lib: 'core.timers', + type: 'command', + name: `Set timer ${index}`, + i18nKey: `set timer ${index}`, + displayName: `set timer ${index} to`, + displayI18nKey: `set timer ${index} to`, + icon: 'clock', + pieces: [{ + type: 'argument', + key: 'time', + typeHint: 'number', + required: true + }, { + type: 'label', + name: 'seconds', + i18nKey: 'secondsUnits' + }], + jsTemplate: values => `this.timer${index} = ${values.time};` +}); +const makeTimerGetter = (index: number): IBlockComputedDeclaration => ({ + code: `get timer${index}`, + lib: 'core.timers', + type: 'computed', + typeHint: 'number', + name: `get timer ${index}`, + i18nKey: `get timer ${index}`, + displayName: 'timer', + displayI18nKey: 'timer', + icon: 'clock', + pieces: [{ + type: 'label', + name: String(index) + }], + jsTemplate: () => `this.timer${index}` +}); + +const blocks: (IBlockCommandDeclaration | IBlockComputedDeclaration)[] = []; +for (let i = 1; i <= 6; i++) { + blocks.push(makeTimerSetter(i)); +} +for (let i = 1; i <= 6; i++) { + blocks.push(makeTimerGetter(i)); +} + +export default blocks; diff --git a/src/node_requires/catniplessTsHoverProvider.ts b/src/node_requires/catniplessTsHoverProvider.ts new file mode 100644 index 000000000..64a79fb76 --- /dev/null +++ b/src/node_requires/catniplessTsHoverProvider.ts @@ -0,0 +1,86 @@ +// This hover provider removes @catnip tags from documentation, +// but otherwise copies the source of monaco-editor's HoverProvider. + +/* eslint-disable id-blacklist */ +/* eslint-disable no-underscore-dangle */ +import type Monaco from 'monaco-editor'; +import type ts from 'typescript'; + +/** Custom hover provider that removes @catnip tags from documentation */ +const displayPartsToString = function (displayParts?: ts.SymbolDisplayPart[]) { + if (displayParts) { + return displayParts.map((displayPart) => displayPart.text).join(''); + } + return ''; +}; + +const tagToString = function (tag: ts.JSDocTagInfo) { + let tagLabel = `*@${tag.name}*`; + if (tag.name === 'param' && tag.text) { + const [paramName, ...rest] = tag.text; + tagLabel += `\`${paramName.text}\``; + if (rest.length > 0) { + tagLabel += ` — ${rest.map((r) => r.text).join(' ')}`; + } + } else if (Array.isArray(tag.text)) { + tagLabel += ` — ${tag.text.map((r) => r.text).join(' ')}`; + } else if (tag.text) { + tagLabel += ` — ${tag.text}`; + } + return tagLabel; +}; +export class HoverProvider { + private _worker: (uri: string) => Promise; + constructor(worker: (uri: string) => Promise) { + this._worker = worker; + } + // eslint-disable-next-line class-methods-use-this + _textSpanToRange(model: Monaco.editor.ITextModel & { + ctCodePrefix?: string; + }, span: ts.TextSpan): Monaco.IRange { + const p1 = model.getPositionAt(span.start); + const p2 = model.getPositionAt(span.start + span.length); + const {lineNumber: startLineNumber, column: startColumn} = p1; + const {lineNumber: endLineNumber, column: endColumn} = p2; + return { + startLineNumber, startColumn, endLineNumber, endColumn + }; + } + async provideHover(model: Monaco.editor.ITextModel & { + ctCodePrefix?: string; + }, position: Monaco.IPosition) { + const resource = model.uri.toString(); + const offset = model.getOffsetAt(position); + const worker = await this._worker(resource); + if (model.isDisposed()) { + return; + } + const info = await worker.getQuickInfoAtPosition( + resource.toString(), + offset + ) as ts.QuickInfo | undefined; + if (!info || model.isDisposed()) { + return; + } + const documentation = displayPartsToString(info.documentation); + const tags = info.tags ? + info.tags + .filter(tag => !tag.name.startsWith('catnip')) + .map((tag) => tagToString(tag)) + .join(' \n\n') : + ''; + const contents = displayPartsToString(info.displayParts); + // eslint-disable-next-line consistent-return + return { + range: this._textSpanToRange(model, info.textSpan), + contents: [ + { + value: '```typescript\n' + contents + '\n```\n' + }, + { + value: documentation + (tags ? '\n\n' + tags : '') + } + ] + }; + } +} diff --git a/src/node_requires/coffeescriptSuggestionProvider.js b/src/node_requires/coffeescriptSuggestionProvider.ts similarity index 63% rename from src/node_requires/coffeescriptSuggestionProvider.js rename to src/node_requires/coffeescriptSuggestionProvider.ts index d2338ee9b..654cc4653 100644 --- a/src/node_requires/coffeescriptSuggestionProvider.js +++ b/src/node_requires/coffeescriptSuggestionProvider.ts @@ -1,17 +1,6 @@ /* eslint-disable no-underscore-dangle */ -const {languages} = monaco; - -// The principle here is that we create an offscreen TypeScript document, -// put CoffeeScript statements into it with `@` replacement, and steal -// its code suggestions into another code editor. - -const enslavedModel = monaco.editor.createModel('', 'typescript'); -let workhorse; -languages.typescript.getTypeScriptWorker() -.then(worker => worker(enslavedModel.uri)) -.then(service => { - workhorse = service; -}); +import type Monaco from 'monaco-editor'; +import type ts from 'typescript'; // There's definitely something not used in this list, but whatever const workerToTSTypeMap = { @@ -27,9 +16,19 @@ const workerToTSTypeMap = { default: monaco.languages.CompletionItemKind.Text }; -module.exports.atCompletions = { - triggerCharacters: ['@', '.'], - provideCompletionItems: async (model, position) => { +// The principle here is that we create an offscreen TypeScript document, +// put CoffeeScript statements into it with `@` replacement, and steal +// its code suggestions into another code editor. +export class CompletionsProvider { + private _worker: (uri: string) => Promise; + constructor(worker: (uri: string) => Promise) { + this._worker = worker; + } + triggerCharacters = ['@', '.']; + completionsModel = monaco.editor.createModel('', 'typescript'); + async provideCompletionItems(model: Monaco.editor.ITextModel & { + ctCodePrefix?: string; + }, position: Monaco.IPosition) { const range = { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, @@ -41,16 +40,18 @@ module.exports.atCompletions = { if (currentLine.endsWith('@')) { currentLine = currentLine.slice(0, -1) + 'this.'; } - currentLine = currentLine.split(' ').pop(); + currentLine = currentLine.split(' ').pop()!; // Add type definitions set by a code-editor-scriptable tag. currentLine = (model.ctCodePrefix || 'function () {') + currentLine; currentLine += '\n}'; const suggestPos = currentLine.length - 1; - enslavedModel.setValue(currentLine); - const completions = await workhorse.getCompletionsAtPosition( - enslavedModel.uri.toString(), - suggestPos - ); + this.completionsModel.setValue(currentLine); + const client = await this._worker(this.completionsModel.uri.toString()); + const completions: ts.CompletionInfo | undefined = + await client.getCompletionsAtPosition( + this.completionsModel.uri.toString(), + suggestPos + ); if (!completions) { return { suggestions: [] @@ -61,9 +62,10 @@ module.exports.atCompletions = { .filter(completion => !completion.name.startsWith('_')) .map(completion => ({ label: completion.name, - kind: workerToTSTypeMap[completion.kind] || workerToTSTypeMap.default, + kind: workerToTSTypeMap[completion.kind as keyof typeof workerToTSTypeMap] || + workerToTSTypeMap.default, insertText: completion.insertText || completion.name })) }; } -}; +} diff --git a/src/node_requires/events/IEvent.d.ts b/src/node_requires/events/IEvent.d.ts index 05e979fff..19044b01c 100644 --- a/src/node_requires/events/IEvent.d.ts +++ b/src/node_requires/events/IEvent.d.ts @@ -5,13 +5,14 @@ declare interface IEventCategory { [key: string]: string; } -type EventApplicableEntities = 'template' | 'room'; +type EventApplicableEntities = 'template' | 'room' | 'behavior'; type EventArgumentTypes = 'integer' | 'float' | 'string' | 'boolean' | 'template' | 'room' | 'sound' | 'tandem' | 'font' | 'style' | 'texture' | 'action'; type EventCodeTargets = 'thisOnStep' | 'thisOnCreate' | 'thisOnDraw' | 'thisOnDestroy' | - 'rootRoomOnCreate' | 'rootRoomOnStep' | 'rootRoomOnDraw' | 'rootRoomOnLeave'; + 'rootRoomOnCreate' | 'rootRoomOnStep' | 'rootRoomOnDraw' | 'rootRoomOnLeave' | + 'thisOnAdded' | 'thisOnRemoved'; declare interface IEventArgumentDeclaration { name: string; diff --git a/src/node_requires/events/coreEventsActions.ts b/src/node_requires/events/coreEventsActions.ts index c1185e810..61294224b 100644 --- a/src/node_requires/events/coreEventsActions.ts +++ b/src/node_requires/events/coreEventsActions.ts @@ -44,12 +44,12 @@ coreEvents.core_OnActionPress.locals = { description: 'Current action\'s value' } }; -coreEvents.core_OnActionDown.inlineCodeTemplates.thisOnStep = ` +coreEvents.core_OnActionDown.inlineCodeTemplates!.thisOnStep = ` if (actions[/*%%action%%*/].down) { let value = actions[/*%%action%%*/].value; \n/*%%USER_CODE%%*/\n }`; -coreEvents.core_OnActionPress.inlineCodeTemplates.thisOnStep = ` +coreEvents.core_OnActionPress.inlineCodeTemplates!.thisOnStep = ` if (actions[/*%%action%%*/].pressed) { let value = actions[/*%%action%%*/].value; \n/*%%USER_CODE%%*/\n diff --git a/src/node_requires/events/coreEventsLifecycle.ts b/src/node_requires/events/coreEventsLifecycle.ts index f6eb58e5d..79f307385 100644 --- a/src/node_requires/events/coreEventsLifecycle.ts +++ b/src/node_requires/events/coreEventsLifecycle.ts @@ -60,6 +60,26 @@ const coreEvents = { inlineCodeTemplates: { thisOnDestroy: '{\n/*%%USER_CODE%%*/\n}' } + }, + core_OnBehaviorAdded: { + name: 'On behavior added', + applicable: ['behavior'], + icon: 'behavior', + category: 'lifecycle', + codeTargets: ['thisOnAdded'], + inlineCodeTemplates: { + thisOnAdded: '{\n/*%%USER_CODE%%*/\n}' + } + }, + core_OnBehaviorRemoved: { + name: 'On behavior removed', + applicable: ['behavior'], + icon: 'behavior', + category: 'lifecycle', + codeTargets: ['thisOnRemoved'], + inlineCodeTemplates: { + thisOnRemoved: '{\n/*%%USER_CODE%%*/\n}' + } } } as Record; diff --git a/src/node_requires/events/index.ts b/src/node_requires/events/index.ts index 6e36779b2..7b296b480 100644 --- a/src/node_requires/events/index.ts +++ b/src/node_requires/events/index.ts @@ -1,5 +1,6 @@ import {getLanguageJSON, localizeField} from '../i18n'; -import {getName, getById, getThumbnail} from './../resources'; +import {assetTypes, getById, getThumbnail} from '../resources'; +import {fieldTypeToTsType} from '../resources/content'; const categories: Record = { lifecycle: { @@ -60,7 +61,7 @@ const eventNameRegex = /^(\S+?)_(\S+)$/; * Returns the library and the event code from the full event key */ const splitEventName = (name: string): [string, string] => { - const result = eventNameRegex.exec(name); + const result = eventNameRegex.exec(name)!; return [result[1], result[2]]; }; @@ -105,7 +106,7 @@ const localizeProp = (eventFullCode: string, prop: string): string => { const event = events[eventFullCode]; if (lib === 'core') { if (timerPattern.test(eventCode)) { - return getLanguageJSON().scriptables[propToCoreDictionary[prop]].Timer.replace('$1', timerPattern.exec(eventCode)[1]); + return getLanguageJSON().scriptables[propToCoreDictionary[prop]].Timer.replace('$1', timerPattern.exec(eventCode)![1]); } return getLanguageJSON().scriptables[propToCoreDictionary[prop]][eventCode]; } @@ -123,9 +124,9 @@ const localizeParametrized = (eventFullCode: string, scriptedEvent: IScriptableE } for (const argName in event.arguments) { let value = scriptedEvent.arguments[argName]; - if (['template', 'room', 'sound', 'tandem', 'font', 'style', 'texture'].indexOf(event.arguments[argName].type) !== -1) { + if (assetTypes.indexOf(event.arguments[argName].type as resourceType) !== -1) { if (typeof value === 'string') { - value = getName(getById(null, value)); + value = getById(null, value).name; } else { value = '(Unset)'; } @@ -141,7 +142,7 @@ const localizeArgument = (eventFullCode: string, arg: string): string => { if (lib === 'core') { return getLanguageJSON().scriptables.coreEventsArguments[arg]; } - return localizeField(event.arguments[arg], 'name'); + return localizeField(event.arguments![arg], 'name'); }; const localizeLocalVarDesc = (eventFullCode: string, local: string): string => { const [lib, eventCode] = splitEventName(eventFullCode); @@ -149,7 +150,7 @@ const localizeLocalVarDesc = (eventFullCode: string, local: string): string => { if (lib === 'core') { return getLanguageJSON().scriptables.coreEventsLocals[`${eventCode}_${local}`]; } - return localizeField(event.locals[local], 'description'); + return localizeField(event.locals![local], 'description'); }; const tryGetIcon = (eventFullCode: string, scriptedEvent: IScriptableEvent): string | false => { const event = events[eventFullCode]; @@ -168,7 +169,7 @@ const tryGetIcon = (eventFullCode: string, scriptedEvent: IScriptableEvent): str return false; }; -const canUseBaseClass = (event: IEventDeclaration, baseClass?: TemplateBaseClass): boolean => { +const canUseBaseClass = (event: IEventDeclaration, baseClass: TemplateBaseClass): boolean => { if (!event.baseClasses || event.baseClasses.length === 0) { return true; } @@ -178,7 +179,8 @@ const canUseBaseClass = (event: IEventDeclaration, baseClass?: TemplateBaseClass const bakeCategories = function bakeCategories( entity: EventApplicableEntities, callback: (affixedData: IEventDeclaration) => void, - baseClass?: TemplateBaseClass + baseClass?: TemplateBaseClass, + isBehavior?: boolean ): EventMenu { const menu = { items: [] as IEventMenuSubmenu[] @@ -198,11 +200,11 @@ const bakeCategories = function bakeCategories( } }); } - const miscCategory = menu.items.find(s => s.affixedData.core && s.affixedData.key === 'misc'); + const miscCategory = menu.items.find(s => s.affixedData.core && s.affixedData.key === 'misc')!; for (const eventKey in events) { const event = events[eventKey]; // Filter out events for other entities - if (!event.applicable.includes(entity)) { + if (!event.applicable.includes(entity) && !(isBehavior && event.applicable.includes('behavior'))) { continue; } // Filter out events that require a specific base class @@ -236,7 +238,7 @@ const bakeCategories = function bakeCategories( return menu; }; -const getEventByLib = (event: string, libName: string): IEventDeclaration => +const getEventByLib = (event: string, libName: string): IEventDeclaration | undefined => events[`${libName}_${event}`]; const getArgumentsTypeScript = (event: IEventDeclaration): string => { @@ -249,6 +251,66 @@ const getArgumentsTypeScript = (event: IEventDeclaration): string => { } return code; }; +export const getLocals = (event: string, libName: string): string[] => { + const declaration = getEventByLib(event, libName)!; + if (!declaration.locals) { + return []; + } + return Object.keys(declaration.locals); +}; +export const getFieldsTypeScript = (asset: IScriptable | IScriptableBehaviors): string => { + let code = ''; + if ('behaviors' in asset) { + for (const behaviorId of asset.behaviors) { + const behavior = getById('behavior', behaviorId); + if (behavior.specification.length) { + code += '&{'; + for (const field of behavior.specification) { + code += `${field.name || field.readableName}: ${fieldTypeToTsType[field.type]};`; + } + code += behavior.extendTypes.split('\n').join(''); + code += '}'; + } + } + } + if (asset.type === 'behavior' && (asset as IBehavior).specification.length) { + const behavior = asset as IBehavior; + code += '&{'; + for (const field of behavior.specification) { + code += `${field.name || field.readableName}: ${fieldTypeToTsType[field.type]};`; + } + code += behavior.extendTypes.split('\n').join(''); + code += '}'; + } else if (asset.extendTypes) { + code += `&{${asset.extendTypes.split('\n').join('')}}`; + } + return code; +}; + +/** + * Returns an array of field names from this asset/behavior and all the linked behaviors. + * Mainly used for block code editor. + */ +export const getBehaviorFields = (asset: IScriptable | IScriptableBehaviors): string[] => { + const fields: string[] = []; + if ('behaviors' in asset) { + for (const behaviorId of asset.behaviors) { + const behavior = getById('behavior', behaviorId); + if (behavior.specification.length) { + for (const field of behavior.specification) { + fields.push(field.name || field.readableName); + } + } + } + } + if (asset.type === 'behavior' && (asset as IBehavior).specification.length) { + const behavior = asset as IBehavior; + for (const field of behavior.specification) { + fields.push(field.name || field.readableName); + } + } + return fields; +}; import {baseClassToTS} from '../resources/templates'; const baseTypes = `import {BasicCopy} from 'src/ct.release/templates';import {${Object.values(baseClassToTS).join(', ')}} from 'src/ct.release/templateBaseClasses/index';`; diff --git a/src/node_requires/exporter/ExporterError.ts b/src/node_requires/exporter/ExporterError.ts index bbb0f9719..eb1a71e56 100644 --- a/src/node_requires/exporter/ExporterError.ts +++ b/src/node_requires/exporter/ExporterError.ts @@ -5,7 +5,8 @@ interface IErrorRichInfo { resourceId?: assetRef, eventKey?: string, problematicCode?: string, - clue: 'syntax' | 'eventConfiguration' | 'emptySound' | 'emptyEmitter' | 'noTemplateTexture' | 'windowsFileLock' | 'unknown' + clue: 'syntax' | 'eventConfiguration' | 'eventMissing' | 'emptySound' | 'emptyEmitter' | 'noTemplateTexture' | + 'windowsFileLock' | 'unknown' | 'blockArgumentMissing' | 'blockDeclarationMissing' } export class ExporterError extends Error { @@ -56,14 +57,14 @@ export const highlightProblem = ( const lines = code.split('\n'); const output = []; let firstColumn, lastColumn, firstLine, lastLine; - if ('first_column' in location) { + if ('first_column' in location!) { firstColumn = location.first_column; firstLine = location.first_line; lastLine = location.last_line; lastColumn = location.last_column; } else { - firstColumn = lastColumn = location.column; - firstLine = lastLine = location.line - 1; + firstColumn = lastColumn = location!.column; + firstLine = lastLine = location!.line - 1; } // Take a couple of lines before the error output.push(...lines.slice(Math.max(0, firstLine - 2), firstLine + 1)); diff --git a/src/node_requires/exporter/_exporterContracts.ts b/src/node_requires/exporter/_exporterContracts.ts index 866f92a52..701eec5a3 100644 --- a/src/node_requires/exporter/_exporterContracts.ts +++ b/src/node_requires/exporter/_exporterContracts.ts @@ -3,15 +3,16 @@ /* eslint-disable @typescript-eslint/triple-slash-reference */ /* eslint-disable spaced-comment */ +/// +/// +/// /// /// /// /// /// -/// -/// -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; /** * @module @@ -147,7 +148,7 @@ export type ExportedTemplate = { loopAnimation: boolean; texture?: string; } | { - baseClass: 'Text'; + baseClass: 'Text' | 'BitmapText'; textStyle: string | -1; defaultText: string; } | { @@ -165,6 +166,7 @@ export type ExportedTemplate = { disabledTexture?: string; textStyle: string | -1; defaultText: string; + useBitmapText: boolean; } | { baseClass: 'RepeatingTexture'; scrollX: number; @@ -187,6 +189,7 @@ export type ExportedTemplate = { defaultText: string; fieldType: ITemplate['fieldType']; maxTextLength: number; + useBitmapText: boolean; } | { baseClass: 'ScrollBox'; nineSliceSettings: ITemplate['nineSliceSettings']; @@ -222,14 +225,16 @@ export type ExportedStyle = { dropShadowDistance?: number; } -export type ExportedSound = Omit & +export type ExportedSound = Omit & Partial>; export type ExportedBehaviorDynamic = { thisOnStep?: () => void, thisOnCreate?: () => void, thisOnDraw?: () => void, - thisOnDestroy?: () => void + thisOnDestroy?: () => void, + thisOnAdded?: () => void, + thisOnRemoved?: () => void }; export type ExportedBehavior = 'static' | ExportedBehaviorDynamic; diff --git a/src/node_requires/exporter/assetTree.ts b/src/node_requires/exporter/assetTree.ts index 336fec436..a3acfcf91 100644 --- a/src/node_requires/exporter/assetTree.ts +++ b/src/node_requires/exporter/assetTree.ts @@ -13,9 +13,7 @@ export const getAssetTree = (assets: folderEntries, project: IProject): }; } return { - name: ('name' in asset) ? - (asset as IAsset & {name: string}).name : - (asset as IFont).typefaceName, + name: asset.name, type: asset.type }; }); diff --git a/src/node_requires/exporter/emitterTandems.ts b/src/node_requires/exporter/emitterTandems.ts index cb43e9e9c..a640029f5 100644 --- a/src/node_requires/exporter/emitterTandems.ts +++ b/src/node_requires/exporter/emitterTandems.ts @@ -2,7 +2,7 @@ import {ExporterError} from './ExporterError'; import {ExportedTandems} from './_exporterContracts'; -import {getName, getById} from '../resources/'; +import {getById} from '../resources/'; export const stringifyTandems = (input: ITandem[]): string => { @@ -21,7 +21,7 @@ export const stringifyTandems = (input: ITandem[]): string => { } return { ...emitter, - texture: getName(getById('texture', emitter.texture)) + texture: getById('texture', emitter.texture).name }; }); } diff --git a/src/node_requires/exporter/fonts.ts b/src/node_requires/exporter/fonts.ts index 2ac37e1d5..4124dd79a 100644 --- a/src/node_requires/exporter/fonts.ts +++ b/src/node_requires/exporter/fonts.ts @@ -1,10 +1,12 @@ -const fs = require('fs-extra'); +import fs from 'fs-extra'; -export const stringifyFont = (font: IFont): string => ` +import {getPathToTtf} from '../resources/typefaces'; + +export const stringifyFont = (typeface: ITypeface, font: IFont): string => ` @font-face { - font-family: '${font.typefaceName}'; - src: url('fonts/${font.origname}.woff') format('woff'), - url('fonts/${font.origname}') format('truetype'); + font-family: '${typeface.name}'; + src: url('fonts/${font.uid}.woff') format('woff'), + url('fonts/${font.uid}.ttf') format('truetype'); font-weight: ${font.weight}; font-style: ${font.italic ? 'italic' : 'normal'}; }`; @@ -14,7 +16,7 @@ type fontsBundleResult = { js: string; }; export const bundleFonts = async function ( - input: IFont[], + input: ITypeface[], projdir: string, writeDir: string ): Promise { @@ -25,20 +27,26 @@ export const bundleFonts = async function ( js += 'if (document.fonts) { for (const font of document.fonts) { font.load(); }}'; await fs.ensureDir(writeDir + '/fonts'); const ttf2woff = require('ttf2woff'); - await Promise.all(input.map(async font => { - const fontData = await fs.readFile(`${projdir}/fonts/${font.origname}`); - var ttf = new Uint8Array(fontData); - let woff; - try { - woff = Buffer.from(ttf2woff(ttf).buffer); - } catch (e) { - window.alertify.error(`Whoah! A buggy ttf file in the font ${font.typefaceName} ${font.weight} ${font.italic ? 'italic' : 'normal'}. You should either fix it or find a new one.`); - throw e; - } - writePromises.push(fs.copy(`${projdir}/fonts/${font.origname}`, writeDir + '/fonts/' + font.origname)); - writePromises.push(fs.writeFile(writeDir + '/fonts/' + font.origname + '.woff', woff)); - css += stringifyFont(font); - })); + const promises: Promise[] = []; + for (const typeface of input) { + promises.push(...typeface.fonts.map(async font => { + const fontData = await fs.readFile(getPathToTtf(font, true)); + var ttf = new Uint8Array(fontData); + let woff; + try { + woff = Buffer.from(ttf2woff(ttf).buffer); + } catch (e) { + window.alertify.error(`Whoah! A buggy ttf file in the typeface ${typeface.name} ${font.weight} ${font.italic ? 'italic' : 'normal'}. You should either fix it or find a new one.`); + throw e; + } + await Promise.all([ + writePromises.push(fs.copy(getPathToTtf(font, true), writeDir + '/fonts/' + font.uid + '.ttf')), + writePromises.push(fs.writeFile(writeDir + '/fonts/' + font.uid + '.woff', woff)) + ]); + return stringifyFont(typeface, font); + })); + } + css += (await Promise.all(promises)).join('\n\n'); } await Promise.all(writePromises); @@ -73,14 +81,14 @@ const charCodeToXMLChar = (code: number): string => { export const generateXML = function generateXML( fontData: any, - ctFont: IFont, - typefaceName: string + ctTypeface: ITypeface, + font: IFont ): string { let XMLTemplate = ` - - + + - + `; @@ -97,60 +105,60 @@ export const generateXML = function generateXML( return XMLTemplate; }; +const {generateBitmapFont} = require('../resources/typefaces/bitmapFontGenerator'); /** - * @returns {Promise>} A promise that resolves into a map - * from font names to their XML file paths. + * @returns {Promise} A promise that resolves into an array of file paths to fonts' XML. */ -export const bakeBitmapFonts = function bakeBitmapFonts( - input: IFont[], +export const bakeBitmapFonts = async ( + input: ITypeface[], projdir: string, writeDir: string -): Promise> { - const generator = require('./../resources/fonts/bitmapFontGenerator'); +): Promise => { const path = require('path'); - return Promise.all(input.filter(font => font.bitmapFont) - .map(async font => { - const fCharsets = font.charsets || ['basicLatin']; - let letterList; - if (fCharsets.length === 1 && fCharsets[0] === 'allInFont') { - letterList = false; - } else { - letterList = fCharsets.reduce(( - acc: string, - charset: Exclude - ) => acc + (charSets[charset] || ''), ''); - } - if (fCharsets.indexOf('custom') !== -1) { - letterList += font.customCharset; - } - const settings = { - fill: '#ffffff', - // stroke: '#000000', - list: letterList, - height: font.bitmapFontSize, - margin: 2 - }; - const typefaceName = `${font.typefaceName}_${font.weight}${font.italic ? '_Italic' : ''}`, - xmlPath = `${font.uid}.xml`, + const bitmappableTypefaces = input.filter(typeface => typeface.bitmapFont); + const fontsMetadataUnflattened = await Promise.all(bitmappableTypefaces.map((typeface) => { + const fCharsets = typeface.charsets || ['basicLatin']; + let letterList; + if (fCharsets.length === 1 && fCharsets[0] === 'allInFont') { + letterList = false; + } else { + letterList = fCharsets.reduce(( + acc: string, + charset: Exclude + ) => acc + (charSets[charset] || ''), ''); + } + if (fCharsets.indexOf('custom') !== -1) { + letterList += typeface.customCharset!; + } + const settings = { + fill: '#ffffff', + // stroke: '#000000',l + list: letterList, + height: typeface.bitmapFontSize, + margin: 2, + pixelPerfect: typeface.bitmapPrecision, + typefaceName: typeface.name + }; + return Promise.all(typeface.fonts.map(async font => { + const xmlPath = `${font.uid}.xml`, pngPath = `${font.uid}.png`; - const fontPath = path.join(projdir, 'fonts', font.origname); - const drawData = await generator(fontPath, path.join(writeDir, `${font.uid}.png`), settings); - - const xml = generateXML(drawData, font, typefaceName); - + const fontPath = getPathToTtf(font, true); + const drawData = await generateBitmapFont(fontPath, path.join(writeDir, `${font.uid}.png`), { + ...settings, + fontOrigname: font.origname + }); + const xml = generateXML(drawData, typeface, font); await fs.writeFile(path.join(writeDir, `${font.uid}.xml`), xml, 'utf8'); - return { xmlPath, pngPath, - typefaceName + typefaceName: typeface.name, + weight: font.weight, + italic: font.italic }; - })) - .then(fontsMetadata => { - const bitmapFonts: Record = {}; - for (const font of fontsMetadata) { - bitmapFonts[font.typefaceName] = font.xmlPath; - } - return bitmapFonts; - }); + })); + })); + const fontsMetadata = fontsMetadataUnflattened.flat(1); + const bitmapFontsXML = fontsMetadata.map(m => m.xmlPath); + return bitmapFontsXML; }; diff --git a/src/node_requires/exporter/icons.ts b/src/node_requires/exporter/icons.ts index a8f2d6088..3be76d174 100644 --- a/src/node_requires/exporter/icons.ts +++ b/src/node_requires/exporter/icons.ts @@ -11,7 +11,7 @@ export const resizeIcon = async function ( soft: boolean ): Promise { const canvas = document.createElement('canvas'), - ctx = canvas.getContext('2d'); + ctx = canvas.getContext('2d')!; canvas.width = canvas.height = length; ctx.imageSmoothingQuality = soft ? 'high' : 'low'; // eslint-disable-next-line id-length diff --git a/src/node_requires/exporter/index.ts b/src/node_requires/exporter/index.ts index ebce19255..246898d72 100644 --- a/src/node_requires/exporter/index.ts +++ b/src/node_requires/exporter/index.ts @@ -28,7 +28,7 @@ import {stringifyScripts, getStartupScripts} from './scripts'; const typeScript = require('sucrase').transform; import {getByTypes} from '../resources'; -import {getVariantPath} from '../resources/sounds'; +import {getVariantPath} from '../resources/sounds/common'; import {getLanguageJSON} from './../i18n'; import {getExportDir} from './../platformUtils'; @@ -277,7 +277,7 @@ const exportCtProject = async ( } /* assets — run in parallel */ const texturesTask = packImages(assets.texture, writeDir, production); - const bitmapFontsTask = bakeBitmapFonts(assets.font, projdir, writeDir); + const bitmapFontsTask = bakeBitmapFonts(assets.typeface, projdir, writeDir); const favicons = bakeFavicons(project, writeDir, production); const modulesTask = addModules(); /* Run event cache population in parallel as well */ @@ -296,7 +296,7 @@ const exportCtProject = async ( // Process all the scriptables to get combined code for the root rooms await cacheHandle; - const fonts = await bundleFonts(assets.font, projdir, writeDir); + const typefaces = await bundleFonts(assets.typeface, projdir, writeDir); const rooms = stringifyRooms(assets, project); const templates = stringifyTemplates(assets, project); const behaviors = stringifyBehaviors(assets.behavior, project); @@ -341,11 +341,15 @@ const exportCtProject = async ( maxfps: Number(settings.rendering.maxFPS), transparent: Boolean(settings.rendering.transparent), + showErrors: settings.export.showErrors, + reportLink: JSON.stringify(settings.export.errorsLink || ''), + startroom: startroom.name, startwidth: startroom.width, startheight: startroom.height, viewMode: settings.rendering.viewMode, autocloseDesktop: settings.export.autocloseDesktop, + globalVars: project.globalVars?.length ? `let ${project.globalVars.join(', ')};` : '', atlases: (await texturesTask).atlases, tiledImages: (await texturesTask).tiledImages, @@ -364,7 +368,7 @@ const exportCtProject = async ( templates: templates.libCode, styles: stringifyStyles(assets.style), tandemTemplates: stringifyTandems(assets.tandem), - fonts: fonts.js, + fonts: typefaces.js, bitmapFonts: await bitmapFontsTask, userScripts, @@ -387,7 +391,7 @@ const exportCtProject = async ( /* CSS styles for rendering settings and branding */ let preloaderColor1 = project.settings.branding.accent, - preloaderColor2 = (global.brehautColor(preloaderColor1).getLuminance() < 0.5) ? '#ffffff' : '#000000'; + preloaderColor2 = (window.brehautColor(preloaderColor1).getLuminance() < 0.5) ? '#ffffff' : '#000000'; if (project.settings.branding.invertPreloaderScheme) { [preloaderColor1, preloaderColor2] = [preloaderColor2, preloaderColor1]; } @@ -397,7 +401,7 @@ const exportCtProject = async ( hidemadewithctjs: project.settings.branding.hideLoadingLogo, preloaderforeground: preloaderColor1, preloaderbackground: preloaderColor2, - fonts: fonts.css, + fonts: typefaces.css, accent: project.settings.branding.accent }, injections); if (!noMinify) { @@ -448,13 +452,13 @@ const exportCtProject = async ( iconRevision } ); - const htmlMinify = noMinify ? (void 0) : require('html-minifier').minify; + const htmlMinify = noMinify ? (void 0) : require('html-minifier-terser').minify; await Promise.all([ fs.writeFile( path.join(writeDir, '/index.html'), noMinify ? html : - htmlMinify(html, { + await htmlMinify(html, { removeComments: true, collapseWhitespace: true }) diff --git a/src/node_requires/exporter/desktopPackager.ts b/src/node_requires/exporter/packagers/desktop.ts similarity index 73% rename from src/node_requires/exporter/desktopPackager.ts rename to src/node_requires/exporter/packagers/desktop.ts index ace7923c4..a6a9f06a2 100644 --- a/src/node_requires/exporter/desktopPackager.ts +++ b/src/node_requires/exporter/packagers/desktop.ts @@ -1,13 +1,15 @@ import {join} from 'path'; import {tmpdir} from 'os'; import {readJson, readFile, outputJSON, outputFile, copy, mkdtemp, remove, ensureDir} from 'fs-extra'; -import {getBuildDir, isNodeInstalled} from '../platformUtils'; -import {getStartingRoom} from './rooms'; -import {getTextureOrig} from '../resources/textures'; - -const {bundleApp} = require('node_modules/@neutralinojs/neu/src/modules/bundler.js'); +import {getBuildDir} from '../../platformUtils'; +import {getStartingRoom} from '../rooms'; +import {getTextureOrig} from '../../resources/textures'; +const {bundleApp} = require('@neutralinojs/neu/src/modules/bundler.js'); const png2icons = require('png2icons'); +import * as resedit from 'resedit'; +// pe-library is a direct dependency of resedit +import * as peLibrary from 'pe-library'; const forbidden = /['"\\[\]():*?.]/g; @@ -109,48 +111,38 @@ export const exportForDesktop = async ( ); const iconPath = join(tempDir, 'icon.ico'); - /* - // eslint-disable-next-line no-eval - const resedit = (await eval('import(\'resedit-cli\')')).default; - await resedit({ - in: winPath, - out: winPath, - 'product-name': project.settings.authoring.title || 'A ct.js game', - 'product-version': project.settings.authoring.version.join('.') + '.0', - 'file-version': project.settings.authoring.version.join('.') + '.0', - 'company-name': project.settings.authoring.author || 'A ct.js game developer', - 'original-filename': `${project.settings.authoring.title || 'Ct.js game'}.exe`, - icon: [iconPath] + const exe = peLibrary.NtExecutable.from(await readFile(winPath)); + const res = peLibrary.NtExecutableResource.from(exe); + const iconBuffer = await readFile(iconPath); + const iconFile = resedit.Data.IconFile.from(iconBuffer); + // English (United States) + const EN_US = 1033; + resedit.Resource.IconGroupEntry.replaceIconsForResource( + res.entries, + 0, + EN_US, + iconFile.icons.map(i => i.data) + ); + const vi = resedit.Resource.VersionInfo.createEmpty(); + const [major, minor, patch] = project.settings.authoring.version; + vi.setFileVersion(major, minor, patch, 0, EN_US); + vi.setStringValues({ + lang: EN_US, + codepage: 1200 + }, { + CompanyName: project.settings.authoring.author || 'A ct.js game developer', + FileDescription: project.settings.authoring.title || 'A ct.js game', + FileVersion: project.settings.authoring.version.join('.') + '.0', + InternalName: project.settings.authoring.title || 'A ct.js game', + LegalCopyright: `Copyright © ${new Date().getFullYear()} ${project.settings.authoring.author || 'A ct.js game developer'}`, + OriginalFilename: `${project.settings.authoring.title || 'Ct.js game'}.exe`, + ProductName: project.settings.authoring.title || 'A ct.js game', + ProductVersion: project.settings.authoring.version.join('.') + '.0' }); - */ - if (isNodeInstalled) { - const execa = require('execa'); - try { - const {stdout} = await execa('node', [ - './node_modules/resedit-cli/dist/cli.js', - '--in', - winPath, - '--out', - winPath, - '--product-name', - project.settings.authoring.title || 'A ct.js game', - '--product-version', - project.settings.authoring.version.join('.') + '.0', - '--file-version', - project.settings.authoring.version.join('.') + '.0', - '--company-name', - project.settings.authoring.author || 'A ct.js game developer', - '--original-filename', - `${project.settings.authoring.title || 'Ct.js game'}.exe`, - '--icon', - iconPath - ]); - onProgress(stdout); - } catch (err) { - onProgress('Patching the windows executable failed!'); - onProgress(err); - } - } + vi.outputToResourceEntries(res.entries); + res.outputResource(exe); + const outBuffer = Buffer.from(exe.generate()); + await outputFile(winPath, outBuffer); onProgress('Sorting the artifacts by platform…'); const buildDir = await getBuildDir(); diff --git a/src/node_requires/exporter/mobilePackager.ts b/src/node_requires/exporter/packagers/mobile.ts similarity index 94% rename from src/node_requires/exporter/mobilePackager.ts rename to src/node_requires/exporter/packagers/mobile.ts index b88c18ace..f1ca6202f 100644 --- a/src/node_requires/exporter/mobilePackager.ts +++ b/src/node_requires/exporter/packagers/mobile.ts @@ -1,11 +1,11 @@ import {join} from 'path'; import fs from 'fs-extra'; -const execa = require('execa'); +import {execa} from 'execa'; -import {getBuildDir} from '../platformUtils'; -import {getDOMImageFromTexture} from '../resources/textures'; -import {imageCover, imageContain, imagePlaceInRect, imageRound, outputCanvasToFile} from '../utils/imageUtils'; +import {getBuildDir} from '../../platformUtils'; +import {getDOMImageFromTexture} from '../../resources/textures'; +import {imageCover, imageContain, imagePlaceInRect, imageRound, outputCanvasToFile} from '../../utils/imageUtils'; // @see https://cordova.apache.org/docs/en/latest/config_ref/images.html const androidIcons: Record = { @@ -83,7 +83,7 @@ export const exportMobile = async ( '--save' ], execaConfig)).stdout); onProgress((await execa('node', [ - './node_modules/@capacitor/cli/bin/capacitor', + './@capacitor/cli/bin/capacitor', 'init', settings.authoring.title || 'Ct.js game', appId, @@ -92,7 +92,7 @@ export const exportMobile = async ( ], execaConfig)).stdout); onProgress('Adding Android platform…'); onProgress((await execa('node', [ - './node_modules/@capacitor/cli/bin/capacitor', + './@capacitor/cli/bin/capacitor', 'add', 'android' ], execaConfig)).stdout); @@ -176,7 +176,7 @@ export const exportMobile = async ( onProgress('Fetching available emulator devices…'); const [, , device] = (await execa('node', [ - './node_modules/@capacitor/cli/bin/capacitor', + './@capacitor/cli/bin/capacitor', 'run', '--list', 'android' @@ -188,7 +188,7 @@ export const exportMobile = async ( onProgress('Baking APK…'); onProgress((await execa('node', [ - './node_modules/@capacitor/cli/bin/capacitor', + './@capacitor/cli/bin/capacitor', 'run', '--target', device, diff --git a/src/node_requires/exporter/packagers/web.ts b/src/node_requires/exporter/packagers/web.ts new file mode 100644 index 000000000..dd066c323 --- /dev/null +++ b/src/node_requires/exporter/packagers/web.ts @@ -0,0 +1,26 @@ +import fs from 'fs-extra'; +import path from 'path'; +import {getBuildDir, getExportDir} from '../../platformUtils'; +import Archive from 'adm-zip'; + +/** + * Exports the project, zips it and returns the path to the output file. + * The resulting file can be directly used on itch.io and similar platforms. + */ +export const exportForWeb = async (): Promise => { + const buildFolder = await getBuildDir(); + const runCtExport = require('src/node_requires/exporter').exportCtProject; + const exportFile = path.join( + buildFolder, + `${window.currentProject.settings.authoring.title || 'ct.js game'}.zip` + ); + const inDir = await getExportDir(); + + await fs.remove(exportFile); + await runCtExport(window.currentProject, window.projdir, true); + + const archive = new Archive(); + await archive.addLocalFolderPromise(inDir, {}); + await archive.writeZipPromise(exportFile); + return exportFile; +}; diff --git a/src/node_requires/exporter/rooms.ts b/src/node_requires/exporter/rooms.ts index 6b94f06a1..be13ffbf1 100644 --- a/src/node_requires/exporter/rooms.ts +++ b/src/node_requires/exporter/rooms.ts @@ -110,6 +110,9 @@ const stringifyRooms = ( const exportableCopy = { ...copy, template: getById('template', copy.uid).name + } as ExportedCopy & { + uid?: string; + bindings?: unknown; }; delete exportableCopy.uid; delete exportableCopy.bindings; diff --git a/src/node_requires/exporter/scriptableProcessor.ts b/src/node_requires/exporter/scriptableProcessor.ts index 0073dfbb8..3896c276a 100644 --- a/src/node_requires/exporter/scriptableProcessor.ts +++ b/src/node_requires/exporter/scriptableProcessor.ts @@ -1,14 +1,15 @@ type ScriptableCode = Record; import {ExporterError, highlightProblem} from './ExporterError'; -const {getEventByLib} = require('../events'); +import {getEventByLib} from '../events'; import {readFile} from 'fs-extra'; -import {getName, getById} from '../resources'; +import {getById} from '../resources'; import {getModulePathByName, loadModuleByName} from './../resources/modules'; import {join} from 'path'; import {embedStaticBehaviors} from './behaviors'; -const coffeeScript = require('coffeescript'); +const compileCoffee = require('coffeescript').CoffeeScript.compile; const typeScript = require('sucrase').transform; +import {compile, resetSafeId} from '../catnip/compiler'; export const coffeeScriptOptions = { sourceMap: false, @@ -42,7 +43,7 @@ const populateEventCache = async (project: IProject): Promise { return eventsCache[cacheName]; }; -// eslint-disable-next-line max-lines-per-function +// eslint-disable-next-line max-lines-per-function, complexity const getBaseScripts = function (entity: IScriptable, project: IProject): ScriptableCode { const domains = { thisOnStep: '', thisOnCreate: '', thisOnDraw: '', thisOnDestroy: '', + thisOnAdded: '', + thisOnRemoved: '', rootRoomOnCreate: '', rootRoomOnStep: '', rootRoomOnDraw: '', @@ -90,9 +93,20 @@ const getBaseScripts = function (entity: IScriptable, project: IProject): Script let {code} = event; try { // Apply converters to the user's code first if (project.language === 'coffeescript') { - code = coffeeScript.compile(code, coffeeScriptOptions); + code = compileCoffee((code as string), coffeeScriptOptions); + } else if (project.language === 'catnip') { + code = compile(code as BlockScript, { + resourceId: entity.uid, + resourceName: entity.name, + resourceType: entity.type, + eventKey + }); + if (event?.variables?.length) { + code = `let ${event.variables.join(', ')};\n` + code; + } + resetSafeId(); } else if (project.language === 'typescript') { - if (code.trim()) { + if ((code as string).trim()) { ({code} = typeScript(code, { transforms: ['typescript'] })); @@ -101,6 +115,9 @@ const getBaseScripts = function (entity: IScriptable, project: IProject): Script } } } catch (e) { + if (e instanceof ExporterError) { + throw e; + } const errorMessage = `${e.name || 'An error'} occured while compiling ${eventKey} (${lib}) event of ${entity.name} ${entity.type}`; const exporterError = new ExporterError(errorMessage, { resourceId: entity.uid, @@ -113,13 +130,25 @@ const getBaseScripts = function (entity: IScriptable, project: IProject): Script throw exporterError; } const eventArgs = event.arguments; - const eventSpec = getEventByLib(eventKey, lib) as IEventDeclaration; + const eventSpec = getEventByLib(eventKey, lib); + if (!eventSpec) { + const exporterError = new ExporterError(`Could not find an event ${eventKey} from library ${lib}. Did you disable its catmod?`, { + resourceId: entity.uid, + resourceName: entity.name, + resourceType: entity.type, + clue: 'eventMissing' + }); + throw exporterError; + } const requiredArgs = eventSpec.arguments || {}; for (const target of eventSpec.codeTargets) { let resultingCode: string; // Add a preamble to each event for easier debugging by users resultingCode = `/* ${entity.type} ${entity.name} — ${event.lib}_${event.eventKey} (${eventSpec.name} event) */\n`; if (lib === 'core') { + if (!eventSpec.inlineCodeTemplates) { + throw new Error(`Found a misconfuguration in event ${event.lib}_${event.eventKey} (no inlineCodeTemplate for ${target}). This is a ct.js bug.`); + } resultingCode += eventSpec.inlineCodeTemplates[target]; } else { resultingCode += getFromCache(event, target); @@ -136,9 +165,9 @@ const getBaseScripts = function (entity: IScriptable, project: IProject): Script throw exporterError; } const exp = new RegExp(`/\\*%%${argCode}%%\\*/`, 'g'); - const argType = eventSpec.arguments[argCode].type; + const argType = eventSpec.arguments![argCode].type; if (['template', 'room', 'sound', 'tandem', 'font', 'style', 'texture'].indexOf(argType) !== -1) { - const value = getName(getById(argType, String(eventArgs[argCode]))); + const value = getById(argType, String(eventArgs[argCode])).name; resultingCode = resultingCode.replace(exp, `'${value.replace(/'/g, '\\\'')}'`); } else if (typeof eventArgs[argCode] === 'string') { // Wrap the value into singular quotes, escape existing quotes @@ -149,7 +178,7 @@ const getBaseScripts = function (entity: IScriptable, project: IProject): Script } resultingCode = resultingCode.replace(/\/\*%%ENTITY_TYPE%%\*\//g, `'${entity.type}'`); resultingCode = resultingCode.replace(/\/\*%%ENTITY_NAME%%\*\//g, `'${entity.name}'`); - resultingCode = resultingCode.replace(/\/\*%%USER_CODE%%\*\//g, code); + resultingCode = resultingCode.replace(/\/\*%%USER_CODE%%\*\//g, code as string); domains[target] += resultingCode; domains[target] += '\n'; } diff --git a/src/node_requires/exporter/scripts.ts b/src/node_requires/exporter/scripts.ts index 7016e012a..ff2c02238 100644 --- a/src/node_requires/exporter/scripts.ts +++ b/src/node_requires/exporter/scripts.ts @@ -1,7 +1,7 @@ import {ExporterError, highlightProblem} from './ExporterError'; import {coffeeScriptOptions} from './scriptableProcessor'; -const coffeeScript = require('coffeescript'); +const compileCoffee = require('coffeescript').CoffeeScript.compile; const typeScript = require('sucrase').transform; export const stringifyScripts = (scripts: IScript[]): string => @@ -9,7 +9,7 @@ export const stringifyScripts = (scripts: IScript[]): string => let code; try { // Apply converters to the user's code first code = script.language === 'coffeescript' ? - coffeeScript.compile(script.code, coffeeScriptOptions) : + compileCoffee(script.code, coffeeScriptOptions) : typeScript(script.code, { transforms: ['typescript'] }).code; diff --git a/src/node_requires/exporter/sounds.ts b/src/node_requires/exporter/sounds.ts index 6bc47b59e..b01c8766d 100644 --- a/src/node_requires/exporter/sounds.ts +++ b/src/node_requires/exporter/sounds.ts @@ -14,21 +14,22 @@ export const getSounds = (input: ISound[]): ExportedSound[] => { }); throw exporterError; } - - sounds.push({ + const out: ExportedSound = { name: s.name, variants: s.variants.map((v) => ({ uid: v.uid, source: `./snd/${v.uid}.${v.source.slice(-3)}` })), preload: s.preload, - volume: (s.volume.enabled && s.volume) || void 0, - pitch: (s.pitch.enabled && s.pitch) || void 0, - distortion: (s.distortion.enabled && s.distortion) || void 0, - reverb: (s.reverb.enabled && s.reverb) || void 0, - eq: (s.eq.enabled && s.eq) || void 0, panning: s.panning - }); + }; + const keys = ['volume', 'pitch', 'eq', 'distortion', 'reverb'] as const; + for (const k of keys) { + if (s[k].enabled) { + (out as any)[k] = s[k]; + } + } + sounds.push(out); } return sounds; }; diff --git a/src/node_requires/exporter/templates.ts b/src/node_requires/exporter/templates.ts index ac1b09d46..613b139f0 100644 --- a/src/node_requires/exporter/templates.ts +++ b/src/node_requires/exporter/templates.ts @@ -16,7 +16,7 @@ interface IBlankTexture { shape: any; } -// eslint-disable-next-line complexity +// eslint-disable-next-line complexity, max-lines-per-function const getBaseClassInfo = (blankTextures: IBlankTexture[], template: ITemplate) => { let classInfo = ''; const bc = template.baseClass; @@ -41,7 +41,7 @@ const getBaseClassInfo = (blankTextures: IBlankTexture[], template: ITemplate) = anchorY: ${blankTexture.anchorY}, height: ${blankTexture.height}, width: ${blankTexture.width},`; - } else if (template.texture !== -1) { + } else if (template.texture && template.texture !== -1) { classInfo += ` texture: "${getById('texture', template.texture).name}",`; } else { @@ -74,6 +74,10 @@ const getBaseClassInfo = (blankTextures: IBlankTexture[], template: ITemplate) = } classInfo += ` defaultText: ${JSON.stringify(template.defaultText)},`; + if (hasCapability(bc, 'embeddedText')) { + classInfo += ` + useBitmapText: ${template.useBitmapText},`; + } } if (hasCapability(bc, 'textInput')) { classInfo += ` @@ -86,13 +90,13 @@ const getBaseClassInfo = (blankTextures: IBlankTexture[], template: ITemplate) = } if (hasCapability(bc, 'scroller')) { classInfo += ` - scrollX: ${template.tilingSettings.scrollSpeedX}, - scrollY: ${template.tilingSettings.scrollSpeedY}, - isUi: ${template.tilingSettings.isUi},`; + scrollX: ${template.tilingSettings!.scrollSpeedX}, + scrollY: ${template.tilingSettings!.scrollSpeedY}, + isUi: ${template.tilingSettings!.isUi},`; } if (hasCapability(bc, 'repeater')) { classInfo += ` - spriteCount: ${template.repeaterSettings.defaultCount},`; + spriteCount: ${template.repeaterSettings!.defaultCount},`; } return classInfo; }; diff --git a/src/node_requires/exporter/textures.ts b/src/node_requires/exporter/textures.ts index 48fb48fb5..a5f71b601 100644 --- a/src/node_requires/exporter/textures.ts +++ b/src/node_requires/exporter/textures.ts @@ -36,23 +36,23 @@ export const getTextureShape = (texture: ITexture): TextureShape => { if (texture.shape === 'rect') { return { type: 'rect', - top: texture.top, - bottom: texture.bottom, - left: texture.left, - right: texture.right + top: texture.top || 0, + bottom: texture.bottom || 0, + left: texture.left || 0, + right: texture.right || 0 }; } if (texture.shape === 'circle') { return { type: 'circle', - r: texture.r + r: texture.r || 0 }; } if (texture.shape === 'strip') { return { type: 'strip', - points: texture.stripPoints, - closedStrip: texture.closedStrip + points: texture.stripPoints!, + closedStrip: texture.closedStrip || false }; } return { @@ -145,9 +145,8 @@ const drawAtlasFromBin = (bin: packerBin, binInd: number) => { const atlas = document.createElement('canvas'); atlas.width = bin.width; atlas.height = bin.height; - const cx = atlas.getContext('2d'); + const cx = atlas.getContext('2d')!; cx.imageSmoothingQuality = 'low'; - // eslint-disable-next-line id-length cx.imageSmoothingEnabled = false; const atlasJSON = { @@ -253,7 +252,7 @@ const getPackerFor = (textures: ITexture[], spritedTextures: ITexture[]) => { const packer = new Packer(...packerSettings); const animationsByTextures = spritedTextures .map(getTextureFrameCrops); - const animations = [].concat(...animationsByTextures); + const animations = ([] as typeof animationsByTextures[0]).concat(...animationsByTextures); const getFailedPacks = () => { const failedPacks: string[] = []; const allTags: Record = {}; @@ -369,7 +368,7 @@ export const packImages = async ( // Output all the atlases into JSON and WebP files const atlases: string[] = []; packer.bins.map(drawAtlasFromBin).forEach((atlas: exportedTextureAtlas, ind: number) => { - let jsonHash: string; + let jsonHash: string | undefined; for (const format of formats) { const atlasBase64 = atlas.canvas.toDataURL(`image/${format}`, 1).replace(/^data:image\/\w+;base64,/, ''); const buf = Buffer.from(atlasBase64, 'base64'); @@ -391,7 +390,7 @@ export const packImages = async ( } } if (production) { - atlases.push(`./img/a${ind}${pixiMask}.${jsonHash}.json`); + atlases.push(`./img/a${ind}${pixiMask}.${jsonHash!}.json`); } else { atlases.push(`./img/a${ind}${pixiMask}.json`); } @@ -411,7 +410,7 @@ export const packImages = async ( } const ind = packer.bins.length + btInd; const atlas = drawAtlasFromBin(bigPacker.bins[0], ind); - let jsonHash: string; + let jsonHash: string | undefined; for (const format of formats) { const atlasBase64 = atlas.canvas.toDataURL(`image/${format}`, 1).replace(/^data:image\/\w+;base64,/, ''); const buf = Buffer.from(atlasBase64, 'base64'); @@ -422,7 +421,7 @@ export const packImages = async ( if (!jsonHash) { jsonHash = revHash(json); } - writePromises.push(fs.outputJSON(`${writeDir}/img/a${ind}.${format}.${jsonHash}.json`, atlas.json)); + writePromises.push(fs.outputJSON(`${writeDir}/img/a${ind}.${format}.${jsonHash!}.json`, atlas.json)); writePromises.push(fs.writeFile(`${writeDir}/img/a${ind}.${imageHash}.${format}`, buf)); } else { writePromises.push(fs.outputJSON(`${writeDir}/img/a${ind}.${format}.json`, atlas.json)); @@ -430,7 +429,7 @@ export const packImages = async ( } } if (production) { - atlases.push(`./img/a${ind}${pixiMask}.${jsonHash}.json`); + atlases.push(`./img/a${ind}${pixiMask}.${jsonHash!}.json`); } else { atlases.push(`./img/a${ind}${pixiMask}.json`); } @@ -442,7 +441,7 @@ export const packImages = async ( for (const tex of tiledTextures) { const atlas = document.createElement('canvas'), img = getDOMTexture(tex); - const cx = atlas.getContext('2d'); + const cx = atlas.getContext('2d')!; atlas.width = tex.width; atlas.height = tex.height; cx.drawImage(img, 0, 0); @@ -455,15 +454,15 @@ export const packImages = async ( } }; // Use one hash for both formats to simplify loading on Pixi.js side. - let imageHash: string; + let imageHash: string | undefined; for (const format of formats) { const buf = Buffer.from(atlas.toDataURL(`image/${format}`, 1).replace(/^data:image\/\w+;base64,/, ''), 'base64'); if (production) { if (!imageHash) { imageHash = revHash(buf); - tiledImages[tex.name].source = `./img/t${tiledCounter}.${imageHash}${pixiMask}`; + tiledImages[tex.name].source = `./img/t${tiledCounter}.${imageHash!}${pixiMask}`; } - writePromises.push(fs.writeFile(`${writeDir}/img/t${tiledCounter}.${imageHash}.${format}`, buf)); + writePromises.push(fs.writeFile(`${writeDir}/img/t${tiledCounter}.${imageHash!}.${format}`, buf)); } else { writePromises.push(fs.writeFile(`${writeDir}/img/t${tiledCounter}.${format}`, buf)); } diff --git a/src/node_requires/exporter/utils.ts b/src/node_requires/exporter/utils.ts index 9e47c4859..77c534afe 100644 --- a/src/node_requires/exporter/utils.ts +++ b/src/node_requires/exporter/utils.ts @@ -36,12 +36,8 @@ export const getUnwrappedExtends = (exts: Record): Record { try { const asset = getById(fieldMap[i].type, elt); - if (asset.type === 'font') { - return asset.typefaceName; - } return asset.name; } catch (e) { alertify.error(`Could not resolve UID ${elt} for field ${i} as a ${fieldMap[i].type}. Returning -1. Full object: ${JSON.stringify(exts)}`); diff --git a/src/node_requires/extendGlobals.d.ts b/src/node_requires/extendGlobals.d.ts index 77aed87c2..5f921e694 100644 --- a/src/node_requires/extendGlobals.d.ts +++ b/src/node_requires/extendGlobals.d.ts @@ -2,13 +2,27 @@ type observable = { trigger(name: string, eventArg?: T): void; on(name: string, callback: (eventArg?: T) => void): void; off(name: string, callback: (eventArg?: T) => void): void; - once(name: string, callback: (eventArg?: T) => void): void + one(name: string, callback: (eventArg?: T) => void): void }; +interface IOpenDialogOptions { + openDirectory?: boolean; + defaultPath?: string; + title?: string; + multiple?: boolean; + filter?: string; + saveAs?: boolean; +} +interface ISaveDialogOptions { + defaultPath?: string; + defaultName?: string; + filter?: string; +} + export {}; declare global { var signals: observable; - var orders: any; + var orders: observable; var alertify: any; var brehautColor: any; var languageJSON: any; @@ -16,23 +30,30 @@ declare global { var currentProject: IProject; /** The directory of the currently opened project */ var projdir: string; - var migrationProcess: any[]; + var migrationProcess: { + version: string, + process: (project: Partial) => Promise + }[]; var riot: any; - function showOpenDialog(options: any): Promise; - function showSaveDialog(options: any): Promise; + function showOpenDialog(options: IOpenDialogOptions): Promise; + function showSaveDialog(options: ISaveDialogOptions): Promise; interface Window { path: string; id: number; signals: observable; - orders: any; + orders: observable; alertify: any; currentProject: IProject; languageJSON: any; monaco: any; /** The directory of the currently opened project */ projdir: string; - showOpenDialog(options: any): Promise; - showSaveDialog(options: any): Promise; + migrationProcess: { + version: string, + process: (project: Partial) => Promise + }[]; + showOpenDialog(options: IOpenDialogOptions): Promise; + showSaveDialog(options: ISaveDialogOptions): Promise; updateWindowMenu?(): Promise; } } diff --git a/src/node_requires/generators/gridTexture.ts b/src/node_requires/generators/gridTexture.ts index 93fd01e99..f74e33064 100644 --- a/src/node_requires/generators/gridTexture.ts +++ b/src/node_requires/generators/gridTexture.ts @@ -11,7 +11,7 @@ export const generateCanvasGrid = function ( const canvas = document.createElement('canvas'); [canvas.width, canvas.height] = size; - const ctx = canvas.getContext('2d'); + const ctx = canvas.getContext('2d')!; ctx.clearRect(0, 0, size[0], size[1]); ctx.strokeStyle = color; ctx.beginPath(); @@ -26,7 +26,7 @@ export const generateCanvasGrid = function ( return canvas; }; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; export const generatePixiTextureGrid = function ( size: number | [number, number], diff --git a/src/node_requires/glob.js b/src/node_requires/glob.js index 582fb8ad4..651912f17 100644 --- a/src/node_requires/glob.js +++ b/src/node_requires/glob.js @@ -8,7 +8,7 @@ const glob = { return modified; }, set modified(v) { - if (global.currentProject) { + if (window.currentProject) { if (v) { document.title = 'ct.js — ' + sessionStorage.projname + ' •'; } else { @@ -18,7 +18,6 @@ const glob = { document.title = 'ct.js'; } modified = v; - return modified; }, moduleTypings: {} }; diff --git a/src/node_requires/monaco-themes/AlmaSakura.json b/src/node_requires/monaco-themes/AlmaSakura.json new file mode 100644 index 000000000..6ea90ff8d --- /dev/null +++ b/src/node_requires/monaco-themes/AlmaSakura.json @@ -0,0 +1,3190 @@ +{ + "inherit": true, + "base": "vs-dark", + "colors": { + "activityBar.activeBackground": "#f18eb033", + "activityBar.activeBorder": "#f18eb0", + "activityBar.background": "#372d2d", + "activityBar.border": "#1f191b", + "activityBar.foreground": "#c4b0b3", + "activityBar.inactiveForeground": "#99758277", + "activityBarBadge.background": "#f18eb0", + "activityBarBadge.foreground": "#1f191b", + "badge.background": "#57313a", + "badge.foreground": "#ffffff", + "breadcrumb.activeSelectionForeground": "#edebff", + "breadcrumb.background": "#322a2d", + "breadcrumb.focusForeground": "#f18eb0", + "breadcrumb.foreground": "#bbaab0", + "breadcrumbPicker.background": "#413036", + "button.background": "#412f2c", + "button.foreground": "#edebff", + "button.hoverBackground": "#00aacc", + "debugExceptionWidget.background": "#322a2d", + "debugExceptionWidget.border": "#997582", + "debugToolBar.background": "#322a2d", + "descriptionForeground": "#bb778f", + "diffEditor.insertedTextBackground": "#16b67327", + "diffEditor.removedTextBackground": "#e6653341", + "dropdown.background": "#372d2d", + "dropdown.border": "#4d3030", + "dropdown.foreground": "#c4b0b3", + "editor.background": "#322a2d", + "editor.findMatchBackground": "#7f536299", + "editor.findMatchHighlightBackground": "#7f536250", + "editor.findRangeHighlightBackground": "#7f536220", + "editor.foreground": "#cbbec2", + "editor.hoverHighlightBackground": "#9975823f", + "editor.inactiveSelectionBackground": "#99758233", + "editor.lineHighlightBackground": "#423636", + "editor.lineHighlightBorder": "#45313899", + "editor.rangeHighlightBackground": "#bb778f45", + "editor.selectionBackground": "#423636", + "editor.selectionHighlightBackground": "#7f536299", + "editor.snippetFinalTabstopHighlightBackground": "#272022", + "editor.snippetFinalTabstopHighlightBorder": "#2c2528", + "editor.snippetTabstopHighlightBackground": "#272022", + "editor.snippetTabstopHighlightBorder": "#2c2528", + "editor.wordHighlightBackground": "#e4b78133", + "editor.wordHighlightStrongBackground": "#cc990033", + "editorBracketMatch.background": "#99758222", + "editorBracketMatch.border": "#997582", + "editorCodeLens.foreground": "#776284", + "editorCursor.foreground": "#ffb3cd", + "editorError.border": "#322a2d", + "editorError.foreground": "#e34e1c", + "editorGroup.border": "#1f191b", + "editorGroup.dropBackground": "#715b6333", + "editorGroup.emptyBackground": "#715b6333", + "editorGroupHeader.noTabsBackground": "#413036", + "editorGroupHeader.tabsBackground": "#372d2d", + "editorGroupHeader.tabsBorder": "#413036", + "editorGutter.addedBackground": "#8ce99a", + "editorGutter.background": "#322a2d", + "editorGutter.deletedBackground": "#e34e1c", + "editorGutter.modifiedBackground": "#ffc180", + "editorHint.border": "#49e9a600", + "editorHint.foreground": "#49e9a6", + "editorHoverWidget.background": "#3e2e33", + "editorHoverWidget.border": "#1f191b", + "editorIndentGuide.activeBackground": "#57313a", + "editorIndentGuide.background": "#4d3030", + "editorInfo.border": "#322a2d", + "editorInfo.foreground": "#40d4e7", + "editorLineNumber.activeForeground": "#bb778f", + "editorLineNumber.foreground": "#705b5f", + "editorLink.activeForeground": "#14a5ff", + "editorMarkerNavigation.background": "#5f3a4729", + "editorMarkerNavigationError.background": "#e34e1c", + "editorMarkerNavigationWarning.background": "#e69533", + "editorOverviewRuler.border": "#322a2d", + "editorOverviewRuler.commonContentForeground": "#ffc18044", + "editorOverviewRuler.currentContentForeground": "#85f1ff44", + "editorOverviewRuler.incomingContentForeground": "#9d92f244", + "editorRuler.foreground": "#593a46", + "editorSuggestWidget.background": "#3e2e33", + "editorSuggestWidget.border": "#1f191b", + "editorSuggestWidget.foreground": "#bbaab0", + "editorSuggestWidget.highlightForeground": "#f18eb0", + "editorSuggestWidget.selectedBackground": "#563440", + "editorWarning.border": "#322a2d", + "editorWarning.foreground": "#e69533", + "editorWhitespace.foreground": "#ffccde21", + "editorWidget.background": "#413036", + "editorWidget.border": "#1f191b", + "errorForeground": "#e34e1c", + "extensionButton.prominentBackground": "#008c99", + "extensionButton.prominentForeground": "#e4e2f9", + "extensionButton.prominentHoverBackground": "#00bbcc", + "focusBorder": "#413036", + "foreground": "#c4b0b3", + "gitDecoration.addedResourceForeground": "#16b673", + "gitDecoration.conflictingResourceForeground": "#ffc180", + "gitDecoration.deletedResourceForeground": "#e34e1c", + "gitDecoration.ignoredResourceForeground": "#5b788b", + "gitDecoration.modifiedResourceForeground": "#49e9a6", + "gitDecoration.untrackedResourceForeground": "#40d4e7", + "input.background": "#372d2d", + "input.border": "#412a32", + "input.foreground": "#ddd5d7", + "input.placeholderForeground": "#a48e96", + "inputOption.activeBorder": "#997582", + "inputValidation.errorBackground": "#501502ee", + "inputValidation.errorBorder": "#691c02", + "inputValidation.errorForeground": "#ff4000", + "inputValidation.infoBackground": "#0f6e7bee", + "inputValidation.infoBorder": "#148f9f", + "inputValidation.infoForeground": "#40d4e7", + "inputValidation.warningBackground": "#82694acc", + "inputValidation.warningBorder": "#a88457", + "inputValidation.warningForeground": "#e69533", + "list.activeSelectionBackground": "#443838", + "list.activeSelectionForeground": "#edebff", + "list.dropBackground": "#38292e", + "list.errorForeground": "#e34e1c", + "list.focusBackground": "#824a5e66", + "list.focusForeground": "#edebff", + "list.focusHighlightForeground": "#f18eb0", + "list.highlightForeground": "#824a5e", + "list.hoverBackground": "#443838", + "list.hoverForeground": "#edebff", + "list.inactiveFocusBackground": "#2c2528", + "list.inactiveSelectionBackground": "#443838", + "list.inactiveSelectionForeground": "#cbbec2", + "list.warningForeground": "#ffa857", + "listFilterWidget.background": "#202040", + "listFilterWidget.noMatchesOutline": "#e34e1c", + "listFilterWidget.outline": "#49e9a6", + "menu.background": "#372d2d", + "menu.foreground": "#c4b0b3", + "menu.selectionBackground": "#443838", + "menu.selectionBorder": "#824a5e66", + "menu.selectionForeground": "#c4b0b3", + "menu.separatorBackground": "#f18eb0", + "menubar.selectionBackground": "#824a5e66", + "menubar.selectionBorder": "#824a5e66", + "menubar.selectionForeground": "#f18eb0", + "merge.border": "#322a2d00", + "merge.commonContentBackground": "#ffc18022", + "merge.commonHeaderBackground": "#ffc18044", + "merge.currentContentBackground": "#85f1ff22", + "merge.currentHeaderBackground": "#85f1ff44", + "merge.incomingContentBackground": "#9d92f222", + "merge.incomingHeaderBackground": "#9d92f244", + "minimap.background": "#322a2d99", + "minimap.errorHighlight": "#e34e1cee", + "minimap.findMatchHighlight": "#f18eb0ee", + "minimap.warningHighlight": "#e69533ee", + "minimapGutter.addedBackground": "#16b673", + "minimapGutter.deletedBackground": "#e34e1c", + "minimapGutter.modifiedBackground": "#49e9a6", + "minimapSlider.background": "#f18eb020", + "minimapSlider.hoverBackground": "#f18eb047", + "minimapSlider.activeBackground": "#f18eb06E", + "notificationCenter.border": "#413036", + "notificationCenterHeader.background": "#413036", + "notificationCenterHeader.foreground": "#a48e96", + "notificationLink.foreground": "#a48e96", + "notificationToast.border": "#413036", + "notifications.background": "#413036", + "notifications.border": "#413036", + "notifications.foreground": "#ddd5d7", + "panel.background": "#2e2b2c", + "panel.border": "#997582", + "panelTitle.activeBorder": "#997582", + "panelTitle.activeForeground": "#c4b0b3", + "panelTitle.inactiveForeground": "#936c7a", + "peekView.border": "#997582", + "peekViewEditor.background": "#2c2125", + "peekViewEditor.matchHighlightBackground": "#7f536299", + "peekViewEditorGutter.background": "#2c2125", + "peekViewResult.background": "#322529", + "peekViewResult.fileForeground": "#ffc180", + "peekViewResult.lineForeground": "#a48e96", + "peekViewResult.matchHighlightBackground": "#47393e", + "peekViewResult.selectionBackground": "#47393e", + "peekViewResult.selectionForeground": "#a48e96", + "peekViewTitle.background": "#322529", + "peekViewTitleDescription.foreground": "#a48e96", + "peekViewTitleLabel.foreground": "#ffc180", + "pickerGroup.border": "#997582", + "pickerGroup.foreground": "#f18eb0", + "progressBar.background": "#f18eb0", + "quickInputList.focusBackground": "#563440", + "quickInputList.focusForeground": "#f18eb0", + "scrollbar.shadow": "#00000044", + "scrollbarSlider.activeBackground": "#f18eb06E", + "scrollbarSlider.background": "#f18eb020", + "scrollbarSlider.hoverBackground": "#f18eb047", + "selection.background": "#443838", + "settings.checkboxBackground": "#413036", + "settings.checkboxBorder": "#413036", + "settings.checkboxForeground": "#00aacc", + "settings.dropdownBackground": "#413036", + "settings.dropdownBorder": "#413036", + "settings.dropdownForeground": "#00aacc", + "settings.dropdownListBorder": "#824a5e77", + "settings.headerForeground": "#cbbec2", + "settings.modifiedItemIndicator": "#15ac31", + "settings.numberInputBackground": "#272022", + "settings.numberInputBorder": "#272022", + "settings.numberInputForeground": "#7060eb", + "settings.textInputBackground": "#413036", + "settings.textInputBorder": "#413036", + "settings.textInputForeground": "#00aacc", + "sideBar.background": "#372d2d", + "sideBar.border": "#1f191b", + "sideBar.dropBackground": "#2c2528", + "sideBar.foreground": "#bbaab0", + "sideBarSectionHeader.background": "#453430", + "sideBarSectionHeader.border": "#1f191b", + "sideBarSectionHeader.foreground": "#bbaab0", + "sideBarTitle.foreground": "#bbaab0", + "statusBar.background": "#372d2d", + "statusBar.border": "#1f191b", + "statusBar.debuggingBackground": "#322a2d", + "statusBar.debuggingBorder": "#ff80acaf", + "statusBar.debuggingForeground": "#ff80acaf", + "statusBar.foreground": "#c4b0b3", + "statusBar.noFolderBackground": "#322a2d", + "statusBar.noFolderBorder": "#322a2d", + "statusBar.noFolderForeground": "#a48e96", + "statusBarItem.activeBackground": "#8f566a77", + "statusBarItem.hoverBackground": "#443838", + "statusBarItem.prominentBackground": "#272022", + "statusBarItem.prominentHoverBackground": "#43142488", + "tab.activeBackground": "#453430", + "tab.activeBorder": "#322a2d", + "tab.activeBorderTop": "#f18eb0", + "tab.activeForeground": "#c4b0b3", + "tab.activeModifiedBorder": "#49e9a6", + "tab.border": "#1f191b", + "tab.hoverBackground": "#4d3030", + "tab.inactiveBackground": "#372d2d", + "tab.inactiveForeground": "#bbaab0", + "tab.unfocusedActiveBackground": "#38232b", + "tab.unfocusedActiveBorder": "#322a2d", + "tab.unfocusedActiveForeground": "#bbaab0", + "tab.unfocusedHoverBackground": "#f18eb021", + "tab.unfocusedInactiveForeground": "#bbaab0", + "terminal.ansiBlack": "#47393e", + "terminal.ansiBlue": "#49ace9", + "terminal.ansiBrightBlack": "#69545b", + "terminal.ansiBrightBlue": "#60b6eb", + "terminal.ansiBrightCyan": "#60dbeb", + "terminal.ansiBrightGreen": "#60ebb1", + "terminal.ansiBrightMagenta": "#e798b3", + "terminal.ansiBrightRed": "#e97749", + "terminal.ansiBrightWhite": "#cbbec2", + "terminal.ansiBrightYellow": "#e69533", + "terminal.ansiCyan": "#49d6e9", + "terminal.ansiGreen": "#49e9a6", + "terminal.ansiMagenta": "#df769b", + "terminal.ansiRed": "#e66533", + "terminal.ansiWhite": "#b9acb0", + "terminal.ansiYellow": "#e4b781", + "terminal.background": "#2e2b2c", + "terminal.foreground": "#cbbec2", + "terminalCursor.background": "#272022", + "terminalCursor.foreground": "#cbbec2", + "textBlockQuote.background": "#322a2d", + "textBlockQuote.border": "#997582", + "textCodeBlock.background": "#322a2d", + "textLink.activeForeground": "#f18eb0", + "textLink.foreground": "#f18eb0", + "textPreformat.foreground": "#ffc180", + "textSeparator.foreground": "#322a2d", + "titleBar.activeBackground": "#57313a", + "titleBar.activeForeground": "#c4b0b3", + "titleBar.inactiveBackground": "#372d2d", + "titleBar.inactiveForeground": "#c4b0b3", + "tree.indentGuidesStroke": "#715b63", + "walkThrough.embeddedEditorBackground": "#322a2d", + "welcomePage.buttonBackground": "#272022", + "welcomePage.buttonHoverBackground": "#413036", + "widget.shadow": "#00000044" + }, + "rules": [ + { + "foreground": "#8B747C", + "token": "comment" + }, + { + "foreground": "#8B747C", + "token": "punctuation.definition.comment" + }, + { + "foreground": "#8B747C", + "token": "punctuation.definition.tag" + }, + { + "foreground": "#8B747C", + "token": "comment.block.documentation punctuation.definition.bracket" + }, + { + "foreground": "#8B747C", + "token": "source.ocaml comment constant.regexp meta.separator" + }, + { + "foreground": "#8B747C", + "token": "markup.other.anchor support.constant" + }, + { + "foreground": "#8B747C", + "token": "markup.fenced_code" + }, + { + "foreground": "#8B747C", + "token": "markup.fenced_code punctuation.definition" + }, + { + "foreground": "#CBBEC2", + "token": "constant.character" + }, + { + "foreground": "#CBBEC2", + "token": "constant.escape" + }, + { + "foreground": "#CBBEC2", + "token": "text.html.markdown" + }, + { + "foreground": "#CBBEC2", + "token": "punctuation.definition.list_item" + }, + { + "foreground": "#CBBEC2", + "token": "keyword.begin.tag.ejs" + }, + { + "foreground": "#CBBEC2", + "token": "constant.name.attribute.tag.pug" + }, + { + "foreground": "#CBBEC2", + "token": "source.clojure meta.symbol" + }, + { + "foreground": "#CBBEC2", + "token": "constant.other.description.jsdoc" + }, + { + "foreground": "#CBBEC2", + "token": "keyword.other.array.phpdoc.php" + }, + { + "foreground": "#CBBEC2", + "token": "keyword.operator.other.powershell" + }, + { + "foreground": "#CBBEC2", + "token": "meta.link.inline punctuation.definition.string" + }, + { + "foreground": "#CBBEC2", + "token": "source.sql" + }, + { + "foreground": "#CBBEC2", + "token": "source meta.brace" + }, + { + "foreground": "#CBBEC2", + "token": "source punctuation" + }, + { + "foreground": "#CBBEC2", + "token": "text.html punctuation" + }, + { + "foreground": "#CBBEC2", + "token": "markup meta punctuation.definition" + }, + { + "foreground": "#CBBEC2", + "token": "meta.bracket.julia" + }, + { + "foreground": "#CBBEC2", + "token": "meta.array.julia" + }, + { + "foreground": "#CBBEC2", + "token": "punctuation.separator.key-value" + }, + { + "foreground": "#CBBEC2", + "token": "entity.name.footnote" + }, + { + "foreground": "#CBBEC2", + "token": "source.ocaml punctuation.definition.tag" + }, + { + "foreground": "#CBBEC2", + "token": "source.ocaml entity.name.filename" + }, + { + "foreground": "#CBBEC2", + "token": "source.reason entity.name.filename" + }, + { + "foreground": "#CBBEC2", + "token": "entity.other.attribute-name strong" + }, + { + "foreground": "#CBBEC2", + "token": "binding.fsharp keyword.symbol.fsharp" + }, + { + "foreground": "#CBBEC2", + "token": "entity.name.record.field.elm" + }, + { + "foreground": "#CBBEC2", + "token": "entity.name.record.field.accessor.elm" + }, + { + "foreground": "#CBBEC2", + "token": "storage.modifier.array.bracket" + }, + { + "foreground": "#CBBEC2", + "token": "source.css entity.other" + }, + { + "foreground": "#CBBEC2", + "token": "meta.attribute-selector punctuation.definition.entity" + }, + { + "foreground": "#CBBEC2", + "token": "markup.other.anchor string" + }, + { + "foreground": "#DF769B", + "token": "keyword" + }, + { + "foreground": "#DF769B", + "token": "keyword.control" + }, + { + "foreground": "#DF769B", + "token": "keyword.other.template" + }, + { + "foreground": "#DF769B", + "token": "keyword.other.substitution" + }, + { + "foreground": "#DF769B", + "token": "storage.modifier" + }, + { + "foreground": "#DF769B", + "token": "meta.tag.sgml" + }, + { + "foreground": "#DF769B", + "token": "punctuation.accessor" + }, + { + "foreground": "#DF769B", + "token": "constant.other.color" + }, + { + "foreground": "#DF769B", + "token": "entity.name.section" + }, + { + "foreground": "#DF769B", + "token": "markup.heading" + }, + { + "foreground": "#DF769B", + "token": "markup.heading punctuation.definition" + }, + { + "foreground": "#DF769B", + "token": "entity.other.attribute-name.pseudo-class" + }, + { + "foreground": "#DF769B", + "token": "entity.other.attribute-name.pseudo-element" + }, + { + "foreground": "#DF769B", + "token": "tag.decorator.js entity.name.tag.js" + }, + { + "foreground": "#DF769B", + "token": "tag.decorator.js punctuation.definition.tag.js" + }, + { + "foreground": "#DF769B", + "token": "storage.type.function.pug" + }, + { + "foreground": "#DF769B", + "token": "text.pug storage.type" + }, + { + "foreground": "#DF769B", + "token": "text.pug meta.tag.other" + }, + { + "foreground": "#DF769B", + "token": "source.clojure storage.control" + }, + { + "foreground": "#DF769B", + "token": "meta.expression.clojure" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.slice.python" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.question-mark.cs" + }, + { + "foreground": "#DF769B", + "token": "punctuation.definition.parameters.varargs" + }, + { + "foreground": "#DF769B", + "token": "source.go keyword.operator" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.pointer-access" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.other.ruby" + }, + { + "foreground": "#DF769B", + "token": "keyword.package" + }, + { + "foreground": "#DF769B", + "token": "keyword.import" + }, + { + "foreground": "#DF769B", + "token": "punctuation.definition.keyword" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.hash.cs" + }, + { + "foreground": "#DF769B", + "token": "entity.other.attribute-name.pseudo-class.css punctuation.definition.entity.css" + }, + { + "foreground": "#DF769B", + "token": "entity.other.attribute-name.pseudo-element.css punctuation.definition.entity.css" + }, + { + "foreground": "#DF769B", + "token": "source.kotlin storage.type.import" + }, + { + "foreground": "#DF769B", + "token": "source.kotlin storage.type.package" + }, + { + "foreground": "#DF769B", + "token": "constant.string.documentation.powershell" + }, + { + "foreground": "#DF769B", + "token": "punctuation.section.directive" + }, + { + "foreground": "#DF769B", + "token": "storage.type.rust" + }, + { + "foreground": "#DF769B", + "token": "punctuation.definition.attribute" + }, + { + "foreground": "#DF769B", + "token": "punctuation.definition.preprocessor" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.namespace" + }, + { + "foreground": "#DF769B", + "token": "punctuation.separator.method" + }, + { + "foreground": "#DF769B", + "token": "keyword.control punctuation.definition.function" + }, + { + "foreground": "#DF769B", + "token": "source.ocaml variable.interpolation string" + }, + { + "foreground": "#DF769B", + "token": "source.reason variable.interpolation" + }, + { + "foreground": "#DF769B", + "token": "punctuation.definition.directive" + }, + { + "foreground": "#DF769B", + "token": "storage.type.modifier" + }, + { + "foreground": "#DF769B", + "token": "keyword.other.class.fileds" + }, + { + "foreground": "#DF769B", + "token": "source.toml entity.other.attribute-name" + }, + { + "foreground": "#DF769B", + "token": "source.css entity.name.tag.custom" + }, + { + "foreground": "#DF769B", + "token": "sharing.modifier" + }, + { + "foreground": "#DF769B", + "token": "keyword.control.class.ruby" + }, + { + "foreground": "#DF769B", + "token": "keyword.control.def.ruby" + }, + { + "foreground": "#DF769B", + "token": "constant.language.boolean.true.tsx" + }, + { + "foreground": "#DF769B", + "token": "constant.language.boolean.false.tsx" + }, + { + "foreground": "#DF769B", + "token": "constant.language.null.tsx" + }, + { + "foreground": "#DF769B", + "token": "punctuation.section.embedded.begin.tsx" + }, + { + "foreground": "#DF769B", + "token": "punctuation.section.embedded.end.tsx" + }, + { + "foreground": "#E4B781", + "token": "variable" + }, + { + "foreground": "#E4B781", + "token": "variable.object" + }, + { + "foreground": "#E4B781", + "token": "variable.other" + }, + { + "foreground": "#E4B781", + "token": "variable.parameter" + }, + { + "foreground": "#E4B781", + "token": "support" + }, + { + "foreground": "#E4B781", + "token": "entity.name.module" + }, + { + "foreground": "#E4B781", + "token": "variable.import.parameter" + }, + { + "foreground": "#E4B781", + "token": "variable.other.class" + }, + { + "foreground": "#E4B781", + "token": "meta.toc-list.id.html" + }, + { + "foreground": "#E4B781", + "token": "source.json meta.structure.dictionary.json support.type.property-name.json" + }, + { + "foreground": "#E4B781", + "token": "meta.var.clojure" + }, + { + "foreground": "#E4B781", + "token": "entity.name.variable" + }, + { + "foreground": "#E4B781", + "token": "source.java meta.class.body.java" + }, + { + "foreground": "#E4B781", + "token": "entity.name.package.go" + }, + { + "foreground": "#E4B781", + "token": "source.c" + }, + { + "foreground": "#E4B781", + "token": "source.cpp" + }, + { + "foreground": "#E4B781", + "token": "source.go" + }, + { + "foreground": "#E4B781", + "token": "source.python" + }, + { + "foreground": "#E4B781", + "token": "meta.function-call.arguments.python" + }, + { + "foreground": "#E4B781", + "token": "source.ruby" + }, + { + "foreground": "#E4B781", + "token": "source.coffee.embedded.source" + }, + { + "foreground": "#E4B781", + "token": "source.coffee" + }, + { + "foreground": "#E4B781", + "token": "storage.modifier.import" + }, + { + "foreground": "#E4B781", + "token": "storage.modifier.package" + }, + { + "foreground": "#E4B781", + "token": "storage.type.annotation" + }, + { + "foreground": "#E4B781", + "token": "punctuation.definition.annotation" + }, + { + "foreground": "#E4B781", + "token": "source.groovy.embedded.source" + }, + { + "foreground": "#E4B781", + "token": "punctuation.definition.variable" + }, + { + "foreground": "#E4B781", + "token": "source.powershell" + }, + { + "foreground": "#E4B781", + "token": "string.quoted.interpolated.vala constant.character.escape.vala" + }, + { + "foreground": "#E4B781", + "token": "source.apacheconf" + }, + { + "foreground": "#E4B781", + "token": "source.objc" + }, + { + "foreground": "#E4B781", + "token": "source.crystal" + }, + { + "foreground": "#E4B781", + "token": "string.quoted.double.kotlin entity.string.template.element.kotlin" + }, + { + "foreground": "#E4B781", + "token": "entity.name.package.kotlin" + }, + { + "foreground": "#E4B781", + "token": "meta.template.expression.kotlin" + }, + { + "foreground": "#E4B781", + "token": "parameter.variable.function" + }, + { + "foreground": "#E4B781", + "token": "variable.other.constant.elixir" + }, + { + "foreground": "#E4B781", + "token": "source.elixir.embedded.source" + }, + { + "foreground": "#E4B781", + "token": "source.sql.embedded" + }, + { + "foreground": "#E4B781", + "token": "punctuation.definition.placeholder" + }, + { + "foreground": "#E4B781", + "token": "source.swift" + }, + { + "foreground": "#E4B781", + "token": "source.julia" + }, + { + "foreground": "#E4B781", + "token": "source.shell" + }, + { + "foreground": "#E4B781", + "token": "variable.other.normal punctuation.definition.variable.shell" + }, + { + "foreground": "#E4B781", + "token": "source.reason variable.language" + }, + { + "foreground": "#E4B781", + "token": "source.reason variable.language string.other.link" + }, + { + "foreground": "#E4B781", + "token": "source.elm meta.value" + }, + { + "foreground": "#E4B781", + "token": "source.elm meta.declaration.module" + }, + { + "foreground": "#E4B781", + "token": "meta.embedded.block variable punctuation.definition.variable.php" + }, + { + "foreground": "#E4B781", + "token": "string.quoted.double.class.other" + }, + { + "foreground": "#E4B781", + "token": "source.toml keyword" + }, + { + "foreground": "#E4B781", + "token": "support.type.nim" + }, + { + "foreground": "#E4B781", + "token": "source.tf meta.template.expression" + }, + { + "foreground": "#E4B781", + "token": "source.scala entity.name.import" + }, + { + "foreground": "#E4B781", + "token": "markup.code" + }, + { + "foreground": "#D67E5C", + "token": "support.variable.property" + }, + { + "foreground": "#D67E5C", + "token": "constant.other.symbol.hashkey.ruby" + }, + { + "foreground": "#D67E5C", + "token": "constant.other.symbol.hashkey.ruby punctuation.definition.constant.ruby" + }, + { + "foreground": "#D67E5C", + "token": "entity.other.attribute-name.id" + }, + { + "foreground": "#D67E5C", + "token": "entity.other.attribute-name.id punctuation.definition.entity" + }, + { + "foreground": "#D67E5C", + "token": "entity.name.type.annotation.kotlin" + }, + { + "foreground": "#D67E5C", + "token": "support.type.primitive" + }, + { + "foreground": "#D67E5C", + "token": "meta.type.parameters entity.name.type" + }, + { + "foreground": "#D67E5C", + "token": "meta.type.annotation entity.name.type" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.definition.typeparameters" + }, + { + "foreground": "#D67E5C", + "token": "source.python support.type.python" + }, + { + "foreground": "#D67E5C", + "token": "comment.block.documentation.phpdoc.php keyword.other.type.php" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.php" + }, + { + "foreground": "#D67E5C", + "token": "keyword.type" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.cs" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.c" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.objc" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.definition.storage.type.objc" + }, + { + "foreground": "#D67E5C", + "token": "markup punctuation.definition" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.powershell" + }, + { + "foreground": "#D67E5C", + "token": "comment.block.documentation entity.name.type" + }, + { + "foreground": "#D67E5C", + "token": "source.java storage.type" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.primitive" + }, + { + "foreground": "#D67E5C", + "token": "source.groovy storage.type" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.r" + }, + { + "foreground": "#D67E5C", + "token": "source.haskell storage.type" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.separator.clause-head-body" + }, + { + "foreground": "#D67E5C", + "token": "source.go storage.type" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.core.rust" + }, + { + "foreground": "#D67E5C", + "token": "storage.class.std.rust" + }, + { + "foreground": "#D67E5C", + "token": "storage.modifier.lifetime.rust" + }, + { + "foreground": "#D67E5C", + "token": "entity.name.lifetime.rust" + }, + { + "foreground": "#D67E5C", + "token": "support.type.vb" + }, + { + "foreground": "#D67E5C", + "token": "entity.name.type.kotlin" + }, + { + "foreground": "#D67E5C", + "token": "support.type.julia" + }, + { + "foreground": "#D67E5C", + "token": "constant.other.reference" + }, + { + "foreground": "#D67E5C", + "token": "source.graphql support.type" + }, + { + "foreground": "#D67E5C", + "token": "source.reason support.type string" + }, + { + "foreground": "#D67E5C", + "token": "entity.name.type.fsharp" + }, + { + "foreground": "#D67E5C", + "token": "source.elm storage.type" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.user-defined" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.built-in" + }, + { + "foreground": "#D67E5C", + "token": "support.type.builtin" + }, + { + "foreground": "#D67E5C", + "token": "source.swift support.type" + }, + { + "foreground": "#D67E5C", + "token": "support.class.crystal" + }, + { + "foreground": "#D67E5C", + "token": "storage.type.integral" + }, + { + "foreground": "#D67E5C", + "token": "source.cpp storage.type.cpp" + }, + { + "foreground": "#D67E5C", + "token": "source.vala storage.type" + }, + { + "foreground": "#D67E5C", + "token": "source.hlsl storage.type.basic" + }, + { + "foreground": "#D67E5C", + "token": "source.hlsl support.type.other" + }, + { + "foreground": "#D67E5C", + "token": "source.apex storage.type" + }, + { + "foreground": "#D67E5C", + "token": "source.nim storage.type" + }, + { + "foreground": "#D67E5C", + "token": "source.cpp entity.name.type" + }, + { + "foreground": "#D67E5C", + "token": "support.class.builtin" + }, + { + "foreground": "#D67E5C", + "token": "source.tf meta.keyword.string" + }, + { + "foreground": "#D67E5C", + "token": "source.tf meta.keyword.number" + }, + { + "foreground": "#D67E5C", + "token": "source.scala entity.name.class" + }, + { + "foreground": "#D67E5C", + "token": "markup.raw.monospace" + }, + { + "foreground": "#D67E5C", + "token": "markup.mark" + }, + { + "foreground": "#D67E5C", + "token": "markup.meta.attribute-list" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.definition.string.begin.tsx" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.definition.string.end.tsx" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.definition.parameters.begin.tsx" + }, + { + "foreground": "#D67E5C", + "token": "punctuation.definition.parameters.end.tsx" + }, + { + "foreground": "#D5971A", + "token": "constant" + }, + { + "foreground": "#D5971A", + "token": "variable.other.constant" + }, + { + "foreground": "#D5971A", + "token": "support.constant" + }, + { + "foreground": "#D5971A", + "token": "punctuation.definition.entity" + }, + { + "foreground": "#D5971A", + "token": "constant.character.entity" + }, + { + "foreground": "#D5971A", + "token": "support.variable.magic" + }, + { + "foreground": "#D5971A", + "token": "markup.quote" + }, + { + "foreground": "#D5971A", + "token": "entity.name.type.type-parameter.cs" + }, + { + "foreground": "#D5971A", + "token": "punctuation.bracket.angle" + }, + { + "foreground": "#D5971A", + "token": "entity.name.function.preprocessor.c" + }, + { + "foreground": "#D5971A", + "token": "storage.type.scala" + }, + { + "foreground": "#D5971A", + "token": "entity.helper.apacheconf" + }, + { + "foreground": "#D5971A", + "token": "variable.language.crystal" + }, + { + "foreground": "#D5971A", + "token": "punctuation.definition.constant" + }, + { + "foreground": "#D5971A", + "token": "support.constant punctuation.definition.variable" + }, + { + "foreground": "#D5971A", + "token": "constant.character.math" + }, + { + "foreground": "#D5971A", + "token": "support.class.math" + }, + { + "foreground": "#D5971A", + "token": "source.graphql constant.character" + }, + { + "foreground": "#D5971A", + "token": "source.reason constant.language.list" + }, + { + "foreground": "#D5971A", + "token": "source.cpp variable.other.enummember" + }, + { + "foreground": "#D5971A", + "token": "support.variable.class.hideshow" + }, + { + "foreground": "#D5971A", + "token": "entity.other.attribute-name.class" + }, + { + "foreground": "#D5971A", + "token": "meta.attribute.id entity.other.attribute-name" + }, + { + "foreground": "#D5971A", + "token": "text.html entity.other.attribute-name" + }, + { + "foreground": "#D5971A", + "token": "meta.tag.attributes entity.other.attribute-name" + }, + { + "foreground": "#D5971A", + "token": "text.xml entity.other.attribute-name" + }, + { + "foreground": "#D5971A", + "token": "source.cs entity.other.attribute-name" + }, + { + "foreground": "#D5971A", + "token": "constant.character.format.placeholder" + }, + { + "foreground": "#D5971A", + "token": "constant.other.placeholder" + }, + { + "foreground": "#D5971A", + "token": "source.vue entity.other.attribute-name" + }, + { + "foreground": "#D5971A", + "token": "entity.other.attribute-name.mjml" + }, + { + "foreground": "#D5971A", + "token": "source.vue meta.directive punctuation.separator.key-value" + }, + { + "foreground": "#D5971A", + "token": "meta.definition.attribute-entry punctuation.separator" + }, + { + "foreground": "#E66533", + "token": "variable.language" + }, + { + "foreground": "#E66533", + "token": "variable.parameter.function.language.special" + }, + { + "foreground": "#E66533", + "token": "markup.bold" + }, + { + "foreground": "#E66533", + "token": "markup.italic" + }, + { + "foreground": "#E66533", + "token": "punctuation.definition.italic" + }, + { + "foreground": "#E66533", + "token": "punctuation.definition.bold" + }, + { + "foreground": "#E66533", + "token": "entity.name.tag" + }, + { + "foreground": "#E66533", + "token": "variable.language punctuation.definition.variable" + }, + { + "foreground": "#E66533", + "token": "keyword.control.clojure" + }, + { + "foreground": "#E66533", + "token": "support.type.exception.python" + }, + { + "foreground": "#E66533", + "token": "keyword.other.this.cs" + }, + { + "foreground": "#E66533", + "token": "keyword.other.base.cs" + }, + { + "foreground": "#E66533", + "token": "keyword.other.var.cs" + }, + { + "foreground": "#E66533", + "token": "storage.modifier.super" + }, + { + "foreground": "#E66533", + "token": "source.go keyword" + }, + { + "foreground": "#E66533", + "token": "keyword.function.go" + }, + { + "foreground": "#E66533", + "token": "meta.separator" + }, + { + "foreground": "#E66533", + "token": "keyword.other.fn.rust" + }, + { + "foreground": "#E66533", + "token": "storage.modifier.static.rust" + }, + { + "foreground": "#E66533", + "token": "source.r meta.function.r keyword.control.r" + }, + { + "foreground": "#E66533", + "token": "storage.type.def" + }, + { + "foreground": "#E66533", + "token": "meta.class.identifier storage.modifier" + }, + { + "foreground": "#E66533", + "token": "source.scala keyword.declaration" + }, + { + "foreground": "#E66533", + "token": "storage.type" + }, + { + "foreground": "#E66533", + "token": "comment.block.documentation punctuation.definition.block.tag" + }, + { + "foreground": "#E66533", + "token": "comment.block.documentation punctuation.definition.inline.tag" + }, + { + "foreground": "#E66533", + "token": "entity.tag.apacheconf" + }, + { + "foreground": "#E66533", + "token": "keyword.other.julia" + }, + { + "foreground": "#E66533", + "token": "source.julia storage.modifier" + }, + { + "foreground": "#E66533", + "token": "constant.language.empty-list.haskell" + }, + { + "foreground": "#E66533", + "token": "meta.function.powershell storage.type.powershell" + }, + { + "foreground": "#E66533", + "token": "keyword.control.fun" + }, + { + "foreground": "#E66533", + "token": "punctuation.terminator.function" + }, + { + "foreground": "#E66533", + "token": "keyword.other.rust" + }, + { + "foreground": "#E66533", + "token": "keyword.other.declaration-specifier.swift" + }, + { + "foreground": "#E66533", + "token": "keyword.control.class" + }, + { + "foreground": "#E66533", + "token": "keyword.control.def" + }, + { + "foreground": "#E66533", + "token": "source.ocaml keyword markup.underline" + }, + { + "foreground": "#E66533", + "token": "source.ocaml storage.type markup.underline" + }, + { + "foreground": "#E66533", + "token": "binding.fsharp keyword" + }, + { + "foreground": "#E66533", + "token": "function.anonymous keyword" + }, + { + "foreground": "#E66533", + "token": "function.anonymous keyword.symbol.fsharp" + }, + { + "foreground": "#E66533", + "token": "meta.embedded.block variable.language punctuation.definition.variable.php" + }, + { + "foreground": "#E66533", + "token": "keyword.declaration.dart" + }, + { + "foreground": "#E66533", + "token": "source.wsd keyword.other.class" + }, + { + "foreground": "#E66533", + "token": "source.wsd keyword.other.linebegin" + }, + { + "foreground": "#E66533", + "token": "keyword.other.skinparam.keyword" + }, + { + "foreground": "#E66533", + "token": "keyword.other.nim" + }, + { + "foreground": "#E66533", + "token": "markup.deleted.diff" + }, + { + "foreground": "#E66533", + "token": "source.tf support.class.variable" + }, + { + "foreground": "#E66533", + "token": "meta.function.lua keyword.control.lua" + }, + { + "foreground": "#E66533", + "token": "markup.italic punctuation.definition" + }, + { + "foreground": "#E66533", + "token": "markup.bold punctuation.definition" + }, + { + "foreground": "#E66533", + "token": "markup.block entity.name.tag" + }, + { + "foreground": "#49E9A6", + "token": "string" + }, + { + "foreground": "#49E9A6", + "token": "punctuation.definition.string" + }, + { + "foreground": "#49E9A6", + "token": "source.css support.constant" + }, + { + "foreground": "#49E9A6", + "token": "entity.name.import.go" + }, + { + "foreground": "#49E9A6", + "token": "markup.raw.texttt" + }, + { + "foreground": "#49E9A6", + "token": "markup.inserted.diff" + }, + { + "foreground": "#49E9A6", + "token": "source.scala punctuation.definition.character" + }, + { + "foreground": "#49E9A6", + "token": "constant.character.literal.scala" + }, + { + "foreground": "#49E9A6", + "token": "source.tf entity.name" + }, + { + "foreground": "#16B673", + "token": "string.template" + }, + { + "foreground": "#16B673", + "token": "punctuation.definition.string.template" + }, + { + "foreground": "#16B673", + "token": "string.interpolated.python string.quoted.single.python" + }, + { + "foreground": "#16B673", + "token": "string.quoted.double.heredoc" + }, + { + "foreground": "#16B673", + "token": "string.quoted.interpolated.vala" + }, + { + "foreground": "#16B673", + "token": "string.quoted.interpolated.vala punctuation.definition.string" + }, + { + "foreground": "#16B673", + "token": "string.regexp.apacheconf" + }, + { + "foreground": "#16B673", + "token": "markup.inline.raw.string" + }, + { + "foreground": "#16B673", + "token": "markup.inline.raw punctuation.definition.raw" + }, + { + "foreground": "#16B673", + "token": "string.quoted.double.interpolated.crystal" + }, + { + "foreground": "#16B673", + "token": "string.quoted.double.interpolated.crystal punctuation.definition.string" + }, + { + "foreground": "#16B673", + "token": "text.tex markup.raw" + }, + { + "foreground": "#7060EB", + "token": "constant.numeric" + }, + { + "foreground": "#7060EB", + "token": "constant.language" + }, + { + "foreground": "#7060EB", + "token": "punctuation.separator.decimal.period.php" + }, + { + "foreground": "#7060EB", + "token": "keyword.operator.null-conditional.cs" + }, + { + "foreground": "#7060EB", + "token": "punctuation.separator.question-mark.cs" + }, + { + "foreground": "#7060EB", + "token": "constant.integer.apacheconf" + }, + { + "foreground": "#7060EB", + "token": "keyword.operator.nullable-type" + }, + { + "foreground": "#7060EB", + "token": "constant.language punctuation.definition.variable" + }, + { + "foreground": "#7060EB", + "token": "constant.others.fsharp" + }, + { + "foreground": "#7060EB", + "token": "keyword.other.unit" + }, + { + "foreground": "#7060EB", + "token": "string.quoted.double.skinparam.value" + }, + { + "foreground": "#7060EB", + "token": "source.toml constant" + }, + { + "foreground": "#16A3B6", + "token": "variable.function" + }, + { + "foreground": "#16A3B6", + "token": "support.type.property-name" + }, + { + "foreground": "#16A3B6", + "token": "entity.name.function" + }, + { + "foreground": "#16A3B6", + "token": "string.other.link" + }, + { + "foreground": "#16A3B6", + "token": "markup.link" + }, + { + "foreground": "#16A3B6", + "token": "support.type.vendored" + }, + { + "foreground": "#16A3B6", + "token": "support.other.variable" + }, + { + "foreground": "#16A3B6", + "token": "meta.function-call.generic.python" + }, + { + "foreground": "#16A3B6", + "token": "meta.method-call.groovy meta.method.groovy" + }, + { + "foreground": "#16A3B6", + "token": "meta.class.body.groovy meta.method.body.java storage.type.groovy" + }, + { + "foreground": "#16A3B6", + "token": "punctuation.definition.decorator" + }, + { + "foreground": "#16A3B6", + "token": "support.function.any-method" + }, + { + "foreground": "#16A3B6", + "token": "text.tex support.function" + }, + { + "foreground": "#16A3B6", + "token": "text.tex punctuation.definition.function" + }, + { + "foreground": "#16A3B6", + "token": "entity.name.section.fsharp entity.name.section.fsharp" + }, + { + "foreground": "#16A3B6", + "token": "support.variable.class.function" + }, + { + "foreground": "#16A3B6", + "token": "keyword.control.cucumber.table" + }, + { + "foreground": "#16A3B6", + "token": "punctuation.decorator" + }, + { + "foreground": "#16A3B6", + "token": "source.tf support.class" + }, + { + "foreground": "#49D6E9", + "token": "entity.name" + }, + { + "foreground": "#49D6E9", + "token": "entity.other" + }, + { + "foreground": "#49D6E9", + "token": "support.orther.namespace.use.php" + }, + { + "foreground": "#49D6E9", + "token": "meta.use.php" + }, + { + "foreground": "#49D6E9", + "token": "support.other.namespace.php" + }, + { + "foreground": "#49D6E9", + "token": "support.type" + }, + { + "foreground": "#49D6E9", + "token": "support.class" + }, + { + "foreground": "#49D6E9", + "token": "punctuation.definition.parameters" + }, + { + "foreground": "#49D6E9", + "token": "support.function" + }, + { + "foreground": "#49D6E9", + "token": "support.function.construct" + }, + { + "foreground": "#49D6E9", + "token": "markup.changed.git_gutter" + }, + { + "foreground": "#49D6E9", + "token": "markup.underline.link" + }, + { + "foreground": "#49D6E9", + "token": "markup.underline.link.image" + }, + { + "foreground": "#49D6E9", + "token": "markup.underline" + }, + { + "foreground": "#49D6E9", + "token": "meta.symbol.namespace.clojure" + }, + { + "foreground": "#49D6E9", + "token": "entity.mime-type.apacheconf" + }, + { + "foreground": "#49D6E9", + "token": "keyword.operator.function.infix" + }, + { + "foreground": "#49D6E9", + "token": "entity.name.function.infix" + }, + { + "foreground": "#49D6E9", + "token": "entity.name.function.call.kotlin" + }, + { + "foreground": "#49D6E9", + "token": "text.tex support.function.verb" + }, + { + "foreground": "#49D6E9", + "token": "text.tex support.function.texttt" + }, + { + "foreground": "#49D6E9", + "token": "source.reason constant.language.unit" + }, + { + "foreground": "#49D6E9", + "token": "source.ocaml constant.language constant.numeric entity.other.attribute-name.id.css" + }, + { + "foreground": "#49D6E9", + "token": "source.reason entity.other.attribute-name constant.language constant.numeric" + }, + { + "foreground": "#49D6E9", + "token": "constant.language.unit.fsharp" + }, + { + "foreground": "#49D6E9", + "token": "source.wsd support.class.preprocessings" + }, + { + "foreground": "#49D6E9", + "token": "keyword.language.gherkin.feature.scenario" + }, + { + "foreground": "#49D6E9", + "token": "source.nim keyword.other.common.function" + }, + { + "foreground": "#49D6E9", + "token": "entity.name.type.namespace" + }, + { + "foreground": "#49D6E9", + "token": "entity.name.scope-resolution.function.call" + }, + { + "foreground": "#49ACE9", + "token": "source.js constant.other.object.key.js string.unquoted.label.js" + }, + { + "foreground": "#49ACE9", + "token": "source.js punctuation.section.embedded" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.definition.template-expression" + }, + { + "foreground": "#49ACE9", + "token": "support.class" + }, + { + "foreground": "#49ACE9", + "token": "entity.name.type" + }, + { + "foreground": "#49ACE9", + "token": "storage.type.string.python" + }, + { + "foreground": "#49ACE9", + "token": "string.interpolated.pug" + }, + { + "foreground": "#49ACE9", + "token": "support.constant.handlebars" + }, + { + "foreground": "#49ACE9", + "token": "source.clojure punctuation.section.set" + }, + { + "foreground": "#49ACE9", + "token": "source.clojure punctuation.section.metadata" + }, + { + "foreground": "#49ACE9", + "token": "entity.global.clojure" + }, + { + "foreground": "#49ACE9", + "token": "source.python meta.function-call.python support.type.python" + }, + { + "foreground": "#49ACE9", + "token": "entity.other.inherited-class.python" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.definition.interpolation" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.section.embedded.begin.ruby" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.section.embedded.end.ruby source.ruby" + }, + { + "foreground": "#49ACE9", + "token": "support.constant.math" + }, + { + "foreground": "#49ACE9", + "token": "entity.namespace.r" + }, + { + "foreground": "#49ACE9", + "token": "meta.method-call.groovy storage.type.groovy" + }, + { + "foreground": "#49ACE9", + "token": "source.scala entity.name.class.declaration" + }, + { + "foreground": "#49ACE9", + "token": "constant.character.escape" + }, + { + "foreground": "#49ACE9", + "token": "support.function.macro.julia" + }, + { + "foreground": "#49ACE9", + "token": "string.replacement.apacheconf" + }, + { + "foreground": "#49ACE9", + "token": "storage.modifier.using.vala" + }, + { + "foreground": "#49ACE9", + "token": "constant.other.haskell" + }, + { + "foreground": "#49ACE9", + "token": "source.objc entity.name.tag" + }, + { + "foreground": "#49ACE9", + "token": "string.quoted.other.literal.upper.crystal punctuation.definition.string" + }, + { + "foreground": "#49ACE9", + "token": "meta.embedded.line.crystal punctuation.section.embedded" + }, + { + "foreground": "#49ACE9", + "token": "meta.embedded.line.crystal punctuation.section.embedded source.crystal" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.section.embedded" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.section.tag" + }, + { + "foreground": "#49ACE9", + "token": "punctuation.section.embedded source.swift" + }, + { + "foreground": "#49ACE9", + "token": "variable.other.bracket punctuation.definition.variable" + }, + { + "foreground": "#49ACE9", + "token": "string.interpolated.dollar punctuation.definition.string" + }, + { + "foreground": "#49ACE9", + "token": "constant.character.escape punctuation.definition.keyword" + }, + { + "foreground": "#49ACE9", + "token": "source.ocaml entity.name.class constant.numeric" + }, + { + "foreground": "#49ACE9", + "token": "source.reason entity.name.class" + }, + { + "foreground": "#49ACE9", + "token": "keyword.format.specifier.fsharp" + }, + { + "foreground": "#49ACE9", + "token": "support.module.elm" + }, + { + "foreground": "#49ACE9", + "token": "meta.embedded.block.php punctuation.definition.variable.php" + }, + { + "foreground": "#49ACE9", + "token": "source.vala storage.type" + }, + { + "foreground": "#49ACE9", + "token": "support.variable.class.group" + }, + { + "foreground": "#49ACE9", + "token": "entity.name.type.class" + }, + { + "foreground": "#49ACE9", + "token": "source.tf meta.keyword.list" + }, + { + "foreground": "#49ACE9", + "token": "source.tf meta.keyword.map" + }, + { + "foreground": "#49ACE9", + "token": "entity.name.class.lua" + }, + { + "foreground": "#49ACE9", + "token": "markup.substitution" + }, + { + "foreground": "#E3541C", + "token": "invalid" + }, + { + "foreground": "#E3541C", + "token": "invalid.illegal" + }, + { + "fontStyle": "italic", + "token": "comment" + }, + { + "fontStyle": "italic", + "token": "storage.modifier" + }, + { + "fontStyle": "italic", + "token": "punctuation.definition.comment" + }, + { + "fontStyle": "italic", + "token": "entity.other" + }, + { + "fontStyle": "italic", + "token": "variable.language" + }, + { + "fontStyle": "italic", + "token": "support.type.vendored" + }, + { + "fontStyle": "italic", + "token": "support.constant.vendored" + }, + { + "fontStyle": "italic", + "token": "markup.quote" + }, + { + "fontStyle": "italic", + "token": "markup.italic" + }, + { + "fontStyle": "italic", + "token": "tag.decorator.js entity.name.tag.js" + }, + { + "fontStyle": "italic", + "token": "tag.decorator.js punctuation.definition.tag.js" + }, + { + "fontStyle": "italic", + "token": "keyword.control.clojure" + }, + { + "fontStyle": "italic", + "token": "source.clojure meta.symbol.dynamic" + }, + { + "fontStyle": "italic", + "token": "keyword.other.this.cs" + }, + { + "fontStyle": "italic", + "token": "keyword.other.base.cs" + }, + { + "fontStyle": "italic", + "token": "variable.other.member.c" + }, + { + "fontStyle": "italic", + "token": "support.type.core.rust" + }, + { + "fontStyle": "italic", + "token": "variable.other.object.property" + }, + { + "fontStyle": "italic", + "token": "variable.other.property" + }, + { + "fontStyle": "italic", + "token": "source.r meta.function.r keyword.control.r" + }, + { + "fontStyle": "italic", + "token": "comment.line.roxygen.r keyword" + }, + { + "fontStyle": "italic", + "token": "comment.line.roxygen.r variable.parameter.r" + }, + { + "fontStyle": "italic", + "token": "keyword.control.inheritance.coffee" + }, + { + "fontStyle": "italic", + "token": "comment.block.documentation.phpdoc.php keyword" + }, + { + "fontStyle": "italic", + "token": "keyword.other.array.phpdoc.php" + }, + { + "fontStyle": "italic", + "token": "storage.type.modifier" + }, + { + "fontStyle": "italic", + "token": "comment.block.javadoc.java keyword" + }, + { + "fontStyle": "italic", + "token": "comment.block.javadoc.java variable.parameter.java" + }, + { + "fontStyle": "italic", + "token": "keyword.operator.documentation.powershell" + }, + { + "fontStyle": "italic", + "token": "storage.type.scala" + }, + { + "fontStyle": "italic", + "token": "variable.parameter.function.language.special" + }, + { + "fontStyle": "italic", + "token": "comment.block.documentation.scala keyword" + }, + { + "fontStyle": "italic", + "token": "comment.block.documentation.scala variable.parameter" + }, + { + "fontStyle": "italic", + "token": "support.function.builtin.go" + }, + { + "fontStyle": "italic", + "token": "constant.other.symbol.hashkey.ruby" + }, + { + "fontStyle": "italic", + "token": "constant.other.symbol.hashkey.ruby punctuation.definition.constant.ruby" + }, + { + "fontStyle": "italic", + "token": "constant.other.symbol.ruby" + }, + { + "fontStyle": "italic", + "token": "source.vala storage.type.generic" + }, + { + "fontStyle": "italic", + "token": "constant.other.table-name" + }, + { + "fontStyle": "italic", + "token": "constant.other.placeholder" + }, + { + "fontStyle": "italic", + "token": "variable.other.field" + }, + { + "fontStyle": "italic", + "token": "entity.alias.import.go" + }, + { + "fontStyle": "italic", + "token": "source.swift keyword.other.declaration-specifier" + }, + { + "fontStyle": "italic", + "token": "support.variable.swift" + }, + { + "fontStyle": "italic", + "token": "keyword.other.capture-specifier" + }, + { + "fontStyle": "italic", + "token": "text.tex support.function.emph" + }, + { + "fontStyle": "italic", + "token": "constant.other.math" + }, + { + "fontStyle": "italic", + "token": "support.function.textit" + }, + { + "fontStyle": "italic", + "token": "entity.name.footnote" + }, + { + "fontStyle": "italic", + "token": "entity.name.function.directive.graphql" + }, + { + "fontStyle": "italic", + "token": "source.graphql support.type.enum" + }, + { + "fontStyle": "italic", + "token": "source.ocaml entity.name.filename" + }, + { + "fontStyle": "italic", + "token": "source.reason entity.name.filename" + }, + { + "fontStyle": "italic", + "token": "abstract.definition.fsharp keyword" + }, + { + "fontStyle": "italic", + "token": "abstract.definition.fsharp entity" + }, + { + "fontStyle": "italic", + "token": "function.anonymous keyword" + }, + { + "fontStyle": "italic", + "token": "entity.name.record.field.accessor.elm" + }, + { + "fontStyle": "italic", + "token": "support.type.primitive" + }, + { + "fontStyle": "italic", + "token": "support.type.builtin" + }, + { + "fontStyle": "italic", + "token": "keyword.type.cs" + }, + { + "fontStyle": "italic", + "token": "storage.type.built-in" + }, + { + "fontStyle": "italic", + "token": "storage.type.primitive" + }, + { + "fontStyle": "italic", + "token": "source.python support.type.python" + }, + { + "fontStyle": "italic", + "token": "storage.type.core.rust" + }, + { + "fontStyle": "italic", + "token": "source.swift support.type" + }, + { + "fontStyle": "italic", + "token": "source.go storage.type" + }, + { + "fontStyle": "italic", + "token": "storage.type.php" + }, + { + "fontStyle": "italic", + "token": "storage.type.function.kotlin" + }, + { + "fontStyle": "italic", + "token": "entity.name.type.kotlin" + }, + { + "fontStyle": "italic", + "token": "support.type.julia" + }, + { + "fontStyle": "italic", + "token": "variable.other.member" + }, + { + "fontStyle": "italic", + "token": "keyword.other.import" + }, + { + "fontStyle": "italic", + "token": "keyword.package" + }, + { + "fontStyle": "italic", + "token": "keyword.import" + }, + { + "fontStyle": "italic", + "token": "source.wsd keyword.control.diagram" + }, + { + "fontStyle": "italic", + "token": "keyword.language.gherkin.feature.step" + }, + { + "fontStyle": "italic", + "token": "source.hlsl storage.type.basic" + }, + { + "fontStyle": "italic", + "token": "source.apex keyword.type" + }, + { + "fontStyle": "italic", + "token": "sharing.modifier" + }, + { + "fontStyle": "italic", + "token": "source.nim storage.type.concrete" + }, + { + "fontStyle": "italic", + "token": "meta.preprocessor.pragma.nim" + }, + { + "fontStyle": "italic", + "token": "storage.type.integral" + }, + { + "fontStyle": "italic", + "token": "entity.name.scope-resolution.function.call" + }, + { + "fontStyle": "italic", + "token": "support.class.builtin" + }, + { + "fontStyle": "italic", + "token": "comment.block.documentation storage.type.class" + }, + { + "fontStyle": "italic", + "token": "source.tf meta.keyword.string" + }, + { + "fontStyle": "italic", + "token": "source.tf meta.keyword.number" + }, + { + "fontStyle": "italic", + "token": "source.scala entity.name.class" + }, + { + "fontStyle": "italic", + "token": "meta.import keyword.control" + }, + { + "fontStyle": "italic", + "token": "keyword.control.export" + }, + { + "fontStyle": "italic", + "token": "source.vue meta.directive punctuation.separator.key-value" + }, + { + "fontStyle": "italic", + "token": "keyword.local.lua" + }, + { + "fontStyle": "italic", + "token": "markup.list" + }, + { + "fontStyle": "italic", + "token": "markup.mark.constrained markup.mark" + }, + { + "fontStyle": "italic", + "token": "markup.block.open" + }, + { + "fontStyle": "bold", + "token": "keyword" + }, + { + "fontStyle": "bold", + "token": "keyword.control" + }, + { + "fontStyle": "bold", + "token": "keyword.operator" + }, + { + "fontStyle": "bold", + "token": "keyword.other.template" + }, + { + "fontStyle": "bold", + "token": "keyword.other.substitution" + }, + { + "fontStyle": "bold", + "token": "storage.type.function.arrow" + }, + { + "fontStyle": "bold", + "token": "constant.other.color" + }, + { + "fontStyle": "bold", + "token": "punctuation.accessor" + }, + { + "fontStyle": "bold", + "token": "entity.name.section" + }, + { + "fontStyle": "bold", + "token": "markup.bold" + }, + { + "fontStyle": "bold", + "token": "markup.bold string" + }, + { + "fontStyle": "bold", + "token": "markdown.heading" + }, + { + "fontStyle": "bold", + "token": "markup.inline.raw punctuation.definition.raw" + }, + { + "fontStyle": "bold", + "token": "markup.heading" + }, + { + "fontStyle": "bold", + "token": "storage.type.function.pug" + }, + { + "fontStyle": "bold", + "token": "storage.type.function.python" + }, + { + "fontStyle": "bold", + "token": "storage.type.annotation" + }, + { + "fontStyle": "bold", + "token": "punctuation.bracket.angle" + }, + { + "fontStyle": "bold", + "token": "keyword.other.new" + }, + { + "fontStyle": "bold", + "token": "punctuation.separator.question-mark.cs" + }, + { + "fontStyle": "bold", + "token": "storage.type.generic.wildcard" + }, + { + "fontStyle": "bold", + "token": "source.go keyword.operator" + }, + { + "fontStyle": "bold", + "token": "punctuation.separator.namespace" + }, + { + "fontStyle": "bold", + "token": "constant.other.symbol.ruby punctuation.definition.constant.ruby" + }, + { + "fontStyle": "bold", + "token": "variable.parameter" + }, + { + "fontStyle": "bold", + "token": "support.function.builtin.rust" + }, + { + "fontStyle": "bold", + "token": "storage.type.function.coffee" + }, + { + "fontStyle": "bold", + "token": "entity.name.variable.parameter" + }, + { + "fontStyle": "bold", + "token": "punctuation.separator.hash.cs" + }, + { + "fontStyle": "bold", + "token": "constant.other.symbol.ruby punctuation.definition.constant.ruby" + }, + { + "fontStyle": "bold", + "token": "constant.other.symbol.hashkey.ruby punctuation.definition.constant.ruby" + }, + { + "fontStyle": "bold", + "token": "meta.function.parameters variable.other" + }, + { + "fontStyle": "bold", + "token": "entity.name.type.annotation.kotlin" + }, + { + "fontStyle": "bold", + "token": "storage.type.objc" + }, + { + "fontStyle": "bold", + "token": "parameter.variable.function" + }, + { + "fontStyle": "bold", + "token": "markup punctuation.definition" + }, + { + "fontStyle": "bold", + "token": "punctuation.section.directive" + }, + { + "fontStyle": "bold", + "token": "punctuation.definition.preprocessor" + }, + { + "fontStyle": "bold", + "token": "source.ruby punctuation.definition.variable" + }, + { + "fontStyle": "bold", + "token": "punctuation.separator.method" + }, + { + "fontStyle": "bold", + "token": "support.function.textbf" + }, + { + "fontStyle": "bold", + "token": "source.graphql support.type.builtin" + }, + { + "fontStyle": "bold", + "token": "source.ocaml variable.interpolation string" + }, + { + "fontStyle": "bold", + "token": "entity.name.function.definition.special.constructor" + }, + { + "fontStyle": "bold", + "token": "entity.name.function.definition.special.member.destructor." + }, + { + "fontStyle": "bold", + "token": "meta.function.parameters variable punctuation.definition.variable.php" + }, + { + "fontStyle": "bold", + "token": "source.wsd keyword.other.activity" + }, + { + "fontStyle": "bold", + "token": "keyword.control.class.ruby" + }, + { + "fontStyle": "bold", + "token": "keyword.control.def.ruby" + }, + { + "fontStyle": "bold", + "token": "keyword.function.go" + }, + { + "fontStyle": "bold", + "token": "keyword.other.fn.rust" + }, + { + "fontStyle": "bold", + "token": "markup.other.anchor" + }, + { + "fontStyle": "bold", + "token": "markup.list.bullet" + }, + { + "fontStyle": "bold", + "token": "markup.list punctuation.definition" + }, + { + "fontStyle": "bold italic", + "token": "markup.bold markup.italic" + }, + { + "fontStyle": "bold italic", + "token": "markup.italic markup.bold" + }, + { + "fontStyle": "bold italic", + "token": "markup.quote markup.bold" + }, + { + "fontStyle": "bold italic", + "token": "markup.bold markup.italic string" + }, + { + "fontStyle": "bold italic", + "token": "markup.italic markup.bold string" + }, + { + "fontStyle": "bold italic", + "token": "markup.quote markup.bold string" + }, + { + "fontStyle": "bold italic", + "token": "text.html punctuation.section.embedded" + }, + { + "fontStyle": "bold italic", + "token": "variable.other.c" + }, + { + "fontStyle": "bold italic", + "token": "storage.modifier.lifetime.rust" + }, + { + "fontStyle": "bold italic", + "token": "entity.name.lifetime.rust" + }, + { + "fontStyle": "bold italic", + "token": "source.rust meta.attribute.rust" + }, + { + "fontStyle": "bold italic", + "token": "meta.attribute.id entity.other.attribute-name" + }, + { + "fontStyle": "bold italic", + "token": "source.ocaml punctuation.definition.tag emphasis" + }, + { + "fontStyle": "bold italic", + "token": "source.tf entity.name" + }, + { + "fontStyle": "bold italic", + "token": "markup.quote punctuation.definition" + }, + { + "fontStyle": "bold italic", + "token": "markup.fenced_code punctuation.definition" + }, + { + "fontStyle": "bold italic", + "token": "fenced_code.block.language" + }, + { + "fontStyle": "", + "token": "keyword.begin.tag.ejs" + }, + { + "fontStyle": "", + "token": "source.python meta.function.decorator.python support.type.python" + }, + { + "fontStyle": "", + "token": "source.cs keyword.other" + }, + { + "fontStyle": "", + "token": "keyword.other.var.cs" + }, + { + "fontStyle": "", + "token": "source.go keyword" + }, + { + "fontStyle": "", + "token": "storage.modifier.static.rust" + }, + { + "fontStyle": "", + "token": "variable.parameter.r" + }, + { + "fontStyle": "", + "token": "variable.parameter.handlebars" + }, + { + "fontStyle": "", + "token": "storage.modifier.import" + }, + { + "fontStyle": "", + "token": "storage.modifier.package" + }, + { + "fontStyle": "", + "token": "meta.class.identifier storage.modifier" + }, + { + "fontStyle": "", + "token": "keyword.operator.other.powershell" + }, + { + "fontStyle": "", + "token": "source.css variable.parameter" + }, + { + "fontStyle": "", + "token": "string.interpolated variable.parameter" + }, + { + "fontStyle": "", + "token": "source.apacheconf keyword" + }, + { + "fontStyle": "", + "token": "keyword.other.julia" + }, + { + "fontStyle": "", + "token": "storage.modifier.using.vala" + }, + { + "fontStyle": "", + "token": "source.objc keyword.other.property.attribute" + }, + { + "fontStyle": "", + "token": "source.sql keyword.other" + }, + { + "fontStyle": "", + "token": "keyword.other.using.vala" + }, + { + "fontStyle": "", + "token": "keyword.operator.function.infix" + }, + { + "fontStyle": "", + "token": "keyword.control.directive" + }, + { + "fontStyle": "", + "token": "keyword.other.rust" + }, + { + "fontStyle": "", + "token": "keyword.other.declaration-specifier.swift" + }, + { + "fontStyle": "", + "token": "entity.name.function.swift" + }, + { + "fontStyle": "", + "token": "keyword.control.class" + }, + { + "fontStyle": "", + "token": "keyword.control.def" + }, + { + "fontStyle": "", + "token": "punctuation.definition.variable" + }, + { + "fontStyle": "", + "token": "entity.name.section.latex" + }, + { + "fontStyle": "", + "token": "source.ocaml keyword markup.underline" + }, + { + "fontStyle": "", + "token": "source.ocaml constant.language constant.numeric entity.other.attribute-name.id.css" + }, + { + "fontStyle": "", + "token": "source.reason entity.other.attribute-name constant.language constant.numeric" + }, + { + "fontStyle": "", + "token": "keyword.format.specifier.fsharp" + }, + { + "fontStyle": "", + "token": "entity.name.section.fsharp" + }, + { + "fontStyle": "", + "token": "binding.fsharp keyword" + }, + { + "fontStyle": "", + "token": "binding.fsharp keyword.symbol" + }, + { + "fontStyle": "", + "token": "record.fsharp keyword" + }, + { + "fontStyle": "", + "token": "keyword.symbol.fsharp" + }, + { + "fontStyle": "", + "token": "entity.name.section.fsharp keyword" + }, + { + "fontStyle": "", + "token": "namespace.open.fsharp keyword" + }, + { + "fontStyle": "", + "token": "namespace.open.fsharp entity" + }, + { + "fontStyle": "", + "token": "storage.type" + }, + { + "fontStyle": "", + "token": "source.cpp keyword.other" + }, + { + "fontStyle": "", + "token": "source.c keyword.other" + }, + { + "fontStyle": "", + "token": "keyword.other.unit" + }, + { + "fontStyle": "", + "token": "storage.modifier.array.bracket" + }, + { + "fontStyle": "", + "token": "keyword.control.default" + }, + { + "fontStyle": "", + "token": "meta.import.haskell keyword" + }, + { + "fontStyle": "", + "token": "keyword.declaration.dart" + }, + { + "fontStyle": "", + "token": "source.wsd keyword.other" + }, + { + "fontStyle": "", + "token": "keyword.other.skinparam" + }, + { + "fontStyle": "", + "token": "source.css keyword.control" + }, + { + "fontStyle": "", + "token": "source.css keyword.operator" + }, + { + "fontStyle": "", + "token": "keyword.language.gherkin.feature.scenario" + }, + { + "fontStyle": "", + "token": "keyword.control.cucumber.table" + }, + { + "fontStyle": "", + "token": "source.toml entity.other.attribute-name" + }, + { + "fontStyle": "", + "token": "source.toml keyword" + }, + { + "fontStyle": "", + "token": "keyword.other.nim" + }, + { + "fontStyle": "", + "token": "source.nim keyword.other.common.function" + }, + { + "fontStyle": "", + "token": "source.nim keyword.other" + }, + { + "fontStyle": "", + "token": "source.scala keyword.declaration" + }, + { + "fontStyle": "", + "token": "source.scala entity.name.class.declaration" + }, + { + "fontStyle": "", + "token": "keyword.control.lua" + }, + { + "foreground": "#B95754", + "token": "comment" + }, + { + "foreground": "#B95754", + "token": "punctuation.definition.comment" + }, + { + "foreground": "#FFB3A7", + "token": "string" + }, + { + "foreground": "#FFB3A7", + "token": "meta.embedded.assembly" + }, + { + "foreground": "#DB5A6B", + "token": "keyword - keyword.operator" + }, + { + "foreground": "#DB5A6B", + "token": "keyword.control" + }, + { + "foreground": "#DB5A6B", + "token": "storage" + }, + { + "foreground": "#DB5A6B", + "token": "storage.type" + }, + { + "foreground": "#FCC9B9", + "token": "constant.numeric" + }, + { + "foreground": "#F2666C", + "token": "entity.name.type" + }, + { + "foreground": "#F2666C", + "token": "entity.name.class" + }, + { + "foreground": "#F2666C", + "token": "support.type" + }, + { + "foreground": "#F2666C", + "token": "support.class" + }, + { + "foreground": "#F47983", + "token": "entity.name.function" + }, + { + "foreground": "#F47983", + "token": "support.function" + }, + { + "foreground": "#F08F90", + "token": "variable" + }, + { + "foreground": "#F08F90", + "token": "entity.name.variable" + }, + { + "foreground": "#CBBEC2", + "token": "punctuation.definition.parameters.begin.ts" + }, + { + "foreground": "#CBBEC2", + "token": "punctuation.definition.parameters.end.ts" + }, + { + "foreground": "#F08F90", + "token": "storage.modifier.ts" + }, + { + "foreground": "#F08F90", + "token": "constant.language.import-export-all.ts" + }, + { + "foreground": "#F2666C", + "token": "entity.name.type.class.ts" + }, + { + "foreground": "#F2666C", + "token": "entity.name.type.class" + }, + { + "foreground": "#F2666C", + "token": "entity.other.inherited-class.ts" + }, + { + "foreground": "#F2666C", + "token": "support.constant.math.ts" + }, + { + "foreground": "#DB5A6B", + "token": "punctuation.definition.template-expression.begin.ts" + }, + { + "foreground": "#DB5A6B", + "token": "punctuation.definition.template-expression.end.ts" + }, + { + "foreground": "#F08F90", + "token": "variable.parameter.ts" + }, + { + "foreground": "#F08F90", + "token": "variable.other" + }, + { + "foreground": "#F08F90", + "token": "variable.other.constant" + }, + { + "foreground": "#F08F90", + "token": "meta.object.member" + }, + { + "foreground": "#E35C38", + "token": "keyword.operator.expression.instanceof" + }, + { + "foreground": "#E35C38", + "token": "keyword.operator.new" + }, + { + "foreground": "#E35C38", + "token": "keyword.operator.ternary" + }, + { + "foreground": "#E35C38", + "token": "keyword.operator.optional" + }, + { + "foreground": "#E35C38", + "token": "keyword.operator.expression.keyof" + }, + { + "foreground": "#E35C38", + "token": "punctuation.decorator.ts" + }, + { + "foreground": "#FFB3A7", + "token": "string.template" + }, + { + "foreground": "#F07F5E", + "token": "punctuation.definition.string.end.ts" + }, + { + "foreground": "#F07F5E", + "token": "punctuation.definition.string.begin.ts" + }, + { + "foreground": "#F07F5E", + "token": "punctuation.definition.string.template.begin.ts" + }, + { + "foreground": "#F07F5E", + "token": "punctuation.definition.string.template.end.ts" + }, + { + "foreground": "#B56C60", + "token": "variable.language.this.ts" + }, + { + "foreground": "#FCA474", + "token": "keyword.generator.asterisk.ts" + }, + { + "foreground": "#FCA474", + "token": "support" + }, + { + "foreground": "#FCA474", + "token": "meta.import.ts" + }, + { + "foreground": "#FCA474", + "token": "source.ts" + }, + { + "foreground": "#FA7B62", + "token": "keyword.operator.logical.ts" + }, + { + "foreground": "#FA7B62", + "token": "keyword.operator.assignment.ts" + }, + { + "foreground": "#FA7B62", + "token": "keyword.operator.arithmetic.ts" + }, + { + "foreground": "#7FFFFF", + "token": "punctuation.definition.string.begin.markdown" + }, + { + "foreground": "#7FFFFF", + "token": "punctuation.definition.string.end.markdown" + }, + { + "foreground": "#7FFFFF", + "token": "punctuation.definition.metadata.markdown" + }, + { + "foreground": "#FFB3A7", + "token": "string.json.comments" + }, + { + "foreground": "#FFB3A7", + "token": "source.json" + }, + { + "foreground": "#F4A079", + "token": "type.identifier.ts" + }, + { + "foreground": "#DF769B", + "token": "pointsOfInterest.ts" + }, + { + "foreground": "#F4A079", + "token": "type.identifier.js" + }, + { + "foreground": "#6796E6", + "token": "token.info-token" + }, + { + "foreground": "#CD9731", + "token": "token.warn-token" + }, + { + "foreground": "#F44747", + "token": "token.error-token" + }, + { + "foreground": "#B267E6", + "token": "token.debug-token" + } + ], + "encodedTokensColors": [] + } diff --git a/src/node_requires/monaco-themes/GoldenEye.json b/src/node_requires/monaco-themes/GoldenEye.json new file mode 100644 index 000000000..084db9d44 --- /dev/null +++ b/src/node_requires/monaco-themes/GoldenEye.json @@ -0,0 +1,347 @@ +{ + "inherit": true, + "base": "vs-dark", + "colors": { + "activityBar.activeBackground": "#ffd700", + "activityBar.activeBorder": "#ffd700", + "activityBar.background": "#144000", + "activityBar.border": "#ffd70033", + "activityBar.dropBorder": "#ff4500", + "activityBar.foreground": "#ff4500", + "activityBar.inactiveForeground": "#ffd700", + "activityBarBadge.background": "#ff4500", + "activityBarBadge.foreground": "#ffd700", + "badge.background": "#ff4500", + "badge.foreground": "#f0f0f0", + "breadcrumb.activeSelectionForeground": "#ffd700", + "breadcrumb.background": "#ffd70033", + "breadcrumb.focusForeground": "#ffd700", + "breadcrumb.foreground": "#ffd700", + "breadcrumbPicker.background": "#144000dd", + "button.background": "#ffd700", + "button.border": "#ffff00", + "button.foreground": "#144000", + "button.hoverBackground": "#ffff00", + "button.secondaryBackground": "#daa520", + "button.secondaryForeground": "#144000", + "button.secondaryHoverBackground": "#ffd700", + "button.separator": "#144000", + "charts.blue": "#0000ff", + "charts.green": "#008000", + "charts.orange": "#ffa500", + "charts.purple": "#800080", + "charts.red": "#ff0000", + "charts.yellow": "#ffff00", + "checkbox.background": "#ffd700", + "checkbox.border": "#ff4500", + "checkbox.foreground": "#144000", + "commandCenter.activeBackground": "#ffd700", + "commandCenter.activeBorder": "#ffff00", + "commandCenter.activeForeground": "#144000", + "commandCenter.background": "#14400088", + "commandCenter.border": "#ffff00", + "commandCenter.foreground": "#ffd700", + "commandCenter.inactiveBorder": "#14400088", + "contrastActiveBorder": "#00000000", + "contrastBorder": "#00000000", + "debugToolBar.background": "#ffd700", + "debugToolBar.border": "#ff4500", + "descriptionForeground": "#ffd700", + "dropdown.background": "#ffd700", + "dropdown.border": "#ffff00", + "dropdown.foreground": "#144000", + "dropdown.listBackground": "#144000dd", + "editor.background": "#144000", + "editor.foldBackground": "#ffff0055", + "editor.foreground": "#ffd700", + "editor.lineHighlightBackground": "#ffd70033", + "editor.selectionBackground": "#ffd70033", + "editor.selectionHighlightBackground": "#ffd70033", + "editor.wordHighlightTextBackground": "#ffd70033", + "editorBracketHighlight.foreground1": "#f5ff25", + "editorBracketHighlight.foreground2": "#f6cf23", + "editorBracketHighlight.foreground3": "#f89f21", + "editorBracketHighlight.foreground4": "#f96f20", + "editorBracketHighlight.foreground5": "#fb3f1e", + "editorBracketHighlight.foreground6": "#fc0e1c", + "editorBracketHighlight.unexpectedBracket.foreground": "#ff0000", + "editorBracketMatch.background": "#ffd70033", + "editorBracketMatch.border": "#00000000", + "editorCursor.background": "#144000", + "editorCursor.foreground": "#ffd700", + "editorGroup.border": "#ffd70033", + "editorGroupHeader.border": "#ffd70033", + "editorGroupHeader.tabsBackground": "#144000", + "editorGroupHeader.tabsBorder": "#14400044", + "editorGutter.background": "#144000", + "editorGutter.foldingControlForeground": "#ffd700", + "editorHoverWidget.background": "#14400088", + "editorHoverWidget.border": "#ffd70033", + "editorHoverWidget.foreground": "#ffd700", + "editorIndentGuide.activeBackground1": "#ffd70022", + "editorIndentGuide.activeBackground2": "#ffd70022", + "editorIndentGuide.activeBackground3": "#ffd70022", + "editorIndentGuide.activeBackground4": "#ffd70022", + "editorIndentGuide.activeBackground5": "#ffd70022", + "editorIndentGuide.activeBackground6": "#ffd70022", + "editorIndentGuide.background1": "#ffd70033", + "editorIndentGuide.background2": "#ffd70033", + "editorIndentGuide.background3": "#ffd70033", + "editorIndentGuide.background4": "#ffd70033", + "editorIndentGuide.background5": "#ffd70033", + "editorIndentGuide.background6": "#ffd70033", + "editorLineNumber.activeForeground": "#ff4500", + "editorLineNumber.foreground": "#ffd70033", + "editorLink.activeForeground": "#ff4500", + "editorRuler.foreground": "#ffd70033", + "editorSuggestWidget.background": "#144000dd", + "editorSuggestWidget.border": "#ffd70033", + "editorSuggestWidget.focusHighlightForeground": "#ffd700", + "editorSuggestWidget.highlightForeground": "#ffd700", + "editorSuggestWidget.selectedBackground": "#ffd70033", + "editorSuggestWidget.selectedForeground": "#ffff00", + "editorSuggestWidget.selectedIconForeground": "#ffff00", + "editorWhitespace.foreground": "#ffd70033", + "editorWidget.background": "#144000dd", + "editorWidget.border": "#ffd70033", + "editorWidget.foreground": "#ffd700", + "editorWidget.resizeBorder": "#ffff00", + "errorForeground": "#ff0000", + "extensionButton.background": "#daa520", + "extensionIcon.starForeground": "#ffff00", + "focusBorder": "#00000000", + "foreground": "#ffd700", + "gitDecoration.addedResourceForeground": "#ff4500", + "gitDecoration.conflictingResourceForeground": "#ff4500", + "gitDecoration.deletedResourceForeground": "#ff4500", + "gitDecoration.ignoredResourceForeground": "#ff4500", + "gitDecoration.modifiedResourceForeground": "#ff4500", + "gitDecoration.renamedResourceForeground": "#ff4500", + "gitDecoration.stageDeletedResourceForeground": "#ff4500", + "gitDecoration.stageModifiedResourceForeground": "#ff4500", + "gitDecoration.submoduleResourceForeground": "#ff4500", + "gitDecoration.untrackedResourceForeground": "#ff4500", + "icon.foreground": "#ffd700", + "input.background": "#ffd70088", + "input.border": "#ffff00", + "input.foreground": "#144000", + "input.placeholderForeground": "#14400044", + "keybindingLabel.background": "#144000", + "keybindingLabel.border": "#ffd700aa", + "keybindingLabel.bottomBorder": "#ffd70033", + "keybindingLabel.foreground": "#ffd700", + "keybindingTable.headerBackground": "#ffd700aa", + "keybindingTable.rowsBackground": "#ffd70033", + "list.activeSelectionBackground": "#ffd700", + "list.activeSelectionForeground": "#144000", + "list.activeSelectionIconForeground": "#144000", + "list.dropBackground": "#ffd70033", + "list.hoverBackground": "#ffd70033", + "list.inactiveSelectionBackground": "#ffd70033", + "menu.background": "#144000", + "menu.border": "#ffd70033", + "menu.foreground": "#ffd700", + "menu.selectionBackground": "#ffd700", + "menu.selectionBorder": "#ffff00", + "menu.selectionForeground": "#114400", + "menu.separatorBackground": "#ffd70033", + "menubar.selectionBackground": "#144000", + "menubar.selectionBorder": "#ffd70033", + "menubar.selectionForeground": "#ffd700", + "panel.background": "#144000", + "panel.border": "#ffd70033", + "panelInput.border": "#ffff00", + "panelTitle.activeBorder": "#ffd700", + "panelTitle.activeForeground": "#ffd700", + "panelTitle.inactiveForeground": "#ffd70033", + "pickerGroup.border": "#ffd70033", + "pickerGroup.foreground": "#ffd70033", + "sash.hoverBorder": "#ffff00", + "scrollbar.shadow": "#ffd70066", + "scrollbarSlider.activeBackground": "#ffff00", + "scrollbarSlider.background": "#ffd70033", + "scrollbarSlider.hoverBackground": "#ffd700", + "selection.background": "#ffff00", + "settings.dropdownBackground": "#ffd700", + "settings.dropdownBorder": "#ffff00", + "settings.dropdownForeground": "#144000", + "settings.focusedRowBackground": "#ffd70033", + "settings.headerForeground": "#ffd700", + "settings.modifiedItemIndicator": "#ff4500", + "sideBar.background": "#144000", + "sideBar.border": "#ffd70033", + "sideBar.foreground": "#ffd700", + "sideBarSectionHeader.background": "#ffd70033", + "sideBarSectionHeader.border": "#ffd70033", + "statusBar.background": "#144000", + "statusBar.border": "#ffd70033", + "statusBar.foreground": "#ffd700", + "tab.activeBackground": "#ffd700", + "tab.activeBorder": "#ffd700", + "tab.activeForeground": "#144000", + "tab.border": "#ffd70033", + "tab.hoverBorder": "#ffff00", + "tab.inactiveBackground": "#144000", + "tab.inactiveForeground": "#ffd70033", + "tab.unfocusedHoverBackground": "#ffff00", + "tab.unfocusedHoverBorder": "#ffff00", + "tab.unfocusedHoverForeground": "#14400033", + "terminal.ansiBlack": "#000000", + "terminal.ansiBlue": "#00008b", + "terminal.ansiBrightBlack": "#696969", + "terminal.ansiBrightBlue": "#0000ff", + "terminal.ansiBrightCyan": "#00ffff", + "terminal.ansiBrightGreen": "#008000", + "terminal.ansiBrightMagenta": "#ff00ff", + "terminal.ansiBrightRed": "#ff0000", + "terminal.ansiBrightWhite": "#ffffff", + "terminal.ansiBrightYellow": "#ff0000", + "terminal.ansiCyan": "#008b8b", + "terminal.ansiGreen": "#006400", + "terminal.ansiMagenta": "#8b008b", + "terminal.ansiRed": "#8b0000", + "terminal.ansiWhite": "#fbfbfb", + "terminal.ansiYellow": "#ffff00", + "terminal.background": "#144000", + "terminal.border": "#ffd70033", + "terminal.dropBackground": "#14400088", + "terminal.foreground": "#ffd700", + "terminal.inactiveSelectionBackground": "#ffd70033", + "terminal.selectionBackground": "#ffd70033", + "terminal.selectionForeground": "#14400033", + "terminal.tab.activeBorder": "#ff4500", + "terminalCommandDecoration.errorBackground": "#ff4500", + "terminalCursor.background": "#144000", + "terminalCursor.foreground": "#ffd700", + "textLink.activeForeground": "#ff4500", + "textLink.foreground": "#ffd700", + "textPreformat.foreground": "#ffd700", + "titleBar.activeBackground": "#144000", + "titleBar.activeForeground": "#ffd700", + "titleBar.border": "#ffd70033", + "tree.inactiveIndentGuidesStroke": "#ffd70088", + "tree.indentGuidesStroke": "#ffd70033", + "walkThrough.embeddedEditorBackground": "#144000", + "walkthrough.stepTitle.foreground": "#ffd700", + "welcomePage.progress.background": "#ffd700", + "welcomePage.progress.foreground": "#ff4500", + "welcomePage.tileBackground": "#ffffff12", + "welcomePage.tileBorder": "#ffff0044", + "welcomePage.tileHoverBackground": "#ffd70033", + "widget.shadow": "#ffd700" + }, + "rules": [ + { + "foreground": "#ffa500", + "token": "support.type.property-name.json" + }, + { + "foreground": "#ffff00", + "token": "string.quoted.double.json" + }, + { + "foreground": "#ffd700", + "token": "entity.name.tag.html" + }, + { + "foreground": "#ffd700", + "token": "punctuation.definition.tag" + }, + { + "foreground": "#ffd700", + "token": "punctuation.separator.key-value.html" + }, + { + "foreground": "#ffa500", + "token": "entity.other.attribute-name" + }, + { + "foreground": "#ffff00", + "token": "text.html" + }, + { + "foreground": "#ff6347", + "token": "storage" + }, + { + "foreground": "#ff6347", + "token": "keyword" + }, + { + "foreground": "#ff6347", + "token": "meta.var.expr.js" + }, + { + "foreground": "#ff6347", + "token": "meta.template.expression.js" + }, + { + "foreground": "#ffff00", + "token": "string.quoted.double.js" + }, + { + "foreground": "#ffff00", + "token": "string.quoted.single.js" + }, + { + "foreground": "#ffff00", + "token": "string.template.js" + }, + { + "foreground": "#ffd700", + "token": "variable" + }, + { + "foreground": "#9acd32", + "token": "meta.function" + }, + { + "foreground": "#9acd32", + "token": "meta.function-call" + }, + { + "foreground": "#ffd700", + "token": "punctuation.terminator.statement.js" + }, + { + "foreground": "#ffd700", + "token": "punctuation.separator.parameter.js" + }, + { + "foreground": "#ffa500", + "token": "constant" + }, + { + "foreground": "#ffa500", + "fontStyle": "bold", + "token": "markup.heading.markdown" + }, + { + "foreground": "#ffd700", + "token": "meta.paragraph.markdown" + }, + { + "foreground": "#ffd700", + "fontStyle": "bold", + "token": "markup.bold.markdown" + }, + { + "foreground": "#ffff00", + "token": "markup.fenced_code.block.markdown" + }, + { + "foreground": "#8fbc8f", + "token": "string.other.link.description.markdown" + }, + { + "foreground": "#888888", + "fontStyle": "italic", + "token": "comment" + }, + { + "foreground": "#FF4500", + "token": "invalid" + } + ], + "encodedTokensColors": [] + } diff --git a/src/node_requires/monaco-themes/OneDarkPro.json b/src/node_requires/monaco-themes/OneDarkPro.json new file mode 100644 index 000000000..1455eb8d1 --- /dev/null +++ b/src/node_requires/monaco-themes/OneDarkPro.json @@ -0,0 +1,1994 @@ +{ + "inherit": true, + "base": "vs-dark", + "colors": { + "activityBar.background": "#282c34", + "activityBar.foreground": "#d7dae0", + "activityBarBadge.background": "#4d78cc", + "activityBarBadge.foreground": "#f8fafd", + "badge.background": "#282c34", + "button.background": "#404754", + "button.secondaryBackground": "#30333d", + "button.secondaryForeground": "#c0bdbd", + "checkbox.border": "#404754", + "debugToolBar.background": "#21252b", + "descriptionForeground": "#abb2bf", + "diffEditor.insertedTextBackground": "#00809b33", + "dropdown.background": "#21252b", + "dropdown.border": "#21252b", + "editor.background": "#282c34", + "editor.findMatchBackground": "#42557b", + "editor.findMatchBorder": "#457dff", + "editor.findMatchHighlightBackground": "#6199ff2f", + "editor.foreground": "#abb2bf", + "editorBracketHighlight.foreground1": "#d19a66", + "editorBracketHighlight.foreground2": "#c678dd", + "editorBracketHighlight.foreground3": "#56b6c2", + "editorHoverWidget.highlightForeground": "#61afef", + "editorInlayHint.foreground": "#abb2bf", + "editorInlayHint.background": "#2c313c", + "editor.lineHighlightBackground": "#2c313c", + "editorLineNumber.activeForeground": "#abb2bf", + "editorGutter.addedBackground": "#109868", + "editorGutter.deletedBackground": "#9A353D", + "editorGutter.modifiedBackground": "#948B60", + "editorOverviewRuler.addedBackground": "#109868", + "editorOverviewRuler.deletedBackground": "#9A353D", + "editorOverviewRuler.modifiedBackground": "#948B60", + "editor.selectionBackground": "#67769660", + "editor.selectionHighlightBackground": "#ffffff10", + "editor.selectionHighlightBorder": "#dddddd", + "editor.wordHighlightBackground": "#d2e0ff2f", + "editor.wordHighlightBorder": "#7f848e", + "editor.wordHighlightStrongBackground": "#abb2bf26", + "editor.wordHighlightStrongBorder": "#7f848e", + "editorBracketMatch.background": "#515a6b", + "editorBracketMatch.border": "#515a6b", + "editorCursor.background": "#ffffffc9", + "editorCursor.foreground": "#528bff", + "editorError.foreground": "#c24038", + "editorGroup.background": "#181a1f", + "editorGroup.border": "#181a1f", + "editorGroupHeader.tabsBackground": "#21252b", + "editorHoverWidget.background": "#21252b", + "editorHoverWidget.border": "#181a1f", + "editorIndentGuide.activeBackground": "#c8c8c859", + "editorIndentGuide.background": "#3b4048", + "editorLineNumber.foreground": "#495162", + "editorMarkerNavigation.background": "#21252b", + "editorRuler.foreground": "#abb2bf26", + "editorSuggestWidget.background": "#21252b", + "editorSuggestWidget.border": "#181a1f", + "editorSuggestWidget.selectedBackground": "#2c313a", + "editorWarning.foreground": "#d19a66", + "editorWhitespace.foreground": "#ffffff1d", + "editorWidget.background": "#21252b", + "focusBorder": "#3e4452", + "gitDecoration.ignoredResourceForeground": "#636b78", + "input.background": "#1d1f23", + "input.foreground": "#abb2bf", + "list.activeSelectionBackground": "#2c313a", + "list.activeSelectionForeground": "#d7dae0", + "list.focusBackground": "#323842", + "list.focusForeground": "#f0f0f0", + "list.highlightForeground": "#ecebeb", + "list.hoverBackground": "#2c313a", + "list.hoverForeground": "#abb2bf", + "list.inactiveSelectionBackground": "#323842", + "list.inactiveSelectionForeground": "#d7dae0", + "list.warningForeground": "#d19a66", + "menu.foreground": "#abb2bf", + "menu.separatorBackground": "#343a45", + "minimapGutter.addedBackground": "#109868", + "minimapGutter.deletedBackground": "#9A353D", + "minimapGutter.modifiedBackground": "#948B60", + "panel.border": "#3e4452", + "panelSectionHeader.background": "#21252b", + "peekViewEditor.background": "#1b1d23", + "peekViewEditor.matchHighlightBackground": "#29244b", + "peekViewResult.background": "#22262b", + "scrollbar.shadow": "#23252c", + "scrollbarSlider.activeBackground": "#747d9180", + "scrollbarSlider.background": "#4e566660", + "scrollbarSlider.hoverBackground": "#5a637580", + "settings.focusedRowBackground": "#282c34", + "settings.headerForeground": "#fff", + "sideBar.background": "#21252b", + "sideBar.foreground": "#abb2bf", + "sideBarSectionHeader.background": "#282c34", + "sideBarSectionHeader.foreground": "#abb2bf", + "statusBar.background": "#21252b", + "statusBar.debuggingBackground": "#cc6633", + "statusBar.debuggingBorder": "#ff000000", + "statusBar.debuggingForeground": "#ffffff", + "statusBar.foreground": "#9da5b4", + "statusBar.noFolderBackground": "#21252b", + "statusBarItem.remoteBackground": "#4d78cc", + "statusBarItem.remoteForeground": "#f8fafd", + "tab.activeBackground": "#282c34", + "tab.activeBorder": "#b4b4b4", + "tab.activeForeground": "#dcdcdc", + "tab.border": "#181a1f", + "tab.hoverBackground": "#323842", + "tab.inactiveBackground": "#21252b", + "tab.unfocusedHoverBackground": "#323842", + "terminal.ansiBlack": "#3f4451", + "terminal.ansiBlue": "#4aa5f0", + "terminal.ansiBrightBlack": "#4f5666", + "terminal.ansiBrightBlue": "#4dc4ff", + "terminal.ansiBrightCyan": "#4cd1e0", + "terminal.ansiBrightGreen": "#a5e075", + "terminal.ansiBrightMagenta": "#de73ff", + "terminal.ansiBrightRed": "#ff616e", + "terminal.ansiBrightWhite": "#e6e6e6", + "terminal.ansiBrightYellow": "#f0a45d", + "terminal.ansiCyan": "#42b3c2", + "terminal.ansiGreen": "#8cc265", + "terminal.ansiMagenta": "#c162de", + "terminal.ansiRed": "#e05561", + "terminal.ansiWhite": "#d7dae0", + "terminal.ansiYellow": "#d18f52", + "terminal.background": "#282c34", + "terminal.border": "#3e4452", + "terminal.foreground": "#abb2bf", + "terminal.selectionBackground": "#abb2bf30", + "textBlockQuote.background": "#2e3440", + "textBlockQuote.border": "#4b5362", + "textLink.foreground": "#61afef", + "textPreformat.foreground": "#d19a66", + "titleBar.activeBackground": "#282c34", + "titleBar.activeForeground": "#9da5b4", + "titleBar.inactiveBackground": "#282c34", + "titleBar.inactiveForeground": "#6b717d", + "tree.indentGuidesStroke": "#ffffff1d", + "walkThrough.embeddedEditorBackground": "#2e3440", + "welcomePage.buttonHoverBackground": "#404754" + }, + "rules": [ + { + "foreground": "#abb2bf", + "token": "meta.embedded" + }, + { + "foreground": "#61AFEF", + "token": "identifier" + }, + { + "foreground": "#E06C75", + "token": "type.identifier" + }, + { + "foreground": "#D19A66", + "token": "number" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.delayed.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.list.begin.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.list.end.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.ability.begin.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.ability.end.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.operator.assignment.as.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.separator.pipe.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.separator.delimiter.unison" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.hash.unison" + }, + { + "foreground": "#c678dd", + "token": "variable.other.generic-type.haskell" + }, + { + "foreground": "#d19a66", + "token": "storage.type.haskell" + }, + { + "foreground": "#e06c75", + "token": "support.variable.magic.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.period.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.element.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.parenthesis.begin.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.parenthesis.end.python" + }, + { + "foreground": "#e5c07b", + "token": "variable.parameter.function.language.special.self.python" + }, + { + "foreground": "#e5c07b", + "token": "variable.parameter.function.language.special.cls.python" + }, + { + "foreground": "#abb2bf", + "token": "storage.modifier.lifetime.rust" + }, + { + "foreground": "#61afef", + "token": "support.function.std.rust" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.lifetime.rust" + }, + { + "foreground": "#e06c75", + "token": "variable.language.rust" + }, + { + "foreground": "#c678dd", + "token": "support.constant.edge" + }, + { + "foreground": "#e06c75", + "token": "constant.other.character-class.regexp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.word" + }, + { + "foreground": "#d19a66", + "token": "keyword.operator.quantifier.regexp" + }, + { + "foreground": "#abb2bf", + "token": "variable.parameter.function" + }, + { + "foreground": "#5c6370", + "token": "comment markup.link" + }, + { + "foreground": "#e5c07b", + "token": "markup.changed.diff" + }, + { + "foreground": "#61afef", + "token": "meta.diff.header.from-file" + }, + { + "foreground": "#61afef", + "token": "meta.diff.header.to-file" + }, + { + "foreground": "#61afef", + "token": "punctuation.definition.from-file.diff" + }, + { + "foreground": "#61afef", + "token": "punctuation.definition.to-file.diff" + }, + { + "foreground": "#98c379", + "token": "markup.inserted.diff" + }, + { + "foreground": "#e06c75", + "token": "markup.deleted.diff" + }, + { + "foreground": "#e06c75", + "token": "meta.function.c" + }, + { + "foreground": "#e06c75", + "token": "meta.function.cpp" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.block.begin.bracket.curly.cpp" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.block.end.bracket.curly.cpp" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.terminator.statement.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.block.begin.bracket.curly.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.block.end.bracket.curly.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.parens.begin.bracket.round.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.parens.end.bracket.round.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.parameters.begin.bracket.round.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.parameters.end.bracket.round.c" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.key-value" + }, + { + "foreground": "#61afef", + "token": "keyword.operator.expression.import" + }, + { + "foreground": "#e5c07b", + "token": "support.constant.math" + }, + { + "foreground": "#d19a66", + "token": "support.constant.property.math" + }, + { + "foreground": "#e5c07b", + "token": "variable.other.constant" + }, + { + "foreground": "#e5c07b", + "token": "storage.type.annotation.java" + }, + { + "foreground": "#e5c07b", + "token": "storage.type.object.array.java" + }, + { + "foreground": "#e06c75", + "token": "source.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.block.begin.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.block.end.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.method-parameters.begin.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.method-parameters.end.java" + }, + { + "foreground": "#abb2bf", + "token": "meta.method.identifier.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.method.begin.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.method.end.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.terminator.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.class.begin.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.class.end.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.inner-class.begin.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.inner-class.end.java" + }, + { + "foreground": "#abb2bf", + "token": "meta.method-call.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.class.begin.bracket.curly.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.class.end.bracket.curly.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.method.begin.bracket.curly.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.method.end.bracket.curly.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.period.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.bracket.angle.java" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.annotation.java" + }, + { + "foreground": "#abb2bf", + "token": "meta.method.body.java" + }, + { + "foreground": "#61afef", + "token": "meta.method.java" + }, + { + "foreground": "#e5c07b", + "token": "storage.modifier.import.java" + }, + { + "foreground": "#e5c07b", + "token": "storage.type.java" + }, + { + "foreground": "#e5c07b", + "token": "storage.type.generic.java" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.instanceof.java" + }, + { + "foreground": "#e06c75", + "token": "meta.definition.variable.name.java" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.logical" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.bitwise" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.channel" + }, + { + "foreground": "#d19a66", + "token": "support.constant.property-value.scss" + }, + { + "foreground": "#d19a66", + "token": "support.constant.property-value.css" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.css" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.scss" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.less" + }, + { + "foreground": "#d19a66", + "token": "support.constant.color.w3c-standard-color-name.css" + }, + { + "foreground": "#d19a66", + "token": "support.constant.color.w3c-standard-color-name.scss" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.list.comma.css" + }, + { + "foreground": "#d19a66", + "token": "support.constant.color.w3c-standard-color-name.css" + }, + { + "foreground": "#56b6c2", + "token": "support.type.vendored.property-name.css" + }, + { + "foreground": "#e5c07b", + "token": "support.module.node" + }, + { + "foreground": "#e5c07b", + "token": "support.type.object.module" + }, + { + "foreground": "#e5c07b", + "token": "support.module.node" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.type.module" + }, + { + "foreground": "#e06c75", + "token": "variable.other.readwrite" + }, + { + "foreground": "#e06c75", + "token": "meta.object-literal.key" + }, + { + "foreground": "#e06c75", + "token": "support.variable.property" + }, + { + "foreground": "#e06c75", + "token": "support.variable.object.process" + }, + { + "foreground": "#e06c75", + "token": "support.variable.object.node" + }, + { + "foreground": "#d19a66", + "token": "support.constant.json" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.instanceof" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.new" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.ternary" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.optional" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.keyof" + }, + { + "foreground": "#e06c75", + "token": "support.type.object.console" + }, + { + "foreground": "#d19a66", + "token": "support.variable.property.process" + }, + { + "foreground": "#61afef", + "token": "entity.name.function" + }, + { + "foreground": "#61afef", + "token": "support.function.console" + }, + { + "foreground": "#abb2bf", + "token": "keyword.operator.misc.rust" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.sigil.rust" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.delete" + }, + { + "foreground": "#56b6c2", + "token": "support.type.object.dom" + }, + { + "foreground": "#e06c75", + "token": "support.variable.dom" + }, + { + "foreground": "#e06c75", + "token": "support.variable.property.dom" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.arithmetic" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.comparison" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.decrement" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.increment" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.relational" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.assignment.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.comparison.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.increment.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.decrement.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.bitwise.shift.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.assignment.cpp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.comparison.cpp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.cpp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.increment.cpp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.decrement.cpp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.bitwise.shift.cpp" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.delimiter" + }, + { + "foreground": "#c678dd", + "token": "punctuation.separator.c" + }, + { + "foreground": "#c678dd", + "token": "punctuation.separator.cpp" + }, + { + "foreground": "#56b6c2", + "token": "support.type.posix-reserved.c" + }, + { + "foreground": "#56b6c2", + "token": "support.type.posix-reserved.cpp" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.sizeof.c" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.sizeof.cpp" + }, + { + "foreground": "#d19a66", + "token": "variable.parameter.function.language.python" + }, + { + "foreground": "#56b6c2", + "token": "support.type.python" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.logical.python" + }, + { + "foreground": "#d19a66", + "token": "variable.parameter.function.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.arguments.begin.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.arguments.end.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.arguments.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.list.begin.python" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.list.end.python" + }, + { + "foreground": "#61afef", + "token": "meta.function-call.generic.python" + }, + { + "foreground": "#d19a66", + "token": "constant.character.format.placeholder.other.python" + }, + { + "foreground": "#abb2bf", + "token": "keyword.operator" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.assignment.compound" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.assignment.compound.js" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.assignment.compound.ts" + }, + { + "foreground": "#c678dd", + "token": "keyword" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.namespace" + }, + { + "foreground": "#e06c75", + "token": "variable" + }, + { + "foreground": "#abb2bf", + "token": "variable.c" + }, + { + "foreground": "#e5c07b", + "token": "variable.language" + }, + { + "foreground": "#abb2bf", + "token": "token.variable.parameter.java" + }, + { + "foreground": "#e5c07b", + "token": "import.storage.java" + }, + { + "foreground": "#c678dd", + "token": "token.package.keyword" + }, + { + "foreground": "#abb2bf", + "token": "token.package" + }, + { + "foreground": "#61afef", + "token": "entity.name.function" + }, + { + "foreground": "#61afef", + "token": "meta.require" + }, + { + "foreground": "#61afef", + "token": "support.function.any-method" + }, + { + "foreground": "#61afef", + "token": "variable.function" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.type.namespace" + }, + { + "foreground": "#e5c07b", + "token": "support.class" + }, + { + "foreground": "#e5c07b", + "token": " entity.name.type.class" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.class.identifier.namespace.type" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.class" + }, + { + "foreground": "#e5c07b", + "token": "variable.other.class.js" + }, + { + "foreground": "#e5c07b", + "token": "variable.other.class.ts" + }, + { + "foreground": "#e06c75", + "token": "variable.other.class.php" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.type" + }, + { + "foreground": "#c678dd", + "token": "keyword.control" + }, + { + "foreground": "#d19a66", + "token": "control.elements" + }, + { + "foreground": "#d19a66", + "token": " keyword.operator.less" + }, + { + "foreground": "#61afef", + "token": "keyword.other.special-method" + }, + { + "foreground": "#c678dd", + "token": "storage" + }, + { + "foreground": "#c678dd", + "token": "token.storage" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.delete" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.in" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.of" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.instanceof" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.new" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.typeof" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.void" + }, + { + "foreground": "#e5c07b", + "token": "token.storage.type.java" + }, + { + "foreground": "#56b6c2", + "token": "support.function" + }, + { + "foreground": "#abb2bf", + "token": "support.type.property-name" + }, + { + "foreground": "#e06c75", + "token": "support.type.property-name.toml" + }, + { + "foreground": "#e06c75", + "token": " support.type.property-name.table.toml" + }, + { + "foreground": "#e06c75", + "token": " support.type.property-name.array.toml" + }, + { + "foreground": "#abb2bf", + "token": "support.constant.property-value" + }, + { + "foreground": "#d19a66", + "token": "support.constant.font-name" + }, + { + "foreground": "#abb2bf", + "token": "meta.tag" + }, + { + "foreground": "#98c379", + "token": "string" + }, + { + "foreground": "#56b6c2", + "token": "constant.other.symbol" + }, + { + "foreground": "#d19a66", + "token": "constant.numeric" + }, + { + "foreground": "#d19a66", + "token": "constant" + }, + { + "foreground": "#d19a66", + "token": "punctuation.definition.constant" + }, + { + "foreground": "#e06c75", + "token": "entity.name.tag" + }, + { + "foreground": "#d19a66", + "token": "entity.other.attribute-name" + }, + { + "foreground": "#61afef", + "token": "entity.other.attribute-name.id" + }, + { + "foreground": "#d19a66", + "token": "entity.other.attribute-name.class.css" + }, + { + "foreground": "#c678dd", + "token": "meta.selector" + }, + { + "foreground": "#e06c75", + "token": "markup.heading" + }, + { + "foreground": "#61afef", + "token": "markup.heading punctuation.definition.heading" + }, + { + "foreground": "#61afef", + "token": " entity.name.section" + }, + { + "foreground": "#e06c75", + "token": "keyword.other.unit" + }, + { + "foreground": "#d19a66", + "token": "markup.bold" + }, + { + "foreground": "#d19a66", + "token": "todo.bold" + }, + { + "foreground": "#e5c07b", + "token": "punctuation.definition.bold" + }, + { + "foreground": "#c678dd", + "token": "markup.italic" + }, + { + "foreground": "#c678dd", + "token": " punctuation.definition.italic" + }, + { + "foreground": "#c678dd", + "token": "todo.emphasis" + }, + { + "foreground": "#c678dd", + "token": "emphasis md" + }, + { + "foreground": "#e06c75", + "token": "entity.name.section.markdown" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.heading.markdown" + }, + { + "foreground": "#e5c07b", + "token": "punctuation.definition.list.begin.markdown" + }, + { + "foreground": "#abb2bf", + "token": "markup.heading.setext" + }, + { + "foreground": "#d19a66", + "token": "punctuation.definition.bold.markdown" + }, + { + "foreground": "#98c379", + "token": "markup.inline.raw.markdown" + }, + { + "foreground": "#98c379", + "token": "markup.inline.raw.string.markdown" + }, + { + "foreground": "#e5c07b", + "token": "punctuation.definition.raw.markdown" + }, + { + "foreground": "#e5c07b", + "token": "punctuation.definition.list.markdown" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.string.begin.markdown" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.string.end.markdown" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.metadata.markdown" + }, + { + "foreground": "#e06c75", + "token": "beginning.punctuation.definition.list.markdown" + }, + { + "foreground": "#e06c75", + "token": "punctuation.definition.metadata.markdown" + }, + { + "foreground": "#c678dd", + "token": "markup.underline.link.markdown" + }, + { + "foreground": "#c678dd", + "token": "markup.underline.link.image.markdown" + }, + { + "foreground": "#61afef", + "token": "string.other.link.title.markdown" + }, + { + "foreground": "#61afef", + "token": "string.other.link.description.markdown" + }, + { + "foreground": "#98c379", + "token": "markup.raw.monospace.asciidoc" + }, + { + "foreground": "#e5c07b", + "token": "punctuation.definition.asciidoc" + }, + { + "foreground": "#e5c07b", + "token": "markup.list.asciidoc" + }, + { + "foreground": "#c678dd", + "token": "markup.link.asciidoc" + }, + { + "foreground": "#c678dd", + "token": "markup.other.url.asciidoc" + }, + { + "foreground": "#61afef", + "token": "string.unquoted.asciidoc" + }, + { + "foreground": "#61afef", + "token": "markup.other.url.asciidoc" + }, + { + "foreground": "#56b6c2", + "token": "string.regexp" + }, + { + "foreground": "#e06c75", + "token": "punctuation.section.embedded" + }, + { + "foreground": "#e06c75", + "token": " variable.interpolation" + }, + { + "foreground": "#c678dd", + "token": "punctuation.section.embedded.begin" + }, + { + "foreground": "#c678dd", + "token": "punctuation.section.embedded.end" + }, + { + "foreground": "#ffffff", + "token": "invalid.illegal" + }, + { + "foreground": "#abb2bf", + "token": "invalid.illegal.bad-ampersand.html" + }, + { + "foreground": "#e06c75", + "token": "invalid.illegal.unrecognized-tag.html" + }, + { + "foreground": "#ffffff", + "token": "invalid.broken" + }, + { + "foreground": "#ffffff", + "token": "invalid.deprecated" + }, + { + "foreground": "#d19a66", + "token": "invalid.deprecated.entity.other.attribute-name.html" + }, + { + "foreground": "#ffffff", + "token": "invalid.unimplemented" + }, + { + "foreground": "#e06c75", + "token": "source.json meta.structure.dictionary.json > string.quoted.json" + }, + { + "foreground": "#e06c75", + "token": "source.json meta.structure.dictionary.json > string.quoted.json > punctuation.string" + }, + { + "foreground": "#98c379", + "token": "source.json meta.structure.dictionary.json > value.json > string.quoted.json" + }, + { + "foreground": "#98c379", + "token": "source.json meta.structure.array.json > value.json > string.quoted.json" + }, + { + "foreground": "#98c379", + "token": "source.json meta.structure.dictionary.json > value.json > string.quoted.json > punctuation" + }, + { + "foreground": "#98c379", + "token": "source.json meta.structure.array.json > value.json > string.quoted.json > punctuation" + }, + { + "foreground": "#56b6c2", + "token": "source.json meta.structure.dictionary.json > constant.language.json" + }, + { + "foreground": "#56b6c2", + "token": "source.json meta.structure.array.json > constant.language.json" + }, + { + "foreground": "#e06c75", + "token": "support.type.property-name.json" + }, + { + "foreground": "#e06c75", + "token": "support.type.property-name.json punctuation" + }, + { + "foreground": "#c678dd", + "token": "text.html.laravel-blade source.php.embedded.line.html entity.name.tag.laravel-blade" + }, + { + "foreground": "#c678dd", + "token": "text.html.laravel-blade source.php.embedded.line.html support.constant.laravel-blade" + }, + { + "foreground": "#e5c07b", + "token": "support.other.namespace.use.php" + }, + { + "foreground": "#e5c07b", + "token": "support.other.namespace.use-as.php" + }, + { + "foreground": "#e5c07b", + "token": "entity.other.alias.php" + }, + { + "foreground": "#e5c07b", + "token": "meta.interface.php" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.error-control.php" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.type.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.array.begin.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.array.end.php" + }, + { + "foreground": "#f44747", + "token": "invalid.illegal.non-null-typehinted.php" + }, + { + "foreground": "#e5c07b", + "token": "storage.type.php" + }, + { + "foreground": "#e5c07b", + "token": "meta.other.type.phpdoc.php" + }, + { + "foreground": "#e5c07b", + "token": "keyword.other.type.php" + }, + { + "foreground": "#e5c07b", + "token": "keyword.other.array.phpdoc.php" + }, + { + "foreground": "#61afef", + "token": "meta.function-call.php" + }, + { + "foreground": "#61afef", + "token": "meta.function-call.object.php" + }, + { + "foreground": "#61afef", + "token": "meta.function-call.static.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.parameters.begin.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.parameters.end.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.delimiter.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.scope.begin.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.section.scope.end.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.terminator.expression.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.arguments.begin.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.arguments.end.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.storage-type.begin.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.storage-type.end.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.array.begin.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.array.end.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.begin.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.end.bracket.round.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.begin.bracket.curly.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.end.bracket.curly.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.section.switch-block.end.bracket.curly.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.section.switch-block.start.bracket.curly.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.section.switch-block.begin.bracket.curly.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.section.switch-block.end.bracket.curly.php" + }, + { + "foreground": "#d19a66", + "token": "support.constant.core.rust" + }, + { + "foreground": "#d19a66", + "token": "support.constant.ext.php" + }, + { + "foreground": "#d19a66", + "token": "support.constant.std.php" + }, + { + "foreground": "#d19a66", + "token": "support.constant.core.php" + }, + { + "foreground": "#d19a66", + "token": "support.constant.parser-token.php" + }, + { + "foreground": "#61afef", + "token": "entity.name.goto-label.php" + }, + { + "foreground": "#61afef", + "token": "support.other.php" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.logical.php" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.bitwise.php" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.arithmetic.php" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.regexp.php" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.comparison.php" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.heredoc.php" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.nowdoc.php" + }, + { + "foreground": "#61afef", + "token": "meta.function.decorator.python" + }, + { + "foreground": "#56b6c2", + "token": "support.token.decorator.python" + }, + { + "foreground": "#56b6c2", + "token": "meta.function.decorator.identifier.python" + }, + { + "foreground": "#abb2bf", + "token": "function.parameter" + }, + { + "foreground": "#abb2bf", + "token": "function.brace" + }, + { + "foreground": "#abb2bf", + "token": "function.parameter.ruby" + }, + { + "foreground": "#abb2bf", + "token": " function.parameter.cs" + }, + { + "foreground": "#56b6c2", + "token": "constant.language.symbol.ruby" + }, + { + "foreground": "#56b6c2", + "token": "constant.language.symbol.hashkey.ruby" + }, + { + "foreground": "#56b6c2", + "token": "rgb-value" + }, + { + "foreground": "#d19a66", + "token": "inline-color-decoration rgb-value" + }, + { + "foreground": "#d19a66", + "token": "less rgb-value" + }, + { + "foreground": "#e06c75", + "token": "selector.sass" + }, + { + "foreground": "#e5c07b", + "token": "support.type.primitive.ts" + }, + { + "foreground": "#e5c07b", + "token": "support.type.builtin.ts" + }, + { + "foreground": "#e5c07b", + "token": "support.type.primitive.tsx" + }, + { + "foreground": "#e5c07b", + "token": "support.type.builtin.tsx" + }, + { + "foreground": "#abb2bf", + "token": "block.scope.end" + }, + { + "foreground": "#abb2bf", + "token": "block.scope.begin" + }, + { + "foreground": "#e5c07b", + "token": "storage.type.cs" + }, + { + "foreground": "#e06c75", + "token": "entity.name.variable.local.cs" + }, + { + "foreground": "#61afef", + "token": "token.info-token" + }, + { + "foreground": "#d19a66", + "token": "token.warn-token" + }, + { + "foreground": "#f44747", + "token": "token.error-token" + }, + { + "foreground": "#c678dd", + "token": "token.debug-token" + }, + { + "foreground": "#c678dd", + "token": "punctuation.definition.template-expression.begin" + }, + { + "foreground": "#c678dd", + "token": "punctuation.definition.template-expression.end" + }, + { + "foreground": "#c678dd", + "token": "punctuation.section.embedded" + }, + { + "foreground": "#abb2bf", + "token": "meta.template.expression" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.module" + }, + { + "foreground": "#61afef", + "token": "support.type.type.flowtype" + }, + { + "foreground": "#e5c07b", + "token": "support.type.primitive" + }, + { + "foreground": "#e06c75", + "token": "meta.property.object" + }, + { + "foreground": "#e06c75", + "token": "variable.parameter.function.js" + }, + { + "foreground": "#98c379", + "token": "keyword.other.template.begin" + }, + { + "foreground": "#98c379", + "token": "keyword.other.template.end" + }, + { + "foreground": "#98c379", + "token": "keyword.other.substitution.begin" + }, + { + "foreground": "#98c379", + "token": "keyword.other.substitution.end" + }, + { + "foreground": "#56b6c2", + "token": "keyword.operator.assignment" + }, + { + "foreground": "#e5c07b", + "token": "keyword.operator.assignment.go" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.arithmetic.go" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.address.go" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.package.go" + }, + { + "foreground": "#56b6c2", + "token": "support.type.prelude.elm" + }, + { + "foreground": "#d19a66", + "token": "support.constant.elm" + }, + { + "foreground": "#c678dd", + "token": "punctuation.quasi.element" + }, + { + "foreground": "#e06c75", + "token": "constant.character.entity" + }, + { + "foreground": "#56b6c2", + "token": "entity.other.attribute-name.pseudo-element" + }, + { + "foreground": "#56b6c2", + "token": "entity.other.attribute-name.pseudo-class" + }, + { + "foreground": "#e5c07b", + "token": "entity.global.clojure" + }, + { + "foreground": "#e06c75", + "token": "meta.symbol.clojure" + }, + { + "foreground": "#56b6c2", + "token": "constant.keyword.clojure" + }, + { + "foreground": "#e06c75", + "token": "meta.arguments.coffee" + }, + { + "foreground": "#e06c75", + "token": "variable.parameter.function.coffee" + }, + { + "foreground": "#98c379", + "token": "source.ini" + }, + { + "foreground": "#e06c75", + "token": "meta.scope.prerequisites.makefile" + }, + { + "foreground": "#e5c07b", + "token": "source.makefile" + }, + { + "foreground": "#e5c07b", + "token": "storage.modifier.import.groovy" + }, + { + "foreground": "#61afef", + "token": "meta.method.groovy" + }, + { + "foreground": "#e06c75", + "token": "meta.definition.variable.name.groovy" + }, + { + "foreground": "#98c379", + "token": "meta.definition.class.inherited.classes.groovy" + }, + { + "foreground": "#e5c07b", + "token": "support.variable.semantic.hlsl" + }, + { + "foreground": "#c678dd", + "token": "support.type.texture.hlsl" + }, + { + "foreground": "#c678dd", + "token": "support.type.sampler.hlsl" + }, + { + "foreground": "#c678dd", + "token": "support.type.object.hlsl" + }, + { + "foreground": "#c678dd", + "token": "support.type.object.rw.hlsl" + }, + { + "foreground": "#c678dd", + "token": "support.type.fx.hlsl" + }, + { + "foreground": "#c678dd", + "token": "support.type.object.hlsl" + }, + { + "foreground": "#e06c75", + "token": "text.variable" + }, + { + "foreground": "#e06c75", + "token": "text.bracketed" + }, + { + "foreground": "#e5c07b", + "token": "support.type.swift" + }, + { + "foreground": "#e5c07b", + "token": "support.type.vb.asp" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.function.xi" + }, + { + "foreground": "#56b6c2", + "token": "entity.name.class.xi" + }, + { + "foreground": "#e06c75", + "token": "constant.character.character-class.regexp.xi" + }, + { + "foreground": "#c678dd", + "token": "constant.regexp.xi" + }, + { + "foreground": "#56b6c2", + "token": "keyword.control.xi" + }, + { + "foreground": "#abb2bf", + "token": "invalid.xi" + }, + { + "foreground": "#98c379", + "token": "beginning.punctuation.definition.quote.markdown.xi" + }, + { + "foreground": "#7f848e", + "token": "beginning.punctuation.definition.list.markdown.xi" + }, + { + "foreground": "#61afef", + "token": "constant.character.xi" + }, + { + "foreground": "#61afef", + "token": "accent.xi" + }, + { + "foreground": "#d19a66", + "token": "wikiword.xi" + }, + { + "foreground": "#ffffff", + "token": "constant.other.color.rgb-value.xi" + }, + { + "foreground": "#5c6370", + "token": "punctuation.definition.tag.xi" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.label.cs" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.scope-resolution.function.call" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.scope-resolution.function.definition" + }, + { + "foreground": "#e06c75", + "token": "entity.name.label.cs" + }, + { + "foreground": "#e06c75", + "token": "markup.heading.setext.1.markdown" + }, + { + "foreground": "#e06c75", + "token": "markup.heading.setext.2.markdown" + }, + { + "foreground": "#abb2bf", + "token": " meta.brace.square" + }, + { + "foreground": "#7f848e", + "fontStyle": "italic", + "token": "comment" + }, + { + "foreground": "#7f848e", + "fontStyle": "italic", + "token": " punctuation.definition.comment" + }, + { + "foreground": "#5c6370", + "token": "markup.quote.markdown" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.definition.block.sequence.item.yaml" + }, + { + "foreground": "#56b6c2", + "token": "constant.language.symbol.elixir" + }, + { + "foreground": "#56b6c2", + "token": "constant.language.symbol.double-quoted.elixir" + }, + { + "foreground": "#e5c07b", + "token": "entity.name.variable.parameter.cs" + }, + { + "foreground": "#e06c75", + "token": "entity.name.variable.field.cs" + }, + { + "foreground": "#e06c75", + "token": "markup.deleted" + }, + { + "foreground": "#98c379", + "token": "markup.inserted" + }, + { + "fontStyle": "underline", + "token": "markup.underline" + }, + { + "foreground": "#BE5046", + "token": "punctuation.section.embedded.begin.php" + }, + { + "foreground": "#BE5046", + "token": "punctuation.section.embedded.end.php" + }, + { + "foreground": "#abb2bf", + "token": "support.other.namespace.php" + }, + { + "foreground": "#e06c75", + "token": "variable.parameter.function.latex" + }, + { + "foreground": "#e5c07b", + "token": "variable.other.object" + }, + { + "foreground": "#e06c75", + "token": "variable.other.constant.property" + }, + { + "foreground": "#e5c07b", + "token": "entity.other.inherited-class" + }, + { + "foreground": "#e06c75", + "token": "variable.other.readwrite.c" + }, + { + "foreground": "#abb2bf", + "token": "entity.name.variable.parameter.php" + }, + { + "foreground": "#abb2bf", + "token": "punctuation.separator.colon.php" + }, + { + "foreground": "#abb2bf", + "token": "constant.other.php" + }, + { + "foreground": "#c678dd", + "token": "constant.numeric.decimal.asm.x86_64" + }, + { + "foreground": "#d19a66", + "token": "support.other.parenthesis.regexp" + }, + { + "foreground": "#56b6c2", + "token": "constant.character.escape" + }, + { + "foreground": "#e06c75", + "token": "string.regexp" + }, + { + "foreground": "#98c379", + "token": "log.info" + }, + { + "foreground": "#e5c07b", + "token": "log.warning" + }, + { + "foreground": "#e06c75", + "token": "log.error" + }, + { + "foreground": "#c678dd", + "token": "keyword.operator.expression.is" + }, + { + "foreground": "#e06c75", + "token": "entity.name.label" + }, + { + "fontStyle": "italic", + "token": "entity.other.attribute-name.js" + }, + { + "fontStyle": "italic", + "token": "entity.other.attribute-name.ts" + }, + { + "fontStyle": "italic", + "token": "entity.other.attribute-name.jsx" + }, + { + "fontStyle": "italic", + "token": "entity.other.attribute-name.tsx" + }, + { + "fontStyle": "italic", + "token": "variable.parameter" + }, + { + "fontStyle": "italic", + "token": "variable.language.super" + }, + { + "fontStyle": "italic", + "foreground": "#E5C07B", + "token": "pointsOfInterest.ts" + }, + { + "fontStyle": "italic", + "foreground": "#E5C07B", + "token": "pointsOfInterest.coffee" + }, + { + "fontStyle": "italic", + "token": "comment.line.double-slash" + }, + { + "fontStyle": "italic", + "token": "comment.block.documentation" + }, + { + "fontStyle": "italic", + "token": "markup.italic.markdown" + } + ], + "encodedTokensColors": [] +} diff --git a/src/node_requires/monaco-themes/Synthwave.json b/src/node_requires/monaco-themes/Synthwave.json new file mode 100644 index 000000000..c4ac00182 --- /dev/null +++ b/src/node_requires/monaco-themes/Synthwave.json @@ -0,0 +1,703 @@ +{ + "inherit": true, + "base": "vs-dark", + "colors": { + "focusBorder": "#1f212b", + "foreground": "#ffffff", + "widget.shadow": "#2a2139", + "selection.background": "#ffffff20", + "errorForeground": "#fe4450", + "textLink.activeForeground": "#ff7edb", + "textLink.foreground": "#f97e72", + "button.background": "#614D85", + "dropdown.background": "#232530", + "dropdown.listBackground": "#2a2139", + "input.background": "#2a2139", + "inputOption.activeBorder": "#ff7edb99", + "inputValidation.errorBackground": "#fe445080", + "inputValidation.errorBorder": "#fe445000", + "scrollbar.shadow": "#2a2139", + "scrollbarSlider.activeBackground": "#9d8bca20", + "scrollbarSlider.background": "#9d8bca30", + "scrollbarSlider.hoverBackground": "#9d8bca50", + "badge.foreground": "#ffffff", + "badge.background": "#2a2139", + "progressBar.background": "#f97e72", + "list.activeSelectionBackground": "#ffffff20", + "list.activeSelectionForeground": "#ffffff", + "list.dropBackground": "#34294f66", + "list.focusBackground": "#ffffff20", + "list.focusForeground": "#ffffff", + "list.highlightForeground": "#f97e72", + "list.hoverBackground": "#37294d99", + "list.hoverForeground": "#ffffff", + "list.inactiveSelectionBackground": "#ffffff20", + "list.inactiveSelectionForeground": "#ffffff", + "list.inactiveFocusBackground": "#2a213999", + "list.errorForeground": "#fe4450E6", + "list.warningForeground": "#72f1b8bb", + "activityBar.background": "#171520", + "activityBar.dropBackground": "#34294f66", + "activityBar.foreground": "#ffffffCC", + "activityBarBadge.background": "#f97e72", + "activityBarBadge.foreground": "#2a2139", + "sideBar.background": "#241b2f", + "sideBar.foreground": "#ffffff99", + "sideBar.dropBackground": "#34294f4c", + "sideBarSectionHeader.background": "#241b2f", + "sideBarSectionHeader.foreground": "#ffffffca", + "menu.background": "#463465", + "editorGroup.border": "#495495", + "editorGroup.dropBackground": "#4954954a", + "editorGroupHeader.tabsBackground": "#241b2f", + "tab.border": "#241b2f00", + "tab.activeBorder": "#880088", + "tab.inactiveBackground": "#262335", + "editor.background": "#241B2F", + "editorLineNumber.foreground": "#ffffff73", + "editorLineNumber.activeForeground": "#ffffffcc", + "editorCursor.background": "#241b2f", + "editorCursor.foreground": "#f97e72", + "editor.selectionBackground": "#ffffff20", + "editor.selectionHighlightBackground": "#ffffff20", + "editor.wordHighlightBackground": "#34294f88", + "editor.wordHighlightStrongBackground": "#34294f88", + "editor.findMatchBackground": "#D18616bb", + "editor.findMatchHighlightBackground": "#D1861655", + "editor.findRangeHighlightBackground": "#34294f1a", + "editor.hoverHighlightBackground": "#463564", + "editor.lineHighlightBorder": "#7059AB66", + "editor.rangeHighlightBackground": "#49549539", + "editorIndentGuide.background": "#444251", + "editorIndentGuide.activeBackground": "#A148AB80", + "editorRuler.foreground": "#A148AB80", + "editorCodeLens.foreground": "#ffffff7c", + "editorBracketMatch.background": "#34294f66", + "editorBracketMatch.border": "#495495", + "editorOverviewRuler.border": "#34294fb3", + "editorOverviewRuler.findMatchForeground": "#D1861699", + "editorOverviewRuler.modifiedForeground": "#b893ce99", + "editorOverviewRuler.addedForeground": "#09f7a099", + "editorOverviewRuler.deletedForeground": "#fe445099", + "editorOverviewRuler.errorForeground": "#fe4450dd", + "editorOverviewRuler.warningForeground": "#72f1b8cc", + "editorError.foreground": "#fe4450", + "editorWarning.foreground": "#72f1b8cc", + "editorGutter.modifiedBackground": "#b893ce8f", + "editorGutter.addedBackground": "#206d4bd6", + "editorGutter.deletedBackground": "#fa2e46a4", + "diffEditor.insertedTextBackground": "#0beb9935", + "diffEditor.removedTextBackground": "#fe445035", + "editorWidget.background": "#171520DC", + "editorWidget.border": "#ffffff22", + "editorWidget.resizeBorder": "#ffffff44", + "editorSuggestWidget.highlightForeground": "#f97e72", + "editorSuggestWidget.selectedBackground": "#ffffff36", + "peekView.border": "#495495", + "peekViewEditor.background": "#232530", + "peekViewEditor.matchHighlightBackground": "#D18616bb", + "peekViewResult.background": "#232530", + "peekViewResult.matchHighlightBackground": "#D1861655", + "peekViewResult.selectionBackground": "#2a213980", + "peekViewTitle.background": "#232530", + "panelTitle.activeBorder": "#f97e72", + "statusBar.background": "#241b2f", + "statusBar.foreground": "#ffffff80", + "statusBar.debuggingBackground": "#f97e72", + "statusBar.debuggingForeground": "#08080f", + "statusBar.noFolderBackground": "#241b2f", + "statusBarItem.prominentBackground": "#2a2139", + "statusBarItem.prominentHoverBackground": "#34294f", + "titleBar.activeBackground": "#241b2f", + "titleBar.inactiveBackground": "#241b2f", + "extensionButton.prominentBackground": "#f97e72", + "extensionButton.prominentHoverBackground": "#ff7edb", + "pickerGroup.foreground": "#f97e72ea", + "terminal.foreground": "#ffffff", + "terminal.ansiBlue": "#03edf9", + "terminal.ansiBrightBlue": "#03edf9", + "terminal.ansiBrightCyan": "#03edf9", + "terminal.ansiBrightGreen": "#72f1b8", + "terminal.ansiBrightMagenta": "#ff7edb", + "terminal.ansiBrightRed": "#fe4450", + "terminal.ansiBrightYellow": "#fede5d", + "terminal.ansiCyan": "#03edf9", + "terminal.ansiGreen": "#72f1b8", + "terminal.ansiMagenta": "#ff7edb", + "terminal.ansiRed": "#fe4450", + "terminal.ansiYellow": "#f3e70f", + "terminal.selectionBackground": "#ffffff20", + "terminalCursor.background": "#ffffff", + "terminalCursor.foreground": "#03edf9", + "debugToolBar.background": "#463465", + "walkThrough.embeddedEditorBackground": "#232530", + "gitDecoration.modifiedResourceForeground": "#b893ceee", + "gitDecoration.deletedResourceForeground": "#fe4450", + "gitDecoration.addedResourceForeground": "#72f1b8cc", + "gitDecoration.untrackedResourceForeground": "#72f1b8", + "gitDecoration.ignoredResourceForeground": "#ffffff59", + "minimapGutter.addedBackground": "#09f7a099", + "minimapGutter.modifiedBackground": "#b893ce", + "minimapGutter.deletedBackground": "#fe4450", + "breadcrumbPicker.background": "#232530" + }, + "rules": [ + { + "foreground": "#36F9F6", + "token": "identifier.ts" + }, + { + "foreground": "#72F1B8", + "token": "type.identifier.ts" + }, + { + "foreground": "#FF7EDB", + "token": "pointsOfInterest.ts" + }, + { + "foreground": "#848bbd", + "fontStyle": "italic", + "token": "comment" + }, + { + "foreground": "#848bbd", + "fontStyle": "italic", + "token": "string.quoted.docstring.multi.python" + }, + { + "foreground": "#848bbd", + "fontStyle": "italic", + "token": "string.quoted.docstring.multi.python punctuation.definition.string.begin.python" + }, + { + "foreground": "#848bbd", + "fontStyle": "italic", + "token": "string.quoted.docstring.multi.python punctuation.definition.string.end.python" + }, + { + "foreground": "#ff8b39", + "token": "string.quoted" + }, + { + "foreground": "#ff8b39", + "token": "string.template" + }, + { + "foreground": "#ff8b39", + "token": "punctuation.definition.string" + }, + { + "foreground": "#b6b1b1", + "token": "string.template meta.embedded.line" + }, + { + "foreground": "#ff7edb", + "token": "variable" + }, + { + "foreground": "#ff7edb", + "token": "entity.name.variable" + }, + { + "foreground": "#fe4450", + "fontStyle": "bold", + "token": "variable.language" + }, + { + "fontStyle": "italic", + "token": "variable.parameter" + }, + { + "foreground": "#fede5d", + "token": "storage.type" + }, + { + "foreground": "#fede5d", + "token": "storage.modifier" + }, + { + "foreground": "#f97e72", + "token": "constant" + }, + { + "foreground": "#f97e72", + "token": "string.regexp" + }, + { + "foreground": "#f97e72", + "token": "constant.numeric" + }, + { + "foreground": "#f97e72", + "token": "constant.language" + }, + { + "foreground": "#36f9f6", + "token": "constant.character.escape" + }, + { + "foreground": "#fe4450", + "token": "entity.name" + }, + { + "foreground": "#72f1b8", + "token": "entity.name.tag" + }, + { + "foreground": "#36f9f6", + "token": "punctuation.definition.tag" + }, + { + "foreground": "#fede5d", + "token": "entity.other.attribute-name" + }, + { + "foreground": "#fede5d", + "fontStyle": "italic", + "token": "entity.other.attribute-name.html" + }, + { + "foreground": "#fe4450", + "token": "entity.name.type" + }, + { + "foreground": "#fe4450", + "token": "meta.attribute.class.html" + }, + { + "foreground": "#DD5500", + "token": "entity.other.inherited-class" + }, + { + "foreground": "#36f9f6", + "token": "entity.name.function" + }, + { + "foreground": "#36f9f6", + "token": "variable.function" + }, + { + "foreground": "#72f1b8", + "token": "keyword.control.export.js" + }, + { + "foreground": "#72f1b8", + "token": "keyword.control.import.js" + }, + { + "foreground": "#2EE2FA", + "token": "constant.numeric.decimal.js" + }, + { + "foreground": "#fede5d", + "token": "keyword" + }, + { + "foreground": "#fede5d", + "token": "keyword.control" + }, + { + "foreground": "#fede5d", + "token": "keyword.operator" + }, + { + "foreground": "#fede5d", + "token": "keyword.operator.new" + }, + { + "foreground": "#fede5d", + "token": "keyword.operator.expression" + }, + { + "foreground": "#fede5d", + "token": "keyword.operator.logical" + }, + { + "foreground": "#f97e72", + "token": "keyword.other.unit" + }, + { + "foreground": "#fe4450", + "token": "support" + }, + { + "foreground": "#36f9f6", + "token": "support.function" + }, + { + "foreground": "#ff7edb", + "token": "support.variable" + }, + { + "foreground": "#ff7edb", + "token": "meta.object-literal.key" + }, + { + "foreground": "#ff7edb", + "token": "support.type.property-name" + }, + { + "foreground": "#b6b1b1", + "token": "punctuation.separator.key-value" + }, + { + "foreground": "#fede5d", + "token": "punctuation.section.embedded" + }, + { + "foreground": "#72f1b8", + "token": "punctuation.definition.template-expression.begin" + }, + { + "foreground": "#72f1b8", + "token": "punctuation.definition.template-expression.end" + }, + { + "foreground": "#72f1b8", + "token": "support.type.property-name.css" + }, + { + "foreground": "#72f1b8", + "token": "support.type.property-name.json" + }, + { + "foreground": "#72f1b8", + "token": "switch-block.expr.js" + }, + { + "foreground": "#2ee2fa", + "token": "variable.other.constant.property.js" + }, + { + "foreground": "#2ee2fa", + "token": " variable.other.property.js" + }, + { + "foreground": "#f97e72", + "token": "constant.other.color" + }, + { + "foreground": "#f97e72", + "token": "support.constant.font-name" + }, + { + "foreground": "#36f9f6", + "token": "entity.other.attribute-name.id" + }, + { + "foreground": "#DD5500", + "token": "entity.other.attribute-name.pseudo-element" + }, + { + "foreground": "#DD5500", + "token": "entity.other.attribute-name.pseudo-class" + }, + { + "foreground": "#fe4450", + "token": "support.function.misc.css" + }, + { + "foreground": "#ff7edb", + "token": "markup.heading" + }, + { + "foreground": "#ff7edb", + "token": "entity.name.section" + }, + { + "foreground": "#ffffffee", + "token": "text.html" + }, + { + "foreground": "#ffffffee", + "token": "keyword.operator.assignment" + }, + { + "foreground": "#b6b1b1cc", + "fontStyle": "italic", + "token": "markup.quote" + }, + { + "foreground": "#ff7edb", + "token": "beginning.punctuation.definition.list" + }, + { + "foreground": "#DD5500", + "token": "markup.underline.link" + }, + { + "foreground": "#f97e72", + "token": "string.other.link.description" + }, + { + "foreground": "#36f9f6", + "token": "meta.function-call.generic.python" + }, + { + "foreground": "#72f1b8", + "token": "variable.parameter.function-call.python" + }, + { + "foreground": "#fe4450", + "token": "storage.type.cs" + }, + { + "foreground": "#ff7edb", + "token": "entity.name.variable.local.cs" + }, + { + "foreground": "#ff7edb", + "token": "entity.name.variable.field.cs" + }, + { + "foreground": "#ff7edb", + "token": "entity.name.variable.property.cs" + }, + { + "foreground": "#72f1b8", + "fontStyle": "italic", + "token": "constant.other.placeholder.c" + }, + { + "foreground": "#72f1b8", + "token": "keyword.control.directive.include.c" + }, + { + "foreground": "#72f1b8", + "token": "keyword.control.directive.define.c" + }, + { + "foreground": "#fe4450", + "token": "storage.modifier.c" + }, + { + "foreground": "#fede5d", + "token": "source.cpp keyword.operator" + }, + { + "foreground": "#72f1b8", + "fontStyle": "italic", + "token": "constant.other.placeholder.cpp" + }, + { + "foreground": "#72f1b8", + "token": "keyword.control.directive.include.cpp" + }, + { + "foreground": "#72f1b8", + "token": "keyword.control.directive.define.cpp" + }, + { + "foreground": "#fe4450", + "token": "storage.modifier.specifier.const.cpp" + }, + { + "foreground": "#36f9f6", + "token": "source.elixir support.type.elixir" + }, + { + "foreground": "#36f9f6", + "token": "source.elixir meta.module.elixir entity.name.class.elixir" + }, + { + "foreground": "#72f1b8", + "token": "source.elixir entity.name.function" + }, + { + "foreground": "#36f9f6", + "token": "source.elixir constant.other.symbol.elixir" + }, + { + "foreground": "#36f9f6", + "token": "source.elixir constant.other.keywords.elixir" + }, + { + "foreground": "#72f1b8", + "token": "source.elixir punctuation.definition.string" + }, + { + "foreground": "#72f1b8", + "token": "source.elixir variable.other.readwrite.module.elixir" + }, + { + "foreground": "#72f1b8", + "token": "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir" + }, + { + "foreground": "#ff7edb", + "fontStyle": "italic", + "token": "source.elixir .punctuation.binary.elixir" + }, + { + "foreground": "#36f9f6", + "fontStyle": "bold", + "token": "entity.global.clojure" + }, + { + "foreground": "#36f9f6", + "fontStyle": "italic", + "token": "storage.control.clojure" + }, + { + "foreground": "#fe4450", + "fontStyle": "italic", + "token": "meta.metadata.simple.clojure" + }, + { + "foreground": "#fe4450", + "fontStyle": "italic", + "token": "meta.metadata.map.clojure" + }, + { + "fontStyle": "italic", + "token": "meta.quoted-expression.clojure" + }, + { + "foreground": "#ff7edbff", + "token": "meta.symbol.clojure" + }, + { + "foreground": "#ff7edbff", + "token": "source.go" + }, + { + "foreground": "#36f9f6", + "token": "source.go meta.function-call.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.package.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.import.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.function.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.type.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.const.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.var.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.map.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.channel.go" + }, + { + "foreground": "#fede5d", + "token": "source.go keyword.control.go" + }, + { + "foreground": "#72f1b8", + "token": "source.go storage.type" + }, + { + "foreground": "#72f1b8", + "token": "source.go keyword.struct.go" + }, + { + "foreground": "#72f1b8", + "token": "source.go keyword.interface.go" + }, + { + "foreground": "#2EE2FA", + "token": "source.go constant.language.go" + }, + { + "foreground": "#2EE2FA", + "token": "source.go constant.other.placeholder.go" + }, + { + "foreground": "#2EE2FA", + "token": "source.go variable" + }, + { + "foreground": "#72f1b8", + "fontStyle": "italic", + "token": "markup.underline.link.markdown" + }, + { + "foreground": "#72f1b8", + "fontStyle": "italic", + "token": "markup.inline.raw.string.markdown" + }, + { + "foreground": "#fede5d", + "token": "string.other.link.title.markdown" + }, + { + "foreground": "#ff7edb", + "fontStyle": "bold", + "token": "markup.heading.markdown" + }, + { + "foreground": "#ff7edb", + "fontStyle": "bold", + "token": "entity.name.section.markdown" + }, + { + "foreground": "#2EE2FA", + "fontStyle": "italic", + "token": "markup.italic.markdown" + }, + { + "foreground": "#2EE2FA", + "fontStyle": "bold", + "token": "markup.bold.markdown" + }, + { + "foreground": "#72f1b8", + "token": "punctuation.definition.quote.begin.markdown" + }, + { + "foreground": "#72f1b8", + "token": "markup.quote.markdown" + }, + { + "foreground": "#ff7edbff", + "token": "source.dart" + }, + { + "foreground": "#ff7edbff", + "token": "source.python" + }, + { + "foreground": "#ff7edbff", + "token": "source.scala" + }, + { + "foreground": "#f97e72", + "token": "string.interpolated.single.dart" + }, + { + "foreground": "#72f1b8", + "token": "variable.parameter.dart" + }, + { + "foreground": "#2EE2FA", + "token": "constant.numeric.dart" + }, + { + "foreground": "#2EE2FA", + "token": "variable.parameter.scala" + }, + { + "foreground": "#72f1b8", + "token": "meta.template.expression.scala" + } + ], + "encodedTokensColors": [] +} diff --git a/src/node_requires/patrons.ts b/src/node_requires/patrons.ts new file mode 100644 index 000000000..2d2856f05 --- /dev/null +++ b/src/node_requires/patrons.ts @@ -0,0 +1,51 @@ +import fs from 'fs-extra'; + +type ranks = 'cat' |'business cat' | 'partner'; +type Patron = { + name: string; + rank: ranks; + avatar: string; +} +type Donor = Omit; + +export const patrons: Record = { + cat: [], + 'business cat': [], + partner: [] +}; +export const donors: Donor[] = []; + +let loaded = false; +export const getPatrons = async (): Promise> => { + if (loaded) { + return patrons; + } + const raw = await fs.readFile('./data/patronsCache.json', 'utf8'); + let patronsJson: { + Patrons: Patron[]; + Donations: Donor[]; + } = JSON.parse(raw); + try { + patronsJson = await fetch('https://ctjs.rocks/staticApis/patrons.json').then(json => json.json()); + } catch (e) { + // eslint-disable-next-line no-console + console.warn(e); + } + for (const patron of patronsJson.Patrons) { + patrons[patron.rank].push(patron); + } + donors.push(...patronsJson.Donations); + // eslint-disable-next-line require-atomic-updates + loaded = true; + return patrons; +}; +export const getRandomPatron = async (): Promise => { + await getPatrons(); + let array = patrons.cat; + if (Math.random() < 0.5 && patrons.partner.length) { + array = patrons.partner; + } else if (Math.random() < 0.5 && patrons['business cat'].length) { + array = patrons['business cat']; + } + return array[Math.floor(Math.random() * array.length)]; +}; diff --git a/src/node_requires/platformUtils.ts b/src/node_requires/platformUtils.ts index 52fd61fbb..4692f949e 100644 --- a/src/node_requires/platformUtils.ts +++ b/src/node_requires/platformUtils.ts @@ -7,14 +7,24 @@ const isWin = (/win[0-9]+/).test(os.platform()); const isLinux = os.platform() === 'linux'; const isMac = !(isWin || isLinux); let isNodeInstalled = false; +let isDev = false; +try { + require('gulp'); + isDev = true; +} catch (e) { + void e; +} -const execa = require('execa'); +const {$} = require('execa'); (async () => { try { - await execa('node', ['-v']); + const {stdout} = await $`node -v`; isNodeInstalled = true; + // eslint-disable-next-line no-console + console.debug(`Detected node.js ${stdout} installed in the system.`); } catch (e) { isNodeInstalled = false; + console.debug('Could not detect node.js in the system.'); } })(); @@ -31,6 +41,7 @@ const mod = { isWindows: isWin, isLinux, isMac, + isDev, get isNodeInstalled(): boolean { return isNodeInstalled; }, @@ -83,7 +94,7 @@ const mod = { throw new Error(`Could not write to folder ${home}. It is needed to create builds and run debugger. Check rights to these folders, and tweak sandbox settings if it is used.`); } // Home directory takes priority - if (homeWritable) { + if (await homeWritable) { const ctFolder = path.join(home, 'ct.js'); await fs.ensureDir(ctFolder); if (await mod.checkWritable(ctFolder)) { @@ -144,9 +155,15 @@ const mod = { return path.join((nw.App as any).startPath, 'bundledAssets'); } catch { if (createHref) { - return ('file://' + path.posix.normalize(path.join(path.dirname(process.execPath), 'bundledAssets'))); + if (isMac) { + return 'file://' + path.posix.normalize(path.join(process.cwd(), 'bundledAssets')); + } + return ('file://' + path.posix.normalize(path.join(path.dirname(process.execPath), 'package.nw', 'bundledAssets'))); + } + if (isMac) { + return path.join(process.cwd(), 'bundledAssets'); } - return path.join(path.dirname(process.execPath), 'bundledAssets'); + return path.join(path.dirname(process.execPath), 'package.nw', 'bundledAssets'); } }, getProjectsDir(): Promise { diff --git a/src/node_requires/resources/IAsset.d.ts b/src/node_requires/resources/IAsset.d.ts index 76b82c01c..f1f51d853 100644 --- a/src/node_requires/resources/IAsset.d.ts +++ b/src/node_requires/resources/IAsset.d.ts @@ -2,4 +2,5 @@ interface IAsset { readonly type: resourceType; readonly uid: string; lastmod: number; + name: string; } diff --git a/src/node_requires/resources/IScriptable.d.ts b/src/node_requires/resources/IScriptable.d.ts index 90eab18e8..713187968 100644 --- a/src/node_requires/resources/IScriptable.d.ts +++ b/src/node_requires/resources/IScriptable.d.ts @@ -4,14 +4,22 @@ interface IScriptableEvent { arguments: { [key: string]: assetRef | string | number | boolean; }; + /** Used for Catnip only */ + variables?: string[]; /** The user-written JS/CoffeeScript code */ - code: string; + code: string | BlockScript; /** The codename of the current event, excluding the lib prefix, e.g. OnCreate */ eventKey: string; } /** Describes an asset that supports scripting through ct.js events */ interface IScriptable extends IAsset { - name: string; events: IScriptableEvent[]; + /** + * The contents of a TypeScript typedef that is combined + * with the base copy type of the edited asset. + */ + extendTypes: string; + /** Used for Catnip only */ + properties?: []; } diff --git a/src/node_requires/resources/behaviors/IBehavior.d.ts b/src/node_requires/resources/behaviors/IBehavior.d.ts index a3e575c19..70b223404 100644 --- a/src/node_requires/resources/behaviors/IBehavior.d.ts +++ b/src/node_requires/resources/behaviors/IBehavior.d.ts @@ -3,5 +3,5 @@ type BehaviorType = 'template' | 'room'; interface IBehavior extends IScriptable { type: 'behavior', readonly behaviorType: BehaviorType, - specification: UserDefinedField[] + specification: IFieldSchema[] } diff --git a/src/node_requires/resources/behaviors/defaultBehavior.ts b/src/node_requires/resources/behaviors/defaultBehavior.ts index 6170d3dfc..291e37d90 100644 --- a/src/node_requires/resources/behaviors/defaultBehavior.ts +++ b/src/node_requires/resources/behaviors/defaultBehavior.ts @@ -11,6 +11,7 @@ export const get = function get(type: BehaviorType): IBehavior { behaviorType: type, events: [], specification: [] as IFieldSchema[], + extendTypes: '', lastmod: Number(new Date()), uid: generateGUID() }); diff --git a/src/node_requires/resources/behaviors/index.ts b/src/node_requires/resources/behaviors/index.ts index 85828b429..d2455d38e 100644 --- a/src/node_requires/resources/behaviors/index.ts +++ b/src/node_requires/resources/behaviors/index.ts @@ -35,7 +35,7 @@ export const createAsset = async (opts: { throw new Error(message); } } - const missingCatmods = source.events.filter(e => e.lib !== 'core' && e.lib) + const missingCatmods = source.events!.filter(e => e.lib !== 'core' && e.lib) .map(e => e.lib); if (missingCatmods.length) { const message = getByPath('createAsset.behaviorMissingCatmods') @@ -43,7 +43,7 @@ export const createAsset = async (opts: { alertify.warn(message); throw new Error(message); } - const behavior = getDefaultBehavior(source.behaviorType); + const behavior = getDefaultBehavior(source.behaviorType!); Object.assign(behavior, source); return behavior; } @@ -52,6 +52,9 @@ export const createAsset = async (opts: { behavior.name = opts.name; return behavior; } + if (window.currentProject.language === 'catnip') { + behavior.properties = []; + } const name = await promptName('behavior', 'New Behavior'); if (name) { behavior.name = name; @@ -73,7 +76,13 @@ export const removeAsset = (asset: IBehavior): void => { import {getIcons as getScriptableIcons} from '../scriptables'; export const getIcons = (asset: IBehavior): string[] => { - if (!asset.events.every(e => canBeDynamicBehavior(getEventByLib(e.eventKey, e.lib)))) { + if (!asset.events.every(e => { + const event = getEventByLib(e.eventKey, e.lib); + if (!event) { + return true; + } + return canBeDynamicBehavior(event); + })) { return ['snowflake', ...getScriptableIcons(asset)]; } return getScriptableIcons(asset); @@ -100,6 +109,9 @@ export const assetContextMenuItems: IAssetContextItem[] = [{ } const copy = { ...asset + } as Omit & { + uid?: string; + lastmod?: number; }; delete copy.uid; delete copy.lastmod; @@ -109,13 +121,13 @@ export const assetContextMenuItems: IAssetContextItem[] = [{ vocPath: 'assetViewer.exportBehavior' }]; -import {validateExtends} from '../content'; +import {validateContentEntries} from '../content'; export const validateBehaviorExtends = (asset: ITemplate | IRoom): void => { for (const behaviorId of asset.behaviors) { const behavior = getById('behavior', behaviorId); if (!behavior.specification.length) { continue; } - validateExtends(behavior.specification, asset.extends); + validateContentEntries(behavior.specification, asset.extends); } }; diff --git a/src/node_requires/resources/commonTypes.d.ts b/src/node_requires/resources/commonTypes.d.ts index 812370fea..4ce88e9f7 100644 --- a/src/node_requires/resources/commonTypes.d.ts +++ b/src/node_requires/resources/commonTypes.d.ts @@ -1,5 +1,5 @@ type resourceType = 'template' | 'room' | 'sound' | 'style' | - 'texture' | 'tandem' | 'font' | 'behavior' | 'script'; + 'texture' | 'tandem' | 'typeface' | 'behavior' | 'script'; type fontWeight = '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; diff --git a/src/node_requires/resources/content/IFieldSchema.d.ts b/src/node_requires/resources/content/IFieldSchema.d.ts index 16c4d2b28..85271d1ef 100644 --- a/src/node_requires/resources/content/IFieldSchema.d.ts +++ b/src/node_requires/resources/content/IFieldSchema.d.ts @@ -1,7 +1,7 @@ declare interface IFieldSchema { name: string, readableName: string, - type: resourceType | 'text' | 'textfield' | 'code' | 'number' | 'sliderAndNumber' | 'point2D' | 'checkbox' | 'color', + type: resourceType | 'text' | 'textfield' | 'code' | 'number' | 'sliderAndNumber' | 'point2D' | 'checkbox' | 'color' | 'icon', required: boolean array: boolean, fixedLength?: number diff --git a/src/node_requires/resources/content/index.ts b/src/node_requires/resources/content/index.ts index 573908a7b..46ebd180c 100644 --- a/src/node_requires/resources/content/index.ts +++ b/src/node_requires/resources/content/index.ts @@ -68,7 +68,7 @@ export const getExtends = (): IExtensionField[] => [{ default: 'copy' }, ...getFieldsExtends()]; -const fieldTypeToTsType: Record = { +export const fieldTypeToTsType: Record = { checkbox: 'boolean', code: 'string', color: 'string', @@ -83,9 +83,10 @@ const fieldTypeToTsType: Record = { texture: 'string', textfield: 'string', behavior: 'string', - font: 'string', + typeface: 'string', script: 'string', - style: 'string' + style: 'string', + icon: 'string' }; const getTsType = (content: IContentType): string => { @@ -145,46 +146,116 @@ export const schemaToExtensions = (schema: IFieldSchema[]): IExtensionField[] => return field; }); -const validationType: Record = { - code: 'string', - color: 'string', - text: 'string', - textfield: 'string', - point2D: 'vec2', - number: 'number', - sliderAndNumber: 'number', - checkbox: 'boolean', - behavior: 'ref', - font: 'ref', - room: 'ref', - script: 'ref', - sound: 'ref', - style: 'ref', - tandem: 'ref', - template: 'ref', - texture: 'ref' + +// Checks whether the passed value is a valid reference to an asset or a -1 (empty reference). +const validateRef = (val: unknown, assetType: resourceType): boolean => { + if (val === -1) { + return true; + } + if (typeof val !== 'string') { + return false; + } + return exists(assetType, val); }; -export const validateExtends = (schema: IFieldSchema[], target: Record): void => { +type directlyValidated = Exclude; + +// For each field type, map it to a tuple of a validation function and a default value getter. +const validationTypeMap: Record boolean, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (field?: IExtensionField) => any] +> = { + code: [val => typeof val === 'string', field => field?.default ?? ''], + color: [val => typeof val === 'string' && val.startsWith('#'), field => field?.default ?? '#ffffff'], + text: [val => typeof val === 'string', field => field?.default ?? ''], + textfield: [val => typeof val === 'string', field => field?.default ?? ''], + point2D: [val => Array.isArray(val) && val.length === 2 && val.every(elt => typeof elt === 'number'), () => [0, 0]], + number: [val => typeof val === 'number', field => field?.default ?? 0], + slider: [val => typeof val === 'number', field => field?.default ?? 0], + sliderAndNumber: [val => typeof val === 'number', field => field?.default ?? 0], + checkbox: [val => typeof val === 'boolean', field => field?.default ?? false], + icon: [val => typeof val === 'string', field => field?.default ?? 'circle'], + radio: [ + (val, field) => field?.options?.some?.(o => o.value === val) ?? (typeof val === 'string'), + (field) => field?.default ?? field?.options?.[0].value + ], + select: [ + (val, field) => field?.options?.some?.(o => o.value === val) ?? (typeof val === 'string'), + (field) => field?.default ?? field?.options?.[0].value + ], + behavior: [val => validateRef(val, 'behavior'), () => -1], + typeface: [val => validateRef(val, 'typeface'), () => -1], + room: [val => validateRef(val, 'room'), () => -1], + script: [val => validateRef(val, 'script'), () => -1], + sound: [val => validateRef(val, 'sound'), () => -1], + style: [val => validateRef(val, 'style'), () => -1], + tandem: [val => validateRef(val, 'tandem'), () => -1], + template: [val => validateRef(val, 'template'), () => -1], + texture: [val => validateRef(val, 'texture'), () => -1] +}; + +/** + * Checks whether the target object has its values suiting the types of schema's fields + * and resets values to default ones if they are invalid. + */ +export const validateContentEntries = ( + schema: IFieldSchema[], + target: Record +): void => { for (const field of schema) { - const val = target[field.name], - valType = validationType[field.type]; - if (valType === 'number' && typeof val !== 'number') { - target[field.name] = 0; - } else if (valType === 'boolean' && typeof val !== 'boolean') { - target[field.name] = false; - } else if (valType === 'string' && typeof val !== 'string') { - target[field.name] = ''; - } else if (valType === 'ref') { - if (typeof val !== 'string' && val !== -1) { - target[field.name] = -1; - } else if (val !== -1 && !exists(field.type, val)) { - target[field.name] = -1; + let val = target[field.name]; + const ftype = field.type; + + // Get the validation function and the default value getter for this field type. + const [validator, defaultValue] = validationTypeMap[ftype]; + + if (field.array) { + if (!Array.isArray(val)) { + target[field.name] = []; + val = target[field.name]; + } + const elts = val as unknown[]; + target[field.name] = elts + .map(v => (validator(v) ? v : defaultValue())); + } else if (!validator(val)) { + target[field.name] = defaultValue(); + } + } +}; +/** + * Checks whether the target object has its values suiting the types of extension's fields + * and resets values to default ones if they are invalid. + */ +export const validateExtends = ( + extensions: IExtensionField[], + target: Record +) => { + for (const extension of extensions) { + if (!extension.key) { + continue; + } + if (extension.type === 'array') { + target[extension.key] = target[extension.key] || []; + const [validator, defaultValue] = validationTypeMap[(extension.arrayType ?? 'text') as directlyValidated]; + target[extension.key] = (target[extension.key] as unknown[]) + .map(elt => (validator(elt, extension) ? elt : defaultValue(extension))); + } else if (extension.type === 'group' && extension.items) { + if (typeof target[extension.key] !== 'object' || Array.isArray(target[extension.key])) { + target[extension.key] = {}; } - } else if (valType === 'vec2') { - if (!Array.isArray(val) || (Array.isArray(val) && val.length !== 2)) { - target[field.name] = [0, 0]; + validateExtends(extension.items, target[extension.key] as Record); + } else if (extension.type === 'table' && extension.fields) { + target[extension.key] = target[extension.key] || []; + for (const row of target[extension.key] as Record[]) { + validateExtends(extension.fields, row); } + } else { + const [validator, defaultValue] = + validationTypeMap[extension.type as directlyValidated]; + target[extension.key] = validator(target[extension.key], extension) ? + target[extension.key] : + defaultValue(extension); } } }; diff --git a/src/node_requires/resources/emitterTandems/index.ts b/src/node_requires/resources/emitterTandems/index.ts index 5b7d69dda..019af0d10 100644 --- a/src/node_requires/resources/emitterTandems/index.ts +++ b/src/node_requires/resources/emitterTandems/index.ts @@ -34,7 +34,7 @@ const createNewTandem = async (opts: {src?: string}): Promise => { return tandem; } // Importing from file - const source = YAML.load(await readFile(opts.src)) as Partial; + const source = YAML.load(await readFile(opts.src!)) as Partial; const keys: (keyof ITandem)[] = [ 'name', 'type', @@ -88,6 +88,12 @@ export const assetContextMenuItems: IAssetContextItem[] = [{ } const copy = { ...asset + } as { + type: 'tandem'; + name: string; + emitters: Partial[]; + uid?: string; + lastmod?: number; }; delete copy.uid; delete copy.lastmod; diff --git a/src/node_requires/resources/emitterTandems/types.d.ts b/src/node_requires/resources/emitterTandems/types.d.ts index 9fe55a967..bc6d904b5 100644 --- a/src/node_requires/resources/emitterTandems/types.d.ts +++ b/src/node_requires/resources/emitterTandems/types.d.ts @@ -1,14 +1,14 @@ -type EmitterConfigV3 = import('node_modules/@pixi/particle-emitter/lib/EmitterConfig').EmitterConfigV3; -type AccelerationBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/AccelerationMovement').AccelerationBehavior; -type AlphaBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/Alpha').AlphaBehavior; -type ColorBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/Color').ColorBehavior; -type BlendModeBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/BlendMode').BlendModeBehavior; -type RotationBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/Rotation').RotationBehavior; -type NoRotationBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/Rotation').NoRotationBehavior; -type ScaleBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/Scale').ScaleBehavior; -type SpeedBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/SpeedMovement').SpeedBehavior; -type ShapeSpawnBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/ShapeSpawn').ShapeSpawnBehavior; -type BurstSpawnBehavior = typeof import('node_modules/@pixi/particle-emitter/lib/behaviors/BurstSpawn').BurstSpawnBehavior; +type EmitterConfigV3 = import('@pixi/particle-emitter/lib/EmitterConfig').EmitterConfigV3; +type AccelerationBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/AccelerationMovement').AccelerationBehavior; +type AlphaBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/Alpha').AlphaBehavior; +type ColorBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/Color').ColorBehavior; +type BlendModeBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/BlendMode').BlendModeBehavior; +type RotationBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/Rotation').RotationBehavior; +type NoRotationBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/Rotation').NoRotationBehavior; +type ScaleBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/Scale').ScaleBehavior; +type SpeedBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/SpeedMovement').SpeedBehavior; +type ShapeSpawnBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/ShapeSpawn').ShapeSpawnBehavior; +type BurstSpawnBehavior = typeof import('@pixi/particle-emitter/lib/behaviors/BurstSpawn').BurstSpawnBehavior; type EmitterTabsNames = 'texture' | 'colors' | 'scaling' | 'velocity' | 'gravity' | 'direction' | 'rotation' | 'spawning' | 'shape'; @@ -72,6 +72,5 @@ declare interface ITandemEmitter { declare interface ITandem extends IAsset { type: 'tandem'; - name: string; emitters: Array; } diff --git a/src/node_requires/resources/fonts/bitmapFontGenerator/index.js b/src/node_requires/resources/fonts/bitmapFontGenerator/index.js deleted file mode 100644 index f48e339ba..000000000 --- a/src/node_requires/resources/fonts/bitmapFontGenerator/index.js +++ /dev/null @@ -1,167 +0,0 @@ -/* eslint-disable max-len */ -const util = require('./util'); -const opentype = require('opentype.js'); - -const draw = function draw(ctx, glyphList, descend, options) { - var dict = {}; - - var drawX = 1; - var drawY = 1; - var drawHeight = options.baseline + descend; - var mg; - - glyphList.forEach((g, index) => { - if (g.glyph === void 0) { - if (options.width !== void 0) { - g.width = options.width; - } - ctx.drawImage(options.missingGlyph, drawX, drawY, g.width, drawHeight); - mg = { - x: drawX, y: drawY, width: g.width, height: drawHeight - }; - } else { - var drawWidth = options.width; - if (drawWidth === void 0) { - drawWidth = g.width; - } - if (drawX + drawWidth > ctx.canvas.width) { - drawX = 1; - drawY += drawHeight + options.margin * 2; - } - var path = g.glyph.getPath(drawX + (drawWidth / 2) - (g.width / 2), drawY + options.baseline, options.height); - path.fill = options.fill; - path.stroke = options.stroke; - path.draw(ctx); - if (index === glyphList.length - 1) { - mg = { - x: drawX, y: drawY, width: drawWidth, height: drawHeight - }; - } else { - g.glyph.unicodes.forEach((unicode) => { - dict[unicode] = { - x: drawX, y: drawY, width: drawWidth, height: drawHeight - }; - }); - } - drawX += drawWidth + options.margin * 2; - } - }); - - return { - map: dict, missingGlyph: mg - }; -}; - -// eslint-disable-next-line max-lines-per-function -const generateBitmapFont = async function generateBitmapFont(fontSrc, outputPath, options, callback) { - const fs = require('fs-extra'); - const buffer = await fs.readFile(fontSrc); - const font = opentype.parse(buffer.buffer); - - if (!options.list || options.list.length === 0) { - options.list = Object.keys(font.glyphs.glyphs) - .map(code => String.fromCharCode(font.glyphs.glyphs[code].unicode) || ' ') - .join(''); - } - - - var lostChars = []; - var glyphList = []; - - Array.from(options.list).forEach((char) => { - const [glyph] = font.stringToGlyphs(char); - glyph.font = font; - if (glyph.unicodes.length === 0) { - lostChars.push(char); - } - const scale = 1 / font.unitsPerEm * options.height; - glyphList.push({ - glyph, - width: Math.ceil(glyph.advanceWidth * scale) - }); - }); - - if (isNaN(options.baseline)) { - options.baseline = util.getMaxBaseline(glyphList, options.height); - } - - // Update baseline value while adding missingGlyph to glyphList - if (options.missingGlyph === void 0 || typeof options.missingGlyph === 'string') { - // eslint-disable-next-line prefer-destructuring - var g = font.glyphs.glyphs[0]; - if (options.missingGlyph) { - g = font.charToGlyph(options.missingGlyph); - } - var scale = 1 / font.unitsPerEm * options.height; - g.font = font; - glyphList.push({ - glyph: g, - width: Math.ceil(g.advanceWidth * scale) - }); - if (options.baseline < (g.yMax || 0) * scale) { - options.baseline = Math.ceil((g.yMax || 0) * scale); - } - } - - var descend = util.getMinDescend(glyphList, options.height); - var adjustedHeight = util.getAdjustedHeight(descend, options.height, options.baseline); - - // Calculate the required canvas size - var canvasSize; - if (options.width === void 0) { - canvasSize = util.calculateCanvasSizeProp( - options.list, - glyphList, - adjustedHeight, - options.baseline + descend, - options.margin || 1 - ); - } else { - canvasSize = util.calculateCanvasSize( - options.list, - options.width, - adjustedHeight, - options.margin || 1 - ); - } - - // Check if the created canvas size is valid - if (canvasSize.width > 8192 || canvasSize.height > 8192) { - callback('list is too long'); - return false; - } - if (canvasSize.width === -1 || canvasSize.height === -1) { - callback('char size is too small'); - return false; - } - - var canvas = document.createElement('canvas'); - canvas.width = canvasSize.width; - canvas.height = canvasSize.height; - var ctx = canvas.getContext('2d'); - - /* if (options.noAntiAlias) - ctx.antialias = "none";*/ - - // drawing - var drawResult = draw(ctx, glyphList, descend, options); - - // Notify about characters that could not be drawn - if (lostChars.length > 0) { - // eslint-disable-next-line no-console - console.warn('Cannot find ' + lostChars.join(',') + ' from the given font. ' + - 'Generated image does not include these characters. ' + - 'Try Using other font or characters.'); - } - await util.outputBitmapFont(outputPath, canvas, callback); - - return { - map: drawResult.map, - missingGlyph: drawResult.missingGlyph, - width: options.width, - height: adjustedHeight, - canvas - }; -}; - -module.exports = generateBitmapFont; diff --git a/src/node_requires/resources/fonts/index.ts b/src/node_requires/resources/fonts/index.ts deleted file mode 100644 index de0a6fe71..000000000 --- a/src/node_requires/resources/fonts/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import {FontPreviewer} from '../preview/font'; -import {getOfType} from '..'; - -const getName = function getName(font: IFont): string { - return `${font.typefaceName} ${font.weight} ${font.italic ? 'Italic' : ''}`; -}; - -/** - * @param {object|string} font The font object in ct.js project, or its UID. - * @param {boolean} fs If set to `true`, returns a clean path in a file system. - * Otherwise, returns an URL. - */ -const getPathToTtf = function getPathToTtf(font: IFont, fs?: boolean): string { - const path = require('path'); - if (fs) { - return path.join(global.projdir, 'fonts', font.origname); - } - return `file://${global.projdir.replace(/\\/g, '/')}/fonts/${font.origname}`; -}; - -const importTtfToFont = async function importTtfToFont(src: string): Promise { - const fs = require('fs-extra'), - path = require('path'); - if (path.extname(src).toLowerCase() !== '.ttf') { - throw new Error(`[resources/fonts] Rejecting a file as it does not have a .ttf extension: ${src}`); - } - const generateGUID = require('./../../generateGUID'); - const uid = generateGUID(); - await fs.copy(src, path.join(global.projdir, '/fonts/f' + uid + '.ttf')); - const obj: IFont = { - type: 'font', - typefaceName: path.basename(src).replace(/\.ttf$/i, ''), - weight: '400' as fontWeight, - italic: false, - origname: `f${uid}.ttf`, - lastmod: Number(new Date()), - bitmapFont: false, - bitmapFontSize: 16, - bitmapFontLineHeight: 18, - charsets: ['allInFont' as builtinCharsets], - customCharset: '', - uid - }; - await FontPreviewer.save(obj); - window.signals.trigger('fontCreated'); - return obj; -}; - -const getThumbnail = FontPreviewer.getClassic; - -export const areThumbnailsIcons = false; - -export const createAsset = async (payload?: {src: string}): Promise => { - if (payload && payload.src) { - return importTtfToFont(payload.src); - } - const inputPath = await window.showOpenDialog({ - filter: '.ttf' - }); - if (!inputPath) { - throw new Error('You need to select a TTF file.'); - } - return importTtfToFont(inputPath); -}; - -interface IExternalFont extends FontFace { - external?: boolean; - ctId?: string; -} - -const refreshFonts = (): void => { - const fonts = getOfType('font'); - for (const font of document.fonts as Iterable) { - if (font.external) { - document.fonts.delete(font); - } - } - for (const font of fonts) { - const template = { - weight: font.weight, - style: font.italic ? 'italic' : 'normal' - }; - const source = `${global.projdir}/fonts/${font.origname}`, - cleanedSource = source.replace(/ /g, '%20').replace(/\\/g, '/'); - const face = new FontFace('CTPROJFONT' + font.typefaceName, `url(file://${cleanedSource})`, template) as IExternalFont; - face.load() - .then((loaded: IExternalFont) => { - loaded.external = true; - loaded.ctId = face.ctId = font.uid; - document.fonts.add(loaded); - }); - } -}; - -export { - importTtfToFont, - getName, - getThumbnail, - refreshFonts, - getPathToTtf -}; diff --git a/src/node_requires/resources/index.ts b/src/node_requires/resources/index.ts index 9beea0637..8dfbaa74f 100644 --- a/src/node_requires/resources/index.ts +++ b/src/node_requires/resources/index.ts @@ -1,6 +1,6 @@ import * as behaviors from './behaviors'; import * as emitterTandems from './emitterTandems'; -import * as fonts from './fonts'; +import * as typefaces from './typefaces'; import * as modules from './modules'; import * as projects from './projects'; import * as rooms from './rooms'; @@ -53,11 +53,6 @@ interface IResourceAPI { * an asset in an asset browser. */ getIcons?: (asset: IAsset) => string[]; - /** - * An optional method for retrieving the name of an asset. - * If not set, the asset's `name` property is used. - */ - getName?: (asset: string | IAsset) => string; createAsset: (payload?: unknown) => Promise | IAsset; /** @@ -69,7 +64,7 @@ interface IResourceAPI { assetContextMenuItems?: IAssetContextItem[]; } const typeToApiMap: Record = { - font: fonts, + typeface: typefaces, room: rooms, sound: sounds, style: styles, @@ -84,7 +79,7 @@ export const assetTypes = Object.keys(typeToApiMap) as resourceType[]; type typeToTsTypeMap = { [T in resourceType]: - T extends 'font' ? IFont : + T extends 'typeface' ? ITypeface : T extends 'room' ? IRoom : T extends 'sound' ? ISound : T extends 'style' ? IStyle : @@ -92,6 +87,7 @@ type typeToTsTypeMap = { T extends 'tandem' ? ITandem : T extends 'template' ? ITemplate : T extends 'behavior' ? IBehavior : + T extends 'script' ? IScript : never; } @@ -185,11 +181,14 @@ export const getById = ( }; /** Returns whether an asset with the specified ID exists. */ export const exists = ( - type: resourceType | string | null, + assetType: resourceType | string | null, id: string ): boolean => { try { - getById(type, id); + const asset = getById(assetType, id); + if (assetType && asset.type !== assetType) { + return false; + } return true; } catch (e) { return false; @@ -198,20 +197,18 @@ export const exists = ( export const isNameOccupied = (type: resourceType, name: string): boolean => { for (const [, asset] of uidMap) { - if (asset.type === type && - ((asset as IAsset & {name: string}).name ?? (asset as IFont).typefaceName) === name - ) { + if (asset.type === type && asset.name === name) { return true; } } return false; }; -export const getFolderById = (uid: string | null): IAssetFolder => { +export const getFolderById = (uid: string): IAssetFolder | null => { const recursiveFolderWalker = ( uid: string, collection: folderEntries - ): IAssetFolder => { + ): IAssetFolder | null => { for (const entry of collection) { if (entry.type === 'folder') { if (entry.uid === uid) { @@ -250,7 +247,11 @@ export const getParentFolder = (object: IAsset | IAssetFolder): IAssetFolder | n }; return recursiveFolderWalker(object, window.currentProject.assets, null); } - return folderMap.get(object); + const out = folderMap.get(object); + if (!out) { + throw new Error(`Cannot get parent folder for ${object.type} with ID ${object.uid}`); + } + return out; }; /** @@ -325,7 +326,7 @@ export const createFolder = (parentFolder: IAssetFolder | null): IAssetFolder => * If set to `null`, the asset is moved to the project's root. */ export const moveAsset = (asset: IAsset, newFolder: IAssetFolder | null): void => { - const oldCollection = collectionMap.get(asset); + const oldCollection = collectionMap.get(asset)!; const newCollection = newFolder === null ? window.currentProject.assets : newFolder.entries; oldCollection.splice(oldCollection.indexOf(asset), 1); collectionMap.delete(asset); @@ -380,7 +381,7 @@ export const moveFolder = ( export const deleteAsset = async (asset: IAsset): Promise => { // Execute additional cleanup steps for this asset type, if applicable if ('removeAsset' in typeToApiMap[asset.type]) { - await typeToApiMap[asset.type].removeAsset(asset); + await typeToApiMap[asset.type].removeAsset!(asset); } // Clear asset references from content types' entries for (const contentType of window.currentProject.contentTypes) { @@ -405,7 +406,7 @@ export const deleteAsset = async (asset: IAsset): Promise => { } } // Remove from the parent folder - const collection = collectionMap.get(asset); + const collection = collectionMap.get(asset)!; collection.splice(collection.indexOf(asset), 1); // Clear references from converting maps and uidMap.delete(asset.uid); @@ -487,14 +488,7 @@ export const getThumbnail = (asset: IAsset | IAssetFolder, x2?: boolean, fs?: bo }; export const getIcons = (asset: IAsset): string[] => typeToApiMap[asset.type].getIcons?.(asset) ?? []; -export const getName = (asset: IAsset | IAssetFolder): string => { - if (asset.type === 'folder') { - return asset.name; - } - return typeToApiMap[asset.type].getName ? - typeToApiMap[asset.type].getName(asset) : - (asset as IAsset & {name: string}).name; -}; + export const getContextActions = ( asset: IAsset, callback?: (asset: IAsset) => unknown @@ -509,12 +503,12 @@ export const getContextActions = ( label: getByPath(item.vocPath) as string, icon: item.icon, click: async () => { - await item.action(asset, collectionMap.get(asset), folderMap.get(asset)); + await item.action(asset, collectionMap.get(asset)!, folderMap.get(asset) || null); if (callback) { callback(asset); } }, - checked: item.checked && (() => item.checked(asset)) + checked: item.checked && (() => item.checked!(asset)) })); return actions; }; @@ -522,7 +516,7 @@ export const getContextActions = ( export const resourceToIconMap: Record = { texture: 'texture', tandem: 'sparkles', - font: 'font', + typeface: 'font', sound: 'headphones', room: 'room', template: 'template', @@ -532,7 +526,7 @@ export const resourceToIconMap: Record = { behavior: 'behavior' }; export const editorMap: Record = { - font: 'font-editor', + typeface: 'typeface-editor', room: 'room-editor', // skeleton: 'skeletal-animation', sound: 'sound-editor', @@ -548,7 +542,7 @@ export { textures, emitterTandems, emitterTandems as tandems, - fonts, + typefaces, modules, projects, sounds, diff --git a/src/node_requires/resources/modules/ICatmod.d.ts b/src/node_requires/resources/modules/ICatmod.d.ts index 6b6a8b3b4..e13498bbb 100644 --- a/src/node_requires/resources/modules/ICatmod.d.ts +++ b/src/node_requires/resources/modules/ICatmod.d.ts @@ -63,6 +63,7 @@ declare interface ICatmodManifest { main: { name: string, tagline: string, + icon?: string, version: string, authors: ICatmodAuthor[], categories?: moduleCategory[] diff --git a/src/node_requires/resources/modules/index.ts b/src/node_requires/resources/modules/index.ts index f189efbff..83ae7a54a 100644 --- a/src/node_requires/resources/modules/index.ts +++ b/src/node_requires/resources/modules/index.ts @@ -2,6 +2,7 @@ const path = require('path'); const moduleDir = './data/ct.libs'; const getModulePathByName = (moduleName: string): string => path.join(moduleDir, moduleName); import {importEventsFromModule, unloadEventsFromModule} from '../../events'; +import {loadModdedBlocks, unloadModdedBlocks} from '../../catnip'; /* async */ const loadModule = (moduleDir: string): Promise => { @@ -126,15 +127,18 @@ const addDefaults = async (moduleName: string, moduleData?: ICatmodManifest) => return; } for (const field of moduleData.fields) { - if (!global.currentProject.libs[moduleName][field.key]) { + if (!field.key) { + continue; + } + if (!window.currentProject.libs[moduleName][field.key]) { if (field.default) { - global.currentProject.libs[moduleName][field.key] = field.default; + window.currentProject.libs[moduleName][field.key] = field.default; } else if (field.type === 'number') { - global.currentProject.libs[moduleName][field.key] = 0; + window.currentProject.libs[moduleName][field.key] = 0; } else if (field.type === 'checkbox') { - global.currentProject.libs[moduleName][field.key] = false; + window.currentProject.libs[moduleName][field.key] = false; } else { - global.currentProject.libs[moduleName][field.key] = ''; + window.currentProject.libs[moduleName][field.key] = ''; } } } @@ -154,9 +158,12 @@ const checkModulesExistence = async (moduleNames: string[]): Promise - (moduleName in global.currentProject.libs); + (moduleName in window.currentProject.libs); const enableModule = async (moduleName: string): Promise => { - global.currentProject.libs[moduleName] = {}; + window.currentProject.libs[moduleName] = {}; + if (window.currentProject.language === 'catnip') { + loadModdedBlocks(moduleName); + } const catmod = await loadModuleByName(moduleName); await addDefaults(moduleName, catmod); importEventsFromModule(catmod, moduleName); @@ -167,7 +174,10 @@ const enableModule = async (moduleName: string): Promise => { window.signals.trigger('catmodAdded', moduleName); }; const disableModule = (moduleName: string): void => { - delete global.currentProject.libs[moduleName]; + delete window.currentProject.libs[moduleName]; + if (window.currentProject.language === 'catnip') { + unloadModdedBlocks(moduleName); + } unloadEventsFromModule(moduleName); removeTypedefs({ name: moduleName, diff --git a/src/node_requires/resources/modules/typedefs.ts b/src/node_requires/resources/modules/typedefs.ts index e3d9c8c3c..ffea5853a 100644 --- a/src/node_requires/resources/modules/typedefs.ts +++ b/src/node_requires/resources/modules/typedefs.ts @@ -40,7 +40,7 @@ const removeTypedefs = function removeTypedefs(module: ICatmodMeta): void { const loadAllTypedefs = async function loadAllTypedefs(): Promise { for (const module of await loadModules()) { - if (!(module.name in global.currentProject.libs)) { + if (!(module.name in window.currentProject.libs)) { continue; } addTypedefs(module); diff --git a/src/node_requires/resources/preview/font.ts b/src/node_requires/resources/preview/font.ts deleted file mode 100644 index 51ddd0faf..000000000 --- a/src/node_requires/resources/preview/font.ts +++ /dev/null @@ -1,74 +0,0 @@ -import {getPathToTtf} from '../fonts'; - -export class FontPreviewer { - static get(font: IFont, fileSys?: boolean | 'last'): string { - if (fileSys) { - if (fileSys === 'last') { - return `f${font.uid}.png`; - } - const path = require('path'); - return path.join(global.projdir, 'prev', `f${font.uid}.png`); - } - return `file://${global.projdir.replace(/\\/g, '/')}/prev/f${ - font.uid - }.png?cache=${font.lastmod}`; - } - - static getClassic(font: IFont, _x2: boolean, fileSys: boolean): string { - return FontPreviewer.get(font, fileSys); - } - - static retain(): string[] { - return []; - } - - static retainPreview(fonts: IFont[]): string[] { - return fonts.map((font) => FontPreviewer.get(font, 'last')); - } - - static async create(font: IFont): Promise { - const template = { - weight: font.weight, - style: font.italic ? 'italic' : 'normal' - }; - const face = new FontFace( - 'CTPROJFONT' + font.typefaceName, - `url('${getPathToTtf(font)}')`, - template - ); - - const loaded = await face.load(); - (loaded as any).external = true; - (loaded as any).ctId = (face as any).ctId = font.uid; - document.fonts.add(loaded); - - const canvas = document.createElement('canvas'); - const cx = canvas.getContext('2d'); - canvas.width = canvas.height = 128; - cx.clearRect(0, 0, 128, 128); - cx.font = `${font.italic ? 'italic ' : ''}${font.weight} ${Math.floor(96 * 0.75)}px "${loaded.family}"`; - cx.fillStyle = '#000'; - cx.fillText('Aa', 12 + 96 * 0.05, 12 + 96 * 0.75); - - return canvas; - } - - static async save(font: IFont): Promise { - try { - const fs = require('fs-extra'); - const destPath = FontPreviewer.get(font, true); - const canvas = await FontPreviewer.create(font); - const dataURL = canvas.toDataURL(); - const previewBuffer = dataURL.replace( - /^data:image\/\w+;base64,/, - '' - ); - const buf = Buffer.from(previewBuffer, 'base64'); - await fs.writeFile(FontPreviewer.get(font, true), buf); - return destPath; - } catch (e) { - console.error(e); - return ''; - } - } -} diff --git a/src/node_requires/resources/preview/index.ts b/src/node_requires/resources/preview/index.ts index 248252ec3..babe28df6 100644 --- a/src/node_requires/resources/preview/index.ts +++ b/src/node_requires/resources/preview/index.ts @@ -1,4 +1,4 @@ -import {FontPreviewer} from './font'; +import {TypefacePreviewer} from './typeface'; import {RoomPreviewer} from './room'; import {StylePreviewer} from './style'; import {TexturePreviewer} from './texture'; @@ -20,22 +20,22 @@ export const preparePreviews = async function ( if (trashOrphans) { const imagesToKeep = [ - ...FontPreviewer.retain(), + ...TypefacePreviewer.retain(), ...RoomPreviewer.retain(), ...StylePreviewer.retain(), ...SoundPreviewer.retain(assets.sound), ...TexturePreviewer.retain(assets.texture) ]; - const imgFilenames = fs.readdirSync(global.projdir + '/img'); + const imgFilenames = fs.readdirSync(window.projdir + '/img'); for (const filename of imgFilenames) { if (imagesToKeep.indexOf(filename) === -1) { if (!trashChecked) { - fs.ensureDir(global.projdir + '/trash'); + fs.ensureDir(window.projdir + '/trash'); } fs.moveSync( - global.projdir + '/img/' + filename, - global.projdir + '/trash/' + filename, + window.projdir + '/img/' + filename, + window.projdir + '/trash/' + filename, { overwrite: true } @@ -43,26 +43,26 @@ export const preparePreviews = async function ( } } - if (fs.existsSync(global.projdir + '/prev')) { + if (fs.existsSync(window.projdir + '/prev')) { const previewsToKeep = [ - ...FontPreviewer.retainPreview(assets.font), + ...TypefacePreviewer.retainPreview(assets.typeface), ...RoomPreviewer.retainPreview(assets.room), ...StylePreviewer.retainPreview(assets.style), ...SoundPreviewer.retainPreview(assets.sound), ...TexturePreviewer.retainPreview(assets.texture) ]; - const previewFilenames = fs.readdirSync(global.projdir + '/prev'); + const previewFilenames = fs.readdirSync(window.projdir + '/prev'); if (!trashChecked) { - await fs.ensureDir(global.projdir + '/trash'); + await fs.ensureDir(window.projdir + '/trash'); trashChecked = true; } for (const filename of previewFilenames) { if (previewsToKeep.indexOf(filename) === -1) { // eslint-disable-next-line max-depth fs.moveSync( - global.projdir + '/prev/' + filename, - global.projdir + '/trash/' + filename, + window.projdir + '/prev/' + filename, + window.projdir + '/trash/' + filename, { overwrite: true } @@ -72,12 +72,12 @@ export const preparePreviews = async function ( } } - fs.ensureDir(global.projdir + '/prev'); + fs.ensureDir(window.projdir + '/prev'); const generationPromises: Promise[] = []; - generationPromises.push(...assets.font.map(async (font: IFont) => { - if (!(await fileExists(FontPreviewer.get(font, true)))) { - return FontPreviewer.save(font); + generationPromises.push(...assets.typeface.map(async (typeface: ITypeface) => { + if (!(await fileExists(TypefacePreviewer.get(typeface, true)))) { + return TypefacePreviewer.save(typeface); } return Promise.resolve(); })); diff --git a/src/node_requires/resources/preview/room.ts b/src/node_requires/resources/preview/room.ts index c914b11ad..124b7fd86 100644 --- a/src/node_requires/resources/preview/room.ts +++ b/src/node_requires/resources/preview/room.ts @@ -2,7 +2,7 @@ import {getById} from '..'; import {outputCanvasToFile} from '../../utils/imageUtils'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; export class RoomPreviewer { static get(room: assetRef | IRoom, fileSys?: boolean | 'last'): string { @@ -17,9 +17,9 @@ export class RoomPreviewer { return `r${room.uid}.png`; } const path = require('path'); - return path.join(global.projdir, 'prev', `r${room.uid}.png`); + return path.join(window.projdir, 'prev', `r${room.uid}.png`); } - return `file://${global.projdir.replace(/\\/g, '/')}/prev/r${ + return `file://${window.projdir.replace(/\\/g, '/')}/prev/r${ room.uid }.png?cache=${room.lastmod}`; } diff --git a/src/node_requires/resources/preview/sound.ts b/src/node_requires/resources/preview/sound.ts index 5c75ba83e..14882dd54 100644 --- a/src/node_requires/resources/preview/sound.ts +++ b/src/node_requires/resources/preview/sound.ts @@ -1,11 +1,11 @@ -import {Sprite, Texture, Application} from 'node_modules/pixi.js'; -import {utils as pixiSoundUtils, Sound as pixiSoundSound} from 'node_modules/@pixi/sound'; +import {Sprite, Texture, Application} from 'pixi.js'; +import {utils as pixiSoundUtils, Sound as pixiSoundSound} from '@pixi/sound'; import {join} from 'path'; import {outputCanvasToFile} from '../../utils/imageUtils'; import {TexturePreviewer} from './texture'; -import {getVariantPath} from '../sounds'; +import {getVariantPath} from '../sounds/common'; export class SoundPreviewer { static get(sound: ISound, fileSys?: boolean | 'last', variantUid?: string, long?: boolean): string { @@ -20,9 +20,9 @@ export class SoundPreviewer { if (fileSys === 'last') { return `snd${sound.uid}.png`; } - return join(global.projdir, 'prev', basename); + return join(window.projdir, 'prev', basename); } - return `file://${global.projdir.replace(/\\/g, '/')}/prev/${basename}?cache=${sound.lastmod}`; + return `file://${window.projdir.replace(/\\/g, '/')}/prev/${basename}?cache=${sound.lastmod}`; } static getClassic(sound: ISound, _x2: boolean, fileSys: boolean): string { diff --git a/src/node_requires/resources/preview/style.ts b/src/node_requires/resources/preview/style.ts index 8b49fdd2d..45881a475 100644 --- a/src/node_requires/resources/preview/style.ts +++ b/src/node_requires/resources/preview/style.ts @@ -1,7 +1,7 @@ import {outputCanvasToFile} from '../../utils/imageUtils'; import {styleToTextStyle} from '../../styleUtils'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; export class StylePreviewer { static get(style: IStyle, fileSys?: boolean | 'last'): string { @@ -10,9 +10,9 @@ export class StylePreviewer { return `s${style.uid}.png`; } const path = require('path'); - return path.join(global.projdir, 'prev', `s${style.uid}.png`); + return path.join(window.projdir, 'prev', `s${style.uid}.png`); } - return `file://${global.projdir.replace(/\\/g, '/')}/prev/s${ + return `file://${window.projdir.replace(/\\/g, '/')}/prev/s${ style.uid }.png?cache=${style.lastmod}`; } @@ -30,11 +30,13 @@ export class StylePreviewer { } static create(style: IStyle): Promise { + const w = 128, + h = 128; const pixiApp = new PIXI.Application({ - width: 128, - height: 128 + width: w, + height: h }); - const pixiStyle = new PIXI.TextStyle(styleToTextStyle(style)); + const pixiStyle = new PIXI.TextStyle(styleToTextStyle(style, true)); const fontSize = parseInt(`${pixiStyle.fontSize}`, 10); pixiStyle.lineHeight = 0; if (fontSize > 82) { @@ -42,11 +44,11 @@ export class StylePreviewer { } else if (fontSize < 12) { pixiStyle.fontSize = '12px'; } - const labelThumbnail = new PIXI.Text('Aa', pixiStyle); + const labelThumbnail = new PIXI.Text('Gg', pixiStyle); labelThumbnail.anchor.x = 0.5; labelThumbnail.anchor.y = 0.5; - labelThumbnail.x = 64; - labelThumbnail.y = 64; + labelThumbnail.x = w / 2; + labelThumbnail.y = h / 2; labelThumbnail.visible = true; const darkColor = (x: string, min = 'D') => x !== (void 0) && (x[0] !== '#' || x[1] <= min || x[3] <= min || x[5] <= min); @@ -59,7 +61,7 @@ export class StylePreviewer { const lightColor = !darkFill && !darkStroke; const graphics = new PIXI.Graphics(); graphics.beginFill(lightColor ? 0x000000 : 0xffffff); - graphics.drawCircle(64, 64, 64); + graphics.drawRect(0, 0, w, h); graphics.endFill(); graphics.alpha = lightColor ? 1.0 : 0.0; pixiApp.stage.addChild(graphics); diff --git a/src/node_requires/resources/preview/texture.ts b/src/node_requires/resources/preview/texture.ts index defbfa1ac..df4006bbb 100644 --- a/src/node_requires/resources/preview/texture.ts +++ b/src/node_requires/resources/preview/texture.ts @@ -18,9 +18,9 @@ export class TexturePreviewer { return `i${texture.uid}.png`; } const path = require('path'); - return path.join(global.projdir, 'prev', `i${texture.uid}.png`); + return path.join(window.projdir, 'prev', `i${texture.uid}.png`); } - return `file://${global.projdir.replace(/\\/g, '/')}/prev/i${ + return `file://${window.projdir.replace(/\\/g, '/')}/prev/i${ texture.uid }.png?cache=${texture.lastmod}`; } diff --git a/src/node_requires/resources/preview/typeface.ts b/src/node_requires/resources/preview/typeface.ts new file mode 100644 index 000000000..d8cd04e81 --- /dev/null +++ b/src/node_requires/resources/preview/typeface.ts @@ -0,0 +1,80 @@ +import {getPathToTtf} from '../typefaces'; + +export class TypefacePreviewer { + static get(typeface: ITypeface, fileSys?: boolean | 'last'): string { + if (fileSys) { + if (fileSys === 'last') { + return `f${typeface.uid}.png`; + } + const path = require('path'); + return path.join(window.projdir, 'prev', `f${typeface.uid}.png`); + } + return `file://${window.projdir.replace(/\\/g, '/')}/prev/f${ + typeface.uid + }.png?cache=${typeface.lastmod}`; + } + + static getClassic(typeface: ITypeface, _x2: boolean, fileSys: boolean): string { + return TypefacePreviewer.get(typeface, fileSys); + } + + static retain(): string[] { + return []; + } + + static retainPreview(assets: ITypeface[]): string[] { + return assets.map((typeface) => TypefacePreviewer.get(typeface, 'last')); + } + + static async create(typeface: ITypeface): Promise { + const [firstFont] = typeface.fonts; + const template = { + weight: firstFont.weight, + style: firstFont.italic ? 'italic' : 'normal' + }; + const face = new FontFace( + 'CTPROJFONT' + typeface.name, + `url('${getPathToTtf(firstFont)}')`, + template + ); + + const loaded = await face.load(); + (loaded as any).external = true; + (loaded as any).ctId = (face as any).ctId = typeface.uid; + document.fonts.add(loaded); + + const canvas = document.createElement('canvas'); + const cx = canvas.getContext('2d')!; + canvas.width = canvas.height = 128; + cx.clearRect(0, 0, canvas.width, canvas.height); + cx.fillStyle = '#000'; + cx.rect(0, 0, canvas.width, canvas.height); + cx.fill(); + cx.font = `${firstFont.italic ? 'italic ' : ''}${firstFont.weight} ${Math.floor(96 * 0.75)}px "${loaded.family}"`; + cx.textAlign = 'center'; + cx.textBaseline = 'middle'; + cx.fillStyle = '#fff'; + cx.fillText('Gg', canvas.width / 2, canvas.height / 2); + + return canvas; + } + + static async save(typeface: ITypeface): Promise { + try { + const fs = require('fs-extra'); + const destPath = TypefacePreviewer.get(typeface, true); + const canvas = await TypefacePreviewer.create(typeface); + const dataURL = canvas.toDataURL(); + const previewBuffer = dataURL.replace( + /^data:image\/\w+;base64,/, + '' + ); + const buf = Buffer.from(previewBuffer, 'base64'); + await fs.writeFile(TypefacePreviewer.get(typeface, true), buf); + return destPath; + } catch (e) { + console.error(e); + return ''; + } + } +} diff --git a/src/node_requires/resources/projects/IProject.d.ts b/src/node_requires/resources/projects/IProject.d.ts index 66bbedad5..5c4f26122 100644 --- a/src/node_requires/resources/projects/IProject.d.ts +++ b/src/node_requires/resources/projects/IProject.d.ts @@ -36,11 +36,12 @@ declare interface IContentType { declare interface IProject { ctjsVersion: string; notes: string; - language: 'typescript' | 'coffeescript'; + language: 'typescript' | 'coffeescript' | 'catnip'; libs: Record>; actions: ICtAction[]; scripts: IProjectScript[]; contentTypes: IContentType[]; + globalVars: string[]; // For Catnip only. assets: folderEntries; startroom: assetRef; backups: number; @@ -65,6 +66,8 @@ declare interface IProject { viewMode: viewMode, }, export: { + showErrors: boolean, + errorsLink: string, autocloseDesktop: boolean, windows: boolean, linux: boolean, diff --git a/src/node_requires/resources/projects/convertLanguage.ts b/src/node_requires/resources/projects/convertLanguage.ts index e0194d051..0a70e599c 100644 --- a/src/node_requires/resources/projects/convertLanguage.ts +++ b/src/node_requires/resources/projects/convertLanguage.ts @@ -1,4 +1,4 @@ -const coffeescript = require('coffeescript'); +const compileCoffee = require('coffeescript').CoffeeScript.compile; const coffeescriptSettings = { bare: true, sourcemaps: false @@ -18,7 +18,7 @@ export const convertCoffeeToJs = (): void => { for (const event of (asset as IScriptable).events) { changeset.push({ event, - code: coffeescript.compile(event.code, coffeescriptSettings) + code: compileCoffee(event.code, coffeescriptSettings) }); } } diff --git a/src/node_requires/resources/projects/defaultProject.ts b/src/node_requires/resources/projects/defaultProject.ts index fc148e7d2..a692ef816 100644 --- a/src/node_requires/resources/projects/defaultProject.ts +++ b/src/node_requires/resources/projects/defaultProject.ts @@ -1,5 +1,5 @@ const defaultProjectTemplate: IProject = { - ctjsVersion: process.versions.ctjs, + ctjsVersion: process.versions.ctjs as string, backups: 3, language: 'typescript', notes: '/* empty */', @@ -18,6 +18,7 @@ const defaultProjectTemplate: IProject = { actions: [], scripts: [], assets: [], + globalVars: [], settings: { authoring: { author: '', @@ -39,6 +40,8 @@ const defaultProjectTemplate: IProject = { viewMode: 'scaleFit' }, export: { + showErrors: true, + errorsLink: '', autocloseDesktop: true, windows: true, linux: true, @@ -51,7 +54,7 @@ const defaultProjectTemplate: IProject = { template: true, room: true, behavior: false, - font: false, + typeface: false, sound: false, style: false, tandem: false, diff --git a/src/node_requires/resources/projects/index.ts b/src/node_requires/resources/projects/index.ts index 9efd6344e..7f80e107c 100644 --- a/src/node_requires/resources/projects/index.ts +++ b/src/node_requires/resources/projects/index.ts @@ -2,9 +2,10 @@ import {populatePixiTextureCache, resetDOMTextureCache, resetPixiTextureCache, s import {loadAllTypedefs, resetTypedefs} from '../modules/typedefs'; import {loadScriptModels} from './scripts'; import {unloadAllEvents, loadAllModulesEvents} from '../../events'; +import {loadAllBlocks} from '../../catnip'; import {buildAssetMap} from '..'; import {preparePreviews} from '../preview'; -import {refreshFonts} from '../fonts'; +import {refreshFonts} from '../typefaces'; import {updateContentTypedefs} from '../content'; import {getLanguageJSON} from '../../i18n'; @@ -14,15 +15,18 @@ import fs from 'fs-extra'; // @see https://semver.org/ const semverRegex = /(\d+)\.(\d+)\.(\d+)(-[A-Za-z.-]*(\d+)?[A-Za-z.-]*)?/; -const semverToArray = (string: string) => { +const semverToArray = (string: string): [number, number, number, number | null] => { const raw = semverRegex.exec(string); + if (!raw) { + throw new Error(`Invalid semver string: ${string}`); + } return [ - raw[1], - raw[2], - raw[3], + Number(raw[1]), + Number(raw[2]), + Number(raw[3]), // -next- versions and other postfixes will count as a fourth component. // They all will apply before regular versions - raw[4] ? raw[5] || 1 : null + raw[4] ? Number(raw[5]) || 1 : null ]; }; @@ -36,7 +40,6 @@ interface IMigrationPlan { */ const adapter = async (project: Partial) => { var version = semverToArray(project.ctjsVersion || '0.2.0'); - const migrationToExecute = window.migrationProcess // Sort all the patches chronologically .sort((m1: IMigrationPlan, m2: IMigrationPlan) => { @@ -44,9 +47,13 @@ const adapter = async (project: Partial) => { const m2Version = semverToArray(m2.version); for (let i = 0; i < 4; i++) { - if (m1Version[i] < m2Version[i] || m1Version[i] === null) { + if (m1Version[i] === null) { return -1; - } else if (m1Version[i] > m2Version[i]) { + } else if (m2Version[i] === null) { + return 1; + } else if (m1Version[i]! < m2Version[i]!) { + return -1; + } else if (m1Version[i]! > m2Version[i]!) { return 1; } } @@ -60,10 +67,10 @@ const adapter = async (project: Partial) => { for (let i = 0; i < 3; i++) { // if any of the first three version numbers is lower than project's, // skip the patch - if (migrationVersion[i] < version[i]) { + if ((migrationVersion[i] || 0) < (version[i] || 0)) { return false; } - if (migrationVersion[i] > version[i]) { + if ((migrationVersion[i] || 0) > (version[i] || 0)) { return true; } } @@ -115,16 +122,16 @@ const loadProject = async (projectData: IProject): Promise => { try { await adapter(projectData); - fs.ensureDir(global.projdir); - fs.ensureDir(global.projdir + '/img'); - fs.ensureDir(global.projdir + '/skel'); - fs.ensureDir(global.projdir + '/snd'); + fs.ensureDir(window.projdir); + fs.ensureDir(window.projdir + '/img'); + fs.ensureDir(window.projdir + '/skel'); + fs.ensureDir(window.projdir + '/snd'); const lastProjects = localStorage.lastProjects ? localStorage.lastProjects.split(';') : []; - if (lastProjects.indexOf(path.normalize(global.projdir + '.ict')) !== -1) { - lastProjects.splice(lastProjects.indexOf(path.normalize(global.projdir + '.ict')), 1); + if (lastProjects.indexOf(path.normalize(window.projdir + '.ict')) !== -1) { + lastProjects.splice(lastProjects.indexOf(path.normalize(window.projdir + '.ict')), 1); } - lastProjects.unshift(path.normalize(global.projdir + '.ict')); + lastProjects.unshift(path.normalize(window.projdir + '.ict')); if (lastProjects.length > 15) { lastProjects.pop(); } @@ -140,11 +147,12 @@ const loadProject = async (projectData: IProject): Promise => { resetPixiTextureCache(); setPixelart(projectData.settings.rendering.pixelatedrender); refreshFonts(); - const recoveryExists = fs.existsSync(global.projdir + '.ict.recovery'); + const recoveryExists = fs.existsSync(window.projdir + '.ict.recovery'); await Promise.all([ loadAllModulesEvents(), populatePixiTextureCache(), - resetDOMTextureCache() + resetDOMTextureCache(), + projectData.language === 'catnip' && loadAllBlocks(projectData) ]); await preparePreviews(projectData, !recoveryExists); @@ -168,8 +176,8 @@ const statExists = async (toTest: string): Promise = export const saveProject = async (): Promise => { const YAML = require('js-yaml'); const glob = require('../../glob'); - const projectYAML = YAML.dump(global.currentProject); - const basePath = global.projdir + '.ict'; + const projectYAML = YAML.dump(window.currentProject); + const basePath = window.projdir + '.ict'; // Make backup files const savedBefore = await (async () => { try { @@ -179,7 +187,7 @@ export const saveProject = async (): Promise => { return false; } })(); - const backups = global.currentProject.backups ?? 3; + const backups = window.currentProject.backups ?? 3; if (savedBefore && backups) { const backupFiles = []; // Fetch metadata about backup files, if they exist @@ -284,7 +292,7 @@ const openProject = async (proj: string): Promise> return false; } sessionStorage.projname = path.basename(proj); - global.projdir = path.dirname(proj) + path.sep + path.basename(proj, '.ict'); + window.projdir = path.dirname(proj) + path.sep + path.basename(proj, '.ict'); // Check for recovery files let recoveryStat; @@ -345,7 +353,7 @@ const getExamplesDir = function (): string { return path.join(process.cwd(), 'examples'); } // return path.join((nw.App as any).startPath, 'examples'); - return path.join(path.dirname(process.execPath), 'examples'); + return path.join(path.dirname(process.execPath), 'package.nw', 'examples'); } }; @@ -362,7 +370,7 @@ const getTemplatesDir = function (): string { return path.join(process.cwd(), 'templates'); } // return path.join((nw.App as any).startPath, "templates"); - return path.join(path.dirname(process.execPath), 'templates'); + return path.join(path.dirname(process.execPath), 'package.nw', 'templates'); } }; @@ -375,6 +383,8 @@ const getProjectDir = function (projPath: string): string { return projPath.replace(/\.ict$/, ''); }; +export const getProjectCodename = (projPath?: string): string => path.basename(projPath || projdir, '.ict'); + /** * Returns a path to the project's thumbnail. * @param {string} projPath diff --git a/src/node_requires/resources/projects/scripts.ts b/src/node_requires/resources/projects/scripts.ts index 70c7b7e3d..6329ee4c0 100644 --- a/src/node_requires/resources/projects/scripts.ts +++ b/src/node_requires/resources/projects/scripts.ts @@ -3,7 +3,7 @@ type Script = IProject['scripts'][0]; export const scriptModels = new Map(); export const dropScriptModel = (script: Script) => { - scriptModels.get(script).dispose(); + scriptModels.get(script)?.dispose(); scriptModels.delete(script); }; /** This method is to be used when loading a project or creating a new script */ diff --git a/src/node_requires/resources/projects/zip.ts b/src/node_requires/resources/projects/zip.ts new file mode 100644 index 000000000..44712c82f --- /dev/null +++ b/src/node_requires/resources/projects/zip.ts @@ -0,0 +1,30 @@ + +import os from 'os'; +import path from 'path'; +import fs from 'fs-extra'; +import {getWritableDir} from '../../platformUtils'; +import Archive from 'adm-zip'; + +export const zipProject = async (): Promise => { + const savePromise = new Promise((resolve) => { + window.signals.one('projectSaved', () => { + resolve(); + }); + window.signals.trigger('saveProject'); + }); + await savePromise; + + const writable = await getWritableDir(); + const inDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ctZipProject-')), + outName = path.join(writable, `/${sessionStorage.projname}.zip`); + + await fs.remove(outName); + await fs.remove(inDir); + await fs.copy(window.projdir + '.ict', path.join(inDir, sessionStorage.projname)); + await fs.copy(window.projdir, path.join(inDir, sessionStorage.projname.slice(0, -4))); + + const archive = new Archive(); + await archive.addLocalFolderPromise(inDir, {}); + await archive.writeZipPromise(outName); + return outName; +}; diff --git a/src/node_requires/resources/rooms/defaultRoom.ts b/src/node_requires/resources/rooms/defaultRoom.ts index 63f1ba5eb..331796d7a 100644 --- a/src/node_requires/resources/rooms/defaultRoom.ts +++ b/src/node_requires/resources/rooms/defaultRoom.ts @@ -35,6 +35,7 @@ const get = function (): IRoom { lastmod: Number(new Date()), events: [], behaviors: [], + extendTypes: '', uid }); return newRoom; diff --git a/src/node_requires/resources/rooms/index.ts b/src/node_requires/resources/rooms/index.ts index 6dd211a34..25389e12d 100644 --- a/src/node_requires/resources/rooms/index.ts +++ b/src/node_requires/resources/rooms/index.ts @@ -6,7 +6,7 @@ import generateGUID from './../../generateGUID'; const getDefaultRoom = require('./defaultRoom').get; const fs = require('fs-extra'); -const createNewRoom = async (name?: string): Promise => { +const createNewRoom = async (name?: string): Promise => { const room = getDefaultRoom(); if (name) { room.name = String(name); @@ -19,14 +19,21 @@ const createNewRoom = async (name?: string): Promise => { throw 'cancelled'; } } + if (window.currentProject.language === 'catnip') { + room.properties = []; + } await fs.copy('./data/img/notexture.png', RoomPreviewer.get(room, true)); return room; }; export const getStartingRoom = (): IRoom => { const rooms = getOfType('room'); - if (global.currentProject.startroom && global.currentProject.startroom !== -1) { - return rooms.find(room => room.uid === global.currentProject.startroom); + if (window.currentProject.startroom && window.currentProject.startroom !== -1) { + const room = rooms.find(room => room.uid === window.currentProject.startroom); + if (room) { + return room; + } + window.currentProject.startroom = -1; } return rooms[0]; }; @@ -35,7 +42,7 @@ export const assetContextMenuItems: IAssetContextItem[] = [{ icon: 'play', vocPath: 'rooms.makeStarting', action: (asset: IRoom): void => { - global.currentProject.startroom = asset.uid; + window.currentProject.startroom = asset.uid; } }, { icon: 'copy', @@ -53,8 +60,8 @@ const getThumbnail = RoomPreviewer.getClassic; export const areThumbnailsIcons = false; export const removeAsset = (room: IRoom): void => { - if (global.currentProject.startroom === room.uid) { - global.currentProject.startroom = -1; + if (window.currentProject.startroom === room.uid) { + window.currentProject.startroom = -1; } }; diff --git a/src/node_requires/resources/scriptables/index.ts b/src/node_requires/resources/scriptables/index.ts index 35e1eea4d..e4ae9a4e6 100644 --- a/src/node_requires/resources/scriptables/index.ts +++ b/src/node_requires/resources/scriptables/index.ts @@ -2,9 +2,16 @@ import {getEventByLib} from '../../events'; export const getIcons = (asset: IScriptable): string[] => { const icons: string[] = []; + // Show at max 5 event icons for (let i = 0; i < 5 && i < asset.events.length; i++) { const event = asset.events[i]; - icons.push(getEventByLib(event.eventKey, event.lib).icon); + const eventDeclaration = getEventByLib(event.eventKey, event.lib); + if (!eventDeclaration) { + // signal the user about missing events + icons.push('alert-circle'); + } else { + icons.push(eventDeclaration.icon); + } } if (asset.events.length > 5) { icons.push('more-horizontal'); diff --git a/src/node_requires/resources/scripts/IScript.d.ts b/src/node_requires/resources/scripts/IScript.d.ts index ab6d4fb50..ae9c8e7b9 100644 --- a/src/node_requires/resources/scripts/IScript.d.ts +++ b/src/node_requires/resources/scripts/IScript.d.ts @@ -1,6 +1,6 @@ interface IScript extends IAsset { - name: string; - code: string; - language: 'typescript' | 'coffeescript'; + code: string | BlockScript; + language: typeof IProject['language']; runAutomatically: boolean; + variables: string[]; } diff --git a/src/node_requires/resources/scripts/defaultScript.ts b/src/node_requires/resources/scripts/defaultScript.ts index 8e06cc42d..15bcf4df5 100644 --- a/src/node_requires/resources/scripts/defaultScript.ts +++ b/src/node_requires/resources/scripts/defaultScript.ts @@ -5,10 +5,11 @@ export const get = (): IScript => { return ({ uid, name: 'New Script', - code: '', + code: window.currentProject.language === 'catnip' ? [] : '', language: window.currentProject.language || 'typescript', - lastmod: Number(new Date()), + variables: [], runAutomatically: false, + lastmod: Number(new Date()), type: 'script' as const }); }; diff --git a/src/node_requires/resources/sounds/common.ts b/src/node_requires/resources/sounds/common.ts new file mode 100644 index 000000000..a0b4efa19 --- /dev/null +++ b/src/node_requires/resources/sounds/common.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const getVariantBasePath = (sound: ISound, variant: ISound['variants'][0]): string => + `${window.projdir}/snd/s${sound.uid}_${variant.uid}`; +export const getVariantPath = (sound: ISound, variant: ISound['variants'][0]): string => + `${getVariantBasePath(sound, variant)}${path.extname(variant.source)}`; diff --git a/src/node_requires/resources/sounds/index.ts b/src/node_requires/resources/sounds/index.ts index 2e839eb36..4ab27c8d0 100644 --- a/src/node_requires/resources/sounds/index.ts +++ b/src/node_requires/resources/sounds/index.ts @@ -1,11 +1,9 @@ -import path from 'path'; import fs from 'fs-extra'; +import {getVariantPath} from './common'; import {SoundPreviewer} from '../preview/sound'; import {promptName} from '../promptName'; -import {sound} from 'node_modules/@pixi/sound'; - export const getThumbnail = SoundPreviewer.getClassic; export const areThumbnailsIcons = false; @@ -66,11 +64,6 @@ export const createAsset = async (name?: string): Promise => { return newSound; }; -export const getVariantBasePath = (sound: ISound, variant: ISound['variants'][0]): string => - `${global.projdir}/snd/s${sound.uid}_${variant.uid}`; -export const getVariantPath = (sound: ISound, variant: ISound['variants'][0]): string => - `${getVariantBasePath(sound, variant)}${path.extname(variant.source)}`; - export const addSoundFile = async (sound: ISound, file: string): Promise => { try { const generateGUID = require('./../../generateGUID'); @@ -93,13 +86,21 @@ export const addSoundFile = async (sound: ISound, file: string): Promise { for (const variant of asset.variants) { const key = `${pixiSoundPrefix}${variant.uid}`; - if (sound.exists(key)) { + if (PIXI.sound.exists(key)) { continue; } - sound.add(key, { + PIXI.sound.add(key, { url: 'file://' + getVariantPath(asset, variant), preload: true }); diff --git a/src/node_requires/resources/sounds/types.d.ts b/src/node_requires/resources/sounds/types.d.ts index c5aa6427d..18b52d328 100644 --- a/src/node_requires/resources/sounds/types.d.ts +++ b/src/node_requires/resources/sounds/types.d.ts @@ -23,7 +23,6 @@ type eqBands = [ interface ISound extends IAsset { type: 'sound'; - name: string, preload: boolean, variants: soundVariant[], volume: randomized & { diff --git a/src/node_requires/resources/styles/IStyle.d.ts b/src/node_requires/resources/styles/IStyle.d.ts index d5e45abdf..24d395647 100644 --- a/src/node_requires/resources/styles/IStyle.d.ts +++ b/src/node_requires/resources/styles/IStyle.d.ts @@ -1,6 +1,6 @@ declare interface IStyle extends IAsset { type: 'style'; - name: string; + typeface: assetRef; font: { family: string; size: number; diff --git a/src/node_requires/resources/styles/index.ts b/src/node_requires/resources/styles/index.ts index 4f24c804e..7503ff838 100644 --- a/src/node_requires/resources/styles/index.ts +++ b/src/node_requires/resources/styles/index.ts @@ -1,7 +1,8 @@ import generateGUID from '../../generateGUID'; import {StylePreviewer} from '../preview/style'; import {promptName} from '../promptName'; -import {IAssetContextItem, addAsset, getOfType} from '..'; +import {IAssetContextItem, addAsset, getOfType, createAsset as createProjAsset} from '..'; +import {getBaseClassFields} from '../templates'; export const createAsset = async (): Promise => { const name = await promptName('style', 'New Style'); @@ -14,6 +15,7 @@ export const createAsset = async (): Promise => { type: 'style', name, uid: id, + typeface: -1, font: { family: 'sans-serif', halign: 'left', @@ -51,6 +53,30 @@ export const getThumbnail = StylePreviewer.getClassic; export const areThumbnailsIcons = false; export const assetContextMenuItems: IAssetContextItem[] = [{ + vocPath: 'texture.createTemplate', + icon: 'template', + action: async ( + asset: ITexture, + collection: folderEntries, + folder: IAssetFolder + ): Promise => { + let template: ITemplate; + if (getOfType('template').some(t => t.name === asset.name)) { + const answer = await createProjAsset('template', folder); + if (!answer) { + return; + } + template = answer; + } else { + template = (await createProjAsset('template', folder, { + name: asset.name + }))!; + } + template.baseClass = 'Text'; + Object.assign(template, getBaseClassFields('Text')); + template.textStyle = asset.uid; + } +}, { icon: 'copy', vocPath: 'common.duplicate', action: async (asset: IStyle, collection, folder): Promise => { diff --git a/src/node_requires/resources/templates/ITemplate.d.ts b/src/node_requires/resources/templates/ITemplate.d.ts index b061e14e0..4414cd91e 100644 --- a/src/node_requires/resources/templates/ITemplate.d.ts +++ b/src/node_requires/resources/templates/ITemplate.d.ts @@ -1,5 +1,5 @@ type PixiBlendMode = 'normal' | 'add' | 'multiply' | 'screen'; -type TemplateBaseClass = 'AnimatedSprite' | 'Text' | 'NineSlicePlane' | 'Container' | +type TemplateBaseClass = 'AnimatedSprite' | 'Text' | 'BitmapText' | 'NineSlicePlane' | 'Container' | 'Button' | 'SpritedCounter' | 'RepeatingTexture' | 'TextBox'; interface ITemplate extends IScriptableBehaviors { @@ -9,6 +9,7 @@ interface ITemplate extends IScriptableBehaviors { pressedTexture?: assetRef, disabledTexture?: assetRef, textStyle?: assetRef, + useBitmapText?: boolean; defaultText?: string, fieldType?: 'text' | 'number' | 'email' | 'password', selectionColor?: string; diff --git a/src/node_requires/resources/templates/defaultTemplate.ts b/src/node_requires/resources/templates/defaultTemplate.ts index eca18017c..a7401e16a 100644 --- a/src/node_requires/resources/templates/defaultTemplate.ts +++ b/src/node_requires/resources/templates/defaultTemplate.ts @@ -24,6 +24,7 @@ export const get = function get(): ITemplate { extends: {}, lastmod: Number(new Date()), uid: generateGUID(), - behaviors: [] + behaviors: [], + extendTypes: '' }); }; diff --git a/src/node_requires/resources/templates/index.ts b/src/node_requires/resources/templates/index.ts index e2d05d928..a1b9fed37 100644 --- a/src/node_requires/resources/templates/index.ts +++ b/src/node_requires/resources/templates/index.ts @@ -6,7 +6,7 @@ import {getTextureOrig, import {TexturePreviewer} from '../preview/texture'; import {StylePreviewer} from '../preview/style'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IAssetContextItem, addAsset, getById, getOfType} from '..'; import {promptName} from '../promptName'; import generateGUID from '../../generateGUID'; @@ -17,6 +17,14 @@ const createNewTemplate = async (opts?: {name: string}): Promise => { // Fix default OnStep event for coffeescript projects if (window.currentProject.language === 'coffeescript') { template.events[0].code = '@move()'; + } else if (window.currentProject.language === 'catnip') { + template.events[0].code = [{ + lib: 'core.movement', + code: 'move copy', + values: {} + }]; + template.events[0].variables = []; + template.properties = []; } if (opts?.name) { @@ -39,6 +47,7 @@ export const baseClasses: TemplateBaseClass[] = [ 'RepeatingTexture', 'NineSlicePlane', 'Text', + 'BitmapText', 'Button', 'TextBox', 'Container' @@ -46,6 +55,7 @@ export const baseClasses: TemplateBaseClass[] = [ export const baseClassToIcon: Record = { AnimatedSprite: 'template', Text: 'font', + BitmapText: 'bitmap-font', NineSlicePlane: 'ninepatch', Container: 'maximize', Button: 'button', @@ -56,6 +66,7 @@ export const baseClassToIcon: Record = { export const baseClassToTS: Record = { AnimatedSprite: 'CopyAnimatedSprite', Text: 'CopyText', + BitmapText: 'CopyBitmapText', NineSlicePlane: 'CopyPanel', Container: 'CopyContainer', Button: 'CopyButton', @@ -66,13 +77,14 @@ export const baseClassToTS: Record = { // First line — implements methods and fields supported by the corresponding pixi.js classes. // repeater — has a `count` field. -// embeddedText — has a centered text label, but is not a PIXI.Text itself. +// embeddedText — has a centered text label (PIXI.Text / PIXI.BitmapText), +// but is not a PIXI.Text / PIXI.BitmapText itself. // scroller — has properties to scroll tiled sprites. // visualStates — has additional textures for hovered, pressed, and disabled states // textInput — has options to change text input type. // blendModes — supports pixi.js blend modes. Everything but PIXI.Container does that. // textured — uses a ct.js texture as its main asset. -export type BaseClassCapability = 'text' | 'ninePatch' | 'container' | 'tilingSprite' | 'animatedSprite' | +export type BaseClassCapability = 'text' | 'bitmapText' | 'ninePatch' | 'container' | 'tilingSprite' | 'animatedSprite' | 'repeater' | 'embeddedText' | 'scroller' | 'visualStates' | 'textInput' | 'blendModes' | 'textured'; /** @@ -89,6 +101,7 @@ export const baseClassCapabilities: Record[] => { if (template === -1) { throw new Error('Cannot work with -1 assetRefs'); } - return getTexturePixiTexture(template.texture, void 0, true); + return getTexturePixiTexture(template.texture || -1, void 0, true); }; export const getDOMTexture = (template: ITemplate | assetRef): HTMLImageElement => { @@ -215,7 +230,7 @@ export const getDOMTexture = (template: ITemplate | assetRef): HTMLImageElement if (typeof template === 'string') { template = getById('template', template); } - return getTextureDOMImage(template.texture); + return getTextureDOMImage(template.texture || -1); }; export const assetContextMenuItems: IAssetContextItem[] = [{ diff --git a/src/node_requires/resources/textures/ITexture.d.ts b/src/node_requires/resources/textures/ITexture.d.ts index acee89b27..95145922a 100644 --- a/src/node_requires/resources/textures/ITexture.d.ts +++ b/src/node_requires/resources/textures/ITexture.d.ts @@ -13,7 +13,6 @@ interface IHasCollision { interface ITexture extends IAsset, IHasCollision { type: 'texture'; uid: string; - name: string; origname: string; /* Number of columns and rows, accordigly */ grid: [number, number]; diff --git a/src/node_requires/resources/textures/index.ts b/src/node_requires/resources/textures/index.ts index 6bfcc8c45..4b0294866 100644 --- a/src/node_requires/resources/textures/index.ts +++ b/src/node_requires/resources/textures/index.ts @@ -2,9 +2,9 @@ import {uidMap, getOfType, getById, createAsset, IAssetContextItem} from '..'; import {TexturePreviewer} from '../preview/texture'; import {convertToPng} from '../../utils/imageUtils'; -const fs = require('node_modules/fs-extra'); +import fs from 'fs-extra'; import path from 'path'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; /** * Accepts a texture ID or a texture's object itself; @@ -34,13 +34,13 @@ const getTextureOrig = function (texture: assetRef | ITexture, fs?: boolean): st texture = getById('texture', texture); } if (fs) { - return `${global.projdir}/img/${texture.origname}`; + return `${window.projdir}/img/${texture.origname}`; } - return `file://${global.projdir.replace(/\\/g, '/')}/img/${texture.origname}?cache=${texture.lastmod}`; + return `file://${window.projdir.replace(/\\/g, '/')}/img/${texture.origname}?cache=${texture.lastmod}`; }; const baseTextureFromTexture = async (texture: ITexture): Promise => { - const path = 'file://' + global.projdir.replace(/\\/g, '/') + '/img/' + texture.origname + '?' + texture.lastmod; + const path = 'file://' + window.projdir.replace(/\\/g, '/') + '/img/' + texture.origname + '?' + texture.lastmod; return (await PIXI.Assets.load(path)).baseTexture; }; @@ -253,7 +253,7 @@ const importImageToTexture = async (opts: { path = require('path'), generateGUID = require('./../../generateGUID'); const id = generateGUID(); - const dest = path.join(global.projdir, 'img', `i${id}.png`); + const dest = path.join(window.projdir, 'img', `i${id}.png`); if (opts.src instanceof Buffer) { await fs.writeFile(dest, opts.src); } else { @@ -319,13 +319,17 @@ const importImageToTexture = async (opts: { const exec = texturePostfixParser.exec(obj.name); if (exec) { obj.name = obj.name.replace(texturePostfixParser, ''); - obj.grid = [Number(exec.groups.cols) || 1, Number(exec.groups.rows) || 1]; + obj.grid = [Number(exec.groups!.cols) || 1, Number(exec.groups!.rows) || 1]; obj.width /= obj.grid[0]; obj.height /= obj.grid[1]; - obj.right /= obj.grid[0]; - obj.bottom /= obj.grid[1]; - if (exec.groups.until) { - obj.untill = Number(exec.groups.until); + if (obj.right) { + obj.right /= obj.grid[0]; + } + if (obj.bottom) { + obj.bottom /= obj.grid[1]; + } + if (exec.groups!.until) { + obj.untill = Number(exec.groups!.until); } } else if (isBgPostfixTester.test(obj.name)) { // Test whether it has a @bg postfix @@ -442,8 +446,8 @@ const removeTexture = (tex: string | ITexture): void => { } } } - if (global.currentProject.settings.branding.icon === uid) { - delete global.currentProject.settings.branding.icon; + if (window.currentProject.settings.branding.icon === uid) { + window.currentProject.settings.branding.icon = -1; } }; @@ -485,12 +489,16 @@ export const assetContextMenuItems: IAssetContextItem[] = [{ ): Promise => { if (getOfType('template').some(t => t.name === asset.name)) { const template = await createAsset('template', folder); - template.texture = asset.uid; + if (template) { + template.texture = asset.uid; + } } else { const template = await createAsset('template', folder, { name: asset.name }); - template.texture = asset.uid; + if (template) { + template.texture = asset.uid; + } } } }]; @@ -506,7 +514,7 @@ Promise => { } const inputPath = await window.showOpenDialog({ filter: '.png,.jpg,.jpeg,.bmp,.tiff,.webp' - }); + }) as string; if (!inputPath) { // eslint-disable-next-line no-throw-literal throw 'cancelled'; diff --git a/src/node_requires/resources/fonts/types.d.ts b/src/node_requires/resources/typefaces/ITypeface.d.ts similarity index 70% rename from src/node_requires/resources/fonts/types.d.ts rename to src/node_requires/resources/typefaces/ITypeface.d.ts index e2b708d8c..69a198d11 100644 --- a/src/node_requires/resources/fonts/types.d.ts +++ b/src/node_requires/resources/typefaces/ITypeface.d.ts @@ -1,14 +1,19 @@ type builtinCharsets = 'allInFont' | 'punctuation' | 'basicLatin' | 'latinExtended' | 'cyrillic' | 'greekCoptic' | 'custom'; -interface IFont extends IAsset { - type: 'font'; - typefaceName: string; - origname: string; +interface IFont { weight: fontWeight; italic: boolean; + uid: string; + origname: string; +} + +interface ITypeface extends IAsset { + type: 'typeface'; + fonts: IFont[]; bitmapFont: boolean; bitmapFontSize: number; bitmapFontLineHeight: number; + bitmapPrecision: boolean; charsets: builtinCharsets[]; customCharset?: string; } diff --git a/src/node_requires/resources/typefaces/bitmapFontGenerator/index.ts b/src/node_requires/resources/typefaces/bitmapFontGenerator/index.ts new file mode 100644 index 000000000..4a4e33ca2 --- /dev/null +++ b/src/node_requires/resources/typefaces/bitmapFontGenerator/index.ts @@ -0,0 +1,216 @@ +/* eslint-disable max-len */ +import util, {glyph} from './util'; +import opentype, {Glyph, Font} from 'opentype.js'; + +type generatorOptions = { + width: number, + height: number, + baseline: number, + margin: number, + fill: string, + stroke: string, + list: string, + missingGlyph?: HTMLCanvasElement | string, + pixelPerfect: boolean, + fontOrigname: string, + typefaceName: string +} + +const draw = ( + ctx: CanvasRenderingContext2D, + glyphList: glyph[], + descend: number, + options: generatorOptions +) => { + var dict: Record = {}; + + var drawX = 1; + var drawY = 1; + var drawHeight = options.baseline + descend; + var mg; + + glyphList.forEach((g, index) => { + if (g.glyph === void 0) { + if (options.width !== void 0) { + g.width = options.width; + } + ctx.drawImage(options.missingGlyph as HTMLCanvasElement, drawX, drawY, g.width, drawHeight); + mg = { + x: drawX, y: drawY, width: g.width, height: drawHeight + }; + } else { + var drawWidth = options.width; + if (drawWidth === void 0) { + drawWidth = g.width; + } + // Account that the final canvas will be downscaled by x0.5 + if (drawX + drawWidth > ctx.canvas.width / 2) { + drawX = 1; + drawY += drawHeight + options.margin * 2; + } + var path = g.glyph.getPath(drawX + (drawWidth / 2) - (g.width / 2), drawY + options.baseline, options.height); + path.fill = options.fill; + path.stroke = options.stroke; + path.draw(ctx); + if (index === glyphList.length - 1) { + mg = { + x: drawX, y: drawY, width: drawWidth, height: drawHeight + }; + } else { + g.glyph.unicodes.forEach((unicode) => { + dict[unicode] = { + x: drawX, y: drawY, width: drawWidth, height: drawHeight + }; + }); + } + drawX += drawWidth + options.margin * 2; + } + }); + + return { + map: dict, missingGlyph: mg + }; +}; + +// eslint-disable-next-line max-lines-per-function, complexity +export const generateBitmapFont = async function generateBitmapFont( + fontSrc: string, + outputPath: string, + options: generatorOptions +) { + const fs = require('fs-extra'); + const buffer = await fs.readFile(fontSrc); + const font = opentype.parse(buffer.buffer); + + if (!options.list || options.list.length === 0) { + // Get private values + options.list = Object.keys((font.glyphs as any).glyphs) + .map(code => String.fromCharCode((font.glyphs as any).glyphs[code].unicode) || ' ') + .join(''); + } + + + var lostChars: string[] = []; + var glyphList: Partial[] = []; + + Array.from(options.list).forEach((char) => { + const glyph = Object.assign(font.stringToGlyphs(char)[0], { + font + }); + if (glyph.unicodes.length === 0) { + lostChars.push(char); + } + const scale = 1 / font.unitsPerEm * options.height; + glyphList.push({ + glyph, + width: Math.ceil((glyph.advanceWidth ?? 0) * scale) + }); + }); + + if (isNaN(options.baseline)) { + options.baseline = util.getMaxBaseline(glyphList as glyph[], options.height); + } + + // Update baseline value while adding missingGlyph to glyphList + if (options.missingGlyph === void 0 || typeof options.missingGlyph === 'string') { + // Get private values + // eslint-disable-next-line prefer-destructuring + var g: Glyph & { + font: Font + } = (font.glyphs as any).glyphs[0]; + if (options.missingGlyph) { + g = font.charToGlyph(options.missingGlyph) as Glyph & { + font: Font + }; + } + var scale = 1 / font.unitsPerEm * options.height; + g.font = font; + glyphList.push({ + glyph: g, + width: Math.ceil((g.advanceWidth ?? 0) * scale) + }); + if (options.baseline < (g.yMax || 0) * scale) { + options.baseline = Math.ceil((g.yMax || 0) * scale); + } + } + + var descend = util.getMinDescend(glyphList as glyph[], options.height); + var adjustedHeight = util.getAdjustedHeight(descend, options.height, options.baseline); + + // Calculate the required canvas size + var canvasSize; + if (options.width === void 0) { + canvasSize = util.calculateCanvasSizeProp( + options.list, + glyphList as glyph[], + adjustedHeight, + options.baseline + descend, + options.margin || 1 + ); + } else { + canvasSize = util.calculateCanvasSize( + options.list, + options.width, + adjustedHeight, + options.margin || 1 + ); + } + + var drawResult, canvas, ctx; + canvas = document.createElement('canvas'); + // Check if the created canvas size is valid + const maxSize = options.pixelPerfect ? 4096 : 8192; + if (canvasSize.width > maxSize || canvasSize.height > maxSize) { + throw new Error(`The resulting canvas for the font ${options.fontOrigname} in typeface ${options.typefaceName} is too big. (More than ${maxSize} by ${maxSize} pixels.) Try reducing the list of characters this typeface requires or decrease the size of the bitmap font.`); + } + if (canvasSize.width === -1 || canvasSize.height === -1) { + throw new Error(`Couldn't form layout for the font ${options.fontOrigname} in typeface ${options.typefaceName}. Either the font is buggy as heck or it doesn't have the characters you've listed in typeface's settings.`); + } + if (options.pixelPerfect) { + // We need to firstly draw an upscaled canvas, then scale it back, + // because otherwise pixel fonts will miss some of their pieces due to rounding errors + canvas.width = canvasSize.width * 2; + canvas.height = canvasSize.height * 2; + ctx = canvas.getContext('2d')!; + ctx.save(); + ctx.scale(2, 2); + drawResult = draw(ctx, glyphList as glyph[], descend, options); + ctx.restore(); + } else { + canvas.width = canvasSize.width; + canvas.height = canvasSize.height; + ctx = canvas.getContext('2d')!; + drawResult = draw(ctx, glyphList as glyph[], descend, options); + } + + // Notify about characters that could not be drawn + if (lostChars.length > 0) { + // eslint-disable-next-line no-console + console.warn('Cannot find ' + lostChars.join(',') + ' from the given font. ' + + 'Generated image does not include these characters. ' + + 'Try using other font or characters.'); + } + let downscaleCanvas; + if (options.pixelPerfect) { + downscaleCanvas = document.createElement('canvas'); + downscaleCanvas.width = canvas.width / 2; + downscaleCanvas.height = canvas.height / 2; + const downscalex = downscaleCanvas.getContext('2d')!; + downscalex.drawImage(canvas, 0, 0, canvas.width / 2, canvas.height / 2); + await util.outputBitmapFont(outputPath, downscaleCanvas); + } else { + await util.outputBitmapFont(outputPath, canvas); + } + return { + map: drawResult.map, + missingGlyph: drawResult.missingGlyph, + width: options.width, + height: adjustedHeight, + canvas: options.pixelPerfect ? downscaleCanvas : canvas + }; +}; diff --git a/src/node_requires/resources/fonts/bitmapFontGenerator/util.js b/src/node_requires/resources/typefaces/bitmapFontGenerator/util.ts similarity index 73% rename from src/node_requires/resources/fonts/bitmapFontGenerator/util.js rename to src/node_requires/resources/typefaces/bitmapFontGenerator/util.ts index 7ce3dc8b8..499d81d69 100644 --- a/src/node_requires/resources/fonts/bitmapFontGenerator/util.js +++ b/src/node_requires/resources/typefaces/bitmapFontGenerator/util.ts @@ -1,7 +1,16 @@ /* eslint-disable max-len */ -const fs = require('fs').promises; +import fs from 'fs-extra'; +import type {Glyph, Font} from 'opentype.js'; -const calculateCanvasSize = function calculateCanvasSize(text, charWidth, charHeight, margin) { +const calculateCanvasSize = ( + text: string, + charWidth: number, + charHeight: number, + margin: number +): { + width: number, + height: number +} => { if (charWidth <= 0 || charHeight <= 0) { return { width: -1, height: -1 @@ -29,7 +38,23 @@ const calculateCanvasSize = function calculateCanvasSize(text, charWidth, charHe }; }; -const canGoIn = function canGoIn(canvasSize, glyphList, charHeight, margin) { +export type glyph = { + glyph: Glyph & { + font: Font + }, + width: number, + height: number +}; + +const canGoIn = ( + canvasSize: { + width: number, + height: number + }, + glyphList: glyph[], + charHeight: number, + margin: number +): boolean => { var drawX = 1; var drawY = 1; @@ -45,11 +70,11 @@ const canGoIn = function canGoIn(canvasSize, glyphList, charHeight, margin) { }; const calculateCanvasSizeProp = function calculateCanvasSizeProp( - text, - glyphList, - height, - charHeight, - margin + text: string, + glyphList: glyph[], + height: number, + charHeight: number, + margin: number ) { var widthAverage = 0; var widthMax = 0; @@ -75,12 +100,12 @@ const calculateCanvasSizeProp = function calculateCanvasSizeProp( return canvasSize; }; -const outputBitmapFont = function outputBitmapFont(outputPath, canvas) { +const outputBitmapFont = function outputBitmapFont(outputPath: string, canvas: HTMLCanvasElement) { const buffer = Buffer.from(canvas.toDataURL().replace(/^data:image\/\w+;base64,/, ''), 'base64'); return fs.writeFile(outputPath, buffer); }; -const getMaxBaseline = function getMaxBaseline(glyphList, height) { +const getMaxBaseline = function getMaxBaseline(glyphList: Pick[], height: number) { const baseline = Math.ceil(Math.max(-Infinity, ...glyphList.map(glyph => { var scale = 1 / glyph.glyph.font.unitsPerEm * height; return (glyph.glyph.yMax || 0) * scale; @@ -88,7 +113,7 @@ const getMaxBaseline = function getMaxBaseline(glyphList, height) { return baseline; }; -const getMinDescend = function getMinDescend(glyphList, height) { +const getMinDescend = function getMinDescend(glyphList: glyph[], height: number) { var descend = Math.min(Infinity, ...glyphList.map((g) => { var scale = 1 / g.glyph.font.unitsPerEm * height; return (g.glyph.yMin || 0) * scale; @@ -96,7 +121,7 @@ const getMinDescend = function getMinDescend(glyphList, height) { return Math.ceil(Math.abs(descend)); }; -const getAdjustedHeight = function getAdjustedHeight(descend, height, baseline) { +const getAdjustedHeight = function getAdjustedHeight(descend: number, height: number, baseline: number) { var extraDescend = Math.ceil(descend - (height - baseline)); var adjustedHeight = height; if (extraDescend > 0) { @@ -105,8 +130,9 @@ const getAdjustedHeight = function getAdjustedHeight(descend, height, baseline) return adjustedHeight; }; -module.exports = { +export default { calculateCanvasSizeProp, + calculateCanvasSize, getAdjustedHeight, outputBitmapFont, getMaxBaseline, diff --git a/src/node_requires/resources/typefaces/index.ts b/src/node_requires/resources/typefaces/index.ts new file mode 100644 index 000000000..e6bd575b3 --- /dev/null +++ b/src/node_requires/resources/typefaces/index.ts @@ -0,0 +1,175 @@ +import {TypefacePreviewer} from '../preview/typeface'; +import {getOfType, getById, IAssetContextItem, createAsset as createAssetResources} from '..'; +import fs from 'fs-extra'; +import path from 'path'; +import generateGUID from '../../generateGUID'; + +const guessItalic = (filename: string) => { + const testname = filename.toLowerCase(); + return testname.includes('italic') || testname.includes('oblique') || testname.includes('slanted'); +}; +const weightGuessMap: Record = { + 100: ['extralight', 'extra light', 'extra-light', 'extrathin'], + 200: ['thin'], + 300: ['light'], + 400: ['regular'], + 500: ['medium', 'book'], + 600: ['semibold', 'semi-bold'], + 800: ['extrabold', 'extra bold', 'extra-bold', 'bolder'], + 700: ['bold'], + 900: ['black'] +}; +const guessWeight = (filename: string): fontWeight => { + const testname = filename.toLowerCase(); + for (const weight in weightGuessMap) { + for (const name of weightGuessMap[weight as fontWeight]) { + if (testname.includes(name)) { + return weight as fontWeight; + } + } + } + return '400'; +}; + +/** + * @param font The font object in ct.js project. + * @param fs If set to `true`, returns a clean path in a file system. + * Otherwise, returns an URL. + */ +export const getPathToTtf = function getPathToTtf(font: IFont, fs?: boolean): string { + const path = require('path'); + if (fs) { + return path.join(window.projdir, 'fonts', `f${font.uid}.ttf`); + } + return `file://${window.projdir.replace(/\\/g, '/')}/fonts/f${font.uid}.ttf`; +}; + +export const addFont = async (typeface: ITypeface, src: string): Promise => { + const uidTypeface = generateGUID(); + const basename = path.basename(src, path.extname(src)); + const weight = guessWeight(basename); + const italic = guessItalic(basename); + const font: IFont = { + weight, + italic, + uid: uidTypeface, + origname: basename + }; + const targetPath = getPathToTtf(font, true); + await fs.copy(src, targetPath); + typeface.fonts.push(font); + if (typeface.fonts.length === 1) { + await TypefacePreviewer.save(typeface); + } + return font; +}; + +export const importTtfToFont = async function importTtfToFont(src: string): Promise { + if (path.extname(src).toLowerCase() !== '.ttf') { + throw new Error(`[resources/fonts] Rejecting a file as it does not have a .ttf extension: ${src}`); + } + const uidFont = generateGUID(); + const obj: ITypeface = { + name: path.basename(src, '.ttf'), + type: 'typeface', + fonts: [], + lastmod: Number(new Date()), + bitmapFont: false, + bitmapFontSize: 16, + bitmapFontLineHeight: 18, + bitmapPrecision: false, + charsets: ['allInFont' as builtinCharsets], + customCharset: '', + uid: uidFont + }; + await addFont(obj, src); + await TypefacePreviewer.save(obj); + window.signals.trigger('fontCreated'); + return obj; +}; + +export const getThumbnail = TypefacePreviewer.getClassic; + +export const areThumbnailsIcons = false; + +export const getFontDomName = (font: IFont): string => `CTPROJFONT-${font.uid}`; + +const fontsMap = new Map(); +export const refreshFonts = async (): Promise => { + const typefaces = getOfType('typeface'); + const loadPromises = []; + for (const typeface of typefaces) { + for (const font of typeface.fonts) { + if (fontsMap.has(font.uid)) { + continue; + } + const template = { + weight: '400', + style: 'normal' + }; + const source = getPathToTtf(font), + cleanedSource = source.replace(/ /g, '%20').replace(/\\/g, '/'); + const face = new FontFace(getFontDomName(font), `url(${cleanedSource})`, template); + loadPromises.push(face.load() + .then(loaded => { + fontsMap.set(font.uid, loaded); + document.fonts.add(loaded); + })); + } + } + if (loadPromises.length) { + await Promise.all(loadPromises); + } +}; + +export const createAsset = async (payload?: {src: string}): Promise => { + if (payload && payload.src) { + return importTtfToFont(payload.src); + } + const inputPath = await window.showOpenDialog({ + filter: '.ttf', + multiple: true + }) as string[] | false; + if (!inputPath || !inputPath.length) { + throw new Error('You need to select a TTF file.'); + } + const typeface = await importTtfToFont(inputPath[0]); + if (inputPath.length > 1) { + await Promise.all(inputPath.slice(1).map((src) => addFont(typeface, src))); + } + await refreshFonts(); + return typeface; +}; + +/** + * Properly removes a typeface from any styles + */ +export const removeAsset = (typeface: string | ITypeface): void => { + const asset = typeof typeface === 'string' ? getById('typeface', typeface) : typeface; + const styles = getOfType('style'); + for (const style of styles) { + if (style.typeface === asset.uid) { + style.typeface = -1; + } + } +}; + + +export const assetContextMenuItems: IAssetContextItem[] = [{ + vocPath: 'common.createStyleFromIt', + icon: 'droplet', + action: async ( + asset: ITypeface, + collection: folderEntries, + folder: IAssetFolder + ): Promise => { + const style = await createAssetResources('style', folder); + if (style) { + style.typeface = asset.uid; + if (asset.bitmapFont) { + style.font.size = asset.bitmapFontSize; + style.font.lineHeight = asset.bitmapFontLineHeight; + } + } + } +}]; diff --git a/src/node_requires/riotMixins/discardio.ts b/src/node_requires/riotMixins/discardio.ts index e5495677b..c5d376dff 100644 --- a/src/node_requires/riotMixins/discardio.ts +++ b/src/node_requires/riotMixins/discardio.ts @@ -25,16 +25,16 @@ const discardio = (riotTag: IRiotTag) => { discardioSources.set(riotTag, riotTag.opts.asset); riotTag.asset = structuredClone(riotTag.opts.asset); riotTag.writeChanges = (): void => { - riotTag.asset.lastmod = Number(new Date()); - const sourceObject = discardioSources.get(riotTag); - const changedObject = riotTag.asset; + riotTag.asset!.lastmod = Number(new Date()); + const sourceObject = discardioSources.get(riotTag)!; + const changedObject = riotTag.asset!; // update the innards of the object without creating a new one for (const key of Object.keys(sourceObject)) { delete sourceObject[key as keyof typeof sourceObject]; } Object.assign(sourceObject, changedObject); - window.signals.trigger('assetChanged', riotTag.asset.uid); - window.signals.trigger(`${riotTag.asset.type}Changed`, riotTag.asset.uid); + window.signals.trigger('assetChanged', riotTag.asset!.uid); + window.signals.trigger(`${riotTag.asset!.type}Changed`, riotTag.asset!.uid); }; riotTag.discardChanges = (): void => { riotTag.asset = structuredClone(discardioSources.get(riotTag)); @@ -45,7 +45,7 @@ const discardio = (riotTag: IRiotTag) => { ); const renamer = (payload: [string, string]) => { const [uid, name] = payload; - if (riotTag.asset.uid === uid) { + if (riotTag.asset!.uid === uid) { (riotTag.asset as IAsset & {name: string}).name = name; } }; diff --git a/src/node_requires/riotMixins/voc.ts b/src/node_requires/riotMixins/voc.ts index 36df33b3a..8aef50f53 100644 --- a/src/node_requires/riotMixins/voc.ts +++ b/src/node_requires/riotMixins/voc.ts @@ -1,5 +1,7 @@ import {getLanguageJSON, localizeField} from '../i18n'; +const capitalize = (str: string): string => str.slice(0, 1).toUpperCase() + str.slice(1); + const voc = (riotTag: IRiotTag): void => { const updateLocales = () => { const languageJSON = getLanguageJSON(); @@ -17,6 +19,7 @@ const voc = (riotTag: IRiotTag): void => { riotTag.vocGlob = languageJSON.common; riotTag.vocMeta = languageJSON.me; riotTag.vocFull = languageJSON; + riotTag.capitalize = capitalize; riotTag.localizeField = localizeField; }; updateLocales(); diff --git a/src/node_requires/roomEditor/common.ts b/src/node_requires/roomEditor/common.ts index fbcd7dae6..536462c00 100644 --- a/src/node_requires/roomEditor/common.ts +++ b/src/node_requires/roomEditor/common.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {BaseClassCapability, baseClassCapabilities} from '../resources/templates'; interface ISimplePoint { @@ -144,7 +144,7 @@ export const getBindingsForBaseClass = (baseClass: TemplateBaseClass): CopyBindi if (!(capability in bindingsMap)) { continue; } - for (const binding of bindingsMap[capability]) { + for (const binding of bindingsMap[capability]!) { if (!bindings.includes(binding)) { bindings.push(binding); } diff --git a/src/node_requires/roomEditor/entityClasses/Background.ts b/src/node_requires/roomEditor/entityClasses/Background.ts index cd29df912..d25ba3a70 100644 --- a/src/node_requires/roomEditor/entityClasses/Background.ts +++ b/src/node_requires/roomEditor/entityClasses/Background.ts @@ -2,8 +2,8 @@ import {getPixiTexture} from '../../resources/textures'; import {RoomEditor} from '..'; import {RoomEditorPreview} from '../previewer'; -import * as PIXI from 'node_modules/pixi.js'; -// import 'node_modules/@pixi/events'; +import * as PIXI from 'pixi.js'; +// import '@pixi/events'; class Background extends PIXI.TilingSprite { bgTexture: assetRef; @@ -40,13 +40,13 @@ class Background extends PIXI.TilingSprite { } this.editor.backgrounds.splice(ind, 1); this.parent.removeChild(this); - this.editor.riotEditor?.refs.backgroundsEditor.update(); + this.editor.riotEditor?.refs.backgroundsEditor?.update(); return this; } restore(): this { this.editor.backgrounds.push(this); (this.editor.room.addChild as any)(this); - this.editor.riotEditor?.refs.backgroundsEditor.update(); + this.editor.riotEditor?.refs.backgroundsEditor?.update(); return this; } diff --git a/src/node_requires/roomEditor/entityClasses/Copy.ts b/src/node_requires/roomEditor/entityClasses/Copy.ts index 578219586..52331b140 100644 --- a/src/node_requires/roomEditor/entityClasses/Copy.ts +++ b/src/node_requires/roomEditor/entityClasses/Copy.ts @@ -6,8 +6,8 @@ import {getTexturePivot, getPixiTexture as getPixiTextureITexture} from '../../r import {styleToTextStyle} from '../../styleUtils'; import {getByPath} from '../../i18n'; -import * as PIXI from 'node_modules/pixi.js'; -// import 'node_modules/@pixi/events'; +import * as PIXI from 'pixi.js'; +// import '@pixi/events'; /** * @extends PIXI.Container @@ -66,22 +66,22 @@ class Copy extends PIXI.Container { } } if (!this.isGhost) { - editor.copies.add(this); + editor.copies.push(this); } } destroy(): void { if (!this.isGhost) { - this.editor.copies.delete(this); + this.editor.copies.splice(this.editor.copies.indexOf(this), 1); } super.destroy(); } detach(): this { - this.editor.copies.delete(this); + this.editor.copies.splice(this.editor.copies.indexOf(this), 1); (this.editor.room.removeChild as any)(this); return this; } restore(): this { - this.editor.copies.add(this); + this.editor.copies.push(this); (this.editor.room.addChild as any)(this); return this; } @@ -125,7 +125,7 @@ class Copy extends PIXI.Container { } } updateTilingSprite(): void { - const tiling = this.tilingSprite, + const tiling = this.tilingSprite!, template = this.cachedTemplate; if (hasCapability(template.baseClass, 'tilingSprite') && template.baseClass !== 'SpritedCounter') { tiling.scale.set( @@ -135,7 +135,7 @@ class Copy extends PIXI.Container { tiling.width = tiling.initialWidth * this.scale.x; tiling.height = tiling.initialHeight * this.scale.y; } else if (template.baseClass === 'SpritedCounter') { - tiling.width = template.repeaterSettings.defaultCount * tiling.initialWidth; + tiling.width = template.repeaterSettings!.defaultCount * tiling.initialWidth; tiling.height = tiling.initialHeight; } } @@ -185,17 +185,19 @@ class Copy extends PIXI.Container { copy.align = this.align; } if (this.text) { - if (this.customTextSettings.anchor) { - copy.customAnchor = this.customTextSettings.anchor; - } - if (this.customTextSettings.wordWrapWidth) { - copy.customWordWrap = this.customTextSettings.wordWrapWidth; - } - if (this.customTextSettings.fontSize) { - copy.customSize = this.customTextSettings.fontSize; - } - if (this.customTextSettings.customText) { - copy.customText = this.customTextSettings.customText; + if (this.customTextSettings) { + if (this.customTextSettings.anchor) { + copy.customAnchor = this.customTextSettings.anchor; + } + if (this.customTextSettings.wordWrapWidth) { + copy.customWordWrap = this.customTextSettings.wordWrapWidth; + } + if (this.customTextSettings.fontSize) { + copy.customSize = this.customTextSettings.fontSize; + } + if (this.customTextSettings.customText) { + copy.customText = this.customTextSettings.customText; + } } } return copy; @@ -224,7 +226,7 @@ class Copy extends PIXI.Container { ...copy.bindings } : {}; - this.align = copy.align; + this.align = structuredClone(copy.align); if (hasCapability(t.baseClass, 'animatedSprite')) { this.sprite = new PIXI.AnimatedSprite(getPixiTexture(copy.uid)); this.sprite.autoUpdate = false; @@ -233,7 +235,7 @@ class Copy extends PIXI.Container { if (t.playAnimationOnStart) { this.sprite.play(); } - if (t.texture !== -1) { + if (t.texture && t.texture !== -1) { [this.sprite.anchor.x, this.sprite.anchor.y] = getTexturePivot(t.texture); } else { this.sprite.anchor.x = this.sprite.anchor.y = 0.5; @@ -260,19 +262,19 @@ class Copy extends PIXI.Container { if (copy.customText) { this.customTextSettings.customText = copy.customText; } - const style: Partial | false = t.textStyle && (t.textStyle !== -1) && + const style: Partial | false = (t.textStyle && (t.textStyle !== -1) && (Object.assign( {}, - styleToTextStyle(getById('style', t.textStyle)), + styleToTextStyle(getById('style', t.textStyle), true), blends - ) as unknown as Partial); + ) as unknown as Partial)) || false; // ts is drunk let text = copy.customText || this.cachedTemplate.defaultText || getByPath('roomView.emptyTextFiller') as string; if (this.cachedTemplate.fieldType === 'password') { text = '•'.repeat(text.length); } - this.text = new PIXI.Text(text, style); + this.text = new PIXI.Text(text, style || {}); this.addChild(this.text); if (copy.customAnchor) { this.customTextSettings.anchor = { @@ -282,20 +284,20 @@ class Copy extends PIXI.Container { } } if (hasCapability(t.baseClass, 'ninePatch')) { - this.nineSlicePlane = - new PIXI.NineSlicePlane(getPixiTexture(copy.uid)[0]) as Copy['nineSlicePlane']; - this.nineSlicePlane.initialWidth = this.nineSlicePlane.width; - this.nineSlicePlane.initialHeight = this.nineSlicePlane.height; - this.nineSlicePlane.topHeight = t.nineSliceSettings.top; - this.nineSlicePlane.bottomHeight = t.nineSliceSettings.bottom; - this.nineSlicePlane.leftWidth = t.nineSliceSettings.left; - this.nineSlicePlane.rightWidth = t.nineSliceSettings.right; - this.addChildAt(this.nineSlicePlane, 0); + const nsp = new PIXI.NineSlicePlane(getPixiTexture(copy.uid)[0]) as Exclude; + this.nineSlicePlane = nsp; + nsp.initialWidth = nsp.width; + nsp.initialHeight = nsp.height; + nsp.topHeight = t.nineSliceSettings!.top; + nsp.bottomHeight = t.nineSliceSettings!.bottom; + nsp.leftWidth = t.nineSliceSettings!.left; + nsp.rightWidth = t.nineSliceSettings!.right; + this.addChildAt(nsp, 0); this.updateNinePatch(); if (this.text) { this.text.anchor.set(0.5); - this.text.x = this.nineSlicePlane.initialWidth / 2; - this.text.y = this.nineSlicePlane.initialHeight / 2; + this.text.x = nsp.initialWidth / 2; + this.text.y = nsp.initialHeight / 2; } } if (hasCapability(t.baseClass, 'tilingSprite')) { @@ -304,13 +306,13 @@ class Copy extends PIXI.Container { tex, tex.width, tex.height - ) as Copy['tilingSprite']; + ) as Exclude; this.tilingSprite.initialWidth = this.tilingSprite.width; this.tilingSprite.initialHeight = this.tilingSprite.height; this.tilingSprite.anchor.set(0); if (hasCapability(t.baseClass, 'scroller')) { - this.tilingSprite.scrollSpeedX = t.tilingSettings.scrollSpeedX; - this.tilingSprite.scrollSpeedY = t.tilingSettings.scrollSpeedY; + this.tilingSprite.scrollSpeedX = t.tilingSettings!.scrollSpeedX; + this.tilingSprite.scrollSpeedY = t.tilingSettings!.scrollSpeedY; } else { this.tilingSprite.scrollSpeedX = 0; this.tilingSprite.scrollSpeedY = 0; @@ -332,7 +334,7 @@ class Copy extends PIXI.Container { const t = this.cachedTemplate; if (this.sprite) { this.sprite.textures = getPixiTexture(t); - if (t.texture !== -1) { + if (t.texture && t.texture !== -1) { [this.sprite.anchor.x, this.sprite.anchor.y] = getTexturePivot(t.texture); } else { this.sprite.anchor.x = this.sprite.anchor.y = 0.5; @@ -344,7 +346,10 @@ class Copy extends PIXI.Container { } } updateText(): void { - const cts = this.customTextSettings; + if (!this.text) { + return; + } + const cts = this.customTextSettings || {}; this.text.text = cts.customText || this.cachedTemplate.defaultText || getByPath('roomView.emptyTextFiller') as string; @@ -355,9 +360,9 @@ class Copy extends PIXI.Container { this.text.style.wordWrapWidth = Number(cts.wordWrapWidth); this.text.style.wordWrap = true; } else { - this.text.style.wordWrap = this.cachedTemplate.textStyle && + this.text.style.wordWrap = (this.cachedTemplate.textStyle && this.cachedTemplate.textStyle !== -1 && - getById('style', this.cachedTemplate.textStyle).font.wrap; + getById('style', this.cachedTemplate.textStyle).font.wrap) || false; } if (cts.fontSize) { this.text.style.fontSize = Number(cts.fontSize); diff --git a/src/node_requires/roomEditor/entityClasses/MarqueeBox.ts b/src/node_requires/roomEditor/entityClasses/MarqueeBox.ts index ca94363ac..9e7c77dae 100644 --- a/src/node_requires/roomEditor/entityClasses/MarqueeBox.ts +++ b/src/node_requires/roomEditor/entityClasses/MarqueeBox.ts @@ -1,7 +1,7 @@ import {RoomEditor} from '..'; import {getPixiSwatch} from '../../themes'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; export class MarqueeBox extends PIXI.Graphics { editor: RoomEditor; diff --git a/src/node_requires/roomEditor/entityClasses/SnapTarget.ts b/src/node_requires/roomEditor/entityClasses/SnapTarget.ts index 41895e9b2..d994519fa 100644 --- a/src/node_requires/roomEditor/entityClasses/SnapTarget.ts +++ b/src/node_requires/roomEditor/entityClasses/SnapTarget.ts @@ -9,7 +9,7 @@ import {hasCapability} from '../../resources/templates'; import {getPixiTexture, getTexturePivot} from '../../resources/textures'; import {createTilePatch} from '../interactions/tiles/placeTile'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; let unknownTextures = getPixiTexture(-1, void 0, true); @@ -25,6 +25,7 @@ export class SnapTarget extends PIXI.Container { super(); unknownTextures = getPixiTexture(-1, void 0, true); this.editor = editor; + this.eventMode = 'none'; this.ghost = new PIXI.AnimatedSprite(unknownTextures); this.ghostText = new PIXI.Text(''); this.ghost.visible = this.ghostText.visible = false; @@ -53,13 +54,13 @@ export class SnapTarget extends PIXI.Container { this.ghost.visible = spritelike; this.ghostText.visible = textlike; if (spritelike) { - if (currentTemplate.texture === -1 && + if ((!currentTemplate.texture || currentTemplate.texture === -1) && this.ghost.textures !== unknownTextures ) { this.updateGhost(-1); this.ghost.textures = unknownTextures; } - if (currentTemplate.texture !== -1 && + if (currentTemplate.texture && currentTemplate.texture !== -1 && this.prevGhostTex !== getById('texture', currentTemplate.texture) ) { this.updateGhost(currentTemplate.texture); @@ -125,7 +126,7 @@ export class SnapTarget extends PIXI.Container { (getByPath('roomView.emptyTextFiller') as string); if (template.textStyle && template.textStyle !== -1) { const style = getById('style', template.textStyle); - this.ghostText.style = styleToTextStyle(style) as unknown as Partial; + this.ghostText.style = styleToTextStyle(style, true); } else { this.ghostText.style = PIXI.TextStyle.defaultStyle; } diff --git a/src/node_requires/roomEditor/entityClasses/Tile.ts b/src/node_requires/roomEditor/entityClasses/Tile.ts index fb8927504..0164e9b24 100644 --- a/src/node_requires/roomEditor/entityClasses/Tile.ts +++ b/src/node_requires/roomEditor/entityClasses/Tile.ts @@ -2,7 +2,7 @@ import {getPixiTexture, getTexturePivot} from '../../resources/textures'; import {RoomEditor} from '..'; import {TileLayer} from './TileLayer'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {RoomEditorPreview} from '../previewer'; /** @@ -12,7 +12,6 @@ import {RoomEditorPreview} from '../previewer'; class Tile extends PIXI.Sprite { tileTexture: assetRef; tileFrame: number; - parent: TileLayer | null; editor: RoomEditor | RoomEditorPreview; isGhost: boolean; diff --git a/src/node_requires/roomEditor/entityClasses/TileLayer.ts b/src/node_requires/roomEditor/entityClasses/TileLayer.ts index 04972115d..a61c93424 100644 --- a/src/node_requires/roomEditor/entityClasses/TileLayer.ts +++ b/src/node_requires/roomEditor/entityClasses/TileLayer.ts @@ -2,7 +2,7 @@ import {Tile} from './Tile'; import {RoomEditor} from '..'; import {RoomEditorPreview} from '../previewer'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; let idCounter = 0; @@ -10,9 +10,8 @@ export const resetCounter = (): void => { idCounter = 0; }; -export class TileLayer extends PIXI.Container { +export class TileLayer extends PIXI.Container { extends: Record; - children: Tile[]; editor: RoomEditor | RoomEditorPreview; id: number; shouldCache: boolean; diff --git a/src/node_requires/roomEditor/entityClasses/Transformer.ts b/src/node_requires/roomEditor/entityClasses/Transformer.ts index 74438e2f5..0438dad72 100644 --- a/src/node_requires/roomEditor/entityClasses/Transformer.ts +++ b/src/node_requires/roomEditor/entityClasses/Transformer.ts @@ -8,8 +8,8 @@ import {getPixiSwatch} from '../../themes'; import {rotateCursor} from '../common'; import {rotateRad, pdc} from '../../utils/trigo'; -import {ease} from 'node_modules/pixi-ease'; -import * as PIXI from 'node_modules/pixi.js'; +import {ease} from 'pixi-ease'; +import * as PIXI from 'pixi.js'; const nullPoint = { x: 0, @@ -118,7 +118,7 @@ export class Transformer extends PIXI.Container { } this.visible = true; - let rect; + let rect: PIXI.Rectangle | undefined; for (const elt of this.editor.currentSelection) { const w = elt.width, h = elt.height, @@ -154,10 +154,10 @@ export class Transformer extends PIXI.Container { rotation: elt.rotation }); } - this.frameWidth = rect.width; - this.frameHeight = rect.height; - this.transformPivotX = rect.x + rect.width / 2; - this.transformPivotY = rect.y + rect.height / 2; + this.frameWidth = rect!.width; + this.frameHeight = rect!.height; + this.transformPivotX = rect!.x + rect!.width / 2; + this.transformPivotY = rect!.y + rect!.height / 2; if (!skipHistoryUpdate) { this.editor.history.initiateTransformChange(); } @@ -170,7 +170,7 @@ export class Transformer extends PIXI.Container { applyTransforms(): void { for (const elt of this.editor.currentSelection) { - const initial = this.initialTransforms.get(elt); + const initial = this.initialTransforms.get(elt)!; const delta = { x: ((initial.x + this.applyTranslateX) - this.transformPivotX) * this.applyScaleX, y: ((initial.y + this.applyTranslateY) - this.transformPivotY) * this.applyScaleY diff --git a/src/node_requires/roomEditor/entityClasses/ViewportFrame.ts b/src/node_requires/roomEditor/entityClasses/ViewportFrame.ts index d398cee55..e037cf1b4 100644 --- a/src/node_requires/roomEditor/entityClasses/ViewportFrame.ts +++ b/src/node_requires/roomEditor/entityClasses/ViewportFrame.ts @@ -1,7 +1,7 @@ import {getPixiSwatch} from '../../themes'; import {RoomEditor} from '..'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; export class ViewportFrame extends PIXI.Graphics { icon: PIXI.Graphics; diff --git a/src/node_requires/roomEditor/entityClasses/ViewportRestriction.ts b/src/node_requires/roomEditor/entityClasses/ViewportRestriction.ts index 724d34782..dd79c78bd 100644 --- a/src/node_requires/roomEditor/entityClasses/ViewportRestriction.ts +++ b/src/node_requires/roomEditor/entityClasses/ViewportRestriction.ts @@ -6,8 +6,8 @@ export class ViewportRestriction extends ViewportFrame { editor: RoomEditor; constructor(editor: RoomEditor) { super(editor); - this.x = this.editor.ctRoom.restrictMinX; - this.y = this.editor.ctRoom.restrictMinY; + this.x = this.editor.ctRoom.restrictMinX || 0; + this.y = this.editor.ctRoom.restrictMinY || 0; this.icon .lineStyle(2, getPixiSwatch('orange'), 1, 0.5); this.icon.drawRect(0, 10, 20, 14); @@ -28,17 +28,17 @@ export class ViewportRestriction extends ViewportFrame { return; } this.visible = true; - this.x = this.editor.ctRoom.restrictMinX; - this.y = this.editor.ctRoom.restrictMinY; - let width = this.editor.ctRoom.restrictMaxX - this.editor.ctRoom.restrictMinX, - height = this.editor.ctRoom.restrictMaxY - this.editor.ctRoom.restrictMinY; + this.x = this.editor.ctRoom.restrictMinX || 0; + this.y = this.editor.ctRoom.restrictMinY || 0; + let width = (this.editor.ctRoom.restrictMaxX || 0) - this.x, + height = (this.editor.ctRoom.restrictMaxY || 0) - this.y; if (width < 0) { width = Math.abs(width); - this.x = this.editor.ctRoom.restrictMaxX; + this.x = this.editor.ctRoom.restrictMaxX || 0; } if (height < 0) { height = Math.abs(height); - this.y = this.editor.ctRoom.restrictMaxY; + this.y = this.editor.ctRoom.restrictMaxY || 0; } this.icon.visible = (height / this.editor.camera.scale.x > 48); super.redrawFrame(width, height); diff --git a/src/node_requires/roomEditor/history.ts b/src/node_requires/roomEditor/history.ts index aa9d87a72..bb284dad7 100644 --- a/src/node_requires/roomEditor/history.ts +++ b/src/node_requires/roomEditor/history.ts @@ -1,6 +1,6 @@ /* eslint-disable complexity */ /* eslint-disable max-lines-per-function */ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {Copy} from './entityClasses/Copy'; import {Tile} from './entityClasses/Tile'; @@ -33,11 +33,11 @@ type transformation = { type deletion = { type: 'deletion', - deleted: Set<[Copy | Tile, TileLayer?]> + deleted: Set<[Copy] | [Tile, TileLayer]> }; type creation = { type: 'creation', - created: Set<[Copy | Tile, TileLayer?]> + created: Set<[Copy] | [Tile, TileLayer]> }; type tileLayerCreation = { @@ -62,6 +62,8 @@ type sortingChange = { type: 'sortingChange', beforeRoom: RoomEditor['room']['children']; afterRoom: RoomEditor['room']['children']; + beforeCopies: RoomEditor['copies']; + afterCopies: RoomEditor['copies']; beforeTileLayers: Map; afterTileLayers: Map; } @@ -151,7 +153,11 @@ export class History { case 'deletion': for (const deletion of change.deleted) { const [entity, parent] = deletion; - entity.restore(parent); + if (entity instanceof Tile) { + entity.restore(parent as TileLayer); + } else { + entity.restore(); + } } break; case 'creation': @@ -214,7 +220,7 @@ export class History { if (this.currentChange === this.stack[this.stack.length - 1]) { return false; } - const newChange = this.stack[this.stack.indexOf(this.currentChange) + 1]; + const newChange = this.stack[this.stack.indexOf(this.currentChange!) + 1]; // eslint-disable-next-line default-case switch (newChange.type) { case 'transformation': @@ -246,7 +252,11 @@ export class History { case 'creation': for (const creation of newChange.created) { const [entity, parent] = creation; - entity.restore(parent); + if (entity instanceof Tile) { + entity.restore(parent as TileLayer); + } else { + entity.restore(); + } } break; case 'tileLayerCreation': @@ -292,9 +302,13 @@ export class History { return true; } pushChange(change: change): void { - const id = this.stack.indexOf(this.currentChange); - this.stack = this.stack.slice(0, id + 1); - this.stack.push(change); + if (this.currentChange) { + const id = this.stack.indexOf(this.currentChange); + this.stack = this.stack.slice(0, id + 1); + this.stack.push(change); + } else { + this.stack.push(change); + } this.currentChange = change; if (this.stack.length > 30) { this.stack.shift(); @@ -318,7 +332,7 @@ export class History { this.pushChange(transform); } snapshotTransforms(): void { - if (this.currentChange.type !== 'transformation') { + if (!this.currentChange || this.currentChange.type !== 'transformation') { throw new Error('Cannot snapshot transforms as the current change\'s type is not "transformation"'); } for (const [entity, value] of this.currentChange.transformations) { @@ -331,11 +345,13 @@ export class History { const change = {} as ui['before']; if (target && target.text) { change.customTextSettings = { - ...target.customTextSettings, - anchor: { - ...target.customTextSettings.anchor - } + ...target.customTextSettings }; + if (change.customTextSettings.anchor) { + change.customTextSettings.anchor = { + ...change.customTextSettings.anchor + }; + } } return change; } @@ -355,17 +371,19 @@ export class History { if (!this.editor.currentUiSelection) { throw new Error('Cannot snapshot a ui change as the current selection is not set'); } - if (this.currentChange.type !== 'ui') { + if (!this.currentChange || this.currentChange.type !== 'ui') { throw new Error('Cannot snapshot transforms as the current change\'s type is not "ui"'); } this.currentChange.after = { customTextSettings: { - ...this.editor.currentUiSelection.customTextSettings, - anchor: { - ...this.editor.currentUiSelection.customTextSettings.anchor - } + ...this.editor.currentUiSelection.customTextSettings } }; + if (this.currentChange.after.customTextSettings?.anchor) { + this.currentChange.after.customTextSettings.anchor = { + ...this.currentChange.after.customTextSettings.anchor + }; + } } updateUiFor(change: propChange): void { const {target, key} = change, diff --git a/src/node_requires/roomEditor/index.ts b/src/node_requires/roomEditor/index.ts index 12c352df9..a8504a768 100644 --- a/src/node_requires/roomEditor/index.ts +++ b/src/node_requires/roomEditor/index.ts @@ -20,12 +20,12 @@ import {IRoomEditorInteraction, PixiListener, pixiListeners, interactions, custo import {getById} from '../resources'; import {getPixiSwatch} from './../themes'; import {defaultTextStyle, recolorFilters, eraseCursor, toPrecision, snapToDiagonalGrid, snapToRectangularGrid} from './common'; -import {ease, Easing} from 'node_modules/pixi-ease'; +import {ease, Easing} from 'pixi-ease'; import {rotateRad} from '../utils/trigo'; -import * as PIXI from 'node_modules/pixi.js'; -// import 'node_modules/@pixi/events'; +import * as PIXI from 'pixi.js'; +// import '@pixi/events'; class Cursor { x: number; @@ -120,10 +120,10 @@ class RoomEditor extends PIXI.Application { */ interacting = false; interactions: IRoomEditorInteraction[]; - currentInteraction: IRoomEditorInteraction; + currentInteraction: IRoomEditorInteraction | undefined; affixedInteractionData: unknown; - copies = new Set(); + copies: Copy[] = []; tiles = new Set(); backgrounds: Background[] = []; viewports = new Set(); @@ -206,12 +206,12 @@ class RoomEditor extends PIXI.Application { this.drawSelection([this.currentUiSelection]); } if (['addCopies', 'addTiles'].includes(this.riotEditor.currentTool)) { - if (this.riotEditor.controlMode && ['default', 'inherit'].includes(this.view.style.cursor)) { - this.view.style.cursor = eraseCursor; + if (this.riotEditor.controlMode && ['default', 'inherit'].includes(this.view.style!.cursor as string)) { + this.view.style!.cursor = eraseCursor; this.snapTarget.visible = false; } - if (!this.riotEditor.controlMode && this.view.style.cursor.includes('Erase')) { - this.view.style.cursor = 'default'; + if (!this.riotEditor.controlMode && (this.view.style!.cursor as string).includes('Erase')) { + this.view.style!.cursor = 'default'; this.snapTarget.visible = true; } } @@ -273,7 +273,7 @@ class RoomEditor extends PIXI.Application { for (const interaction of this.interactions) { if (this.interacting && this.currentInteraction === interaction) { if (listener in this.currentInteraction.listeners) { - this.currentInteraction.listeners[listener].apply( + this.currentInteraction.listeners[listener]!.apply( this, [event, this.riotEditor, this.affixedInteractionData, callback] ); @@ -290,7 +290,7 @@ class RoomEditor extends PIXI.Application { recreate(): void { this.serialize(false); this.room.removeChildren(); - this.copies.clear(); + this.copies.length = 0; this.tiles.clear(); this.backgrounds.length = 0; this.currentSelection.clear(); @@ -474,11 +474,11 @@ class RoomEditor extends PIXI.Application { if (this.riotEditor.currentTool !== 'select') { return; } - const changes = new Set<[Copy | Tile, TileLayer?]>(); + const changes = new Set<[Copy] | [Tile, TileLayer]>(); for (const stuff of this.currentSelection) { if (stuff instanceof Tile) { const {parent} = stuff; - changes.add([stuff.detach(), parent]); + changes.add([stuff.detach(), parent as TileLayer]); } else if (stuff instanceof Copy) { changes.add([stuff.detach()]); } @@ -488,7 +488,9 @@ class RoomEditor extends PIXI.Application { deleted: changes }); this.transformer.clear(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } } copySelection(): void { if (this.riotEditor.currentTool !== 'select' || !this.currentSelection.size) { @@ -505,14 +507,14 @@ class RoomEditor extends PIXI.Application { this.clipboard.add([ 'tile', stuff.serialize(), - stuff.parent + stuff.parent as TileLayer ]); } } this.transformer.blink(); } pasteSelection(): void { - const createdSet = new Set<[Copy | Tile, TileLayer?]>(); + const createdSet = new Set<[Copy] | [Tile, TileLayer]>(); if (this.riotEditor.currentTool === 'select' && this.currentSelection.size && this.history.currentChange?.type === 'transformation' @@ -588,24 +590,29 @@ class RoomEditor extends PIXI.Application { this.transformer.applyTranslateY += dy; this.transformer.applyTransforms(); this.transformer.setup(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.transformer.blink(); } sort(method: 'x' | 'y' | 'toFront' | 'toBack'): void { - const beforeRoom = this.room.children.slice(); + const beforeCopies = this.copies.slice(); const beforeTileLayers = new Map(); + const beforeRoom = this.room.children.slice(); for (const tileLayer of this.tileLayers) { beforeTileLayers.set(tileLayer, tileLayer.children.slice()); } if (method === 'x' || method === 'y') { - this.room.children.sort((a, b) => { + const sorter = (a: Copy | TileLayer | Background, b: Copy | TileLayer | Background) => { if (!this.currentSelection.size || (this.currentSelection.has(a as Copy) && this.currentSelection.has(b as Copy)) ) { return (a.zIndex - b.zIndex) || (a[method] - b[method]); } return 0; - }); + }; + this.room.children.sort(sorter); + this.copies.sort(sorter); for (const tileLayer of this.tileLayers) { tileLayer.children.sort((a, b) => { if (!this.currentSelection.size || @@ -618,7 +625,7 @@ class RoomEditor extends PIXI.Application { }); } } else { - this.room.children.sort((a, b) => { + const sorter = (a: Copy | TileLayer | Background, b: Copy | TileLayer | Background) => { if (this.currentSelection.has(a as Copy)) { if (this.currentSelection.has(b as Copy)) { return 0; @@ -629,7 +636,9 @@ class RoomEditor extends PIXI.Application { return (a.zIndex - b.zIndex) || (method === 'toFront' ? -1 : 1); } return a.zIndex - b.zIndex; - }); + }; + this.copies.sort(sorter); + this.room.children.sort(sorter); for (const tileLayer of this.tileLayers) { tileLayer.children.sort((a, b) => { if (this.currentSelection.has(a as Tile)) { @@ -645,17 +654,20 @@ class RoomEditor extends PIXI.Application { }); } } - const afterRoom = this.room.children.slice(); + const afterCopies = this.copies.slice(); const afterTileLayers = new Map(); + const afterRoom = this.room.children.slice(); for (const tileLayer of this.tileLayers) { afterTileLayers.set(tileLayer, tileLayer.children.slice()); } this.history.pushChange({ type: 'sortingChange', - beforeRoom, - afterRoom, + beforeCopies, + afterCopies, beforeTileLayers, - afterTileLayers + afterTileLayers, + beforeRoom, + afterRoom }); this.transformer.setup(); } diff --git a/src/node_requires/roomEditor/interactions/camera/move.ts b/src/node_requires/roomEditor/interactions/camera/move.ts index 7390cd00d..c06a7b60a 100644 --- a/src/node_requires/roomEditor/interactions/camera/move.ts +++ b/src/node_requires/roomEditor/interactions/camera/move.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '..'; diff --git a/src/node_requires/roomEditor/interactions/camera/zoom.ts b/src/node_requires/roomEditor/interactions/camera/zoom.ts index 47b503696..4135857c5 100644 --- a/src/node_requires/roomEditor/interactions/camera/zoom.ts +++ b/src/node_requires/roomEditor/interactions/camera/zoom.ts @@ -1,7 +1,7 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '../..'; -import {ease, Easing} from 'node_modules/pixi-ease'; +import {ease, Easing} from 'pixi-ease'; interface IZoomData { ease: Easing diff --git a/src/node_requires/roomEditor/interactions/copies/deleteCopies.ts b/src/node_requires/roomEditor/interactions/copies/deleteCopies.ts index 14826dc7e..25810283c 100644 --- a/src/node_requires/roomEditor/interactions/copies/deleteCopies.ts +++ b/src/node_requires/roomEditor/interactions/copies/deleteCopies.ts @@ -1,7 +1,7 @@ import {IRoomEditorInteraction} from '../..'; import {Copy} from '../../entityClasses/Copy'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; type affixedData = { deleted: Set<[Copy]>; diff --git a/src/node_requires/roomEditor/interactions/copies/placeCopy.ts b/src/node_requires/roomEditor/interactions/copies/placeCopy.ts index c52531a15..a1ca81f5d 100644 --- a/src/node_requires/roomEditor/interactions/copies/placeCopy.ts +++ b/src/node_requires/roomEditor/interactions/copies/placeCopy.ts @@ -5,7 +5,7 @@ import {calcPlacement} from '../placementCalculator'; import {soundbox} from '../../../3rdparty/soundbox'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; interface IAffixedData { mode: 'free' | 'straight'; diff --git a/src/node_requires/roomEditor/interactions/index.ts b/src/node_requires/roomEditor/interactions/index.ts index fa48f28cf..edc4378a7 100644 --- a/src/node_requires/roomEditor/interactions/index.ts +++ b/src/node_requires/roomEditor/interactions/index.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {RoomEditor} from '..'; import {IRoomEditorRiotTag} from '../IRoomEditorRiotTag'; diff --git a/src/node_requires/roomEditor/interactions/mousePosTracker.ts b/src/node_requires/roomEditor/interactions/mousePosTracker.ts index 39e3788ab..d2b20ac40 100644 --- a/src/node_requires/roomEditor/interactions/mousePosTracker.ts +++ b/src/node_requires/roomEditor/interactions/mousePosTracker.ts @@ -1,6 +1,6 @@ import {IRoomEditorInteraction} from '..'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; const updateMousePosition: IRoomEditorInteraction = { ifListener: 'pointermove', diff --git a/src/node_requires/roomEditor/interactions/placementCalculator.ts b/src/node_requires/roomEditor/interactions/placementCalculator.ts index e4ca5f780..e1fa07315 100644 --- a/src/node_requires/roomEditor/interactions/placementCalculator.ts +++ b/src/node_requires/roomEditor/interactions/placementCalculator.ts @@ -12,7 +12,7 @@ when a new object should be placed. import {fromRectangular, fromDiagonal, toRectangular, toDiagonal} from '../common'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; type PlacementData = { mode: 'free' | 'straight'; diff --git a/src/node_requires/roomEditor/interactions/selectUi.ts b/src/node_requires/roomEditor/interactions/selectUi.ts index 2841b237c..8fdff3c91 100644 --- a/src/node_requires/roomEditor/interactions/selectUi.ts +++ b/src/node_requires/roomEditor/interactions/selectUi.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '..'; import {Copy} from '../entityClasses/Copy'; @@ -21,7 +21,9 @@ const selectUi: IRoomEditorInteraction = { this.clearSelectionOverlay(); this.currentUiSelection = void 0; } - this.riotEditor.refs.uiTools.update(); + if (this.riotEditor.refs.uiTools) { + this.riotEditor.refs.uiTools.update(); + } callback(); } } diff --git a/src/node_requires/roomEditor/interactions/tab.ts b/src/node_requires/roomEditor/interactions/tab.ts index be6a1b515..211f676b0 100644 --- a/src/node_requires/roomEditor/interactions/tab.ts +++ b/src/node_requires/roomEditor/interactions/tab.ts @@ -8,8 +8,10 @@ export const tab: IRoomEditorInteraction = { listeners: { tab(e: KeyboardEvent, roomTag, affixedData, callback) { if (this.copiesVisible) { - // Apply any possible property changes to the previous selectio set - this.riotEditor.refs.propertiesPanel.applyChanges(); + // Apply any possible property changes to the previous selectio set + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.applyChanges(); + } const copies = Array.from(this.copies.values()) .sort((a, b) => (a.y - b.y) || (a.x - b.x)); @@ -27,7 +29,9 @@ export const tab: IRoomEditorInteraction = { this.currentSelection.add(copies[0]); } this.transformer.setup(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } } callback(); } diff --git a/src/node_requires/roomEditor/interactions/tiles/deleteTiles.ts b/src/node_requires/roomEditor/interactions/tiles/deleteTiles.ts index 5659d91e5..7dbecf491 100644 --- a/src/node_requires/roomEditor/interactions/tiles/deleteTiles.ts +++ b/src/node_requires/roomEditor/interactions/tiles/deleteTiles.ts @@ -2,7 +2,7 @@ import {IRoomEditorInteraction} from '../..'; import {Tile} from '../../entityClasses/Tile'; import {TileLayer} from '../../entityClasses/TileLayer'; -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; type affixedData = { deleted: Set<[Tile, TileLayer]>; @@ -21,14 +21,14 @@ export const deleteTiles: IRoomEditorInteraction = { affixedData.deleted = new Set(); if (e.target instanceof Tile && e.target.parent === riotTag.currentTileLayer) { const {parent} = e.target; - affixedData.deleted.add([e.target.detach(), parent]); + affixedData.deleted.add([e.target.detach(), parent as TileLayer]); } }, pointermove(e: PIXI.FederatedPointerEvent, riotTag, affixedData) { this.cursor.update(e); if (e.target instanceof Tile && e.target.parent === riotTag.currentTileLayer) { const {parent} = e.target; - affixedData.deleted.add([e.target.detach(), parent]); + affixedData.deleted.add([e.target.detach(), parent as TileLayer]); } }, pointerup(e: PIXI.FederatedPointerEvent, roomTag, affixedData, callback) { diff --git a/src/node_requires/roomEditor/interactions/tiles/placeTile.ts b/src/node_requires/roomEditor/interactions/tiles/placeTile.ts index 24bbb940c..7d71bf196 100644 --- a/src/node_requires/roomEditor/interactions/tiles/placeTile.ts +++ b/src/node_requires/roomEditor/interactions/tiles/placeTile.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {Tile} from '../../entityClasses/Tile'; import {TileLayer} from '../../entityClasses/TileLayer'; @@ -119,7 +119,7 @@ export const placeTile: IRoomEditorInteraction = { ); riotTag.currentTileLayer.addChild(...newTiles); for (const tile of newTiles) { - affixedData.created.add([tile, tile.parent]); + affixedData.created.add([tile, tile.parent as TileLayer]); } soundbox.play('Wood_Start'); }, @@ -139,7 +139,7 @@ export const placeTile: IRoomEditorInteraction = { ); riotTag.currentTileLayer.addChild(...newTiles); for (const tile of newTiles) { - affixedData.created.add([tile, tile.parent]); + affixedData.created.add([tile, tile.parent as TileLayer]); } }) ); @@ -180,7 +180,7 @@ export const placeTile: IRoomEditorInteraction = { ); riotTag.currentTileLayer.addChild(...newTiles); for (const tile of newTiles) { - affixedData.created.add([tile, tile.parent]); + affixedData.created.add([tile, tile.parent as TileLayer]); } } } diff --git a/src/node_requires/roomEditor/interactions/transformer/move.ts b/src/node_requires/roomEditor/interactions/transformer/move.ts index 14e5d9089..84c18bba8 100644 --- a/src/node_requires/roomEditor/interactions/transformer/move.ts +++ b/src/node_requires/roomEditor/interactions/transformer/move.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '../..'; import {snapToRectangularGrid, snapToDiagonalGrid} from '../../common'; @@ -50,11 +50,15 @@ export const moveSelection: IRoomEditorInteraction = { this.transformer.transformPivotX = affixed.startingPivotX + delta.x; this.transformer.transformPivotY = affixed.startingPivotY + delta.y; this.transformer.applyTransforms(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } }, pointerup(e: PIXI.FederatedPointerEvent, roomTag, affixedData, callback) { this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } diff --git a/src/node_requires/roomEditor/interactions/transformer/nudge.ts b/src/node_requires/roomEditor/interactions/transformer/nudge.ts index d01fa181f..9da4bdf40 100644 --- a/src/node_requires/roomEditor/interactions/transformer/nudge.ts +++ b/src/node_requires/roomEditor/interactions/transformer/nudge.ts @@ -12,7 +12,9 @@ export const nudgeDown: IRoomEditorInteraction = { this.transformer.transformPivotY += delta; this.transformer.applyTransforms(); this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } @@ -31,7 +33,9 @@ export const nudgeUp: IRoomEditorInteraction = { this.transformer.transformPivotY -= delta; this.transformer.applyTransforms(); this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } @@ -50,7 +54,9 @@ export const nudgeLeft: IRoomEditorInteraction = { this.transformer.transformPivotX -= delta; this.transformer.applyTransforms(); this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } @@ -69,7 +75,9 @@ export const nudgeRight: IRoomEditorInteraction = { this.transformer.transformPivotX += delta; this.transformer.applyTransforms(); this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } diff --git a/src/node_requires/roomEditor/interactions/transformer/rotate.ts b/src/node_requires/roomEditor/interactions/transformer/rotate.ts index 1cf01b770..b4bd04065 100644 --- a/src/node_requires/roomEditor/interactions/transformer/rotate.ts +++ b/src/node_requires/roomEditor/interactions/transformer/rotate.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '../..'; @@ -39,11 +39,15 @@ export const rotateSelection: IRoomEditorInteraction = { } this.transformer.applyRotation = rad; this.transformer.applyTransforms(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } }, pointerup(e: PIXI.FederatedPointerEvent, roomTag, affixedData, callback) { this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } diff --git a/src/node_requires/roomEditor/interactions/transformer/scale.ts b/src/node_requires/roomEditor/interactions/transformer/scale.ts index d03aed7f0..3fbcff48a 100644 --- a/src/node_requires/roomEditor/interactions/transformer/scale.ts +++ b/src/node_requires/roomEditor/interactions/transformer/scale.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '../..'; import {Handle} from '../../entityClasses/Transformer'; @@ -48,7 +48,7 @@ export const scaleSelection: IRoomEditorInteraction = { affixedData.axes = 'y'; } }, - // eslint-disable-next-line max-lines-per-function + // eslint-disable-next-line max-lines-per-function, complexity globalpointermove(e: PIXI.FederatedPointerEvent, riotTag, affixedData) { this.cursor.update(e); const {transformer} = this; @@ -148,11 +148,15 @@ export const scaleSelection: IRoomEditorInteraction = { } transformer.applyTransforms(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } }, pointerup(e, roomTag, affixedData, callback) { this.dropPrecision(); - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } this.history.snapshotTransforms(); callback(); } diff --git a/src/node_requires/roomEditor/interactions/transformer/select.ts b/src/node_requires/roomEditor/interactions/transformer/select.ts index 901e1e5f5..6960f96bd 100644 --- a/src/node_requires/roomEditor/interactions/transformer/select.ts +++ b/src/node_requires/roomEditor/interactions/transformer/select.ts @@ -1,8 +1,9 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {IRoomEditorInteraction} from '../..'; import {Copy} from '../../entityClasses/Copy'; import {Tile} from '../../entityClasses/Tile'; +import {TileLayer} from '../../entityClasses/TileLayer'; interface IAffixedData { startRoomPos: PIXI.IPoint; @@ -94,9 +95,12 @@ const select: IRoomEditorInteraction = { roomPos.y - affixedData.startRoomPos.y ); }, + // eslint-disable-next-line complexity pointerup(e: PIXI.FederatedPointerEvent, riotTag, affixedData, callback) { // Apply any possible property changes to the previous selectio set - this.riotEditor.refs.propertiesPanel.applyChanges(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.applyChanges(); + } const selectMap: [boolean, Iterable][] = [ [this.selectCopies, this.copies], @@ -112,13 +116,13 @@ const select: IRoomEditorInteraction = { currentSelection; // Pick a suitable entity under the cursor (try both from pointerdown and pointerup) if ((s instanceof Copy && this.selectCopies) || - (s instanceof Tile && this.selectTiles && !s.parent.isHidden) + (s instanceof Tile && this.selectTiles && !(s.parent as TileLayer).isHidden) ) { currentSelection = s; } else { s = e.target as PIXI.DisplayObject; if ((s instanceof Copy && this.selectCopies) || - (s instanceof Tile && this.selectTiles && !s.parent.isHidden) + (s instanceof Tile && this.selectTiles && !(s.parent as TileLayer).isHidden) ) { currentSelection = s; } @@ -143,7 +147,7 @@ const select: IRoomEditorInteraction = { for (const selectType of selectMap) { if (selectType[0]) { for (const object of selectType[1]) { - if (object instanceof Tile && object.parent.isHidden) { + if (object instanceof Tile && (object.parent as TileLayer).isHidden) { continue; } const {x, y} = getCenter(object, this.room); @@ -157,7 +161,9 @@ const select: IRoomEditorInteraction = { } this.transformer.setup(); this.marqueeBox.visible = false; - this.riotEditor.refs.propertiesPanel.updatePropList(); + if (this.riotEditor.refs.propertiesPanel) { + this.riotEditor.refs.propertiesPanel.updatePropList(); + } callback(); } } diff --git a/src/node_requires/roomEditor/previewer.ts b/src/node_requires/roomEditor/previewer.ts index 0b94e9e6f..44acbd362 100644 --- a/src/node_requires/roomEditor/previewer.ts +++ b/src/node_requires/roomEditor/previewer.ts @@ -1,4 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; +import * as PIXI from 'pixi.js'; import {Copy} from './entityClasses/Copy'; import {Tile} from './entityClasses/Tile'; @@ -30,7 +30,7 @@ export class RoomEditorPreview extends PIXI.Application { camera = new PIXI.Container(); room = new PIXI.Container(); - copies = new Set(); + copies: Copy[] = []; tiles = new Set(); backgrounds: Background[] = []; viewports = new Set(); diff --git a/src/node_requires/styleUtils.ts b/src/node_requires/styleUtils.ts index 19147c90f..a2ac7a829 100644 --- a/src/node_requires/styleUtils.ts +++ b/src/node_requires/styleUtils.ts @@ -1,6 +1,8 @@ import {ExportedStyle} from './exporter/_exporterContracts'; +import {getById} from './resources'; +import {getFontDomName} from './resources/typefaces'; -export const styleToTextStyle = (s: IStyle): ExportedStyle => { +export const styleToTextStyle = (s: IStyle, forIde?: boolean): ExportedStyle => { const o = { fontFamily: s.font.family, fontSize: s.font.size, @@ -10,6 +12,21 @@ export const styleToTextStyle = (s: IStyle): ExportedStyle => { lineJoin: 'round', lineHeight: s.font.lineHeight || s.font.size * 1.35 } as ExportedStyle; + if (s.typeface !== -1) { + const typeface = getById('typeface', s.typeface); + if (forIde) { + const font = typeface.fonts.find(f => + f.weight === s.font.weight && + f.italic === s.font.italic); + if (font) { + o.fontFamily = getFontDomName(font); + } + } else if (o.fontFamily.trim()) { + o.fontFamily = typeface.name + ', ' + o.fontFamily; + } else { + o.fontFamily = typeface.name; + } + } if (s.font.wrap) { o.wordWrap = true; o.wordWrapWidth = s.font.wrapPosition || 100; diff --git a/src/node_requires/themes/index.ts b/src/node_requires/themes/index.ts index e12a9b065..58715966b 100644 --- a/src/node_requires/themes/index.ts +++ b/src/node_requires/themes/index.ts @@ -1,6 +1,4 @@ -import * as PIXI from 'node_modules/pixi.js'; - -import {join} from 'path'; +import * as PIXI from 'pixi.js'; import {getLanguageJSON} from '../i18n'; const defaultTheme = 'Day'; @@ -8,13 +6,17 @@ const defaultMonacoTheme = defaultTheme; /** * The list of the built-in themes coupled with the list of accent colors * shown in the theme list. + * Theme name — background color — accent colors */ const builtInThemes: [string, string[]][] = [ ['Day', ['#ffffff', '#5144db', '#446adb']], ['SpringStream', ['#ffffff', '#00c09e']], ['Ghost', ['#fff1eb', '#70579c']], + ['AlmaSakura', ['#372D2D', '#C4B0B3', '#DB5A6B']], ['Forest', ['#3c474d', '#a7c080']], + ['GoldenEye', ['#144000', '#ffd700']], ['Nord', ['#3B4252', '#88C0D0']], + ['OneDarkPro', ['#282C34', '#D7DAE0']], ['Horizon', ['#1C1E26', '#E95378']], ['PooxelGreen', ['#292929', '#00d059']], ['PooxelBlue', ['#292932', '#5db9ff']], @@ -22,6 +24,7 @@ const builtInThemes: [string, string[]][] = [ ['RosePineMoon', ['#2a273f', '#c4a7e7', '#ea9a97']], ['RosePine', ['#1f1d2e', '#c4a7e7', '#ebbcba']], ['LucasDracula', ['#161427', '#FFCFD4', '#FF70B1']], + ['Synthwave', ['#241B2F', '#FEDE5D', '#36F9F6', '#FF7EDB']], ['Night', ['#0c0d17', '#44dbb5']], ['HCBlack', ['#080808', '#ffff00', '#00ffff']] ]; @@ -75,12 +78,12 @@ const mod = { } let monacoTheme; try { - monacoTheme = require(join('./data/node_requires/monaco-themes', `${name}.json`)); + monacoTheme = require(`../monaco-themes/${name}.json`); window.monaco.editor.defineTheme(name, monacoTheme); } catch (e) { // eslint-disable-next-line no-console console.warn('Could not load a monaco theme due to an error:', e, '\nFalling back to the default theme.'); - monacoTheme = require(join('./data/node_requires/monaco-themes', `${defaultMonacoTheme}.json`)); + monacoTheme = require(`../monaco-themes/${defaultMonacoTheme}.json`); window.monaco.editor.defineTheme(name, monacoTheme); } const css = `./data/theme${name}.css`; diff --git a/src/node_requires/typescriptTokenizer.js b/src/node_requires/typescriptTokenizer.js index 82193e922..49f7a5855 100644 --- a/src/node_requires/typescriptTokenizer.js +++ b/src/node_requires/typescriptTokenizer.js @@ -11,8 +11,7 @@ 'use strict'; -// Allow for running under nodejs/requirejs in tests -const _monaco = global.monaco; +const _monaco = window.monaco; module.exports.conf = { wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, diff --git a/src/node_requires/utils/imageUtils.ts b/src/node_requires/utils/imageUtils.ts index 5d594d31f..6d49767b5 100644 --- a/src/node_requires/utils/imageUtils.ts +++ b/src/node_requires/utils/imageUtils.ts @@ -12,7 +12,7 @@ const imageCover = function ( const canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - const cx = canvas.getContext('2d'); + const cx = canvas.getContext('2d') as CanvasRenderingContext2D; cx.clearRect(0, 0, w, h); const k = Math.max(w / image.width, h / image.height); if (!forceSmooth && window.currentProject.settings.rendering.pixelatedrender) { @@ -41,7 +41,7 @@ const imageContain = function ( const canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - const cx = canvas.getContext('2d'); + const cx = canvas.getContext('2d') as CanvasRenderingContext2D; cx.clearRect(0, 0, w, h); let k; if (w / image.width < h / image.height) { @@ -78,7 +78,7 @@ const imagePlaceInRect = function ( const canvas = document.createElement('canvas'); canvas.width = wb; canvas.height = hb; - const cx = canvas.getContext('2d'); + const cx = canvas.getContext('2d') as CanvasRenderingContext2D; cx.clearRect(0, 0, wb, hb); let k; if (wi / image.width < hi / image.height) { @@ -104,7 +104,7 @@ const imageRound = function (image: GenericImage): HTMLCanvasElement { const canvas = document.createElement('canvas'); const w = canvas.width = image.width; const h = canvas.height = image.height; - const cx = canvas.getContext('2d'); + const cx = canvas.getContext('2d') as CanvasRenderingContext2D; cx.clearRect(0, 0, w, h); cx.ellipse(w / 2, h / 2, w / 2, h / 2, 0, 0, Math.PI * 2); cx.fill(); @@ -119,7 +119,7 @@ const toCanvas = function (image: GenericImage): HTMLCanvasElement { const canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; - const cx = canvas.getContext('2d'); + const cx = canvas.getContext('2d') as CanvasRenderingContext2D; cx.clearRect(0, 0, canvas.width, canvas.height); cx.drawImage(image, 0, 0); return canvas; @@ -137,7 +137,7 @@ const crop = function ( const canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - const cx = canvas.getContext('2d'); + const cx = canvas.getContext('2d') as CanvasRenderingContext2D; cx.clearRect(0, 0, w, h); cx.drawImage( image, diff --git a/src/projectTemplates/Platformer.ict b/src/projectTemplates/Platformer.ict index 885741e50..9a39a9225 100644 --- a/src/projectTemplates/Platformer.ict +++ b/src/projectTemplates/Platformer.ict @@ -1,4 +1,4 @@ -ctjsVersion: 4.0.0-next-4 +ctjsVersion: 5.0.0 notes: /* empty */ libs: place: @@ -84,6 +84,9 @@ settings: sound: false style: false tandem: false + typefaces: ! '' + showErrors: true + errorsLink: '' branding: icon: -1 accent: '#446adb' @@ -1689,6 +1692,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - type: room oncreate: '' onstep: '' @@ -4433,6 +4437,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - type: room oncreate: '' onstep: '' @@ -9190,6 +9195,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - type: room oncreate: '' onstep: '' @@ -9590,6 +9596,7 @@ assets: isUi: false follow: -1 behaviors: [] + extendTypes: '' - type: folder uid: g2G7BpwbcRQMnd colorClass: success @@ -9807,6 +9814,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Character untill: 0 grid: @@ -9863,6 +9871,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: Checkpoint depth: 0 @@ -9884,6 +9893,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: Enemy depth: 0 @@ -9939,6 +9949,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: Finish depth: -5 @@ -9976,6 +9987,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: IceBlock depth: 0 @@ -9998,6 +10010,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: Key depth: 0 @@ -10029,6 +10042,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: Lava depth: 5 @@ -10051,6 +10065,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: LockedBlock depth: 0 @@ -10073,6 +10088,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: OneWayPlatform depth: 0 @@ -10112,6 +10128,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - type: template name: SpringBlock depth: 0 @@ -10138,6 +10155,7 @@ assets: right: 16 bottom: 16 style: -1 + extendTypes: '' - name: Block untill: 0 grid: @@ -10414,3 +10432,4 @@ assets: group: ! '' lastmod: 1644653609234 type: texture +globalVars: [] diff --git a/src/pug/includes/head.pug b/src/pug/includes/head.pug index b1159ae92..09c66aad8 100644 --- a/src/pug/includes/head.pug +++ b/src/pug/includes/head.pug @@ -20,6 +20,7 @@ head font-size: 4vw; font-weight: 300; } + link(href='./data/bundle.css' rel='stylesheet') link(href='./data/themeDay.css' id="themeCSS" rel='stylesheet') script(type="text/javascript"). localStorage.UItheme = localStorage.UItheme || 'Day'; diff --git a/src/pug/index.pug b/src/pug/index.pug index 156c681ad..eb80a1cf3 100644 --- a/src/pug/index.pug +++ b/src/pug/index.pug @@ -34,61 +34,10 @@ html window.__dirname = global.__dirname; } script(src="data/bundle.js") - script(src="data/riotTags.js") - script. - // @see https://github.com/microsoft/monaco-editor-samples/blob/master/nwjs-amd-v2/index.html - (function loadMonaco() { - var eRequire = require('monaco-editor/min/vs/loader.js'); - // __dirname == root path of you application - eRequire.config({ - baseUrl: 'file:///' + global.__dirname.replace(/\\/g, '\\\\') + '/node_modules/monaco-editor/min/' - }); - // workaround monaco-css not understanding the environment - self.module = void 0; - // workaround monaco-typescript not understanding the environment - self.process.browser = true; - eRequire(['vs/editor/editor.main'], function onMonacoLoad() { - window.monaco = global.monaco; - - const themeManager = require('./data/node_requires/themes'); - themeManager.loadBuiltInThemes(); - // To rollback to a default theme if the set one is inaccessible ⤵ - themeManager.loadTheme(); - - // Extended typescript tokenizer - const typescript = require('./data/node_requires/typescriptTokenizer.js').language; - // Extended coffeescript tokenizer & suggestions provider - const coffeescript = require('./data/node_requires/coffeescriptTokenizer.js').language; - const coffeescriptSuggestions = require('./data/node_requires/coffeescriptSuggestionProvider.js'); - // I have no guilt of this solution - // @see https://github.com/microsoft/monaco-editor/issues/884 - monaco.editor.create(document.createElement('textarea'), { - language: 'typescript', - value: '(:' - }); - monaco.editor.create(document.createElement('textarea'), { - language: 'coffeescript', - value: ':)' - }); - setTimeout(() => { - monaco.languages.setMonarchTokensProvider('typescript', typescript); - monaco.languages.setMonarchTokensProvider('coffeescript', coffeescript); - monaco.languages.registerCompletionItemProvider('coffeescript', coffeescriptSuggestions.atCompletions); - }, 1000); - - window.signals = window.signals || riot.observable({}); - window.orders = window.orders || riot.observable({}); - window.signals.trigger('monacoBooted'); - }); - })(); script. 'use strict'; window.signals = window.signals || riot.observable({}); - window.hotkeys = require('./data/node_requires/hotkeys')(document); - window.PIXI = require('pixi.js'); - window.PIXI.sound = require('@pixi/sound').sound; - window.PIXI.sound.filters = require('@pixi/sound').filters; - window.PIXI.particles = require('@pixi/particle-emitter'); + window.orders = window.orders || riot.observable({}); // ⚠️⚠️⚠️ BAND-AIDS START // @see https://github.com/pixijs/particle-emitter/issues/209 diff --git a/src/riotTags/app-view.tag b/src/riotTags/app-view.tag index 3b75de847..0f8fa1e99 100644 --- a/src/riotTags/app-view.tag +++ b/src/riotTags/app-view.tag @@ -1,5 +1,5 @@ app-view.flexcol - nav.nogrow.flexrow(if="{global.currentProject}" ref="mainNav") + nav.nogrow.flexrow(if="{window.currentProject}" ref="mainNav") ul.aNav.tabs.nogrow li.limitwidth(onclick="{changeTab('menu')}" title="{voc.ctIDE}" class="{active: tab === 'menu'}" ref="mainMenuButton") svg.feather.nmr @@ -40,7 +40,7 @@ app-view.flexcol ) svg.feather use(xlink:href="#{iconMap[asset.type]}") - span {getName(asset)} + span {asset.name} .app-view-anUnsavedIcon(if="{tabsDirty[ind]}" onclick="{closeAsset}") svg.feather.anActionableIcon.warning use(xlink:href="#circle") @@ -48,9 +48,10 @@ app-view.flexcol use(xlink:href="#x") svg.feather.anActionableIcon(if="{!tabsDirty[ind]}" onclick="{closeAsset}") use(xlink:href="#x") - div.flexitem.relative(if="{global.currentProject}") + div.flexitem.relative(if="{window.currentProject}") main-menu(show="{tab === 'menu'}" ref="mainMenu") - debugger-screen-embedded(if="{tab === 'debug'}" params="{debugParams}" data-hotkey-scope="play" ref="debugger") + debugger-screen-multiwindow(if="{tab === 'debug' && !splitDebugger}" params="{debugParams}" data-hotkey-scope="play" ref="debugger") + debugger-screen-split(if="{tab === 'debug' && splitDebugger}" params="{debugParams}" data-hotkey-scope="play" ref="debugger") project-settings(show="{tab === 'project'}" data-hotkey-scope="project" ref="projectsSettings") patrons-screen(if="{tab === 'patrons'}" ref="patrons" data-hotkey-scope="patrons") asset-browser.pad.aView#theAssetBrowser( @@ -76,10 +77,11 @@ app-view.flexcol asset="{asset}" ondone="{closeAssetRequest}" ref="openedEditors" + isactiveeditor="{asset === tab}" ) exporter-error(if="{exporterError}" error="{exporterError}" onclose="{closeExportError}") new-project-onboarding(if="{sessionStorage.showOnboarding && localStorage.showOnboarding !== 'off'}") - notepad-panel(ref="notepadPanel") + notepad-panel(ref="notepadPanel" show="{tab !== 'debug'}") asset-confirm( discard="{assetDiscard}" cancel="{assetCancel}" @@ -87,7 +89,7 @@ app-view.flexcol asset="{confirmationAsset}" if="{showAssetConfirmation}" ) - dnd-processor(if="{global.currentProject}" currentfolder="{refs.assets.currentFolder}") + dnd-processor(if="{window.currentProject}" currentfolder="{refs.assets.currentFolder}") .aDimmer.fixed.pad(if="{showPrelaunchSave}") button.aDimmer-aCloseButton(onclick="{cancelLaunch}") svg.feather @@ -102,7 +104,7 @@ app-view.flexcol li(each="{asset, ind in openedAssets}" if="{tabsDirty[ind]}") svg.feather use(xlink:href="#{iconMap[asset.type]}") - span {getName(asset)} + span {asset.name} .inset.flexrow.flexfix-footer button.nogrow(onclick="{cancelLaunch}") svg.feather @@ -122,7 +124,7 @@ app-view.flexcol const fs = require('fs-extra'); this.namespace = 'appView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.tab = 'assets'; // A tab can be either a string ('project', 'assets', etc.) or an asset object this.openedAssets = []; @@ -181,9 +183,8 @@ app-view.flexcol window.signals.off('assetRemoved', checkDeletedTabs); }); - const resources = require('./data/node_requires/resources'); + const resources = require('src/node_requires/resources'); this.editorMap = resources.editorMap; - this.getName = resources.getName; this.iconMap = resources.resourceToIconMap; this.openAsset = (asset, noOpen) => () => { // Check whether the asset is not yet opened @@ -243,13 +244,19 @@ app-view.flexcol } this.update(); }; + const actionsOpener = () => { + this.changeTab('project')(); + this.update(); + this.refs.projectsSettings.openTab('actions')(); + this.refs.projectsSettings.update(); + }; window.orders.on('openAsset', assetOpenOrder); window.orders.on('openAssets', assetsOpenOrder); + window.orders.on('openActions', actionsOpener); this.on('unmount', () => { window.orders.off('openAsset', assetOpenOrder); - }); - this.on('unmount', () => { window.orders.off('openAssets', assetsOpenOrder); + window.orders.off('openActions', actionsOpener); }); this.closeAsset = e => { e.stopPropagation(); @@ -314,23 +321,52 @@ app-view.flexcol this.update(); }; + // Remember assets opened before closing the editor and load them on project load. + const {saveProject, getProjectCodename} = require('src/node_requires/resources/projects'); + const saveOpenedAssets = () => { + const openedIds = this.openedAssets.map(a => a.uid); + localStorage[`lastOpened_${getProjectCodename()}`] = JSON.stringify(openedIds); + }; + const loadOpenedAssets = () => { + let openedIds = []; + try { + openedIds = JSON.parse(localStorage[`lastOpened_${getProjectCodename()}`]); + } catch (e) { + void e; + } + if (!openedIds.length) { + return; + } + window.alertify.log(this.voc.loadingPreviouslyOpened); + for (let i = 0; i < openedIds.length; i++) { + const id = openedIds[i]; + if (resources.exists(null, id)) { + this.openAsset(resources.getById(null, id), i !== openedIds.length - 1)(); + } + } + }; + this.on('mount', () => { + loadOpenedAssets(); + }); + this.saveProject = async () => { - const {saveProject} = require('./data/node_requires/resources/projects'); + saveOpenedAssets(); try { this.refreshDirty(); await this.applyAssets(); await saveProject(); this.saveRecoveryDebounce(); alertify.success(this.vocGlob.savedMessage, 'success', 3000); + window.signals.trigger('projectSaved'); } catch (e) { alertify.error(e); } }; this.saveRecovery = () => { - if (global.currentProject) { + if (window.currentProject) { const YAML = require('js-yaml'); - const recoveryYAML = YAML.dump(global.currentProject); - fs.outputFile(global.projdir + '.ict.recovery', recoveryYAML); + const recoveryYAML = YAML.dump(window.currentProject); + fs.outputFile(window.projdir + '.ict.recovery', recoveryYAML); } this.saveRecoveryDebounce(); }; @@ -341,7 +377,7 @@ app-view.flexcol }); this.saveRecoveryDebounce(); - const {getExportDir} = require('./data/node_requires/platformUtils'); + const {getExportDir} = require('src/node_requires/platformUtils'); // Run a local server for ct.js games let fileServer; if (!this.debugServerStarted) { @@ -399,9 +435,13 @@ app-view.flexcol } this.refreshDirty(); if (this.tabsDirty.some(a => a)) { - this.showPrelaunchSave = true; - this.update(); - this.refs.applyAndRun.focus(); + if (localStorage.autoapplyOnLaunch === 'on') { + this.applyAndLaunch(); + } else { + this.showPrelaunchSave = true; + this.update(); + this.refs.applyAndRun.focus(); + } } else { this.runProject(); } @@ -414,9 +454,9 @@ app-view.flexcol document.body.style.cursor = 'progress'; this.exportingProject = true; this.update(); - const runCtExport = require('./data/node_requires/exporter').exportCtProject; + const runCtExport = require('src/node_requires/exporter').exportCtProject; this.exporterError = void 0; - runCtExport(global.currentProject, global.projdir) + runCtExport(window.currentProject, window.projdir) .then(() => { if (localStorage.disableBuiltInDebugger === 'yes') { // Open in default browser @@ -427,8 +467,16 @@ app-view.flexcol } else { // Open the debugger as usual this.tab = 'debug'; + // Get debugger layout + if (localStorage.debuggerMode === 'split') { + this.splitDebugger = true; + } else if (localStorage.debuggerMode === 'multiwindow') { + this.splitDebugger = false; + } else { + this.splitDebugger = nw.Screen.screens.length === 1; + } this.debugParams = { - title: global.currentProject.settings.authoring.title, + title: window.currentProject.settings.authoring.title, link: `http://localhost:${fileServer.address().port}/` }; } @@ -450,8 +498,8 @@ app-view.flexcol document.body.style.cursor = 'progress'; this.exportingProject = true; this.exporterError = void 0; - const runCtExport = require('./data/node_requires/exporter').exportCtProject; - runCtExport(global.currentProject, global.projdir) + const runCtExport = require('src/node_requires/exporter').exportCtProject; + runCtExport(window.currentProject, window.projdir) .then(() => { nw.Shell.openExternal(`http://localhost:${fileServer.address().port}/`); }) diff --git a/src/riotTags/asset-confirm.tag b/src/riotTags/asset-confirm.tag index 134d75fe9..ef96289c9 100644 --- a/src/riotTags/asset-confirm.tag +++ b/src/riotTags/asset-confirm.tag @@ -8,7 +8,7 @@ asset-confirm.aDimmer.pad.fadein(ref="dimmer") .aModal.pad.appear.npb h2.nmt {voc.confirmHeading} - p {voc.confirmParagraph.replace('$1', getName(opts.asset))} + p {voc.confirmParagraph.replace('$1', opts.asset.name)} .flexrow.inset button.nogrow.error(onclick="{opts.discard}") svg.feather @@ -24,5 +24,4 @@ asset-confirm.aDimmer.pad.fadein(ref="dimmer") span {vocGlob.apply} script. this.namespace = 'assetConfirm'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.getName = require('./data/node_requires/resources').getName; + this.mixin(require('src/node_requires/riotMixins/voc').default); diff --git a/src/riotTags/catnip/catnip-block-list.tag b/src/riotTags/catnip/catnip-block-list.tag new file mode 100644 index 000000000..3f0f09d8c --- /dev/null +++ b/src/riotTags/catnip/catnip-block-list.tag @@ -0,0 +1,297 @@ +//- + @attribute blocks (BlockScript) + @attribute [placeholder] (Array) + @attribute [showplaceholder] (atomic) + @attribute [readonly] (atomic) +catnip-block-list( + ondragenter="{handlePreDrop}" + ondragover="{handlePreDrop}" + ondrop="{onDrop}" +) + catnip-insert-mark( + if="{opts.blocks}" + list="{opts.blocks}" pos="-1" + ondrop="{onDropTop}" + oncontextmenu="{onContextMenuInstertMark}" + ondragenter="{handlePreDropInsertMark}" + ondragover="{handlePreDropInsertMark}" + ) + .catnip-block-aBlockPlaceholder(if="{opts.showplaceholder && (!opts.blocks || !opts.blocks.length)}") + svg.feather(if="{opts.placeholder === 'doNothing'}") + use(xlink:href="#thumbs-up") + span.catnip-block-aTextLabel(if="{opts.placeholder === 'doNothing'}") {voc.placeholders.doNothing} + svg.feather(if="{!opts.placeholder || opts.placeholder === 'putBlocksHere'}") + use(xlink:href="#button") + span.catnip-block-aTextLabel(if="{!opts.placeholder || opts.placeholder === 'putBlocksHere'}") {voc.placeholders.putBlocksHere} + virtual(each="{block, ind in opts.blocks}") + catnip-block( + block="{block}" + ondragstart="{parent.onDragStart}" + ondragend="{parent.onDragEnd}" + readonly="{parent.opts.readonly}" + oncontextmenu="{parent.onContextMenu}" + ref="blocks" + onclick="{parent.manageSelection}" + ) + catnip-insert-mark( + if="{!opts.readonly}" + ondragenter="{parent.handlePreDropInsertMark}" + ondragover="{parent.handlePreDropInsertMark}" + ondrop="{parent.onDropAfter}" + oncontextmenu="{parent.onContextMenuInstertMark}" + list="{parent.opts.blocks}" + pos="{ind}" + ) + context-menu(if="{contextBlock}" menu="{contextMenu}" ref="menu") + context-menu(if="{showPasteMenu}" menu="{pasteContextMenu}" ref="pastemenu") + script. + this.namespace = 'catnip'; + this.mixin(require('src/node_requires/riotMixins/voc').default); + + const {getDeclaration, getMenuMutators, mutate, startBlocksTransmit, endBlocksTransmit, getTransmissionType, getSuggestedTarget, setSuggestedTarget, emptyTexture, copy, canPaste, paste, setSelection, toggleSelection, getSelectionHTML, isSelected, removeSelectedBlocks} = require('src/node_requires/catnip'); + const {isDev} = require('src/node_requires/platformUtils'); + + this.getSuggestedTarget = getSuggestedTarget; + + this.onDragStart = e => { + this.update(); + try { // Prevent dragging broken blocks + getDeclaration(e.item.block.lib, e.item.block.code); + } catch (oO) { + e.preventUpdate = true; + e.stopPropagation(); + e.preventDefault(); + return; + } + e.dataTransfer.setData('ctjsblocks/command', 'hello uwu'); + e.dataTransfer.setDragImage(emptyTexture, 0, 0); + const bounds = e.target.getBoundingClientRect(); + window.signals.trigger( + 'blockTransmissionStart', + e, + e.target.outerHTML, + bounds.left - e.clientX, + bounds.top - e.clientY + ); + startBlocksTransmit([e.item.block], this.opts.blocks); + e.stopPropagation(); + this.hoveredOver = null; + }; + this.onDragEnd = () => { + setSuggestedTarget(); + }; + + const isInvalidDrop = e => + this.opts.readonly || !e.dataTransfer.types.includes('ctjsblocks/command'); + this.handlePreDrop = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + } else { + e.preventDefault(); // Tells that we do want to accept the drop + } + }; + this.handlePreDropInsertMark = e => { + this.handlePreDrop(e); + if (!isInvalidDrop(e)) { + setSuggestedTarget(e.item.block ?? this.opts.blocks); + } + }; + this.onDrop = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + return; + } + if (getTransmissionType() !== 'command') { + e.preventUpdate = true; + return; + } + this.hoveredOver = null; + e.preventDefault(); + e.stopPropagation(); + // Drop at the start of the script if the cursor was there + const bounds = this.root.getBoundingClientRect(); + if (e.clientY < bounds.top + 20) { + endBlocksTransmit(this.opts.blocks, 0); + } else { + endBlocksTransmit(this.opts.blocks, this.opts.blocks.length); + } + }; + this.onDropAfter = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + return; + } + if (getTransmissionType() !== 'command') { + e.preventUpdate = true; + return; + } + e.preventDefault(); + e.stopPropagation(); + const {ind} = e.item; + endBlocksTransmit(this.opts.blocks, ind + 1); + }; + this.onDropTop = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + return; + } + if (getTransmissionType() !== 'command') { + e.preventUpdate = true; + return; + } + e.preventDefault(); + e.stopPropagation(); + endBlocksTransmit(this.opts.blocks, 0); + }; + + this.contextBlock = false; + const defaultItems = [{ + label: this.voc.copySelection, + icon: 'copy', + click: () => { + copy([this.contextBlock]); + this.contextBlock = false; + this.update(); + } + }, { + label: this.voc.duplicateBlock, + icon: 'copy', + click: () => { + this.opts.blocks.splice( + this.opts.blocks.indexOf(this.contextBlock), + 0, + structuredClone(this.contextBlock) + ); + this.contextBlock = false; + this.update(); + } + }, { + icon: 'code', + if: () => isDev, + label: this.voc.copyDocHtml, + click: () => { + getSelectionHTML(); + this.contextBlock = false; + } + }, { + type: 'separator' + }, { + label: this.vocGlob.delete, + icon: 'trash', + click: () => { + removeSelectedBlocks(); + this.contextBlock = false; + this.update(); + } + }]; + this.contextMenu = { + opened: true, + items: defaultItems + }; + this.onContextMenu = e => { + if (this.opts.readonly) { + e.preventUpdate = true; + return; + } + // Prevent context modals popping up when right-clicking inside modal windows + // like asset or color inputs. + + // Room events are displayed in a modal + // and we need to differ them from other modals + const roomEvents = Boolean(e.target.closest('room-events-editor')); + if (roomEvents) { + // Get the closest .aModal and go two elements higher + // as room-events-editor has .aModal as its direct child. + if (e.target.closest('.aModal').parentElement.parentElement.closest('room-events-editor')) { + e.preventUpdate = true; + return; + } + } else if (e.target.closest('.aModal')) { + e.preventUpdate = true; + return; + } + e.preventDefault(); + e.stopPropagation(); + const {block, ind} = e.item; + this.contextBlock = block; + this.contextBlockInd = ind; + if (!isSelected(block)) { + const blocks = Array.isArray(this.refs.blocks) ? this.refs.blocks : [this.refs.blocks]; + setSelection(block, blocks[ind]); + } + try { + getDeclaration(block.lib, block.code); + const mutators = getMenuMutators(block, affixedData => { + mutate( + this.opts.blocks, + this.opts.blocks.indexOf(this.contextBlock), + affixedData.mutator + ); + this.contextBlock = false; + this.update(); + }); + if (mutators) { + this.contextMenu.items = [ + ...mutators, + { + type: 'separator' + }, + ...defaultItems + ]; + } else { + this.contextMenu.items = defaultItems; + } + } catch (e) { + this.contextMenu.items = defaultItems; + console.warn(e); + } + this.update(); + this.refs.menu.popup(e.clientX, e.clientY); + }; + + // Handling right-clicking on insert marks + let pastePosition = 0; + this.showPasteMenu = false; + this.pasteContextMenu = { + opened: true, + items: [{ + label: this.vocGlob.paste, + icon: 'clipboard', + click: () => { + paste(this.opts.blocks, pastePosition); + this.update(); + } + }] + }; + this.onContextMenuInstertMark = e => { + if (!canPaste('script')) { + e.preventUpdate = true; + return; + } + if ('ind' in e.item) { + pastePosition = e.item.ind + 1; + } else { + pastePosition = 0; + } + this.showPasteMenu = true; + e.stopPropagation(); + e.preventDefault(); + this.update(); + this.refs.pastemenu.popup(e.clientX, e.clientY); + }; + + this.manageSelection = e => { + e.preventUpdate = false; // Already gets updated in redrawSelectedBlocks + // Skip anything that is not a left click (or another main button of the pointer) + if (e.button !== 0) { + return; + } + const {block, ind} = e.item; + const blocks = Array.isArray(this.refs.blocks) ? this.refs.blocks : [this.refs.blocks]; + if (e.ctrlKey) { + toggleSelection(block, blocks[ind]); + } else { + setSelection(block, blocks[ind]); + } + e.stopPropagation(); + }; diff --git a/src/riotTags/catnip/catnip-block.tag b/src/riotTags/catnip/catnip-block.tag new file mode 100644 index 000000000..77c7968c3 --- /dev/null +++ b/src/riotTags/catnip/catnip-block.tag @@ -0,0 +1,766 @@ +//- + @attribute block (IBlock) + The block from the block script that is rendered + @atribute [nodrag] (atomic) + Prohibits dragging this block + @attribute [readonly] (atomic) + Prohibits editing this block and all its nested blocks + +catnip-block( + draggable="{!opts.nodrag}" + class="{error: !declaration} {declaration.type} {declaration.typeHint} {opts.class} {declaration.customClass} {selected: isSelected()}" + hide="{getHidden}" + title="{voc.blockDocumentation[declaration.documentationI18nKey] || localizeField(declaration, 'documentation')}" +) + svg.feather(if="{!declaration}") + use(xlink:href="#x") + span(if="{!declaration}") {voc.errorBlock} "{opts.block.lib}" — {opts.block.code}. {voc.errorBlockDeleteHint} + + .flexrow.wide(if="{declaration.isGroup}") + button.inline.square.nogrow(onclick="{toggleGroupOpened}") + svg.feather + use(xlink:href="#{opts.block.groupClosed ? 'chevron-right' : 'chevron-down'}") + input.catnip-block-aGroupName( + type="text" readonly="{opts.readonly}" + value="{opts.block.groupName}" onchange="{setGroupName}" + placeholder="{voc.unnamedGroup}" + onclick="{stopPropagation}" + ) + + svg.feather(if="{declaration && declaration.icon && !declaration.hideIcon}") + use(xlink:href="#{declaration.icon}") + span.catnip-block-aTextLabel(if="{declaration && !declaration.hideLabel}" title="{(voc.blockDisplayNames[declaration.displayI18nKey] || voc.blockNames[declaration.i18nKey] || localizeField(declaration, 'displayName') || localizeField(declaration, 'name'))}") + | {(voc.blockDisplayNames[declaration.displayI18nKey] || voc.blockNames[declaration.i18nKey] || localizeField(declaration, 'displayName') || localizeField(declaration, 'name'))} + virtual(each="{piece in declaration.pieces}" if="{declaration && !opts.block.groupClosed}") + span.catnip-block-aTextLabel(if="{piece.type === 'label'}" title="{voc.blockLabels[piece.i18nKey] || localizeField(piece, 'name')}") {voc.blockLabels[piece.i18nKey] || localizeField(piece, 'name')} + span.catnip-block-aTextLabel(if="{piece.type === 'propVar'}" title="{parent.opts.block.values.variableName}") {parent.opts.block.values.variableName} + svg.feather(if="{piece.type === 'icon'}") + use(xlink:href="#{piece.icon}") + span.catnip-block-anAsyncMarker(if="{piece.type === 'asyncMarker'}" title="{voc.asyncHint}") + svg.feather + use(xlink:href="#clock") + .catnip-block-aFiller(if="{piece.type === 'filler'}") + .catnip-block-aBreak(if="{piece.type === 'break'}") + catnip-js-editor( + if="{piece.type === 'code'}" + readonly="{parent.opts.readonly}" + values="{parent.opts.block.values}" + key="{piece.key}" + ) + textarea( + readonly="{opts.readonly}" + if="{piece.type === 'textbox'}" + value="{getValue(piece.key)}" + onclick="{parent.stopPropagation}" + oninput="{parent.updateTextareas}" + onchange="{parent.writeConstantVal}" + placeholder="{piece.key}" + ref="textareas" + ) + .catnip-block-Blocks(if="{piece.type === 'blocks'}" ref="blocksDrop") + catnip-block-list( + blocks="{getValue(piece.key)}" + showplaceholder="showplaceholder" + placeholder="{piece.placeholder}" + readonly="{parent.opts.readonly}" + ) + // Options + .catnip-block-Options(if="{piece.type === 'options'}") + .catnip-block-anOptionsToggle(onclick="{toggleShowOptions}") + svg.feather + use(xlink:href="#chevron-{openOptions ? 'up' : 'down'}") + span {voc.optionsAdvanced} + svg.feather + use(xlink:href="#chevron-{openOptions ? 'up' : 'down'}") + // Options defined by the block itself + dl(if="{openOptions}" each="{option in piece.options}") + dt + | {voc.blockOptions[option.i18nKey] || option.name || option.key} + span(if="{option.required}") * + dd + catnip-block( + if="{getValue(option.key) && (typeof getValue(option.key)) === 'object'}" + class="{option.typeHint}" + block="{getValue(option.key)}" + readonly="{parent.parent.opts.readonly}" + ondragstart="{parent.onDragStart}" + ondragend="{parent.onDragEnd}" + oncontextmenu="{parent.onContextMenu}" + onclick="{parent.tryMutate}" + ) + input.catnip-block-aConstantInput( + ondrop="{parent.onDrop}" + ondragenter="{parent.handlePreDrop}" + ondragstart="{parent.handlePreDrop}" + onclick="{parent.tryAddBoolean}" + oncontextmenu="{parent.onConstContextMenu}" + type="text" value="{parent.getValue(option.key)}" + oninput="{parent.writeConstantVal}" + placeholder="{option.key}" + if="{!option.assets && (!getValue(option.key) || (typeof getValue(option.key)) !== 'object')}" + class="{option.typeHint} {invalid: parent.getIsInvalid(option)}" + title="{parent.getIsInvalid(option) ? parent.voc.requiredField : ''}" + readonly="{parent.parent.opts.readonly}" + style="width: {(getValue(option.key) !== (void 0)) ? Math.min((''+getValue(option.key)).length + 0.5, 32) : option.key.length + 0.5}ch" + ) + span.catnip-block-aConstantInput.menu( + ondrop="{parent.onDrop}" + ondragenter="{parent.handlePreDrop}" + ondragstart="{parent.handlePreDrop}" + if="{option.assets && (!getValue(option.key) || (typeof getValue(option.key)) !== 'object')}" + class="{option.typeHint} {invalid: parent.isInvalid(option)}" + title="{parent.getIsInvalid(piece) ? parent.voc.requiredField : ''}" + onclick="{!parent.parent.opts.readonly && promptAsset}" + ) + svg.feather(if="{!getValue(option.key)}") + use(xlink:href="#search") + span(if="{!getValue(option.key)}") {vocGlob.selectDialogue} + svg.feather(if="{getValue(option.key) && option.assets === 'action'}") + use(xlink:href="#airplay") + svg.feather(if="{getValue(option.key) && option.assets !== 'action' && areThumbnailsIcons(option.assets)}") + use(xlink:href="#{getThumbnail(option.assets, getValue(option.key))}") + img( + if="{getValue(option.key) && option.assets !== 'action' && !areThumbnailsIcons(option.assets)}" + src="{getThumbnail(option.assets, getValue(option.key))}" + class="{soundthumbnail: option.assets === 'sound'}" + ) + span(if="{getValue(option.key) && option.assets !== 'action'}") {getName(option.assets, getValue(option.key))} + span(if="{getValue(option.key) && option.assets === 'action'}") {getValue(option.key)} + // User-defined options + dl(if="{openOptions && piece.allowCustom && parent.opts.block.customOptions}" each="{value, key in parent.opts.block.customOptions}") + dt + input.catnip-block-aConstantInput.string( + type="text" value="{key}" + onchange="{parent.writeOptionKey}" + readonly="{parent.parent.opts.readonly}" + style="width: {Math.min(key.length + 0.5, 32)}ch" + class="{invalid: !key}" + ) + dd + .toright.anActionableIcon(onclick="{parent.removeCustomOption}") + svg.feather.red + use(xlink:href="#delete") + catnip-block( + if="{getCustomValue(key) && (typeof getCustomValue(key)) === 'object'}" + block="{getCustomValue(key)}" + readonly="{parent.parent.opts.readonly}" + ondragstart="{parent.onOptionDragStart}" + ondragend="{parent.onOptionDragEnd}" + oncontextmenu="{parent.onContextMenu}" + onclick="{parent.tryMutateCustomOption}" + ) + input.catnip-block-aConstantInput.wildcard( + ondrop="{parent.onOptionDrop}" + ondragenter="{parent.handlePreDrop}" + ondragstart="{parent.handlePreDrop}" + type="text" value="{value}" + onchange="{parent.writeOption}" + oncontextmenu="{parent.onConstContextMenu}" + placeholder="{key}" + if="{!value || typeof value !== 'object'}" + readonly="{parent.parent.opts.readonly}" + style="width: {Math.min((value !== void 0) ? value.length + 0.5 : 5, 32)}ch" + ) + .pad(if="{openOptions && piece.allowCustom}") + button.inline.small(onclick="{addCustomOption}") + svg.feather + use(xlink:href="#plus") + span {voc.addCustomOption} + // Arguments + catnip-block( + if="{piece.type === 'argument' && getValue(piece.key) && (typeof getValue(piece.key)) === 'object'}" + class="{piece.typeHint}" + block="{getValue(piece.key)}" + readonly="{parent.opts.readonly}" + ondragstart="{parent.onDragStart}" + ondragend="{parent.onDragEnd}" + oncontextmenu="{parent.onContextMenu}" + onclick="{parent.tryMutate}" + ) + input.catnip-block-aConstantInput( + ondrop="{parent.onDrop}" + ondragenter="{parent.handlePreDrop}" + ondragstart="{parent.handlePreDrop}" + type="text" value="{parent.getValue(piece.key)}" + oninput="{parent.writeConstantVal}" + onclick="{tryColorPicker}" + oncontextmenu="{parent.onConstContextMenu}" + placeholder="{piece.key}" + if="{piece.type === 'argument' && !piece.assets && (!getValue(piece.key) || (typeof getValue(piece.key)) !== 'object')}" + class="{piece.typeHint} {invalid: parent.getIsInvalid(piece)}" + title="{parent.getIsInvalid(piece) ? parent.voc.requiredField : ''}" + readonly="{parent.opts.readonly}" + style="\ + width: {(getValue(piece.key) !== (void 0)) ? Math.min((''+getValue(piece.key)).length + 0.5, 32) : piece.key.length + 0.5}ch;\ + {(piece.typeHint === 'color' && getValue(piece.key)) ? 'background-color: ' + getValue(piece.key) + ';' : ''}\ + {(piece.typeHint === 'color' && getValue(piece.key)) ? 'border-color: ' + getValue(piece.key) + ';' : ''}\ + {(piece.typeHint === 'color' && getValue(piece.key)) ? 'color: ' + (brehautColor(getValue(piece.key)).getLightness() > 0.5 ? 'black' : 'white') + ';' : ''}\ + " + ) + span.catnip-block-aConstantInput.menu( + ondrop="{parent.onDrop}" + ondragenter="{parent.handlePreDrop}" + ondragstart="{parent.handlePreDrop}" + if="{piece.type === 'argument' && piece.assets && (!getValue(piece.key) || (typeof getValue(piece.key)) !== 'object')}" + class="{piece.typeHint} {invalid: parent.getIsInvalid(piece)}" + title="{parent.getIsInvalid(piece) ? parent.voc.requiredField : ''}" + onclick="{!parent.opts.readonly && promptAsset}" + ) + svg.feather(if="{!getValue(piece.key)}") + use(xlink:href="#search") + span(if="{!getValue(piece.key)}") {vocGlob.selectDialogue} + svg.feather(if="{getValue(piece.key) && piece.assets === 'action'}") + use(xlink:href="#airplay") + svg.feather(if="{getValue(piece.key) && piece.assets !== 'action' && areThumbnailsIcons(piece.assets)}") + use(xlink:href="#{getThumbnail(piece.assets, getValue(piece.key))}") + img( + if="{getValue(piece.key) && piece.assets !== 'action' && !areThumbnailsIcons(piece.assets)}" + src="{getThumbnail(piece.assets, getValue(piece.key))}" + class="{soundthumbnail: piece.assets === 'sound'}" + ) + span(if="{getValue(piece.key) && piece.assets !== 'action'}") {getName(piece.assets, getValue(piece.key))} + span(if="{getValue(piece.key) && piece.assets === 'action'}") {getValue(piece.key)} + context-menu(draggable="true" ondragstart="{preventDrag}" if="{contextPiece || contextOption}" menu="{contextMenu}" ref="menu") + context-menu(draggable="true" ondragstart="{preventDrag}" if="{selectingAction}" menu="{actionsMenu}" ref="actionsmenu") + asset-selector( + draggable="true" ondragstart="{preventDrag}" + if="{selectingAssetType}" + assettypes="{selectingAssetType}" + onselected="{selectAsset}" + oncancelled="{cancelAssetSelection}" + ) + .aDimmer(if="{colorValue}" draggable="true" ondragstart="{preventDrag}") + color-picker( + hidealpha="hidealpha" + onapply="{applyColorValue}" + oncancel="{closeColorPicker}" + color="{opts.block.values[colorValue]}" + ) + script. + this.namespace = 'catnip'; + this.mixin(require('src/node_requires/riotMixins/voc').default); + + const {getDeclaration, getMenuMutators, mutate, getTransmissionType, getTransmissionReturnVal, startBlocksTransmit, endBlocksTransmit, setSuggestedTarget, emptyTexture, copy, canPaste, paste, isSelected} = require('src/node_requires/catnip'); + this.isSelected = () => isSelected(this.opts.block); + const {getById, areThumbnailsIcons, getThumbnail} = require('src/node_requires/resources'); + this.getName = (assetType, id) => getById(assetType, id).name; + this.areThumbnailsIcons = areThumbnailsIcons; + this.getThumbnail = (assetType, id) => getThumbnail(getById(assetType, id), false, false); + this.localizeField = require('src/node_requires/i18n').localizeField; + + try { + this.declaration = getDeclaration(this.opts.block.lib, this.opts.block.code); + } catch (e) { + console.error(e); + this.declaration = false; + } + let oldBlock = this.opts.block; + this.on('update', () => { + if (oldBlock !== this.opts.block) { + try { + this.declaration = getDeclaration(this.opts.block.lib, this.opts.block.code); + } catch (e) { + console.error(e); + this.declaration = false; + } + oldBlock = this.opts.block; + } + }); + this.getValue = key => this.opts.block.values[key]; + this.getCustomValue = key => this.opts.block.customOptions[key]; + // A random ID that is used during block tree traversal + // to prevent putting a block into itself or its children. + this.getIsInvalid = piece => { + if (this.opts.readonly || !piece.required) { + return false; + } + const val = this.getValue(piece.key); + if (val === void 0) { + return true; + } + if (piece.typeHint === 'number' && !Number.isFinite(Number(val))) { + return true; + } + return false; + }; + this.id = require('src/node_requires/generateGUID')(); + + this.dragging = false; + + this.getHidden = () => this.dragging; + this.stopPropagation = e => e.stopPropagation(); + + this.setGroupName = e => { + this.opts.block.groupName = e.target.value.trim(); + }; + this.toggleGroupOpened = e => { + if (this.opts.readonly) { + e.preventUpdate(); + return; + } + this.opts.block.groupClosed = !this.opts.block.groupClosed; + e.stopPropagation(); + }; + + this.onDragStart = e => { + this.update(); + const sourcePiece = e.item.option || e.item.piece; + let block; + try { // Prevent dragging broken blocks + block = this.opts.block.values[sourcePiece.key]; + getDeclaration(block.lib, block.code); + } catch (oO) { + e.stopPropagation(); + e.preventDefault(); + e.preventUpdate = true; + return; + } + e.dataTransfer.setData('ctjsblocks/computed', 'hello uwu'); + e.dataTransfer.setDragImage(emptyTexture, 0, 0); + const bounds = e.target.getBoundingClientRect(); + window.signals.trigger( + 'blockTransmissionStart', + e, + e.target.outerHTML, + bounds.left - e.clientX, + bounds.top - e.clientY + ); + startBlocksTransmit( + [this.opts.block.values[sourcePiece.key]], + this.opts.block.values, sourcePiece.key + ); + e.stopPropagation(); + this.hoveredOver = null; + }; + this.onDragEnd = () => { + setSuggestedTarget(); + }; + + this.writeConstantVal = e => { + const piece = e.item.option || e.item.piece; + let val = e.target.value; + if (piece.typeHint === 'number') { + val = Number(e.target.value) || 0; + } else if (piece.typeHint === 'boolean') { + val = val.trim() === 'true'; + } else if (piece.typeHint === 'wildcard' && Number.isFinite(Number(e.target.value))) { + val = Number(e.target.value); + } + this.opts.block.values[piece.key] = val; + }; + // Clicking on empty boolean fields automatically puts a constant boolean + this.tryAddBoolean = e => { + e.stopPropagation(); + const piece = e.item.option || e.item.piece; + if (piece.typeHint === 'boolean') { + this.opts.block.values[piece.key] = { + lib: 'core.logic', + code: 'true', + values: {} + }; + } else { + e.preventUpdate = false; + } + }; + // Mutating on click + // If a click mutator is specified in block's declaration, it replaces one block with another + this.tryMutate = e => { + e.stopPropagation(); + const piece = e.item.option || e.item.piece; + const targetBlock = this.opts.block.values[piece.key]; + const blockDeclaration = getDeclaration(targetBlock.lib, targetBlock.code); + if (blockDeclaration.onClickMutator) { + const {lib, code} = blockDeclaration.onClickMutator; + mutate(this.opts.block, piece.key, { + lib, + code + }); + this.update(); + } else { + e.preventUpdate = true; + } + }; + this.tryMutateCustomOption = e => { + e.stopPropagation(); + const {key} = e.item; + const targetBlock = this.opts.block.customOptions[key]; + const blockDeclaration = getDeclaration(targetBlock.lib, targetBlock.code); + if (blockDeclaration.onClickMutator) { + const {lib, code} = blockDeclaration.onClickMutator; + mutate(this.opts.block, key, { + lib, + code + }, true); + this.update(); + } else { + e.preventUpdate = true; + } + }; + this.removeCustomOption = e => { + e.stopPropagation(); + const {key} = e.item; + const opts = this.opts.block.customOptions; + delete opts[key]; + }; + + const isInvalidDrop = e => + this.opts.readonly || !e.dataTransfer.types.includes('ctjsblocks/computed'); + this.handlePreDrop = e => { + if (!isInvalidDrop(e)) { + e.preventUpdate = true; + e.preventDefault(); // Tells that we do want to accept the drop + } + }; + this.onDrop = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + return; + } + // Disallow commands + if (getTransmissionType() !== 'computed') { + e.preventUpdate = true; + return; + } + const piece = e.item.option || e.item.piece; + + // Disallow non-matching types + if (piece.typeHint !== 'wildcard' && + getTransmissionReturnVal() !== 'wildcard' && + piece.typeHint !== getTransmissionReturnVal() + ) { + e.preventUpdate = true; + return; + } + this.hoveredOver = null; + e.preventDefault(); + e.stopPropagation(); + endBlocksTransmit(this.opts.block.values, piece.key); + }; + + + // Automatic height for textareas + this.updateTextareas = e => { + if (e) { + e.preventUpdate = true; + } + const textareas = Array.isArray(this.refs.textareas) ? + this.refs.textareas : + [this.refs.textareas]; + for (const textarea of textareas) { + if (!textarea) { + continue; + } + textarea.style.height = '1px'; + textarea.style.height = (textarea.scrollHeight) + 'px'; + } + }; + this.on('mount', () => { + this.updateTextareas(); + }); + + const deleteMenuItem = { + label: this.vocGlob.delete, + icon: 'trash', + click: () => { + if (this.contextOption) { + this.opts.block.customOptions[this.contextOption] = void 0; + this.contextOption = false; + } else { + delete this.opts.block.values[this.contextPiece.key]; + this.contextPiece = false; + } + this.update(); + } + }; + const defaultMenuItems = [{ + label: this.vocGlob.copy, + icon: 'copy', + click: () => { + if (this.contextOption) { + copy([this.getCustomValue(this.contextOption)]); + this.contextOption = false; + return; + } + if (this.contextPiece) { + copy([this.getValue(this.contextPiece.key)]); + this.contextPiece = false; + } + } + }, { + label: this.vocGlob.paste, + icon: 'clipboard', + if: () => { + if (this.contextOption) { + return canPaste('wildcard'); + } + if (this.contextPiece) { + return canPaste(this.contextPiece.typeHint); + } + return false; + }, + click: () => { + if (this.contextOption) { + paste(this.opts.block, this.contextOption, true); + this.contextOption = false; + } else { + paste(this.opts.block, this.contextPiece.key); + this.contextPiece = false; + } + this.update(); + } + }, { + type: 'separator' + }, deleteMenuItem]; + this.contextMenu = { + opened: true, + items: defaultMenuItems + }; + this.contextPiece = this.contextOption = false; + this.onContextMenu = e => { + // Room events are displayed in a modal + // and we need to differ them from other modals + const roomEvents = Boolean(e.target.closest('room-events-editor')); + if (roomEvents) { + // Get the closest .aModal and go two elements higher + // as room-events-editor has .aModal as its direct child. + if (e.target.closest('.aModal').parentElement.parentElement.closest('room-events-editor')) { + e.preventUpdate = true; + return; + } + } else if (e.target.closest('.aModal')) { + e.preventUpdate = true; + return; + } + e.preventDefault(); + e.stopPropagation(); + // Options and arguments + const piece = e.item.option || e.item.piece; + let key; + if (!piece) { // Handle user-defined options + ({key} = e.item); + this.contextOption = key; + } else { + ({key} = piece); + this.contextPiece = piece; + } + const block = this.opts.block[piece ? 'values' : 'customOptions'][key]; + try { + getDeclaration(block.lib, block.code); + const mutators = getMenuMutators(block, affixedData => { + mutate(this.opts.block, key, affixedData.mutator, !piece); + this.contextOption = this.contextPiece = false; + this.update(); + }); + if (mutators) { + this.contextMenu.items = [ + ...mutators, + { + type: 'separator' + }, + ...defaultMenuItems + ]; + } else { + this.contextMenu.items = defaultMenuItems; + } + } catch (e) { + console.warn('Showing only a "Delete" option in the context menu as an error was faced while getting mutators.', e); + this.contextMenu.items = [deleteMenuItem]; + } + this.update(); + this.refs.menu.popup(e.clientX, e.clientY); + }; + + // Separate context menu for constant variables + const constContextMenuItems = [{ + label: this.vocGlob.paste, + icon: 'clipboard', + click: () => { + if (this.contextOption) { + paste(this.opts.block, this.contextOption, true); + this.contextOption = false; + } else { + paste(this.opts.block, this.contextPiece.key); + this.contextPiece = false; + } + this.update(); + } + }]; + this.onConstContextMenu = e => { + if (this.opts.readonly || e.target.closest('.aModal') || e.target.closest('.aDimmer')) { + e.preventUpdate = true; + return; + } + // Options and arguments + const piece = e.item.option || e.item.piece; + if (!piece) { // Handle user-defined options + if (!canPaste('wildcard')) { + e.preventUpdate = true; + return; + } + this.contextOption = e.item.key; + } else { + if (!canPaste(piece.typeHint)) { + e.preventUpdate = true; + return; + } + this.contextPiece = piece; + } + e.preventDefault(); + e.stopPropagation(); + this.contextMenu.items = constContextMenuItems; + this.update(); + this.refs.menu.popup(e.clientX, e.clientY); + }; + + // Arguments with `assets` field + this.selectingAssetType = this.selectingAssetPiece = false; + this.promptAsset = e => { + e.stopPropagation(); + const {piece} = e.item; + if (piece.assets === 'action') { + this.selectingAction = true; + this.actionsMenu = { + opened: true, + items: [ + ...window.currentProject.actions.map(action => ({ + label: action.name, + icon: 'airplay', + click: () => { + this.opts.block.values[piece.key] = action.name; + this.update(); + this.selectingAction = false; + } + })), + { + icon: 'external-link', + label: this.voc.goToActions, + click: () => { + window.orders.trigger('openActions'); + } + } + ] + }; + this.update(); + this.refs.actionsmenu.popup(e.clientX, e.clientY); + } else { + this.selectingAssetType = piece.assets; + this.selectingAssetPiece = piece; + } + }; + this.selectAsset = id => { + this.opts.block.values[this.selectingAssetPiece.key] = id; + this.selectingAssetType = this.selectingAssetPiece = false; + this.update(); + }; + this.cancelAssetSelection = () => { + this.selectingAssetType = this.selectingAssetPiece = false; + this.update(); + }; + + // Tags with advanced options + this.openOptions = false; + this.toggleShowOptions = e => { + this.openOptions = !this.openOptions; + e.stopPropagation(); + }; + + // User-defined advanced options + this.addCustomOption = e => { + if (!this.opts.block.customOptions) { + this.opts.block.customOptions = {}; + } + let namePostfix = 0; + while (`key${namePostfix}` in this.opts.block.customOptions) { + namePostfix++; + } + this.opts.block.customOptions[`key${namePostfix}`] = ''; + e.stopPropagation(); + }; + this.writeOptionKey = e => { + const oldKey = e.item.key, + oldVal = this.opts.block.customOptions[oldKey]; + const newKey = e.target.value.trim(); + delete this.opts.block.customOptions[oldKey]; + this.opts.block.customOptions[newKey] = oldVal; + }; + this.writeOption = e => { + const {key} = e.item; + this.opts.block.customOptions[key] = e.target.value.trim(); + }; + this.onOptionDragStart = e => { + let block; + try { // Prevent dragging broken blocks + block = this.opts.block.customOptions[e.item.key]; + getDeclaration(block.lib, block.code); + } catch (oO) { + e.stopPropagation(); + e.preventDefault(); + e.preventUpdate = true; + return; + } + e.dataTransfer.setData('ctjsblocks/computed', 'hello uwu'); + e.dataTransfer.setDragImage(emptyTexture, 0, 0); + const bounds = e.target.getBoundingClientRect(); + window.signals.trigger( + 'blockTransmissionStart', + e, + e.target.outerHTML, + bounds.left - e.clientX, + bounds.top - e.clientY + ); + startBlocksTransmit( + [this.opts.block.customOptions[e.item.key]], + this.opts.block.customOptions, + e.item.key, + true + ); + e.stopPropagation(); + this.hoveredOver = null; + }; + this.onOptionDrop = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + return; + } + // Disallow commands + if (getTransmissionType() !== 'computed') { + e.preventUpdate = true; + return; + } + this.hoveredOver = null; + e.preventDefault(); + e.stopPropagation(); + endBlocksTransmit(this.opts.block.customOptions, e.item.key); + }; + // Do not delete the property when moving a block out, recreate the property + this.onOptionDragEnd = e => { + setSuggestedTarget(); + this.opts.block.customOptions[e.item.key] = ''; + }; + + // Color inputs + this.colorValue = false; + this.applyColorValue = color => { + this.opts.block.values[this.colorValue] = color; + this.closeColorPicker(); + }; + this.closeColorPicker = () => { + this.colorValue = false; + this.update(); + }; + this.tryColorPicker = e => { + const {piece} = e.item; + if (piece.typeHint === 'color') { + e.target.blur(); + this.colorValue = piece.key; + e.stopPropagation(); + } else { + this.tryAddBoolean(e); + } + }; + + this.preventDrag = e => { + e.stopPropagation(); + e.preventDefault(); + e.preventUpdate = true; + }; diff --git a/src/riotTags/catnip/catnip-editor.tag b/src/riotTags/catnip/catnip-editor.tag new file mode 100644 index 000000000..b59bae56a --- /dev/null +++ b/src/riotTags/catnip/catnip-editor.tag @@ -0,0 +1,133 @@ +//- + @attribute asset (IScriptable) + @attribute [event] (IScriptableEvent) + Required for assets other than scripts. The currently edited event. + @attribute [scriptmode] (atomic) + Disables some features of the editor that make sense for script asset type. + @attribute onrename (riot function) + A function that is called when a user renames a property or a variable in Catnip blocks. + The function is provided with an object of this structure: + { + type: 'prop' | 'variable', + from: string, // old name of the property/variable + to: string // new name of the prop/var + } + The called function must apply the following changes to all the relevant blocks in an asset. + This function is passed to this tag's catnip-library block as an attribute. +catnip-editor(class="flexrow {opts.class}" onpointermove="{repositionGhost}" ondragover="{repositionGhost}" ondragend="{endGhost}") + .pad.dim(if="{!opts.event && !opts.scriptmode}") {vocFull.scriptables.createEventHint} + catnip-block-list.catnip-editor-scriptable-aCanvas( + ref="canvas" + class="{dragging: dragInProgress}" + blocks="{opts.scriptmode ? opts.asset.code : opts.event.code}" + showplaceholder="showplaceholder" + if="{opts.event || opts.scriptmode}" + onclick="{tryDeselect}" + ) + .flexfix(ondragenter="{handlePreDrop}" ondragover="{handlePreDrop}" if="{opts.event || opts.scriptmode}") + catnip-library.flexfix-body( + props="{opts.scriptmode ? [] : opts.asset.properties}" + variables="{opts.scriptmode ? opts.asset.variables : opts.event.variables}" + asset="{opts.asset}" + behaviorprops="{opts.scriptmode ? [] : getBehaviorFields(opts.asset)}" + scriptmode="{opts.scriptmode}" + eventvars="{opts.scriptmode ? [] : getLocals(opts.event.eventKey, opts.event.lib)}" + onrename="{opts.onrename}" + ) + .flexfix-footer.catnip-editor-aTrashZone( + title="{voc.trashZoneHint}" + ondragenter="{handlePreDrop}" + ondragover="{handlePreDrop}" + ondrop="{nuke}" + ) + svg.feather + use(xlink:href="#trash") + .catnip-editor-aGhost(ref="ghost") + script. + this.namespace = 'catnip'; + this.mixin(require('src/node_requires/riotMixins/voc').default); + const isInvalidDrop = e => + !e.dataTransfer.types.includes('ctjsblocks/computed') && + !e.dataTransfer.types.includes('ctjsblocks/command'); + this.handlePreDrop = e => { + if (!isInvalidDrop(e)) { + e.preventUpdate = true; + e.preventDefault(); // Tells that we do want to accept the drop + } + }; + + const {endBlocksTransmit, clearSelection, isAnythingSelected} = require('src/node_requires/catnip'); + const {getLocals, getBehaviorFields} = require('src/node_requires/events'); + this.getBehaviorFields = getBehaviorFields; + this.getLocals = getLocals; + this.nuke = e => { + if (isInvalidDrop(e)) { + e.preventUpdate = true; + return; + } + // Put blocks in a newly-created array, which will then be garbage-collected. + endBlocksTransmit([], 0); + e.preventDefault(); + e.stopPropagation(); + }; + + this.blockGhost = ''; + this.dx = 0; + this.dy = 0; + const startGhost = (e, html, dx, dy) => { + // check if we are in an opened editor + if (!this.root.closest('[isactiveeditor]')) { + e.preventUpdate = true; + return; + } + this.blockGhost = html; + this.dx = dx; + this.dy = dy; + this.refs.ghost.innerHTML = html; + this.dragInProgress = true; + this.update(); + this.refs.ghost.style.left = `${e.clientX + this.dx}px`; + this.refs.ghost.style.top = `${e.clientY + this.dy}px`; + }; + this.endGhost = () => { + this.refs.ghost.innerHTML = this.blockGhost = ''; + this.dragInProgress = false; + this.update(); + }; + const dropSelection = tab => { + if ((typeof tab === 'object') && tab.uid === this.opts.asset.uid) { + clearSelection(); + } + }; + const dropSelectionOutside = e => { + const closest = e.target.closest('catnip-editor'); + if (!closest || closest !== this.root) { + clearSelection(); + } + }; + window.signals.on('blockTransmissionStart', startGhost); + window.signals.on('blockTransmissionEnd', this.endGhost); + window.signals.on('globalTabChanged', dropSelection); + document.body.addEventListener('click', dropSelectionOutside); + this.on('unmount', () => { + window.signals.off('blockTransmissionStart', startGhost); + window.signals.off('blockTransmissionEnd', this.endGhost); + window.signals.off('globalTabChanged', dropSelection); + document.body.removeEventListener('click', dropSelectionOutside); + }); + this.repositionGhost = e => { + e.preventUpdate = true; + if (!this.blockGhost || !this.refs.ghost) { + return; + } + this.refs.ghost.style.left = `${e.clientX + this.dx}px`; + this.refs.ghost.style.top = `${e.clientY + this.dy}px`; + }; + + this.tryDeselect = e => { + if (e.target === this.refs.canvas.root && isAnythingSelected()) { + clearSelection(); + } else { + e.preventUpdate = true; + } + }; diff --git a/src/riotTags/catnip/catnip-insert-mark.tag b/src/riotTags/catnip/catnip-insert-mark.tag new file mode 100644 index 000000000..3758d8795 --- /dev/null +++ b/src/riotTags/catnip/catnip-insert-mark.tag @@ -0,0 +1,125 @@ +//- + Marks up an empty zone and shows a visual "insert (+)" prompt when hovered. + Used as a dropzone for commands. + + @attribute list (BlockScript) + The parent block list this mark is in. Used to insert blocks from search. + @attribute pos (number) + The position at which this mark is put in the list +catnip-insert-mark(onclick="{toggleMenu}" class="{dragover: shouldDragover(), menuopen: opened}") + // Expands on hover to expand drop area + .catnip-insert-mark-aFlytrap + .catnip-insert-mark-aLine(if="{!opened}") + .catnip-insert-mark-anIcon(if="{!opened}") + svg.feather + use(xlink:href="#plus") + .aSearchWrap(if="{opened}") + input.wide( + ref="search" + type="text" value="{searchVal}" + oninput="{search}" + onclick="{selectSearch}" + onkeyup="{tryHotkeys}" + ) + svg.feather + use(href="#search") + ul.aMenu.aPanel(role="menu" class="{up: menuUp}" if="{opened && searchVal.trim() && searchResults.length}") + li(role="menuitem" each="{block in searchResults}" onpointerdown="{insertBlock}" tabindex="0" onkeyup="{menuKeyDown}") + code.toright.inline.small.dim {block.lib} + svg.feather + use(href="#{block.icon}") + span {block.bakedName} + script. + const {searchBlocks, insertBlock, getSuggestedTarget} = require('src/node_requires/catnip'); + this.getSuggestedTarget = getSuggestedTarget; + + this.opened = false; + this.toggleMenu = e => { + e.stopPropagation(); + window.signals.trigger('closeCatnipSearch'); + if (this.opened) { + this.opened = false; + return; + } + this.opened = true; + this.menuUp = e.clientY > window.innerHeight / 2; + this.update(); + setTimeout(() => { + this.refs.search.select(); + }, 0); + }; + const close = () => { + this.opened = false; + this.update(); + }; + const closeOnOutsideClick = e => { + if (this.opened && e.target.closest('catnip-insert-mark') !== this.root) { + this.opened = false; + this.parent.update(); + } + }; + document.addEventListener('click', closeOnOutsideClick, { + passive: true, + capture: true + }); + window.signals.on('closeCatnipSearch', close); + this.on('unmount', () => { + document.removeEventListener('click', closeOnOutsideClick); + window.signals.off('closeCatnipSearch', close); + }); + + this.shouldDragover = () => + getSuggestedTarget() && ( + (getSuggestedTarget() === this.opts.list && this.opts.pos === '-1') || + getSuggestedTarget() === this.opts.list[this.opts.pos]); + + this.searchVal = ''; + this.search = e => { + this.searchVal = e.target.value; + if (this.searchVal.trim()) { + this.searchResults = searchBlocks(this.searchVal.trim()).filter(b => b.type === 'command'); + } + }; + this.selectSearch = e => { + this.refs.search.select(); + e.stopPropagation(); + }; + this.tryHotkeys = e => { + if (e.key === 'Escape') { + this.opened = false; + } else if (e.key === 'Enter') { + if (this.searchVal.trim() && this.searchResults.length) { + this.insertBlock({ + item: { + block: this.searchResults[0] + } + }); + } + } + }; + + this.insertBlock = e => { + const {block} = e.item; + insertBlock(this.opts.list, this.opts.pos, block); + this.refs.search.blur(); + this.opened = false; + this.parent.update(); + + setTimeout(() => { + // Dispatch a click event to the new insert-mark so user can input several blocks at once + const marks = [...this.parent.root.childNodes] + .filter(node => node.tagName === 'CATNIP-INSERT-MARK'); + marks[this.opts.pos + 2].click(); + }, 0); + }; + + this.menuKeyDown = e => { + if (e.code === 'Enter' || e.code === 'Space') { + this.insertBlock(e); + } else if (e.code !== 'Tab') { + this.opened = false; + this.parent.update(); + } else { + e.preventUpdate(); + } + }; diff --git a/src/riotTags/catnip/catnip-js-editor.tag b/src/riotTags/catnip/catnip-js-editor.tag new file mode 100644 index 000000000..0459e189f --- /dev/null +++ b/src/riotTags/catnip/catnip-js-editor.tag @@ -0,0 +1,52 @@ +//- + A JavaScript code editor with no minimap to be put into catnip blocks. + + @attribute values (Record) + An object that has all the block's values. It must have values[key] preset. + @attribute key (string) + The key to modify in block's values. + @attribute [readonly] (atomic) + +catnip-js-editor + .catnip-js-editor-aCodeEditor(ref="codebox") + script. + const editorOptions = { + language: 'typescript', + lockWrapper: true, + minimap: { + autohide: true + }, + links: false + }; + const layout = () => { + setTimeout(() => { + if (this.codeEditor) { + this.codeEditor.layout(); + } + }, 150); + }; + this.on('mount', () => { + setTimeout(() => { + this.codeEditor = window.setupCodeEditor( + this.refs.codebox, + Object.assign({}, editorOptions, { + readOnly: Boolean(this.opts.readonly), + value: !this.opts.readonly ? this.opts.values[this.opts.key] : '// ...', + wrapper: ['import * as pixiTemp from \'bundles/pixi.js/src/index\'; function catnipJs(this: pixiTemp.DisplayObject & Record) {', '}'] + }) + ); + this.codeEditor.onDidChangeModelContent(() => { + this.opts.values[this.opts.key] = this.codeEditor.getPureValue(); + }); + window.addEventListener('resize', layout); + }, 0); + }); + window.orders.on('forceCodeEditorLayout', layout); + this.on('unmount', () => { + window.removeEventListener('resize', layout); + window.orders.off('forceCodeEditorLayout', layout); + // Manually destroy code editors, to free memory + if (this.codeEditor) { + this.codeEditor.dispose(); + } + }); diff --git a/src/riotTags/catnip/catnip-library.tag b/src/riotTags/catnip/catnip-library.tag new file mode 100644 index 000000000..620e3bb6f --- /dev/null +++ b/src/riotTags/catnip/catnip-library.tag @@ -0,0 +1,472 @@ +// "Properties" category +// Has a custom block display and also appears in two cases, thus moved into a mixin +mixin propsVars + h3 + | {voc.properties} + hover-hint(text="{voc.propertiesHint}") + // Properties of the edited asset + catnip-block( + each="{prop in opts.props}" + if="{!opts.scriptmode}" + block="{({lib: 'core.hidden', code: 'property', values: {variableName: prop}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + oncontextmenu="{parent.onContextMenu}" + data-blockcode="property" + data-blockvalue="{prop}" + ) + // Properties inherited from behaviors this asset uses + catnip-block( + each="{bhprop in opts.behaviorprops}" + if="{!opts.scriptmode}" + block="{({lib: 'core.hidden', code: 'behavior property', values: {variableName: bhprop}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + data-blockcode="behavior property" + data-blockvalue="{bhprop}" + ) + // Script options (exclusive for script assets) + catnip-block( + if="{opts.scriptmode}" + block="{({lib: 'core.hidden', code: 'script options', values: {}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + data-blockcode="script options" + ) + br(if="{opts.scriptmode || opts.props.length || opts.behaviorprops.length}") + button.inline(onclick="{promptNewProperty}" if="{!opts.scriptmode}") + svg.feather + use(href="#plus") + span {voc.createNewProperty} + h3 + | {voc.variables} + hover-hint(text="{voc.variablesHint}") + // Variables + catnip-block( + each="{variable in opts.variables}" + block="{({lib: 'core.hidden', code: 'variable', values: {variableName: variable}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + oncontextmenu="{parent.onContextMenu}" + data-blockcode="variable" + data-blockvalue="{variable}" + ) + br(if="{opts.variables.length}") + // Event variables (if any) + catnip-block( + each="{eventvar in opts.eventvars}" + block="{({lib: 'core.hidden', code: 'event variable', values: {variableName: eventvar}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + data-blockcode="event variable" + data-blockvalue="{eventvar}" + ) + br(if="{opts.eventvars.length}") + button.inline(onclick="{promptNewVariable}") + svg.feather + use(href="#plus") + span {voc.createNewVariable} + + // Global variables + h3 + | {voc.globalVariables} + hover-hint(text="{voc.globalVariablesHint}") + catnip-block( + each="{globalvar in (currentProject.globalVars ?? [])}" + block="{({lib: 'core.hidden', code: 'global variable', values: {variableName: globalvar}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + oncontextmenu="{parent.onContextMenu}" + data-blockcode="global variable" + data-blockvalue="{globalvar}" + ) + br(if="{currentProject.globalVars.length}") + button.inline(onclick="{promptNewGlobalVariable}") + svg.feather + use(href="#plus") + span {voc.createNewGlobalVariable} + br + br + // Blocks pulled from stdLib + catnip-block( + each="{block in categories[0].items}" + block="{({lib: block.lib, code: block.code, values: {}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + ) + // Blocks for content types + br(if="{currentProject.contentTypes.length}") + catnip-block( + each="{contentType in currentProject.contentTypes}" + if="{!opts.scriptmode}" + block="{({lib: 'core.hidden', code: 'content type', values: {variableName: contentType.name}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onVarDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + data-blockcode="content type" + data-blockvalue="{contentType.name}" + ) + +//- + @attribute variables (string[]) + Array of variable names in this asset + @attribute props (string[]) + Array of property names in this asset + @attribute behaviorprops (string[]) + Array of property names provided by behaviors + @attribute eventvars (string[]) + Array of variable names provided by the current event + @attribute [scriptmode] (atomic) + Disables some features of the editor that don't make sense for script asset type ("this" keyword and properties). + @attribute onrename (riot function) + A function that is called when a user renames a property or a variable. + The function is provided with an object of this structure: + { + type: 'prop' | 'variable', + from: string, // old name of the property/variable + to: string // new name of the prop/var + } + The called function must apply the following changes to all the relevant blocks in an asset. +catnip-library(class="{opts.class}").flexrow + .flexfix + .aSearchWrap.flexfix-header + input.wide(type="text" oninput="{search}" ref="search" onclick="{selectSearch}" value="{searchVal}") + svg.feather + use(href="#search") + // Scrollable layout + .flexfix-body(show="{!searchVal.trim()}" ref="mainpanel" if="{localStorage.scrollableCatnipLibrary === 'on'}") + +propsVars() + .aSpacer + .center(if="{!showLibrary}") + svg.feather.rotate + use(href="#more-horizontal") + virtual(each="{cat in categories}" if="{showLibrary && !cat.hidden}") + h3(ref="categories") + svg.feather + use(href="#{cat.icon || 'grid-random'}") + span {voc.coreLibs[cat.i18nKey] || cat.name} + catnip-block( + each="{block in cat.items}" + block="{({lib: block.lib, code: block.code, values: {}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.parent.onDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + ) + // Paged layout (default) + // Properties category + .flexfix-body(show="{!searchVal.trim()}" ref="mainpanel" if="{localStorage.scrollableCatnipLibrary !== 'on' && tab === 'propsVars'}") + +propsVars() + // Current category + .flexfix-body(show="{!searchVal.trim()}" ref="mainpanel" if="{localStorage.scrollableCatnipLibrary !== 'on' && tab !== 'propsVars'}") + h3(ref="categories" if="{!tab.hidden}") + svg.feather + use(href="#{tab.icon || 'grid-random'}") + span {voc.coreLibs[tab.i18nKey] || tab.name} + catnip-block( + each="{block in tab.items}" + block="{({lib: block.lib, code: block.code, values: {}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onDragStart}" + draggable="draggable" + ondragend="{parent.resetTarget}" + ) + // Searched blocks + .flexfix-body(if="{searchVal.trim() && searchResults.length}") + catnip-block( + each="{block in searchResults}" + block="{({lib: block.lib, code: block.code, values: {}})}" + dragoutonly="dragoutonly" + readonly="readonly" + ondragstart="{parent.onDragStart}" + draggable="draggable" + ondragend="{resetTarget}" + ) + .flexfix-body.center(if="{searchVal.trim() && !searchResults.length}") + svg.anIllustration + use(xlink:href="data/img/weirdFoldersIllustration.svg#illustration") + br + span {vocGlob.nothingToShowFiller} + // Sidebar buttons to navigate between categories + .catnip-library-CategoriesShortcuts.aButtonGroup.vertical + .catnip-library-aShortcut.button( + title="{voc.properties}" + onclick="{localStorage.scrollableCatnipLibrary === 'on' ? scrollToTop : selectTab('propsVars')}" + class="{active: tab === 'propsVars'}" + ) + svg.feather.a + use(href="#archive") + div {voc.properties} + .catnip-library-aShortcut.button( + each="{cat, ind in categories}" if="{!cat.hidden && cat.items.length}" + title="{cat.name}" + onclick="{localStorage.scrollableCatnipLibrary === 'on' ? scrollToCat : selectTab(cat)}" + class="{active: tab === cat}" + ) + svg.feather.a + use(href="#{cat.icon || 'grid-random'}") + div {voc.coreLibs[cat.i18nKey] || cat.name} + context-menu(if="{contextVarName}" menu="{contextMenu}" ref="menu") + script. + this.namespace = 'catnip'; + this.mixin(require('src/node_requires/riotMixins/voc').default); + + // Delay the display of the library so the editor loads in quicker + this.showLibrary = false; + this.on('mount', () => { + setTimeout(() => { + this.showLibrary = true; + this.update(); + }); + }); + + const {blocksLibrary, startBlocksTransmit, getDeclaration, setSuggestedTarget, searchBlocks, blockFromDeclaration, emptyTexture} = require('src/node_requires/catnip'); + this.categories = blocksLibrary; + + this.onDragStart = e => { + const {block} = e.item; + const declaration = getDeclaration(block.lib, block.code); + e.dataTransfer.dropEffect = 'move'; + e.dataTransfer.setData(`ctjsblocks/${declaration.type}`, 'hello uwu'); + e.dataTransfer.setDragImage(emptyTexture, 0, 0); + startBlocksTransmit([blockFromDeclaration(declaration)], this.opts.blocks, false, true); + const bounds = e.target.getBoundingClientRect(); + window.signals.trigger( + 'blockTransmissionStart', + e, + e.target.outerHTML, + bounds.left - e.clientX, + bounds.top - e.clientY + ); + }; + this.onVarDragStart = e => { + e.dataTransfer.dropEffect = 'move'; + e.dataTransfer.setData('ctjsblocks/computed', 'hello uwu'); + e.dataTransfer.setDragImage(emptyTexture, 0, 0); + const bounds = e.target.getBoundingClientRect(); + const code = e.currentTarget.getAttribute('data-blockcode'); + const value = e.currentTarget.getAttribute('data-blockvalue'); + startBlocksTransmit([{ + lib: 'core.hidden', + code, + values: { + variableName: value + } + }], this.opts.blocks, false, true); + window.signals.trigger( + 'blockTransmissionStart', + e, + e.target.outerHTML, + bounds.left - e.clientX, + bounds.top - e.clientY + ); + }; + this.resetTarget = () => { + setSuggestedTarget(); + }; + + this.tab = 'propsVars'; + this.selectTab = tab => () => { + this.tab = tab; + if (this.searchVal.trim()) { + this.searchVal = ''; + } + }; + + const ease = x => 1 - ((1 - x) ** 5); + this.scrollToCat = e => { + if (this.searchVal.trim()) { + this.searchVal = ''; + this.update(); + } + const {ind} = e.item; + let a = 0; + const timePrev = Number(new Date()), + startScroll = this.refs.mainpanel.scrollTop, + targetScroll = this.refs.categories[ind].offsetTop; + const scrollToCategory = () => { + a += (Number(new Date()) - timePrev) / 1000; + if (a > 1) { + a = 1; + } else { + window.requestAnimationFrame(scrollToCategory); + } + const b = ease(a); + this.refs.mainpanel.scrollTo(0, startScroll * (1 - b) + targetScroll * b); + }; + scrollToCategory(); + }; + this.scrollToTop = () => { + if (this.searchVal.trim()) { + this.searchVal = ''; + this.update(); + } + let a = 0; + const timePrev = Number(new Date()), + startScroll = this.refs.mainpanel.scrollTop, + targetScroll = 0; + const scrollToCategory = () => { + a += (Number(new Date()) - timePrev) / 1000; + if (a > 1) { + a = 1; + } else { + window.requestAnimationFrame(scrollToCategory); + } + const b = ease(a); + this.refs.mainpanel.scrollTo(0, startScroll * (1 - b) + targetScroll * b); + }; + scrollToCategory(); + }; + + this.searchVal = ''; + this.search = e => { + this.searchVal = e.target.value; + if (this.searchVal.trim()) { + this.searchResults = searchBlocks(this.searchVal.trim()); + } + }; + this.selectSearch = () => { + this.refs.search.select(); + }; + + const variableNamePattern = /^[a-zA-Z_][a-zA-Z_0-9]*$/; + this.promptNewProperty = () => { + window.alertify.prompt(this.voc.newPropertyPrompt) + .then(e => { + const val = e.inputValue; + if (!val || !val.trim()) { + return; + } + this.opts.props.push(val.trim()); + this.update(); + }); + }; + this.promptNewVariable = () => { + window.alertify.prompt(this.voc.newVariablePrompt) + .then(e => { + let val = e.inputValue; + if (!val || !val.trim()) { + return; + } + val = val.trim(); + if (!variableNamePattern.exec(val)) { + window.alertify.error(this.voc.invalidVarNameError); + return; + } + this.opts.variables.push(val.trim()); + this.update(); + }); + }; + this.promptNewGlobalVariable = () => { + window.alertify.prompt(this.voc.newGlobalVariablePrompt) + .then(e => { + let val = e.inputValue; + if (!val || !val.trim()) { + return; + } + val = val.trim(); + if (!variableNamePattern.exec(val)) { + window.alertify.error(this.voc.invalidVarNameError); + return; + } + window.currentProject.globalVars ??= []; + window.currentProject.globalVars.push(val); + this.update(); + }); + }; + this.contextVarName = false; + this.onContextMenu = e => { + e.preventDefault(); + e.stopPropagation(); + this.contextVarName = e.currentTarget.getAttribute('data-blockvalue'); + this.contextType = e.currentTarget.getAttribute('data-blockcode'); + this.update(); + this.refs.menu.popup(e.clientX, e.clientY); + }; + this.contextMenu = { + opened: true, + items: [{ + label: this.vocGlob.rename, + icon: 'edit', + click: () => { + window.alertify.defaultValue(this.contextVarName); + window.alertify.prompt(this.contextType === 'property' ? this.voc.renamePropertyPrompt : this.voc.renameVariablePrompt) + .then(e => { + window.alertify.reset(); + let val = e.inputValue; + if (!val || !val.trim()) { + return; + } + val = val.trim(); + if (this.contextType !== 'global variable') { + const editedArray = this.contextType === 'property' ? this.opts.props : this.opts.variables; + const ind = editedArray.indexOf(this.contextVarName); + editedArray.splice(ind, 1, val); + this.opts.onrename({ + type: this.contextType, + from: this.contextVarName, + to: val + }); + } else { + // Global variables need to be patched across all the project; + // this is done by a listener in src/node_requires/catnip/index + window.alertify.log(this.voc.renamingAcrossProject); + window.orders.trigger('catnipGlobalVarRename', { + type: 'global variable', + from: this.contextVarName, + to: val + }); + const ind = window.currentProject.globalVars.indexOf(this.contextVarName); + window.currentProject.globalVars.splice(ind, 1, val); + this.update(); + } + }); + } + }, { + type: 'separator' + }, { + label: this.vocGlob.delete, + icon: 'trash', + click: () => { + if (this.contextType === 'property') { + this.opts.props.splice(this.opts.props.indexOf(this.contextVarName), 1); + } else if (this.contextType === 'variable') { + this.opts.variables.splice(this.opts.variables.indexOf(this.contextVarName), 1); + } else { + const arr = window.currentProject.globalVars; + arr.splice(arr.indexOf(this.contextVarName, 1)); + } + this.contextVarName = false; + this.update(); + } + }] + }; + + if (!this.opts.onrename) { + throw new Error('[catnip-library] `onrename` attribute was not specified.'); + } diff --git a/src/riotTags/coding-language-selector.tag b/src/riotTags/coding-language-selector.tag index c947c5014..d4c8a23a1 100644 --- a/src/riotTags/coding-language-selector.tag +++ b/src/riotTags/coding-language-selector.tag @@ -4,13 +4,13 @@ coding-language-selector .flexfix-body.pad h1.nmt.npt {voc.chooseLanguageHeader} p {voc.chooseLanguageExplanation} - .flexrow - .fifty.npl + .flexrow.coding-language-selector-aComparisonTable + div h2.nmt svg.icon use(xlink:href="#coffeescript") span CoffeeScript - p {voc.coffeeScriptDescription} + p.nmt {voc.coffeeScriptDescription} pre code. if health <= 0 and not invulnerable @@ -19,12 +19,12 @@ coding-language-selector svg.icon use(xlink:href="#coffeescript") span {voc.pickCoffeeScript} - .fifty.npr + div h2.nmt svg.icon use(xlink:href="#javascript") span {voc.jsAndTs} - p {voc.jsTsDescription} + p.nmt {voc.jsTsDescription} pre code. if (health <= 0 && !invulnerable) \{ @@ -34,6 +34,48 @@ coding-language-selector svg.icon use(xlink:href="#javascript") span {voc.pickJsTs} + div + h2.nmt + svg.feather + use(xlink:href="#catnip") + span {voc.catnip} + p.nmt {voc.catnipDescription} + .catnip-block.command + svg.feather + use(xlink:href="#help-circle") + span.catnip-block-aTextLabel {vocFull.catnip.blockDisplayNames['if else branch']} + .catnip-block.computed.boolean + .catnip-block.computed.boolean + .catnip-block.computed.wildcard.number.userdefined + svg.feather + use(xlink:href="#archive") + span.catnip-block-aTextLabel health + span.catnip-block-aTextLabel ≤ + input.catnip-block-aConstantInput.number(readonly="readonly" value="0" style="width: 3ch;" type="text") + span.catnip-block-aTextLabel {vocFull.catnip.blockLabels.and} + .catnip-block.computed.boolean + span.catnip-block-aTextLabel {vocFull.catnip.blockDisplayNames['NOT logic operator']} + .catnip-block.computed.wildcard.boolean.userdefined + svg.feather + use(xlink:href="#archive") + span.catnip-block-aTextLabel invulnerable + .catnip-block-Blocks(ref="blocksDrop") + .catnip-block.command + svg.feather + use(xlink:href="#template") + span.catnip-block-aTextLabel {vocFull.catnip.blockNames['kill copy']} + svg.feather + use(xlink:href="#alert-circle") + span.catnip-block-aTextLabel {vocFull.catnip.blockLabels.else} + .catnip-block-Blocks(ref="blocksDrop") + .catnip-block-aBlockPlaceholder + svg.feather + use(xlink:href="#thumbs-up") + span.catnip-block-aTextLabel {vocFull.catnip.placeholders.doNothing} + button(class="{active: selection === 'catnip'}" onclick="{selectLanguage('catnip')}") + svg.feather + use(xlink:href="#catnip") + span {voc.pickCatnip} .inset.flexfix-footer.flexrow button.nogrow(onclick="{cancel}") span {vocGlob.cancel} @@ -44,7 +86,7 @@ coding-language-selector span {vocGlob.apply} script. this.namespace = 'languageSelector'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.selection = false; diff --git a/src/riotTags/debugger/debugger-modal.tag b/src/riotTags/debugger/debugger-modal.tag index c8d54664e..a0cb62bcd 100644 --- a/src/riotTags/debugger/debugger-modal.tag +++ b/src/riotTags/debugger/debugger-modal.tag @@ -1,10 +1,11 @@ debugger-modal.aView .center.aQRList - .aQR(each="{interfaces}") - div.center(ref="qr" data-address="{address}") - b {name} + .aQR(each="{interface in interfaces}") + .center(if="{qrCodes.has(interface)}") + img(src="{qrCodes.get(interface)}") + b {interface.name} br - code.selectable {address} + code.selectable {interface.address} script. let port = 0; if (!this.opts.params) { @@ -22,6 +23,8 @@ debugger-modal.aView var os = require('os'); var interfaces = os.networkInterfaces(); + const {getSVG} = require('qreator/lib/svg'); + this.qrCodes = new WeakMap(); // https://stackoverflow.com/a/8440736 Object.keys(interfaces).forEach(ifname => { var alias = 0; @@ -46,25 +49,23 @@ debugger-modal.aView ++alias; }); }); - - const palette = { - Day: ['#446adb', '#ffffff'], - Night: ['#121822', '#44dbb5'], - Horizon: ['#1C1E26', '#E95378'] - }; - this.on('mount', () => { - setTimeout(() => { - for (const div of (Array.isArray(this.refs.qr) ? this.refs.qr : [this.refs.qr])) { - const themedColors = palette[localStorage.UItheme]; - // eslint-disable-next-line no-new - new QRCode(div, { - text: div.getAttribute('data-address'), - width: 256, - height: 256, - colorDark: themedColors ? themedColors[0] : palette.Day[0], - colorLight: themedColors ? themedColors[1] : palette.Day[1], - correctLevel: QRCode.CorrectLevel.H - }); - } - }, 0); + for (const interface of this.interfaces) { + getSVG(interface.address, { + color: '#000000', + bgColor: '#ffffff', + margin: 1 + }).then(contents => { + const blob = new Blob([contents], { + type: 'image/svg+xml' + }); + const url = URL.createObjectURL(blob); + this.qrCodes.set(interface, url); + this.update(); + }); + } + this.on('unmount', () => { + for (const interface of this.interfaces) { + URL.revokeObjectURL(this.qrCodes.get(interface)); + this.qrCodes.delete(interface); + } }); diff --git a/src/riotTags/debugger/debugger-screen-multiwindow.tag b/src/riotTags/debugger/debugger-screen-multiwindow.tag new file mode 100644 index 000000000..ecfdf7c69 --- /dev/null +++ b/src/riotTags/debugger/debugger-screen-multiwindow.tag @@ -0,0 +1,171 @@ +// + Exposes this.reloadGame +debugger-screen-multiwindow.flexcol(class="{opts.class}") + webview.tall#thePreview( + ref="gameView" + partition="persist:trusted" + allownw nwfaketop + ) + .aDebuggerToolbar(class="horizontal {tight: window.innerWidth < 1000}") + .debugger-toolbar-aButton(onclick="{togglePause}" title="{gamePaused? voc.resume : voc.pause}") + svg.feather + use(xlink:href="#{gamePaused? 'play' : 'pause'}") + span {gamePaused? voc.resume : voc.pause} + .debugger-toolbar-aButton(onclick="{restartGame}" title="{voc.restartGame}") + svg.feather + use(xlink:href="#rotate-cw") + span {voc.restartGame} + .debugger-toolbar-aButton(onclick="{restartRoom}" title="{voc.restartRoom}") + svg.feather + use(xlink:href="#room-reload") + span {voc.restartRoom} + .debugger-toolbar-aButton(onclick="{displayRoomSelector}" title="{voc.switchRoom}") + svg.feather + use(xlink:href="#room-switch") + span {voc.switchRoom} + + .debugger-toolbar-aDivider.nogrow + + .debugger-toolbar-aButton.nogrow(onclick="{makeScreenshot}" title="{voc.screenshot}") + svg.feather + use(xlink:href="#camera") + .debugger-toolbar-aButton.nogrow(onclick="{openQrCodes}" title="{voc.links}") + svg.feather + use(xlink:href="#smartphone") + .debugger-toolbar-aButton.nogrow(onclick="{openExternal}" title="{voc.openExternal}") + svg.feather + use(xlink:href="#external-link") + debugger-modal(if="{showNetworkingModal}" params="{opts.params}") + script. + this.namespace = 'debuggerToolbar'; + this.mixin(require('src/node_requires/riotMixins/voc').default); + + this.showNetworkingModal = false; + + const passedParams = this.opts.params; + if (passedParams.title) { + document.title = passedParams.title + ' — ct.js'; + } + + const refresh = () => this.update(); + /* Bootstrap preview and debug views */ + this.on('mount', () => { + this.refs.gameView.addEventListener('permissionrequest', function permissionrequest(e) { + if (['fullscreen', 'media', 'download', 'pointerLock'].indexOf(e.permission) !== -1) { + e.request.allow(); + } + }); + this.refs.gameView.addEventListener('contentload', () => { + this.refs.gameView.showDevTools(true); + this.refs.gameView.focus(); + }, { + once: true + }); + this.refs.gameView.setAttribute('src', passedParams.link); + window.addEventListener('resize', refresh); + }); + this.on('unmount', () => { + window.removeEventListener('resize', refresh); + }); + + /* Helper methods for buttons */ + this.switchRoom = room => { + this.refs.gameView.executeScript({ + code: `rooms.switch('${room}')`, + mainWorld: true + }); + }; + this.displayRoomSelector = e => { + const menu = new nw.Menu(); + // Query for in-game rooms + this.refs.gameView.executeScript({ + code: 'JSON.stringify(Object.keys(rooms.templates));', + mainWorld: true + }, rooms => { + JSON.parse(rooms).map(room => ({ + label: room, + click: () => { + this.switchRoom(room); + } + })) + .forEach(entry => menu.append(new nw.MenuItem(entry))); + menu.popup(e.clientX, e.clientY); + }); + }; + + /* Buttons' event listeners */ + this.togglePause = () => { + this.refs.gameView.executeScript({ + code: ` + if (pixiApp.ticker.started) { + pixiApp.ticker.stop(); + } else { + pixiApp.ticker.start(); + } + !pixiApp.ticker.started; + `, + mainWorld: true + }, paused => { + if (paused === 'false' || paused === false) { + this.gamePaused = false; + } else { + this.gamePaused = true; + } + this.update(); + }); + }; + this.restartGame = () => { + this.refs.gameView.reload(); + }; + this.restartRoom = () => { + this.refs.gameView.executeScript({ + code: 'rooms.switch(rooms.current.name);', + mainWorld: true + }); + }; + this.makeScreenshot = () => { + this.refs.gameView.executeScript({ + code: ` + var renderTexture = PIXI.RenderTexture.create({ + width: pixiApp.renderer.width, + height: pixiApp.renderer.height + }); + pixiApp.renderer.render(pixiApp.stage, renderTexture); + var canvas = pixiApp.renderer.extract.canvas(renderTexture); + var dataURL = canvas.toDataURL('image/png'); + dataURL; + `, + mainWorld: true + }, dataURL => { + [dataURL] = dataURL; + window.showSaveDialog({ + filter: 'image/png', + defaultName: `${passedParams.title || 'Screenshot'}.png` + }).then(filename => { + const fs = require('fs'); + if (!filename) { + return; + } + const screenshotBase64 = dataURL.replace(/^data:image\/\w+;base64,/, ''); + const buf = Buffer.from(screenshotBase64, 'base64'); + const stream = fs.createWriteStream(filename); + stream.end(buf); + }); + }); + }; + this.toggleFullscreen = () => { + this.gameFullscreen = !this.gameFullscreen; + if (this.gameFullscreen) { + this.previewWindow.enterFullscreen(); + } else { + this.previewWindow.leaveFullscreen(); + } + }; + this.openQrCodes = () => { + this.showNetworkingModal = !this.showNetworkingModal; + }; + this.openExternal = () => { + if (passedParams.link) { + nw.Shell.openExternal(passedParams.link); + } + }; diff --git a/src/riotTags/debugger/debugger-screen-embedded.tag b/src/riotTags/debugger/debugger-screen-split.tag similarity index 98% rename from src/riotTags/debugger/debugger-screen-embedded.tag rename to src/riotTags/debugger/debugger-screen-split.tag index 3e6c59324..eab691782 100644 --- a/src/riotTags/debugger/debugger-screen-embedded.tag +++ b/src/riotTags/debugger/debugger-screen-split.tag @@ -1,6 +1,6 @@ // Exposes this.reloadGame -debugger-screen-embedded(class="{opts.class} {flexrow: verticalLayout, flexcol: !verticalLayout}") +debugger-screen-split(class="{opts.class} {flexrow: verticalLayout, flexcol: !verticalLayout}") webview.tall#thePreview( ref="gameView" partition="persist:trusted" @@ -61,7 +61,7 @@ debugger-screen-embedded(class="{opts.class} {flexrow: verticalLayout, flexcol: debugger-modal(if="{showNetworkingModal}" params="{opts.params}") script. this.namespace = 'debuggerToolbar'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.showNetworkingModal = false; diff --git a/src/riotTags/dnd-processor.tag b/src/riotTags/dnd-processor.tag index 48acfc656..e5e40c3a1 100644 --- a/src/riotTags/dnd-processor.tag +++ b/src/riotTags/dnd-processor.tag @@ -10,9 +10,9 @@ dnd-processor onchange="{dndImport}" ) script. - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.dndImport = e => { - const {createAsset} = require('./data/node_requires/resources'); + const {createAsset} = require('src/node_requires/resources'); const files = [...e.target.files].map(file => file.path); for (let i = 0; i < files.length; i++) { if (/\.(jpg|gif|png|jpeg)/gi.test(files[i])) { diff --git a/src/riotTags/docs-panel.tag b/src/riotTags/docs-panel.tag index 50e34b79b..c9e8b30f2 100644 --- a/src/riotTags/docs-panel.tag +++ b/src/riotTags/docs-panel.tag @@ -20,15 +20,15 @@ docs-panel raw(ref="raw" content="{docContent}") script. this.namespace = 'docsPanel'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.docs = []; this.docContent = ''; this.refreshDocs = async () => { - const modules = require('./data/node_requires/resources/modules'); + const modules = require('src/node_requires/resources/modules'); const catmods = (await modules.loadModules()) - .filter(module => module.name in global.currentProject.libs); + .filter(module => module.name in window.currentProject.libs); const docOrders = catmods.map(modules.getModuleDocStructure); const unfilteredDocs = await Promise.all(docOrders); this.docs = []; diff --git a/src/riotTags/editors/behavior-editor.tag b/src/riotTags/editors/behavior-editor.tag index cd4603e1d..fe0747c6a 100644 --- a/src/riotTags/editors/behavior-editor.tag +++ b/src/riotTags/editors/behavior-editor.tag @@ -14,6 +14,7 @@ behavior-editor.aPanel.aView.flexrow onchanged="{changeCodeTab}" currentevent="{currentSheet}" warnbehaviors="yes" + isbehavior="yes" ).tall .flexfix-footer .aSpacer @@ -25,18 +26,23 @@ behavior-editor.aPanel.aView.flexrow .tabwrap.tall(style="position: relative" if="{currentSheet !== 'fields'}") div .tabbed.noborder - code-editor-scriptable(event="{currentSheet}" entitytype="{asset.behaviorType}") + code-editor-scriptable(event="{currentSheet}" asset="{asset}") .aPanel.tall.pad(if="{currentSheet === 'fields'}") h1 {voc.customFields} p {voc.customFieldsDescription} extensions-editor(customextends="{extends}" entity="{asset}" compact="true" onchanged="{() => this.update()}") + .aSpacer(if="{window.currentProject.language === 'typescript'}") + label.block(if="{window.currentProject.language === 'typescript'}") + b {vocFull.scriptables.typedefs} + hover-hint(text="{vocFull.scriptables.typedefsHint}") + textarea.code.wide(style="min-height: 10rem;" value="{asset.extendTypes}" onchange="{wire('asset.extendTypes')}") script. this.namespace = 'behaviorEditor'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); - this.extends = require('./data/node_requires/resources/content').getFieldsExtends(); + this.extends = require('src/node_requires/resources/content').getFieldsExtends(); this.currentSheet = this.asset.events[0] || 'fields'; this.changeCodeTab = scriptableEvent => { diff --git a/src/riotTags/editors/emitter-tandem-editor/emitter-editor.tag b/src/riotTags/editors/emitter-tandem-editor/emitter-editor.tag index 7bcfd2f2a..5967258d7 100644 --- a/src/riotTags/editors/emitter-tandem-editor/emitter-editor.tag +++ b/src/riotTags/editors/emitter-tandem-editor/emitter-editor.tag @@ -425,19 +425,17 @@ emitter-editor.aPanel.pad.nb // Rectangles label.fifty.npt.npl.npb.nmt b {parent.voc.width} - //- oninput="{parent.setRectWidth}" input.wide( type="number" step="8" min="-4096" max="4096" value="{parent.spawnBh.config.data.w}" - oninput="{parent.wireAndReset('spawnBh.config.data.w')}" + oninput="{parent.setRectWidth}" ) label.fifty.npt.npr.npb.nmt b {parent.voc.height} - //- oninput="{parent.setRectHeight}" input.wide( type="number" step="8" min="-4096" max="4096" value="{parent.spawnBh.config.data.h}" - oninput="{parent.wireAndReset('spawnBh.config.data.h')}" + oninput="{parent.setRectHeight}" ) .clear fieldset @@ -467,8 +465,8 @@ emitter-editor.aPanel.pad.nb .clear script. this.namespace = 'particleEmitters'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); const particles = require('@pixi/particle-emitter'); @@ -494,7 +492,7 @@ emitter-editor.aPanel.pad.nb }); this.updateShortcuts(); - const {getThumbnail, getById} = require('./data/node_requires/resources'); + const {getThumbnail, getById} = require('src/node_requires/resources'); this.getPreview = () => { if (this.opts.emitter.texture === -1) { return '/data/img/unknown.png'; @@ -700,6 +698,19 @@ emitter-editor.aPanel.pad.nb window.signals.trigger('emitterResetRequest'); }; + // Rectangles are positioned from their top-left corner, + // so we shift them by half-width/half-height so the spawn zone is centered instead + this.setRectWidth = e => { + this.spawnBh.config.data.w = Number(e.target.value); + this.spawnBh.config.data.x = -this.spawnBh.config.data.w / 2; + window.signals.trigger('emitterResetRequest'); + }; + this.setRectHeight = e => { + this.spawnBh.config.data.h = Number(e.target.value); + this.spawnBh.config.data.y = -this.spawnBh.config.data.h / 2; + window.signals.trigger('emitterResetRequest'); + }; + this.saveSectionState = (opened, sectionTag) => { if (opened) { if (!this.opts.emitter.openedTabs.includes(sectionTag.opts.key)) { diff --git a/src/riotTags/editors/emitter-tandem-editor/emitter-tandem-editor.tag b/src/riotTags/editors/emitter-tandem-editor/emitter-tandem-editor.tag index 0afe94aa3..23478a462 100644 --- a/src/riotTags/editors/emitter-tandem-editor/emitter-tandem-editor.tag +++ b/src/riotTags/editors/emitter-tandem-editor/emitter-tandem-editor.tag @@ -64,9 +64,9 @@ emitter-tandem-editor.aPanel.aView.flexrow(class="{opts.class}") const {particles} = PIXI; this.namespace = 'particleEmitters'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); this.previewColor = localStorage.tandemEditorPreviewBg || '#cccccc'; this.complete = false; @@ -84,7 +84,7 @@ emitter-tandem-editor.aPanel.aView.flexrow(class="{opts.class}") // Creates a new emitter this.spawnEmitter = (emitterData, container) => { - const {getPixiTexture} = require('./data/node_requires/resources/textures'); + const {getPixiTexture} = require('src/node_requires/resources/textures'); const textures = getPixiTexture(emitterData.texture, null, true); const settings = { ...emitterData.settings, @@ -199,7 +199,7 @@ emitter-tandem-editor.aPanel.aView.flexrow(class="{opts.class}") this.updateGrid(); } if (this.asset.previewTexture && this.asset.previewTexture !== -1) { - const textures = require('./data/node_requires/resources/textures'); + const textures = require('src/node_requires/resources/textures'); const pivot = textures.getTexturePivot(this.asset.previewTexture); [this.previewTexture.anchor.x, this.previewTexture.anchor.y] = pivot; this.previewTexture.texture = textures.getPixiTexture(this.asset.previewTexture, 0); @@ -277,18 +277,25 @@ emitter-tandem-editor.aPanel.aView.flexrow(class="{opts.class}") ], dark ? '#ddd' : '#222'); }; + const tabSwitchHandler = tab => { + if (tab?.uid === this.asset.uid) { + setTimeout(this.updatePreviewLayout, 0); + } + }; this.on('mount', () => { window.addEventListener('resize', this.updatePreviewLayout); window.signals.on('emitterResetRequest', this.resetEmitters); + window.signals.on('globalTabChanged', tabSwitchHandler); }); this.on('unmount', () => { window.removeEventListener('resize', this.updatePreviewLayout); window.signals.off('emitterResetRequest', this.resetEmitters); + window.signals.off('globalTabChanged', tabSwitchHandler); }); this.on('mount', () => { const box = this.refs.preview.getBoundingClientRect(); - this.gridGen = require('./data/node_requires/generators/gridTexture').generatePixiTextureGrid; + this.gridGen = require('src/node_requires/generators/gridTexture').generatePixiTextureGrid; this.grid = new PIXI.TilingSprite(this.gridGen()); this.pixiApp = new PIXI.Application({ @@ -296,9 +303,9 @@ emitter-tandem-editor.aPanel.aView.flexrow(class="{opts.class}") height: Math.round(box.height), sharedTicker: false, view: this.refs.canvas, - antialias: !global.currentProject.settings.rendering.pixelatedrender + antialias: !window.currentProject.settings.rendering.pixelatedrender }); - if (global.currentProject.settings.rendering.pixelatedrender) { + if (window.currentProject.settings.rendering.pixelatedrender) { PIXI.settings.ROUND_PIXELS = true; PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; } @@ -360,7 +367,7 @@ emitter-tandem-editor.aPanel.aView.flexrow(class="{opts.class}") UI events */ this.addEmitter = () => { - const defaultEmitter = require('./data/node_requires/resources/emitterTandems/defaultEmitter').get(); + const defaultEmitter = require('src/node_requires/resources/emitterTandems/defaultEmitter').get(); this.asset.emitters.push(defaultEmitter); this.resetEmitters(); }; diff --git a/src/riotTags/editors/room-editor/room-backgrounds-editor.tag b/src/riotTags/editors/room-editor/room-backgrounds-editor.tag index 6dcbd71b7..6e6279296 100644 --- a/src/riotTags/editors/room-editor/room-backgrounds-editor.tag +++ b/src/riotTags/editors/room-editor/room-backgrounds-editor.tag @@ -152,17 +152,17 @@ room-backgrounds-editor onselected="{onTextureSelected}" ) script. - const glob = require('./data/node_requires/glob'); + const glob = require('src/node_requires/glob'); this.glob = glob; - const {getTexturePreview} = require('./data/node_requires/resources/textures'); - const {getById} = require('./data/node_requires/resources'); + const {getTexturePreview} = require('src/node_requires/resources/textures'); + const {getById} = require('src/node_requires/resources'); this.getTextureFromId = id => getById('texture', id); this.getTexturePreview = getTexturePreview; this.pickingBackground = false; this.namespace = 'roomBackgrounds'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.tweak = (obj, field) => e => { const input = e.target; diff --git a/src/riotTags/editors/room-editor/room-editor.tag b/src/riotTags/editors/room-editor/room-editor.tag index 5a044633d..cf0f3d628 100644 --- a/src/riotTags/editors/room-editor/room-editor.tag +++ b/src/riotTags/editors/room-editor/room-editor.tag @@ -157,14 +157,14 @@ room-editor.aPanel.aView(data-hotkey-scope="{asset.uid}") script. const PIXI = require('pixi.js'); this.namespace = 'roomView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); // The default discardio's handler won't work as the room editor // writes most changes to this.asset only on save due to serialization/deserialization const defaultIsDirty = this.isDirty; this.isDirty = () => defaultIsDirty() || this.pixiEditor.history.stack.length; - const {validateBehaviorExtends} = require('./data/node_requires/resources/behaviors'); + const {validateBehaviorExtends} = require('src/node_requires/resources/behaviors'); validateBehaviorExtends(this.asset); this.room = this.asset; @@ -216,12 +216,14 @@ room-editor.aPanel.aView(data-hotkey-scope="{asset.uid}") if (this.asset.follow === deleted) { this.asset.follow = -1; cleaned = true; - console.log(`Removed a template with ID ${deleted} from a room ${this.asset.name}.`); + // eslint-disable-next-line no-console + console.debug(`Removed a template with ID ${deleted} from a room ${this.asset.name}.`); } if (this.asset.behaviors.find(b => b === deleted)) { this.asset.behaviors = this.asset.behaviors.filter(b => b !== deleted); cleaned = true; - console.log(`Removed a behavior with ID ${deleted} from a room ${this.asset.name}.`); + // eslint-disable-next-line no-console + console.debug(`Removed a behavior with ID ${deleted} from a room ${this.asset.name}.`); } if (cleaned) { this.update(); @@ -261,7 +263,7 @@ room-editor.aPanel.aView(data-hotkey-scope="{asset.uid}") this.pixiEditor.transformer.setup(); }; - const {setup} = require('./data/node_requires/roomEditor'); + const {setup} = require('src/node_requires/roomEditor'); this.on('mount', () => { setup(this.refs.canvas, this); // adds this.pixiEditor @@ -577,8 +579,8 @@ room-editor.aPanel.aView(data-hotkey-scope="{asset.uid}") this.refs.propertiesPanel.applyChanges(); } this.pixiEditor.serialize(); - const {getStartingRoom} = require('./data/node_requires/resources/rooms'); - const {RoomPreviewer} = require('./data/node_requires/resources/preview/room'); + const {getStartingRoom} = require('src/node_requires/resources/rooms'); + const {RoomPreviewer} = require('src/node_requires/resources/preview/room'); await RoomPreviewer.save(this.asset, this.asset.uid === getStartingRoom().uid); this.writeChanges(); }; @@ -592,14 +594,19 @@ room-editor.aPanel.aView(data-hotkey-scope="{asset.uid}") this.pixiEditor.resize(); }, 10); }; + const tabSwitchHandler = tab => { + if (tab?.uid === this.asset.uid) { + resizeEditor(); + } + }; const serialize = () => { this.pixiEditor.serialize(); }; this.on('mount', () => { window.signals.on('exportProject', serialize); - window.signals.on('roomsFocus', resizeEditor); + window.signals.on('globalTabChanged', tabSwitchHandler); }); this.on('unmount', () => { window.signals.off('exportProject', serialize); - window.signals.off('roomsFocus', resizeEditor); + window.signals.off('globalTabChanged', tabSwitchHandler); }); diff --git a/src/riotTags/editors/room-editor/room-entities-properties.tag b/src/riotTags/editors/room-editor/room-entities-properties.tag index c2618e6f3..26ed50bd5 100644 --- a/src/riotTags/editors/room-editor/room-entities-properties.tag +++ b/src/riotTags/editors/room-editor/room-entities-properties.tag @@ -27,8 +27,8 @@ room-entities-properties type="number" oninput="{wireAndApply('this.changes.basic.' + prop.key + '.x')}" onchange="{memorizeChanges}" - value="{changes.basic[prop.key].x}" - placeholder="{String(changes.basic[prop.key].x)}" + value="{changes.basic[prop.key] && changes.basic[prop.key].x}" + placeholder="{String(changes.basic[prop.key] && changes.basic[prop.key].x)}" step="{prop.step}" ) .aSpacer.noshrink.nogrow @@ -38,8 +38,8 @@ room-entities-properties type="number" oninput="{wireAndApply('this.changes.basic.' + prop.key + '.y')}" onchange="{memorizeChanges}" - value="{changes.basic[prop.key].y}" - placeholder="{String(changes.basic[prop.key].y)}" + value="{changes.basic[prop.key] && changes.basic[prop.key].y}" + placeholder="{String(changes.basic[prop.key] && changes.basic[prop.key].y)}" step="{prop.step}" ) .flexrow(if="{prop.type === 'slider'}") @@ -112,12 +112,12 @@ room-entities-properties option(value="180") script. this.namespace = 'roomView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); - this.Color = require('node_modules/pixi.js').Color; + this.Color = require('pixi.js').Color; - const {Copy} = require('./data/node_requires/roomEditor/entityClasses/Copy'); + const {Copy} = require('src/node_requires/roomEditor/entityClasses/Copy'); this.changes = false; diff --git a/src/riotTags/editors/room-editor/room-events-editor.tag b/src/riotTags/editors/room-editor/room-events-editor.tag index 6229e4c49..ef53966cf 100644 --- a/src/riotTags/editors/room-editor/room-events-editor.tag +++ b/src/riotTags/editors/room-editor/room-events-editor.tag @@ -19,19 +19,10 @@ room-events-editor.aDimmer.relative.pad.fadein(onclick="{tryClose}") use(xlink:href="#check") span {voc.done} .tabwrap.tall(style="position: relative") - code-editor-scriptable(event="{currentSheet}" entitytype="room" ref="codeeditor") - //ul.tabs.aNav.nogrow.noshrink - // li(onclick="{changeTab('javascript')}" class="{active: tab === 'javascript'}" title="JavaScript (Control+Q)" data-hotkey="Control+q") - // svg.feather - // use(xlink:href="#code") - // span {voc.create} - // li(onclick="{changeTab('blocks')}" class="{active: tab === 'blocks'}" title="Blurry (Control+W)" data-hotkey="Control+w") - // svg.feather - // use(xlink:href="#grid") - // span {voc.step} + code-editor-scriptable(event="{currentSheet}" asset="{opts.room}" ref="codeeditor") script. this.namespace = 'roomView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.room = this.opts.room; [this.currentSheet] = this.room.events; // can be undefined, this is ok @@ -40,12 +31,14 @@ room-events-editor.aDimmer.relative.pad.fadein(onclick="{tryClose}") this.tab = tab; }; - this.focusEditor = () => { - this.refs.codeeditor.codeEditor.focus(); + this.focusEditor = (tab) => { + if (tab?.uid === this.room.uid) { + this.refs.codeeditor.codeEditor.focus(); + } }; - window.signals.on('roomsFocus', this.focusEditor); + window.signals.on('globalTabChanged', this.focusEditor); this.on('unmount', () => { - window.signals.off('roomsFocus', this.focusEditor); + window.signals.off('globalTabChanged', this.focusEditor); }); this.changeCodeTab = scriptableEvent => { diff --git a/src/riotTags/editors/room-editor/room-properties.tag b/src/riotTags/editors/room-editor/room-properties.tag index 8ee6cd4c7..2038d2e1f 100644 --- a/src/riotTags/editors/room-editor/room-properties.tag +++ b/src/riotTags/editors/room-editor/room-properties.tag @@ -108,7 +108,7 @@ room-properties.npt(class="{opts.class}") b {parent.voc.isUi} collapsible-section.anInsetPanel( - heading="{vocGlob.assetTypes.behavior[2].slice(0, 1).toUpperCase() + vocGlob.assetTypes.behavior[2].slice(1)}" + heading="{capitalize(vocGlob.assetTypes.behavior[2])}" storestatekey="roomBehaviors" hlevel="4" ) @@ -134,10 +134,16 @@ room-properties.npt(class="{opts.class}") fieldset extensions-editor(entity="{opts.room.extends}" type="room" wide="true" compact="true") + .aSpacer(if="{window.currentProject.language === 'typescript'}") + label.block(if="{window.currentProject.language === 'typescript'}") + b {vocFull.scriptables.typedefs} + hover-hint(text="{vocFull.scriptables.typedefsHint}") + textarea.code.wide(value="{opts.room.extendTypes}" onchange="{wire('opts.room.extendTypes')}") + script. this.namespace = 'roomView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); var prevValue; this.rememberValue = e => { @@ -209,8 +215,8 @@ room-properties.npt(class="{opts.class}") }); }; - const {schemaToExtensions} = require('./data/node_requires/resources/content'); - const {getById} = require('./data/node_requires/resources'); + const {schemaToExtensions} = require('src/node_requires/resources/content'); + const {getById} = require('src/node_requires/resources'); this.behaviorExtends = []; this.updateBehaviorExtends = () => { this.behaviorExtends = []; diff --git a/src/riotTags/editors/room-editor/room-template-picker.tag b/src/riotTags/editors/room-editor/room-template-picker.tag index 77dc409c4..597acff47 100644 --- a/src/riotTags/editors/room-editor/room-template-picker.tag +++ b/src/riotTags/editors/room-editor/room-template-picker.tag @@ -17,7 +17,7 @@ room-template-picker selectedasset="{opts.selectedtemplate}" ) script. - this.thumbnails = require('./data/node_requires/resources/templates').getTemplatePreview; + this.thumbnails = require('src/node_requires/resources/templates').getTemplatePreview; this.selectTemplate = template => () => { this.opts.onselect(template); }; diff --git a/src/riotTags/editors/room-editor/room-tile-editor.tag b/src/riotTags/editors/room-editor/room-tile-editor.tag index 3942290f0..a243ecb6a 100644 --- a/src/riotTags/editors/room-editor/room-tile-editor.tag +++ b/src/riotTags/editors/room-editor/room-tile-editor.tag @@ -71,8 +71,8 @@ room-tile-editor.room-editor-Tiles.flexfix(class="{opts.class}") this.tileSpanY = 1; this.namespace = 'roomTiles'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); this.on('update', () => { if (!this.opts.layer && this.opts.layers.length) { @@ -156,8 +156,8 @@ room-tile-editor.room-editor-Tiles.flexfix(class="{opts.class}") this.update(); }; this.onTilesetSelected = async textureId => { - const {getById} = require('./data/node_requires/resources'); - const {getDOMImageFromTexture} = require('./data/node_requires/resources/textures'); + const {getById} = require('src/node_requires/resources'); + const {getDOMImageFromTexture} = require('src/node_requires/resources/textures'); this.currentTexture = getById('texture', textureId); this.pickingTileset = false; this.update(); @@ -176,7 +176,7 @@ room-tile-editor.room-editor-Tiles.flexfix(class="{opts.class}") img = this.currentTextureImg; c.width = img.width; c.height = img.height; - if (global.currentProject.settings.rendering.pixelatedrender) { + if (window.currentProject.settings.rendering.pixelatedrender) { c.style.imageRendering = 'pixelated'; } else { c.style.imageRendering = 'unset'; diff --git a/src/riotTags/editors/room-editor/room-ui-tools.tag b/src/riotTags/editors/room-editor/room-ui-tools.tag index f531e8b94..09c694f53 100644 --- a/src/riotTags/editors/room-editor/room-ui-tools.tag +++ b/src/riotTags/editors/room-editor/room-ui-tools.tag @@ -20,7 +20,7 @@ room-ui-tools value="{opts.selection.customTextSettings.fontSize}" oninput="{wireText('fontSize')}" ) - label.block(if="{opts.selection.cachedTemplate.baseClass === 'Text'}") + label.block(if="{['Text', 'BitmapText'].includes(opts.selection.cachedTemplate.baseClass)}") b {voc.wordWrapWidth}: br input( @@ -28,7 +28,7 @@ room-ui-tools value="{opts.selection.customTextSettings.wordWrapWidth}" oninput="{wireText('wordWrapWidth')}" ) - div(if="{opts.selection.cachedTemplate.baseClass === 'Text'}") + div(if="{['Text', 'BitmapText'].includes(opts.selection.cachedTemplate.baseClass)}") b {voc.textAlignment}: br .aButtonGroupNine @@ -108,7 +108,7 @@ room-ui-tools b(if="{opts.selection.align}") {voc.frame} .anAlignmentMap(if="{opts.selection.align}") .anAlignmentMap-aContainer.withdots - .pintopright.small.dim {vocGlob.assetTypes.room[0].slice(0, 1).toUpperCase()}{vocGlob.assetTypes.room[0].slice(1)} + .pintopright.small.dim {capitalize(vocGlob.assetTypes.room[0])} .x1y1 input.inline.nm( type="number" step="5" min="0" max="100" @@ -232,10 +232,10 @@ room-ui-tools use(xlink:href="#alert-circle") script. this.namespace = 'roomView.uiTools'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); - const {getById} = require('./data/node_requires/resources'); + const {getById} = require('src/node_requires/resources'); this.getName = () => getById('template', this.opts.selection.templateId).name; this.memorizeChanges = () => { @@ -257,7 +257,7 @@ room-ui-tools this.memorizeChanges(); }; - const {getDefaultAlign} = require('./data/node_requires/resources/rooms'); + const {getDefaultAlign} = require('src/node_requires/resources/rooms'); this.toggleAutoAlign = () => { const copy = this.opts.selection; if (copy.align) { @@ -331,7 +331,7 @@ room-ui-tools } }; - const {copyBindingTypes, getBindingsForBaseClass} = require('./data/node_requires/roomEditor/common'); + const {copyBindingTypes, getBindingsForBaseClass} = require('src/node_requires/roomEditor/common'); this.jsTypeToIcon = { string: 'string', boolean: 'bool', diff --git a/src/riotTags/editors/script-editor.tag b/src/riotTags/editors/script-editor.tag index 74023e10c..9ee8c35b0 100644 --- a/src/riotTags/editors/script-editor.tag +++ b/src/riotTags/editors/script-editor.tag @@ -1,7 +1,13 @@ script-editor.aPanel.aView.flexfix .script-editor-aCodeEditor.flexfix-body.relative.pad .tabwrap.tall(style="position: relative") - .relative.tall.wide(ref="codebox") + .relative.tall.wide(ref="codebox" if="{asset.language !== 'catnip'}") + catnip-editor.tall( + if="{asset.language === 'catnip'}" + asset="{asset}" + scriptmode="scriptmode" + onrename="{renamePropVar}" + ) .flexfix-footer.pad.npt .script-editor-aProblemPanel.wide.flexrow(if="{problem}") .nogrow @@ -23,11 +29,16 @@ script-editor.aPanel.aView.flexfix select(value="{asset.language}" onchange="{changeLanguage}") option(value="typescript") TypeScript / JavaScript option(value="coffeescript") CoffeeScript + option(value="catnip") Catnip .aSpacer.noshrink button(onclick="{convertCoffee}" if="{asset.language === 'coffeescript'}" disabled="{problem ? 'disabled' : ''}") svg.icon use(xlink:href="#javascript") span {voc.convertToJavaScript} + button(onclick="{convertCatnip}" if="{asset.language === 'catnip'}") + svg.icon + use(xlink:href="#javascript") + span {voc.convertToJavaScript} .aSpacer.nogrow.noshrink button(onclick="{scriptSave}" title="Shift+Control+S" data-hotkey="Shift+Control+S") svg.feather @@ -35,13 +46,28 @@ script-editor.aPanel.aView.flexfix span {vocGlob.apply} script. this.namespace = 'scriptView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); - const eventsAPI = require('./data/node_requires/events'); + const eventsAPI = require('src/node_requires/events'); const {baseTypes} = eventsAPI; + const {renamePropVar} = require('src/node_requires/catnip'); + this.renamePropVar = e => { + if (this.asset.language === 'catnip') { + renamePropVar(this.asset.code, e); + this.update(); + } + }; + // Global var names are automatically patched everywhere in a project, + // but we need to manually rename them in opened assets to not to overwrite + // a patch with old variable name + window.orders.on('catnipGlobalVarRename', this.renamePropVar); + this.on('unmount', () => { + window.orders.off('catnipGlobalVarRename', this.renamePropVar); + }); + this.saveAsset = () => { this.writeChanges(); return true; @@ -51,14 +77,14 @@ script-editor.aPanel.aView.flexfix this.opts.ondone(this.asset); }; - const coffeescript = require('coffeescript'); + const compileCoffee = require('coffeescript').CoffeeScript.compile; const checkProblemsDebounced = window.debounce(() => { if (!this.codeEditor || this.asset.language !== 'coffeescript') { return; } const oldProblem = this.problem; try { - coffeescript.compile(this.codeEditor.getValue(), { + compileCoffee(this.codeEditor.getValue(), { bare: true, sourcemaps: false }); @@ -90,46 +116,98 @@ script-editor.aPanel.aView.flexfix } this.codeEditor.getModel().ctCodePrefix = codePrefix; }; + const setupCodeEditor = () => { + const editorOptions = { + language: this.asset.language + }; + this.codeEditor = window.setupCodeEditor( + this.refs.codebox, + Object.assign({}, editorOptions, { + value: '', + wrapper: [' ', ' '] + }) + ); + updateEditor(); + this.codeEditor.onDidChangeModelContent(() => { + if (this.asset) { + this.asset.code = this.codeEditor.getPureValue(); + } + checkProblemsDebounced(); + }); + this.codeEditor.focus(); + checkProblemsDebounced(); + }; this.changeLanguage = e => { const newLang = e.target.value; - this.asset.language = newLang; - updateEditor(); + if (newLang !== this.asset.language) { + this.problem = false; + if (newLang === 'catnip') { + if (this.codeEditor.getPureValue().trim()) { + e.preventUpdate = true; + alertify.confirm(this.voc.confirmSwitchToCatnip) + .then(e => { + if (e.buttonClicked === 'ok') { + this.asset.code = []; + this.codeEditor.dispose(); + this.asset.language = 'catnip'; + this.update(); + } + }); + } else { + this.asset.code = []; + this.codeEditor.dispose(); + this.asset.language = newLang; + } + } else if (this.asset.language === 'catnip') { + if (this.asset.code.length) { + e.preventUpdate = true; + alertify.confirm(this.voc.confirmSwitchFromCatnip) + .then(e => { + if (e.buttonClicked === 'ok') { + this.asset.code = ''; + this.asset.language = newLang; + this.update(); + setupCodeEditor(); + } + }); + } else { + this.asset.code = ''; + this.asset.language = newLang; + this.update(); + setupCodeEditor(); + } + } else { + this.asset.language = newLang; + updateEditor(); + } + } else { + e.preventUpdate = true; + } }; const layout = () => { + if (this.asset.language === 'catnip') { + return; + } setTimeout(() => { this.codeEditor.layout(); }, 150); }; this.on('mount', () => { - const editorOptions = { - language: this.asset.language - }; + window.addEventListener('resize', layout); setTimeout(() => { - this.codeEditor = window.setupCodeEditor( - this.refs.codebox, - Object.assign({}, editorOptions, { - value: '', - wrapper: [' ', ' '] - }) - ); - updateEditor(); - this.codeEditor.onDidChangeModelContent(() => { - if (this.asset) { - this.asset.code = this.codeEditor.getPureValue(); - } - checkProblemsDebounced(); - }); - this.codeEditor.focus(); - checkProblemsDebounced(); - window.addEventListener('resize', layout); + if (this.asset.language !== 'catnip') { + setupCodeEditor(); + } }, 0); }); window.orders.on('forceCodeEditorLayout', layout); this.on('unmount', () => { - // Manually destroy code editors, to free memory - this.codeEditor.dispose(); + if (this.asset.language !== 'catnip') { + // Manually destroy code editors, to free memory + this.codeEditor.dispose(); + } window.removeEventListener('resize', layout); window.orders.off('forceCodeEditorLayout', layout); }); @@ -144,7 +222,7 @@ script-editor.aPanel.aView.flexfix this.convertCoffee = () => { try { - const val = coffeescript.compile(this.codeEditor.getValue(), { + const val = compileCoffee(this.codeEditor.getValue(), { bare: true, sourcemaps: false }); @@ -156,4 +234,20 @@ script-editor.aPanel.aView.flexfix this.problem = err; } }; - + this.convertCatnip = () => { + const {compile} = require('src/node_requires/catnip/compiler'); + try { + const val = compile(this.asset.code, { + eventKey: 'script', + resourceId: this.asset.uid, + resourceName: this.asset.name, + resourceType: 'script' + }); + this.asset.code = val; + this.asset.language = 'typescript'; + this.update(); + setupCodeEditor(); + } catch (err) { + window.alertify.error(err); + } + }; diff --git a/src/riotTags/editors/sound-editor/sound-editor.tag b/src/riotTags/editors/sound-editor/sound-editor.tag index de7baaa40..5c4cd5641 100644 --- a/src/riotTags/editors/sound-editor/sound-editor.tag +++ b/src/riotTags/editors/sound-editor/sound-editor.tag @@ -170,15 +170,15 @@ sound-editor.aView.pad.flexfix(onclick="{tryClose}") script. const path = require('path'); this.namespace = 'soundView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); - this.swatches = require('./data/node_requires/themes').getSwatches(); + this.swatches = require('src/node_requires/themes').getSwatches(); - const soundResMethods = require('./data/node_requires/resources/sounds'); - const {SoundPreviewer} = require('./data/node_requires/resources/preview/sound'); - const {playVariant, playWithoutEffects} = require('./data/ct.shared/ctSound'); + const soundResMethods = require('src/node_requires/resources/sounds'); + const {SoundPreviewer} = require('src/node_requires/resources/preview/sound'); + const {playVariant, playWithoutEffects} = require('src/ct.release/sounds.ts'); this.currentSoundPlaying = null; soundResMethods.loadSound(this.asset); @@ -232,7 +232,7 @@ sound-editor.aView.pad.flexfix(onclick="{tryClose}") this.importVariant = async () => { const source = this.refs.inputsound.files[0].path; - const sounds = require('./data/node_requires/resources/sounds'); + const sounds = require('src/node_requires/resources/sounds'); if (!this.asset.lastmod && this.asset.name === 'New Sound') { this.asset.name = path.basename(source, path.extname(source)); } diff --git a/src/riotTags/editors/sound-editor/sound-recorder.tag b/src/riotTags/editors/sound-editor/sound-recorder.tag index 97c1cf060..5f7bdb3f9 100644 --- a/src/riotTags/editors/sound-editor/sound-recorder.tag +++ b/src/riotTags/editors/sound-editor/sound-recorder.tag @@ -38,15 +38,15 @@ sound-recorder.aDimmer.fadein use(xlink:href="#loader") script. this.namespace = 'soundRecorder'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); var previewWaveform, animationFrame; this.state = 'ready'; this.stream = null; - this.isWin = require('./data/node_requires/platformUtils').isWin; + this.isWin = require('src/node_requires/platformUtils').isWin; - const themeManager = require('./data/node_requires/themes'); + const themeManager = require('src/node_requires/themes'); var audioCtx; const visualize = stream => { @@ -143,12 +143,12 @@ sound-recorder.aDimmer.fadein this.finishRecording = async () => { this.state = 'loading'; this.update(); - const sounds = require('./data/node_requires/resources/sounds'); + const sounds = require('src/node_requires/resources/sounds'); const path = require('path'), fs = require('fs-extra'); const base64 = (await mp3Recorder.getBase64()).replace('data:audio/mp3;base64,', ''); const buffer = Buffer.from(base64, 'base64'); - const temp = await require('./data/node_requires/platformUtils').getTempDir(); + const temp = await require('src/node_requires/platformUtils').getTempDir(); await fs.writeFile(path.join(temp.dir, 'recording.mp3'), buffer); await sounds.addSoundFile(this.opts.sound, path.join(temp.dir, 'recording.mp3')); temp.remove(); diff --git a/src/riotTags/editors/style-editor.tag b/src/riotTags/editors/style-editor.tag index a698ee1e3..9341807d4 100644 --- a/src/riotTags/editors/style-editor.tag +++ b/src/riotTags/editors/style-editor.tag @@ -1,3 +1,24 @@ +mixin notSupportedThingy + .dim + svg.feather + use(xlink:href="#alert-triangle") + | + span {voc.notSupportedForBitmap} +mixin rangeNumberInput(wirePath, min = 0, max = 64, step = 1) + .flexrow + input( + type="range" value=`{${wirePath}}` min=min max=max step=step + data-wired-force-minmax="yes" + onchange=`{wire('${wirePath}')}` + oninput=`{wire('${wirePath}')}` + ) + .aSpacer.nogrow + input.short.nogrow( + type="number" value=`{${wirePath}}` min=min + onchange=`{wire('${wirePath}')}` + oninput=`{wire('${wirePath}')}` + ) + style-editor.aPanel.aView(class="{opts.class}") .style-editor-Properties.tall.flexfix .tabwrap.flexfix-body @@ -10,27 +31,42 @@ style-editor.aPanel.aView(class="{opts.class}") #stylefontinner fieldset label - b {voc.fontFamily} + b {capitalize(vocGlob.assetTypes.typeface[0])}: + asset-input.wide( + assettypes="typeface" + allowclear="true" + assetid="{asset.typeface}" + onchanged="{applyTypeface}" + ) + br + label + b {voc.fallbackFontFamily} input#fontfamily.wide(type="text" value="{asset.font.family || 'sans-serif'}" onchange="{wire('asset.font.family')}") - button(onclick="{openCustomFontSelector}") - svg.feather - use(xlink:href="#font") - span {voc.useCustomFont} - .clear - label.fifty.npl.nmt - b {voc.fontSize} - br - input#fontsize.wide(type="number" value="{asset.font.size || '12'}" onchange="{wireFontSize}" oninput="{wireFontSize}" step="1") - label.fifty.npr.nmt - b {voc.fontWeight} - br - select.wide(value="{asset.font.weight}" onchange="{wire('asset.font.weight')}") - each val in [100, 200, 300, 400, 500, 600, 700, 800, 900] - option(value=val)= val - .clear - label.checkbox - input(type="checkbox" checked="{asset.font.italic}" onchange="{wire('asset.font.italic')}") - span {voc.italic} + fieldset + .flexrow + label + b {voc.fontSize} + br + input.wide(type="number" value="{asset.font.size || '12'}" onchange="{wireFontSize}" oninput="{wireFontSize}" step="1") + .aSpacer.nogrow.noshrink + label + b {voc.lineHeight} + br + input.wide(type="number" step="1" min="0" value="{asset.font.lineHeight || 0}" oninput="{wire('asset.font.lineHeight')}") + fieldset + .flexrow + label + b {voc.fontWeight} + br + select.wide(value="{asset.font.weight}" onchange="{wire('asset.font.weight')}") + each val in [100, 200, 300, 400, 500, 600, 700, 800, 900] + option(value=val disabled=`{!checkWeightAvailable('${val}')}`)= val + .aSpacer.nogrow.noshrink + div + br + label.checkbox + input(type="checkbox" checked="{asset.font.italic}" onchange="{wire('asset.font.italic')}") + b {voc.italic} fieldset b {voc.alignment} .align.buttonselect @@ -43,10 +79,6 @@ style-editor.aPanel.aView(class="{opts.class}") button#middleright.inline(onclick="{styleSetAlign('right')}" class="{active: this.asset.font.halign === 'right'}") svg.feather use(xlink:href="#align-right") - label - b {voc.lineHeight} - br - input(type="number" step="1" min="0" value="{asset.font.lineHeight || 0}" oninput="{wire('asset.font.lineHeight')}") fieldset label.checkbox input(type="checkbox" checked="{asset.font.wrap}" onchange="{wire('asset.font.wrap')}") @@ -74,6 +106,7 @@ style-editor.aPanel.aView(class="{opts.class}") br color-input(onchange="{wire('asset.fill.color', true)}" color="{asset.fill.color}") .gradientfill(if="{asset.fill.type == 1}") + +notSupportedThingy .fifty.npl.npt b {voc.fillColor1} color-input(onchange="{wire('asset.fill.color1', true)}" color="{asset.fill.color1}") @@ -99,8 +132,9 @@ style-editor.aPanel.aView(class="{opts.class}") fieldset b {voc.strokeWeight} br - input#strokeweight(type="number" value="{asset.stroke.weight}" onchange="{wire('asset.stroke.weight')}" oninput="{wire('asset.stroke.weight')}") - #strokeweightslider + +rangeNumberInput('asset.stroke.weight') + .aSpacer + +notSupportedThingy #styleshadow.tabbed(show="{tab === 'styleshadow'}") label.checkbox input#iftochangeshadow(type="checkbox" checked="{'shadow' in asset}" onchange="{styleToggleShadow}") @@ -118,20 +152,10 @@ style-editor.aPanel.aView(class="{opts.class}") fieldset b {voc.shadowBlur} br - input#shadowblur(type="number" value="{asset.shadow.blur}" min="0" onchange="{wire('asset.shadow.blur')}" oninput="{wire('asset.shadow.blur')}") + +rangeNumberInput('asset.shadow.blur') + .aSpacer + +notSupportedThingy .flexfix-footer - .aPanel.pad - .flexrow - h3 {voc.code} - .aSpacer - button.inline.nogrow(onclick="{copyCode}") - svg.feather - use(xlink:href="#copy") - span {voc.copyCode} - textarea.wide(disabled="true" ref="codeField") - | this.textLabel = new PIXI.Text('Your text here', styles.get('{asset.name}')); - | {'\n'}this.addChild(this.textLabel); - button.wide.nogrow.noshrink(onclick="{styleSave}" title="Shift+Control+S" data-hotkey="Control+S") svg.feather use(xlink:href="#check") @@ -154,28 +178,37 @@ style-editor.aPanel.aView(class="{opts.class}") ) script. this.namespace = 'styleView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); const PIXI = require('pixi.js'); - this.changingAnyColor = false; + const {getById} = require('src/node_requires/resources'); + // Cache the linked typeface so we can easily fetch valid weights later + if (this.asset.typeface !== -1) { + this.linkedTypeface = getById('typeface', this.asset.typeface); + } + this.tab = 'stylefont'; this.changeTab = tab => () => { this.tab = tab; }; this.on('mount', () => { + // Create a pixi.js preview + // Fit the canvas into the preview window const bounds = this.refs.canvasSlot.getBoundingClientRect(); const width = Math.floor(bounds.width); const height = Math.floor(bounds.height); this.pixiApp = new PIXI.Application({ width, height, - backgroundAlpha: 0 + backgroundAlpha: 0, + resolution: window.devicePixelRatio }); this.refs.canvasSlot.appendChild(this.pixiApp.view); + // Create some text labels for the preview const labelShort = this.vocFull.styleView.testText, labelMultiline = this.vocFull.styleView.testText.repeat(2) + '\n' + this.vocFull.styleView.testText.repeat(3) + '\n' + this.vocFull.styleView.testText, labelLong = 'A quick blue cat jumps over the lazy frog. 0123456789 '.repeat(3), @@ -187,6 +220,7 @@ style-editor.aPanel.aView(class="{opts.class}") this.labelThumbnail = new PIXI.Text(labelThumbnail, this.pixiStyle); this.labels = [this.labelShort, this.labelLong, this.labelMultiline]; for (const label of this.labels) { + label.resolution = window.devicePixelRatio; label.anchor.x = 0.5; label.anchor.y = 0.5; this.pixiApp.stage.addChild(label); @@ -195,7 +229,7 @@ style-editor.aPanel.aView(class="{opts.class}") this.labelShort.y = 60; this.labelMultiline.y = 60 * 3; this.labelLong.y = 60 * 6; - this.refreshStyleTexture(); + this.updateStylePreview(); }); this.on('unmount', () => { this.pixiApp.destroy(false, { @@ -203,7 +237,7 @@ style-editor.aPanel.aView(class="{opts.class}") }); }); this.on('updated', () => { - this.refreshStyleTexture(); + this.updateStylePreview(); }); const resizeCanvas = () => { const bounds = this.refs.canvasSlot.getBoundingClientRect(); @@ -212,9 +246,16 @@ style-editor.aPanel.aView(class="{opts.class}") label.x = bounds.width / 2; } }; + const tabSwitchHandler = tab => { + if (tab?.uid === this.asset.uid) { + setTimeout(resizeCanvas, 0); + } + }; window.addEventListener('resize', resizeCanvas); + window.signals.on('globalTabChanged', tabSwitchHandler); this.on('unmount', () => { window.removeEventListener('resize', resizeCanvas); + window.signals.off('globalTabChanged', tabSwitchHandler); }); this.selectingTexture = false; @@ -226,20 +267,34 @@ style-editor.aPanel.aView(class="{opts.class}") this.selectingFont = false; this.update(); }; - const {getById} = require('./data/node_requires/resources'); - this.applyFont = fontId => { - this.selectingFont = false; - const font = getById('font', fontId); - this.asset.font.family = `"CTPROJFONT${font.typefaceName}", "${font.typefaceName}", sans-serif`; - this.asset.font.weight = font.weight; - this.asset.font.italic = font.italic; + + this.applyTypeface = typefaceUid => { + this.asset.typeface = typefaceUid; + // Cache the linked typeface so we can easily fetch valid weights later + if (this.asset.typeface !== -1) { + this.linkedTypeface = getById('typeface', this.asset.typeface); + // Check if the selected weight and italic settings are still valid; + // reset to the first font / default settings otherwise + if (!this.linkedTypeface.fonts.some(f => + f.weight === this.asset.font.weight && + f.italic === this.asset.font.italic) + ) { + if (this.linkedTypeface.fonts.length) { + this.asset.font.weight = this.linkedTypeface.fonts[0].weight; + this.asset.font.italic = this.linkedTypeface.fonts[0].italic; + } else { + this.asset.font.weight = 400; + this.asset.font.italic = false; + } + } + } else { + this.linkedTypeface = false; + } this.update(); }; - this.copyCode = () => { - nw.Clipboard.get().set(this.refs.codeField.value); - alertify.success(this.vocGlob.done); - }; + this.checkWeightAvailable = weight => !this.linkedTypeface || + this.linkedTypeface.fonts.some(f => f.weight === weight); this.wireFontSize = e => { const oldSize = this.asset.font.size, @@ -282,11 +337,11 @@ style-editor.aPanel.aView(class="{opts.class}") } }; // Render a preview image in the editor - const {extend} = require('./data/node_requires/objectUtils'); - const {styleToTextStyle} = require('./data/node_requires/styleUtils'); - this.refreshStyleTexture = () => { + const {extend} = require('src/node_requires/objectUtils'); + const {styleToTextStyle} = require('src/node_requires/styleUtils'); + this.updateStylePreview = () => { this.pixiStyle.reset(); - extend(this.pixiStyle, styleToTextStyle(this.asset)); + extend(this.pixiStyle, styleToTextStyle(this.asset, true)); for (const label of this.labels) { // this forces to redraw the pixi label // eslint-disable-next-line no-self-assign @@ -295,7 +350,7 @@ style-editor.aPanel.aView(class="{opts.class}") this.pixiApp.render(); }; this.saveAsset = async () => { - const {StylePreviewer} = require('./data/node_requires/resources/preview/style'); + const {StylePreviewer} = require('src/node_requires/resources/preview/style'); await StylePreviewer.save(this.asset); this.writeChanges(); return true; @@ -305,10 +360,8 @@ style-editor.aPanel.aView(class="{opts.class}") this.opts.ondone(this.asset); }; - // Color of the preview window and changing it - const themesAPI = require('./data/node_requires/themes'); - console.log(themesAPI); - const {getSwatch} = require('./data/node_requires/themes'); + // Get the color for thhe preview window and let a user change it + const {getSwatch} = require('src/node_requires/themes'); this.previewColor = getSwatch('backgroundDeeper'); this.changePreviewBg = () => { this.changingPreviewBg = !this.changingPreviewBg; diff --git a/src/riotTags/editors/template-editor.tag b/src/riotTags/editors/template-editor.tag index dc7238cac..bff2176c2 100644 --- a/src/riotTags/editors/template-editor.tag +++ b/src/riotTags/editors/template-editor.tag @@ -1,6 +1,6 @@ mixin templateProperties collapsible-section.anInsetPanel( - heading="{vocGlob.assetTypes.behavior[2].slice(0, 1).toUpperCase() + vocGlob.assetTypes.behavior[2].slice(1)}" + heading="{capitalize(vocGlob.assetTypes.behavior[2])}" storestatekey="templateBehaviors" hlevel="4" ) @@ -77,7 +77,7 @@ mixin templateProperties onchanged="{parent.applyButtonTexture('disabledTexture')}" ) // Text style selector for buttons and other UI elements more complex than a text label - fieldset(if="{parent.hasCapability('embeddedText')}") + fieldset.relative(if="{parent.hasCapability('embeddedText')}") b {parent.voc.textStyle}: asset-input.wide( assettypes="style" @@ -85,6 +85,18 @@ mixin templateProperties allowclear="allowclear" onchanged="{parent.applyStyle}" ) + label.checkbox(ref="bitmapCheckbox") + input( + type="checkbox" + onchange="{parent.wire('asset.useBitmapText')}" + checked="{parent.asset.useBitmapText}" + ) + b {parent.voc.useBitmapText} + error-notice( + if="{parent.asset.useBitmapText && parent.needsBitmapFontWarning()}" + target="{refs.bitmapCheckbox}" + ) + | {parent.parent.voc.errorBitmapNotConfigured} fieldset(if="{parent.hasCapability('text') || parent.hasCapability('embeddedText') || parent.hasCapability('textInput')}") label.block(if="{parent.hasCapability('text') || parent.hasCapability('embeddedText')}") b {parent.voc.defaultText} @@ -138,7 +150,7 @@ mixin templateProperties input( type="checkbox" onchange="{parent.wire('asset.tilingSettings.isUi')}" - value="{parent.asset.tilingSettings.isUi}" + checked="{parent.asset.tilingSettings.isUi}" ) b {parent.voc.isUi} // Sprited counter settings @@ -195,6 +207,11 @@ mixin templateProperties ) .aSpacer extensions-editor(type="template" entity="{asset.extends}" wide="yep" compact="probably") + .aSpacer(if="{window.currentProject.language === 'typescript'}") + label.block(if="{window.currentProject.language === 'typescript'}") + b {vocFull.scriptables.typedefs} + hover-hint(text="{vocFull.scriptables.typedefsHint}") + textarea.code.wide(style="min-height: 15rem;" value="{asset.extendTypes}" onchange="{changeTypedefs}") mixin eventsList event-list-scriptable( @@ -226,7 +243,15 @@ template-editor.aPanel.aView.flexrow large="large" allowclear="allowclear" onchanged="{applyStyle}" + ref="stylePicker" + ) + // Check if a Bitmap Text base class refers to a typeface that is configured to export bitmap fonts + error-notice( + if="{hasCapability('bitmapText') && needsBitmapFontWarning()}" + target="{refs.stylePicker}" ) + | {parent.voc.errorBitmapNotConfigured} + // Check if a tiling texture is used for Counters / Repeating textures error-notice( if="{['SpritedCounter', 'RepeatingTexture'].includes(asset.baseClass) && needsTiledWarning()}" target="{refs.texturePicker}" @@ -241,7 +266,7 @@ template-editor.aPanel.aView.flexrow button.wide.flexrow(onclick="{showbaseClassMenu}") svg.feather.nogrow.alignmiddle use(xlink:href="#{baseClassToIcon[asset.baseClass]}") - span.nogrow.alignmiddle {voc.baseClass[asset.baseClass]} + span.nogrow.alignmiddle.crop {voc.baseClass[asset.baseClass]} .aSpacer svg.feather.nogrow.alignmiddle use(xlink:href="#chevron-down") @@ -265,24 +290,13 @@ template-editor.aPanel.aView.flexrow use(xlink:href="#plus") .template-editor-aCodeEditor .tabwrap.tall(style="position: relative") - //ul.tabs.aNav.nogrow.noshrink - // li(onclick="{changeTab('javascript')}" class="{active: tab === 'javascript'}" title="JavaScript (Control+Q)" data-hotkey="Control+q") - // svg.feather - // use(xlink:href="#code") - // span {voc.create} - // li(onclick="{changeTab('blocks')}" class="{active: tab === 'blocks'}" title="Blurry (Control+W)" data-hotkey="Control+w") - // svg.feather - // use(xlink:href="#grid") - // span {voc.step} div .tabbed.noborder(show="{tab === 'javascript'}") code-editor-scriptable( event="{currentSheet}" entitytype="template" - baseclass="{baseClassToTS[asset.baseClass]}" + asset="{asset}" ) - // .tabbed(show="{tab === 'blocks'}") - // .aBlocksEditor(ref="blocks") .template-editor-Properties.nmr(if="{localStorage.altTemplateLayout !== 'on' && !minimizeProps}") .tall.aPanel.pad.npt +templateProperties() @@ -294,12 +308,12 @@ template-editor.aPanel.aView.flexrow use(xlink:href="#{minimizeProps ? 'maximize-2' : 'minimize-2'}") script. this.namespace = 'templateView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); - const resources = require('./data/node_requires/resources'); - const {validateBehaviorExtends} = require('./data/node_requires/resources/behaviors'); + const resources = require('src/node_requires/resources'); + const {validateBehaviorExtends} = require('src/node_requires/resources/behaviors'); validateBehaviorExtends(this.asset); this.getTextureRevision = template => resources.getById(template.texture).lastmod; @@ -307,7 +321,7 @@ template-editor.aPanel.aView.flexrow this.tab = 'javascript'; [this.currentSheet] = this.asset.events; // can be undefined, this is ok - const {schemaToExtensions} = require('./data/node_requires/resources/content'); + const {schemaToExtensions} = require('src/node_requires/resources/content'); this.behaviorExtends = []; this.updateBehaviorExtends = () => { this.behaviorExtends = []; @@ -327,11 +341,9 @@ template-editor.aPanel.aView.flexrow const {baseClasses, baseClassToIcon, - baseClassToTS, getBaseClassFields, - hasCapability} = require('./data/node_requires/resources/templates'); + hasCapability} = require('src/node_requires/resources/templates'); this.baseClassToIcon = baseClassToIcon; - this.baseClassToTS = baseClassToTS; this.hasCapability = cp => hasCapability(this.asset.baseClass, cp); const fillBaseClassDefaults = () => { Object.assign(this.asset, getBaseClassFields(this.asset.baseClass)); @@ -387,6 +399,9 @@ template-editor.aPanel.aView.flexrow } this.update(); }; + this.applyTypeface = id => { + this.asset.typeface = id; + }; this.applyCounterFiller = id => { this.asset.repeaterSettings.emptyTexture = id; }; @@ -397,6 +412,10 @@ template-editor.aPanel.aView.flexrow this.asset.selectionColor = '#ffffff'; } }; + this.changeTypedefs = e => { + this.wire('asset.extendTypes')(e); + window.signals.trigger('typedefsChanged', this.asset.uid); + }; this.needsTiledWarning = () => { if (this.asset.texture === -1 || !this.asset.texture) { @@ -416,6 +435,15 @@ template-editor.aPanel.aView.flexrow this.update(); }; + this.needsBitmapFontWarning = () => { + const style = resources.getById('style', this.asset.textStyle); + if (!style.typeface) { + return true; + } + const typeface = resources.getById('typeface', style.typeface); + return !typeface.bitmapFont; + }; + this.saveAsset = () => { this.writeChanges(); return true; diff --git a/src/riotTags/editors/texture-editor.tag b/src/riotTags/editors/texture-editor.tag index f0cea7bba..e6dc4f61a 100644 --- a/src/riotTags/editors/texture-editor.tag +++ b/src/riotTags/editors/texture-editor.tag @@ -370,14 +370,14 @@ texture-editor(onclick="{tryClose}") ) script. const fs = require('fs-extra'); - const {getSwatch} = require('./data/node_requires/themes'); - const {getTextureOrig} = require('./data/node_requires/resources/textures'); - // const {getSkeletonRender} = require('./data/node_requires/resources/skeletons'); + const {getSwatch} = require('src/node_requires/themes'); + const {getTextureOrig} = require('src/node_requires/resources/textures'); + // const {getSkeletonRender} = require('src/node_requires/resources/skeletons'); this.namespace = 'textureView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); this.skeletonMode = this.asset.type === 'skeleton'; @@ -508,11 +508,11 @@ texture-editor(onclick="{tryClose}") this.loadImg = async (source) => { try { if (this.skeletonMode) { - const {reimportSkeleton} = require('./data/node_requires/resources/skeletons'); + const {reimportSkeleton} = require('src/node_requires/resources/skeletons'); await reimportSkeleton(this.asset, source); this.refreshTextureCanvas(); } else { - const {reimportTexture, getDOMTexture} = require('./data/node_requires/resources/textures'); + const {reimportTexture, getDOMTexture} = require('src/node_requires/resources/textures'); await reimportTexture(this.asset, source); textureCanvas.img = getDOMTexture(this.asset); this.refreshTextureCanvas(); @@ -977,8 +977,8 @@ texture-editor(onclick="{tryClose}") this.saveAsset = async () => { const {asset} = this; if (!this.skeletonMode) { - const {updatePixiTexture, updateDOMImage} = require('./data/node_requires/resources/textures'); - const {TexturePreviewer} = require('./data/node_requires/resources/preview/texture'); + const {updatePixiTexture, updateDOMImage} = require('src/node_requires/resources/textures'); + const {TexturePreviewer} = require('src/node_requires/resources/preview/texture'); await Promise.all([ updateDOMImage(asset), updatePixiTexture(asset), diff --git a/src/riotTags/editors/texture-generator.tag b/src/riotTags/editors/texture-generator.tag index 800e429d1..ae398f4ca 100644 --- a/src/riotTags/editors/texture-generator.tag +++ b/src/riotTags/editors/texture-generator.tag @@ -67,10 +67,10 @@ texture-generator span {voc.createAndContinue} script. this.namespace = 'textureGenerator'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); - const {getOfType, createAsset} = require('./data/node_requires/resources'); + const {getOfType, createAsset} = require('src/node_requires/resources'); this.textureName = 'Placeholder'; this.textureWidth = this.textureHeight = 64; @@ -193,8 +193,8 @@ texture-generator if (this.nameTaken) { this.update(); - require('./data/node_requires/jellify')(this.refs.errorNotice); - const {soundbox} = require('./data/node_requires/3rdparty/soundbox'); + require('src/node_requires/jellify')(this.refs.errorNotice); + const {soundbox} = require('src/node_requires/3rdparty/soundbox'); soundbox.play('Failure'); return false; } diff --git a/src/riotTags/editors/font-editor.tag b/src/riotTags/editors/typeface-editor.tag similarity index 53% rename from src/riotTags/editors/font-editor.tag rename to src/riotTags/editors/typeface-editor.tag index d856af741..111323aec 100644 --- a/src/riotTags/editors/font-editor.tag +++ b/src/riotTags/editors/typeface-editor.tag @@ -1,24 +1,19 @@ -font-editor.aPanel.aView(class="{opts.class}") +typeface-editor.aPanel.aView(class="{opts.class}") .aPanel.pad.left.tall.flexfix .flexfix-body fieldset label.block b {voc.typefaceName} br - input.wide(type="text" onchange="{wire('asset.typefaceName')}" value="{asset.typefaceName}") - label.block - b {voc.fontWeight} - br - select(value="{asset.weight}" onchange="{wire('asset.weight')}") - each val in [100, 200, 300, 400, 500, 600, 700, 800, 900] - option(value=val)= val - label.checkbox - input(type="checkbox" checked="{asset.italic}" onchange="{wire('asset.italic')}") - b {voc.italic} + input.wide(type="text" onchange="{wire('asset.name')}" value="{asset.name}") fieldset label.checkbox input(type="checkbox" checked="{asset.bitmapFont}" onchange="{wire('asset.bitmapFont')}") b {voc.generateBitmapFont} + label.checkbox(if="{asset.bitmapFont}") + input(type="checkbox" checked="{asset.bitmapPrecision}" onchange="{wire('asset.bitmapPrecision')}") + b {voc.pixelPerfect} + hover-hint(text="{voc.pixelPerfectTooltip}") h3(if="{asset.bitmapFont}") {voc.bitmapFont} fieldset(if="{asset.bitmapFont}") label.block @@ -44,23 +39,40 @@ font-editor.aPanel.aView(class="{opts.class}") value="{asset.customCharset}" onchange="{wire('asset.customCharset')}" ) - h3 {voc.resultingBitmapFontName} - copy-icon.toright(text="{asset.typefaceName}_{asset.weight}{asset.italic? '_Italic' : ''}") - code {asset.typefaceName}_{asset.weight}{asset.italic? '_Italic' : ''} .clear .flexfix-footer - button.wide(onclick="{fontSave}") + button.wide(onclick="{applyChanges}") svg.feather use(xlink:href="#check") span {vocGlob.apply} - .right.tall(style="font-weight: {asset.weight}; font-style: {asset.italic? 'italic' : 'normal'}") - each val in [8, 9, 10, 11, 12, 14, 16, 21, 24, 32, 48, 60, 72] - p(style=`font-size: ${val}px; line-height: ${val}px; font-family: 'CTPROJFONT{asset.typefaceName}';` data-size=val) A quick blue cat jumps over the lazy frog. 0123456789 + .right.tall + .aFont(each="{font, ind in asset.fonts}") + .aFont-Settings + label.block + b {voc.fontWeight} + select(value="{font.weight}" onchange="{wire('asset.fonts.'+ind+'.weight')}") + each val in [100, 200, 300, 400, 500, 600, 700, 800, 900] + option(value=val)= val + label.checkbox + input(type="checkbox" checked="{font.italic}" onchange="{wire('asset.fonts.'+ind+'.italic')}") + b {voc.italic} + .dim.small {font.origname} + .aSpacer + button.inline.small(onclick="{deleteFont}") + svg.feather + use(xlink:href="#trash") + span {vocGlob.delete} + p.aFontSample(style="font-family: '{getFontDomName(font)}';") + | A quick blue cat jumps over the lazy frog. 0123456789!? + button.success(onclick="{importFont}") + svg.feather + use(xlink:href="#plus") + span {voc.addFont} script. this.namespace = 'fontView'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.mixin(require('./data/node_requires/riotMixins/discardio').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/discardio').default); this.charsetOptions = ['punctuation', 'basicLatin', 'latinExtended', 'cyrillic', 'greekCoptic', 'custom', 'allInFont']; @@ -78,26 +90,39 @@ font-editor.aPanel.aView(class="{opts.class}") } }; - this.refreshFonts = require('./data/node_requires/resources/fonts').refreshFonts; + const typefacesAPI = require('src/node_requires/resources/typefaces'); + const previews = require('src/node_requires/resources/preview/typeface').TypefacePreviewer; + this.getFontDomName = typefacesAPI.getFontDomName; - this.oldTypefaceName = this.asset.typefaceName; - this.saveAsset = () => { + this.oldTypefaceName = this.asset.name; + this.saveAsset = async () => { this.writeChanges(); - this.refreshFonts(); + typefacesAPI.refreshFonts(); + await previews.save(this.asset); }; - this.fontSave = () => { - this.saveAsset(); + this.applyChanges = async () => { + await this.saveAsset(); this.opts.ondone(this.asset); }; - this.on('update', () => { - for (const font of document.fonts) { - if (font.family === 'CTPROJFONT' + this.oldTypefaceName) { - this.oldTypefaceName = this.asset.typefaceName; - font.family = this.asset.typefaceName; - font.style = this.asset.italic ? 'italic' : 'normal'; - font.weight = this.asset.weight; - this.refreshFonts(); - break; - } - } + typefacesAPI.refreshFonts().then(() => { + this.update(); }); + + this.deleteFont = e => { + const {font} = e.item; + this.asset.fonts.splice(this.asset.fonts.indexOf(font)); + }; + this.importFont = async e => { + e.preventUpdate = true; + const reply = await window.showOpenDialog({ + title: this.voc.addFont, + multiple: true, + filter: '.ttf' + }); + if (!reply || !reply.length) { + return; + } + await Promise.all(reply.map(filepath => typefacesAPI.addFont(this.asset, filepath))); + await typefacesAPI.refreshFonts(); + this.update(); + }; diff --git a/src/riotTags/exporter-error.tag b/src/riotTags/exporter-error.tag index ca24d7855..91a014cab 100644 --- a/src/riotTags/exporter-error.tag +++ b/src/riotTags/exporter-error.tag @@ -58,9 +58,9 @@ exporter-error.aDimmer.pointer.pad.fadein(onpointerdown="{tryClose}") use(xlink:href="#arrow-right") script. this.namespace = 'exporterError'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - this.resourceToIconMap = require('./data/node_requires/resources').resourceToIconMap; + this.resourceToIconMap = require('src/node_requires/resources').resourceToIconMap; this.error = this.opts.error; // Propose solution for windows' eternal file locking problem if (this.error.code === 'ENOTEMPTY' || this.error.code === 'EPERM') { @@ -81,7 +81,7 @@ exporter-error.aDimmer.pointer.pad.fadein(onpointerdown="{tryClose}") this.opts.onclose(); }; this.saveAndQuit = async () => { - const {saveProject} = require('./data/node_requires/resources/projects'); + const {saveProject} = require('src/node_requires/resources/projects'); await saveProject(); alertify.success(this.vocGlob.savedMessage, 'success', 3000); // Close after a second so a user sees a "saved" message and doesn't shit themselves @@ -90,7 +90,7 @@ exporter-error.aDimmer.pointer.pad.fadein(onpointerdown="{tryClose}") }, 1000); }; - const {soundbox} = require('./data/node_requires/3rdparty/soundbox'); + const {soundbox} = require('src/node_requires/3rdparty/soundbox'); this.on('mount', () => { soundbox.play('Failure'); }); diff --git a/src/riotTags/home-news.tag b/src/riotTags/home-news.tag new file mode 100644 index 000000000..8489be43d --- /dev/null +++ b/src/riotTags/home-news.tag @@ -0,0 +1,117 @@ +home-news + .home-news-aNewsRow.aPanel.pad.flexrow(if="{homepageContent && homepageContent.announcement}") + .home-news-aNewsBg(if="{homepageContent.announcement.bgImage}" style="background-image: url('{globalizeLink(homepageContent.announcement.bgImage)}')") + .home-news-aNewsRowInner + h2.nmt {homepageContent.announcement.title} + p {homepageContent.announcement.description} + .button(href="{homepageContent.announcement.link}" onclick="{openExternal(globalizeLink(homepageContent.announcement.link))}") + svg.feather + use(xlink:href="#external-link") + span {homepageContent.announcement.linkLabel || vocGlob.open} + img(src="{globalizeLink(homepageContent.announcement.image)}" if="{homepageContent.announcement.image}") + + .aSpacer + a.button.nogrow.toright.inline(href="https://ctjs.rocks/submitgame" onclick="{openExternal('https://ctjs.rocks/submitgame')}") + svg.feather + use(xlink:href="#mail") + span {voc.submitYourOwn} + h2.nogrow.nmt(if="{homepageContent && homepageContent.games && homepageContent.games.length}") + | {voc.gamesFromCommunity} + .clear + .home-news-FeaturedGames(if="{homepageContent && homepageContent.games && homepageContent.games.length}") + ul.Cards.largeicons.nmt(if="{homepageContent && homepageContent.games && homepageContent.games.length}") + li.aCard(each="{content in homepageContent.games}") + .aCard-aThumbnail + img(src="{globalizeLink(content.cover)}") + div + h3 {content.title} + i.dim {voc.authorBy.replace('$1', content.author)} + p {content.description} + button(onclick="{openExternal(globalizeLink(content.link))}") + svg.feather + use(xlink:href="#external-link") + span {vocGlob.open} + + .aSpacer + a.button.nogrow.toright.inline(href="https://ctjs.rocks/submitresource" onclick="{openExternal('https://ctjs.rocks/submitresource')}") + svg.feather + use(xlink:href="#mail") + span {voc.submitYourOwn} + h2.nogrow.nmt(if="{homepageContent && homepageContent.learn && homepageContent.learn.length}") + | {voc.learningResources} + .clear + .home-news-LearningResources(if="{homepageContent && homepageContent.learn && homepageContent.learn.length}") + ul.Cards.largeicons.nmt(if="{homepageContent && homepageContent.learn && homepageContent.learn.length}") + li.aCard(each="{content in homepageContent.learn}") + .aCard-aThumbnail + img(src="{globalizeLink(content.cover)}") + div + h3 {content.title} + i.dim {voc.authorBy.replace('$1', content.author)} + p {content.description} + button(onclick="{openExternal(globalizeLink(content.link))}") + svg.feather + use(xlink:href="#external-link") + span {vocGlob.open} + + + script. + this.namespace = 'intro'; + this.mixin(require('src/node_requires/riotMixins/voc').default); + + // Global announcements and homepage data + this.globalizeLink = link => { + if (link.startsWith('/')) { + return 'https://ctjs.rocks/' + link; + } + return link; + }; + + let needsHomepageFetch = false, + lastHomepageFetch; + if (localStorage.lastHomepageFetch) { + lastHomepageFetch = new Date(localStorage.lastHomepageFetch); + // Check once an hour + if ((new Date()) - lastHomepageFetch > 1000 * 60 * 60) { + needsHomepageFetch = true; + } + } else { + needsHomepageFetch = true; + } + if (needsHomepageFetch) { + setTimeout(() => { + fetch('https://ctjs.rocks/staticApis/ctHome.json') + .then(response => response.json()) + .then(json => { + if (!json.errors) { + localStorage.lastHomepageFetch = new Date(); + localStorage.lastHomepageFetchContent = JSON.stringify(json); + this.homepageContent = json; + this.update(); + } else { + console.error('Update check failed:'); + console.error(json.errors); + // Fallback to cached data + if (localStorage.lastHomepageFetchContent) { + this.homepageContent = JSON.parse(localStorage.lastHomepageFetchContent); + this.update(); + } + } + }) + .catch(() => { + // Fallback to cached data + if (localStorage.lastHomepageFetchContent) { + this.homepageContent = JSON.parse(localStorage.lastHomepageFetchContent); + this.update(); + } + }); + }, 0); + } else { + this.homepageContent = JSON.parse(localStorage.lastHomepageFetchContent); + } + + this.openExternal = link => e => { + nw.Shell.openExternal(link); + e.stopPropagation(); + e.preventDefault(); + }; diff --git a/src/riotTags/main-menu/export-desktop-panel.tag b/src/riotTags/main-menu/export-desktop-panel.tag index fa47a0f20..8b5d9eef9 100644 --- a/src/riotTags/main-menu/export-desktop-panel.tag +++ b/src/riotTags/main-menu/export-desktop-panel.tag @@ -3,21 +3,16 @@ export-desktop-panel.aDimmer .flexfix-header h2.nmt {voc.exportPanel} .flexfix-body - h3(if="{log.length}") - | {voc.log} - .rem.a(onclick="{copyLog}").toright {vocGlob.copy} .aSpacer(if="{!authoring.title}") .aPanel.pad.error(if="{!authoring.title}") {voc.projectTitleRequired} .aSpacer(if="{!authoring.description}") .aPanel.pad.warning(if="{!authoring.appId}") {voc.appIdRequired} - .aSpacer(if="{!nodeEnabled}") - .aPanel.pad.warning(if="{!nodeEnabled}") - p.nmt {voc.nodeJsNotFound} - p {voc.nodeJsIcons} - button(onclick="{openNodeJsDownloads}") {voc.nodeJsDownloadPage} - .aSpacer(if="{!nodeEnabled && authoring.appId && authoring.title && !log.length}") - .aPanel.pad.success(if="{nodeEnabled && authoring.appId && authoring.title && !log.length}") {voc.goodToGo} + .aSpacer(if="{authoring.appId && authoring.title && !log.length}") + .aPanel.pad.success(if="{authoring.appId && authoring.title && !log.length}") {voc.goodToGo} .aSpacer + h3(if="{log.length}") + | {voc.log} + .rem.a(onclick="{copyLog}").toright {vocGlob.copy} pre.selectable(if="{log.length}" ref="log") div(each="{text in log}") {text.toString()} .flexfix-footer @@ -33,38 +28,30 @@ export-desktop-panel.aDimmer span(if="{!working}") {voc.export} script. this.namespace = 'exportPanel'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); this.working = false; this.log = []; - global.currentProject.settings.export = global.currentProject.settings.export || {}; - this.projSettings = global.currentProject.settings; + window.currentProject.settings.export = window.currentProject.settings.export || {}; + this.projSettings = window.currentProject.settings; this.authoring = this.projSettings.authoring; - this.nodeEnabled = require('./data/node_requires/platformUtils').isNodeInstalled; - this.openNodeJsDownloads = () => { - nw.Shell.openExternal('https://nodejs.org/en/download/'); - }; - this.on('update', () => { - this.nodeEnabled = require('./data/node_requires/platformUtils').isNodeInstalled; - }); - // eslint-disable-next-line max-lines-per-function this.export = async () => { this.working = true; this.log = ['Exporting the web build…']; this.update(); - const runCtExport = require('./data/node_requires/exporter').exportCtProject; - const {exportForDesktop} = require('./data/node_requires/exporter/desktopPackager'); + const runCtExport = require('src/node_requires/exporter').exportCtProject; + const {exportForDesktop} = require('src/node_requires/exporter/packagers/desktop'); const {dirname} = require('path'); try { - const projectDir = global.projdir; - const exportedPath = await runCtExport(global.currentProject, projectDir, true, true); + const projectDir = window.projdir; + const exportedPath = await runCtExport(window.currentProject, projectDir, true, true); const buildsPath = await exportForDesktop( - global.currentProject, + window.currentProject, dirname(exportedPath), logLine => { this.log.push(logLine); diff --git a/src/riotTags/main-menu/export-mobile-panel.tag b/src/riotTags/main-menu/export-mobile-panel.tag index f02fd1c4b..f6d21b569 100644 --- a/src/riotTags/main-menu/export-mobile-panel.tag +++ b/src/riotTags/main-menu/export-mobile-panel.tag @@ -71,17 +71,17 @@ export-mobile-panel.aDimmer span(if="{!working}") {voc.export} script. this.namespace = 'exportPanel'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); this.working = false; this.log = []; - this.nodeEnabled = require('./data/node_requires/platformUtils').isNodeInstalled; + this.nodeEnabled = require('src/node_requires/platformUtils').isNodeInstalled; this.openNodeJsDownloads = () => { nw.Shell.openExternal('https://nodejs.org/en/download/'); }; this.on('update', () => { - this.nodeEnabled = require('./data/node_requires/platformUtils').isNodeInstalled; + this.nodeEnabled = require('src/node_requires/platformUtils').isNodeInstalled; // eslint-disable-next-line no-process-env this.noAndroidSdkFound = !process.env.ANDROID_SDK_ROOT; // eslint-disable-next-line no-process-env @@ -94,9 +94,9 @@ export-mobile-panel.aDimmer } }); - this.projSettings = global.currentProject.settings; + this.projSettings = window.currentProject.settings; - const {exportCtProject} = require('./data/node_requires/exporter'); + const {exportCtProject} = require('src/node_requires/exporter'); const {dirname} = require('path'); this.export = async () => { if (this.working) { @@ -109,11 +109,11 @@ export-mobile-panel.aDimmer this.update(); }; try { - const projectDir = global.projdir; - const exportedPath = await exportCtProject(global.currentProject, projectDir, true, false); - const {exportMobile} = require('./data/node_requires/exporter/mobilePackager'); + const projectDir = window.projdir; + const exportedPath = await exportCtProject(window.currentProject, projectDir, true, false); + const {exportMobile} = require('src/node_requires/exporter/packagers/mobile'); const apkFolder = await exportMobile( - global.currentProject, + window.currentProject, dirname(exportedPath), onProgress ); diff --git a/src/riotTags/main-menu/icon-panel.tag b/src/riotTags/main-menu/icon-panel.tag index fbef696ab..6ed6fae18 100644 --- a/src/riotTags/main-menu/icon-panel.tag +++ b/src/riotTags/main-menu/icon-panel.tag @@ -15,7 +15,7 @@ icon-panel.aView.pad span {icon} script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); const fs = require('fs-extra'); fs.readJSON('./data/icons.json') diff --git a/src/riotTags/main-menu/license-panel.tag b/src/riotTags/main-menu/license-panel.tag index a285ea011..e28748938 100644 --- a/src/riotTags/main-menu/license-panel.tag +++ b/src/riotTags/main-menu/license-panel.tag @@ -4,7 +4,7 @@ license-panel svg.feather use(href="#x") .aModal.pad.appear - h1 {voc.ctjsLicense} + h1.nmt {voc.ctjsLicense} p b {voc.faq} ul @@ -72,6 +72,30 @@ license-panel The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + h2 Alma Sakura VSCode theme by hoshinokanade + pre + code. + The MIT License (MIT) + + Copyright (c) 2021 As-Alma + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -184,6 +208,55 @@ license-panel LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + h2 Golden Eye VSCode theme by ProphetsAI + pre + code. + MIT License + + Copyright (c) 2024 ProphezAI + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + h2 One Dark Pro VSCode theme by Binaryify + pre + code. + The MIT License (MIT) + + Copyright (c) 2013-2022 Binaryify + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. h2 Open Sans font by Steve Matteson p Released under #[a(href="http://www.apache.org/licenses/LICENSE-2.0") Apache License 2.0]. @@ -657,6 +730,29 @@ license-panel Modified by CoMiGo Games admin@nersta.ru */ + h2 Synthwave '84 theme by robb0wen + code. + MIT License + + Copyright (c) 2019 Robb Owen + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. h2 Horizon theme p. ct.js has an adapted version of this theme. @@ -773,7 +869,7 @@ license-panel script. this.namespace = 'licensePanel'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.closeModal = () => { this.parent.showLicense = false; this.parent.update(); diff --git a/src/riotTags/main-menu/main-menu-deploy.tag b/src/riotTags/main-menu/main-menu-deploy.tag index a25e9afff..87b3d4cb2 100644 --- a/src/riotTags/main-menu/main-menu-deploy.tag +++ b/src/riotTags/main-menu/main-menu-deploy.tag @@ -19,36 +19,18 @@ main-menu-deploy export-mobile-panel(show="{showMobileExporter}" onclose="{hideMobileExporter}") script. this.namespace = 'mainMenu.deploy'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.exportForWeb = async () => { - const fs = require('fs-extra'), - path = require('path'); - const {getBuildDir, getExportDir} = require('./data/node_requires/platformUtils'); - const buildFolder = await getBuildDir(); - const runCtExport = require('./data/node_requires/exporter').exportCtProject; - const exportFile = path.join( - buildFolder, - `${global.currentProject.settings.authoring.title || 'ct.js game'}.zip` - ); - const inDir = await getExportDir(); - await fs.remove(exportFile); - runCtExport(global.currentProject, global.projdir, true) - .then(() => { - const archiver = require('archiver'); - const archive = archiver('zip'), - output = fs.createWriteStream(exportFile); - - output.on('close', () => { - nw.Shell.showItemInFolder(exportFile); - alertify.success(this.voc.successZipExport.replace('{0}', exportFile)); - }); - - archive.pipe(output); - archive.directory(inDir, false); - archive.finalize(); - }) - .catch(alertify.error); + const {exportForWeb} = require('src/node_requires/exporter/packagers/web'); + try { + const exportFile = await exportForWeb(); + nw.Shell.showItemInFolder(exportFile); + alertify.success(this.voc.successZipExport.replace('{0}', exportFile)); + } catch (e) { + alertify.error(e); + throw e; + } }; this.showDesktopExporter = false; diff --git a/src/riotTags/main-menu/main-menu-latest-projects.tag b/src/riotTags/main-menu/main-menu-latest-projects.tag index 5524848f3..a6f96318f 100644 --- a/src/riotTags/main-menu/main-menu-latest-projects.tag +++ b/src/riotTags/main-menu/main-menu-latest-projects.tag @@ -5,7 +5,7 @@ main-menu-latest-projects span {project} script. this.namespace = 'mainMenu.latestProjects'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.refreshLatestProjects = function refreshLatestProjects() { if (('lastProjects' in localStorage) && @@ -21,7 +21,7 @@ main-menu-latest-projects this.loadLatestProject = projPath => { alertify.confirm(this.vocGlob.reallyExitConfirm, e => { if (e) { - const {openProject} = require('./data/node_requires/resources/projects'); + const {openProject} = require('src/node_requires/resources/projects'); window.signals.trigger('resetAll'); openProject(projPath); } diff --git a/src/riotTags/main-menu/main-menu-meta.tag b/src/riotTags/main-menu/main-menu-meta.tag index a19047547..68d38e8fe 100644 --- a/src/riotTags/main-menu/main-menu-meta.tag +++ b/src/riotTags/main-menu/main-menu-meta.tag @@ -48,7 +48,7 @@ main-menu-meta license-panel(if="{licenseOpened}" onclose="{hideLicense}") script. this.namespace = 'mainMenu.meta'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.iconsOpened = false; this.showLicense = false; diff --git a/src/riotTags/main-menu/main-menu-project.tag b/src/riotTags/main-menu/main-menu-project.tag index 27ee37005..9a84c8eaf 100644 --- a/src/riotTags/main-menu/main-menu-project.tag +++ b/src/riotTags/main-menu/main-menu-project.tag @@ -33,7 +33,7 @@ main-menu-project span {voc.convertToJs} script. this.namespace = 'mainMenu.project'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.saveProject = () => { window.signals.trigger('saveProject'); @@ -42,44 +42,21 @@ main-menu-project this.openIncludeFolder = () => { const fs = require('fs-extra'), path = require('path'); - fs.ensureDir(path.join(global.projdir, '/include')) + fs.ensureDir(path.join(window.projdir, '/include')) .then(() => { - nw.Shell.openItem(path.join(global.projdir, '/include')); + nw.Shell.openItem(path.join(window.projdir, '/include')); }); }; this.zipProject = async () => { + const {zipProject} = require('src/node_requires/resources/projects/zip'); try { - const os = require('os'), - path = require('path'), - fs = require('fs-extra'); - const {getWritableDir} = require('./data/node_requires/platformUtils'); - - const writable = await getWritableDir(); - const inDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ctZipProject-')), - outName = path.join(writable, `/${sessionStorage.projname}.zip`); - - await this.saveProject(); - await fs.remove(outName); - await fs.remove(inDir); - await fs.copy(global.projdir + '.ict', path.join(inDir, sessionStorage.projname)); - await fs.copy(global.projdir, path.join(inDir, sessionStorage.projname.slice(0, -4))); - - const archiver = require('archiver'); - const archive = archiver('zip'), - output = fs.createWriteStream(outName); - - output.on('close', () => { - nw.Shell.showItemInFolder(outName); - alertify.success(this.voc.successZipProject.replace('{0}', outName)); - fs.remove(inDir); - }); - - archive.pipe(output); - archive.directory(inDir, false); - archive.finalize(); + const outName = await zipProject(); + nw.Shell.showItemInFolder(outName); + alertify.success(this.voc.successZipProject.replace('{0}', outName)); } catch (e) { alertify.error(e); + throw e; } }; @@ -94,14 +71,14 @@ main-menu-project return; } window.signals.trigger('resetAll'); - const {openProject} = require('./data/node_requires/resources/projects'); + const {openProject} = require('src/node_requires/resources/projects'); openProject(projFile); }); }; this.openProject = async () => { - const glob = require('./data/node_requires/glob'); - const projects = require('./data/node_requires/resources/projects'); + const glob = require('src/node_requires/glob'); + const projects = require('src/node_requires/resources/projects'); if (!glob.modified) { this.openProjectSelector(await projects.getDefaultProjectDir()); } else { @@ -115,8 +92,8 @@ main-menu-project }; this.openExample = async () => { - const glob = require('./data/node_requires/glob'); - const projects = require('./data/node_requires/resources/projects'); + const glob = require('src/node_requires/glob'); + const projects = require('src/node_requires/resources/projects'); if (!glob.modified) { this.openProjectSelector(await projects.getExamplesDir()); } else { @@ -130,13 +107,15 @@ main-menu-project }; this.startNewWindow = () => { - const windowSettings = require('./package.json').window; + const windowSettings = require('app/package.json').window; nw.Window.open('index.html', windowSettings); - window.updateWindowMenu(); + if (window.updateWindowMenu) { + window.updateWindowMenu(); + } }; this.toStartScreen = () => { - const glob = require('./data/node_requires/glob'); + const glob = require('src/node_requires/glob'); if (!glob.modified) { window.signals.trigger('resetAll'); } else { @@ -153,7 +132,7 @@ main-menu-project if (!e) { return; } - const {convertCoffeeToJs} = require('./data/node_requires/resources/projects/convertLanguage'); + const {convertCoffeeToJs} = require('src/node_requires/resources/projects/convertLanguage'); convertCoffeeToJs(); this.update(); }); diff --git a/src/riotTags/main-menu/main-menu-settings.tag b/src/riotTags/main-menu/main-menu-settings.tag index 82abfb010..697853d7e 100644 --- a/src/riotTags/main-menu/main-menu-settings.tag +++ b/src/riotTags/main-menu/main-menu-settings.tag @@ -18,10 +18,22 @@ main-menu-settings use(xlink:href="#{localStorage.prideMode === 'on' ? 'check-square' : 'square'}") span {voc.prideMode} ul.aMenu + li(onclick="{toggleAutoapplyOnLaunch}" title="{voc.autoapplyOnLaunch}") + svg.feather + use(xlink:href="#{localStorage.autoapplyOnLaunch === 'on' ? 'check-square' : 'square'}") + span {voc.autoapplyOnLaunch} li(onclick="{toggleTemplatesLayout}" title="{voc.altTemplateLayout}") svg.feather use(xlink:href="#{localStorage.altTemplateLayout === 'on' ? 'check-square' : 'square'}") span {voc.altTemplateLayout} + li( + if="{window.currentProject.language === 'catnip'}" + onclick="{toggleCatnipLayout}" + title="{voc.scrollableCatnipLibrary}" + ) + svg.feather + use(xlink:href="#{localStorage.scrollableCatnipLibrary === 'on' ? 'check-square' : 'square'}") + span {voc.scrollableCatnipLibrary} li(onclick="{toggleSounds}" title="{voc.disableSounds}") svg.feather use(xlink:href="#{localStorage.disableSounds === 'on' ? 'check-square' : 'square'}") @@ -30,6 +42,16 @@ main-menu-settings svg.feather use(xlink:href="#{localStorage.forceProductionForDebug === 'yes' ? 'check-square' : 'square'}") span {voc.forceProductionForDebug} + li(onclick="{toggleDebuggerLayout}" title="{voc.changeDebuggerLayout}") + svg.feather(if="{localStorage.debuggerMode === 'split'}") + use(xlink:href="#layout-vertical") + svg.feather(if="{localStorage.debuggerMode === 'multiwindow'}") + use(xlink:href="#copy") + svg.feather(if="{!localStorage.debuggerMode || localStorage.debuggerMode === 'automatic'}") + use(xlink:href="#sparkles") + span(if="{localStorage.debuggerMode === 'split'}") {voc.debuggerLayout}: {voc.debuggerLayouts.split} + span(if="{localStorage.debuggerMode === 'multiwindow'}") {voc.debuggerLayout}: {voc.debuggerLayouts.multiwindow} + span(if="{!localStorage.debuggerMode || localStorage.debuggerMode === 'automatic'}") {voc.debuggerLayout}: {voc.debuggerLayouts.automatic} ul.aMenu li(onclick="{zoomIn}") svg.feather @@ -49,15 +71,21 @@ main-menu-settings context-menu(menu="{codeFontSubmenu}" ref="codesettings") script. this.namespace = 'mainMenu.settings'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.openLanguageSelector = () => { this.showLanguageSelector = true; }; + this.toggleAutoapplyOnLaunch = () => { + localStorage.autoapplyOnLaunch = localStorage.autoapplyOnLaunch === 'on' ? 'off' : 'on'; + }; this.toggleTemplatesLayout = () => { localStorage.altTemplateLayout = localStorage.altTemplateLayout === 'on' ? 'off' : 'on'; }; + this.toggleCatnipLayout = () => { + localStorage.scrollableCatnipLibrary = localStorage.scrollableCatnipLibrary === 'on' ? 'off' : 'on'; + }; this.toggleSounds = () => { localStorage.disableSounds = (localStorage.disableSounds || 'off') === 'off' ? 'on' : 'off'; }; @@ -82,9 +110,18 @@ main-menu-settings localStorage.forceProductionForDebug = 'yes'; } }; + this.toggleDebuggerLayout = () => { + if (localStorage.debuggerMode === 'split') { + localStorage.debuggerMode = 'multiwindow'; + } else if (localStorage.debuggerMode === 'multiwindow') { + localStorage.debuggerMode = 'automatic'; + } else { + localStorage.debuggerMode = 'split'; + } + }; this.requestDataFolderChange = () => { - require('./data/node_requires/platformUtils').requestWritableDir(); + require('src/node_requires/platformUtils').requestWritableDir(); }; this.zoomIn = () => { @@ -112,7 +149,7 @@ main-menu-settings localStorage.editorZooming = zoom; }; - const themeManager = require('./data/node_requires/themes'); + const themeManager = require('src/node_requires/themes'); this.themesSubmenu = { opened: false, items: themeManager.getThemeList().map(theme => ({ @@ -127,7 +164,7 @@ main-menu-settings }; this.switchLanguage = name => { - const {loadLanguage} = require('./data/node_requires/i18n.js'); + const {loadLanguage} = require('src/node_requires/i18n.js'); try { this.vocFull = loadLanguage(name); localStorage.appLanguage = name; @@ -140,7 +177,7 @@ main-menu-settings this.languagesSubmenu = { items: [] }; - const {getLanguages} = require('./data/node_requires/i18n'); + const {getLanguages} = require('src/node_requires/i18n'); getLanguages().then(languages => { for (const language of languages) { this.languagesSubmenu.items.push({ diff --git a/src/riotTags/main-menu/main-menu-troubleshooting.tag b/src/riotTags/main-menu/main-menu-troubleshooting.tag index 3e3f69246..4bae8e038 100644 --- a/src/riotTags/main-menu/main-menu-troubleshooting.tag +++ b/src/riotTags/main-menu/main-menu-troubleshooting.tag @@ -26,10 +26,10 @@ main-menu-troubleshooting span {voc.postAnIssue} script. this.namespace = 'mainMenu.troubleshooting'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); const fs = require('fs-extra'); - this.packageJson = require('./package.json'); + this.packageJson = require('app/package.json'); this.toggleVulkanSupport = async () => { const pj = this.packageJson; if (pj['chromium-args'].indexOf('--disable-features=Vulkan') === -1) { @@ -73,7 +73,7 @@ main-menu-troubleshooting `Chromium v${process.versions.chromium}\n` + `Node.js v${process.versions.node}\n` + `Pixi.js v${PIXI.VERSION}\n\n` + - `WebGPU ${navigator.gpu ? 'available' : 'UNAVAILABLE'}\n` + + // `WebGPU ${navigator.gpu ? 'available' : 'UNAVAILABLE'}\n` + `WebGL ${gl ? 'available' : 'UNAVAILABLE'}\n` + `WebGL vendor ${(debugInfo && vendor) || 'UNKNOWN'}\n` + `WebGL renderer ${(debugInfo && renderer) || 'UNKNOWN'}\n` + diff --git a/src/riotTags/main-menu/main-menu.tag b/src/riotTags/main-menu/main-menu.tag index 84967456e..dc1c50aa2 100644 --- a/src/riotTags/main-menu/main-menu.tag +++ b/src/riotTags/main-menu/main-menu.tag @@ -8,7 +8,7 @@ main-menu main-menu-troubleshooting.main-menu-aDoubleSection script. this.namespace = 'mainMenu'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.openIcons = () => { this.parent.tab = 'icons'; diff --git a/src/riotTags/main-menu/stylebook-panel.tag b/src/riotTags/main-menu/stylebook-panel.tag index 862ce1b18..9226283d3 100644 --- a/src/riotTags/main-menu/stylebook-panel.tag +++ b/src/riotTags/main-menu/stylebook-panel.tag @@ -898,7 +898,7 @@ stylebook-panel.aPanel.aView.pad.flexrow svg.feather use(xlink:href="#x") script. - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.tab = 'common'; this.openTab = tab => () => { this.tab = tab; diff --git a/src/riotTags/main-menu/stylebook-section.tag b/src/riotTags/main-menu/stylebook-section.tag index 1b261384b..cd0745434 100644 --- a/src/riotTags/main-menu/stylebook-section.tag +++ b/src/riotTags/main-menu/stylebook-section.tag @@ -13,7 +13,7 @@ stylebook-section script. const html2pug = require('html2pug'); const hljs = require('highlight.js'); - require('./data/node_requires/highlightjs-pug')(hljs); + require('src/node_requires/highlightjs-pug')(hljs); const pugifyOptions = { fragment: true, commas: false, diff --git a/src/riotTags/new-project-onboarding.tag b/src/riotTags/new-project-onboarding.tag index 1c3eaa5a5..a0c010458 100644 --- a/src/riotTags/new-project-onboarding.tag +++ b/src/riotTags/new-project-onboarding.tag @@ -30,7 +30,7 @@ new-project-onboarding span {voc.showOnboardingCheckbox} script. this.namespace = 'onboarding'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.close = () => { delete sessionStorage.showOnboarding; diff --git a/src/riotTags/notepad-panel.tag b/src/riotTags/notepad-panel.tag index 2fd23d5a5..d47b5e9ee 100644 --- a/src/riotTags/notepad-panel.tag +++ b/src/riotTags/notepad-panel.tag @@ -34,7 +34,7 @@ notepad-panel#notepad.aPanel.dockright(class="{opened: opened}") use(xlink:href="#{opened? 'chevron-right' : 'chevron-left'}") span {voc.docsAndNotes} script. - const glob = require('./data/node_requires/glob'); + const glob = require('src/node_requires/glob'); const updateEditor = () => { if (this.notepadglobal.getPureValue() !== localStorage.notes) { this.notepadglobal.setValue(localStorage.notes); @@ -43,7 +43,7 @@ notepad-panel#notepad.aPanel.dockright(class="{opened: opened}") this.opened = false; this.namespace = 'notepad'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.notepadToggle = function notepadToggle() { this.opened = !this.opened; if (this.tab === 'notepadglobal') { @@ -113,9 +113,9 @@ notepad-panel#notepad.aPanel.dockright(class="{opened: opened}") this.notepadglobal = window.setupCodeEditor(this.refs.notepadglobal, notepadProps); this.notepadglobal.setValue(localStorage.notes); - this.notepadlocal.setValue(global.currentProject.notes || ''); + this.notepadlocal.setValue(window.currentProject.notes || ''); this.notepadlocal.onDidChangeModelContent(() => { - global.currentProject.notes = this.notepadlocal.getValue(); + window.currentProject.notes = this.notepadlocal.getValue(); glob.modified = true; }); this.notepadglobal.onDidChangeModelContent(() => { diff --git a/src/riotTags/patrons-screen.tag b/src/riotTags/patrons-screen.tag index 567077a5d..8381baf93 100644 --- a/src/riotTags/patrons-screen.tag +++ b/src/riotTags/patrons-screen.tag @@ -1,9 +1,9 @@ patron-line - .aPatronEmoji {parent.getEmoji(opts.patron)} - b {opts.patron} + .aPatronEmoji {parent.getEmoji(opts.patron.name)} + b {opts.patron.name} | | - span {parent.getFiller(opts.patron)} + span {parent.getFiller(opts.patron.name)} patrons-screen.aView(style="z-index: 100;") .Confetti @@ -43,24 +43,24 @@ patrons-screen.aView(style="z-index: 100;") img(src="/data/img/boostyTiers_sponsor.png") | | {voc.sponsors} - patron-line(each="{patron in patrons.sponsors}" patron="{patron}") - p(if="{!patrons.sponsors.length}") {voc.noSponsorsYet} + patron-line(each="{patron in patrons.partner}" patron="{patron}") + p(if="{!patrons.partner.length}") {voc.noSponsorsYet} h2 img(src="/data/img/boostyTiers_businessCat.png") | | {voc.businessCats} - patron-line(each="{patron in patrons.businessCats}" patron="{patron}") + patron-line(each="{patron in patrons['business cat']}" patron="{patron}") h2 img(src="/data/img/boostyTiers_ct.png") | | {voc.cats} - patron-line(each="{patron in patrons.cats}" patron="{patron}") + patron-line(each="{patron in patrons.cat}" patron="{patron}") script. this.namespace = 'patreon'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.loading = true; this.emojis = [ '😊', @@ -88,12 +88,6 @@ patrons-screen.aView(style="z-index: 100;") '#17d3ff', '#ff4e91' ]; - this.patrons = { - shuttles: [], - pirates: [], - astronauts: [], - programmers: [] - }; const getMagicNumber = str => str.split('') .map(char => char.codePointAt(0)) @@ -105,17 +99,13 @@ patrons-screen.aView(style="z-index: 100;") this.getConfettiColor = () => this.confettiColors[Math.floor(Math.random() * this.confettiColors.length)]; - this.importPatronData = async () => { - const fs = require('fs-extra'); - const YAML = require('js-yaml'); - const raw = await fs.readFile('./data/boosters.yaml', 'utf8'); - const patronsYaml = YAML.load(raw); - - this.patrons = patronsYaml; + const {patrons, donors, getPatrons} = require('src/node_requires/patrons'); + getPatrons().then(() => { + this.patrons = patrons; + this.donors = donors; this.loading = false; this.update(); - }; - this.importPatronData(); + }); this.openBoosty = () => { nw.Shell.openExternal('https://boosty.to/comigo'); diff --git a/src/riotTags/project-selector.tag b/src/riotTags/project-selector.tag index c9e9bf6ad..b49af51ce 100644 --- a/src/riotTags/project-selector.tag +++ b/src/riotTags/project-selector.tag @@ -2,22 +2,17 @@ This tag shows the list of latest projects, examples, and templates. This is the tag you see after starting ct.js. project-selector - #theIntroBg.stretch.flexcol - .pad.left.nogrow.flexrow - button.inline.nogrow(onclick="{toggleLanguageSelector}") - svg.feather - use(xlink:href="#translate") - span {vocFull.mainMenu.settings.language} - .aSpacer - .nogrow.project-selector-aPatronsLine(if="{featuredPatron}") - svg.feather - use(xlink:href="#heart") - span(if="{featuredSponsor}") {voc.sponsoredBy.replace('$1', featuredPatron)} - span(if="{!featuredSponsor}") {voc.supportedBy.replace('$1', featuredPatron)} - .aSpacer - #intro.aPanel.flexfix.nogrow + div + button.inline.toright(onclick="{toggleLanguageSelector}") + svg.feather + use(xlink:href="#translate") + span {vocFull.mainMenu.settings.language} + h1.nmt(class="{en: vocFull.me.id === 'Eng'}") {welcomeHeader()} + .clear + .flexrow.project-selector-aMainSection + .aPanel.flexfix.nogrow ul.aNav.tabs.flexfix-header.nb - li(class="{active: tab === 'projects'}" onclick="{changeTab('projects')}") + li.nbl(class="{active: tab === 'projects'}" onclick="{changeTab('projects')}") svg.feather use(xlink:href="#folder") span {voc.latest} @@ -29,7 +24,7 @@ project-selector svg.feather use(xlink:href="#book-open") span {voc.examples} - li(class="{active: tab === 'templates'}" onclick="{changeTab('templates')}") + li.nbr(class="{active: tab === 'templates'}" onclick="{changeTab('templates')}") svg.feather use(xlink:href="#platformer") span {voc.templates} @@ -64,46 +59,52 @@ project-selector use(xlink:href="data/img/weirdFoldersIllustration.svg#illustration") br span {voc.nothingToShowFiller} - #theNewProjectField.flexfix-body.pad(show="{tab === 'create'}") - h2.nmt {voc.newProject.header} - .theNewProjectField-aLabel - b {voc.newProject.projectName} - .theNewProjectField-aValue - input( - type="text" - placeholder="{voc.newProject.input}" - pattern="[a-zA-Z_0-9]\\{1,\\}" - oninput="{setProjectName}" - width="20" - ) - .theNewProjectField-aLabel - b {voc.newProject.language} - .theNewProjectField-aValue - .aButtonGroup.nm - button.inline(onclick="{() => this.projectLanguage = 'coffeescript'}" class="{active: projectLanguage === 'coffeescript'}") - svg.icon - use(xlink:href="#coffeescript") - span CoffeeScript - button.inline(onclick="{() => this.projectLanguage = 'typescript'}" class="{active: projectLanguage === 'typescript'}") - svg.icon - use(xlink:href="#javascript") - span JavaScript - .anActionableIcon(onclick="{showCodeLanguageSelector}") - svg.feather - use(xlink:href="#help-circle") - .theNewProjectField-aLabel - b {voc.newProject.saveFolder} - .theNewProjectField-aValue.flexrow - button.inline.nogrow(onclick="{chooseProjectFolder}") + .flexfix-body.pad(show="{tab === 'create'}") + #theNewProjectField + h2.nmt {voc.newProject.header} + .theNewProjectField-aLabel + b {voc.newProject.projectName} + .theNewProjectField-aValue + input( + type="text" + placeholder="{voc.newProject.input}" + pattern="[a-zA-Z_0-9]\\{1,\\}" + oninput="{setProjectName}" + width="20" + maxlength="64" + ) + .theNewProjectField-aLabel + b {voc.newProject.language} + .theNewProjectField-aValue + .aButtonGroup.nm + button.inline(onclick="{() => this.projectLanguage = 'coffeescript'}" class="{active: projectLanguage === 'coffeescript'}") + svg.icon + use(xlink:href="#coffeescript") + span CoffeeScript + button.inline(onclick="{() => this.projectLanguage = 'typescript'}" class="{active: projectLanguage === 'typescript'}") + svg.icon + use(xlink:href="#javascript") + span JavaScript + button.inline(onclick="{() => this.projectLanguage = 'catnip'}" class="{active: projectLanguage === 'catnip'}") + svg.feather + use(xlink:href="#catnip") + span Catnip + .anActionableIcon(onclick="{showCodeLanguageSelector}") + svg.feather + use(xlink:href="#help-circle") + .theNewProjectField-aLabel + b {voc.newProject.saveFolder} + .theNewProjectField-aValue.flexrow + button.inline.nogrow(onclick="{chooseProjectFolder}") + svg.feather + use(xlink:href="#folder") + span {vocGlob.selectDialogue} + .aSpacer.nogrow + span.crop.small {requirePath.join(savePath, projectName)} + button.big.theNewProjectField-aButton(onclick="{createProject}") svg.feather - use(xlink:href="#folder") - span {vocGlob.selectDialogue} - .aSpacer.nogrow - span.crop.small {requirePath.join(savePath, projectName)} - button.big.theNewProjectField-aButton(onclick="{createProject}") - svg.feather - use(xlink:href="#sparkles") - span {vocGlob.create} + use(xlink:href="#sparkles") + span {vocGlob.create} .flexfix-body.pad(show="{tab === 'examples'}") .flexrow h2.nmt {voc.examples} @@ -145,37 +146,66 @@ project-selector button.tiny(onclick="{cloneProject}" title="{voc.cloneProject}") svg.feather use(xlink:href="#copy") - .aSpacer - .aVersionNumber.nogrow - a(href="https://github.com/orgs/ct-js/" title="{voc.github}" onclick="{openExternal('https://github.com/orgs/ct-js/')}") - svg.icon - use(xlink:href="#github") - a(href="https://comigo.itch.io/ct" title="{voc.itch}" onclick="{openExternal('https://comigo.itch.io/ct')}") + aside.flexcol + svg.anIllustration.wide + use(xlink:href="data/img/ctjsLogo.svg#illustration") + .center + | Ct.js v{ctjsVersion}. ({getCtPackageType()}) + div(if="{newVersion}") + span {newVersion} + | + | + img(src="data/img/partycarrot.gif" if="{newVersion}").aPartyCarrot + // as itch releases are always in sync with the fetched version number, let's route users to itch.io page + .button(if="{newVersion}" href="https://comigo.itch.io/ct#download" onclick="{openExternal}") + svg.feather + use(xlink:href="#external-link") + span {vocGlob.download} + .center.project-selector-SocialLinks + a(href="https://github.com/orgs/ct-js/" title="{voc.github}" onclick="{openExternal('https://github.com/orgs/ct-js/')}") + svg.icon + use(xlink:href="#github") + a(href="https://comigo.itch.io/ct" title="{voc.itch}" onclick="{openExternal('https://comigo.itch.io/ct')}") + svg.icon + use(xlink:href="#itch-dot-io") + a(href="{vocFull.regionalLinks.discord}" title="{voc.discord}" onclick="{openExternal(vocFull.regionalLinks.discord)}") + svg.icon + use(xlink:href="#discord") + a(href="https://twitter.com/ctjsrocks" title="{voc.twitter}" onclick="{openExternal('https://twitter.com/ctjsrocks')}") + svg.icon + use(xlink:href="#twitter") + a(href="{vocFull.regionalLinks.telegram}" title="{voc.telegram}" onclick="{openExternal(vocFull.regionalLinks.telegram)}") + svg.icon + use(xlink:href="#telegram") + a(href="https://vk.com/ctjsrocks" title="{voc.vkontakte}" onclick="{openExternal('https://vk.com/ctjsrocks')}") + svg.icon + use(xlink:href="#vk") + // + a(href="https:/patreon.com/comigo" title="{voc.patreon}" onclick="{openExternal('https:/patreon.com/comigo')}") + svg.icon + use(xlink:href="#patreon") + a(href="https://boosty.to/comigo" title="{voc.boosty}" onclick="{openExternal('https://boosty.to/comigo')}") + svg.icon + use(xlink:href="#boosty") + .aSpacer + .center.project-selector-aPatronsLine(if="{featuredPatron}") + svg.feather + use(xlink:href="#heart") + span(if="{featuredPatron.rank === 'partner'}") {voc.sponsoredBy.replace('$1', featuredPatron.name)} + span(if="{featuredPatron.rank !== 'partner'}") {voc.supportedBy.replace('$1', featuredPatron.name)} + .button(href="https://boosty.to/comigo" onclick="{openExternal('https://boosty.to/comigo')}") svg.icon - use(xlink:href="#itch-dot-io") - a(href="https://discord.gg/yuvuDW5" title="{voc.discord}" onclick="{openExternal('https://discord.gg/yuvuDW5')}") + use(xlink:href="#boosty") + span {vocGlob.donate} + .button(href="{vocFull.regionalLinks.discord}" onclick="{openExternal(vocFull.regionalLinks.discord)}") svg.icon use(xlink:href="#discord") - a(href="https://twitter.com/ctjsrocks" title="{voc.twitter}" onclick="{openExternal('https://twitter.com/ctjsrocks')}") - svg.icon - use(xlink:href="#twitter") - a(href="https://vk.com/ctjsrocks" title="{voc.vkontakte}" onclick="{openExternal('https://vk.com/ctjsrocks')}") + span {voc.discord} + .button(href="{vocFull.regionalLinks.telegram}" onclick="{openExternal(vocFull.regionalLinks.telegram)}") svg.icon - use(xlink:href="#vk") - // - a(href="https:/patreon.com/comigo" title="{voc.patreon}" onclick="{openExternal('https:/patreon.com/comigo')}") - svg.icon - use(xlink:href="#patreon") - a(href="https://boosty.to/comigo" title="{voc.boosty}" onclick="{openExternal('https://boosty.to/comigo')}") - svg.icon - use(xlink:href="#boosty") - .inlineblock v{ctjsVersion}. - | - | - // as itch releases are always in sync with the fetched version number, let's route users to itch.io page - a.inlineblock(if="{newVersion}" href="https://comigo.itch.io/ct#download" onclick="{openExternal}") - | {newVersion} - img(src="data/img/partycarrot.gif" if="{newVersion}").aPartyCarrot + use(xlink:href="#telegram") + span {voc.telegram} + home-news context-menu(menu="{languagesSubmenu}" ref="languageslist") coding-language-selector( if="{codeLanguageSelector}" @@ -185,17 +215,32 @@ project-selector script. const fs = require('fs-extra'), path = require('path'); - this.isMac = require('./data/node_requires/platformUtils').isMac; - const {openProject} = require('./data/node_requires/resources/projects'); + this.isMac = require('src/node_requires/platformUtils').isMac; + const {openProject} = require('src/node_requires/resources/projects'); this.ctjsVersion = process.versions.ctjs; this.requirePath = path; this.namespace = 'intro'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + + let randIndex; + if (!localStorage.firstRunWelcome) { + localStorage.firstRunWelcome = 'shown'; + this.welcomeHeader = () => this.voc.newUserHeader; + } else { + randIndex = Math.floor(Math.random() * this.voc.welcomeHeaders.length); + this.welcomeHeader = () => { + // Might get out of bounds after a language changes, recheck the index + if (randIndex >= this.voc.welcomeHeaders.length) { + randIndex = Math.floor(Math.random() * this.voc.welcomeHeaders.length); + } + return this.voc.welcomeHeaders[randIndex]; + }; + } this.savePath = ''; this.projectLanguage = void 0; this.projectName = ''; - const {getProjectsDir} = require('./data/node_requires/platformUtils'); + const {getProjectsDir} = require('src/node_requires/platformUtils'); let defaultProjectDir; getProjectsDir().then(way => { defaultProjectDir = way + '/'; @@ -249,7 +294,7 @@ project-selector this.latestProjects = []; } - const projects = require('./data/node_requires/resources/projects'); + const projects = require('src/node_requires/resources/projects'); this.getProjectThumbnail = projects.getProjectThumbnail; this.exampleProjects = []; @@ -281,8 +326,8 @@ project-selector */ this.newProject = async (way, codename) => { sessionStorage.showOnboarding = true; - const defaultProject = require('./data/node_requires/resources/projects/defaultProject').get(); - const {gitignore} = require('./data/node_requires/resources/projects/defaultGitignore'); + const defaultProject = require('src/node_requires/resources/projects/defaultProject').get(); + const {gitignore} = require('src/node_requires/resources/projects/defaultGitignore'); defaultProject.language = this.projectLanguage; const YAML = require('js-yaml'); const projectYAML = YAML.safeDump(defaultProject); @@ -291,14 +336,14 @@ project-selector alertify.error(this.voc.unableToWriteToFolders + '\n' + e); throw e; }); - global.projdir = path.join(way, codename); + window.projdir = path.join(way, codename); sessionStorage.projname = codename + '.ict'; - await fs.ensureDir(path.join(global.projdir, '/img')); - fs.ensureDir(path.join(global.projdir, '/snd')); - fs.ensureDir(path.join(global.projdir, '/include')); + await fs.ensureDir(path.join(window.projdir, '/img')); + fs.ensureDir(path.join(window.projdir, '/snd')); + fs.ensureDir(path.join(window.projdir, '/include')); fs.outputFile(path.join(way, '.gitignore'), gitignore); setTimeout(() => { // for some reason, it must be done through setTimeout; otherwise it fails - fs.copy('./data/img/notexture.png', path.join(global.projdir + '/img/splash.png'), e => { + fs.copy('./data/img/notexture.png', path.join(window.projdir + '/img/splash.png'), e => { if (e) { alertify.error(e); console.error(e); @@ -396,7 +441,7 @@ project-selector * Handler for a manual search for a project, triggered by an input[type="file"] */ this.openProjectFind = async () => { - const defaultProjectDir = require('./data/node_requires/resources/projects').getDefaultProjectDir(); + const defaultProjectDir = require('src/node_requires/resources/projects').getDefaultProjectDir(); const proj = await window.showOpenDialog({ filter: '.ict', defaultPath: await defaultProjectDir @@ -407,7 +452,8 @@ project-selector if (path.extname(proj).toLowerCase() === '.ict') { openProject(proj); sessionStorage.projname = path.basename(proj); - global.projdir = path.dirname(proj) + path.sep + path.basename(proj, '.ict'); + // eslint-disable-next-line require-atomic-updates + window.projdir = path.dirname(proj) + path.sep + path.basename(proj, '.ict'); } else { alertify.error(this.vocGlob.wrongFormat); } @@ -428,7 +474,7 @@ project-selector } if (needsUpdateCheck) { setTimeout(() => { - const {isWin, isLinux} = require('./data/node_requires/platformUtils.js'); + const {isWin, isLinux} = require('src/node_requires/platformUtils.js'); let channel = 'osx64'; if (isWin) { channel = 'win64'; @@ -467,7 +513,7 @@ project-selector this.languagesSubmenu = { items: [] }; - const {getLanguages} = require('./data/node_requires/i18n'); + const {getLanguages} = require('src/node_requires/i18n'); getLanguages().then(languages => { for (const language of languages) { if (language.filename === 'Debug.json') { @@ -487,7 +533,7 @@ project-selector alertify.error(`Error while finding i18n files: ${e}`); }); this.switchLanguage = name => { - const {loadLanguage} = require('./data/node_requires/i18n.js'); + const {loadLanguage} = require('src/node_requires/i18n.js'); try { this.vocFull = loadLanguage(name); localStorage.appLanguage = name; @@ -501,22 +547,27 @@ project-selector this.refs.languageslist.popup(e.clientX, e.clientY); }; + const {getRandomPatron} = require('src/node_requires/patrons'); + getRandomPatron().then(patron => { + this.featuredPatron = patron; + }); - this.importPatronData = async () => { - const fs = require('fs-extra'); - const YAML = require('js-yaml'); - const raw = await fs.readFile('./data/boosters.yaml', 'utf8'); - const patronsYaml = YAML.load(raw); - this.patrons = patronsYaml; - const {sponsors, businessCats, cats} = this.patrons; - if (sponsors.length && Math.random() < 0.5) { // sponsors get priority over other tiers - this.featuredPatron = sponsors[Math.floor(Math.random() * sponsors.length)]; - this.featuredSponsor = true; - } else if (businessCats.length && Math.random() < 0.5) { - this.featuredPatron = businessCats[Math.floor(Math.random() * businessCats.length)]; - } else { - this.featuredPatron = cats[Math.floor(Math.random() * cats.length)]; + this.packageType = null; + this.getCtPackageType = () => { + if (!this.packageType) { + const packaged = path.basename(process.execPath, path.extname(process.execPath)) !== 'nw'; + if (packaged) { + this.packageType = 'released'; + fs.pathExists('./package.nw/data/nigthly') + .then(exists => { + if (exists) { + this.packageType = 'nightly'; + this.update(); + } + }); + } else { + this.packageType = 'dev'; + } } - this.update(); + return this.voc.ctDistributions[this.packageType]; }; - this.importPatronData(); diff --git a/src/riotTags/project-settings/project-settings.tag b/src/riotTags/project-settings/project-settings.tag index fc74d2868..8030feb66 100644 --- a/src/riotTags/project-settings/project-settings.tag +++ b/src/riotTags/project-settings/project-settings.tag @@ -43,40 +43,42 @@ project-settings.aPanel.aView.pad.flexrow svg.feather use(xlink:href=`#{contentType.icon || 'copy'}`) span {contentType.readableName || contentType.name || voc.content.missingTypeName} - main.aPanel + // The .tall class clips its content (overflow: auto), but scripts tab needs to cover space otherwise used for padding of .aPanel class. + // Disable .tall class for the scripts tab to allow it to be absolutely positioned on the whole panel. + main.aPanel.relative(class="{tall: tab !== 'scripts'}") each name in tabs - div(if=`{tab === '${name}'}`) + div(if=`{tab === '${name}'}` class="{tall: tab !== 'scripts', relative: tab !== 'scripts'}") // This outputs a templated tag name. Magic! #{name + '-settings'} .pad(if="{tab === 'moduleSettings' && currentModule}") h1 {localizeField(currentModule.manifest.main, 'name')} - extensions-editor(customextends="{currentModule.manifest.fields}" entity="{global.currentProject.libs[currentModule.name]}") + extensions-editor(customextends="{currentModule.manifest.fields}" entity="{window.currentProject.libs[currentModule.name]}") content-editor(if="{tab === 'contentEntriesEditor' && currentContentType}" contenttype="{currentContentType}") script. this.namespace = 'settings'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.currentProject = global.currentProject; + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.currentProject = window.currentProject; this.currentProject.settings.fps = this.currentProject.settings.fps || 30; this.tab = 'main'; this.openTab = tab => () => { if (this.tab === 'content') { // Update type definitions for content types when swutching away from the content tab - require('./data/node_requires/resources/content') - .updateContentTypedefs(global.currentProject); + require('src/node_requires/resources/content') + .updateContentTypedefs(window.currentProject); } this.tab = tab; this.currentModule = null; this.currentContentType = null; }; - const {loadModules, getIcon} = require('./data/node_requires/resources/modules'); + const {loadModules, getIcon} = require('src/node_requires/resources/modules'); this.getIcon = getIcon; this.modulesWithFields = []; this.updateModulesWithFields = async () => { this.modulesWithFields = (await loadModules()) - .filter(module => module.name in global.currentProject.libs) + .filter(module => module.name in window.currentProject.libs) .filter(module => module.manifest.fields); this.update(); }; @@ -90,6 +92,8 @@ project-settings.aPanel.aView.pad.flexrow this.tab = 'contentEntriesEditor'; this.currentContentType = contentType; this.update(); + require('src/node_requires/resources/content') + .updateContentTypedefs(window.currentProject); }; window.orders.on('openContentEntries', contentEditorListener); this.on('unmount', () => { @@ -112,4 +116,6 @@ project-settings.aPanel.aView.pad.flexrow this.currentModule = null; this.currentContentType = type; this.tab = 'contentEntriesEditor'; + require('src/node_requires/resources/content') + .updateContentTypedefs(window.currentProject); }; diff --git a/src/riotTags/project-settings/tabs/actions-input-selector.tag b/src/riotTags/project-settings/tabs/actions-input-selector.tag index 804904c2c..782c14c81 100644 --- a/src/riotTags/project-settings/tabs/actions-input-selector.tag +++ b/src/riotTags/project-settings/tabs/actions-input-selector.tag @@ -33,8 +33,8 @@ actions-input-selector span {voc.select} {selectedMethods.length || ''} script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); const fs = require('fs-extra'), path = require('path'); @@ -48,7 +48,7 @@ actions-input-selector this.refreshModules = () => { this.inputProviders = []; const promises = []; - for (const modName in global.currentProject.libs) { + for (const modName in window.currentProject.libs) { const promise = fs.readJSON(path.join(libsDir, modName, 'module.json')) .then(catmod => { diff --git a/src/riotTags/project-settings/tabs/actions-settings.tag b/src/riotTags/project-settings/tabs/actions-settings.tag index 058313c63..d7c0a3fb6 100644 --- a/src/riotTags/project-settings/tabs/actions-settings.tag +++ b/src/riotTags/project-settings/tabs/actions-settings.tag @@ -2,8 +2,8 @@ actions-settings h1 | {voc.heading} docs-shortcut(path="/actions.html") - p(if="{!global.currentProject.actions || !global.currentProject.actions.length}") {voc.noActionsYet} - div(if="{!global.currentProject.actions || !global.currentProject.actions.length}") + p(if="{!window.currentProject.actions || !window.currentProject.actions.length}") {voc.noActionsYet} + div(if="{!window.currentProject.actions || !window.currentProject.actions.length}") button.nml(onclick="{addNewAction}") svg.feather use(xlink:href="#plus") @@ -21,14 +21,14 @@ actions-settings svg.feather use(xlink:href="#download") span {voc.presetCustom} - div(if="{global.currentProject.actions && global.currentProject.actions.length}") + div(if="{window.currentProject.actions && window.currentProject.actions.length}") li.hide800.npl.npr .c4.npt.npb.npl b {voc.actions} .c8.np b {voc.methods} .clear - li.npl.npt(each="{action, ind in global.currentProject.actions}") + li.npl.npt(each="{action, ind in window.currentProject.actions}") .c4.npl.breakon800 .flexrow.middle div.relative.wide @@ -43,14 +43,14 @@ actions-settings li.flexrow.middle.npl(each="{method, mInd in action.methods}") .fifty.npt.npl.npb code.inline {method.code} - svg.feather.orange(if="{!(method.code.split('.')[0] in global.currentProject.libs)}" title="{voc.methodModuleMissing}") + svg.feather.orange(if="{!(method.code.split('.')[0] in window.currentProject.libs)}" title="{voc.methodModuleMissing}") use(xlink:href="#alert-circle") .fifty.npt.npr.npb b {voc.multiplier}: input.short( type="number" step="0.1" value="{method.multiplier === void 0? 1 : method.multiplier}" - onchange="{wire('global.currentProject.actions.'+ ind +'.methods.'+ mInd +'.multiplier')}" + onchange="{wire('window.currentProject.actions.'+ ind +'.methods.'+ mInd +'.multiplier')}" ) svg.feather.a(title="{voc.deleteMethod}" onclick="{deleteMethod(action)}") use(xlink:href="#x") @@ -71,19 +71,19 @@ actions-settings .aDimmer(show="{addingMethod}") actions-input-selector(action="{editedAction}" ref="methodSelector") script. - global.currentProject.actions = global.currentProject.actions || []; + window.currentProject.actions = window.currentProject.actions || []; this.namespace = 'settings.actions'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); this.addNewAction = () => { - global.currentProject.actions.push({ + window.currentProject.actions.push({ name: 'NewAction', methods: [] }); }; this.deleteAction = e => { - const ind = global.currentProject.actions.indexOf(e.item.action); - global.currentProject.actions.splice(ind, 1); + const ind = window.currentProject.actions.indexOf(e.item.action); + window.currentProject.actions.splice(ind, 1); }; this.addMethod = e => { this.addingMethod = true; @@ -99,7 +99,7 @@ actions-settings this.checkActionNameAndSave = e => { this.nameTaken = void 0; e.item.action.name = e.currentTarget.value.trim(); - const existingAction = global.currentProject.actions.find(action => + const existingAction = window.currentProject.actions.find(action => action !== e.item.action && action.name === e.item.action.name); if (existingAction) { this.nameTaken = e.item.action.name; @@ -107,7 +107,7 @@ actions-settings }; const checkOrLoadModules = async (moduleNames) => { - const modules = require('./data/node_requires/resources/modules'); + const modules = require('src/node_requires/resources/modules'); const promises = []; for (const i of moduleNames) { if (!modules.isModuleEnabled(i)) { @@ -252,7 +252,7 @@ actions-settings window.alertify.error(this.voc.importErrorNotCtJsPreset); return; } - const modules = require('./data/node_requires/resources/modules'); + const modules = require('src/node_requires/resources/modules'); const notInstalled = await modules.checkModulesExistence(preset.inputModules); if (notInstalled instanceof Array) { window.alertify.error(this.voc.importErrorMissingModules.replace('$1', notInstalled.join(', '))); diff --git a/src/riotTags/project-settings/tabs/branding-settings.tag b/src/riotTags/project-settings/tabs/branding-settings.tag index f8842ca57..057d75864 100644 --- a/src/riotTags/project-settings/tabs/branding-settings.tag +++ b/src/riotTags/project-settings/tabs/branding-settings.tag @@ -6,7 +6,7 @@ branding-settings br asset-input( assettypes="texture" - assetid="{global.currentProject.settings.branding.icon || -1}" + assetid="{window.currentProject.settings.branding.icon || -1}" allowclear="yep" onchanged="{updateGameIcon}" header="{voc.icon}" @@ -18,7 +18,7 @@ branding-settings br asset-input( assettypes="texture" - assetid="{global.currentProject.settings.branding.splashScreen || -1}" + assetid="{window.currentProject.settings.branding.splashScreen || -1}" allowclear="yep" onchanged="{updateGameSplashScreen}" header="{voc.splashScreen}" @@ -27,14 +27,14 @@ branding-settings label.block.checkbox input( type="checkbox" - checked="{global.currentProject.settings.branding.forceSmoothIcons}" + checked="{window.currentProject.settings.branding.forceSmoothIcons}" onchange="{wire('currentProject.settings.branding.forceSmoothIcons')}" ) span {voc.forceSmoothIcons} label.block.checkbox input( type="checkbox" - checked="{global.currentProject.settings.branding.forceSmoothSplashScreen}" + checked="{window.currentProject.settings.branding.forceSmoothSplashScreen}" onchange="{wire('currentProject.settings.branding.forceSmoothSplashScreen')}" ) span {voc.forceSmoothSplashScreen} @@ -42,26 +42,26 @@ branding-settings b span {voc.accent} hover-hint(text="{voc.accentNotice}") - color-input(onchange="{wire('currentProject.settings.branding.accent', true)}" color="{global.currentProject.settings.branding.accent}") + color-input(onchange="{wire('currentProject.settings.branding.accent', true)}" color="{window.currentProject.settings.branding.accent}") .aSpacer label.block.checkbox input( type="checkbox" - checked="{global.currentProject.settings.branding.invertPreloaderScheme}" + checked="{window.currentProject.settings.branding.invertPreloaderScheme}" onchange="{wire('currentProject.settings.branding.invertPreloaderScheme')}" ) span {voc.invertPreloaderScheme} label.block.checkbox input( type="checkbox" - checked="{global.currentProject.settings.branding.hideLoadingLogo}" + checked="{window.currentProject.settings.branding.hideLoadingLogo}" onchange="{wire('currentProject.settings.branding.hideLoadingLogo')}" ) span {voc.hideLoadingLogo} label.block.checkbox input( type="checkbox" - checked="{global.currentProject.settings.branding.alternativeLogo}" + checked="{window.currentProject.settings.branding.alternativeLogo}" onchange="{wire('currentProject.settings.branding.alternativeLogo')}" ) span {voc.alternativeCtjsLogo} @@ -72,19 +72,19 @@ branding-settings br input( type="text" - value="{global.currentProject.settings.branding.customLoadingText}" + value="{window.currentProject.settings.branding.customLoadingText}" onchange="{wire('currentProject.settings.branding.customLoadingText')}" ) script. this.namespace = 'settings.branding'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.currentProject = global.currentProject; + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.currentProject = window.currentProject; this.updateGameIcon = id => { - global.currentProject.settings.branding.icon = id; + window.currentProject.settings.branding.icon = id; }; this.updateGameSplashScreen = id => { - global.currentProject.settings.branding.splashScreen = id; + window.currentProject.settings.branding.splashScreen = id; }; diff --git a/src/riotTags/project-settings/tabs/content-subsystem/content-editor.tag b/src/riotTags/project-settings/tabs/content-subsystem/content-editor.tag index 56f552b69..e69a97f1c 100644 --- a/src/riotTags/project-settings/tabs/content-subsystem/content-editor.tag +++ b/src/riotTags/project-settings/tabs/content-subsystem/content-editor.tag @@ -5,9 +5,9 @@ content-editor script. this.contentType = this.opts.contenttype; this.namespace = 'settings.content'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - const {schemaToExtensions} = require('./data/node_requires/resources/content'); + const {schemaToExtensions} = require('src/node_requires/resources/content'); this.makeExtends = () => { this.extends = [{ diff --git a/src/riotTags/project-settings/tabs/content-subsystem/content-settings.tag b/src/riotTags/project-settings/tabs/content-subsystem/content-settings.tag index 01826da02..f81487165 100644 --- a/src/riotTags/project-settings/tabs/content-subsystem/content-settings.tag +++ b/src/riotTags/project-settings/tabs/content-subsystem/content-settings.tag @@ -1,6 +1,8 @@ content-settings - docs-shortcut.toright(path="/content-subsystem.html") - h1 {voc.heading} + h1 + span {voc.heading} + docs-shortcut(path="/content-subsystem.html") + .aSpacer button(onclick="{addContentType}" if="{contentTypes.length}") svg.feather use(xlink:href="#plus") @@ -17,7 +19,7 @@ content-settings | ( code {type.name} | ) - extensions-editor(customextends="{parent.extends}" entity="{type}" compact="true" onchanged="{() => this.update()}") + extensions-editor(customextends="{parent.extends}" entity="{type}" compact="true" onchanged="{checkForUpdates}") p button(onclick="{parent.gotoEntries(type)}") svg.feather @@ -34,11 +36,11 @@ content-settings span {voc.addContentType} script. this.namespace = 'settings.content'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); window.currentProject.contentTypes = window.currentProject.contentTypes || []; this.contentTypes = window.currentProject.contentTypes; - this.extends = require('./data/node_requires/resources/content').getExtends(); + this.extends = require('src/node_requires/resources/content').getExtends(); this.addContentType = () => { this.contentTypes.push({ @@ -48,6 +50,8 @@ content-settings specification: [] }); window.signals.trigger('contentTypeCreated'); + require('src/node_requires/resources/content') + .updateContentTypedefs(window.currentProject); }; this.confirmDeletion = e => { @@ -56,10 +60,15 @@ content-settings if (a.buttonClicked === 'ok') { const type = this.contentTypes.indexOf(e.item.type); this.contentTypes.splice(type, 1); + window.signals.trigger('contentTypeDeleted'); this.update(); } }); }; + this.checkForUpdates = () => { + window.signals.trigger('contentTypeChanged'); + this.update(); + }; this.gotoEntries = contentType => () => { window.orders.trigger('openContentEntries', contentType); diff --git a/src/riotTags/project-settings/tabs/export-settings.tag b/src/riotTags/project-settings/tabs/export-settings.tag index a17d9ebe6..a29859817 100644 --- a/src/riotTags/project-settings/tabs/export-settings.tag +++ b/src/riotTags/project-settings/tabs/export-settings.tag @@ -1,6 +1,17 @@ export-settings h1 {voc.heading} + h2 {voc.errorReporting} + fieldset + label.block.checkbox + input(type="checkbox" value="{exportSettings.showErrors}" checked="{exportSettings.showErrors}" onchange="{wire('exportSettings.showErrors')}") + span {voc.showErrors} + hover-hint(text="{voc.showErrorsHint}") + label.block(if="{exportSettings.showErrors}") + span {voc.errorsLink} + br + input(type="url" value="{exportSettings.errorsLink}" checked="{exportSettings.errorsLink}" onchange="{wire('exportSettings.errorsLink')}") + h2 {vocFull.settings.rendering.desktopBuilds} fieldset label.block.checkbox @@ -35,7 +46,7 @@ export-settings script. this.namespace = 'settings.export'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.currentProject = global.currentProject; + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.currentProject = window.currentProject; this.exportSettings = this.currentProject.settings.export; diff --git a/src/riotTags/project-settings/tabs/main-settings.tag b/src/riotTags/project-settings/tabs/main-settings.tag index b9496e228..1cb5c0300 100644 --- a/src/riotTags/project-settings/tabs/main-settings.tag +++ b/src/riotTags/project-settings/tabs/main-settings.tag @@ -40,9 +40,9 @@ main-settings script. this.namespace = 'settings'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.currentProject = global.currentProject; + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.currentProject = window.currentProject; this.authoring = this.currentProject.settings.authoring; this.changeTitle = e => { diff --git a/src/riotTags/project-settings/tabs/modules/module-meta.tag b/src/riotTags/project-settings/tabs/modules/module-meta.tag index 55715d745..e1a39c608 100644 --- a/src/riotTags/project-settings/tabs/modules/module-meta.tag +++ b/src/riotTags/project-settings/tabs/modules/module-meta.tag @@ -1,32 +1,35 @@ module-meta(onclick="{toggleModule(opts.module.name)}" class="{opts.class} {dim: opts.module.manifest.main.deprecated}") .flexrow div - h1.nmt {localizeField(opts.module.manifest.main, 'name')} + h1.nmt + svg.feather(if="{opts.module.manifest.main.icon}") + use(xlink:href="#{opts.module.manifest.main.icon}") + | {localizeField(opts.module.manifest.main, 'name')} code | {opts.module.name} v{opts.module.manifest.main.version} | span(if="{opts.module.manifest.main.version.indexOf(0) === 0}") {voc.preview} - label.nogrow.bigpower(class="{off: !(opts.module.name in global.currentProject.libs)}") + label.nogrow.bigpower(class="{off: !(opts.module.name in window.currentProject.libs)}") svg.feather - use(xlink:href="#{opts.module.name in global.currentProject.libs? 'check' : 'x'}") + use(xlink:href="#{opts.module.name in window.currentProject.libs? 'check' : 'x'}") span .hsub(if="{opts.module.manifest.main.tagline}") {localizeField(opts.module.manifest.main, 'tagline')} div(if="{opts.module.manifest.dependencies && opts.module.manifest.dependencies.length}") b {voc.dependencies} .inlineblock(each="{dependency in opts.module.manifest.dependencies}") - svg.feather(if="{dependency in global.currentProject.libs}").success + svg.feather(if="{dependency in window.currentProject.libs}").success use(xlink:href="#check") - svg.feather(if="{!(dependency in global.currentProject.libs)}").error + svg.feather(if="{!(dependency in window.currentProject.libs)}").error use(xlink:href="#alert-circle") span {dependency} div(if="{opts.module.manifest.optionalDependencies && opts.module.manifest.optionalDependencies.length}") b {voc.optionalDependencies} .inlineblock(each="{dependency in opts.module.manifest.optionalDependencies}") - svg.feather(if="{dependency in global.currentProject.libs}").success + svg.feather(if="{dependency in window.currentProject.libs}").success use(xlink:href="#check") - svg.feather(if="{!(dependency in global.currentProject.libs)}").warning + svg.feather(if="{!(dependency in window.currentProject.libs)}").warning use(xlink:href="#alert-triangle") span {dependency} @@ -53,13 +56,13 @@ module-meta(onclick="{toggleModule(opts.module.name)}" class="{opts.class} {dim: use(xlink:href="#{getIcon(opts.module)}") script. this.namespace = 'modules'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - const {getIcon, isModuleEnabled, enableModule, disableModule} = require('./data/node_requires/resources/modules'); + const {getIcon, isModuleEnabled, enableModule, disableModule} = require('src/node_requires/resources/modules'); this.getIcon = getIcon; - const glob = require('./data/node_requires/glob'); + const glob = require('src/node_requires/glob'); this.toggleModule = () => async e => { e.stopPropagation(); diff --git a/src/riotTags/project-settings/tabs/modules/modules-settings.tag b/src/riotTags/project-settings/tabs/modules/modules-settings.tag index cecb090de..f7556beab 100644 --- a/src/riotTags/project-settings/tabs/modules/modules-settings.tag +++ b/src/riotTags/project-settings/tabs/modules/modules-settings.tag @@ -52,9 +52,9 @@ modules-settings.aPanel.aView module-viewer(if="{openedModule}" module="{openedModule}" onclose="{closeModule}") script. this.namespace = 'modules'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - const {moduleDir, loadModules, categoryToIconMap} = require('./data/node_requires/resources/modules'); + const {moduleDir, loadModules, categoryToIconMap} = require('src/node_requires/resources/modules'); this.categoriesCounter = {}; this.filterCategories = Object.keys(categoryToIconMap).sort(); @@ -63,7 +63,7 @@ modules-settings.aPanel.aView this.resortEnabledModules = () => { this.enabledModules = this.allModules - .filter(module => module.name in global.currentProject.libs); + .filter(module => module.name in window.currentProject.libs); }; this.refreshModules = () => { loadModules().then(modules => { diff --git a/src/riotTags/project-settings/tabs/project-script-editor.tag b/src/riotTags/project-settings/tabs/project-script-editor.tag index 1f8a047c1..a1b22a4fc 100644 --- a/src/riotTags/project-settings/tabs/project-script-editor.tag +++ b/src/riotTags/project-settings/tabs/project-script-editor.tag @@ -1,31 +1,25 @@ -project-script-editor.aView +project-script-editor .flexfix.tall div.flexfix-header b {voc.name} input(type="text" value="{script.name}" onchange="{updateScriptName}") .flexfix-body .aCodeEditor(ref="editor") - button.nm.flexfix-footer(onclick="{saveScript}" title="Shift+Control+S" data-hotkey="Control+S") - svg.feather - use(xlink:href="#check") - span {voc.done} script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.script = this.opts.script; const updateEditorSize = () => { this.editor.layout(); }; - const updateEditorSizeDeferred = function () { - setTimeout(updateEditorSize, 0); + const updateEditorSizeDeferred = function (tab) { + if (tab === 'project') { + setTimeout(updateEditorSize, 0); + } }; - const {scriptModels} = require('./data/node_requires/resources/projects/scripts'); - this.on('unmount', () => { - window.removeEventListener('resize', updateEditorSize); - window.signals.off('settingsFocus', updateEditorSizeDeferred); - }); + const {scriptModels} = require('src/node_requires/resources/projects/scripts'); this.on('mount', () => { setTimeout(() => { this.editor = window.setupCodeEditor(this.refs.editor, { @@ -35,19 +29,22 @@ project-script-editor.aView this.script.code = this.editor.getValue(); }); window.addEventListener('resize', updateEditorSize); - window.signals.on('settingsFocus', updateEditorSizeDeferred); + window.signals.on('globalTabChanged', updateEditorSizeDeferred); }, 0); }); + this.on('update', () => { + if (this.opts.script !== this.script) { + this.script = this.opts.script; + this.editor.setModel(scriptModels.get(this.script)); + } + }); this.on('unmount', () => { + window.removeEventListener('resize', updateEditorSize); + window.signals.off('globalTabChanged', updateEditorSizeDeferred); // Manually destroy the editor to free up the memory this.editor.dispose(); }); - this.saveScript = () => { - this.parent.currentScript = null; - this.parent.update(); - }; - this.updateScriptName = e => { this.script.name = e.target.value.trim(); }; diff --git a/src/riotTags/project-settings/tabs/rendering-settings.tag b/src/riotTags/project-settings/tabs/rendering-settings.tag index 5ebbcb385..e8c6c9154 100644 --- a/src/riotTags/project-settings/tabs/rendering-settings.tag +++ b/src/riotTags/project-settings/tabs/rendering-settings.tag @@ -46,13 +46,13 @@ rendering-settings script. this.namespace = 'settings.rendering'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); - this.currentProject = global.currentProject; + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); + this.currentProject = window.currentProject; this.renderSettings = this.currentProject.settings.rendering; this.wireAndUpdatePixelated = path => e => { this.wire(path)(e); - const {setPixelart} = require('./data/node_requires/resources/textures'); + const {setPixelart} = require('src/node_requires/resources/textures'); setPixelart(window.currentProject.settings.rendering.pixelatedrender); }; diff --git a/src/riotTags/project-settings/tabs/scripts-setttings.tag b/src/riotTags/project-settings/tabs/scripts-setttings.tag index 302cf18bd..089809dce 100644 --- a/src/riotTags/project-settings/tabs/scripts-setttings.tag +++ b/src/riotTags/project-settings/tabs/scripts-setttings.tag @@ -1,40 +1,31 @@ -scripts-settings - h1 - .toright - svg.icon - use(xlink:href="#javascript") - | - | - svg.icon - use(xlink:href="#typescript") - span {voc.heading} - .clear - ul.aMenu - li(each="{script, index in global.currentProject.scripts}" onclick="{selectScript}") - code {script.name} - .toright - // Use forced opacity to keep nice layout - div.anActionableIcon(onclick="{moveUp}" title="{voc.moveUp}" style="{index === 0? 'opacity: 0;' : ''}") - svg.feather - use(xlink:href="#arrow-up") - div.anActionableIcon(onclick="{moveDown}" style="{index === global.currentProject.scripts.length - 1 ? 'opacity: 0;' : ''}" title="{voc.moveDown}") - svg.feather - use(xlink:href="#arrow-down") - div.anActionableIcon(onclick="{deleteScript}" title="{voc.deleteScript}") - svg.feather.red - use(xlink:href="#delete") - button(onclick="{addNewScript}") - svg.feather - use(xlink:href="#plus") - span {voc.addNew} +scripts-settings.flexrow(class="{opts.class}") + aside.flexfix + ul.aMenu.flexfix-body + li(each="{script, index in window.currentProject.scripts}" onclick="{selectScript}" class="{active: currentScript === script}") + .crop {script.name} + .scripts-settings-ScriptActions + .anActionableIcon(onclick="{moveUp}" title="{voc.moveUp}" if="{index !== 0}") + svg.feather + use(xlink:href="#arrow-up") + .anActionableIcon(onclick="{moveDown}" if="{index !== window.currentProject.scripts.length - 1}" title="{voc.moveDown}").nml + svg.feather + use(xlink:href="#arrow-down") + .anActionableIcon(onclick="{deleteScript}" title="{voc.deleteScript}") + svg.feather.red + use(xlink:href="#delete") + button.flexfix-footer(onclick="{addNewScript}") + svg.feather + use(xlink:href="#plus") + span {voc.addNew} project-script-editor(if="{currentScript}" script="{currentScript}") + .dim.pad(if="{!currentScript}") {voc.scriptsHint} script. this.namespace = 'settings.scripts'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.currentProject = global.currentProject; + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.currentProject = window.currentProject; this.currentProject.scripts = this.currentProject.scripts || []; - const {dropScriptModel, addScriptModel} = require('./data/node_requires/resources/projects/scripts'); + const {dropScriptModel, addScriptModel} = require('src/node_requires/resources/projects/scripts'); this.addNewScript = () => { const oldScriptNames = this.currentProject.scripts.map(script => script.name); diff --git a/src/riotTags/root-tag.tag b/src/riotTags/root-tag.tag index 53462ab8a..16fe3bc61 100644 --- a/src/riotTags/root-tag.tag +++ b/src/riotTags/root-tag.tag @@ -6,18 +6,18 @@ root-tag(class="{pride: localStorage.prideMode === 'on'}") this.projectOpened = false; window.id = Math.random(); window.signals.on('resetAll', () => { - global.currentProject = false; - require('./data/node_requires/glob').modified = false; + window.currentProject = false; + require('src/node_requires/glob').modified = false; this.projectOpened = false; riot.update(); }); window.signals.on('projectLoaded', () => { - require('./data/node_requires/glob').modified = false; + require('src/node_requires/glob').modified = false; this.projectOpened = true; this.update(); }); - require('./data/node_requires/platformUtils') + require('src/node_requires/platformUtils') .getWritableDir() .catch(e => { console.error(e); @@ -49,3 +49,6 @@ root-tag(class="{pride: localStorage.prideMode === 'on'}") window.signals.on('prideModeUpdated', () => { this.update(); }); + + // eslint-disable-next-line new-cap + nw.Screen.Init(); diff --git a/src/riotTags/shared/action-input.tag b/src/riotTags/shared/action-input.tag index d86d2f8d0..b060444fd 100644 --- a/src/riotTags/shared/action-input.tag +++ b/src/riotTags/shared/action-input.tag @@ -37,7 +37,7 @@ action-input } this.namespace = 'common.scriptables'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.changeField = affixedData => { if (this.opts.onchanged) { diff --git a/src/riotTags/shared/array-editor.tag b/src/riotTags/shared/array-editor.tag index f3e423991..fbfdd78e5 100644 --- a/src/riotTags/shared/array-editor.tag +++ b/src/riotTags/shared/array-editor.tag @@ -26,7 +26,7 @@ array-editor onchange="{parent.wireAndNotify('this.opts.entity.'+ index)}" ) asset-input( - if="{['texture', 'template', 'room', 'sound'].includes(parent.opts.inputtype)}" + if="{assetTypes.includes(parent.opts.inputtype)}" assettypes="{parent.opts.inputtype}" allowclear="yep" compact="compact" @@ -121,7 +121,9 @@ array-editor use(xlink:href="#plus") span {voc.addRow} script. - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.assetTypes = require('src/node_requires/resources').assetTypes; + + this.mixin(require('src/node_requires/riotMixins/wire').default); this.wireAndNotify = (...args1) => (...args2) => { this.wire(...args1)(...args2); if (this.opts.onchanged) { @@ -129,7 +131,7 @@ array-editor } }; this.namespace = 'extensionsEditor'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); if (this.opts.setlength) { this.opts.entity.length = Number(this.opts.setlength); @@ -164,7 +166,7 @@ array-editor }; this.addRow = () => { - if (['texture', 'template', 'room', 'sound'].includes(this.opts.inputtype)) { + if (this.assetTypes.includes(this.opts.inputtype)) { this.opts.entity.push(-1); } else if (['point2D', 'number', 'slider', 'sliderAndNumber'].includes(this.opts.inputtype)) { this.opts.entity.push(0); diff --git a/src/riotTags/shared/asset-browser.tag b/src/riotTags/shared/asset-browser.tag index e9ff1bb9c..c7e1b3894 100644 --- a/src/riotTags/shared/asset-browser.tag +++ b/src/riotTags/shared/asset-browser.tag @@ -166,13 +166,13 @@ asset-browser.flexfix(class="{opts.namespace} {opts.class} {compact: opts.compac svg.feather(class="{asset.colorClass || 'act'}") use(xlink:href="#{asset.icon}") .aCard-Properties - span {parent.getName(asset)} + span {asset.name} span.secondary(if="{asset.type !== 'folder' && (parent.assetTypes.length > 1 || parent.assetTypes[0] === 'all')}") svg.feather use(xlink:href="#{iconMap[asset.type]}") svg.feather(if="{asset.type === 'behavior'}") use(xlink:href="#{iconMap[asset.behaviorType]}") - span(if="{!parent.opts.compact}") {vocGlob.assetTypes[asset.type][0].slice(0, 1).toUpperCase()}{vocGlob.assetTypes[asset.type][0].slice(1)} + span(if="{!parent.opts.compact}") {capitalize(vocGlob.assetTypes[asset.type][0])} .asset-browser-Icons(if="{asset.type !== 'folder'}") svg.feather(each="{icon in parent.getIcons(asset)}" class="feather-{icon}") use(xlink:href="#{icon}") @@ -188,17 +188,16 @@ asset-browser.flexfix(class="{opts.namespace} {opts.class} {compact: opts.compac context-menu(menu="{assetsContextMenu}" ref="assetsMenu") script. this.namespace = 'assetViewer'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/niceTime').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/niceTime').default); this.sort = 'type'; this.sortReverse = false; - const resources = require('data/node_requires/resources'); + const resources = require('src/node_requires/resources'); this.assetTypes = this.opts.assettypes ? this.opts.assettypes.split(',') : ['all']; this.getThumbnail = resources.getThumbnail; this.usesIcons = resources.areThumbnailsIcons; this.iconMap = resources.resourceToIconMap; - this.getName = resources.getName; this.getIcons = resources.getIcons; /** @@ -317,11 +316,8 @@ asset-browser.flexfix(class="{opts.namespace} {opts.class} {compact: opts.compac /* Asset sorting & name search operations */ const fuseOptions = { shouldSort: true, - tokenize: true, threshold: 0.5, location: 0, - distance: 100, - maxPatternLength: 32, minMatchCharLength: 1, keys: ['name'] }; @@ -398,7 +394,7 @@ asset-browser.flexfix(class="{opts.namespace} {opts.class} {compact: opts.compac if (e.target.value.trim()) { const Fuse = require('fuse.js'); var fuse = new Fuse(this.entries, fuseOptions); - this.searchResults = fuse.search(e.target.value.trim()); + this.searchResults = fuse.search(e.target.value.trim()).map(result => result.item); } else { this.searchResults = null; } @@ -556,12 +552,14 @@ asset-browser.flexfix(class="{opts.namespace} {opts.class} {compact: opts.compac this.contextMenuFolder = item; this.refs.folderMenu.popup(e.clientX, e.clientY); e.preventDefault(); + e.stopPropagation(); return; } // Multiple selection if (this.selectedItems.size > 0) { this.refs.assetsMenu.popup(e.clientX, e.clientY); e.preventDefault(); + e.stopPropagation(); return; } this.contextMenuAsset = item; diff --git a/src/riotTags/shared/asset-folder-tree.tag b/src/riotTags/shared/asset-folder-tree.tag index 9cb85be39..f3f3d3301 100644 --- a/src/riotTags/shared/asset-folder-tree.tag +++ b/src/riotTags/shared/asset-folder-tree.tag @@ -50,9 +50,9 @@ asset-folder-tree ) script. this.namespace = 'assetViewer'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - const resources = require('data/node_requires/resources'); + const resources = require('src/node_requires/resources'); let prevPath = this.opts.path; const updateEntries = () => { diff --git a/src/riotTags/shared/asset-input.tag b/src/riotTags/shared/asset-input.tag index d45ed53c9..0c4093c05 100644 --- a/src/riotTags/shared/asset-input.tag +++ b/src/riotTags/shared/asset-input.tag @@ -2,7 +2,7 @@ A button that opens an asset selector for the specified type of resources. @attribute assettypes (string) - Comma-separated asset types that will be allowed to be picked, e.g. "type,texture,room". + Comma-separated asset types that will be allowed to be picked, e.g. "template,texture,room". You can set to "all" to allow all asset types. Note: unlike in asset-browser, this attribute is mandatory and will throw an error if empty. @attribute allowclear (atomic) @@ -41,7 +41,7 @@ asset-input svg.feather(if="{opts.assetid != -1 && opts.assetid && usesIcons(currentAsset)}") use(xlink:href="#{getThumbnail(currentAsset)}") img(if="{opts.assetid == -1 || !opts.assetid}" src="data/img/notexture.png") - span(if="{opts.assetid != -1 && opts.assetid !== void 0}") {getName(currentAsset)} + span(if="{opts.assetid != -1 && opts.assetid !== void 0}") {currentAsset.name} span(if="{opts.assetid == -1 || opts.assetid === void 0}") {vocGlob.selectDialogue} button.square(if="{opts.assetid != -1 && opts.assetid !== void 0 && !opts.disallowjump}" title="{voc.jumpToAsset}" onclick="{openAsset}" class="{inline: opts.compact}") svg.feather @@ -61,7 +61,7 @@ asset-input svg.feather(if="{opts.assetid != -1 && opts.assetid && usesIcons(currentAsset)}") use(xlink:href="#{getThumbnail(currentAsset)}") img(if="{opts.assetid == -1 || !opts.assetid}" src="data/img/notexture.png") - .dim(if="{opts.assetid != -1 && opts.assetid !== void 0}") {getName(currentAsset)} + .dim(if="{opts.assetid != -1 && opts.assetid !== void 0}") {currentAsset.name} .aNotice(if="{opts.assetid == -1 || opts.assetid === void 0}") {vocGlob.selectDialogue} asset-selector( if="{showingSelector}" @@ -77,11 +77,10 @@ asset-input throw new Error('[asset-input] The assettypes attribute is mandatory and was not set.'); } this.namespace = 'assetInput'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - this.resourceAPIs = require('./data/node_requires/resources'); + this.resourceAPIs = require('src/node_requires/resources'); this.getThumbnail = this.resourceAPIs.getThumbnail; - this.getName = this.resourceAPIs.getName; this.usesIcons = this.resourceAPIs.areThumbnailsIcons; // eslint-disable-next-line eqeqeq diff --git a/src/riotTags/shared/asset-selector.tag b/src/riotTags/shared/asset-selector.tag index 3811ffddc..bf2068c98 100644 --- a/src/riotTags/shared/asset-selector.tag +++ b/src/riotTags/shared/asset-selector.tag @@ -47,7 +47,7 @@ asset-selector.aDimmer.pointer.pad.fadein(onpointerdown="{closeOnDimmer}" ref="d } this.namespace = 'assetInput'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.closeOnDimmer = e => { if (e.target === this.root) { diff --git a/src/riotTags/shared/behavior-list.tag b/src/riotTags/shared/behavior-list.tag index bb9b8b6f5..a477df598 100644 --- a/src/riotTags/shared/behavior-list.tag +++ b/src/riotTags/shared/behavior-list.tag @@ -32,9 +32,9 @@ behavior-list ) script. this.namespace = 'behaviorList'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - const resources = require('./data/node_requires/resources'); + const resources = require('src/node_requires/resources'); this.getBehaviorName = id => resources.getById('behavior', id).name; this.openBehavior = id => () => window.orders.trigger('openAsset', id); diff --git a/src/riotTags/shared/builtin-asset-gallery.tag b/src/riotTags/shared/builtin-asset-gallery.tag index bd3fba6cd..f95faa583 100644 --- a/src/riotTags/shared/builtin-asset-gallery.tag +++ b/src/riotTags/shared/builtin-asset-gallery.tag @@ -119,14 +119,13 @@ builtin-asset-gallery.aPanel.aView.pad ) script. this.namespace = 'builtinAssetGallery'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); const fs = require('fs-extra'), path = require('path'); - const {createAsset, isNameOccupied} = require('./data/node_requires/resources'); - const {getGalleryDir} = require('./data/node_requires/platformUtils'); + const {createAsset, isNameOccupied} = require('src/node_requires/resources'); + const {getGalleryDir} = require('src/node_requires/platformUtils'); const root = path.join(getGalleryDir(), this.opts.type); - this.root = root; this.galleryBaseHref = getGalleryDir(this); this.sets = []; @@ -157,7 +156,7 @@ builtin-asset-gallery.aPanel.aView.pad const imageTester = /\.(jpe?g|png|gif|bmp|webp)$/; const soundTester = /\.(wav|ogg|mp3)$/; - const {getCleanTextureName} = require('./data/node_requires/resources/textures'); + const {getCleanTextureName} = require('src/node_requires/resources/textures'); this.openSet = set => () => { this.currentSet = set; this.currentSetEntries = []; @@ -212,7 +211,7 @@ builtin-asset-gallery.aPanel.aView.pad this.currentSound = void 0; }; - const {addSoundFile} = require('./data/node_requires/resources/sounds'); + const {addSoundFile} = require('src/node_requires/resources/sounds'); this.importIntoProject = entry => async () => { if (this.checkNameOccupied(entry.type, entry.name)) { window.alertify.error(this.voc.cannotImportNameOccupied.replace('$1', entry.name)); diff --git a/src/riotTags/shared/collapsible-section.tag b/src/riotTags/shared/collapsible-section.tag index 52a0460a7..8f6934174 100644 --- a/src/riotTags/shared/collapsible-section.tag +++ b/src/riotTags/shared/collapsible-section.tag @@ -14,7 +14,7 @@ @attribute [hlevel] (integer) A heading level from 1 to 7. Can be empty; if it is, a regular h3 is shown. @attribute [icon] (string) - An icon that will be displayed instead of the default chevron. + An icon that will be displayed before the heading. @attribute [defaultstate] ("opened"|"closed") Sets the default state of the section. If it is not set, the section will appear closed. @attribute [storestatekey] (string) @@ -30,16 +30,37 @@ collapsible-section(class="{opts.class} {opened ? 'opened' : 'closed'}") .collapsible-section-aHeader(onclick="{toggle}") span - h1(if="{opts.heading && opts.hlevel == 1}") {opts.heading} - h2(if="{opts.heading && opts.hlevel == 2}") {opts.heading} - h3(if="{opts.heading && (opts.hlevel == 3 || !opts.hlevel)}") {opts.heading} - h4(if="{opts.heading && opts.hlevel == 4}") {opts.heading} - h5(if="{opts.heading && opts.hlevel == 5}") {opts.heading} - h6(if="{opts.heading && opts.hlevel == 6}") {opts.heading} - h7(if="{opts.heading && opts.hlevel == 7}") {opts.heading} + h1(if="{opts.heading && opts.hlevel == 1}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} + h2(if="{opts.heading && opts.hlevel == 2}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} + h3(if="{opts.heading && (opts.hlevel == 3 || !opts.hlevel)}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} + h4(if="{opts.heading && opts.hlevel == 4}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} + h5(if="{opts.heading && opts.hlevel == 5}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} + h6(if="{opts.heading && opts.hlevel == 6}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} + h7(if="{opts.heading && opts.hlevel == 7}") + svg.feather(if="{opts.icon}") + use(xlink:href="#{opts.icon}") + span {opts.heading} yield(from="header") svg.feather.a(class="{rotated: this.opened}") - use(xlink:href="#{opts.icon ? opts.icon : 'chevron-up'}") + use(xlink:href="#chevron-up") .collapsible-section-aWrapper(if="{opened || opts.preservedom}" hide="{!opened && opts.preservedom}") script. diff --git a/src/riotTags/shared/color-picker.tag b/src/riotTags/shared/color-picker.tag index 7e1d0cf44..d7f2a66d7 100644 --- a/src/riotTags/shared/color-picker.tag +++ b/src/riotTags/shared/color-picker.tag @@ -12,8 +12,10 @@ Called when a user presses the "Cancel" button. Passes a HEX/RGBA color as a first argument and 'oncancel' as a second one. - @attribute hidealpha (atomic) + @attribute [hidealpha] (atomic) Disables alpha input. + @attribute [color] (string) + Default color. (CSS color.) color-picker .aPanel(ref="widget") @@ -32,7 +34,7 @@ color-picker | + h4 {voc.projectPalette} .Swatches(ref="localSwatches") - .aSwatch(each="{colr in global.currentProject.palette}" style="background-color: {colr};" onclick="{onSwatchClick}" title="{voc.altClick}") + .aSwatch(each="{colr in window.currentProject.palette}" style="background-color: {colr};" onclick="{onSwatchClick}" title="{voc.altClick}") button.anAddSwatchButton(onclick="{addAsLocal}") | + .c6.np @@ -75,7 +77,7 @@ color-picker /* global net */ const brehautColor = net.brehaut.Color; this.namespace = 'colorPicker'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.loadColor = color => { this.color = brehautColor(color); @@ -84,8 +86,8 @@ color-picker }; this.loadColor(this.opts.color || '#ffffff'); - if (!('palette' in global.currentProject)) { - global.currentProject.palette = []; + if (!('palette' in window.currentProject)) { + window.currentProject.palette = []; } if ('globalPalette' in window.localStorage) { this.globalPalette = JSON.parse(localStorage.globalPalette); @@ -125,8 +127,8 @@ color-picker this.onSwatchClick = e => { if (e.ctrlKey || e.altKey) { // deletes a swatch if (e.target.parentNode === this.refs.localSwatches) { - const ind = global.currentProject.palette.indexOf(e.item.colr); - global.currentProject.palette.splice(ind, 1); + const ind = window.currentProject.palette.indexOf(e.item.colr); + window.currentProject.palette.splice(ind, 1); } else { this.globalPalette.splice(this.globalPalette.indexOf(e.item.colr), 1); localStorage.globalPalette = JSON.stringify(this.globalPalette); @@ -141,7 +143,7 @@ color-picker localStorage.globalPalette = JSON.stringify(this.globalPalette); }; this.addAsLocal = () => { - global.currentProject.palette.push(this.color.toString()); + window.currentProject.palette.push(this.color.toString()); }; this.notifyUpdates = () => { diff --git a/src/riotTags/shared/context-menu.tag b/src/riotTags/shared/context-menu.tag index e2500cfd8..fff8c3f5f 100644 --- a/src/riotTags/shared/context-menu.tag +++ b/src/riotTags/shared/context-menu.tag @@ -8,7 +8,7 @@ items: Array, columns: number } - IMenuItem is https://github.com/ct-js/ct-js/blob/develop/src/node_requires/IMenuItem.d.ts + IMenuItem is https://github.com/ct-js/ct-js/blob/developsrc/node_requires/IMenuItem.d.ts @method popup(x, y) Works with absolute coordinates (in CSS terms) @@ -16,7 +16,10 @@ @method open @method close -context-menu(class="{opened: opts.menu.opened}" ref="root" style="{opts.menu.columns? 'columns: '+opts.menu.columns+';' : ''}") +context-menu(class="{opened: opts.menu.opened}" style="\ + columns: {opts.menu.columns || 1};\ + left: {leftPos}; top: {topPos}; right: {rightPos}; bottom: {bottomPos}; position: {position};\ +") a( each="{item in opts.menu.items}" if="{!item.if || item.if()}" @@ -60,17 +63,17 @@ context-menu(class="{opened: opts.menu.opened}" ref="root" style="{opts.menu.col const bounds = this.root.getBoundingClientRect(); if (bounds.bottom > window.innerHeight) { this.root.style.bottom = 0; - this.root.style.top = 'unset'; + // this.root.style.top = 'unset'; } else if (bounds.top < 0) { this.root.style.top = 0; - this.root.style.bottom = 'unset'; + // this.root.style.bottom = 'unset'; } if (bounds.right > window.innerWidth) { this.root.style.right = 0; - this.root.style.left = 'unset'; + // this.root.style.left = 'unset'; } else if (bounds.left < 0) { this.root.style.left = 0; - this.root.style.right = 'unset'; + // this.root.style.right = 'unset'; } this.containSubmenus(); }; @@ -84,26 +87,27 @@ context-menu(class="{opened: opts.menu.opened}" ref="root" style="{opts.menu.col menus.forEach(menu => menu.containPosition()); }; + this.leftPos = this.topPos = this.rightPos = this.bottomPos = 'unset'; this.popup = (x, y) => { noFakeClicks = true; setTimeout(() => { noFakeClicks = false; - }, 500); - this.root.style.left = this.root.style.top = this.root.style.right = this.root.style.bottom = 'unset'; - this.root.style.position = 'fixed'; + }, 250); + this.opts.menu.opened = true; + this.leftPos = this.topPos = this.rightPos = this.bottomPos = 'unset'; + this.position = 'fixed'; if (x !== void 0 && y !== void 0) { if (x < window.innerWidth / 2) { - this.root.style.left = x + 'px'; + this.leftPos = x + 'px'; } else { - this.root.style.right = (window.innerWidth - x) + 'px'; + this.rightPos = (window.innerWidth - x) + 'px'; } if (y < window.innerHeight / 2) { - this.root.style.top = y + 'px'; + this.topPos = y + 'px'; } else { - this.root.style.bottom = (window.innerHeight - y) + 'px'; + this.bottomPos = (window.innerHeight - y) + 'px'; } } - this.opts.menu.opened = true; this.update(); this.containPosition(); const firstA = this.root.querySelector('a'); @@ -143,14 +147,20 @@ context-menu(class="{opened: opts.menu.opened}" ref="root" style="{opts.menu.col if (e.target.closest('context-menu') !== this.root) { this.opts.menu.opened = false; this.update(); - } else { - e.stopPropagation(); } }; this.on('mount', () => { - document.addEventListener('click', clickListener); + document.body.addEventListener('click', clickListener, { + capture: true, + passive: true + }); + document.body.addEventListener('contextmenu', clickListener, { + capture: true, + passive: true + }); }); this.on('unmount', () => { - document.removeEventListener('click', clickListener); + document.body.removeEventListener('click', clickListener); + document.body.removeEventListener('contextmenu', clickListener); }); diff --git a/src/riotTags/shared/create-asset-menu.tag b/src/riotTags/shared/create-asset-menu.tag index ae84dd763..99990d4aa 100644 --- a/src/riotTags/shared/create-asset-menu.tag +++ b/src/riotTags/shared/create-asset-menu.tag @@ -31,12 +31,12 @@ create-asset-menu.relative.inlineblock(class="{opts.class}") builtin-asset-gallery(type="textures" folder="{opts.folder}") script. this.namespace = 'createAsset'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); const priorityTypes = ['texture', 'template', 'room']; const customizedTypes = ['tandem', 'behavior']; - const {assetTypes, resourceToIconMap, createAsset} = require('./data/node_requires/resources'); + const {assetTypes, resourceToIconMap, createAsset} = require('src/node_requires/resources'); this.showMenu = e => { this.refs.menu.popup(e.clientX, e.clientY); @@ -83,7 +83,7 @@ create-asset-menu.relative.inlineblock(class="{opts.class}") // Tandems can be imported const tandemVoc = this.vocGlob.assetTypes.tandem; menuItems.push({ - label: tandemVoc[0].slice(0, 1).toUpperCase() + tandemVoc[0].slice(1), + label: this.capitalize(tandemVoc[0]), icon: 'sparkles', click: genericCreate('tandem'), submenu: { @@ -115,7 +115,7 @@ create-asset-menu.relative.inlineblock(class="{opts.class}") // Behaviors need a subtype preset and can be imported const bhVoc = this.vocGlob.assetTypes.behavior; menuItems.push({ - label: bhVoc[0].slice(0, 1).toUpperCase() + bhVoc[0].slice(1), + label: this.capitalize(bhVoc[0]), icon: 'behavior', submenu: { items: [{ diff --git a/src/riotTags/shared/curve-editor.tag b/src/riotTags/shared/curve-editor.tag index e5aff2306..32629cff5 100644 --- a/src/riotTags/shared/curve-editor.tag +++ b/src/riotTags/shared/curve-editor.tag @@ -138,11 +138,11 @@ curve-editor(ref="root") script. /* global net */ this.namespace = 'curveEditor'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); const brehautColor = net.brehaut.Color; - this.uid = require('./data/node_requires/generateGUID')(); + this.uid = require('src/node_requires/generateGUID')(); this.wireAndChange = path => e => { this.wire(path)(e); diff --git a/src/riotTags/shared/docs-shortcut.tag b/src/riotTags/shared/docs-shortcut.tag index f0ce49500..b3ae5e581 100644 --- a/src/riotTags/shared/docs-shortcut.tag +++ b/src/riotTags/shared/docs-shortcut.tag @@ -20,7 +20,7 @@ docs-shortcut span(if="{!opts.hidelabel}") {opts.title || voc.openDocs} script. this.namespace = 'docsShortcut'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.navigateToDocs = () => { window.signals.trigger('openDocs', { path: this.opts.path || '/' diff --git a/src/riotTags/shared/extensions-editor.tag b/src/riotTags/shared/extensions-editor.tag index c583b943e..640a9920f 100644 --- a/src/riotTags/shared/extensions-editor.tag +++ b/src/riotTags/shared/extensions-editor.tag @@ -230,9 +230,10 @@ extensions-editor const fs = require('fs-extra'), path = require('path'); - this.assetTypes = require('./data/node_requires/resources').assetTypes; + this.assetTypes = require('src/node_requires/resources').assetTypes; + const {validateExtends} = require('src/node_requires/resources/content'); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); this.wireAndNotify = (...args1) => (...args2) => { this.wire(...args1)(...args2); if (this.opts.onchanged) { @@ -240,28 +241,21 @@ extensions-editor } }; this.namespace = 'extensionsEditor'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - - this.fixBrokenArrays = () => { - for (const field of this.extensions) { - if (!(field.key in this.opts.entity) && ['table', 'array'].includes(field.type)) { - this.opts.entity[field.key] = []; - } - } - }; + this.mixin(require('src/node_requires/riotMixins/voc').default); this.extensions = []; this.refreshExtends = () => { if (this.opts.customextends) { this.extensions = this.opts.customextends; - this.fixBrokenArrays(); + validateExtends(this.extensions, this.opts.entity); return; } this.extensions = []; const promises = []; - for (const lib in global.currentProject.libs) { + for (const lib in window.currentProject.libs) { + // TODO: move this logic into node_requires/resources/modules promises.push(fs.readJSON(path.join(libsDir, lib, 'module.json')) .then(moduleJson => { const key = this.opts.type + 'Extends'; @@ -271,7 +265,7 @@ extensions-editor })); } Promise.all(promises).then(() => { - this.fixBrokenArrays(); + validateExtends(this.extensions, this.opts.entity); this.update(); }); }; @@ -287,7 +281,7 @@ extensions-editor this.extensions = this.opts.customextends; } if (this.opts.entity !== cachedEntity) { - this.fixBrokenArrays(); + validateExtends(this.extensions, this.opts.entity); cachedEntity = this.opts.entity; } }); diff --git a/src/riotTags/shared/folder-editor.tag b/src/riotTags/shared/folder-editor.tag index 41cf8227e..2db201cd0 100644 --- a/src/riotTags/shared/folder-editor.tag +++ b/src/riotTags/shared/folder-editor.tag @@ -40,8 +40,8 @@ folder-editor.aDimmer.fadein span {vocGlob.apply} script. this.namespace = 'folderEditor'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); - this.mixin(require('./data/node_requires/riotMixins/wire').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/wire').default); this.setColorClass = colorClass => () => { this.opts.folder.colorClass = colorClass; }; diff --git a/src/riotTags/shared/icon-input.tag b/src/riotTags/shared/icon-input.tag index 641edcd8e..dcaecf685 100644 --- a/src/riotTags/shared/icon-input.tag +++ b/src/riotTags/shared/icon-input.tag @@ -21,7 +21,7 @@ icon-input ) script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.val = this.opts.val || 'x'; this.openSelector = () => { diff --git a/src/riotTags/shared/icon-selector.tag b/src/riotTags/shared/icon-selector.tag index f44aa20a6..5dd7d7852 100644 --- a/src/riotTags/shared/icon-selector.tag +++ b/src/riotTags/shared/icon-selector.tag @@ -28,7 +28,7 @@ icon-selector.aView.pad span {icon} script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); const fs = require('fs-extra'); fs.readJSON('./data/icons.json') diff --git a/src/riotTags/shared/modal-menu.tag b/src/riotTags/shared/modal-menu.tag index 0cc3cfd58..a51f6205c 100644 --- a/src/riotTags/shared/modal-menu.tag +++ b/src/riotTags/shared/modal-menu.tag @@ -17,7 +17,7 @@ items: Array, columns: number } - IMenuItem is https://github.com/ct-js/ct-js/blob/develop/src/node_requires/IMenuItem.d.ts + IMenuItem is https://github.com/ct-js/ct-js/blob/developsrc/node_requires/IMenuItem.d.ts @method toggle @method open @@ -62,7 +62,7 @@ modal-menu button(onclick="{close}") {vocGlob.close} script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.onItemClick = e => { const item = e.item.subitem; diff --git a/src/riotTags/shared/new-asset-prompt.tag b/src/riotTags/shared/new-asset-prompt.tag index 8ff1fdc2b..d641bc1d2 100644 --- a/src/riotTags/shared/new-asset-prompt.tag +++ b/src/riotTags/shared/new-asset-prompt.tag @@ -45,13 +45,13 @@ new-asset-prompt.aDimmer.pointer.pad.fadein(onpointerdown="{closeOnDimmer}" ref= script. this.namespace = 'newAssetPrompt'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.on('mount', () => { this.refs.input.focus(); }); - const resourcesAPI = require('./data/node_requires/resources'); + const resourcesAPI = require('src/node_requires/resources'); this.closeOnDimmer = e => { if (e.target === this.root) { @@ -90,8 +90,8 @@ new-asset-prompt.aDimmer.pointer.pad.fadein(onpointerdown="{closeOnDimmer}" ref= } }; - const jellify = require('./data/node_requires/jellify'); - const {soundbox} = require('./data/node_requires/3rdparty/soundbox'); + const jellify = require('src/node_requires/jellify'); + const {soundbox} = require('src/node_requires/3rdparty/soundbox'); this.tryPickName = () => { if (this.invalidName) { jellify(this.refs.error); diff --git a/src/riotTags/shared/scriptables/argument-editor-scriptable.tag b/src/riotTags/shared/scriptables/argument-editor-scriptable.tag index 441f80e8a..485574619 100644 --- a/src/riotTags/shared/scriptables/argument-editor-scriptable.tag +++ b/src/riotTags/shared/scriptables/argument-editor-scriptable.tag @@ -78,7 +78,7 @@ argument-editor-scriptable use(xlink:href="#check") span {vocGlob.apply} script. - const eventsAPI = require('./data/node_requires/events'); + const eventsAPI = require('src/node_requires/events'); this.localizeArgument = eventsAPI.localizeArgument; this.localizeProp = eventsAPI.localizeProp; @@ -87,7 +87,7 @@ argument-editor-scriptable this.getEventByLib = eventsAPI.getEventByLib; this.namespace = 'scriptables'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.opened = false; diff --git a/src/riotTags/shared/scriptables/code-editor-scriptable.tag b/src/riotTags/shared/scriptables/code-editor-scriptable.tag index 3da4bc048..a7772f309 100644 --- a/src/riotTags/shared/scriptables/code-editor-scriptable.tag +++ b/src/riotTags/shared/scriptables/code-editor-scriptable.tag @@ -1,18 +1,20 @@ -// +//- @attribute entitytype (EventApplicableEntities) The asset type that is being added @attribute event (IScriptableEvent) The event to edit. - @attribute [baseclass] (string) - The base type of the edited copy, as it is named described in ct.release/templates.ts. - Required for templates for correct and full typings; defaults to BasicCopy otherwise. - + @attribute asset (IScriptable) + The edited asset. @attribute [onchanged] (Riot function) The function is called whenever there was a change in the code. No arguments are passed as the [event] attribute is edited directly. - code-editor-scriptable.relative.wide.tall.flexcol - .relative.tall.wide(ref="codebox") + catnip-editor( + if="{window.currentProject.language === 'catnip'}" + event="{opts.event}" asset="{opts.asset}" + onrename="{renamePropVar}" + ) + .relative.tall.wide(ref="codebox" if="{window.currentProject.language !== 'catnip'}") .code-editor-scriptable-aProblemPanel.flexrow.nogrow(if="{problem}") .nogrow svg.feather.warning @@ -25,20 +27,21 @@ code-editor-scriptable.relative.wide.tall.flexcol | {voc.jumpToProblem} script. this.namespace = 'scriptables'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); - const eventsAPI = require('./data/node_requires/events'); + const eventsAPI = require('src/node_requires/events'); + const {baseClassToTS} = require('src/node_requires/resources/templates'); this.language = window.currentProject.language || 'typescript'; this.allEvents = eventsAPI.events; - const coffeescript = require('coffeescript'); + const compileCoffeScript = require('coffeescript').CoffeeScript.compile; const checkProblemsDebounced = window.debounce(() => { if (!this.codeEditor || this.language !== 'coffeescript') { return; } const oldProblem = this.problem; try { - coffeescript.compile(this.codeEditor.getValue(), { + compileCoffeScript(this.codeEditor.getValue(), { bare: true, sourcemaps: false }); @@ -53,13 +56,34 @@ code-editor-scriptable.relative.wide.tall.flexcol }, 750); const refreshLayout = () => { + if (this.language === 'catnip') { + return; + } setTimeout(() => { this.codeEditor.layout(); }, 0); }; + const {renamePropVar} = require('src/node_requires/catnip'); + this.renamePropVar = e => { + for (const event of this.opts.asset.events) { + renamePropVar(event.code, e); + } + this.update(); + }; + // Global var names are automatically patched everywhere in a project, + // but we need to manually rename them in opened assets to not to overwrite + // a patch with old variable name + window.orders.on('catnipGlobalVarRename', this.renamePropVar); + this.on('unmount', () => { + window.orders.off('catnipGlobalVarRename', this.renamePropVar); + }); + const {baseTypes} = eventsAPI; const updateEvent = () => { + if (this.language === 'catnip') { + return; + } if (this.currentEvent) { this.codeEditor.updateOptions({ readOnly: false @@ -69,11 +93,21 @@ code-editor-scriptable.relative.wide.tall.flexcol this.currentEvent.eventKey, this.currentEvent.lib ); - const varsDeclaration = eventsAPI.getArgumentsTypeScript(eventDeclaration); - const ctEntity = this.opts.entitytype === 'template' ? - (this.opts.baseclass ?? 'BasicCopy') : - '(typeof Room)[\'prototype\']'; - const codePrefix = `${baseTypes} function ctJsEvent(this: ${ctEntity}) {${varsDeclaration}`; + const varsDeclaration = eventDeclaration ? + eventsAPI.getArgumentsTypeScript(eventDeclaration) : + ''; + let ctEntity; + if (this.opts.asset.type === 'behavior') { + ctEntity = this.opts.asset.behaviorType === 'template' ? + 'BasicCopy' : + '(typeof Room)[\'prototype\']'; + } else if (this.opts.asset.type === 'room') { + ctEntity = '(typeof Room)[\'prototype\']'; + } else { // template, use the base class + ctEntity = baseClassToTS[this.opts.asset.baseClass]; + } + const fields = eventsAPI.getFieldsTypeScript(this.opts.asset); + const codePrefix = `${baseTypes} function ctJsEvent(this: ${ctEntity}${fields}) {${varsDeclaration}`; if (this.language === 'typescript') { this.codeEditor.setWrapperCode(codePrefix, '}'); } @@ -94,8 +128,25 @@ code-editor-scriptable.relative.wide.tall.flexcol } checkProblemsDebounced(); }; + const checkForTypedefChanges = assetId => { + if (this.language === 'catnip') { + return; + } + if (this.opts.asset.uid === assetId || + (this.opts.asset.behaviors && this.opts.asset?.behaviors.find(id => id === assetId)) + ) { + updateEvent(); + } + }; + window.signals.on('typedefsChanged', checkForTypedefChanges); + this.on('unmount', () => { + window.signals.off('typedefsChanged', checkForTypedefChanges); + }); this.on('mount', () => { + if (this.language === 'catnip') { + return; + } var editorOptions = { language: this.language, lockWrapper: this.language === 'typescript' @@ -105,7 +156,7 @@ code-editor-scriptable.relative.wide.tall.flexcol this.refs.codebox, Object.assign({}, editorOptions, { value: '', - wrapper: (this.language === 'typescript') ? [' ', ' '] : void 0 + wrapper: (this.language === 'typescript') ? ['{', '}'] : void 0 }) ); updateEvent(); @@ -121,14 +172,19 @@ code-editor-scriptable.relative.wide.tall.flexcol }, 0); }); const layout = () => { + if (this.language === 'catnip') { + return; + } setTimeout(() => { this.codeEditor.layout(); - }, 150); + }, 0); }; window.orders.on('forceCodeEditorLayout', layout); this.on('unmount', () => { // Manually destroy code editors, to free memory - this.codeEditor.dispose(); + if (this.language !== 'catnip') { + this.codeEditor.dispose(); + } window.removeEventListener('resize', refreshLayout); window.orders.off('forceCodeEditorLayout', layout); }); diff --git a/src/riotTags/shared/scriptables/event-list-scriptable.tag b/src/riotTags/shared/scriptables/event-list-scriptable.tag index 083a20eda..e1bc2e2bd 100644 --- a/src/riotTags/shared/scriptables/event-list-scriptable.tag +++ b/src/riotTags/shared/scriptables/event-list-scriptable.tag @@ -14,6 +14,8 @@ @attribute [currentevent] (IScriptableEvent) Currently selected event. Defaults to the first event in the `events` attributes. + @attribute [isbehavior] (atomic) + Set it to true for behavior editors. @attribute [warnbehaviors] (atomic) If set, will show warning icons for events that make behaviors static. @@ -30,6 +32,7 @@ event-list-scriptable.flexfix(class="{opts.class}") ui.aMenu li.flexrow( each="{event in opts.events}" + if="{isValid(event)}" class="{active: currentEvent === event}" onclick="{pickEvent}" title="{localizeField(getEventByLib(event.eventKey, event.lib), 'hint')}" @@ -37,7 +40,7 @@ event-list-scriptable.flexfix(class="{opts.class}") svg.feather.act.nogrow.noshrink(if="{!getIsParametrized(event) || !getIcon(event)}") use(xlink:href="#{getEventByLib(event.eventKey, event.lib).icon}") img.icon.nogrow.noshrink(if="{getIsParametrized(event) && getIcon(event)}" src="{getIcon(event)}") - span.nogrow.crop(title="{localizeName(event)}") {localizeName(event)} + span.nogrow.crop(if="{isValid(event)}" title="{localizeName(event)}") {localizeName(event)} div.noshrink.nogrow( if="{parent.opts.warnbehaviors && isStatic(event)}" title="{voc.staticEventWarning}" @@ -66,8 +69,22 @@ event-list-scriptable.flexfix(class="{opts.class}") onclick="{promptRemoveEvent(event)}" ) use(xlink:href="#trash") + li.flexrow.red( + each="{event in opts.events}" + if="{!isValid(event)}" + class="{active: currentEvent === event}" + onclick="{pickEvent}" + title="Missing event \"{event.eventKey}\" from \"{event.lib}\"" + ) + svg.feather.warn.nogrow.noshrink + use(xlink:href="#alert-circle") + span.nogrow.crop Missing event "{event.eventKey}" from "{event.lib}" + svg.feather.anActionableIcon.noshrink.nogrow( + onclick="{promptRemoveEvent(event)}" + ) + use(xlink:href="#trash") .flexfix-footer - .event-list-scriptable-LocalVars(if="{opts.events?.length && getHasLocalVars(currentEvent)}") + .event-list-scriptable-LocalVars(if="{opts.events?.length && isValid(currentEvent) && getHasLocalVars(currentEvent)}") h3 {voc.localEventVars} ul.aStripedList.nmt li.npl.npr.cursorhelp( @@ -98,12 +115,14 @@ event-list-scriptable.flexfix(class="{opts.class}") modal-menu(menu="{eventsMenu}" ref="eventsMenu" enablesearch="true") argument-editor-scriptable(event="{this.currentEvent}" ref="argumentsMenu" onapplied="{onArgumentsApplied}") script. - const eventsAPI = require('./data/node_requires/events'); + const eventsAPI = require('src/node_requires/events'); this.allEvents = eventsAPI.events; this.getEventByLib = eventsAPI.getEventByLib; const getFullKey = scriptableEvt => `${scriptableEvt.lib}_${scriptableEvt.eventKey}`; + this.isValid = scriptableEvt => + this.getEventByLib(scriptableEvt.eventKey, scriptableEvt.lib); this.localizeName = scriptableEvt => { if (this.getIsParametrized(scriptableEvt)) { return eventsAPI.localizeParametrized(getFullKey(scriptableEvt), scriptableEvt); @@ -125,7 +144,7 @@ event-list-scriptable.flexfix(class="{opts.class}") }; this.namespace = 'scriptables'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.getIsParametrized = scriptableEvt => { const event = this.getEventByLib(scriptableEvt.eventKey, scriptableEvt.lib); @@ -158,10 +177,13 @@ event-list-scriptable.flexfix(class="{opts.class}") } const newEvent = { eventKey: newEventPath[1], - code: '', + code: window.currentProject.language === 'catnip' ? [] : '', arguments: {}, lib: newEventPath[0] }; + if (window.currentProject.language === 'catnip') { + newEvent.variables = []; + } this.opts.events.push(newEvent); this.currentEvent = newEvent; this.opts.onchanged(this.currentEvent); @@ -191,7 +213,8 @@ event-list-scriptable.flexfix(class="{opts.class}") this.eventsMenu = eventsAPI.bakeCategories( this.opts.entitytype, this.addEvent, - this.opts.baseclass + this.opts.baseclass, + Boolean(this.opts.isbehavior) ); }; this.refreshEventsMenu(); diff --git a/src/riotTags/shared/tour-guide.tag b/src/riotTags/shared/tour-guide.tag index 853d3f8d3..bffef647b 100644 --- a/src/riotTags/shared/tour-guide.tag +++ b/src/riotTags/shared/tour-guide.tag @@ -71,7 +71,7 @@ tour-guide span {voc.done} script. this.namespace = 'common'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); const clamp = (min, val, max) => Math.min(max, Math.max(min, val)); const pad = 24; diff --git a/src/riotTags/writable-folder-prompt.tag b/src/riotTags/writable-folder-prompt.tag index 1f9014d17..4384921d7 100644 --- a/src/riotTags/writable-folder-prompt.tag +++ b/src/riotTags/writable-folder-prompt.tag @@ -15,10 +15,10 @@ writable-folder-prompt use(xlink:href="data/img/weirdFoldersIllustration.svg#illustration") script. this.namespace = 'writableFolderPrompt'; - this.mixin(require('./data/node_requires/riotMixins/voc').default); + this.mixin(require('src/node_requires/riotMixins/voc').default); this.openDirectoryPicker = async () => { - const {requestWritableDir} = require('./data/node_requires/platformUtils'); + const {requestWritableDir} = require('src/node_requires/platformUtils'); if (await requestWritableDir()) { if (this.opts.onsuccess) { this.opts.onsuccess(); diff --git a/src/styl/3rdParty/fonts.styl b/src/styl/3rdParty/fonts.styl index 3f7391445..dea63fb6a 100644 --- a/src/styl/3rdParty/fonts.styl +++ b/src/styl/3rdParty/fonts.styl @@ -78,4 +78,14 @@ font-weight: 600; font-style: italic; } -} \ No newline at end of file + @font-face { + font-family: 'Permanent Marker'; + src: url('../data/fonts/PermanentMarker-Regular.ttf'); + font-weight: 600; + } + @font-face { + font-family: 'Caveat'; + src: url('../data/fonts/Caveat-Bold.ttf'); + font-weight: 600; + } +} diff --git a/src/styl/buildingBlocks.styl b/src/styl/buildingBlocks.styl index fd3e03963..3c708dfba 100644 --- a/src/styl/buildingBlocks.styl +++ b/src/styl/buildingBlocks.styl @@ -96,7 +96,7 @@ {trans} &.flexrow align-items center - &:hover, &.hover + &:hover, &:focus, &.hover {transshort} border-bottom-color borderBright color acttext @@ -168,10 +168,10 @@ color background &:first-child border-top-left-radius inherit - border-bottom-left-radius inherit + border-bottom-left-radius 0 &:last-child border-top-right-radius inherit - border-bottom-right-radius inherit + border-bottom-right-radius 0 // The last item visually forms the right border of the container border-right-color borderBright &.vertical li @@ -286,7 +286,7 @@ margin 0 box-sizing border-box border 1px solid borderPale - border-radius 3px + border-radius br vertical-align top cursor pointer transition 0.35s ease all @@ -421,7 +421,7 @@ sounds-panel, rooms-panel td, th padding 0.5rem 0.75rem margin 0 - vertical-align text-top + vertical-align top &:first-child padding-left 0 &:last-child diff --git a/src/styl/inputs.styl b/src/styl/inputs.styl index 25df1be3a..b34694d4a 100644 --- a/src/styl/inputs.styl +++ b/src/styl/inputs.styl @@ -40,6 +40,8 @@ textarea line-height 1 &.invalid border-color error + &.code + font-family font-mono input[type="text"], input[type="number"], @@ -461,7 +463,7 @@ fieldset right 0 top 9px height 22px - border-radius 5px + border-radius br .aDragger width 0.75rem diff --git a/src/styl/tags/app-view.styl b/src/styl/tags/app-view.styl index e74989403..87294040b 100644 --- a/src/styl/tags/app-view.styl +++ b/src/styl/tags/app-view.styl @@ -21,6 +21,10 @@ app-view width 0 flex 1 1 1rem position relative + .aNav + border-radius 0 + border-left 0 + border-top 0 &::before, &::after position absolute content '' diff --git a/src/styl/tags/coding-language-selector.styl b/src/styl/tags/coding-language-selector.styl index 1e8bb6f50..51a8827ce 100644 --- a/src/styl/tags/coding-language-selector.styl +++ b/src/styl/tags/coding-language-selector.styl @@ -3,13 +3,23 @@ coding-language-selector position fixed display block .aModal - width 70vw - max-width 60rem + h1, h2 + color accent1 + width 90vw + max-width 100rem h2 svg vertical-align middle width 3rem height 3rem margin-right 0.75rem + &.feather + stroke-width 1.1px & > * padding-left 1.5rem padding-right 1.5rem + .&-aComparisonTable + gap 1rem 2rem + flex-flow row wrap + justify-content center + & > * + flex 0.5 1 30rem diff --git a/src/styl/tags/debugger/debugger-modal.styl b/src/styl/tags/debugger/debugger-modal.styl index d77d8d8dd..62628ec11 100644 --- a/src/styl/tags/debugger/debugger-modal.styl +++ b/src/styl/tags/debugger/debugger-modal.styl @@ -1,14 +1,14 @@ .aQRList display flex flex-flow row wrap + gap 2rem 3rem + align-items center + justify-content space-evenly .aQR - flex 1 1 280px + flex 0 1 45% img margin-bottom 0.5rem display inline-block !important - if (themeDark) - border 1rem solid act - margin 0 0 2rem debugger-modal width 45rem padding 2rem 2rem 1rem @@ -17,9 +17,10 @@ debugger-modal transform translate(-50%, -50%) max-width 90vw max-height 90vh - border-radius 3px - border 1px solid + border-radius br + {shadamb} + border 1px solid borderPale .toright span cursor pointer &:hover - color act \ No newline at end of file + color act diff --git a/src/styl/tags/debugger/debugger-screen.styl b/src/styl/tags/debugger/debugger-screen.styl index 7b90b014d..3313bad42 100644 --- a/src/styl/tags/debugger/debugger-screen.styl +++ b/src/styl/tags/debugger/debugger-screen.styl @@ -4,7 +4,6 @@ padding 0 0.5rem border-top 1px solid borderBright .debugger-toolbar-aButton - padding 0.15rem 0.5rem flex 1 1 auto text-align center &.vertical .debugger-toolbar-aButton @@ -13,7 +12,62 @@ height auto &.tight .debugger-toolbar-aButton > span display none -debugger-screen-embedded +debugger-screen-multiwindow, debugger-screen-split #thePreview overflow hidden @extends .tall + +#theDebuggerToolbarWindow + &, & body + position relative + width 100% + height 100% + overflow hidden + background transparent + +.debugger-toolbar-aDragger, .debugger-toolbar-aButton + align-content stretch + padding 0 0.5rem +.debugger-toolbar-aDragger + color borderBright + height 100% + cursor move + -webkit-app-region drag + app-region drag +.debugger-toolbar-aButton + color act + cursor pointer + background background + if (themeDark) + background transparent + {trans} + padding 0.35rem 1rem + text-align center + &:hover, &.active + background acttext + color background !important + {transshort} + if (themeDark) + color foreground + if (!themeDark) + border-color accent1 + svg + color background !important + &:active, &.selected + {transshort} + border-color accent1 + background accent1 + color background + svg + color background + if (themeDark) + color foreground + svg + color foreground + &:last-child + border-radius 0 br br 0 +.debugger-toolbar-aDivider + border-right 1px solid borderBright + height 100% + width 0 + margin 0 0.5rem diff --git a/src/styl/tags/debugger/debugger-toolbar.styl b/src/styl/tags/debugger/debugger-toolbar.styl deleted file mode 100644 index 3f14f723f..000000000 --- a/src/styl/tags/debugger/debugger-toolbar.styl +++ /dev/null @@ -1,67 +0,0 @@ -#theDebuggerToolbarWindow - &, & body - position relative - width 100% - height 100% - overflow hidden - background transparent - -debugger-toolbar - width 100% - height 100% - border-radius br - border 1px solid borderBright - background background - display flex - box-sizing border-box - align-items stretch - justify-content space-around - line-height 38px - .&-aDragger, .&-aButton - align-content stretch - padding 0 0.5rem - .&-aDragger - color borderBright - height 100% - cursor move - -webkit-app-region drag - app-region drag - .&-aButton - color act - cursor pointer - background background - if (themeDark) - background transparent - {trans} - &:hover, &.active - background acttext - color background - {transshort} - if (themeDark) - color foreground - if (!themeDark) - border-color accent1 - svg - color background - if (themeDark) - color foreground - svg - color foreground - &:active, &.selected - {transshort} - border-color accent1 - background accent1 - color background - svg - color background - if (themeDark) - color foreground - svg - color foreground - &:last-child - border-radius 0 br br 0 - .&-aDivider - border-right 1px solid borderBright - height 100% - width 0 - margin 0 0.5rem \ No newline at end of file diff --git a/src/styl/tags/editors/font-editor.styl b/src/styl/tags/editors/font-editor.styl deleted file mode 100644 index e5cc64576..000000000 --- a/src/styl/tags/editors/font-editor.styl +++ /dev/null @@ -1,23 +0,0 @@ -font-editor, [data-is="font-editor"] - display flex - flex-flow row nowrap - .left - text-align inherit - width 15rem - flex 1 0 auto - .right - text-align inherit - p - margin 0 0 1rem - padding 0.5rem 3rem 0.5rem 1rem - border-top 1px solid borderPale - position relative - &::after - content attr(data-size) 'px' - position absolute - right 0.5rem - top 0.5rem - font-family fonts - font-weight 400 - font-style normal - font-size 0.75rem diff --git a/src/styl/tags/editors/room-editor/room-events-editor.styl b/src/styl/tags/editors/room-editor/room-events-editor.styl index 7b363e17e..266f62ff2 100644 --- a/src/styl/tags/editors/room-editor/room-events-editor.styl +++ b/src/styl/tags/editors/room-editor/room-events-editor.styl @@ -7,3 +7,5 @@ room-events-editor & > .aModal width 95% height 100% + catnip-editor + padding-left 0.5rem diff --git a/src/styl/tags/editors/sound-editor/sound-editor.styl b/src/styl/tags/editors/sound-editor/sound-editor.styl index e01f5835e..1a118ea40 100644 --- a/src/styl/tags/editors/sound-editor/sound-editor.styl +++ b/src/styl/tags/editors/sound-editor/sound-editor.styl @@ -40,3 +40,7 @@ max-width 1200px width 100% margin 0 auto + +sound-editor, [data-is="sound-editor"] + .soundthumbnail + pointer-events none diff --git a/src/styl/tags/editors/template-editor.styl b/src/styl/tags/editors/template-editor.styl index e391ba6a1..1958a0cc6 100644 --- a/src/styl/tags/editors/template-editor.styl +++ b/src/styl/tags/editors/template-editor.styl @@ -41,7 +41,7 @@ template-editor, behavior-editor margin 0 1rem overflow hidden &:first-child - flex 0 0 23rem + flex 0 0 20rem &.alt flex 0 0 19rem .&-aCodeEditor @@ -97,7 +97,7 @@ template-editor, behavior-editor .template-editor-Properties, .behavior-editor-Properties, room-properties .anInsetPanel - margin 0 -1rem 0 + margin 0 -1rem .collapsible-section-aWrapper, .collapsible-section-aHeader padding-left 1rem padding-right 1rem diff --git a/src/styl/tags/editors/typeface-editor.styl b/src/styl/tags/editors/typeface-editor.styl new file mode 100644 index 000000000..f2c1fcd4f --- /dev/null +++ b/src/styl/tags/editors/typeface-editor.styl @@ -0,0 +1,30 @@ +typeface-editor, [data-is="typeface-editor"] + display flex + flex-flow row nowrap + .left + text-align inherit + width 20rem + flex 0 0 auto + .right + text-align inherit + flex 1 1 auto + padding 1rem + .aFont + @extends .aPanel + padding 0.5rem 1rem + margin-bottom 1rem + .aFont-Settings + display flex + gap 1.5rem + flex-flow row nowrap + border-bottom 1px solid borderBright + padding 0.25rem 0 + align-items baseline + & > * + flex 0 0 auto + .aSpacer + flex 1 1 100% + .aFontSample + font-size 32px + line-height 36px + margin 1rem 0 diff --git a/src/styl/tags/home-news.styl b/src/styl/tags/home-news.styl new file mode 100644 index 000000000..811623d0a --- /dev/null +++ b/src/styl/tags/home-news.styl @@ -0,0 +1,44 @@ +home-news + display block + .&-aNewsRow + position relative + align-items center + gap 1rem + img + flex 0 0 auto + height 128px + p + margin 0.25rem 0 1rem + line-height 1.5 + .&-aNewsBg + position absolute + top 0 + left 0 + width 100% + height 100% + background-size cover + background-position center + background-repeat no-repeat + z-index -1 + filter blur(5px) + opacity 0.35 + .&-FeaturedGames, .&-LearningResources + .Cards + grid-template-columns repeat(auto-fill, minmax(21em, 1fr)) + align-items start + gap 1rem + .aCard + text-align left + line-height 1.5 + padding 1.25rem 1rem + box-sizing border-box + .aCard-aThumbnail img + max-height 15rem + button, span + font-family fonts + h3 + margin-bottom 0.25rem + p, .dim + font-size (14% / 16% * 100%) + p + margin-top 0.5rem diff --git a/src/styl/tags/project-selector.styl b/src/styl/tags/project-selector.styl index 12c9155bf..bd6626dcf 100644 --- a/src/styl/tags/project-selector.styl +++ b/src/styl/tags/project-selector.styl @@ -1,17 +1,40 @@ project-selector - display block + display flex + flex-flow column nowrap + gap 1.5rem position absolute - padding 1rem + padding 2rem left 0 right 0 top 0 bottom 0 z-index 30 + overflow-y auto + background radial-gradient( + circle at 90% 90%, + homecolor 0%, + homecolor 6%, + homedarkcolor 14.9%, + homecolor 15%, + homecolor 23%, + homedarkcolor 32.9%, + homecolor 33%, + homecolor 48%, + homedarkcolor 57.9%, + homecolor 58%, + homecolor 75%, + homedarkcolor 84.9%, + homecolor 85% + ) + h1 + font-size 300% + font-family 'Caveat', fonts + &.en + font-family 'Permanent Marker', fonts + color white + if (themeDark) + color act .aPanel - width 50rem - max-width 95% - max-height calc(100% - 10rem) - margin 0 auto 2rem background background z-index 35 {shadamb} @@ -27,35 +50,54 @@ project-selector width 100% text-align center z-index 100 - // @stylint off - color #fff - // @stylint on - * - vertical-align text-bottom - .aPartyCarrot - width 2rem - display inline-block - position relative - top -0.1rem - margin-left 0.5rem - svg - margin-right 0.5rem + .aPartyCarrot + width 2rem + display inline-block + position relative + top -0.1rem + margin-left 0.5rem + vertical-align text-bottom .&-aPatronsLine - // @stylint off - color #fff - // @stylint on svg margin-right 0.35em + .&-aMainSection + height 40rem + align-items stretch + gap 1.5rem + & > :first-child + flex 1 1 auto + & > aside + width 20rem + flex 0 0 auto + gap 0.5rem + if (!themeDark) + color white + .anIllustration + color white + & > * + flex 0 0 auto + & > .aSpacer + flex 1 1 auto + .&-SocialLinks a + color white + if (themeDark) + color act + &:hover + opacity 0.65 + .&-SocialLinks a + a + margin-left 0.35rem .project-selector-aPreview img max-width 100% max-height 20em #theNewProjectField - display grid + display inline-grid + margin 0 auto gap 0.75rem 1.5rem - grid-template-columns 1fr 3fr + grid-template-columns 11rem 1fr align-items baseline + justify-content top .theNewProjectField-aLabel grid-column 1 text-align right @@ -71,11 +113,3 @@ project-selector justify-self left margin-top 1rem margin-bottom 0.25rem -#theIntroBg - background url('../data/img/bg.png') - background-size cover - background-position center center - z-index 25 - text-align center - .aPanel - text-align initial diff --git a/src/styl/tags/settings/modules/module-meta.styl b/src/styl/tags/settings/modules/module-meta.styl index 0b11e91ad..0007df539 100644 --- a/src/styl/tags/settings/modules/module-meta.styl +++ b/src/styl/tags/settings/modules/module-meta.styl @@ -39,4 +39,4 @@ module-meta margin 0.5rem 0 .filler flex 1 1 auto - padding-top 0.75rem \ No newline at end of file + padding-top 0.75rem diff --git a/src/styl/tags/settings/project-script-editor.styl b/src/styl/tags/settings/project-script-editor.styl index 42d8f73a0..a89341d9e 100644 --- a/src/styl/tags/settings/project-script-editor.styl +++ b/src/styl/tags/settings/project-script-editor.styl @@ -1,14 +1,8 @@ project-script-editor - .flexfix - padding 1rem .aCodeEditor - border-radius br - border 1px solid borderBright position absolute left 0 width 100% height 100% box-sizing border-box - .flexfix-body - margin 1rem 0 - overflow visible + overflow hidden diff --git a/src/styl/tags/settings/project-settings.styl b/src/styl/tags/settings/project-settings.styl index 8ce46ada3..f9f03d69a 100644 --- a/src/styl/tags/settings/project-settings.styl +++ b/src/styl/tags/settings/project-settings.styl @@ -6,6 +6,8 @@ project-settings overflow auto aside width 18rem + @media (max-width 1280px) + width 15rem h3 margin 0.75rem 0 0 1rem main diff --git a/src/styl/tags/settings/scripts-panel.styl b/src/styl/tags/settings/scripts-panel.styl deleted file mode 100644 index 5b7e7a12c..000000000 --- a/src/styl/tags/settings/scripts-panel.styl +++ /dev/null @@ -1,9 +0,0 @@ -scripts-settings - .aMenu - margin-bottom 1.5rem - li - padding-left 0 - padding-right 0 - &:hover - padding-left 0.5rem - padding-right 0 diff --git a/src/styl/tags/settings/scripts-settings.styl b/src/styl/tags/settings/scripts-settings.styl new file mode 100644 index 000000000..78c23fc01 --- /dev/null +++ b/src/styl/tags/settings/scripts-settings.styl @@ -0,0 +1,47 @@ +scripts-settings.flexrow + position absolute + left 0 + right 0 + top 0 + bottom 0 + & > aside + width 15rem + box-sizing border-box + flex 0 0 auto + border-right 1px solid borderBright + .flexfix-header + gap 0.5rem + align-items baseline + span + flex 1 1 auto + svg + flex 0 0 auto + .flexfix-footer + margin 0.5rem + li + display flex + flex-flow row nowrap + gap 0.25rem + padding 0.15rem 1rem + &:hover + padding 0.15rem 0.65rem 0.15rem 1.35rem + &.active + background borderPale + color foreground + .feather + color act + &.red + color red + .crop + flex 1 1 auto + .scripts-settings-ScriptActions + flex 0 0 auto + display none + &:hover .scripts-settings-ScriptActions, &:focus .scripts-settings-ScriptActions + display block + project-script-editor + flex 1 1 auto + gap 0.5rem + .flexfix-header + padding 0.25rem 1rem + border-bottom 1px solid borderBright diff --git a/src/styl/tags/shared/asset-browser.styl b/src/styl/tags/shared/asset-browser.styl index e648b6762..7cca38ffe 100644 --- a/src/styl/tags/shared/asset-browser.styl +++ b/src/styl/tags/shared/asset-browser.styl @@ -3,9 +3,10 @@ colorMap = { texture: hue(mappedColor, 20deg), template: hue(mappedColor, 230deg), sound: hue(mappedColor, 260deg), + script: hue(mappedColor, 55deg), tandem: hue(mappedColor, 300deg), room: hue(mappedColor, 40deg), - font: hue(mappedColor, 150deg), + typeface: hue(mappedColor, 150deg), style: hue(mappedColor, 110deg), behavior: hue(mappedColor, 200deg) } diff --git a/src/styl/tags/shared/scriptables/catnip-block.styl b/src/styl/tags/shared/scriptables/catnip-block.styl new file mode 100644 index 000000000..4ccb31a8a --- /dev/null +++ b/src/styl/tags/shared/scriptables/catnip-block.styl @@ -0,0 +1,240 @@ +unless catnipBaseColor is defined + catnipBaseColor = act + +colors = { + wildcard: hue(catnipBaseColor, 245) + string: hue(catnipBaseColor, 300) + number: darken(hue(catnipBaseColor, 108), 10%) // this one needs to be darker as HLS is shit + boolean: hue(catnipBaseColor, 35) + color: hue(catnipBaseColor, 200) +} + +catnip-block, .catnip-block + display flex + align-items center + flex-flow row wrap + gap 0.1rem 0.25rem + background background + border-radius br + border 1px solid borderBright + cursor grab + context-menu, color-picker, .aDimmer + cursor default + line-height 1 + context-menu, asset-browser + line-height 2 + {transshort} + &.computed + display inline-flex + & > * + vertical-align middle + flex 0 0 auto + .catnip-block-aFiller, .catnip-block-anAsyncMarker + flex 1 1 0 + text-align right + .catnip-block-aGroupName + border 0 + border-bottom 1px solid borderBright + background transparent + color text + border-radius 0 + .catnip-block-aBreak + flex 0 0 100% + height 0 + .catnip-block-Options + flex 1 0 100% + border-top 1px solid borderPale + margin -0.25rem -0.75rem -0.5rem !important + background backgroundDeeper + &:last-child + border-bottom-left-radius br + border-bottom-right-radius br + & > .catnip-block-anOptionsToggle + padding-top 0.25rem + text-align center + cursor pointer + font-size 80% + opacity 0.5 + {transshort} + &:hover + opacity 1 + background act + color background + span + margin 0 0.5rem + & > svg + width 1rem + height @width + margin 0 + dl + border-top 1px solid borderPale + display flex + flex-flow row nowrap + padding 0.5rem 0.75rem + margin 0 + gap 0.25rem + align-items center + dt + flex 1 1 25% + dd + flex 1 1 70% + .catnip-block-anAsyncMarker + cursor help + .catnip-block-Blocks + flex 1 1 100% + &.command > .catnip-block-aTextLabel + overflow hidden + line-height 1.25 + text-overflow ellipsis + flex 0 1 auto + word-wrap nowrap + white-space nowrap + max-width calc(100% - 2rem) + &:hover + {shad} + &.command + padding 0.5rem 0.75rem + margin 0.5rem 0 + gap 0.5rem + &.computed, .catnip-block-aConstantInput + gap 0.25rem + border-radius 100em !important + margin 0.5rem 0 + padding 0.1rem 0.25rem 0.1rem 0.5rem !important + flex 0 0 auto + width max-content + box-sizing content-box + & > svg + width 1rem + height @width + &.computed + padding 0.1rem 0.5rem 0.1rem 0.5rem !important + for class, color in colors + &.computed.{class}, .catnip-block-aConstantInput.{class} + color mix(foreground, color, 50%) + border 1px solid color + background-color mix(background, color, 90%) + &:hover + border-color color + & > svg + color color + &::placeholder + color color + opacity 0.65 + &.computed.userdefined, .catnip-block-aConstantInput.userdefined + background colors.wildcard + border 1px solid (colors.wildcard) + &:hover + border-color (colors.wildcard) + color white + font-weight bold + & > svg + color white + if lightness(colors.wildcard) > 60% + color black + & > svg + color black + &.computed.constant + for class, color in colors + &.{class} + border 1px solid color + background color + font-weight bold + color white + & > svg + color white + if lightness(colors.wildcard) > 60% + color black + & > svg + color black + & &.computed, & .catnip-block-aConstantInput, & &.constant + margin 0 + & > svg.feather + color act + vertical-align middle + + &.computed.invalid, & .catnip-block-aConstantInput.invalid + box-shadow 0 0 0 2px error inset + border-color error + + & & .catnip-block-aTextLabel + font-size 15px + & & & .catnip-block-aTextLabel + font-size 14px + + textarea + width 100% + box-sizing border-box + + .catnip-block-Blocks + background borderPale + border-radius br + border 1px solid borderBright + if themeDark + background backgroundDeeper + border 1px solid borderPale + padding 0 0.75rem + & + * + margin-left 0 + .catnip-block-aBlockPlaceholder + opacity 0.65 + margin-bottom 0.5rem + & > * + * + margin-left 0.35rem + + &.selected, &.selected .command + background act + color backgroundDeeper + border-color act + asset-selector, context-menu + color foreground + & > svg, & .command > svg + color backgroundDeeper + .catnip-block-Blocks + background mix(act, backgroundDeeper, 65%) + border-color mix(borderBright, backgroundDeeper, 85%) + if (themeDark) + .catnip-block-Blocks + background mix(act, backgroundDeeper, 35%) + border-color mix(borderBright, backgroundDeeper, 65%) + &.note + background mix(background, yellow, 90%) + border-color mix(borderBright, yellow, 80%) + {shad} + display flex + flex-flow row nowrap + .catnip-block-aTextLabel + display none + svg + flex 0 0 auto + color warning + textarea + flex 1 1 auto + border 0 + margin 0 + font-style italic + background transparent + transition unset + height 1.5rem + &.selected + background mix(mix(background, yellow, 90%), act, 80%) + &.group + background mix(background, act, 90%) + border-color mix(borderBright, act, 80%) + &.selected + background mix(mix(background, act, 90%), act, 80%) +.catnip-block-aConstantInput + box-sizing content-box + vertical-align middle + span + vertical-align middle + margin-right 0.25rem + img, svg + width 1rem + height @width + vertical-align middle + &.menu + cursor pointer + {transshort} + &:hover + {shad} diff --git a/src/styl/tags/shared/scriptables/catnip-editor.styl b/src/styl/tags/shared/scriptables/catnip-editor.styl new file mode 100644 index 000000000..56a1c6985 --- /dev/null +++ b/src/styl/tags/shared/scriptables/catnip-editor.styl @@ -0,0 +1,46 @@ +catnip-editor + background borderPale + border-radius br + border 1px solid borderBright + if themeDark + background backgroundDeeper + border 1px solid transparent + box-sizing border-box + .&-scriptable-aCanvas + overflow-y scroll + padding 0 0.5rem 0.5rem + if themeDark + padding 0 0.5rem 0 0 + margin-right 0.5rem + catnip-block + margin-bottom 0 + margin-top 0 + &.flexrow > .flexfix + width 24rem + flex 0 0 auto + .&-aTrashZone + color error + border 1px solid error + background background + text-align center + padding 0.5rem + border-bottom-right-radius br + if themeDark + border-bottom-left-radius br + .&-aGhost + position fixed + pointer-events none + z-index 100 + background transparent + display inline-block + opacity 0.85 + & > * + margin 0 !important + {shadamb} + catnip-library + border-top-right-radius br + border-bottom-right-radius br + if themeDark + border 1px solid borderBright + border-bottom 0 + border-top-left-radius br diff --git a/src/styl/tags/shared/scriptables/catnip-insert-mark.styl b/src/styl/tags/shared/scriptables/catnip-insert-mark.styl new file mode 100644 index 000000000..d2960c59a --- /dev/null +++ b/src/styl/tags/shared/scriptables/catnip-insert-mark.styl @@ -0,0 +1,90 @@ +transshortDelayed = + transition 0.15s 0.1s ease all + +catnip-insert-mark + display block + height 0.5rem + {transshortDelayed} + &:hover, &.dragover + height 1.5rem + &:has(.aMenu) + height unset 4rem + position relative + cursor pointer + .catnip-insert-mark-aFlytrap + position absolute + top 0 + left 0 + right 0 + bottom 0 + // needs a delay; otherwise it cancels the drag operation + {transshortDelayed} + .dragging & + top -0.5rem + left 0 + right 0 + bottom -0.5rem + .&-aLine, .&-anIcon + position absolute + .&-aLine + border-radius br + left 50% + right 50% + background act + top 50% + transform translate(0, -50%) + height 0.25rem + {transshortDelayed} + visibility hidden + &:hover .&-aLine, &.dragover .&-aLine + left 2.5rem + right 2.5rem + visibility visible + &.menuopen .&-aLine, &.menuopen .&-anIcon + visibility hidden + &.menuopen + height unset + .&-anIcon + left 50% + top 50% + border-radius 100% + background background + border 1px solid borderBright + width 2rem + height @width + line-height @height + text-align center + svg + color act + transform translate(-50%, -50%) scale(0) + {transshortDelayed} + visibility hidden + {shadamb} + &:hover .&-anIcon, &.dragover .&-anIcon + transform translate(-50%, -50%) scale(1) + visibility visible + .aSearchWrap, .aMenu + line-height 2rem + .aSearchWrap + width 100% + input + width 100% + margin 0.5rem 0 + .aMenu + position absolute + z-index 4 + left 0 + right 0 + top 100% + margin 0 + {shadamb} + &.up + top unset + bottom 100% + max-height 20rem + overflow auto + svg + width 1.25rem + height @width + margin-right 0.35rem + color act diff --git a/src/styl/tags/shared/scriptables/catnip-js-editor.styl b/src/styl/tags/shared/scriptables/catnip-js-editor.styl new file mode 100644 index 000000000..c3907fc2d --- /dev/null +++ b/src/styl/tags/shared/scriptables/catnip-js-editor.styl @@ -0,0 +1,5 @@ +catnip-js-editor + display block + width 100% + .&-aCodeEditor + height 10rem diff --git a/src/styl/tags/shared/scriptables/catnip-library.styl b/src/styl/tags/shared/scriptables/catnip-library.styl new file mode 100644 index 000000000..cd423e6dc --- /dev/null +++ b/src/styl/tags/shared/scriptables/catnip-library.styl @@ -0,0 +1,49 @@ +catnip-library + background background + box-sizing border-box + .aSearchWrap + padding 1rem + svg + right 1.5rem + .flexfix-body + overflow-y scroll + overflow-x hidden + padding 0 1rem 1rem + catnip-block + flex-wrap row nowrap + &.command + gap 0.25rem 0.5rem + &.computed:has(+ .computed) + margin-right 0.25rem + .catnip-block-aBlockPlaceholder + margin 0.35rem 0 + &.flexfix-body + overflow hidden + flex-flow row nowrap + & > * + flex 1 1 100% + overflow hidden + .&-CategoriesShortcuts.aButtonGroup.vertical + flex 0 0 4rem + overflow-y overlay + margin -1px -1px -1px 0 + @extends + &::-webkit-scrollbar, &::-webkit-scrollbar-track, &::-webkit-scrollbar-track:window-inactive, &::-webkit-scrollbar-thumb + background transparent + .catnip-library-aShortcut.button + padding 0.5rem 0.25rem + width 100% + box-sizing border-box + text-align center + &:first-child + border-top-left-radius 0 !important + &:last-child + border-bottom-left-radius 0 !important + svg + margin 0 + div + text-overflow ellipsis + white-space nowrap + overflow hidden + font-size 66% + line-height 1.5 diff --git a/src/styl/tags/shared/scriptables/code-editor-scriptable.styl b/src/styl/tags/shared/scriptables/code-editor-scriptable.styl index 1c9de7481..cbad71d10 100644 --- a/src/styl/tags/shared/scriptables/code-editor-scriptable.styl +++ b/src/styl/tags/shared/scriptables/code-editor-scriptable.styl @@ -11,3 +11,7 @@ code-editor-scriptable, script-editor button margin-left 1rem margin-right 0 + catnip-editor + height 100% + &.tall + overflow hidden diff --git a/src/styl/themeAlmaSakura.styl b/src/styl/themeAlmaSakura.styl new file mode 100644 index 000000000..fc5800681 --- /dev/null +++ b/src/styl/themeAlmaSakura.styl @@ -0,0 +1,70 @@ +@charset "utf-8" + +foreground = #d8caac +text = #CBBEC2 +background = #463936 +backgroundDeeper = #372D2D +shadows = #000 + +borderPale = #33282c +borderBright = #33282c + + +/* Frequently used properties */ +trans = + transition 0.35s ease all +transshort = + transition 0.15s ease all +shad = + box-shadow 0 0.1rem 0.1rem rgba(shadows, 0.05), 0 0.2rem 0.3rem rgba(shadows, 0.1), 0 0.3rem 0.5rem rgba(shadows, 0.05) +shadamb = + box-shadow 0 0.1rem 0.25rem rgba(shadows, 0.15), 0 0.5rem 0.5rem rgba(shadows, 0.08), 0 1rem 1rem rgba(shadows, 0.05), 0 1.5rem 1.5rem rgba(shadows, 0.03) + + +/* Base fonts for UI */ +fonts = font = 'Open Sans', sans-serif, serif +font-mono = mono = Iosevka, monospace + +br = 0.2rem +iconsize = 1.5rem + +/* Colors used by this theme */ +act = #C4B0B3 +acttext = #C4B0B3 +accent1 = #DB5A6B +error = #F47983 +red = error +success = #aaf479 +green = success +warning = #f4a079 +orange = warning +homecolor = #372D2D +homedarkcolor = darken(homecolor, 10%) + +theme = 'AlmaSakura' +themeDark = true +themeThickBorders = false + +@require 'hvost.styl' + +@require '3rdParty/*.styl' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' + +@require 'common.styl' +@require 'inputs.styl' +@require 'typography.styl' +@require 'confetti.styl' +@require 'buildingBlocks.styl' +@require 'tabs.styl' + +@require 'tags/**/*.styl' + +button, +input[type="button"], +input[type="submit"], +input[type="reset"], +.button + &:hover, &.active, &:active, &.selected + color backgroundDeeper + svg + color backgroundDeeper diff --git a/src/styl/themeDay.styl b/src/styl/themeDay.styl index 850172f81..2e81f514e 100644 --- a/src/styl/themeDay.styl +++ b/src/styl/themeDay.styl @@ -31,6 +31,8 @@ success = #4ab660 green = success warning = #ff9748 orange = warning +homecolor = act +homedarkcolor = darken(homecolor, 10%) theme = 'Day' themeDark = false @@ -46,7 +48,7 @@ backgroundDeeper = #fafafa @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/tomorrow.css' +@require './../../node_modules/highlight.js/styles/tomorrow.css' @require 'common.styl' @require 'inputs.styl' diff --git a/src/styl/themeForest.styl b/src/styl/themeForest.styl index 22861d8f0..9a0f8dd22 100644 --- a/src/styl/themeForest.styl +++ b/src/styl/themeForest.styl @@ -37,6 +37,8 @@ success = #a7c080 green = success warning = #d9bb80 orange = warning +homecolor = #323d43 +homedarkcolor = darken(homecolor, 10%) theme = 'Forest' themeDark = true @@ -45,7 +47,7 @@ themeThickBorders = false @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/atom-one-dark.css' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' @require 'common.styl' @require 'inputs.styl' @@ -65,6 +67,3 @@ input[type="reset"], color backgroundDeeper svg color backgroundDeeper - -#theIntroBg - background backgroundDeeper diff --git a/src/styl/themeGhost.styl b/src/styl/themeGhost.styl index 68ffc0bd0..46e2cc5dd 100644 --- a/src/styl/themeGhost.styl +++ b/src/styl/themeGhost.styl @@ -31,6 +31,8 @@ success = #5c913d green = success warning = #a36a3b orange = warning +homecolor = act +homedarkcolor = darken(homecolor, 10%) theme = 'Ghost' themeDark = false @@ -46,7 +48,7 @@ backgroundDeeper = #f0dfd8 @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/tomorrow.css' +@require './../../node_modules/highlight.js/styles/tomorrow.css' @require 'common.styl' @require 'inputs.styl' diff --git a/src/styl/themeGoldenEye.styl b/src/styl/themeGoldenEye.styl new file mode 100644 index 000000000..a6c730fc8 --- /dev/null +++ b/src/styl/themeGoldenEye.styl @@ -0,0 +1,71 @@ +@charset "utf-8" + +foreground = #FFD700 +text = #cac77c +background = #144000 +backgroundDeeper = #144000 +shadows = #ffff00 + +borderPale = #435E00 +borderBright = #435E00 + + +/* Frequently used properties */ +trans = + transition 0.35s ease all +transshort = + transition 0.15s ease all +shad = + box-shadow 0 0 0.35rem shadows +shadamb = + box-shadow 0 0 1rem shadows + +/* Base fonts for UI */ +fonts = font = 'Open Sans', sans-serif, serif +font-mono = mono = Iosevka, monospace + +br = 2px +iconsize = 1.5rem + +/* Colors used by this theme */ +act = #ffd700 +acttext = #daa520 +accent1 = #FF4500 +error = #ff0000 +red = error +success = #9ACD32 +green = success +warning = #FFA500 +orange = warning +homecolor = #144000 +homedarkcolor = darken(homecolor, 10%) + +theme = 'GoldenEye' +themeDark = true +themeThickBorders = false + +catnipBaseColor = #9ACD32 + +@require 'hvost.styl' + +@require '3rdParty/*.styl' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' + +@require 'common.styl' +@require 'inputs.styl' +@require 'typography.styl' +@require 'confetti.styl' +@require 'buildingBlocks.styl' +@require 'tabs.styl' + +@require 'tags/**/*.styl' + +button, +input[type="button"], +input[type="submit"], +input[type="reset"], +.button + &:hover, &.active, &:active, &.selected + color backgroundDeeper + svg + color backgroundDeeper diff --git a/src/styl/themeHCBlack.styl b/src/styl/themeHCBlack.styl index 442ddf0a5..f02eab81b 100644 --- a/src/styl/themeHCBlack.styl +++ b/src/styl/themeHCBlack.styl @@ -37,6 +37,7 @@ success = #33ff33 green = success warning = #ff9900 orange = warning +homecolor = homedarkcolor = black theme = 'HCBlack' themeDark = true @@ -45,7 +46,7 @@ themeThickBorders = false @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/atom-one-dark.css' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' @require 'common.styl' @require 'inputs.styl' @@ -64,5 +65,3 @@ button, .button color backgroundDeeper background act -#theIntroBg - background backgroundDeeper diff --git a/src/styl/themeHorizon.styl b/src/styl/themeHorizon.styl index dddb0671f..7290e48fd 100644 --- a/src/styl/themeHorizon.styl +++ b/src/styl/themeHorizon.styl @@ -38,6 +38,8 @@ warning = #FAB795 orange = warning blue = #26BBD9 cyan = #59E1E3 +homecolor = darken(backgroundDeeper, 25%) +homedarkcolor = darken(mix(homecolor, shadows, 65%), 45%) theme = 'Horizon' themeDark = true @@ -46,7 +48,7 @@ themeThickBorders = true @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/atom-one-dark.css' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' @require 'common.styl' @require 'inputs.styl' @@ -76,9 +78,3 @@ input[type="reset"], .anErrorNotice a, .a text-decoration underline - -gradCore = #733041 -gradTransition = #2e2233 -gradOuter = #1c1e26 -#theIntroBg - background radial-gradient(ellipse at bottom, gradCore 0, gradTransition 50%, gradOuter 100%) diff --git a/src/styl/themeLucasDracula.styl b/src/styl/themeLucasDracula.styl index 55b24d60d..5d0f29511 100644 --- a/src/styl/themeLucasDracula.styl +++ b/src/styl/themeLucasDracula.styl @@ -35,6 +35,8 @@ success = #26E19F green = success warning = #f07178 orange = warning +homecolor = darken(background, 10%) +homedarkcolor = darken(backgroundDeeper, 25%) theme = 'LucasDracula' themeDark = true @@ -43,7 +45,7 @@ themeThickBorders = false @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/atom-one-dark.css' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' @require 'common.styl' @require 'inputs.styl' diff --git a/src/styl/themeNight.styl b/src/styl/themeNight.styl index 6e88dd656..42b2238e2 100644 --- a/src/styl/themeNight.styl +++ b/src/styl/themeNight.styl @@ -37,6 +37,8 @@ success = #58E875 green = success warning = #FFA968 orange = warning +homecolor = mix(backgroundDeeper, act, 95%) +homedarkcolor = backgroundDeeper theme = 'Night' themeDark = true @@ -45,7 +47,7 @@ themeThickBorders = false @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/atom-one-dark.css' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' @require 'common.styl' @require 'inputs.styl' @@ -61,6 +63,3 @@ grad2 = #30918b grad3 = #286774 grad4 = #1a3541 grad5 = #0C0D18 - -#theIntroBg - background radial-gradient(ellipse at bottom, grad1 0, grad2 9%, grad3 22%, grad4 43%, grad5 74%) diff --git a/src/styl/themeNord.styl b/src/styl/themeNord.styl index 71c1f643c..a340d5825 100644 --- a/src/styl/themeNord.styl +++ b/src/styl/themeNord.styl @@ -33,6 +33,8 @@ success = #A3BE8C green = success warning = #D08770 orange = warning +homecolor = #202738 +homedarkcolor = darken(homecolor, 10%) theme = 'Nord' themeDark = true @@ -41,7 +43,7 @@ themeThickBorders = false @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/nord.css' +@require './../../node_modules/highlight.js/styles/nord.css' @require 'common.styl' @require 'inputs.styl' @@ -60,6 +62,3 @@ select, textarea, .aResizer::before background-color rgba(backgroundDeeper, 0.5) - -#theIntroBg - background backgroundDeeper diff --git a/src/styl/themeOneDarkPro.styl b/src/styl/themeOneDarkPro.styl new file mode 100644 index 000000000..0729a95a0 --- /dev/null +++ b/src/styl/themeOneDarkPro.styl @@ -0,0 +1,76 @@ +@charset "utf-8" + +foreground = #ECEFF4 +text = #D8DEE9 +background = #282C34 +backgroundDeeper = #21252B +shadows = #292e39 + +borderPale = #434C5E +borderBright = #4C566A + +trans = + transition 0.35s ease all +transshort = + transition 0.15s ease all +shad = + box-shadow 0 0.1rem 0.2rem rgba(shadows, 0.5) +shadamb = + box-shadow 0 0 0.35rem rgba(shadows, 0.5) + +fonts = font = 'Open Sans', sans-serif, serif +font-mono = mono = Iosevka, monospace + +br = 0.15rem +iconsize = 1.5rem + +acttext = mix(#61AFEF, #D7DAE0, 50%) +act = #61AFEF +accent1 = #61AFEF +error = #E06C75 +red = error +success = #98C379 +green = success +warning = #E5C07B +orange = warning +homecolor = backgroundDeeper +homedarkcolor = darken(homecolor, 20%) + +theme = 'OneDarkPro' +themeDark = true +themeThickBorders = false + +catnipBaseColor = #E06C75 + +@require 'hvost.styl' + +@require '3rdParty/*.styl' +@require './../../node_modules/highlight.js/styles/nord.css' + +@require 'common.styl' +@require 'inputs.styl' +@require 'typography.styl' +@require 'confetti.styl' +@require 'buildingBlocks.styl' +@require 'tabs.styl' + +button, +input[type="button"], +input[type="submit"], +input[type="reset"], +.button + &:hover, &:focus, &.active, &:active, &.selected + color backgroundDeeper + svg + color backgroundDeeper + +@require 'tags/**/*.styl' + +input[type="text"], +input[type="number"], +input[type="url"], +input[type="password"], +select, +textarea, +.aResizer::before + background-color rgba(backgroundDeeper, 0.5) diff --git a/src/styl/themePooxelBlue.styl b/src/styl/themePooxelBlue.styl index 6efe15f4a..7fa0a3e3b 100644 --- a/src/styl/themePooxelBlue.styl +++ b/src/styl/themePooxelBlue.styl @@ -21,6 +21,9 @@ borderHighlight = #556 text = #A9B7C6 backgroundDeeper = #222228 +homecolor = background +homedarkcolor = backgroundDeeper + theme = 'PooxelBlue' themeDark = true themeThickBorders = false diff --git a/src/styl/themePooxelGreen.styl b/src/styl/themePooxelGreen.styl index 743992f42..de387f08c 100644 --- a/src/styl/themePooxelGreen.styl +++ b/src/styl/themePooxelGreen.styl @@ -41,10 +41,15 @@ unless theme is defined text = #A9B7C6 backgroundDeeper = #222222 + homecolor = background + homedarkcolor = backgroundDeeper + theme = 'PooxelGreen' themeDark = true themeThickBorders = false + catnipBaseColor = #ff6970 + /* Frequently used properties */ trans = transition none @@ -59,7 +64,7 @@ shadamb = @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/tomorrow.css' +@require './../../node_modules/highlight.js/styles/tomorrow.css' @require 'common.styl' @require 'inputs.styl' diff --git a/src/styl/themeRosePine.styl b/src/styl/themeRosePine.styl index f272253ad..87f3b648b 100644 --- a/src/styl/themeRosePine.styl +++ b/src/styl/themeRosePine.styl @@ -34,6 +34,8 @@ success = #31748f // pine green = success warning = #f6c177 // gold orange = warning +homecolor = darken(backgroundDeeper, 25%) +homedarkcolor = darken(homecolor, 25%) theme = 'RosePine' themeDark = true @@ -62,6 +64,3 @@ select, textarea, .aResizer::before border-color borderLight - -#theIntroBg - background borderPale diff --git a/src/styl/themeRosePineDawn.styl b/src/styl/themeRosePineDawn.styl index d6aec6f75..6af23962d 100644 --- a/src/styl/themeRosePineDawn.styl +++ b/src/styl/themeRosePineDawn.styl @@ -34,6 +34,8 @@ success = #286983 // pine green = success warning = #ea9d34 // gold orange = warning +homecolor = act +homedarkcolor = darken(homecolor, 15%) theme = 'RosePineDawn' themeDark = false @@ -42,7 +44,7 @@ themeThickBorders = false @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/tomorrow.css' +@require './../../node_modules/highlight.js/styles/tomorrow.css' @require 'common.styl' @require 'inputs.styl' @@ -61,6 +63,3 @@ select, textarea, .aResizer::before border-color borderLight - -#theIntroBg - background borderPale diff --git a/src/styl/themeRosePineMoon.styl b/src/styl/themeRosePineMoon.styl index ae5016319..3220cd0c2 100644 --- a/src/styl/themeRosePineMoon.styl +++ b/src/styl/themeRosePineMoon.styl @@ -34,6 +34,8 @@ success = #3e8fb0 // pine green = success warning = #f6c177 // gold orange = warning +homecolor = mix(backgroundDeeper, act, 75%) +homedarkcolor = darken(homecolor, 15%) theme = 'RosePineMoon' themeDark = true @@ -61,6 +63,3 @@ select, textarea, .aResizer::before border-color borderLight - -#theIntroBg - background borderPale diff --git a/src/styl/themeSpringStream.styl b/src/styl/themeSpringStream.styl index d6349c493..3b84ac747 100644 --- a/src/styl/themeSpringStream.styl +++ b/src/styl/themeSpringStream.styl @@ -58,11 +58,15 @@ success = #009170 green = success warning = #ce5a24 orange = warning +homecolor = #247c62 +homedarkcolor = darken(homecolor, 10%) theme = 'Spring Stream' themeDark = false themeThickBorders = false +catnipBaseColor = #dd3b98 + borderPale = #d6dedd borderBright = #d6dedd @@ -74,7 +78,7 @@ introBg = #f2fcfa @require 'hvost.styl' @require '3rdParty/*.styl' -@require './../../app/node_modules/highlight.js/styles/tomorrow.css' +@require './../../node_modules/highlight.js/styles/tomorrow.css' @require 'common.styl' @require 'inputs.styl' @@ -112,9 +116,6 @@ input[type="reset"], .aButtonGroup.vertical button, .aButtonGroup.vertical .button border 0 -#theIntroBg - background introBg - .Cards box-sizing border-box padding 0.25rem diff --git a/src/styl/themeSynthwave.styl b/src/styl/themeSynthwave.styl new file mode 100644 index 000000000..204a9a177 --- /dev/null +++ b/src/styl/themeSynthwave.styl @@ -0,0 +1,72 @@ +@charset "utf-8" + +foreground = #FFFFFF +text = #CCCCCC +background = #241B2F +backgroundDeeper = #171520 +borderBright = #53225333 +borderPale = #241B2F +shadows = #ca72ca + +/* Frequently used properties */ +trans = + transition 0.35s ease all +transshort = + transition 0.15s ease all +shad = + box-shadow 0 0.3rem 0.5rem rgba(shadows, 0.35) +shadamb = + box-shadow 0 0.3rem 1rem rgba(shadows, 0.35) + +/* Base fonts for UI */ +fonts = font = 'Open Sans', sans-serif, serif +font-mono = mono = Iosevka, monospace + +br = 0.2rem +iconsize = 1.5rem + +/* Colors used by this theme */ +act = #FEDE5D +acttext = #FEDE5D +accent1 = #FF7EDB +error = #c73fa0 +red = error +success = #72F1B8 +green = success +warning = #FF8B39 +orange = warning +homecolor = backgroundDeeper +homedarkcolor = darken(homecolor, 25%) + +theme = 'Synthwave' +themeDark = true +themeThickBorders = false + +catnipBaseColor = #c73fa0 + +@require 'hvost.styl' + +@require '3rdParty/*.styl' +@require './../../node_modules/highlight.js/styles/atom-one-dark.css' + +@require 'common.styl' +@require 'inputs.styl' +@require 'typography.styl' +@require 'confetti.styl' +@require 'buildingBlocks.styl' +@require 'tabs.styl' + +button, +input[type="button"], +input[type="submit"], +input[type="reset"], +.button + &:hover, &:focus, &.active, &:active, &.selected + color backgroundDeeper + svg + color backgroundDeeper + +@require 'tags/**/*.styl' + +svg + filter drop-shadow(0 0 0.15em currentColor) diff --git a/tsconfig.json b/tsconfig.json index 1af2bdf9e..c4e81251e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,8 @@ "moduleResolution": "node", "esModuleInterop": true, "skipLibCheck": true, + "alwaysStrict": true, + "strictNullChecks": true, "baseUrl": "./", "typeRoots": [ "./node_modules/@types/", @@ -17,8 +19,5 @@ "./node_modules/*" ], } - }, - "exclude": [ - "DragonBonesJS/Pixi/5.x/libs/pixi.js-legacy.d.ts" - ] + } } diff --git a/versions.js b/versions.js index c1d584369..a685d763e 100644 --- a/versions.js +++ b/versions.js @@ -3,7 +3,7 @@ * that pixi.js versions used for game packaging are the same. */ -const appManifest = require('./app/package.json'); +const builderManifest = require('./package.json'); const unfixedRegex = /^[~^]|^[\d.]+-[\d.]+$/; @@ -19,7 +19,7 @@ const packagesToCheck = { }; const packageVersions = {}; for (const packageKey in packagesToCheck) { - packageVersions[packageKey] = appManifest.dependencies[packagesToCheck[packageKey]]; + packageVersions[packageKey] = builderManifest.dependencies[packagesToCheck[packageKey]]; if (!packageVersions[packageKey] || unfixedRegex.test(packageVersions[packageKey])) { makeTab(); throw new Error(`${packageKey} package used in the app folder is not set to a fixed version. This must be fixed. Current value is "${packageVersions[packageKey]}".`); @@ -33,6 +33,5 @@ if (packageVersions.pixi !== packageVersions.pixiLegacy) { module.exports = { nwjs: '0.72.0', - nwjsArm: '0.67.1', ...packageVersions };